]> git.ipfire.org Git - thirdparty/bulma.git/commitdiff
Add babel
authorJeremy Thomas <bbxdesign@gmail.com>
Sat, 1 Jul 2017 17:30:39 +0000 (18:30 +0100)
committerJeremy Thomas <bbxdesign@gmail.com>
Sat, 1 Jul 2017 17:30:39 +0000 (18:30 +0100)
44 files changed:
docs/.babelrc [new file with mode: 0644]
docs/_config.yml
docs/_includes/blog-hero.html
docs/_includes/footer.html
docs/_includes/navbar.html
docs/_includes/subnav-components.html
docs/_javascript/bulma.js [moved from docs/javascript/bulma.js with 100% similarity]
docs/_javascript/index.js [new file with mode: 0644]
docs/_javascript/main.js [new file with mode: 0644]
docs/_layouts/default.html
docs/_layouts/documentation.html
docs/bulma-docs.sass
docs/css/bulma-docs.css
docs/documentation/components/modal.html
docs/documentation/components/navbar.html [new file with mode: 0644]
docs/documentation/elements/button.html
docs/documentation/elements/form.html
docs/documentation/elements/table.html
docs/index.html
docs/javascript/Chart.js [deleted file]
docs/javascript/clipboard.min.js [deleted file]
docs/javascript/index.js [deleted file]
docs/javascript/jquery-2.2.0.min.js [deleted file]
docs/javascript/main.js [deleted file]
docs/lib/bulma.js [new file with mode: 0644]
docs/lib/clipboard.min.js [new file with mode: 0644]
docs/lib/index.js [new file with mode: 0644]
docs/lib/javascript/main.js [new file with mode: 0644]
docs/lib/main.js [new file with mode: 0644]
docs/package.json [new file with mode: 0644]
docs/sass/bsa.sass [deleted file]
docs/sass/callout.sass [deleted file]
docs/sass/example.sass [deleted file]
docs/sass/footer.sass [deleted file]
docs/sass/global.sass [deleted file]
docs/sass/header.sass [deleted file]
docs/sass/highlight.sass [deleted file]
docs/sass/index.sass [deleted file]
docs/sass/override.sass [deleted file]
docs/sass/route.sass [deleted file]
docs/sass/specific.sass [deleted file]
docs/vendor/clipboard-1.7.1.min.js [new file with mode: 0644]
docs/yarn.lock [new file with mode: 0644]
sass/components/navbar.sass

diff --git a/docs/.babelrc b/docs/.babelrc
new file mode 100644 (file)
index 0000000..407be5a
--- /dev/null
@@ -0,0 +1,3 @@
+{
+  "presets": ["es2015-ie"]
+}
index 6e12e1472e9d7d2a17451cf7c2ae0bb030491e70..5eaddf2d591a8bafb133a6fdb4e18bcf8735fb08 100644 (file)
@@ -9,6 +9,7 @@ markdown:      kramdown
 permalink:     pretty
 url:           http://bulma.io
 fontawesome:   https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css
+exclude:       ['fontawesome', 'node_modules', 'templates', '.babelrc', 'bulma-docs.sass', 'docker-compose.yml', 'package.json', 'yarn.lock']
 
 # Variables
 
index 038721d067ab68ecb840c54a8002d78c85b615cb..ee3eac53142d507a0f2d4c2f01776dcc1acd4ab3 100644 (file)
@@ -19,7 +19,7 @@
           </a>
         </div>
         <div class="column is-narrow">
-          <!-- {% include carbon.html %} -->
+          {% include carbon.html %}
         </div>
       </div>
     </div>
index 391bf48358c1a9fe217e562ad653fa4eb4a613e6..479456f3a1838a5ae36fbe4d3eb82bfd704fb0fd 100644 (file)
 }(document, 'script', 'facebook-jssdk'));</script>
 
 <script async defer id="twitter-wjs" src="https://platform.twitter.com/widgets.js"></script>
-<script async defer type="text/javascript" src="https://s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js"></script>
+<!-- <script async defer type="text/javascript" src="https://s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js"></script> -->
 
-<script src="{{ site.url }}/javascript/jquery-2.2.0.min.js"></script>
-<script src="{{ site.url }}/javascript/clipboard.min.js"></script>
-<script src="{{ site.url }}/javascript/bulma.js"></script>
+<!-- <script src="{{ site.url }}/javascript/jquery-2.2.0.min.js"></script> -->
+<script src="{{ site.url }}/vendor/clipboard-1.7.1.min.js"></script>
+<script src="{{ site.url }}/lib/main.js"></script>
 
 {% if page.route == 'index' %}
-  <script type="text/javascript" src="{{ site.url }}/javascript/index.js"></script>
+  <script type="text/javascript" src="{{ site.url }}/lib/index.js"></script>
 {% endif %}
 
-<script type="text/javascript">
+<!-- <script type="text/javascript">
   (function($) {
     window.fnames = new Array();
     window.ftypes = new Array();
     ftypes[0]='email';
   }(jQuery));
   var $mcj = jQuery.noConflict(true);
-</script>
+</script> -->
 
 <script>
   (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
index c5478802831e012968e67a0b8fdffe242c06d97e..c900c18477ef311b050bdaf681b891663d8b49db 100644 (file)
@@ -1,95 +1,99 @@
 <div class="container">
-<nav class="navbar">
-  <div class="navbar-brand">
-    <a class="navbar-item" href="{{ site.url }}">
-      <img src="{{ site.url }}/images/bulma-logo.png" alt="{{ site.title }}" width="112" height="28">
-    </a>
+  <nav class="navbar {% if include.transparent %}is-transparent{% endif %}">
+    <div class="navbar-brand">
+      <a class="navbar-item" href="{{ site.url }}">
+        <img src="{{ site.url }}/images/bulma-logo.png" alt="{{ site.title }}" width="112" height="28">
+      </a>
 
-    <a class="navbar-item is-hidden-desktop">
-      <span class="icon">
-        <i class="fa fa-github"></i>
-      </span>
-    </a>
+      <a class="navbar-item is-hidden-desktop">
+        <span class="icon">
+          <i class="fa fa-github"></i>
+        </span>
+      </a>
 
-    <a class="navbar-item is-hidden-desktop">
-      <span class="icon">
-        <i class="fa fa-twitter"></i>
-      </span>
-    </a>
+      <a class="navbar-item is-hidden-desktop">
+        <span class="icon">
+          <i class="fa fa-twitter"></i>
+        </span>
+      </a>
 
-    <div id="navBurger" class="navbar-burger">
-      <span></span>
-      <span></span>
-      <span></span>
+      <div id="navBurger" class="navbar-burger">
+        <span></span>
+        <span></span>
+        <span></span>
+      </div>
     </div>
-  </div>
 
-  <div id="navMenu" class="navbar-menu">
-    <div class="navbar-start">
-      <a class="navbar-item">
-        Home
-      </a>
-      <div class="navbar-item has-dropdown is-hoverable">
-        <a class="navbar-link">
-          Docs
+    <div id="navMenu" class="navbar-menu">
+      <div class="navbar-start">
+        <a class="navbar-item {% if page.route == 'index' %}is-active{% endif %}" href="{{ site.url }}/">
+          Home
         </a>
-        <div class="navbar-dropdown">
-          <a class="navbar-item">
-            Overview
-          </a>
-          <a class="navbar-item">
-            Modifiers
-          </a>
-          <a class="navbar-item">
-            Grid
-          </a>
-          <a class="navbar-item">
-            Elements
-          </a>
-          <a class="navbar-item">
-            Components
+        <div class="navbar-item has-dropdown is-hoverable">
+          <a class="navbar-link {% if page.route == 'documentation' %}is-active{% endif %} {% if page.layout == 'documentation' %}is-active{% endif %}" href="{{ site.documentation }}">
+            Docs
           </a>
-          <a class="navbar-item">
-            Layout
-          </a>
-          <hr class="navbar-divider">
-          <div class="navbar-item">
-            <div>version <p class="has-text-info">{{ site.version }}</p></div>
+          <div class="navbar-dropdown {% if include.boxed %}is-boxed{% endif %}">
+            <a class="navbar-item {% if page.doc-tab == 'overview' %}is-active{% endif %}" href="{{ site.documentation }}">
+              Overview
+            </a>
+            <a class="navbar-item {% if page.doc-tab == 'modifiers' %}is-active{% endif %}" href="{{ site.url }}/documentation/modifiers/syntax/">
+              Modifiers
+            </a>
+            <a class="navbar-item {% if page.doc-tab == 'grid' %}is-active{% endif %}" href="{{ site.url }}/documentation/grid/columns/">
+              Grid
+            </a>
+            <a class="navbar-item {% if page.doc-tab == 'elements' %}is-active{% endif %}" href="{{ site.url }}/documentation/elements/box/">
+              Elements
+            </a>
+            <a class="navbar-item {% if page.doc-tab == 'components' %}is-active{% endif %}" href="{{ site.url }}/documentation/components/breadcrumb/">
+              Components
+            </a>
+            <a class="navbar-item {% if page.doc-tab == 'layout' %}is-active{% endif %}" href="{{ site.url }}/documentation/layout/container/">
+              Layout
+            </a>
+            <hr class="navbar-divider">
+            <div class="navbar-item">
+              <div>version <p class="has-text-info">{{ site.version }}</p></div>
+            </div>
           </div>
         </div>
-      </div>
-      <div class="navbar-item has-dropdown is-hoverable">
-        <a class="navbar-link">
-          Blog
-        </a>
-        <div class="navbar-dropdown" data-style="width: 18rem;">
-          {% for post in site.posts %}
-            <a class="navbar-item" href="{{ post.url }}">
-              <div class="navbar-content">
-                <p>
-                  <small>{{ post.date | date_to_string }}</small>
-                </p>
-                <p>{{ post.title }}</p>
-              </div>
+        <div class="navbar-item has-dropdown is-hoverable">
+          <a class="navbar-link {% if page.route == 'blog' %}is-active{% endif %}" href="{{ site.url }}/blog/">
+            Blog
+          </a>
+          <div class="navbar-dropdown {% if include.boxed %}is-boxed{% endif %}" data-style="width: 18rem;">
+            {% for post in site.posts limit:3 %}
+              <a class="navbar-item" href="{{ post.url }}">
+                <div class="navbar-content">
+                  <p>
+                    <small>{{ post.date | date_to_string }}</small>
+                  </p>
+                  <p>{{ post.title }}</p>
+                </div>
+              </a>
+            {% endfor %}
+            <a class="navbar-item" href="{{ site.url }}/blog/">
+              More posts
             </a>
-          {% endfor %}
-          <hr class="navbar-divider">
-          <div class="navbar-item">
-            <div class="navbar-content">
-              <div class="level is-mobile">
-                <div class="level-left">
-                  <div class="level-item">
-                    <strong>Stay up to date!</strong>
+            <hr class="navbar-divider">
+            <div class="navbar-item">
+              <div class="navbar-content">
+                <div class="level is-mobile">
+                  <div class="level-left">
+                    <div class="level-item">
+                      <strong>Stay up to date!</strong>
+                    </div>
                   </div>
-                </div>
-                <div class="level-right">
-                  <div class="level-item">
-                    <a class="button is-warning is-small" href="{{ site.download }}">
-                      <span class="icon is-small">
-                        <i class="fa fa-rss"></i>
-                      </span>
-                      <span>Subscribe</span>
-                    </a>
+                  <div class="level-right">
+                    <div class="level-item">
+                      <a class="button is-rss is-small" href="{{ site.url }}/atom.xml">
+                        <span class="icon is-small">
+                          <i class="fa fa-rss"></i>
+                        </span>
+                        <span>Subscribe</span>
+                      </a>
+                    </div>
                   </div>
                 </div>
               </div>
           </div>
         </div>
       </div>
-      <a class="navbar-item">
-        More
-      </a>
-    </div>
 
-    <div class="navbar-end">
-      <a class="navbar-item">
-        Github
-      </a>
-      <a class="navbar-item">
-        Twitter
-      </a>
-      <div class="navbar-item">
-        <div class="field is-grouped">
-          <p class="control">
-            <a id="twitter"
-              class="button"
-              data-social-network="Twitter"
-              data-social-action="tweet"
-              data-social-target="{{ site.url }}"
-              target="_blank"
-              href="https://twitter.com/intent/tweet?text={{ site.title | urlencode }}&url={{ site.url }}&via=jgthms">
-              <span class="icon">
-                <i class="fa fa-twitter"></i>
-              </span>
-              <span>Tweet</span>
-            </a>
-          </p>
-          <p class="control">
-            <a class="button is-primary" href="{{ site.download }}">
-              <span class="icon">
-                <i class="fa fa-download"></i>
-              </span>
-              <span>Download</span>
-            </a>
-          </p>
+      <div class="navbar-end">
+        <a class="navbar-item" href="{{ site.github }}" target="_blank">
+          Github
+        </a>
+        <a class="navbar-item" href="https://twitter.com/jgthms" target="_blank">
+          Twitter
+        </a>
+        <div class="navbar-item">
+          <div class="field is-grouped">
+            <p class="control">
+              <a id="twitter"
+                class="button"
+                data-social-network="Twitter"
+                data-social-action="tweet"
+                data-social-target="{{ site.url }}"
+                target="_blank"
+                href="https://twitter.com/intent/tweet?text={{ site.title | urlencode }}&url={{ site.url }}&via=jgthms">
+                <span class="icon">
+                  <i class="fa fa-twitter"></i>
+                </span>
+                <span>Tweet</span>
+              </a>
+            </p>
+            <p class="control">
+              <a class="button is-primary" href="{{ site.download }}">
+                <span class="icon">
+                  <i class="fa fa-download"></i>
+                </span>
+                <span>Download</span>
+              </a>
+            </p>
+          </div>
         </div>
       </div>
     </div>
-  </div>
-</nav>
+  </nav>
 </div>
index aee56d2eff96651e405efd854862cdad594960b0..df898de3bc78615e60c673bfb57eba5e0ef022b9 100644 (file)
@@ -22,8 +22,9 @@
       <a class="nav-item is-tab {% if page.doc-subtab == 'modal' %}is-active{% endif %}" href="{{ site.url }}/documentation/components/modal/">
         Modal
       </a>
-      <a class="nav-item is-tab {% if page.doc-subtab == 'nav' %}is-active{% endif %}" href="{{ site.url }}/documentation/components/nav/">
-        Nav
+      <a class="nav-item is-tab {% if page.doc-subtab == 'navbar' %}is-active{% endif %}" href="{{ site.url }}/documentation/components/navbar/">
+        Navbar
+        <span class="tag is-success" style="margin-left: 0.5rem;">New!</span>
       </a>
       <a class="nav-item is-tab {% if page.doc-subtab == 'pagination' %}is-active{% endif %}" href="{{ site.url }}/documentation/components/pagination/">
         Pagination
diff --git a/docs/_javascript/index.js b/docs/_javascript/index.js
new file mode 100644 (file)
index 0000000..39dc9a6
--- /dev/null
@@ -0,0 +1,51 @@
+document.addEventListener('DOMContentLoaded', () => {
+
+  const $grid = document.getElementById('grid');
+  const $columns = Array.prototype.slice.call(document.querySelectorAll('#grid > .column'), 0);
+  console.log('$columns', $columns);
+  const $markup = document.querySelector('#markup code');
+  const $message = document.getElementById('message');
+  const $add = document.getElementById('add');
+  const $remove = document.getElementById('remove');
+  let showing = 5;
+
+  function showColumns() {
+    if (showing === 13) {
+      $message.style.display = 'block';
+    } else {
+      $message.style.display = 'none';
+    }
+
+    showing = Math.min(Math.max(parseInt(showing), 2), 12);
+
+    $columns.forEach($el => {
+      $el.style.display = 'none';
+    });
+    $columns.slice(0, showing).forEach($el => {
+      $el.style.display = 'block';
+    });
+
+    $markup.innerHTML = '<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;columns&quot;</span><span class="nt">&gt;</span>';
+    $markup.insertAdjacentHTML('beforeend', '\n');
+
+    for(let i = 0; i < showing; i++) {
+      $markup.insertAdjacentHTML('beforeend', '  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;column&quot;</span><span class="nt">&gt;</span>');
+      $markup.insertAdjacentHTML('beforeend', i + 1);
+      $markup.insertAdjacentHTML('beforeend', '<span class="nt">&lt;/div&gt;</span>');
+      $markup.insertAdjacentHTML('beforeend', '\n');
+    }
+
+    $markup.insertAdjacentHTML('beforeend', '<span class="nt">&lt;/div&gt;</span>');
+  }
+
+  $add.addEventListener('click', () => {
+    showing++;
+    showColumns();
+  });
+
+  $remove.addEventListener('click', () => {
+    showing--;
+    showColumns();
+  });
+
+});
diff --git a/docs/_javascript/main.js b/docs/_javascript/main.js
new file mode 100644 (file)
index 0000000..81b8c0f
--- /dev/null
@@ -0,0 +1,56 @@
+document.addEventListener('DOMContentLoaded', () => {
+
+  // Navbar burger menu
+
+  const $navBurger = document.getElementById('navBurger');
+  const $navMenu = document.getElementById('navMenu');
+
+  if ($navBurger) {
+    $navBurger.addEventListener('click', () => {
+      $navBurger.classList.toggle('is-active');
+      $navMenu.classList.toggle('is-active');
+    });
+  }
+
+  // Modals
+
+  const $html = document.documentElement;
+  const $modals = Array.prototype.slice.call(document.querySelectorAll('.modal'), 0);
+  const $modalButtons = Array.prototype.slice.call(document.querySelectorAll('.modal-button'), 0);
+  const $modalCloses = Array.prototype.slice.call(document.querySelectorAll('.modal-background, .modal-close, .modal-card-head .delete, .modal-card-foot .button'), 0);
+
+  if ($modalButtons.length > 0) {
+    $modalButtons.forEach($el => {
+      $el.addEventListener('click', () => {
+        const target = $el.dataset.target;
+        console.log('target', target);
+        const $target = document.getElementById(target);
+        $html.classList.add('is-clipped');
+        $target.classList.add('is-active');
+      });
+    });
+  }
+
+  if ($modalCloses.length > 0) {
+    $modalCloses.forEach($el => {
+      $el.addEventListener('click', () => {
+        $html.classList.remove('is-clipped');
+        closeModals();
+      });
+    });
+  }
+
+  document.addEventListener('keydown', e => {
+    if (e.keyCode === 27) {
+      $html.classList.remove('is-clipped');
+      closeModals();
+    }
+  });
+
+  function closeModals() {
+    $modals.forEach($el => {
+      $el.classList.remove('is-active');
+    });
+  }
+
+});
index ffac58e76e4f7abdf0b46620a7cb04f5ff01a99c..0521f28a3a7d9e84187dd7acaf57b83dc6a5dd05 100644 (file)
@@ -3,6 +3,6 @@
   {% include head.html %}
   <body class="layout-{{ page.layout }}{% if page.doc-tab %} page-{{ page.doc-tab}}{% endif %}">
     {{ content }}
-    <script type="text/javascript" src="{{ site.url }}/javascript/main.js"></script>
+    {% include footer.html %}
   </body>
 </html>
index 2e33969f9fc03343a0533745e50d98102a0281f2..4e4432b342fee8e63657a846a66a29deda2c691a 100644 (file)
@@ -3,9 +3,7 @@ layout: default
 route: documentation
 ---
 
-<div class="container">
-  {% include header.html %}
-</div>
+{% include navbar.html %}
 
 <section class="hero is-primary">
   <div class="hero-body">
index 0d90e9f4070a96e9686dab02ec9a7a4069f9f153..3cbea739b7e58ae2e1cbb08731ee1b978dae760b 100644 (file)
@@ -1,17 +1,17 @@
 @charset "utf-8"
 
 @import "../bulma"
-@import "./sass/highlight"
-@import "./sass/override"
-@import "./sass/global"
-@import "./sass/index"
-@import "./sass/header"
-@import "./sass/footer"
-@import "./sass/specific"
-@import "./sass/example"
-@import "./sass/callout"
-@import "./sass/bsa"
-@import "./sass/route"
+@import "./_sass/highlight"
+@import "./_sass/override"
+@import "./_sass/global"
+@import "./_sass/index"
+@import "./_sass/header"
+@import "./_sass/footer"
+@import "./_sass/specific"
+@import "./_sass/example"
+@import "./_sass/callout"
+@import "./_sass/bsa"
+@import "./_sass/route"
 
 html
   \::-moz-selection
index 110b4dd799ef60002a50184078df9c39d0bc49e9..e35bcc66f9dbacd1e5ed67af015a3e69eab3e1a0 100644 (file)
@@ -4395,7 +4395,12 @@ a.nav-item.is-tab.is-active {
 a.navbar-item:hover,
 .navbar-link:hover {
   background-color: whitesmoke;
-  color: #363636;
+  color: #0a0a0a;
+}
+
+a.navbar-item.is-active,
+.navbar-link.is-active {
+  color: #0a0a0a;
 }
 
 .navbar-item {
@@ -4435,6 +4440,10 @@ a.navbar-item:hover,
   background-color: whitesmoke;
 }
 
+.navbar-dropdown a.navbar-item.is-active {
+  color: #00d1b2;
+}
+
 .navbar-divider {
   background-color: #dbdbdb;
   border: none;
@@ -4467,6 +4476,14 @@ a.navbar-item:hover,
   .navbar {
     height: 3.25rem;
   }
+  .navbar.is-transparent .navbar-brand .navbar-link:hover,
+  .navbar.is-transparent .navbar-brand > a.navbar-item:hover,
+  .navbar.is-transparent .navbar-start .navbar-link:hover,
+  .navbar.is-transparent .navbar-start > a.navbar-item:hover,
+  .navbar.is-transparent .navbar-end .navbar-link:hover,
+  .navbar.is-transparent .navbar-end > a.navbar-item:hover {
+    background-color: transparent;
+  }
   .navbar-burger {
     display: none;
   }
@@ -4496,9 +4513,10 @@ a.navbar-item:hover,
   .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown {
     display: block;
   }
-  a.navbar-item:hover,
-  .navbar-link:hover {
-    background-color: transparent;
+  .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed {
+    opacity: 1;
+    pointer-events: auto;
+    transform: translateY(0);
   }
   .navbar-menu {
     flex-grow: 1;
@@ -4514,20 +4532,34 @@ a.navbar-item:hover,
   }
   .navbar-dropdown {
     background-color: white;
-    border-radius: 5px;
-    box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
+    border-bottom-left-radius: 5px;
+    border-bottom-right-radius: 5px;
+    border-top: 1px solid #dbdbdb;
+    box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1);
     display: none;
     font-size: 0.875rem;
     left: 0;
     min-width: 100%;
     position: absolute;
-    top: calc(100% + (-4px));
+    top: 100%;
     z-index: 20;
   }
   .navbar-dropdown .navbar-item {
     padding: 0.375rem 1rem;
     white-space: nowrap;
   }
+  .navbar-dropdown.is-boxed {
+    border-radius: 5px;
+    border-top: none;
+    box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
+    display: block;
+    opacity: 0;
+    pointer-events: none;
+    top: calc(100% + (-4px));
+    transform: translateY(-5px);
+    transition-duration: 86ms;
+    transition-property: opacity, transform;
+  }
   .navbar-divider {
     display: block;
   }
@@ -7752,6 +7784,20 @@ html.route-index #carbon {
   width: 24px;
 }
 
+.button.is-rss {
+  background-color: #f26522;
+  border-color: transparent;
+  color: #fff;
+}
+
+.button.is-rss:hover {
+  background-color: #ed560e;
+}
+
+.button.is-rss:active {
+  background-color: #d54d0d;
+}
+
 .example,
 .structure {
   border: 1px solid #ffdd57;
index 9b43699e9ccb20fd1247adb0268b217364e2ec76..cf1b3b999181b10a7c458a0821b9cc029aa6ca1a 100644 (file)
@@ -32,7 +32,7 @@ doc-subtab: modal
         </li>
       </ul>
       <p>
-        <a class="button is-primary is-large modal-button" data-target="#modal">Launch example modal</a>
+        <a class="button is-primary is-large modal-button" data-target="modal">Launch example modal</a>
       </p>
     </div>
 
@@ -42,7 +42,7 @@ doc-subtab: modal
   <div class="modal-content">
     <!-- Any other Bulma elements you want -->
   </div>
-  <button class="modal-close"></button>
+  <button class="modal-close is-large"></button>
 </div>
 {% endhighlight %}
 
@@ -66,7 +66,7 @@ doc-subtab: modal
     <div class="content">
       <p>Because a modal can contain <strong>anything you want</strong>, you can very simply use it to build an image gallery for example:</p>
       <p>
-        <a class="button is-primary is-large modal-button" data-target="#modal-bis">Launch image modal</a>
+        <a class="button is-primary is-large modal-button" data-target="modal-bis">Launch image modal</a>
       </p>
     </div>
 
@@ -78,7 +78,7 @@ doc-subtab: modal
       <img src="{{site.url}}/images/placeholders/1280x960.png">
     </p>
   </div>
-  <button class="modal-close"></button>
+  <button class="modal-close is-large"></button>
 </div>
 {% endhighlight %}
 
@@ -89,7 +89,7 @@ doc-subtab: modal
     <div class="content">
       <p>If you want a more classic modal, with a <strong>head</strong>, a <strong>body</strong> and a <strong>foot</strong>, use the <code>modal-card</code>.</p>
       <p>
-        <a class="button is-primary is-large modal-button" data-target="#modal-ter">Launch modal card</a>
+        <a class="button is-primary is-large modal-button" data-target="modal-ter">Launch modal card</a>
       </p>
     </div>
 
@@ -150,7 +150,7 @@ doc-subtab: modal
       </article>
     </div>
   </div>
-  <button class="modal-close"></button>
+  <button class="modal-close is-large"></button>
 </div>
 
 <div id="modal-bis" class="modal">
@@ -160,7 +160,7 @@ doc-subtab: modal
       <img src="{{site.url}}/images/placeholders/1280x960.png">
     </p>
   </div>
-  <button class="modal-close"></button>
+  <button class="modal-close is-large"></button>
 </div>
 
 <div id="modal-ter" class="modal">
diff --git a/docs/documentation/components/navbar.html b/docs/documentation/components/navbar.html
new file mode 100644 (file)
index 0000000..68bf8a5
--- /dev/null
@@ -0,0 +1,18 @@
+---
+layout: documentation
+doc-tab: components
+doc-subtab: navbar
+---
+
+{% include subnav-components.html %}
+
+<section class="section">
+  <div class="container">
+    <h1 class="title">Navbar</h1>
+    <h2 class="subtitle">
+      A responsive horizontal <strong>navbar</strong> that can supports images, links, buttons, and dropdowns
+    </h2>
+
+    <hr>
+  </div>
+</section>
index 7ba0f4e512664f1c81c2fe5fecc2d928b03185e3..ed2d255a2adfc572e5f220f644072b0b5b55c39f 100644 (file)
@@ -236,12 +236,7 @@ doc-subtab: button
   </div>
 </div>
 
-    <p id="static-button" style="margin-bottom: 0.5rem;">
-      <span class="tag is-success">New!</span>
-      <span class="tag is-info">0.4.2</span>
-    </p>
-
-    <h4 class="subtitle">
+    <h4 id="static-button" class="subtitle">
       Static
     </h4>
 
@@ -252,6 +247,10 @@ doc-subtab: button
   <div class="column">
 
     <div class="content">
+      <p>
+        <span class="tag is-success">New!</span>
+        <span class="tag is-info">0.4.2</span>
+      </p>
       <p>
         You can create a <strong>non-interactive button</strong> by using the <code>is-static</code> modifier. This is useful to align a text label with an input, for example when using <a href="{{site.url}}/documentation/elements/form#form-addons">form addons</a>.
       </p>
index 6224b5e6ad92675f033054db4dc8dff1aaca0479..f0bbc78a6915a875e47a72bc11a1e50f06b23b89 100644 (file)
@@ -803,12 +803,11 @@ doc-subtab: form
       <p>You can attach inputs, buttons, and dropdowns <strong>only</strong>.</p>
     </div>
 
-    <p style="margin-bottom: 0.5rem;">
-      <span class="tag is-success">New!</span>
-      <span class="tag is-info">0.4.2</span>
-    </p>
-
     <div class="content">
+      <p>
+        <span class="tag is-success">New!</span>
+        <span class="tag is-info">0.4.2</span>
+      </p>
       <p>It can be useful to append a <a href="{{site.url}}/documentation/elements/button#static-button">static button</a>.</p>
     </div>
 
@@ -1144,7 +1143,8 @@ doc-subtab: form
 <div class="content">
   <p>
     <span class="tag is-success">New!</span>
-    <br>
+  </p>
+  <p>
     To preserve the <strong>vertical alignment</strong> of labels with each type and size of control, the <code>.field-label</code> comes with <strong>4 size modifiers</strong>:
   </p>
   <ul>
index 6735ed26151c88197cbb57dc4e54848237559d83..5d75f2229dfd7751fefc2dc58a64f580b71822d9 100644 (file)
@@ -47,7 +47,8 @@ doc-subtab: table
       <p>
         <span class="tag is-success">New!</span>
         <span class="tag is-info">0.4.2</span>
-        <br>
+      </p>
+      <p>
         You can set a table row as <strong>selected</strong> by appending the <code>is-selected</code> modifier on a <code>&lt;tr&gt;</code>
       </p>
     </div>
index 8b28ed6976ebcf03d192aa16c885fd9d2b430332..bd223ffbd5678c9ce3d78b7fdebbd4f15e19e279 100644 (file)
@@ -3,7 +3,7 @@ layout: default
 route: index
 ---
 
-{% include navbar.html %}
+{% include navbar.html transparent=true boxed=true %}
 
 <section class="hero is-medium has-text-centered">
   <div class="hero-body">
diff --git a/docs/javascript/Chart.js b/docs/javascript/Chart.js
deleted file mode 100644 (file)
index e1215f9..0000000
+++ /dev/null
@@ -1,9214 +0,0 @@
-(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-
-},{}],2:[function(require,module,exports){
-/* MIT license */
-
-module.exports = {
-  rgb2hsl: rgb2hsl,
-  rgb2hsv: rgb2hsv,
-  rgb2hwb: rgb2hwb,
-  rgb2cmyk: rgb2cmyk,
-  rgb2keyword: rgb2keyword,
-  rgb2xyz: rgb2xyz,
-  rgb2lab: rgb2lab,
-  rgb2lch: rgb2lch,
-
-  hsl2rgb: hsl2rgb,
-  hsl2hsv: hsl2hsv,
-  hsl2hwb: hsl2hwb,
-  hsl2cmyk: hsl2cmyk,
-  hsl2keyword: hsl2keyword,
-
-  hsv2rgb: hsv2rgb,
-  hsv2hsl: hsv2hsl,
-  hsv2hwb: hsv2hwb,
-  hsv2cmyk: hsv2cmyk,
-  hsv2keyword: hsv2keyword,
-
-  hwb2rgb: hwb2rgb,
-  hwb2hsl: hwb2hsl,
-  hwb2hsv: hwb2hsv,
-  hwb2cmyk: hwb2cmyk,
-  hwb2keyword: hwb2keyword,
-
-  cmyk2rgb: cmyk2rgb,
-  cmyk2hsl: cmyk2hsl,
-  cmyk2hsv: cmyk2hsv,
-  cmyk2hwb: cmyk2hwb,
-  cmyk2keyword: cmyk2keyword,
-
-  keyword2rgb: keyword2rgb,
-  keyword2hsl: keyword2hsl,
-  keyword2hsv: keyword2hsv,
-  keyword2hwb: keyword2hwb,
-  keyword2cmyk: keyword2cmyk,
-  keyword2lab: keyword2lab,
-  keyword2xyz: keyword2xyz,
-
-  xyz2rgb: xyz2rgb,
-  xyz2lab: xyz2lab,
-  xyz2lch: xyz2lch,
-
-  lab2xyz: lab2xyz,
-  lab2rgb: lab2rgb,
-  lab2lch: lab2lch,
-
-  lch2lab: lch2lab,
-  lch2xyz: lch2xyz,
-  lch2rgb: lch2rgb
-}
-
-
-function rgb2hsl(rgb) {
-  var r = rgb[0]/255,
-      g = rgb[1]/255,
-      b = rgb[2]/255,
-      min = Math.min(r, g, b),
-      max = Math.max(r, g, b),
-      delta = max - min,
-      h, s, l;
-
-  if (max == min)
-    h = 0;
-  else if (r == max)
-    h = (g - b) / delta;
-  else if (g == max)
-    h = 2 + (b - r) / delta;
-  else if (b == max)
-    h = 4 + (r - g)/ delta;
-
-  h = Math.min(h * 60, 360);
-
-  if (h < 0)
-    h += 360;
-
-  l = (min + max) / 2;
-
-  if (max == min)
-    s = 0;
-  else if (l <= 0.5)
-    s = delta / (max + min);
-  else
-    s = delta / (2 - max - min);
-
-  return [h, s * 100, l * 100];
-}
-
-function rgb2hsv(rgb) {
-  var r = rgb[0],
-      g = rgb[1],
-      b = rgb[2],
-      min = Math.min(r, g, b),
-      max = Math.max(r, g, b),
-      delta = max - min,
-      h, s, v;
-
-  if (max == 0)
-    s = 0;
-  else
-    s = (delta/max * 1000)/10;
-
-  if (max == min)
-    h = 0;
-  else if (r == max)
-    h = (g - b) / delta;
-  else if (g == max)
-    h = 2 + (b - r) / delta;
-  else if (b == max)
-    h = 4 + (r - g) / delta;
-
-  h = Math.min(h * 60, 360);
-
-  if (h < 0)
-    h += 360;
-
-  v = ((max / 255) * 1000) / 10;
-
-  return [h, s, v];
-}
-
-function rgb2hwb(rgb) {
-  var r = rgb[0],
-      g = rgb[1],
-      b = rgb[2],
-      h = rgb2hsl(rgb)[0],
-      w = 1/255 * Math.min(r, Math.min(g, b)),
-      b = 1 - 1/255 * Math.max(r, Math.max(g, b));
-
-  return [h, w * 100, b * 100];
-}
-
-function rgb2cmyk(rgb) {
-  var r = rgb[0] / 255,
-      g = rgb[1] / 255,
-      b = rgb[2] / 255,
-      c, m, y, k;
-
-  k = Math.min(1 - r, 1 - g, 1 - b);
-  c = (1 - r - k) / (1 - k) || 0;
-  m = (1 - g - k) / (1 - k) || 0;
-  y = (1 - b - k) / (1 - k) || 0;
-  return [c * 100, m * 100, y * 100, k * 100];
-}
-
-function rgb2keyword(rgb) {
-  return reverseKeywords[JSON.stringify(rgb)];
-}
-
-function rgb2xyz(rgb) {
-  var r = rgb[0] / 255,
-      g = rgb[1] / 255,
-      b = rgb[2] / 255;
-
-  // assume sRGB
-  r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
-  g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
-  b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
-
-  var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
-  var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
-  var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
-
-  return [x * 100, y *100, z * 100];
-}
-
-function rgb2lab(rgb) {
-  var xyz = rgb2xyz(rgb),
-        x = xyz[0],
-        y = xyz[1],
-        z = xyz[2],
-        l, a, b;
-
-  x /= 95.047;
-  y /= 100;
-  z /= 108.883;
-
-  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
-  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
-  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);
-
-  l = (116 * y) - 16;
-  a = 500 * (x - y);
-  b = 200 * (y - z);
-
-  return [l, a, b];
-}
-
-function rgb2lch(args) {
-  return lab2lch(rgb2lab(args));
-}
-
-function hsl2rgb(hsl) {
-  var h = hsl[0] / 360,
-      s = hsl[1] / 100,
-      l = hsl[2] / 100,
-      t1, t2, t3, rgb, val;
-
-  if (s == 0) {
-    val = l * 255;
-    return [val, val, val];
-  }
-
-  if (l < 0.5)
-    t2 = l * (1 + s);
-  else
-    t2 = l + s - l * s;
-  t1 = 2 * l - t2;
-
-  rgb = [0, 0, 0];
-  for (var i = 0; i < 3; i++) {
-    t3 = h + 1 / 3 * - (i - 1);
-    t3 < 0 && t3++;
-    t3 > 1 && t3--;
-
-    if (6 * t3 < 1)
-      val = t1 + (t2 - t1) * 6 * t3;
-    else if (2 * t3 < 1)
-      val = t2;
-    else if (3 * t3 < 2)
-      val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
-    else
-      val = t1;
-
-    rgb[i] = val * 255;
-  }
-
-  return rgb;
-}
-
-function hsl2hsv(hsl) {
-  var h = hsl[0],
-      s = hsl[1] / 100,
-      l = hsl[2] / 100,
-      sv, v;
-
-  if(l === 0) {
-      // no need to do calc on black
-      // also avoids divide by 0 error
-      return [0, 0, 0];
-  }
-
-  l *= 2;
-  s *= (l <= 1) ? l : 2 - l;
-  v = (l + s) / 2;
-  sv = (2 * s) / (l + s);
-  return [h, sv * 100, v * 100];
-}
-
-function hsl2hwb(args) {
-  return rgb2hwb(hsl2rgb(args));
-}
-
-function hsl2cmyk(args) {
-  return rgb2cmyk(hsl2rgb(args));
-}
-
-function hsl2keyword(args) {
-  return rgb2keyword(hsl2rgb(args));
-}
-
-
-function hsv2rgb(hsv) {
-  var h = hsv[0] / 60,
-      s = hsv[1] / 100,
-      v = hsv[2] / 100,
-      hi = Math.floor(h) % 6;
-
-  var f = h - Math.floor(h),
-      p = 255 * v * (1 - s),
-      q = 255 * v * (1 - (s * f)),
-      t = 255 * v * (1 - (s * (1 - f))),
-      v = 255 * v;
-
-  switch(hi) {
-    case 0:
-      return [v, t, p];
-    case 1:
-      return [q, v, p];
-    case 2:
-      return [p, v, t];
-    case 3:
-      return [p, q, v];
-    case 4:
-      return [t, p, v];
-    case 5:
-      return [v, p, q];
-  }
-}
-
-function hsv2hsl(hsv) {
-  var h = hsv[0],
-      s = hsv[1] / 100,
-      v = hsv[2] / 100,
-      sl, l;
-
-  l = (2 - s) * v;
-  sl = s * v;
-  sl /= (l <= 1) ? l : 2 - l;
-  sl = sl || 0;
-  l /= 2;
-  return [h, sl * 100, l * 100];
-}
-
-function hsv2hwb(args) {
-  return rgb2hwb(hsv2rgb(args))
-}
-
-function hsv2cmyk(args) {
-  return rgb2cmyk(hsv2rgb(args));
-}
-
-function hsv2keyword(args) {
-  return rgb2keyword(hsv2rgb(args));
-}
-
-// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
-function hwb2rgb(hwb) {
-  var h = hwb[0] / 360,
-      wh = hwb[1] / 100,
-      bl = hwb[2] / 100,
-      ratio = wh + bl,
-      i, v, f, n;
-
-  // wh + bl cant be > 1
-  if (ratio > 1) {
-    wh /= ratio;
-    bl /= ratio;
-  }
-
-  i = Math.floor(6 * h);
-  v = 1 - bl;
-  f = 6 * h - i;
-  if ((i & 0x01) != 0) {
-    f = 1 - f;
-  }
-  n = wh + f * (v - wh);  // linear interpolation
-
-  switch (i) {
-    default:
-    case 6:
-    case 0: r = v; g = n; b = wh; break;
-    case 1: r = n; g = v; b = wh; break;
-    case 2: r = wh; g = v; b = n; break;
-    case 3: r = wh; g = n; b = v; break;
-    case 4: r = n; g = wh; b = v; break;
-    case 5: r = v; g = wh; b = n; break;
-  }
-
-  return [r * 255, g * 255, b * 255];
-}
-
-function hwb2hsl(args) {
-  return rgb2hsl(hwb2rgb(args));
-}
-
-function hwb2hsv(args) {
-  return rgb2hsv(hwb2rgb(args));
-}
-
-function hwb2cmyk(args) {
-  return rgb2cmyk(hwb2rgb(args));
-}
-
-function hwb2keyword(args) {
-  return rgb2keyword(hwb2rgb(args));
-}
-
-function cmyk2rgb(cmyk) {
-  var c = cmyk[0] / 100,
-      m = cmyk[1] / 100,
-      y = cmyk[2] / 100,
-      k = cmyk[3] / 100,
-      r, g, b;
-
-  r = 1 - Math.min(1, c * (1 - k) + k);
-  g = 1 - Math.min(1, m * (1 - k) + k);
-  b = 1 - Math.min(1, y * (1 - k) + k);
-  return [r * 255, g * 255, b * 255];
-}
-
-function cmyk2hsl(args) {
-  return rgb2hsl(cmyk2rgb(args));
-}
-
-function cmyk2hsv(args) {
-  return rgb2hsv(cmyk2rgb(args));
-}
-
-function cmyk2hwb(args) {
-  return rgb2hwb(cmyk2rgb(args));
-}
-
-function cmyk2keyword(args) {
-  return rgb2keyword(cmyk2rgb(args));
-}
-
-
-function xyz2rgb(xyz) {
-  var x = xyz[0] / 100,
-      y = xyz[1] / 100,
-      z = xyz[2] / 100,
-      r, g, b;
-
-  r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
-  g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
-  b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
-
-  // assume sRGB
-  r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
-    : r = (r * 12.92);
-
-  g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
-    : g = (g * 12.92);
-
-  b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
-    : b = (b * 12.92);
-
-  r = Math.min(Math.max(0, r), 1);
-  g = Math.min(Math.max(0, g), 1);
-  b = Math.min(Math.max(0, b), 1);
-
-  return [r * 255, g * 255, b * 255];
-}
-
-function xyz2lab(xyz) {
-  var x = xyz[0],
-      y = xyz[1],
-      z = xyz[2],
-      l, a, b;
-
-  x /= 95.047;
-  y /= 100;
-  z /= 108.883;
-
-  x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116);
-  y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116);
-  z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116);
-
-  l = (116 * y) - 16;
-  a = 500 * (x - y);
-  b = 200 * (y - z);
-
-  return [l, a, b];
-}
-
-function xyz2lch(args) {
-  return lab2lch(xyz2lab(args));
-}
-
-function lab2xyz(lab) {
-  var l = lab[0],
-      a = lab[1],
-      b = lab[2],
-      x, y, z, y2;
-
-  if (l <= 8) {
-    y = (l * 100) / 903.3;
-    y2 = (7.787 * (y / 100)) + (16 / 116);
-  } else {
-    y = 100 * Math.pow((l + 16) / 116, 3);
-    y2 = Math.pow(y / 100, 1/3);
-  }
-
-  x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3);
-
-  z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3);
-
-  return [x, y, z];
-}
-
-function lab2lch(lab) {
-  var l = lab[0],
-      a = lab[1],
-      b = lab[2],
-      hr, h, c;
-
-  hr = Math.atan2(b, a);
-  h = hr * 360 / 2 / Math.PI;
-  if (h < 0) {
-    h += 360;
-  }
-  c = Math.sqrt(a * a + b * b);
-  return [l, c, h];
-}
-
-function lab2rgb(args) {
-  return xyz2rgb(lab2xyz(args));
-}
-
-function lch2lab(lch) {
-  var l = lch[0],
-      c = lch[1],
-      h = lch[2],
-      a, b, hr;
-
-  hr = h / 360 * 2 * Math.PI;
-  a = c * Math.cos(hr);
-  b = c * Math.sin(hr);
-  return [l, a, b];
-}
-
-function lch2xyz(args) {
-  return lab2xyz(lch2lab(args));
-}
-
-function lch2rgb(args) {
-  return lab2rgb(lch2lab(args));
-}
-
-function keyword2rgb(keyword) {
-  return cssKeywords[keyword];
-}
-
-function keyword2hsl(args) {
-  return rgb2hsl(keyword2rgb(args));
-}
-
-function keyword2hsv(args) {
-  return rgb2hsv(keyword2rgb(args));
-}
-
-function keyword2hwb(args) {
-  return rgb2hwb(keyword2rgb(args));
-}
-
-function keyword2cmyk(args) {
-  return rgb2cmyk(keyword2rgb(args));
-}
-
-function keyword2lab(args) {
-  return rgb2lab(keyword2rgb(args));
-}
-
-function keyword2xyz(args) {
-  return rgb2xyz(keyword2rgb(args));
-}
-
-var cssKeywords = {
-  aliceblue:  [240,248,255],
-  antiquewhite: [250,235,215],
-  aqua: [0,255,255],
-  aquamarine: [127,255,212],
-  azure:  [240,255,255],
-  beige:  [245,245,220],
-  bisque: [255,228,196],
-  black:  [0,0,0],
-  blanchedalmond: [255,235,205],
-  blue: [0,0,255],
-  blueviolet: [138,43,226],
-  brown:  [165,42,42],
-  burlywood:  [222,184,135],
-  cadetblue:  [95,158,160],
-  chartreuse: [127,255,0],
-  chocolate:  [210,105,30],
-  coral:  [255,127,80],
-  cornflowerblue: [100,149,237],
-  cornsilk: [255,248,220],
-  crimson:  [220,20,60],
-  cyan: [0,255,255],
-  darkblue: [0,0,139],
-  darkcyan: [0,139,139],
-  darkgoldenrod:  [184,134,11],
-  darkgray: [169,169,169],
-  darkgreen:  [0,100,0],
-  darkgrey: [169,169,169],
-  darkkhaki:  [189,183,107],
-  darkmagenta:  [139,0,139],
-  darkolivegreen: [85,107,47],
-  darkorange: [255,140,0],
-  darkorchid: [153,50,204],
-  darkred:  [139,0,0],
-  darksalmon: [233,150,122],
-  darkseagreen: [143,188,143],
-  darkslateblue:  [72,61,139],
-  darkslategray:  [47,79,79],
-  darkslategrey:  [47,79,79],
-  darkturquoise:  [0,206,209],
-  darkviolet: [148,0,211],
-  deeppink: [255,20,147],
-  deepskyblue:  [0,191,255],
-  dimgray:  [105,105,105],
-  dimgrey:  [105,105,105],
-  dodgerblue: [30,144,255],
-  firebrick:  [178,34,34],
-  floralwhite:  [255,250,240],
-  forestgreen:  [34,139,34],
-  fuchsia:  [255,0,255],
-  gainsboro:  [220,220,220],
-  ghostwhite: [248,248,255],
-  gold: [255,215,0],
-  goldenrod:  [218,165,32],
-  gray: [128,128,128],
-  green:  [0,128,0],
-  greenyellow:  [173,255,47],
-  grey: [128,128,128],
-  honeydew: [240,255,240],
-  hotpink:  [255,105,180],
-  indianred:  [205,92,92],
-  indigo: [75,0,130],
-  ivory:  [255,255,240],
-  khaki:  [240,230,140],
-  lavender: [230,230,250],
-  lavenderblush:  [255,240,245],
-  lawngreen:  [124,252,0],
-  lemonchiffon: [255,250,205],
-  lightblue:  [173,216,230],
-  lightcoral: [240,128,128],
-  lightcyan:  [224,255,255],
-  lightgoldenrodyellow: [250,250,210],
-  lightgray:  [211,211,211],
-  lightgreen: [144,238,144],
-  lightgrey:  [211,211,211],
-  lightpink:  [255,182,193],
-  lightsalmon:  [255,160,122],
-  lightseagreen:  [32,178,170],
-  lightskyblue: [135,206,250],
-  lightslategray: [119,136,153],
-  lightslategrey: [119,136,153],
-  lightsteelblue: [176,196,222],
-  lightyellow:  [255,255,224],
-  lime: [0,255,0],
-  limegreen:  [50,205,50],
-  linen:  [250,240,230],
-  magenta:  [255,0,255],
-  maroon: [128,0,0],
-  mediumaquamarine: [102,205,170],
-  mediumblue: [0,0,205],
-  mediumorchid: [186,85,211],
-  mediumpurple: [147,112,219],
-  mediumseagreen: [60,179,113],
-  mediumslateblue:  [123,104,238],
-  mediumspringgreen:  [0,250,154],
-  mediumturquoise:  [72,209,204],
-  mediumvioletred:  [199,21,133],
-  midnightblue: [25,25,112],
-  mintcream:  [245,255,250],
-  mistyrose:  [255,228,225],
-  moccasin: [255,228,181],
-  navajowhite:  [255,222,173],
-  navy: [0,0,128],
-  oldlace:  [253,245,230],
-  olive:  [128,128,0],
-  olivedrab:  [107,142,35],
-  orange: [255,165,0],
-  orangered:  [255,69,0],
-  orchid: [218,112,214],
-  palegoldenrod:  [238,232,170],
-  palegreen:  [152,251,152],
-  paleturquoise:  [175,238,238],
-  palevioletred:  [219,112,147],
-  papayawhip: [255,239,213],
-  peachpuff:  [255,218,185],
-  peru: [205,133,63],
-  pink: [255,192,203],
-  plum: [221,160,221],
-  powderblue: [176,224,230],
-  purple: [128,0,128],
-  rebeccapurple: [102, 51, 153],
-  red:  [255,0,0],
-  rosybrown:  [188,143,143],
-  royalblue:  [65,105,225],
-  saddlebrown:  [139,69,19],
-  salmon: [250,128,114],
-  sandybrown: [244,164,96],
-  seagreen: [46,139,87],
-  seashell: [255,245,238],
-  sienna: [160,82,45],
-  silver: [192,192,192],
-  skyblue:  [135,206,235],
-  slateblue:  [106,90,205],
-  slategray:  [112,128,144],
-  slategrey:  [112,128,144],
-  snow: [255,250,250],
-  springgreen:  [0,255,127],
-  steelblue:  [70,130,180],
-  tan:  [210,180,140],
-  teal: [0,128,128],
-  thistle:  [216,191,216],
-  tomato: [255,99,71],
-  turquoise:  [64,224,208],
-  violet: [238,130,238],
-  wheat:  [245,222,179],
-  white:  [255,255,255],
-  whitesmoke: [245,245,245],
-  yellow: [255,255,0],
-  yellowgreen:  [154,205,50]
-};
-
-var reverseKeywords = {};
-for (var key in cssKeywords) {
-  reverseKeywords[JSON.stringify(cssKeywords[key])] = key;
-}
-
-},{}],3:[function(require,module,exports){
-var conversions = require("./conversions");
-
-var convert = function() {
-   return new Converter();
-}
-
-for (var func in conversions) {
-  // export Raw versions
-  convert[func + "Raw"] =  (function(func) {
-    // accept array or plain args
-    return function(arg) {
-      if (typeof arg == "number")
-        arg = Array.prototype.slice.call(arguments);
-      return conversions[func](arg);
-    }
-  })(func);
-
-  var pair = /(\w+)2(\w+)/.exec(func),
-      from = pair[1],
-      to = pair[2];
-
-  // export rgb2hsl and ["rgb"]["hsl"]
-  convert[from] = convert[from] || {};
-
-  convert[from][to] = convert[func] = (function(func) { 
-    return function(arg) {
-      if (typeof arg == "number")
-        arg = Array.prototype.slice.call(arguments);
-      
-      var val = conversions[func](arg);
-      if (typeof val == "string" || val === undefined)
-        return val; // keyword
-
-      for (var i = 0; i < val.length; i++)
-        val[i] = Math.round(val[i]);
-      return val;
-    }
-  })(func);
-}
-
-
-/* Converter does lazy conversion and caching */
-var Converter = function() {
-   this.convs = {};
-};
-
-/* Either get the values for a space or
-  set the values for a space, depending on args */
-Converter.prototype.routeSpace = function(space, args) {
-   var values = args[0];
-   if (values === undefined) {
-      // color.rgb()
-      return this.getValues(space);
-   }
-   // color.rgb(10, 10, 10)
-   if (typeof values == "number") {
-      values = Array.prototype.slice.call(args);        
-   }
-
-   return this.setValues(space, values);
-};
-  
-/* Set the values for a space, invalidating cache */
-Converter.prototype.setValues = function(space, values) {
-   this.space = space;
-   this.convs = {};
-   this.convs[space] = values;
-   return this;
-};
-
-/* Get the values for a space. If there's already
-  a conversion for the space, fetch it, otherwise
-  compute it */
-Converter.prototype.getValues = function(space) {
-   var vals = this.convs[space];
-   if (!vals) {
-      var fspace = this.space,
-          from = this.convs[fspace];
-      vals = convert[fspace][space](from);
-
-      this.convs[space] = vals;
-   }
-  return vals;
-};
-
-["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) {
-   Converter.prototype[space] = function(vals) {
-      return this.routeSpace(space, arguments);
-   }
-});
-
-module.exports = convert;
-},{"./conversions":2}],4:[function(require,module,exports){
-/* MIT license */
-var colorNames = require('color-name');
-
-module.exports = {
-   getRgba: getRgba,
-   getHsla: getHsla,
-   getRgb: getRgb,
-   getHsl: getHsl,
-   getHwb: getHwb,
-   getAlpha: getAlpha,
-
-   hexString: hexString,
-   rgbString: rgbString,
-   rgbaString: rgbaString,
-   percentString: percentString,
-   percentaString: percentaString,
-   hslString: hslString,
-   hslaString: hslaString,
-   hwbString: hwbString,
-   keyword: keyword
-}
-
-function getRgba(string) {
-   if (!string) {
-      return;
-   }
-   var abbr =  /^#([a-fA-F0-9]{3})$/,
-       hex =  /^#([a-fA-F0-9]{6})$/,
-       rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,
-       per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/,
-       keyword = /(\w+)/;
-
-   var rgb = [0, 0, 0],
-       a = 1,
-       match = string.match(abbr);
-   if (match) {
-      match = match[1];
-      for (var i = 0; i < rgb.length; i++) {
-         rgb[i] = parseInt(match[i] + match[i], 16);
-      }
-   }
-   else if (match = string.match(hex)) {
-      match = match[1];
-      for (var i = 0; i < rgb.length; i++) {
-         rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);
-      }
-   }
-   else if (match = string.match(rgba)) {
-      for (var i = 0; i < rgb.length; i++) {
-         rgb[i] = parseInt(match[i + 1]);
-      }
-      a = parseFloat(match[4]);
-   }
-   else if (match = string.match(per)) {
-      for (var i = 0; i < rgb.length; i++) {
-         rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
-      }
-      a = parseFloat(match[4]);
-   }
-   else if (match = string.match(keyword)) {
-      if (match[1] == "transparent") {
-         return [0, 0, 0, 0];
-      }
-      rgb = colorNames[match[1]];
-      if (!rgb) {
-         return;
-      }
-   }
-
-   for (var i = 0; i < rgb.length; i++) {
-      rgb[i] = scale(rgb[i], 0, 255);
-   }
-   if (!a && a != 0) {
-      a = 1;
-   }
-   else {
-      a = scale(a, 0, 1);
-   }
-   rgb[3] = a;
-   return rgb;
-}
-
-function getHsla(string) {
-   if (!string) {
-      return;
-   }
-   var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
-   var match = string.match(hsl);
-   if (match) {
-      var alpha = parseFloat(match[4]);
-      var h = scale(parseInt(match[1]), 0, 360),
-          s = scale(parseFloat(match[2]), 0, 100),
-          l = scale(parseFloat(match[3]), 0, 100),
-          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
-      return [h, s, l, a];
-   }
-}
-
-function getHwb(string) {
-   if (!string) {
-      return;
-   }
-   var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/;
-   var match = string.match(hwb);
-   if (match) {
-    var alpha = parseFloat(match[4]);
-      var h = scale(parseInt(match[1]), 0, 360),
-          w = scale(parseFloat(match[2]), 0, 100),
-          b = scale(parseFloat(match[3]), 0, 100),
-          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);
-      return [h, w, b, a];
-   }
-}
-
-function getRgb(string) {
-   var rgba = getRgba(string);
-   return rgba && rgba.slice(0, 3);
-}
-
-function getHsl(string) {
-  var hsla = getHsla(string);
-  return hsla && hsla.slice(0, 3);
-}
-
-function getAlpha(string) {
-   var vals = getRgba(string);
-   if (vals) {
-      return vals[3];
-   }
-   else if (vals = getHsla(string)) {
-      return vals[3];
-   }
-   else if (vals = getHwb(string)) {
-      return vals[3];
-   }
-}
-
-// generators
-function hexString(rgb) {
-   return "#" + hexDouble(rgb[0]) + hexDouble(rgb[1])
-              + hexDouble(rgb[2]);
-}
-
-function rgbString(rgba, alpha) {
-   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
-      return rgbaString(rgba, alpha);
-   }
-   return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")";
-}
-
-function rgbaString(rgba, alpha) {
-   if (alpha === undefined) {
-      alpha = (rgba[3] !== undefined ? rgba[3] : 1);
-   }
-   return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2]
-           + ", " + alpha + ")";
-}
-
-function percentString(rgba, alpha) {
-   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {
-      return percentaString(rgba, alpha);
-   }
-   var r = Math.round(rgba[0]/255 * 100),
-       g = Math.round(rgba[1]/255 * 100),
-       b = Math.round(rgba[2]/255 * 100);
-
-   return "rgb(" + r + "%, " + g + "%, " + b + "%)";
-}
-
-function percentaString(rgba, alpha) {
-   var r = Math.round(rgba[0]/255 * 100),
-       g = Math.round(rgba[1]/255 * 100),
-       b = Math.round(rgba[2]/255 * 100);
-   return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")";
-}
-
-function hslString(hsla, alpha) {
-   if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {
-      return hslaString(hsla, alpha);
-   }
-   return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)";
-}
-
-function hslaString(hsla, alpha) {
-   if (alpha === undefined) {
-      alpha = (hsla[3] !== undefined ? hsla[3] : 1);
-   }
-   return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, "
-           + alpha + ")";
-}
-
-// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax
-// (hwb have alpha optional & 1 is default value)
-function hwbString(hwb, alpha) {
-   if (alpha === undefined) {
-      alpha = (hwb[3] !== undefined ? hwb[3] : 1);
-   }
-   return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%"
-           + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")";
-}
-
-function keyword(rgb) {
-  return reverseNames[rgb.slice(0, 3)];
-}
-
-// helpers
-function scale(num, min, max) {
-   return Math.min(Math.max(min, num), max);
-}
-
-function hexDouble(num) {
-  var str = num.toString(16).toUpperCase();
-  return (str.length < 2) ? "0" + str : str;
-}
-
-
-//create a list of reverse color names
-var reverseNames = {};
-for (var name in colorNames) {
-   reverseNames[colorNames[name]] = name;
-}
-
-},{"color-name":5}],5:[function(require,module,exports){
-module.exports = {\r
-       "aliceblue": [240, 248, 255],\r
-       "antiquewhite": [250, 235, 215],\r
-       "aqua": [0, 255, 255],\r
-       "aquamarine": [127, 255, 212],\r
-       "azure": [240, 255, 255],\r
-       "beige": [245, 245, 220],\r
-       "bisque": [255, 228, 196],\r
-       "black": [0, 0, 0],\r
-       "blanchedalmond": [255, 235, 205],\r
-       "blue": [0, 0, 255],\r
-       "blueviolet": [138, 43, 226],\r
-       "brown": [165, 42, 42],\r
-       "burlywood": [222, 184, 135],\r
-       "cadetblue": [95, 158, 160],\r
-       "chartreuse": [127, 255, 0],\r
-       "chocolate": [210, 105, 30],\r
-       "coral": [255, 127, 80],\r
-       "cornflowerblue": [100, 149, 237],\r
-       "cornsilk": [255, 248, 220],\r
-       "crimson": [220, 20, 60],\r
-       "cyan": [0, 255, 255],\r
-       "darkblue": [0, 0, 139],\r
-       "darkcyan": [0, 139, 139],\r
-       "darkgoldenrod": [184, 134, 11],\r
-       "darkgray": [169, 169, 169],\r
-       "darkgreen": [0, 100, 0],\r
-       "darkgrey": [169, 169, 169],\r
-       "darkkhaki": [189, 183, 107],\r
-       "darkmagenta": [139, 0, 139],\r
-       "darkolivegreen": [85, 107, 47],\r
-       "darkorange": [255, 140, 0],\r
-       "darkorchid": [153, 50, 204],\r
-       "darkred": [139, 0, 0],\r
-       "darksalmon": [233, 150, 122],\r
-       "darkseagreen": [143, 188, 143],\r
-       "darkslateblue": [72, 61, 139],\r
-       "darkslategray": [47, 79, 79],\r
-       "darkslategrey": [47, 79, 79],\r
-       "darkturquoise": [0, 206, 209],\r
-       "darkviolet": [148, 0, 211],\r
-       "deeppink": [255, 20, 147],\r
-       "deepskyblue": [0, 191, 255],\r
-       "dimgray": [105, 105, 105],\r
-       "dimgrey": [105, 105, 105],\r
-       "dodgerblue": [30, 144, 255],\r
-       "firebrick": [178, 34, 34],\r
-       "floralwhite": [255, 250, 240],\r
-       "forestgreen": [34, 139, 34],\r
-       "fuchsia": [255, 0, 255],\r
-       "gainsboro": [220, 220, 220],\r
-       "ghostwhite": [248, 248, 255],\r
-       "gold": [255, 215, 0],\r
-       "goldenrod": [218, 165, 32],\r
-       "gray": [128, 128, 128],\r
-       "green": [0, 128, 0],\r
-       "greenyellow": [173, 255, 47],\r
-       "grey": [128, 128, 128],\r
-       "honeydew": [240, 255, 240],\r
-       "hotpink": [255, 105, 180],\r
-       "indianred": [205, 92, 92],\r
-       "indigo": [75, 0, 130],\r
-       "ivory": [255, 255, 240],\r
-       "khaki": [240, 230, 140],\r
-       "lavender": [230, 230, 250],\r
-       "lavenderblush": [255, 240, 245],\r
-       "lawngreen": [124, 252, 0],\r
-       "lemonchiffon": [255, 250, 205],\r
-       "lightblue": [173, 216, 230],\r
-       "lightcoral": [240, 128, 128],\r
-       "lightcyan": [224, 255, 255],\r
-       "lightgoldenrodyellow": [250, 250, 210],\r
-       "lightgray": [211, 211, 211],\r
-       "lightgreen": [144, 238, 144],\r
-       "lightgrey": [211, 211, 211],\r
-       "lightpink": [255, 182, 193],\r
-       "lightsalmon": [255, 160, 122],\r
-       "lightseagreen": [32, 178, 170],\r
-       "lightskyblue": [135, 206, 250],\r
-       "lightslategray": [119, 136, 153],\r
-       "lightslategrey": [119, 136, 153],\r
-       "lightsteelblue": [176, 196, 222],\r
-       "lightyellow": [255, 255, 224],\r
-       "lime": [0, 255, 0],\r
-       "limegreen": [50, 205, 50],\r
-       "linen": [250, 240, 230],\r
-       "magenta": [255, 0, 255],\r
-       "maroon": [128, 0, 0],\r
-       "mediumaquamarine": [102, 205, 170],\r
-       "mediumblue": [0, 0, 205],\r
-       "mediumorchid": [186, 85, 211],\r
-       "mediumpurple": [147, 112, 219],\r
-       "mediumseagreen": [60, 179, 113],\r
-       "mediumslateblue": [123, 104, 238],\r
-       "mediumspringgreen": [0, 250, 154],\r
-       "mediumturquoise": [72, 209, 204],\r
-       "mediumvioletred": [199, 21, 133],\r
-       "midnightblue": [25, 25, 112],\r
-       "mintcream": [245, 255, 250],\r
-       "mistyrose": [255, 228, 225],\r
-       "moccasin": [255, 228, 181],\r
-       "navajowhite": [255, 222, 173],\r
-       "navy": [0, 0, 128],\r
-       "oldlace": [253, 245, 230],\r
-       "olive": [128, 128, 0],\r
-       "olivedrab": [107, 142, 35],\r
-       "orange": [255, 165, 0],\r
-       "orangered": [255, 69, 0],\r
-       "orchid": [218, 112, 214],\r
-       "palegoldenrod": [238, 232, 170],\r
-       "palegreen": [152, 251, 152],\r
-       "paleturquoise": [175, 238, 238],\r
-       "palevioletred": [219, 112, 147],\r
-       "papayawhip": [255, 239, 213],\r
-       "peachpuff": [255, 218, 185],\r
-       "peru": [205, 133, 63],\r
-       "pink": [255, 192, 203],\r
-       "plum": [221, 160, 221],\r
-       "powderblue": [176, 224, 230],\r
-       "purple": [128, 0, 128],\r
-       "rebeccapurple": [102, 51, 153],\r
-       "red": [255, 0, 0],\r
-       "rosybrown": [188, 143, 143],\r
-       "royalblue": [65, 105, 225],\r
-       "saddlebrown": [139, 69, 19],\r
-       "salmon": [250, 128, 114],\r
-       "sandybrown": [244, 164, 96],\r
-       "seagreen": [46, 139, 87],\r
-       "seashell": [255, 245, 238],\r
-       "sienna": [160, 82, 45],\r
-       "silver": [192, 192, 192],\r
-       "skyblue": [135, 206, 235],\r
-       "slateblue": [106, 90, 205],\r
-       "slategray": [112, 128, 144],\r
-       "slategrey": [112, 128, 144],\r
-       "snow": [255, 250, 250],\r
-       "springgreen": [0, 255, 127],\r
-       "steelblue": [70, 130, 180],\r
-       "tan": [210, 180, 140],\r
-       "teal": [0, 128, 128],\r
-       "thistle": [216, 191, 216],\r
-       "tomato": [255, 99, 71],\r
-       "turquoise": [64, 224, 208],\r
-       "violet": [238, 130, 238],\r
-       "wheat": [245, 222, 179],\r
-       "white": [255, 255, 255],\r
-       "whitesmoke": [245, 245, 245],\r
-       "yellow": [255, 255, 0],\r
-       "yellowgreen": [154, 205, 50]\r
-};
-},{}],6:[function(require,module,exports){
-/* MIT license */
-
-var convert = require("color-convert"),
-  string = require("color-string");
-
-var Color = function(obj) {
-  if (obj instanceof Color) return obj;
-  if (!(this instanceof Color)) return new Color(obj);
-
-  this.values = {
-    rgb: [0, 0, 0],
-    hsl: [0, 0, 0],
-    hsv: [0, 0, 0],
-    hwb: [0, 0, 0],
-    cmyk: [0, 0, 0, 0],
-    alpha: 1
-  }
-
-  // parse Color() argument
-  if (typeof obj == "string") {
-    var vals = string.getRgba(obj);
-    if (vals) {
-      this.setValues("rgb", vals);
-    } else if (vals = string.getHsla(obj)) {
-      this.setValues("hsl", vals);
-    } else if (vals = string.getHwb(obj)) {
-      this.setValues("hwb", vals);
-    } else {
-      throw new Error("Unable to parse color from string \"" + obj + "\"");
-    }
-  } else if (typeof obj == "object") {
-    var vals = obj;
-    if (vals["r"] !== undefined || vals["red"] !== undefined) {
-      this.setValues("rgb", vals)
-    } else if (vals["l"] !== undefined || vals["lightness"] !== undefined) {
-      this.setValues("hsl", vals)
-    } else if (vals["v"] !== undefined || vals["value"] !== undefined) {
-      this.setValues("hsv", vals)
-    } else if (vals["w"] !== undefined || vals["whiteness"] !== undefined) {
-      this.setValues("hwb", vals)
-    } else if (vals["c"] !== undefined || vals["cyan"] !== undefined) {
-      this.setValues("cmyk", vals)
-    } else {
-      throw new Error("Unable to parse color from object " + JSON.stringify(obj));
-    }
-  }
-}
-
-Color.prototype = {
-  rgb: function(vals) {
-    return this.setSpace("rgb", arguments);
-  },
-  hsl: function(vals) {
-    return this.setSpace("hsl", arguments);
-  },
-  hsv: function(vals) {
-    return this.setSpace("hsv", arguments);
-  },
-  hwb: function(vals) {
-    return this.setSpace("hwb", arguments);
-  },
-  cmyk: function(vals) {
-    return this.setSpace("cmyk", arguments);
-  },
-
-  rgbArray: function() {
-    return this.values.rgb;
-  },
-  hslArray: function() {
-    return this.values.hsl;
-  },
-  hsvArray: function() {
-    return this.values.hsv;
-  },
-  hwbArray: function() {
-    if (this.values.alpha !== 1) {
-      return this.values.hwb.concat([this.values.alpha])
-    }
-    return this.values.hwb;
-  },
-  cmykArray: function() {
-    return this.values.cmyk;
-  },
-  rgbaArray: function() {
-    var rgb = this.values.rgb;
-    return rgb.concat([this.values.alpha]);
-  },
-  hslaArray: function() {
-    var hsl = this.values.hsl;
-    return hsl.concat([this.values.alpha]);
-  },
-  alpha: function(val) {
-    if (val === undefined) {
-      return this.values.alpha;
-    }
-    this.setValues("alpha", val);
-    return this;
-  },
-
-  red: function(val) {
-    return this.setChannel("rgb", 0, val);
-  },
-  green: function(val) {
-    return this.setChannel("rgb", 1, val);
-  },
-  blue: function(val) {
-    return this.setChannel("rgb", 2, val);
-  },
-  hue: function(val) {
-    return this.setChannel("hsl", 0, val);
-  },
-  saturation: function(val) {
-    return this.setChannel("hsl", 1, val);
-  },
-  lightness: function(val) {
-    return this.setChannel("hsl", 2, val);
-  },
-  saturationv: function(val) {
-    return this.setChannel("hsv", 1, val);
-  },
-  whiteness: function(val) {
-    return this.setChannel("hwb", 1, val);
-  },
-  blackness: function(val) {
-    return this.setChannel("hwb", 2, val);
-  },
-  value: function(val) {
-    return this.setChannel("hsv", 2, val);
-  },
-  cyan: function(val) {
-    return this.setChannel("cmyk", 0, val);
-  },
-  magenta: function(val) {
-    return this.setChannel("cmyk", 1, val);
-  },
-  yellow: function(val) {
-    return this.setChannel("cmyk", 2, val);
-  },
-  black: function(val) {
-    return this.setChannel("cmyk", 3, val);
-  },
-
-  hexString: function() {
-    return string.hexString(this.values.rgb);
-  },
-  rgbString: function() {
-    return string.rgbString(this.values.rgb, this.values.alpha);
-  },
-  rgbaString: function() {
-    return string.rgbaString(this.values.rgb, this.values.alpha);
-  },
-  percentString: function() {
-    return string.percentString(this.values.rgb, this.values.alpha);
-  },
-  hslString: function() {
-    return string.hslString(this.values.hsl, this.values.alpha);
-  },
-  hslaString: function() {
-    return string.hslaString(this.values.hsl, this.values.alpha);
-  },
-  hwbString: function() {
-    return string.hwbString(this.values.hwb, this.values.alpha);
-  },
-  keyword: function() {
-    return string.keyword(this.values.rgb, this.values.alpha);
-  },
-
-  rgbNumber: function() {
-    return (this.values.rgb[0] << 16) | (this.values.rgb[1] << 8) | this.values.rgb[2];
-  },
-
-  luminosity: function() {
-    // http://www.w3.org/TR/WCAG20/#relativeluminancedef
-    var rgb = this.values.rgb;
-    var lum = [];
-    for (var i = 0; i < rgb.length; i++) {
-      var chan = rgb[i] / 255;
-      lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4)
-    }
-    return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
-  },
-
-  contrast: function(color2) {
-    // http://www.w3.org/TR/WCAG20/#contrast-ratiodef
-    var lum1 = this.luminosity();
-    var lum2 = color2.luminosity();
-    if (lum1 > lum2) {
-      return (lum1 + 0.05) / (lum2 + 0.05)
-    };
-    return (lum2 + 0.05) / (lum1 + 0.05);
-  },
-
-  level: function(color2) {
-    var contrastRatio = this.contrast(color2);
-    return (contrastRatio >= 7.1) ? 'AAA' : (contrastRatio >= 4.5) ? 'AA' : '';
-  },
-
-  dark: function() {
-    // YIQ equation from http://24ways.org/2010/calculating-color-contrast
-    var rgb = this.values.rgb,
-      yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;
-    return yiq < 128;
-  },
-
-  light: function() {
-    return !this.dark();
-  },
-
-  negate: function() {
-    var rgb = []
-    for (var i = 0; i < 3; i++) {
-      rgb[i] = 255 - this.values.rgb[i];
-    }
-    this.setValues("rgb", rgb);
-    return this;
-  },
-
-  lighten: function(ratio) {
-    this.values.hsl[2] += this.values.hsl[2] * ratio;
-    this.setValues("hsl", this.values.hsl);
-    return this;
-  },
-
-  darken: function(ratio) {
-    this.values.hsl[2] -= this.values.hsl[2] * ratio;
-    this.setValues("hsl", this.values.hsl);
-    return this;
-  },
-
-  saturate: function(ratio) {
-    this.values.hsl[1] += this.values.hsl[1] * ratio;
-    this.setValues("hsl", this.values.hsl);
-    return this;
-  },
-
-  desaturate: function(ratio) {
-    this.values.hsl[1] -= this.values.hsl[1] * ratio;
-    this.setValues("hsl", this.values.hsl);
-    return this;
-  },
-
-  whiten: function(ratio) {
-    this.values.hwb[1] += this.values.hwb[1] * ratio;
-    this.setValues("hwb", this.values.hwb);
-    return this;
-  },
-
-  blacken: function(ratio) {
-    this.values.hwb[2] += this.values.hwb[2] * ratio;
-    this.setValues("hwb", this.values.hwb);
-    return this;
-  },
-
-  greyscale: function() {
-    var rgb = this.values.rgb;
-    // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
-    var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
-    this.setValues("rgb", [val, val, val]);
-    return this;
-  },
-
-  clearer: function(ratio) {
-    this.setValues("alpha", this.values.alpha - (this.values.alpha * ratio));
-    return this;
-  },
-
-  opaquer: function(ratio) {
-    this.setValues("alpha", this.values.alpha + (this.values.alpha * ratio));
-    return this;
-  },
-
-  rotate: function(degrees) {
-    var hue = this.values.hsl[0];
-    hue = (hue + degrees) % 360;
-    hue = hue < 0 ? 360 + hue : hue;
-    this.values.hsl[0] = hue;
-    this.setValues("hsl", this.values.hsl);
-    return this;
-  },
-
-  mix: function(color2, weight) {
-    weight = 1 - (weight == null ? 0.5 : weight);
-
-    // algorithm from Sass's mix(). Ratio of first color in mix is
-    // determined by the alphas of both colors and the weight
-    var t1 = weight * 2 - 1,
-      d = this.alpha() - color2.alpha();
-
-    var weight1 = (((t1 * d == -1) ? t1 : (t1 + d) / (1 + t1 * d)) + 1) / 2;
-    var weight2 = 1 - weight1;
-
-    var rgb = this.rgbArray();
-    var rgb2 = color2.rgbArray();
-
-    for (var i = 0; i < rgb.length; i++) {
-      rgb[i] = rgb[i] * weight1 + rgb2[i] * weight2;
-    }
-    this.setValues("rgb", rgb);
-
-    var alpha = this.alpha() * weight + color2.alpha() * (1 - weight);
-    this.setValues("alpha", alpha);
-
-    return this;
-  },
-
-  toJSON: function() {
-    return this.rgb();
-  },
-
-  clone: function() {
-    return new Color(this.rgb());
-  }
-}
-
-
-Color.prototype.getValues = function(space) {
-  var vals = {};
-  for (var i = 0; i < space.length; i++) {
-    vals[space.charAt(i)] = this.values[space][i];
-  }
-  if (this.values.alpha != 1) {
-    vals["a"] = this.values.alpha;
-  }
-  // {r: 255, g: 255, b: 255, a: 0.4}
-  return vals;
-}
-
-Color.prototype.setValues = function(space, vals) {
-  var spaces = {
-    "rgb": ["red", "green", "blue"],
-    "hsl": ["hue", "saturation", "lightness"],
-    "hsv": ["hue", "saturation", "value"],
-    "hwb": ["hue", "whiteness", "blackness"],
-    "cmyk": ["cyan", "magenta", "yellow", "black"]
-  };
-
-  var maxes = {
-    "rgb": [255, 255, 255],
-    "hsl": [360, 100, 100],
-    "hsv": [360, 100, 100],
-    "hwb": [360, 100, 100],
-    "cmyk": [100, 100, 100, 100]
-  };
-
-  var alpha = 1;
-  if (space == "alpha") {
-    alpha = vals;
-  } else if (vals.length) {
-    // [10, 10, 10]
-    this.values[space] = vals.slice(0, space.length);
-    alpha = vals[space.length];
-  } else if (vals[space.charAt(0)] !== undefined) {
-    // {r: 10, g: 10, b: 10}
-    for (var i = 0; i < space.length; i++) {
-      this.values[space][i] = vals[space.charAt(i)];
-    }
-    alpha = vals.a;
-  } else if (vals[spaces[space][0]] !== undefined) {
-    // {red: 10, green: 10, blue: 10}
-    var chans = spaces[space];
-    for (var i = 0; i < space.length; i++) {
-      this.values[space][i] = vals[chans[i]];
-    }
-    alpha = vals.alpha;
-  }
-  this.values.alpha = Math.max(0, Math.min(1, (alpha !== undefined ? alpha : this.values.alpha)));
-  if (space == "alpha") {
-    return;
-  }
-
-  // cap values of the space prior converting all values
-  for (var i = 0; i < space.length; i++) {
-    var capped = Math.max(0, Math.min(maxes[space][i], this.values[space][i]));
-    this.values[space][i] = Math.round(capped);
-  }
-
-  // convert to all the other color spaces
-  for (var sname in spaces) {
-    if (sname != space) {
-      this.values[sname] = convert[space][sname](this.values[space])
-    }
-
-    // cap values
-    for (var i = 0; i < sname.length; i++) {
-      var capped = Math.max(0, Math.min(maxes[sname][i], this.values[sname][i]));
-      this.values[sname][i] = Math.round(capped);
-    }
-  }
-  return true;
-}
-
-Color.prototype.setSpace = function(space, args) {
-  var vals = args[0];
-  if (vals === undefined) {
-    // color.rgb()
-    return this.getValues(space);
-  }
-  // color.rgb(10, 10, 10)
-  if (typeof vals == "number") {
-    vals = Array.prototype.slice.call(args);
-  }
-  this.setValues(space, vals);
-  return this;
-}
-
-Color.prototype.setChannel = function(space, index, val) {
-  if (val === undefined) {
-    // color.red()
-    return this.values[space][index];
-  }
-  // color.red(100)
-  this.values[space][index] = val;
-  this.setValues(space, this.values[space]);
-  return this;
-}
-
-window.Color = module.exports = Color
-
-},{"color-convert":3,"color-string":4}],7:[function(require,module,exports){
-/*!
- * Chart.js
- * http://chartjs.org/
- * Version: 2.0.2
- *
- * Copyright 2015 Nick Downie
- * Released under the MIT license
- * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md
- */
-
-
-var Chart = require('./core/core.js')();
-
-require('./core/core.helpers')(Chart);
-require('./core/core.element')(Chart);
-require('./core/core.animation')(Chart);
-require('./core/core.controller')(Chart);
-require('./core/core.datasetController')(Chart);
-require('./core/core.layoutService')(Chart);
-require('./core/core.legend')(Chart);
-require('./core/core.scale')(Chart);
-require('./core/core.scaleService')(Chart);
-require('./core/core.title')(Chart);
-require('./core/core.tooltip')(Chart);
-
-require('./controllers/controller.bar')(Chart);
-require('./controllers/controller.bubble')(Chart);
-require('./controllers/controller.doughnut')(Chart);
-require('./controllers/controller.line')(Chart);
-require('./controllers/controller.polarArea')(Chart);
-require('./controllers/controller.radar')(Chart);
-
-require('./scales/scale.category')(Chart);
-require('./scales/scale.linear')(Chart);
-require('./scales/scale.logarithmic')(Chart);
-require('./scales/scale.radialLinear')(Chart);
-require('./scales/scale.time')(Chart);
-
-require('./elements/element.arc')(Chart);
-require('./elements/element.line')(Chart);
-require('./elements/element.point')(Chart);
-require('./elements/element.rectangle')(Chart);
-
-require('./charts/Chart.Bar')(Chart);
-require('./charts/Chart.Bubble')(Chart);
-require('./charts/Chart.Doughnut')(Chart);
-require('./charts/Chart.Line')(Chart);
-require('./charts/Chart.PolarArea')(Chart);
-require('./charts/Chart.Radar')(Chart);
-require('./charts/Chart.Scatter')(Chart);
-
-window.Chart = module.exports = Chart;
-
-},{"./charts/Chart.Bar":8,"./charts/Chart.Bubble":9,"./charts/Chart.Doughnut":10,"./charts/Chart.Line":11,"./charts/Chart.PolarArea":12,"./charts/Chart.Radar":13,"./charts/Chart.Scatter":14,"./controllers/controller.bar":15,"./controllers/controller.bubble":16,"./controllers/controller.doughnut":17,"./controllers/controller.line":18,"./controllers/controller.polarArea":19,"./controllers/controller.radar":20,"./core/core.animation":21,"./core/core.controller":22,"./core/core.datasetController":23,"./core/core.element":24,"./core/core.helpers":25,"./core/core.js":26,"./core/core.layoutService":27,"./core/core.legend":28,"./core/core.scale":29,"./core/core.scaleService":30,"./core/core.title":31,"./core/core.tooltip":32,"./elements/element.arc":33,"./elements/element.line":34,"./elements/element.point":35,"./elements/element.rectangle":36,"./scales/scale.category":37,"./scales/scale.linear":38,"./scales/scale.logarithmic":39,"./scales/scale.radialLinear":40,"./scales/scale.time":41}],8:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       Chart.Bar = function(context, config) {
-               config.type = 'bar';
-
-               return new Chart(context, config);
-       };
-
-};
-},{}],9:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       Chart.Bubble = function(context, config) {
-               config.type = 'bubble';
-               return new Chart(context, config);
-       };
-
-};
-},{}],10:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       Chart.Doughnut = function(context, config) {
-               config.type = 'doughnut';
-
-               return new Chart(context, config);
-       };
-
-};
-},{}],11:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       Chart.Line = function(context, config) {
-               config.type = 'line';
-
-               return new Chart(context, config);
-       };
-
-};
-},{}],12:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       Chart.PolarArea = function(context, config) {
-               config.type = 'polarArea';
-
-               return new Chart(context, config);
-       };
-
-};
-},{}],13:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       var defaultConfig = {
-               aspectRatio: 1
-       };
-
-       Chart.Radar = function(context, config) {
-               config.options = helpers.configMerge(defaultConfig, config.options);
-               config.type = 'radar';
-
-               return new Chart(context, config);
-       };
-
-};
-
-},{}],14:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var defaultConfig = {
-               hover: {
-                       mode: 'single'
-               },
-
-               scales: {
-                       xAxes: [{
-                               type: "linear", // scatter should not use a category axis
-                               position: "bottom",
-                               id: "x-axis-1" // need an ID so datasets can reference the scale
-                       }],
-                       yAxes: [{
-                               type: "linear",
-                               position: "left",
-                               id: "y-axis-1"
-                       }]
-               },
-
-               tooltips: {
-                       callbacks: {
-                               title: function(tooltipItems, data) {
-                                       // Title doesn't make sense for scatter since we format the data as a point
-                                       return '';
-                               },
-                               label: function(tooltipItem, data) {
-                                       return '(' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ')';
-                               }
-                       }
-               }
-       };
-
-       // Register the default config for this type
-       Chart.defaults.scatter = defaultConfig;
-
-       // Scatter charts use line controllers
-       Chart.controllers.scatter = Chart.controllers.line;
-
-       Chart.Scatter = function(context, config) {
-               config.type = 'scatter';
-               return new Chart(context, config);
-       };
-
-};
-},{}],15:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.bar = {
-               hover: {
-                       mode: "label"
-               },
-
-               scales: {
-                       xAxes: [{
-                               type: "category",
-
-                               // Specific to Bar Controller
-                               categoryPercentage: 0.8,
-                               barPercentage: 0.9,
-
-                               // grid line settings
-                               gridLines: {
-                                       offsetGridLines: true
-                               }
-                       }],
-                       yAxes: [{
-                               type: "linear"
-                       }]
-               }
-       };
-
-       Chart.controllers.bar = Chart.DatasetController.extend({
-               initialize: function(chart, datasetIndex) {
-                       Chart.DatasetController.prototype.initialize.call(this, chart, datasetIndex);
-
-                       // Use this to indicate that this is a bar dataset.
-                       this.getDataset().bar = true;
-               },
-               // Get the number of datasets that display bars. We use this to correctly calculate the bar width
-               getBarCount: function getBarCount() {
-                       var barCount = 0;
-                       helpers.each(this.chart.data.datasets, function(dataset) {
-                               if (helpers.isDatasetVisible(dataset) && dataset.bar) {
-                                       ++barCount;
-                               }
-                       });
-                       return barCount;
-               },
-
-               addElements: function() {
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-                       helpers.each(this.getDataset().data, function(value, index) {
-                               this.getDataset().metaData[index] = this.getDataset().metaData[index] || new Chart.elements.Rectangle({
-                                       _chart: this.chart.chart,
-                                       _datasetIndex: this.index,
-                                       _index: index
-                               });
-                       }, this);
-               },
-               addElementAndReset: function(index) {
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-                       var rectangle = new Chart.elements.Rectangle({
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _index: index
-                       });
-
-                       var numBars = this.getBarCount();
-
-                       this.updateElement(rectangle, index, true, numBars);
-                       this.getDataset().metaData.splice(index, 0, rectangle);
-               },
-
-               update: function update(reset) {
-                       var numBars = this.getBarCount();
-
-                       helpers.each(this.getDataset().metaData, function(rectangle, index) {
-                               this.updateElement(rectangle, index, reset, numBars);
-                       }, this);
-               },
-
-               updateElement: function updateElement(rectangle, index, reset, numBars) {
-
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-
-                       var yScalePoint;
-
-                       if (yScale.min < 0 && yScale.max < 0) {
-                               // all less than 0. use the top
-                               yScalePoint = yScale.getPixelForValue(yScale.max);
-                       } else if (yScale.min > 0 && yScale.max > 0) {
-                               yScalePoint = yScale.getPixelForValue(yScale.min);
-                       } else {
-                               yScalePoint = yScale.getPixelForValue(0);
-                       }
-
-                       helpers.extend(rectangle, {
-                               // Utility
-                               _chart: this.chart.chart,
-                               _xScale: xScale,
-                               _yScale: yScale,
-                               _datasetIndex: this.index,
-                               _index: index,
-
-
-                               // Desired view properties
-                               _model: {
-                                       x: this.calculateBarX(index, this.index),
-                                       y: reset ? yScalePoint : this.calculateBarY(index, this.index),
-
-                                       // Tooltip
-                                       label: this.chart.data.labels[index],
-                                       datasetLabel: this.getDataset().label,
-
-                                       // Appearance
-                                       base: reset ? yScalePoint : this.calculateBarBase(this.index, index),
-                                       width: this.calculateBarWidth(numBars),
-                                       backgroundColor: rectangle.custom && rectangle.custom.backgroundColor ? rectangle.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.rectangle.backgroundColor),
-                                       borderSkipped: rectangle.custom && rectangle.custom.borderSkipped ? rectangle.custom.borderSkipped : this.chart.options.elements.rectangle.borderSkipped,
-                                       borderColor: rectangle.custom && rectangle.custom.borderColor ? rectangle.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.rectangle.borderColor),
-                                       borderWidth: rectangle.custom && rectangle.custom.borderWidth ? rectangle.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.rectangle.borderWidth)
-                               }
-                       });
-                       rectangle.pivot();
-               },
-
-               calculateBarBase: function(datasetIndex, index) {
-
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-
-                       var base = 0;
-
-                       if (yScale.options.stacked) {
-
-                               var value = this.chart.data.datasets[datasetIndex].data[index];
-
-                               if (value < 0) {
-                                       for (var i = 0; i < datasetIndex; i++) {
-                                               var negDS = this.chart.data.datasets[i];
-                                               if (helpers.isDatasetVisible(negDS) && negDS.yAxisID === yScale.id && negDS.bar) {
-                                                       base += negDS.data[index] < 0 ? negDS.data[index] : 0;
-                                               }
-                                       }
-                               } else {
-                                       for (var j = 0; j < datasetIndex; j++) {
-                                               var posDS = this.chart.data.datasets[j];
-                                               if (helpers.isDatasetVisible(posDS) && posDS.yAxisID === yScale.id && posDS.bar) {
-                                                       base += posDS.data[index] > 0 ? posDS.data[index] : 0;
-                                               }
-                                       }
-                               }
-
-                               return yScale.getPixelForValue(base);
-                       }
-
-                       base = yScale.getPixelForValue(yScale.min);
-
-                       if (yScale.beginAtZero || ((yScale.min <= 0 && yScale.max >= 0) || (yScale.min >= 0 && yScale.max <= 0))) {
-                               base = yScale.getPixelForValue(0, 0);
-                               //base += yScale.options.gridLines.lineWidth;
-                       } else if (yScale.min < 0 && yScale.max < 0) {
-                               // All values are negative. Use the top as the base
-                               base = yScale.getPixelForValue(yScale.max);
-                       }
-
-                       return base;
-
-               },
-
-               getRuler: function() {
-
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-                       var datasetCount = this.getBarCount();
-
-                       var tickWidth = (function() {
-                               var min = xScale.getPixelForTick(1) - xScale.getPixelForTick(0);
-                               for (var i = 2; i < this.getDataset().data.length; i++) {
-                                       min = Math.min(xScale.getPixelForTick(i) - xScale.getPixelForTick(i - 1), min);
-                               }
-                               return min;
-                       }).call(this);
-                       var categoryWidth = tickWidth * xScale.options.categoryPercentage;
-                       var categorySpacing = (tickWidth - (tickWidth * xScale.options.categoryPercentage)) / 2;
-                       var fullBarWidth = categoryWidth / datasetCount;
-                       var barWidth = fullBarWidth * xScale.options.barPercentage;
-                       var barSpacing = fullBarWidth - (fullBarWidth * xScale.options.barPercentage);
-
-                       return {
-                               datasetCount: datasetCount,
-                               tickWidth: tickWidth,
-                               categoryWidth: categoryWidth,
-                               categorySpacing: categorySpacing,
-                               fullBarWidth: fullBarWidth,
-                               barWidth: barWidth,
-                               barSpacing: barSpacing
-                       };
-               },
-
-               calculateBarWidth: function() {
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var ruler = this.getRuler();
-                       return xScale.options.stacked ? ruler.categoryWidth : ruler.barWidth;
-               },
-
-               // Get bar index from the given dataset index accounting for the fact that not all bars are visible
-               getBarIndex: function(datasetIndex) {
-                       var barIndex = 0;
-
-                       for (var j = 0; j < datasetIndex; ++j) {
-                               if (helpers.isDatasetVisible(this.chart.data.datasets[j]) && this.chart.data.datasets[j].bar) {
-                                       ++barIndex;
-                               }
-                       }
-
-                       return barIndex;
-               },
-
-               calculateBarX: function(index, datasetIndex) {
-
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var barIndex = this.getBarIndex(datasetIndex);
-
-                       var ruler = this.getRuler();
-                       var leftTick = xScale.getPixelForValue(null, index, datasetIndex, this.chart.isCombo);
-                       leftTick -= this.chart.isCombo ? (ruler.tickWidth / 2) : 0;
-
-                       if (xScale.options.stacked) {
-                               return leftTick + (ruler.categoryWidth / 2) + ruler.categorySpacing;
-                       }
-
-                       return leftTick +
-                               (ruler.barWidth / 2) +
-                               ruler.categorySpacing +
-                               (ruler.barWidth * barIndex) +
-                               (ruler.barSpacing / 2) +
-                               (ruler.barSpacing * barIndex);
-               },
-
-               calculateBarY: function(index, datasetIndex) {
-
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-
-                       var value = this.getDataset().data[index];
-
-                       if (yScale.options.stacked) {
-
-                               var sumPos = 0,
-                                       sumNeg = 0;
-
-                               for (var i = 0; i < datasetIndex; i++) {
-                                       var ds = this.chart.data.datasets[i];
-                                       if (helpers.isDatasetVisible(ds) && ds.bar && ds.yAxisID === yScale.id) {
-                                               if (ds.data[index] < 0) {
-                                                       sumNeg += ds.data[index] || 0;
-                                               } else {
-                                                       sumPos += ds.data[index] || 0;
-                                               }
-                                       }
-                               }
-
-                               if (value < 0) {
-                                       return yScale.getPixelForValue(sumNeg + value);
-                               } else {
-                                       return yScale.getPixelForValue(sumPos + value);
-                               }
-
-                               return yScale.getPixelForValue(value);
-                       }
-
-                       return yScale.getPixelForValue(value);
-               },
-
-               draw: function(ease) {
-                       var easingDecimal = ease || 1;
-                       helpers.each(this.getDataset().metaData, function(rectangle, index) {
-                               var d = this.getDataset().data[index];
-                               if (d !== null && d !== undefined && !isNaN(d)) {
-                                       rectangle.transition(easingDecimal).draw();
-                               }
-                       }, this);
-               },
-
-               setHoverStyle: function(rectangle) {
-                       var dataset = this.chart.data.datasets[rectangle._datasetIndex];
-                       var index = rectangle._index;
-
-                       rectangle._model.backgroundColor = rectangle.custom && rectangle.custom.hoverBackgroundColor ? rectangle.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.color(rectangle._model.backgroundColor).saturate(0.5).darken(0.1).rgbString());
-                       rectangle._model.borderColor = rectangle.custom && rectangle.custom.hoverBorderColor ? rectangle.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.color(rectangle._model.borderColor).saturate(0.5).darken(0.1).rgbString());
-                       rectangle._model.borderWidth = rectangle.custom && rectangle.custom.hoverBorderWidth ? rectangle.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, rectangle._model.borderWidth);
-               },
-
-               removeHoverStyle: function(rectangle) {
-                       var dataset = this.chart.data.datasets[rectangle._datasetIndex];
-                       var index = rectangle._index;
-
-                       rectangle._model.backgroundColor = rectangle.custom && rectangle.custom.backgroundColor ? rectangle.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.rectangle.backgroundColor);
-                       rectangle._model.borderColor = rectangle.custom && rectangle.custom.borderColor ? rectangle.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.rectangle.borderColor);
-                       rectangle._model.borderWidth = rectangle.custom && rectangle.custom.borderWidth ? rectangle.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.rectangle.borderWidth);
-               }
-
-       });
-};
-
-},{}],16:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.bubble = {
-               hover: {
-                       mode: "single"
-               },
-
-               scales: {
-                       xAxes: [{
-                               type: "linear", // bubble should probably use a linear scale by default
-                               position: "bottom",
-                               id: "x-axis-0" // need an ID so datasets can reference the scale
-                       }],
-                       yAxes: [{
-                               type: "linear",
-                               position: "left",
-                               id: "y-axis-0"
-                       }]
-               },
-
-               tooltips: {
-                       callbacks: {
-                               title: function(tooltipItems, data) {
-                                       // Title doesn't make sense for scatter since we format the data as a point
-                                       return '';
-                               },
-                               label: function(tooltipItem, data) {
-                                       var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';
-                                       var dataPoint = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
-                                       return datasetLabel + ': (' + dataPoint.x + ', ' + dataPoint.y + ', ' + dataPoint.r + ')';
-                               }
-                       }
-               }
-       };
-
-
-       Chart.controllers.bubble = Chart.DatasetController.extend({
-               addElements: function() {
-
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-
-                       helpers.each(this.getDataset().data, function(value, index) {
-                               this.getDataset().metaData[index] = this.getDataset().metaData[index] || new Chart.elements.Point({
-                                       _chart: this.chart.chart,
-                                       _datasetIndex: this.index,
-                                       _index: index
-                               });
-                       }, this);
-               },
-               addElementAndReset: function(index) {
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-                       var point = new Chart.elements.Point({
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _index: index
-                       });
-
-                       // Reset the point
-                       this.updateElement(point, index, true);
-
-                       // Add to the points array
-                       this.getDataset().metaData.splice(index, 0, point);
-               },
-
-               update: function update(reset) {
-                       var points = this.getDataset().metaData;
-
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var scaleBase;
-
-                       if (yScale.min < 0 && yScale.max < 0) {
-                               scaleBase = yScale.getPixelForValue(yScale.max);
-                       } else if (yScale.min > 0 && yScale.max > 0) {
-                               scaleBase = yScale.getPixelForValue(yScale.min);
-                       } else {
-                               scaleBase = yScale.getPixelForValue(0);
-                       }
-
-                       // Update Points
-                       helpers.each(points, function(point, index) {
-                               this.updateElement(point, index, reset);
-                       }, this);
-
-               },
-
-               updateElement: function(point, index, reset) {
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var scaleBase;
-
-                       if (yScale.min < 0 && yScale.max < 0) {
-                               scaleBase = yScale.getPixelForValue(yScale.max);
-                       } else if (yScale.min > 0 && yScale.max > 0) {
-                               scaleBase = yScale.getPixelForValue(yScale.min);
-                       } else {
-                               scaleBase = yScale.getPixelForValue(0);
-                       }
-
-                       helpers.extend(point, {
-                               // Utility
-                               _chart: this.chart.chart,
-                               _xScale: xScale,
-                               _yScale: yScale,
-                               _datasetIndex: this.index,
-                               _index: index,
-
-                               // Desired view properties
-                               _model: {
-                                       x: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(this.getDataset().data[index], index, this.index, this.chart.isCombo),
-                                       y: reset ? scaleBase : yScale.getPixelForValue(this.getDataset().data[index], index, this.index),
-                                       // Appearance
-                                       radius: reset ? 0 : point.custom && point.custom.radius ? point.custom.radius : this.getRadius(this.getDataset().data[index]),
-                                       backgroundColor: point.custom && point.custom.backgroundColor ? point.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.point.backgroundColor),
-                                       borderColor: point.custom && point.custom.borderColor ? point.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.point.borderColor),
-                                       borderWidth: point.custom && point.custom.borderWidth ? point.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.point.borderWidth),
-
-                                       // Tooltip
-                                       hitRadius: point.custom && point.custom.hitRadius ? point.custom.hitRadius : helpers.getValueAtIndexOrDefault(this.getDataset().hitRadius, index, this.chart.options.elements.point.hitRadius)
-                               }
-                       });
-
-                       point._model.skip = point.custom && point.custom.skip ? point.custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));
-
-                       point.pivot();
-               },
-
-               getRadius: function(value) {
-                       return value.r || this.chart.options.elements.point.radius;
-               },
-
-               draw: function(ease) {
-                       var easingDecimal = ease || 1;
-
-                       // Transition and Draw the Points
-                       helpers.each(this.getDataset().metaData, function(point, index) {
-                               point.transition(easingDecimal);
-                               point.draw();
-                       });
-
-               },
-
-               setHoverStyle: function(point) {
-                       // Point
-                       var dataset = this.chart.data.datasets[point._datasetIndex];
-                       var index = point._index;
-
-                       point._model.radius = point.custom && point.custom.hoverRadius ? point.custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, this.chart.options.elements.point.hoverRadius)) + this.getRadius(this.getDataset().data[point._index]);
-                       point._model.backgroundColor = point.custom && point.custom.hoverBackgroundColor ? point.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.color(point._model.backgroundColor).saturate(0.5).darken(0.1).rgbString());
-                       point._model.borderColor = point.custom && point.custom.hoverBorderColor ? point.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.color(point._model.borderColor).saturate(0.5).darken(0.1).rgbString());
-                       point._model.borderWidth = point.custom && point.custom.hoverBorderWidth ? point.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, point._model.borderWidth);
-               },
-
-               removeHoverStyle: function(point) {
-                       var dataset = this.chart.data.datasets[point._datasetIndex];
-                       var index = point._index;
-
-                       point._model.radius = point.custom && point.custom.radius ? point.custom.radius : this.getRadius(this.getDataset().data[point._index]);
-                       point._model.backgroundColor = point.custom && point.custom.backgroundColor ? point.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.point.backgroundColor);
-                       point._model.borderColor = point.custom && point.custom.borderColor ? point.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.point.borderColor);
-                       point._model.borderWidth = point.custom && point.custom.borderWidth ? point.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.point.borderWidth);
-               }
-       });
-};
-},{}],17:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.doughnut = {
-               animation: {
-                       //Boolean - Whether we animate the rotation of the Doughnut
-                       animateRotate: true,
-                       //Boolean - Whether we animate scaling the Doughnut from the centre
-                       animateScale: false
-               },
-               aspectRatio: 1,
-               hover: {
-                       mode: 'single'
-               },
-               legendCallback: function(chart) {
-                       var text = [];
-                       text.push('<ul class="' + chart.id + '-legend">');
-
-                       if (chart.data.datasets.length) {
-                               for (var i = 0; i < chart.data.datasets[0].data.length; ++i) {
-                                       text.push('<li><span style="background-color:' + chart.data.datasets[0].backgroundColor[i] + '">');
-                                       if (chart.data.labels[i]) {
-                                               text.push(chart.data.labels[i]);
-                                       }
-                                       text.push('</span></li>');
-                               }
-                       }
-
-                       text.push('</ul>');
-                       return text.join("");
-               },
-               legend: {
-                       labels: {
-                               generateLabels: function(data) {
-                                       if (data.labels.length && data.datasets.length) {
-                                               return data.labels.map(function(label, i) {
-                                                       return {
-                                                               text: label,
-                                                               fillStyle: data.datasets[0].backgroundColor[i],
-                                                               hidden: isNaN(data.datasets[0].data[i]),
-
-                                                               // Extra data used for toggling the correct item
-                                                               index: i
-                                                       };
-                                               });
-                                       } else {
-                                               return [];
-                                       }
-                               }
-                       },
-                       onClick: function(e, legendItem) {
-                               helpers.each(this.chart.data.datasets, function(dataset) {
-                                       dataset.metaHiddenData = dataset.metaHiddenData || [];
-                                       var idx = legendItem.index;
-
-                                       if (!isNaN(dataset.data[idx])) {
-                                               dataset.metaHiddenData[idx] = dataset.data[idx];
-                                               dataset.data[idx] = NaN;
-                                       } else if (!isNaN(dataset.metaHiddenData[idx])) {
-                                               dataset.data[idx] = dataset.metaHiddenData[idx];
-                                       }
-                               });
-
-                               this.chart.update();
-                       }
-               },
-
-               //The percentage of the chart that we cut out of the middle.
-               cutoutPercentage: 50,
-
-               //The rotation of the chart, where the first data arc begins.
-               rotation: Math.PI * -0.5,
-
-               //The total circumference of the chart.
-               circumference: Math.PI * 2.0,
-
-               // Need to override these to give a nice default
-               tooltips: {
-                       callbacks: {
-                               title: function() {
-                                       return '';
-                               },
-                               label: function(tooltipItem, data) {
-                                       return data.labels[tooltipItem.index] + ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
-                               }
-                       }
-               }
-       };
-
-       Chart.defaults.pie = helpers.clone(Chart.defaults.doughnut);
-       helpers.extend(Chart.defaults.pie, {
-               cutoutPercentage: 0
-       });
-
-
-       Chart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({
-               linkScales: function() {
-                       // no scales for doughnut
-               },
-
-               addElements: function() {
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-                       helpers.each(this.getDataset().data, function(value, index) {
-                               this.getDataset().metaData[index] = this.getDataset().metaData[index] || new Chart.elements.Arc({
-                                       _chart: this.chart.chart,
-                                       _datasetIndex: this.index,
-                                       _index: index
-                               });
-                       }, this);
-               },
-               addElementAndReset: function(index, colorForNewElement) {
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-                       var arc = new Chart.elements.Arc({
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _index: index
-                       });
-
-                       if (colorForNewElement && helpers.isArray(this.getDataset().backgroundColor)) {
-                               this.getDataset().backgroundColor.splice(index, 0, colorForNewElement);
-                       }
-
-                       // Reset the point
-                       this.updateElement(arc, index, true);
-
-                       // Add to the points array
-                       this.getDataset().metaData.splice(index, 0, arc);
-               },
-
-               getVisibleDatasetCount: function getVisibleDatasetCount() {
-                       return helpers.where(this.chart.data.datasets, function(ds) {
-                               return helpers.isDatasetVisible(ds);
-                       }).length;
-               },
-
-               // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly
-               getRingIndex: function getRingIndex(datasetIndex) {
-                       var ringIndex = 0;
-
-                       for (var j = 0; j < datasetIndex; ++j) {
-                               if (helpers.isDatasetVisible(this.chart.data.datasets[j])) {
-                                       ++ringIndex;
-                               }
-                       }
-
-                       return ringIndex;
-               },
-
-               update: function update(reset) {
-                       var availableWidth = this.chart.chartArea.right - this.chart.chartArea.left - this.chart.options.elements.arc.borderWidth;
-                       var availableHeight = this.chart.chartArea.bottom - this.chart.chartArea.top - this.chart.options.elements.arc.borderWidth;
-                       var minSize = Math.min(availableWidth, availableHeight);
-                       var offset = {x: 0, y: 0};
-
-                       // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc
-                       if (this.chart.options.circumference && this.chart.options.circumference < Math.PI * 2.0) {
-                               var startAngle = this.chart.options.rotation % (Math.PI * 2.0);
-                               startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);
-                               var endAngle = startAngle + this.chart.options.circumference;
-                               var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};
-                               var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};
-                               var contains0 = (startAngle <= 0 && 0 <= endAngle) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);
-                               var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);
-                               var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);
-                               var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);
-                               var cutout = this.chart.options.cutoutPercentage / 100.0;
-                               var min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};
-                               var max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};
-                               var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};
-                               minSize = Math.min(availableWidth / size.width, availableHeight / size.height);
-                               offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};
-                       }
-
-                       this.chart.outerRadius = Math.max(minSize / 2, 0);
-                       this.chart.innerRadius = Math.max(this.chart.options.cutoutPercentage ? (this.chart.outerRadius / 100) * (this.chart.options.cutoutPercentage) : 1, 0);
-                       this.chart.radiusLength = (this.chart.outerRadius - this.chart.innerRadius) / this.getVisibleDatasetCount();
-                       this.chart.offsetX = offset.x * this.chart.outerRadius;
-                       this.chart.offsetY = offset.y * this.chart.outerRadius;
-
-                       this.getDataset().total = 0;
-                       helpers.each(this.getDataset().data, function(value) {
-                               if (!isNaN(value)) {
-                                       this.getDataset().total += Math.abs(value);
-                               }
-                       }, this);
-
-                       this.outerRadius = this.chart.outerRadius - (this.chart.radiusLength * this.getRingIndex(this.index));
-                       this.innerRadius = this.outerRadius - this.chart.radiusLength;
-
-                       helpers.each(this.getDataset().metaData, function(arc, index) {
-                               this.updateElement(arc, index, reset);
-                       }, this);
-               },
-               updateElement: function(arc, index, reset) {
-                       var centerX = (this.chart.chartArea.left + this.chart.chartArea.right) / 2;
-                       var centerY = (this.chart.chartArea.top + this.chart.chartArea.bottom) / 2;
-                       var startAngle = this.chart.options.rotation || (Math.PI * -0.5); // non reset case handled later
-                       var endAngle = this.chart.options.rotation || (Math.PI * -0.5); // non reset case handled later
-                       var circumference = reset && this.chart.options.animation.animateRotate ? 0 : this.calculateCircumference(this.getDataset().data[index]) * ((this.chart.options.circumference || (2.0 * Math.PI)) / (2.0 * Math.PI));
-                       var innerRadius = reset && this.chart.options.animation.animateScale ? 0 : this.innerRadius;
-                       var outerRadius = reset && this.chart.options.animation.animateScale ? 0 : this.outerRadius;
-
-                       helpers.extend(arc, {
-                               // Utility
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _index: index,
-
-                               // Desired view properties
-                               _model: {
-                                       x: centerX + this.chart.offsetX,
-                                       y: centerY + this.chart.offsetY,
-                                       startAngle: startAngle,
-                                       endAngle: endAngle,
-                                       circumference: circumference,
-                                       outerRadius: outerRadius,
-                                       innerRadius: innerRadius,
-
-                                       backgroundColor: arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor),
-                                       hoverBackgroundColor: arc.custom && arc.custom.hoverBackgroundColor ? arc.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().hoverBackgroundColor, index, this.chart.options.elements.arc.hoverBackgroundColor),
-                                       borderWidth: arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth),
-                                       borderColor: arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor),
-
-                                       label: helpers.getValueAtIndexOrDefault(this.getDataset().label, index, this.chart.data.labels[index])
-                               }
-                       });
-
-                       // Set correct angles if not resetting
-                       if (!reset) {
-
-                               if (index === 0) {
-                                       arc._model.startAngle = this.chart.options.rotation || (Math.PI * -0.5);
-                               } else {
-                                       arc._model.startAngle = this.getDataset().metaData[index - 1]._model.endAngle;
-                               }
-
-                               arc._model.endAngle = arc._model.startAngle + arc._model.circumference;
-                       }
-
-                       arc.pivot();
-               },
-
-               draw: function(ease) {
-                       var easingDecimal = ease || 1;
-                       helpers.each(this.getDataset().metaData, function(arc, index) {
-                               arc.transition(easingDecimal).draw();
-                       });
-               },
-
-               setHoverStyle: function(arc) {
-                       var dataset = this.chart.data.datasets[arc._datasetIndex];
-                       var index = arc._index;
-
-                       arc._model.backgroundColor = arc.custom && arc.custom.hoverBackgroundColor ? arc.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.color(arc._model.backgroundColor).saturate(0.5).darken(0.1).rgbString());
-                       arc._model.borderColor = arc.custom && arc.custom.hoverBorderColor ? arc.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.color(arc._model.borderColor).saturate(0.5).darken(0.1).rgbString());
-                       arc._model.borderWidth = arc.custom && arc.custom.hoverBorderWidth ? arc.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, arc._model.borderWidth);
-               },
-
-               removeHoverStyle: function(arc) {
-                       var dataset = this.chart.data.datasets[arc._datasetIndex];
-                       var index = arc._index;
-
-                       arc._model.backgroundColor = arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor);
-                       arc._model.borderColor = arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor);
-                       arc._model.borderWidth = arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth);
-               },
-
-               calculateCircumference: function(value) {
-                       if (this.getDataset().total > 0 && !isNaN(value)) {
-                               return (Math.PI * 1.999999) * (value / this.getDataset().total);
-                       } else {
-                               return 0;
-                       }
-               }
-       });
-};
-},{}],18:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.line = {
-               showLines: true,
-
-               hover: {
-                       mode: "label"
-               },
-
-               scales: {
-                       xAxes: [{
-                               type: "category",
-                               id: 'x-axis-0'
-                       }],
-                       yAxes: [{
-                               type: "linear",
-                               id: 'y-axis-0'
-                       }]
-               }
-       };
-
-
-       Chart.controllers.line = Chart.DatasetController.extend({
-               addElements: function() {
-
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-
-                       this.getDataset().metaDataset = this.getDataset().metaDataset || new Chart.elements.Line({
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _points: this.getDataset().metaData
-                       });
-
-                       helpers.each(this.getDataset().data, function(value, index) {
-                               this.getDataset().metaData[index] = this.getDataset().metaData[index] || new Chart.elements.Point({
-                                       _chart: this.chart.chart,
-                                       _datasetIndex: this.index,
-                                       _index: index
-                               });
-                       }, this);
-               },
-               addElementAndReset: function(index) {
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-                       var point = new Chart.elements.Point({
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _index: index
-                       });
-
-                       // Reset the point
-                       this.updateElement(point, index, true);
-
-                       // Add to the points array
-                       this.getDataset().metaData.splice(index, 0, point);
-
-                       // Make sure bezier control points are updated
-                       if (this.chart.options.showLines && this.chart.options.elements.line.tension !== 0)
-                               this.updateBezierControlPoints();
-               },
-
-               update: function update(reset) {
-                       var line = this.getDataset().metaDataset;
-                       var points = this.getDataset().metaData;
-
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var scaleBase;
-
-                       if (yScale.min < 0 && yScale.max < 0) {
-                               scaleBase = yScale.getPixelForValue(yScale.max);
-                       } else if (yScale.min > 0 && yScale.max > 0) {
-                               scaleBase = yScale.getPixelForValue(yScale.min);
-                       } else {
-                               scaleBase = yScale.getPixelForValue(0);
-                       }
-
-                       // Update Line
-                       if (this.chart.options.showLines) {
-                               // Utility
-                               line._scale = yScale;
-                               line._datasetIndex = this.index;
-                               // Data
-                               line._children = points;
-                               // Model
-                               line._model = {
-                                       // Appearance
-                                       tension: line.custom && line.custom.tension ? line.custom.tension : helpers.getValueOrDefault(this.getDataset().tension, this.chart.options.elements.line.tension),
-                                       backgroundColor: line.custom && line.custom.backgroundColor ? line.custom.backgroundColor : (this.getDataset().backgroundColor || this.chart.options.elements.line.backgroundColor),
-                                       borderWidth: line.custom && line.custom.borderWidth ? line.custom.borderWidth : (this.getDataset().borderWidth || this.chart.options.elements.line.borderWidth),
-                                       borderColor: line.custom && line.custom.borderColor ? line.custom.borderColor : (this.getDataset().borderColor || this.chart.options.elements.line.borderColor),
-                                       borderCapStyle: line.custom && line.custom.borderCapStyle ? line.custom.borderCapStyle : (this.getDataset().borderCapStyle || this.chart.options.elements.line.borderCapStyle),
-                                       borderDash: line.custom && line.custom.borderDash ? line.custom.borderDash : (this.getDataset().borderDash || this.chart.options.elements.line.borderDash),
-                                       borderDashOffset: line.custom && line.custom.borderDashOffset ? line.custom.borderDashOffset : (this.getDataset().borderDashOffset || this.chart.options.elements.line.borderDashOffset),
-                                       borderJoinStyle: line.custom && line.custom.borderJoinStyle ? line.custom.borderJoinStyle : (this.getDataset().borderJoinStyle || this.chart.options.elements.line.borderJoinStyle),
-                                       fill: line.custom && line.custom.fill ? line.custom.fill : (this.getDataset().fill !== undefined ? this.getDataset().fill : this.chart.options.elements.line.fill),
-                                       // Scale
-                                       scaleTop: yScale.top,
-                                       scaleBottom: yScale.bottom,
-                                       scaleZero: scaleBase
-                               };
-                               line.pivot();
-                       }
-
-                       // Update Points
-                       helpers.each(points, function(point, index) {
-                               this.updateElement(point, index, reset);
-                       }, this);
-
-                       if (this.chart.options.showLines && this.chart.options.elements.line.tension !== 0)
-                               this.updateBezierControlPoints();
-               },
-
-               getPointBackgroundColor: function(point, index) {
-                       var backgroundColor = this.chart.options.elements.point.backgroundColor;
-                       var dataset = this.getDataset();
-
-                       if (point.custom && point.custom.backgroundColor) {
-                               backgroundColor = point.custom.backgroundColor;
-                       } else if (dataset.pointBackgroundColor) {
-                               backgroundColor = helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);
-                       } else if (dataset.backgroundColor) {
-                               backgroundColor = dataset.backgroundColor;
-                       }
-
-                       return backgroundColor;
-               },
-               getPointBorderColor: function(point, index) {
-                       var borderColor = this.chart.options.elements.point.borderColor;
-                       var dataset = this.getDataset();
-
-                       if (point.custom && point.custom.borderColor) {
-                               borderColor = point.custom.borderColor;
-                       } else if (dataset.pointBorderColor) {
-                               borderColor = helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderColor, index, borderColor);
-                       } else if (dataset.borderColor) {
-                               borderColor = dataset.borderColor;
-                       }
-
-                       return borderColor;
-               },
-               getPointBorderWidth: function(point, index) {
-                       var borderWidth = this.chart.options.elements.point.borderWidth;
-                       var dataset = this.getDataset();
-
-                       if (point.custom && point.custom.borderWidth !== undefined) {
-                               borderWidth = point.custom.borderWidth;
-                       } else if (dataset.pointBorderWidth !== undefined) {
-                               borderWidth = helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);
-                       } else if (dataset.borderWidth !== undefined) {
-                               borderWidth = dataset.borderWidth;
-                       }
-
-                       return borderWidth;
-               },
-
-               updateElement: function(point, index, reset) {
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var scaleBase;
-
-                       if (yScale.min < 0 && yScale.max < 0) {
-                               scaleBase = yScale.getPixelForValue(yScale.max);
-                       } else if (yScale.min > 0 && yScale.max > 0) {
-                               scaleBase = yScale.getPixelForValue(yScale.min);
-                       } else {
-                               scaleBase = yScale.getPixelForValue(0);
-                       }
-
-                       // Utility
-                       point._chart = this.chart.chart;
-                       point._xScale = xScale;
-                       point._yScale = yScale;
-                       point._datasetIndex = this.index;
-                       point._index = index;
-
-                       // Desired view properties
-                       point._model = {
-                               x: xScale.getPixelForValue(this.getDataset().data[index], index, this.index, this.chart.isCombo),
-                               y: reset ? scaleBase : this.calculatePointY(this.getDataset().data[index], index, this.index, this.chart.isCombo),
-                               // Appearance
-                               tension: point.custom && point.custom.tension ? point.custom.tension : helpers.getValueOrDefault(this.getDataset().tension, this.chart.options.elements.line.tension),
-                               radius: point.custom && point.custom.radius ? point.custom.radius : helpers.getValueAtIndexOrDefault(this.getDataset().radius, index, this.chart.options.elements.point.radius),
-                               pointStyle: point.custom && point.custom.pointStyle ? point.custom.pointStyle : helpers.getValueAtIndexOrDefault(this.getDataset().pointStyle, index, this.chart.options.elements.point.pointStyle),
-                               backgroundColor: this.getPointBackgroundColor(point, index),
-                               borderColor: this.getPointBorderColor(point, index),
-                               borderWidth: this.getPointBorderWidth(point, index),
-                               // Tooltip
-                               hitRadius: point.custom && point.custom.hitRadius ? point.custom.hitRadius : helpers.getValueAtIndexOrDefault(this.getDataset().hitRadius, index, this.chart.options.elements.point.hitRadius)
-                       };
-
-                       point._model.skip = point.custom && point.custom.skip ? point.custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));
-               },
-
-               calculatePointY: function(value, index, datasetIndex, isCombo) {
-
-                       var xScale = this.getScaleForId(this.getDataset().xAxisID);
-                       var yScale = this.getScaleForId(this.getDataset().yAxisID);
-
-                       if (yScale.options.stacked) {
-
-                               var sumPos = 0,
-                                       sumNeg = 0;
-
-                               for (var i = 0; i < datasetIndex; i++) {
-                                       var ds = this.chart.data.datasets[i];
-                                       if (ds.type === 'line' && helpers.isDatasetVisible(ds)) {
-                                               if (ds.data[index] < 0) {
-                                                       sumNeg += ds.data[index] || 0;
-                                               } else {
-                                                       sumPos += ds.data[index] || 0;
-                                               }
-                                       }
-                               }
-
-                               if (value < 0) {
-                                       return yScale.getPixelForValue(sumNeg + value);
-                               } else {
-                                       return yScale.getPixelForValue(sumPos + value);
-                               }
-                       }
-
-                       return yScale.getPixelForValue(value);
-               },
-
-               updateBezierControlPoints: function() {
-                       // Update bezier control points
-                       helpers.each(this.getDataset().metaData, function(point, index) {
-                               var controlPoints = helpers.splineCurve(
-                                       helpers.previousItem(this.getDataset().metaData, index)._model,
-                                       point._model,
-                                       helpers.nextItem(this.getDataset().metaData, index)._model,
-                                       point._model.tension
-                               );
-
-                               // Prevent the bezier going outside of the bounds of the graph
-                               point._model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, this.chart.chartArea.right), this.chart.chartArea.left);
-                               point._model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, this.chart.chartArea.bottom), this.chart.chartArea.top);
-
-                               point._model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, this.chart.chartArea.right), this.chart.chartArea.left);
-                               point._model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, this.chart.chartArea.bottom), this.chart.chartArea.top);
-
-                               // Now pivot the point for animation
-                               point.pivot();
-                       }, this);
-               },
-
-               draw: function(ease) {
-                       var easingDecimal = ease || 1;
-
-                       // Transition Point Locations
-                       helpers.each(this.getDataset().metaData, function(point) {
-                               point.transition(easingDecimal);
-                       });
-
-                       // Transition and Draw the line
-                       if (this.chart.options.showLines)
-                               this.getDataset().metaDataset.transition(easingDecimal).draw();
-
-                       // Draw the points
-                       helpers.each(this.getDataset().metaData, function(point) {
-                               point.draw();
-                       });
-               },
-
-               setHoverStyle: function(point) {
-                       // Point
-                       var dataset = this.chart.data.datasets[point._datasetIndex];
-                       var index = point._index;
-
-                       point._model.radius = point.custom && point.custom.hoverRadius ? point.custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);
-                       point._model.backgroundColor = point.custom && point.custom.hoverBackgroundColor ? point.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.color(point._model.backgroundColor).saturate(0.5).darken(0.1).rgbString());
-                       point._model.borderColor = point.custom && point.custom.hoverBorderColor ? point.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.color(point._model.borderColor).saturate(0.5).darken(0.1).rgbString());
-                       point._model.borderWidth = point.custom && point.custom.hoverBorderWidth ? point.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, point._model.borderWidth);
-               },
-
-               removeHoverStyle: function(point) {
-                       var dataset = this.chart.data.datasets[point._datasetIndex];
-                       var index = point._index;
-
-                       point._model.radius = point.custom && point.custom.radius ? point.custom.radius : helpers.getValueAtIndexOrDefault(this.getDataset().radius, index, this.chart.options.elements.point.radius);
-                       point._model.backgroundColor = this.getPointBackgroundColor(point, index);
-                       point._model.borderColor = this.getPointBorderColor(point, index);
-                       point._model.borderWidth = this.getPointBorderWidth(point, index);
-               }
-       });
-};
-
-},{}],19:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.polarArea = {
-
-               scale: {
-                       type: "radialLinear",
-                       lineArc: true // so that lines are circular
-               },
-
-               //Boolean - Whether to animate the rotation of the chart
-               animateRotate: true,
-               animateScale: true,
-
-               aspectRatio: 1,
-               legendCallback: function(chart) {
-                       var text = [];
-                       text.push('<ul class="' + chart.id + '-legend">');
-
-                       if (chart.data.datasets.length) {
-                               for (var i = 0; i < chart.data.datasets[0].data.length; ++i) {
-                                       text.push('<li><span style="background-color:' + chart.data.datasets[0].backgroundColor[i] + '">');
-                                       if (chart.data.labels[i]) {
-                                               text.push(chart.data.labels[i]);
-                                       }
-                                       text.push('</span></li>');
-                               }
-                       }
-
-                       text.push('</ul>');
-                       return text.join("");
-               },
-               legend: {
-                       labels: {
-                               generateLabels: function(data) {
-                                       if (data.labels.length && data.datasets.length) {
-                                               return data.labels.map(function(label, i) {
-                                                       return {
-                                                               text: label,
-                                                               fillStyle: data.datasets[0].backgroundColor[i],
-                                                               hidden: isNaN(data.datasets[0].data[i]),
-
-                                                               // Extra data used for toggling the correct item
-                                                               index: i
-                                                       };
-                                               });
-                                       } else {
-                                               return [];
-                                       }
-                               }
-                       },
-                       onClick: function(e, legendItem) {
-                               helpers.each(this.chart.data.datasets, function(dataset) {
-                                       dataset.metaHiddenData = dataset.metaHiddenData || [];
-                                       var idx = legendItem.index;
-
-                                       if (!isNaN(dataset.data[idx])) {
-                                               dataset.metaHiddenData[idx] = dataset.data[idx];
-                                               dataset.data[idx] = NaN;
-                                       } else if (!isNaN(dataset.metaHiddenData[idx])) {
-                                               dataset.data[idx] = dataset.metaHiddenData[idx];
-                                       }
-                               });
-
-                               this.chart.update();
-                       }
-               },
-
-               // Need to override these to give a nice default
-               tooltips: {
-                       callbacks: {
-                               title: function() {
-                                       return '';
-                               },
-                               label: function(tooltipItem, data) {
-                                       return data.labels[tooltipItem.index] + ': ' + tooltipItem.yLabel;
-                               }
-                       }
-               }
-       };
-
-       Chart.controllers.polarArea = Chart.DatasetController.extend({
-               linkScales: function() {
-                       // no scales for doughnut
-               },
-               addElements: function() {
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-                       helpers.each(this.getDataset().data, function(value, index) {
-                               this.getDataset().metaData[index] = this.getDataset().metaData[index] || new Chart.elements.Arc({
-                                       _chart: this.chart.chart,
-                                       _datasetIndex: this.index,
-                                       _index: index
-                               });
-                       }, this);
-               },
-               addElementAndReset: function(index) {
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-                       var arc = new Chart.elements.Arc({
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _index: index
-                       });
-
-                       // Reset the point
-                       this.updateElement(arc, index, true);
-
-                       // Add to the points array
-                       this.getDataset().metaData.splice(index, 0, arc);
-               },
-               getVisibleDatasetCount: function getVisibleDatasetCount() {
-                       return helpers.where(this.chart.data.datasets, function(ds) {
-                               return helpers.isDatasetVisible(ds);
-                       }).length;
-               },
-
-               update: function update(reset) {
-                       var minSize = Math.min(this.chart.chartArea.right - this.chart.chartArea.left, this.chart.chartArea.bottom - this.chart.chartArea.top);
-                       this.chart.outerRadius = Math.max((minSize - this.chart.options.elements.arc.borderWidth / 2) / 2, 0);
-                       this.chart.innerRadius = Math.max(this.chart.options.cutoutPercentage ? (this.chart.outerRadius / 100) * (this.chart.options.cutoutPercentage) : 1, 0);
-                       this.chart.radiusLength = (this.chart.outerRadius - this.chart.innerRadius) / this.getVisibleDatasetCount();
-
-                       this.getDataset().total = 0;
-                       helpers.each(this.getDataset().data, function(value) {
-                               this.getDataset().total += Math.abs(value);
-                       }, this);
-
-                       this.outerRadius = this.chart.outerRadius - (this.chart.radiusLength * this.index);
-                       this.innerRadius = this.outerRadius - this.chart.radiusLength;
-
-                       helpers.each(this.getDataset().metaData, function(arc, index) {
-                               this.updateElement(arc, index, reset);
-                       }, this);
-               },
-
-               updateElement: function(arc, index, reset) {
-                       var circumference = this.calculateCircumference(this.getDataset().data[index]);
-                       var centerX = (this.chart.chartArea.left + this.chart.chartArea.right) / 2;
-                       var centerY = (this.chart.chartArea.top + this.chart.chartArea.bottom) / 2;
-
-                       // If there is NaN data before us, we need to calculate the starting angle correctly.
-                       // We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data
-                       var notNullIndex = 0;
-                       for (var i = 0; i < index; ++i) {
-                               if (!isNaN(this.getDataset().data[i])) {
-                                       ++notNullIndex;
-                               }
-                       }
-
-                       var startAngle = (-0.5 * Math.PI) + (circumference * notNullIndex);
-                       var endAngle = startAngle + circumference;
-
-                       var resetModel = {
-                               x: centerX,
-                               y: centerY,
-                               innerRadius: 0,
-                               outerRadius: this.chart.options.animateScale ? 0 : this.chart.scale.getDistanceFromCenterForValue(this.getDataset().data[index]),
-                               startAngle: this.chart.options.animateRotate ? Math.PI * -0.5 : startAngle,
-                               endAngle: this.chart.options.animateRotate ? Math.PI * -0.5 : endAngle,
-
-                               backgroundColor: arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor),
-                               borderWidth: arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth),
-                               borderColor: arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor),
-
-                               label: helpers.getValueAtIndexOrDefault(this.chart.data.labels, index, this.chart.data.labels[index])
-                       };
-
-                       helpers.extend(arc, {
-                               // Utility
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _index: index,
-                               _scale: this.chart.scale,
-
-                               // Desired view properties
-                               _model: reset ? resetModel : {
-                                       x: centerX,
-                                       y: centerY,
-                                       innerRadius: 0,
-                                       outerRadius: this.chart.scale.getDistanceFromCenterForValue(this.getDataset().data[index]),
-                                       startAngle: startAngle,
-                                       endAngle: endAngle,
-
-                                       backgroundColor: arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor),
-                                       borderWidth: arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth),
-                                       borderColor: arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor),
-
-                                       label: helpers.getValueAtIndexOrDefault(this.chart.data.labels, index, this.chart.data.labels[index])
-                               }
-                       });
-
-                       arc.pivot();
-               },
-
-               draw: function(ease) {
-                       var easingDecimal = ease || 1;
-                       helpers.each(this.getDataset().metaData, function(arc, index) {
-                               arc.transition(easingDecimal).draw();
-                       });
-               },
-
-               setHoverStyle: function(arc) {
-                       var dataset = this.chart.data.datasets[arc._datasetIndex];
-                       var index = arc._index;
-
-                       arc._model.backgroundColor = arc.custom && arc.custom.hoverBackgroundColor ? arc.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.color(arc._model.backgroundColor).saturate(0.5).darken(0.1).rgbString());
-                       arc._model.borderColor = arc.custom && arc.custom.hoverBorderColor ? arc.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.color(arc._model.borderColor).saturate(0.5).darken(0.1).rgbString());
-                       arc._model.borderWidth = arc.custom && arc.custom.hoverBorderWidth ? arc.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, arc._model.borderWidth);
-               },
-
-               removeHoverStyle: function(arc) {
-                       var dataset = this.chart.data.datasets[arc._datasetIndex];
-                       var index = arc._index;
-
-                       arc._model.backgroundColor = arc.custom && arc.custom.backgroundColor ? arc.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().backgroundColor, index, this.chart.options.elements.arc.backgroundColor);
-                       arc._model.borderColor = arc.custom && arc.custom.borderColor ? arc.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().borderColor, index, this.chart.options.elements.arc.borderColor);
-                       arc._model.borderWidth = arc.custom && arc.custom.borderWidth ? arc.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().borderWidth, index, this.chart.options.elements.arc.borderWidth);
-               },
-
-               calculateCircumference: function(value) {
-                       if (isNaN(value)) {
-                               return 0;
-                       } else {
-                               // Count the number of NaN values
-                               var numNaN = helpers.where(this.getDataset().data, function(data) {
-                                       return isNaN(data);
-                               }).length;
-
-                               return (2 * Math.PI) / (this.getDataset().data.length - numNaN);
-                       }
-               }
-       });
-
-};
-},{}],20:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-
-       Chart.defaults.radar = {
-               scale: {
-                       type: "radialLinear"
-               },
-               elements: {
-                       line: {
-                               tension: 0 // no bezier in radar
-                       }
-               }
-       };
-
-       Chart.controllers.radar = Chart.DatasetController.extend({
-               linkScales: function() {
-                       // No need. Single scale only
-               },
-
-               addElements: function() {
-
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-
-                       this.getDataset().metaDataset = this.getDataset().metaDataset || new Chart.elements.Line({
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _points: this.getDataset().metaData,
-                               _loop: true
-                       });
-
-                       helpers.each(this.getDataset().data, function(value, index) {
-                               this.getDataset().metaData[index] = this.getDataset().metaData[index] || new Chart.elements.Point({
-                                       _chart: this.chart.chart,
-                                       _datasetIndex: this.index,
-                                       _index: index,
-                                       _model: {
-                                               x: 0, //xScale.getPixelForValue(null, index, true),
-                                               y: 0 //this.chartArea.bottom,
-                                       }
-                               });
-                       }, this);
-               },
-               addElementAndReset: function(index) {
-                       this.getDataset().metaData = this.getDataset().metaData || [];
-                       var point = new Chart.elements.Point({
-                               _chart: this.chart.chart,
-                               _datasetIndex: this.index,
-                               _index: index
-                       });
-
-                       // Reset the point
-                       this.updateElement(point, index, true);
-
-                       // Add to the points array
-                       this.getDataset().metaData.splice(index, 0, point);
-
-                       // Make sure bezier control points are updated
-                       this.updateBezierControlPoints();
-               },
-
-               update: function update(reset) {
-
-                       var line = this.getDataset().metaDataset;
-                       var points = this.getDataset().metaData;
-
-                       var scale = this.chart.scale;
-                       var scaleBase;
-
-                       if (scale.min < 0 && scale.max < 0) {
-                               scaleBase = scale.getPointPositionForValue(0, scale.max);
-                       } else if (scale.min > 0 && scale.max > 0) {
-                               scaleBase = scale.getPointPositionForValue(0, scale.min);
-                       } else {
-                               scaleBase = scale.getPointPositionForValue(0, 0);
-                       }
-
-                       helpers.extend(this.getDataset().metaDataset, {
-                               // Utility
-                               _datasetIndex: this.index,
-                               // Data
-                               _children: this.getDataset().metaData,
-                               // Model
-                               _model: {
-                                       // Appearance
-                                       tension: line.custom && line.custom.tension ? line.custom.tension : helpers.getValueOrDefault(this.getDataset().tension, this.chart.options.elements.line.tension),
-                                       backgroundColor: line.custom && line.custom.backgroundColor ? line.custom.backgroundColor : (this.getDataset().backgroundColor || this.chart.options.elements.line.backgroundColor),
-                                       borderWidth: line.custom && line.custom.borderWidth ? line.custom.borderWidth : (this.getDataset().borderWidth || this.chart.options.elements.line.borderWidth),
-                                       borderColor: line.custom && line.custom.borderColor ? line.custom.borderColor : (this.getDataset().borderColor || this.chart.options.elements.line.borderColor),
-                                       fill: line.custom && line.custom.fill ? line.custom.fill : (this.getDataset().fill !== undefined ? this.getDataset().fill : this.chart.options.elements.line.fill),
-                                       borderCapStyle: line.custom && line.custom.borderCapStyle ? line.custom.borderCapStyle : (this.getDataset().borderCapStyle || this.chart.options.elements.line.borderCapStyle),
-                                       borderDash: line.custom && line.custom.borderDash ? line.custom.borderDash : (this.getDataset().borderDash || this.chart.options.elements.line.borderDash),
-                                       borderDashOffset: line.custom && line.custom.borderDashOffset ? line.custom.borderDashOffset : (this.getDataset().borderDashOffset || this.chart.options.elements.line.borderDashOffset),
-                                       borderJoinStyle: line.custom && line.custom.borderJoinStyle ? line.custom.borderJoinStyle : (this.getDataset().borderJoinStyle || this.chart.options.elements.line.borderJoinStyle),
-
-                                       // Scale
-                                       scaleTop: scale.top,
-                                       scaleBottom: scale.bottom,
-                                       scaleZero: scaleBase
-                               }
-                       });
-
-                       this.getDataset().metaDataset.pivot();
-
-                       // Update Points
-                       helpers.each(points, function(point, index) {
-                               this.updateElement(point, index, reset);
-                       }, this);
-
-
-                       // Update bezier control points
-                       this.updateBezierControlPoints();
-               },
-               updateElement: function(point, index, reset) {
-                       var pointPosition = this.chart.scale.getPointPositionForValue(index, this.getDataset().data[index]);
-
-                       helpers.extend(point, {
-                               // Utility
-                               _datasetIndex: this.index,
-                               _index: index,
-                               _scale: this.chart.scale,
-
-                               // Desired view properties
-                               _model: {
-                                       x: reset ? this.chart.scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales
-                                       y: reset ? this.chart.scale.yCenter : pointPosition.y,
-
-                                       // Appearance
-                                       tension: point.custom && point.custom.tension ? point.custom.tension : helpers.getValueOrDefault(this.getDataset().tension, this.chart.options.elements.line.tension),
-                                       radius: point.custom && point.custom.radius ? point.custom.radius : helpers.getValueAtIndexOrDefault(this.getDataset().pointRadius, index, this.chart.options.elements.point.radius),
-                                       backgroundColor: point.custom && point.custom.backgroundColor ? point.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().pointBackgroundColor, index, this.chart.options.elements.point.backgroundColor),
-                                       borderColor: point.custom && point.custom.borderColor ? point.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderColor, index, this.chart.options.elements.point.borderColor),
-                                       borderWidth: point.custom && point.custom.borderWidth ? point.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderWidth, index, this.chart.options.elements.point.borderWidth),
-                                       pointStyle: point.custom && point.custom.pointStyle ? point.custom.pointStyle : helpers.getValueAtIndexOrDefault(this.getDataset().pointStyle, index, this.chart.options.elements.point.pointStyle),
-
-                                       // Tooltip
-                                       hitRadius: point.custom && point.custom.hitRadius ? point.custom.hitRadius : helpers.getValueAtIndexOrDefault(this.getDataset().hitRadius, index, this.chart.options.elements.point.hitRadius)
-                               }
-                       });
-
-                       point._model.skip = point.custom && point.custom.skip ? point.custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));
-               },
-               updateBezierControlPoints: function() {
-                       helpers.each(this.getDataset().metaData, function(point, index) {
-                               var controlPoints = helpers.splineCurve(
-                                       helpers.previousItem(this.getDataset().metaData, index, true)._model,
-                                       point._model,
-                                       helpers.nextItem(this.getDataset().metaData, index, true)._model,
-                                       point._model.tension
-                               );
-
-                               // Prevent the bezier going outside of the bounds of the graph
-                               point._model.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, this.chart.chartArea.right), this.chart.chartArea.left);
-                               point._model.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, this.chart.chartArea.bottom), this.chart.chartArea.top);
-
-                               point._model.controlPointNextX = Math.max(Math.min(controlPoints.next.x, this.chart.chartArea.right), this.chart.chartArea.left);
-                               point._model.controlPointNextY = Math.max(Math.min(controlPoints.next.y, this.chart.chartArea.bottom), this.chart.chartArea.top);
-
-                               // Now pivot the point for animation
-                               point.pivot();
-                       }, this);
-               },
-
-               draw: function(ease) {
-                       var easingDecimal = ease || 1;
-
-                       // Transition Point Locations
-                       helpers.each(this.getDataset().metaData, function(point, index) {
-                               point.transition(easingDecimal);
-                       });
-
-                       // Transition and Draw the line
-                       this.getDataset().metaDataset.transition(easingDecimal).draw();
-
-                       // Draw the points
-                       helpers.each(this.getDataset().metaData, function(point) {
-                               point.draw();
-                       });
-               },
-
-               setHoverStyle: function(point) {
-                       // Point
-                       var dataset = this.chart.data.datasets[point._datasetIndex];
-                       var index = point._index;
-
-                       point._model.radius = point.custom && point.custom.hoverRadius ? point.custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);
-                       point._model.backgroundColor = point.custom && point.custom.hoverBackgroundColor ? point.custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.color(point._model.backgroundColor).saturate(0.5).darken(0.1).rgbString());
-                       point._model.borderColor = point.custom && point.custom.hoverBorderColor ? point.custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.color(point._model.borderColor).saturate(0.5).darken(0.1).rgbString());
-                       point._model.borderWidth = point.custom && point.custom.hoverBorderWidth ? point.custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, point._model.borderWidth);
-               },
-
-               removeHoverStyle: function(point) {
-                       var dataset = this.chart.data.datasets[point._datasetIndex];
-                       var index = point._index;
-
-                       point._model.radius = point.custom && point.custom.radius ? point.custom.radius : helpers.getValueAtIndexOrDefault(this.getDataset().radius, index, this.chart.options.elements.point.radius);
-                       point._model.backgroundColor = point.custom && point.custom.backgroundColor ? point.custom.backgroundColor : helpers.getValueAtIndexOrDefault(this.getDataset().pointBackgroundColor, index, this.chart.options.elements.point.backgroundColor);
-                       point._model.borderColor = point.custom && point.custom.borderColor ? point.custom.borderColor : helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderColor, index, this.chart.options.elements.point.borderColor);
-                       point._model.borderWidth = point.custom && point.custom.borderWidth ? point.custom.borderWidth : helpers.getValueAtIndexOrDefault(this.getDataset().pointBorderWidth, index, this.chart.options.elements.point.borderWidth);
-               }
-       });
-};
-},{}],21:[function(require,module,exports){
-/*global window: false */
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.global.animation = {
-               duration: 1000,
-               easing: "easeOutQuart",
-               onProgress: helpers.noop,
-               onComplete: helpers.noop
-       };
-
-       Chart.Animation = Chart.Element.extend({
-               currentStep: null, // the current animation step
-               numSteps: 60, // default number of steps
-               easing: "", // the easing to use for this animation
-               render: null, // render function used by the animation service
-
-               onAnimationProgress: null, // user specified callback to fire on each step of the animation
-               onAnimationComplete: null // user specified callback to fire when the animation finishes
-       });
-
-       Chart.animationService = {
-               frameDuration: 17,
-               animations: [],
-               dropFrames: 0,
-               request: null,
-               addAnimation: function(chartInstance, animationObject, duration, lazy) {
-
-                       if (!lazy) {
-                               chartInstance.animating = true;
-                       }
-
-                       for (var index = 0; index < this.animations.length; ++index) {
-                               if (this.animations[index].chartInstance === chartInstance) {
-                                       // replacing an in progress animation
-                                       this.animations[index].animationObject = animationObject;
-                                       return;
-                               }
-                       }
-
-                       this.animations.push({
-                               chartInstance: chartInstance,
-                               animationObject: animationObject
-                       });
-
-                       // If there are no animations queued, manually kickstart a digest, for lack of a better word
-                       if (this.animations.length === 1) {
-                               this.requestAnimationFrame();
-                       }
-               },
-               // Cancel the animation for a given chart instance
-               cancelAnimation: function(chartInstance) {
-                       var index = helpers.findIndex(this.animations, function(animationWrapper) {
-                               return animationWrapper.chartInstance === chartInstance;
-                       });
-
-                       if (index !== -1) {
-                               this.animations.splice(index, 1);
-                               chartInstance.animating = false;
-                       }
-               },
-               requestAnimationFrame: function() {
-                       var me = this;
-                       if (me.request === null) {
-                               // Skip animation frame requests until the active one is executed.
-                               // This can happen when processing mouse events, e.g. 'mousemove'
-                               // and 'mouseout' events will trigger multiple renders.
-                               me.request = helpers.requestAnimFrame.call(window, function() {
-                                       me.request = null;
-                                       me.startDigest();
-                               });
-                       }
-               },
-               startDigest: function() {
-
-                       var startTime = Date.now();
-                       var framesToDrop = 0;
-
-                       if (this.dropFrames > 1) {
-                               framesToDrop = Math.floor(this.dropFrames);
-                               this.dropFrames = this.dropFrames % 1;
-                       }
-
-                       var i = 0;
-                       while (i < this.animations.length) {
-                               if (this.animations[i].animationObject.currentStep === null) {
-                                       this.animations[i].animationObject.currentStep = 0;
-                               }
-
-                               this.animations[i].animationObject.currentStep += 1 + framesToDrop;
-
-                               if (this.animations[i].animationObject.currentStep > this.animations[i].animationObject.numSteps) {
-                                       this.animations[i].animationObject.currentStep = this.animations[i].animationObject.numSteps;
-                               }
-
-                               this.animations[i].animationObject.render(this.animations[i].chartInstance, this.animations[i].animationObject);
-                               if (this.animations[i].animationObject.onAnimationProgress && this.animations[i].animationObject.onAnimationProgress.call) {
-                                       this.animations[i].animationObject.onAnimationProgress.call(this.animations[i].chartInstance, this.animations[i]);
-                               }
-
-                               if (this.animations[i].animationObject.currentStep === this.animations[i].animationObject.numSteps) {
-                                       if (this.animations[i].animationObject.onAnimationComplete && this.animations[i].animationObject.onAnimationComplete.call) {
-                                               this.animations[i].animationObject.onAnimationComplete.call(this.animations[i].chartInstance, this.animations[i]);
-                                       }
-
-                                       // executed the last frame. Remove the animation.
-                                       this.animations[i].chartInstance.animating = false;
-
-                                       this.animations.splice(i, 1);
-                               } else {
-                                       ++i;
-                               }
-                       }
-
-                       var endTime = Date.now();
-                       var dropFrames = (endTime - startTime) / this.frameDuration;
-
-                       this.dropFrames += dropFrames;
-
-                       // Do we have more stuff to animate?
-                       if (this.animations.length > 0) {
-                               this.requestAnimationFrame();
-                       }
-               }
-       };
-};
-},{}],22:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-       //Create a dictionary of chart types, to allow for extension of existing types
-       Chart.types = {};
-
-       //Store a reference to each instance - allowing us to globally resize chart instances on window resize.
-       //Destroy method on the chart will remove the instance of the chart from this reference.
-       Chart.instances = {};
-
-       // Controllers available for dataset visualization eg. bar, line, slice, etc.
-       Chart.controllers = {};
-
-       // The main controller of a chart
-       Chart.Controller = function(instance) {
-
-               this.chart = instance;
-               this.config = instance.config;
-               this.options = this.config.options = helpers.configMerge(Chart.defaults.global, Chart.defaults[this.config.type], this.config.options || {});
-               this.id = helpers.uid();
-
-               Object.defineProperty(this, 'data', {
-                       get: function() {
-                               return this.config.data;
-                       }
-               });
-
-               //Add the chart instance to the global namespace
-               Chart.instances[this.id] = this;
-
-               if (this.options.responsive) {
-                       // Silent resize before chart draws
-                       this.resize(true);
-               }
-
-               this.initialize();
-
-               return this;
-       };
-
-       helpers.extend(Chart.Controller.prototype, {
-
-               initialize: function initialize() {
-
-                       // TODO
-                       // If BeforeInit(this) doesn't return false, proceed
-
-                       this.bindEvents();
-
-                       // Make sure controllers are built first so that each dataset is bound to an axis before the scales
-                       // are built
-                       this.ensureScalesHaveIDs();
-                       this.buildOrUpdateControllers();
-                       this.buildScales();
-                       this.buildSurroundingItems();
-                       this.updateLayout();
-                       this.resetElements();
-                       this.initToolTip();
-                       this.update();
-
-                       // TODO
-                       // If AfterInit(this) doesn't return false, proceed
-
-                       return this;
-               },
-
-               clear: function clear() {
-                       helpers.clear(this.chart);
-                       return this;
-               },
-
-               stop: function stop() {
-                       // Stops any current animation loop occuring
-                       Chart.animationService.cancelAnimation(this);
-                       return this;
-               },
-
-               resize: function resize(silent) {
-                       var canvas = this.chart.canvas;
-                       var newWidth = helpers.getMaximumWidth(this.chart.canvas);
-                       var newHeight = (this.options.maintainAspectRatio && isNaN(this.chart.aspectRatio) === false && isFinite(this.chart.aspectRatio) && this.chart.aspectRatio !== 0) ? newWidth / this.chart.aspectRatio : helpers.getMaximumHeight(this.chart.canvas);
-
-                       var sizeChanged = this.chart.width !== newWidth || this.chart.height !== newHeight;
-
-                       if (!sizeChanged)
-                               return this;
-
-                       canvas.width = this.chart.width = newWidth;
-                       canvas.height = this.chart.height = newHeight;
-
-                       helpers.retinaScale(this.chart);
-
-                       if (!silent) {
-                               this.stop();
-                               this.update(this.options.responsiveAnimationDuration);
-                       }
-
-                       return this;
-               },
-               ensureScalesHaveIDs: function ensureScalesHaveIDs() {
-                       var defaultXAxisID = 'x-axis-';
-                       var defaultYAxisID = 'y-axis-';
-
-                       if (this.options.scales) {
-                               if (this.options.scales.xAxes && this.options.scales.xAxes.length) {
-                                       helpers.each(this.options.scales.xAxes, function(xAxisOptions, index) {
-                                               xAxisOptions.id = xAxisOptions.id || (defaultXAxisID + index);
-                                       });
-                               }
-
-                               if (this.options.scales.yAxes && this.options.scales.yAxes.length) {
-                                       // Build the y axes
-                                       helpers.each(this.options.scales.yAxes, function(yAxisOptions, index) {
-                                               yAxisOptions.id = yAxisOptions.id || (defaultYAxisID + index);
-                                       });
-                               }
-                       }
-               },
-               buildScales: function buildScales() {
-                       // Map of scale ID to scale object so we can lookup later
-                       this.scales = {};
-
-                       // Build the x axes
-                       if (this.options.scales) {
-                               if (this.options.scales.xAxes && this.options.scales.xAxes.length) {
-                                       helpers.each(this.options.scales.xAxes, function(xAxisOptions, index) {
-                                               var xType = helpers.getValueOrDefault(xAxisOptions.type, 'category');
-                                               var ScaleClass = Chart.scaleService.getScaleConstructor(xType);
-                                               if (ScaleClass) {
-                                                       var scale = new ScaleClass({
-                                                               ctx: this.chart.ctx,
-                                                               options: xAxisOptions,
-                                                               chart: this,
-                                                               id: xAxisOptions.id
-                                                       });
-
-                                                       this.scales[scale.id] = scale;
-                                               }
-                                       }, this);
-                               }
-
-                               if (this.options.scales.yAxes && this.options.scales.yAxes.length) {
-                                       // Build the y axes
-                                       helpers.each(this.options.scales.yAxes, function(yAxisOptions, index) {
-                                               var yType = helpers.getValueOrDefault(yAxisOptions.type, 'linear');
-                                               var ScaleClass = Chart.scaleService.getScaleConstructor(yType);
-                                               if (ScaleClass) {
-                                                       var scale = new ScaleClass({
-                                                               ctx: this.chart.ctx,
-                                                               options: yAxisOptions,
-                                                               chart: this,
-                                                               id: yAxisOptions.id
-                                                       });
-
-                                                       this.scales[scale.id] = scale;
-                                               }
-                                       }, this);
-                               }
-                       }
-                       if (this.options.scale) {
-                               // Build radial axes
-                               var ScaleClass = Chart.scaleService.getScaleConstructor(this.options.scale.type);
-                               if (ScaleClass) {
-                                       var scale = new ScaleClass({
-                                               ctx: this.chart.ctx,
-                                               options: this.options.scale,
-                                               chart: this
-                                       });
-
-                                       this.scale = scale;
-
-                                       this.scales.radialScale = scale;
-                               }
-                       }
-
-                       Chart.scaleService.addScalesToLayout(this);
-               },
-
-               buildSurroundingItems: function() {
-                       if (this.options.title) {
-                               this.titleBlock = new Chart.Title({
-                                       ctx: this.chart.ctx,
-                                       options: this.options.title,
-                                       chart: this
-                               });
-
-                               Chart.layoutService.addBox(this, this.titleBlock);
-                       }
-
-                       if (this.options.legend) {
-                               this.legend = new Chart.Legend({
-                                       ctx: this.chart.ctx,
-                                       options: this.options.legend,
-                                       chart: this
-                               });
-
-                               Chart.layoutService.addBox(this, this.legend);
-                       }
-               },
-
-               updateLayout: function() {
-                       Chart.layoutService.update(this, this.chart.width, this.chart.height);
-               },
-
-               buildOrUpdateControllers: function buildOrUpdateControllers() {
-                       var types = [];
-                       var newControllers = [];
-
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {
-                               if (!dataset.type) {
-                                       dataset.type = this.config.type;
-                               }
-
-                               var type = dataset.type;
-                               types.push(type);
-
-                               if (dataset.controller) {
-                                       dataset.controller.updateIndex(datasetIndex);
-                               } else {
-                                       dataset.controller = new Chart.controllers[type](this, datasetIndex);
-                                       newControllers.push(dataset.controller);
-                               }
-                       }, this);
-
-                       if (types.length > 1) {
-                               for (var i = 1; i < types.length; i++) {
-                                       if (types[i] !== types[i - 1]) {
-                                               this.isCombo = true;
-                                               break;
-                                       }
-                               }
-                       }
-
-                       return newControllers;
-               },
-
-               resetElements: function resetElements() {
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {
-                               dataset.controller.reset();
-                       });
-               },
-
-               update: function update(animationDuration, lazy) {
-                       // In case the entire data object changed
-                       this.tooltip._data = this.data;
-
-                       // Make sure dataset controllers are updated and new controllers are reset
-                       var newControllers = this.buildOrUpdateControllers();
-
-                       Chart.layoutService.update(this, this.chart.width, this.chart.height);
-
-                       // Can only reset the new controllers after the scales have been updated
-                       helpers.each(newControllers, function(controller) {
-                               controller.reset();
-                       });
-
-                       // Make sure all dataset controllers have correct meta data counts
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {
-                               dataset.controller.buildOrUpdateElements();
-                       });
-
-                       // This will loop through any data and do the appropriate element update for the type
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {
-                               dataset.controller.update();
-                       });
-                       this.render(animationDuration, lazy);
-               },
-
-               render: function render(duration, lazy) {
-
-                       if (this.options.animation && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && this.options.animation.duration !== 0))) {
-                               var animation = new Chart.Animation();
-                               animation.numSteps = (duration || this.options.animation.duration) / 16.66; //60 fps
-                               animation.easing = this.options.animation.easing;
-
-                               // render function
-                               animation.render = function(chartInstance, animationObject) {
-                                       var easingFunction = helpers.easingEffects[animationObject.easing];
-                                       var stepDecimal = animationObject.currentStep / animationObject.numSteps;
-                                       var easeDecimal = easingFunction(stepDecimal);
-
-                                       chartInstance.draw(easeDecimal, stepDecimal, animationObject.currentStep);
-                               };
-
-                               // user events
-                               animation.onAnimationProgress = this.options.animation.onProgress;
-                               animation.onAnimationComplete = this.options.animation.onComplete;
-
-                               Chart.animationService.addAnimation(this, animation, duration, lazy);
-                       } else {
-                               this.draw();
-                               if (this.options.animation && this.options.animation.onComplete && this.options.animation.onComplete.call) {
-                                       this.options.animation.onComplete.call(this);
-                               }
-                       }
-                       return this;
-               },
-
-               draw: function(ease) {
-                       var easingDecimal = ease || 1;
-                       this.clear();
-
-                       // Draw all the scales
-                       helpers.each(this.boxes, function(box) {
-                               box.draw(this.chartArea);
-                       }, this);
-                       if (this.scale) {
-                               this.scale.draw();
-                       }
-
-                       // Clip out the chart area so that anything outside does not draw. This is necessary for zoom and pan to function
-                       this.chart.ctx.save();
-                       this.chart.ctx.beginPath();
-                       this.chart.ctx.rect(this.chartArea.left, this.chartArea.top, this.chartArea.right - this.chartArea.left, this.chartArea.bottom - this.chartArea.top);
-                       this.chart.ctx.clip();
-
-                       // Draw each dataset via its respective controller (reversed to support proper line stacking)
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {
-                               if (helpers.isDatasetVisible(dataset)) {
-                                       dataset.controller.draw(ease);
-                               }
-                       }, null, true);
-
-                       // Restore from the clipping operation
-                       this.chart.ctx.restore();
-
-                       // Finally draw the tooltip
-                       this.tooltip.transition(easingDecimal).draw();
-               },
-
-               // Get the single element that was clicked on
-               // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw
-               getElementAtEvent: function(e) {
-
-                       var eventPosition = helpers.getRelativePosition(e, this.chart);
-                       var elementsArray = [];
-
-                       helpers.each(this.data.datasets, function(dataset, datasetIndex) {
-                               if (helpers.isDatasetVisible(dataset)) {
-                                       helpers.each(dataset.metaData, function(element, index) {
-                                               if (element.inRange(eventPosition.x, eventPosition.y)) {
-                                                       elementsArray.push(element);
-                                                       return elementsArray;
-                                               }
-                                       });
-                               }
-                       });
-
-                       return elementsArray;
-               },
-
-               getElementsAtEvent: function(e) {
-                       var eventPosition = helpers.getRelativePosition(e, this.chart);
-                       var elementsArray = [];
-
-                       var found = (function() {
-                               if (this.data.datasets) {
-                                       for (var i = 0; i < this.data.datasets.length; i++) {
-                                               if (helpers.isDatasetVisible(this.data.datasets[i])) {
-                                                       for (var j = 0; j < this.data.datasets[i].metaData.length; j++) {
-                                                               if (this.data.datasets[i].metaData[j].inRange(eventPosition.x, eventPosition.y)) {
-                                                                       return this.data.datasets[i].metaData[j];
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                       }).call(this);
-
-                       if (!found) {
-                               return elementsArray;
-                       }
-
-                       helpers.each(this.data.datasets, function(dataset, dsIndex) {
-                               if (helpers.isDatasetVisible(dataset)) {
-                                       elementsArray.push(dataset.metaData[found._index]);
-                               }
-                       });
-
-                       return elementsArray;
-               },
-
-               getDatasetAtEvent: function(e) {
-                       var elementsArray = this.getElementAtEvent(e);
-
-                       if (elementsArray.length > 0) {
-                               elementsArray = this.data.datasets[elementsArray[0]._datasetIndex].metaData;
-                       }
-
-                       return elementsArray;
-               },
-
-               generateLegend: function generateLegend() {
-                       return this.options.legendCallback(this);
-               },
-
-               destroy: function destroy() {
-                       this.clear();
-                       helpers.unbindEvents(this, this.events);
-                       helpers.removeResizeListener(this.chart.canvas.parentNode);
-
-                       // Reset canvas height/width attributes
-                       var canvas = this.chart.canvas;
-                       canvas.width = this.chart.width;
-                       canvas.height = this.chart.height;
-
-                       // if we scaled the canvas in response to a devicePixelRatio !== 1, we need to undo that transform here
-                       if (this.chart.originalDevicePixelRatio !== undefined) {
-                               this.chart.ctx.scale(1 / this.chart.originalDevicePixelRatio, 1 / this.chart.originalDevicePixelRatio);
-                       }
-
-                       // Reset to the old style since it may have been changed by the device pixel ratio changes
-                       canvas.style.width = this.chart.originalCanvasStyleWidth;
-                       canvas.style.height = this.chart.originalCanvasStyleHeight;
-
-                       delete Chart.instances[this.id];
-               },
-
-               toBase64Image: function toBase64Image() {
-                       return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments);
-               },
-
-               initToolTip: function initToolTip() {
-                       this.tooltip = new Chart.Tooltip({
-                               _chart: this.chart,
-                               _chartInstance: this,
-                               _data: this.data,
-                               _options: this.options
-                       }, this);
-               },
-
-               bindEvents: function bindEvents() {
-                       helpers.bindEvents(this, this.options.events, function(evt) {
-                               this.eventHandler(evt);
-                       });
-               },
-               eventHandler: function eventHandler(e) {
-                       this.lastActive = this.lastActive || [];
-                       this.lastTooltipActive = this.lastTooltipActive || [];
-
-                       // Find Active Elements for hover and tooltips
-                       if (e.type === 'mouseout') {
-                               this.active = [];
-                               this.tooltipActive = [];
-                       } else {
-
-                               var _this = this;
-                               var getItemsForMode = function(mode) {
-                                       switch (mode) {
-                                               case 'single':
-                                                       return _this.getElementAtEvent(e);
-                                               case 'label':
-                                                       return _this.getElementsAtEvent(e);
-                                               case 'dataset':
-                                                       return _this.getDatasetAtEvent(e);
-                                               default:
-                                                       return e;
-                                       }
-                               };
-
-                               this.active = getItemsForMode(this.options.hover.mode);
-                               this.tooltipActive = getItemsForMode(this.options.tooltips.mode);
-                       }
-
-                       // On Hover hook
-                       if (this.options.hover.onHover) {
-                               this.options.hover.onHover.call(this, this.active);
-                       }
-
-                       if (e.type === 'mouseup' || e.type === 'click') {
-                               if (this.options.onClick) {
-                                       this.options.onClick.call(this, e, this.active);
-                               }
-
-                               if (this.legend && this.legend.handleEvent) {
-                                       this.legend.handleEvent(e);
-                               }
-                       }
-
-                       var dataset;
-                       var index;
-
-                       // Remove styling for last active (even if it may still be active)
-                       if (this.lastActive.length) {
-                               switch (this.options.hover.mode) {
-                                       case 'single':
-                                               this.data.datasets[this.lastActive[0]._datasetIndex].controller.removeHoverStyle(this.lastActive[0], this.lastActive[0]._datasetIndex, this.lastActive[0]._index);
-                                               break;
-                                       case 'label':
-                                       case 'dataset':
-                                               for (var i = 0; i < this.lastActive.length; i++) {
-                                                       if (this.lastActive[i])
-                                                               this.data.datasets[this.lastActive[i]._datasetIndex].controller.removeHoverStyle(this.lastActive[i], this.lastActive[i]._datasetIndex, this.lastActive[i]._index);
-                                               }
-                                               break;
-                                       default:
-                                               // Don't change anything
-                               }
-                       }
-
-                       // Built in hover styling
-                       if (this.active.length && this.options.hover.mode) {
-                               switch (this.options.hover.mode) {
-                                       case 'single':
-                                               this.data.datasets[this.active[0]._datasetIndex].controller.setHoverStyle(this.active[0]);
-                                               break;
-                                       case 'label':
-                                       case 'dataset':
-                                               for (var j = 0; j < this.active.length; j++) {
-                                                       if (this.active[j])
-                                                               this.data.datasets[this.active[j]._datasetIndex].controller.setHoverStyle(this.active[j]);
-                                               }
-                                               break;
-                                       default:
-                                               // Don't change anything
-                               }
-                       }
-
-
-                       // Built in Tooltips
-                       if (this.options.tooltips.enabled || this.options.tooltips.custom) {
-
-                               // The usual updates
-                               this.tooltip.initialize();
-                               this.tooltip._active = this.tooltipActive;
-                               this.tooltip.update();
-                       }
-
-                       // Hover animations
-                       this.tooltip.pivot();
-
-                       if (!this.animating) {
-                               var changed;
-
-                               helpers.each(this.active, function(element, index) {
-                                       if (element !== this.lastActive[index]) {
-                                               changed = true;
-                                       }
-                               }, this);
-
-                               helpers.each(this.tooltipActive, function(element, index) {
-                                       if (element !== this.lastTooltipActive[index]) {
-                                               changed = true;
-                                       }
-                               }, this);
-
-                               // If entering, leaving, or changing elements, animate the change via pivot
-                               if ((this.lastActive.length !== this.active.length) ||
-                                       (this.lastTooltipActive.length !== this.tooltipActive.length) ||
-                                       changed) {
-
-                                       this.stop();
-
-                                       if (this.options.tooltips.enabled || this.options.tooltips.custom) {
-                                               this.tooltip.update(true);
-                                       }
-
-                                       // We only need to render at this point. Updating will cause scales to be recomputed generating flicker & using more
-                                       // memory than necessary.
-                                       this.render(this.options.hover.animationDuration, true);
-                               }
-                       }
-
-                       // Remember Last Actives
-                       this.lastActive = this.active;
-                       this.lastTooltipActive = this.tooltipActive;
-                       return this;
-               }
-       });
-};
-
-},{}],23:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       // Base class for all dataset controllers (line, bar, etc)
-       Chart.DatasetController = function(chart, datasetIndex) {
-               this.initialize.call(this, chart, datasetIndex);
-       };
-
-       helpers.extend(Chart.DatasetController.prototype, {
-               initialize: function(chart, datasetIndex) {
-                       this.chart = chart;
-                       this.index = datasetIndex;
-                       this.linkScales();
-                       this.addElements();
-               },
-               updateIndex: function(datasetIndex) {
-                       this.index = datasetIndex;
-               },
-
-               linkScales: function() {
-                       if (!this.getDataset().xAxisID) {
-                               this.getDataset().xAxisID = this.chart.options.scales.xAxes[0].id;
-                       }
-
-                       if (!this.getDataset().yAxisID) {
-                               this.getDataset().yAxisID = this.chart.options.scales.yAxes[0].id;
-                       }
-               },
-
-               getDataset: function() {
-                       return this.chart.data.datasets[this.index];
-               },
-
-               getScaleForId: function(scaleID) {
-                       return this.chart.scales[scaleID];
-               },
-
-               reset: function() {
-                       this.update(true);
-               },
-
-               buildOrUpdateElements: function buildOrUpdateElements() {
-                       // Handle the number of data points changing
-                       var numData = this.getDataset().data.length;
-                       var numMetaData = this.getDataset().metaData.length;
-
-                       // Make sure that we handle number of datapoints changing
-                       if (numData < numMetaData) {
-                               // Remove excess bars for data points that have been removed
-                               this.getDataset().metaData.splice(numData, numMetaData - numData);
-                       } else if (numData > numMetaData) {
-                               // Add new elements
-                               for (var index = numMetaData; index < numData; ++index) {
-                                       this.addElementAndReset(index);
-                               }
-                       }
-               },
-
-               // Controllers should implement the following
-               addElements: helpers.noop,
-               addElementAndReset: helpers.noop,
-               draw: helpers.noop,
-               removeHoverStyle: helpers.noop,
-               setHoverStyle: helpers.noop,
-               update: helpers.noop
-       });
-
-       Chart.DatasetController.extend = helpers.inherits;
-
-};
-},{}],24:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-  var helpers = Chart.helpers;
-
-  Chart.elements = {};
-
-  Chart.Element = function(configuration) {
-    helpers.extend(this, configuration);
-    this.initialize.apply(this, arguments);
-  };
-  helpers.extend(Chart.Element.prototype, {
-    initialize: function() {},
-    pivot: function() {
-      if (!this._view) {
-        this._view = helpers.clone(this._model);
-      }
-      this._start = helpers.clone(this._view);
-      return this;
-    },
-    transition: function(ease) {
-      if (!this._view) {
-        this._view = helpers.clone(this._model);
-      }
-
-      // No animation -> No Transition
-      if (ease === 1) {
-        this._view = this._model;
-        this._start = null;
-        return this;
-      }
-
-      if (!this._start) {
-        this.pivot();
-      }
-
-      helpers.each(this._model, function(value, key) {
-
-        if (key[0] === '_' || !this._model.hasOwnProperty(key)) {
-          // Only non-underscored properties
-        }
-
-        // Init if doesn't exist
-        else if (!this._view.hasOwnProperty(key)) {
-          if (typeof value === 'number' && !isNaN(this._view[key])) {
-            this._view[key] = value * ease;
-          } else {
-            this._view[key] = value;
-          }
-        }
-
-        // No unnecessary computations
-        else if (value === this._view[key]) {
-          // It's the same! Woohoo!
-        }
-
-        // Color transitions if possible
-        else if (typeof value === 'string') {
-          try {
-            var color = helpers.color(this._start[key]).mix(helpers.color(this._model[key]), ease);
-            this._view[key] = color.rgbString();
-          } catch (err) {
-            this._view[key] = value;
-          }
-        }
-        // Number transitions
-        else if (typeof value === 'number') {
-          var startVal = this._start[key] !== undefined && isNaN(this._start[key]) === false ? this._start[key] : 0;
-          this._view[key] = ((this._model[key] - startVal) * ease) + startVal;
-        }
-        // Everything else
-        else {
-          this._view[key] = value;
-        }
-      }, this);
-
-      return this;
-    },
-    tooltipPosition: function() {
-      return {
-        x: this._model.x,
-        y: this._model.y
-      };
-    },
-    hasValue: function() {
-      return helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);
-    }
-  });
-
-  Chart.Element.extend = helpers.inherits;
-
-};
-
-},{}],25:[function(require,module,exports){
-/*global window: false */
-/*global document: false */
-"use strict";
-
-var color = require('chartjs-color');
-
-module.exports = function(Chart) {
-
-       //Global Chart helpers object for utility methods and classes
-       var helpers = Chart.helpers = {};
-
-       //-- Basic js utility methods
-       helpers.each = function(loopable, callback, self, reverse) {
-               // Check to see if null or undefined firstly.
-               var i, len;
-               if (helpers.isArray(loopable)) {
-                       len = loopable.length;
-                       if (reverse) {
-                               for (i = len - 1; i >= 0; i--) {
-                                       callback.call(self, loopable[i], i);
-                               }
-                       } else {
-                               for (i = 0; i < len; i++) {
-                                       callback.call(self, loopable[i], i);
-                               }
-                       }
-               } else if (typeof loopable === 'object') {
-                       var keys = Object.keys(loopable);
-                       len = keys.length;
-                       for (i = 0; i < len; i++) {
-                               callback.call(self, loopable[keys[i]], keys[i]);
-                       }
-               }
-       };
-       helpers.clone = function(obj) {
-               var objClone = {};
-               helpers.each(obj, function(value, key) {
-                       if (obj.hasOwnProperty(key)) {
-                               if (helpers.isArray(value)) {
-                                       objClone[key] = value.slice(0);
-                               } else if (typeof value === 'object' && value !== null) {
-                                       objClone[key] = helpers.clone(value);
-                               } else {
-                                       objClone[key] = value;
-                               }
-                       }
-               });
-               return objClone;
-       };
-       helpers.extend = function(base) {
-               var len = arguments.length;
-               var additionalArgs = [];
-               for (var i = 1; i < len; i++) {
-                       additionalArgs.push(arguments[i]);
-               }
-               helpers.each(additionalArgs, function(extensionObject) {
-                       helpers.each(extensionObject, function(value, key) {
-                               if (extensionObject.hasOwnProperty(key)) {
-                                       base[key] = value;
-                               }
-                       });
-               });
-               return base;
-       };
-       // Need a special merge function to chart configs since they are now grouped
-       helpers.configMerge = function(_base) {
-               var base = helpers.clone(_base);
-               helpers.each(Array.prototype.slice.call(arguments, 1), function(extension) {
-                       helpers.each(extension, function(value, key) {
-                               if (extension.hasOwnProperty(key)) {
-                                       if (key === 'scales') {
-                                               // Scale config merging is complex. Add out own function here for that
-                                               base[key] = helpers.scaleMerge(base.hasOwnProperty(key) ? base[key] : {}, value);
-
-                                       } else if (key === 'scale') {
-                                               // Used in polar area & radar charts since there is only one scale
-                                               base[key] = helpers.configMerge(base.hasOwnProperty(key) ? base[key] : {}, Chart.scaleService.getScaleDefaults(value.type), value);
-                                       } else if (base.hasOwnProperty(key) && helpers.isArray(base[key]) && helpers.isArray(value)) {
-                                               // In this case we have an array of objects replacing another array. Rather than doing a strict replace,
-                                               // merge. This allows easy scale option merging
-                                               var baseArray = base[key];
-
-                                               helpers.each(value, function(valueObj, index) {
-
-                                                       if (index < baseArray.length) {
-                                                               if (typeof baseArray[index] === 'object' && baseArray[index] !== null && typeof valueObj === 'object' && valueObj !== null) {
-                                                                       // Two objects are coming together. Do a merge of them.
-                                                                       baseArray[index] = helpers.configMerge(baseArray[index], valueObj);
-                                                               } else {
-                                                                       // Just overwrite in this case since there is nothing to merge
-                                                                       baseArray[index] = valueObj;
-                                                               }
-                                                       } else {
-                                                               baseArray.push(valueObj); // nothing to merge
-                                                       }
-                                               });
-
-                                       } else if (base.hasOwnProperty(key) && typeof base[key] === "object" && base[key] !== null && typeof value === "object") {
-                                               // If we are overwriting an object with an object, do a merge of the properties.
-                                               base[key] = helpers.configMerge(base[key], value);
-
-                                       } else {
-                                               // can just overwrite the value in this case
-                                               base[key] = value;
-                                       }
-                               }
-                       });
-               });
-
-               return base;
-       };
-       helpers.extendDeep = function(_base) {
-               return _extendDeep.apply(this, arguments);
-
-               function _extendDeep(dst) {
-                       helpers.each(arguments, function(obj) {
-                               if (obj !== dst) {
-                                       helpers.each(obj, function(value, key) {
-                                               if (dst[key] && dst[key].constructor && dst[key].constructor === Object) {
-                                                       _extendDeep(dst[key], value);
-                                               } else {
-                                                       dst[key] = value;
-                                               }
-                                       });
-                               }
-                       });
-                       return dst;
-               }
-       };
-       helpers.scaleMerge = function(_base, extension) {
-               var base = helpers.clone(_base);
-
-               helpers.each(extension, function(value, key) {
-                       if (extension.hasOwnProperty(key)) {
-                               if (key === 'xAxes' || key === 'yAxes') {
-                                       // These properties are arrays of items
-                                       if (base.hasOwnProperty(key)) {
-                                               helpers.each(value, function(valueObj, index) {
-                                                       var axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');
-                                                       var axisDefaults = Chart.scaleService.getScaleDefaults(axisType);
-                                                       if (index >= base[key].length || !base[key][index].type) {
-                                                               base[key].push(helpers.configMerge(axisDefaults, valueObj));
-                                                       } else if (valueObj.type && valueObj.type !== base[key][index].type) {
-                                                               // Type changed. Bring in the new defaults before we bring in valueObj so that valueObj can override the correct scale defaults
-                                                               base[key][index] = helpers.configMerge(base[key][index], axisDefaults, valueObj);
-                                                       } else {
-                                                               // Type is the same
-                                                               base[key][index] = helpers.configMerge(base[key][index], valueObj);
-                                                       }
-                                               });
-                                       } else {
-                                               base[key] = [];
-                                               helpers.each(value, function(valueObj) {
-                                                       var axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');
-                                                       base[key].push(helpers.configMerge(Chart.scaleService.getScaleDefaults(axisType), valueObj));
-                                               });
-                                       }
-                               } else if (base.hasOwnProperty(key) && typeof base[key] === "object" && base[key] !== null && typeof value === "object") {
-                                       // If we are overwriting an object with an object, do a merge of the properties.
-                                       base[key] = helpers.configMerge(base[key], value);
-
-                               } else {
-                                       // can just overwrite the value in this case
-                                       base[key] = value;
-                               }
-                       }
-               });
-
-               return base;
-       };
-       helpers.getValueAtIndexOrDefault = function(value, index, defaultValue) {
-               if (value === undefined || value === null) {
-                       return defaultValue;
-               }
-
-               if (helpers.isArray(value)) {
-                       return index < value.length ? value[index] : defaultValue;
-               }
-
-               return value;
-       };
-       helpers.getValueOrDefault = function(value, defaultValue) {
-               return value === undefined ? defaultValue : value;
-       };
-       helpers.indexOf = function(arrayToSearch, item) {
-               if (Array.prototype.indexOf) {
-                       return arrayToSearch.indexOf(item);
-               } else {
-                       for (var i = 0; i < arrayToSearch.length; i++) {
-                               if (arrayToSearch[i] === item)
-                                       return i;
-                       }
-                       return -1;
-               }
-       };
-       helpers.where = function(collection, filterCallback) {
-               var filtered = [];
-
-               helpers.each(collection, function(item) {
-                       if (filterCallback(item)) {
-                               filtered.push(item);
-                       }
-               });
-
-               return filtered;
-       };
-       helpers.findIndex = function(arrayToSearch, callback, thisArg) {
-               var index = -1;
-               if (Array.prototype.findIndex) {
-                       index = arrayToSearch.findIndex(callback, thisArg);
-               } else {
-                       for (var i = 0; i < arrayToSearch.length; ++i) {
-                               thisArg = thisArg !== undefined ? thisArg : arrayToSearch;
-
-                               if (callback.call(thisArg, arrayToSearch[i], i, arrayToSearch)) {
-                                       index = i;
-                                       break;
-                               }
-                       }
-               }
-
-               return index;
-       };
-       helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {
-               // Default to start of the array
-               if (startIndex === undefined || startIndex === null) {
-                       startIndex = -1;
-               }
-               for (var i = startIndex + 1; i < arrayToSearch.length; i++) {
-                       var currentItem = arrayToSearch[i];
-                       if (filterCallback(currentItem)) {
-                               return currentItem;
-                       }
-               }
-       };
-       helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {
-               // Default to end of the array
-               if (startIndex === undefined || startIndex === null) {
-                       startIndex = arrayToSearch.length;
-               }
-               for (var i = startIndex - 1; i >= 0; i--) {
-                       var currentItem = arrayToSearch[i];
-                       if (filterCallback(currentItem)) {
-                               return currentItem;
-                       }
-               }
-       };
-       helpers.inherits = function(extensions) {
-               //Basic javascript inheritance based on the model created in Backbone.js
-               var parent = this;
-               var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function() {
-                       return parent.apply(this, arguments);
-               };
-
-               var Surrogate = function() {
-                       this.constructor = ChartElement;
-               };
-               Surrogate.prototype = parent.prototype;
-               ChartElement.prototype = new Surrogate();
-
-               ChartElement.extend = helpers.inherits;
-
-               if (extensions) {
-                       helpers.extend(ChartElement.prototype, extensions);
-               }
-
-               ChartElement.__super__ = parent.prototype;
-
-               return ChartElement;
-       };
-       helpers.noop = function() {};
-       helpers.uid = (function() {
-               var id = 0;
-               return function() {
-                       return "chart-" + id++;
-               };
-       })();
-       helpers.warn = function(str) {
-               //Method for warning of errors
-               if (console && typeof console.warn === "function") {
-                       console.warn(str);
-               }
-       };
-       //-- Math methods
-       helpers.isNumber = function(n) {
-               return !isNaN(parseFloat(n)) && isFinite(n);
-       };
-       helpers.almostEquals = function(x, y, epsilon) {
-               return Math.abs(x - y) < epsilon;
-       };
-       helpers.max = function(array) {
-               return array.reduce(function(max, value) {
-                       if (!isNaN(value)) {
-                               return Math.max(max, value);
-                       } else {
-                               return max;
-                       }
-               }, Number.NEGATIVE_INFINITY);
-       };
-       helpers.min = function(array) {
-               return array.reduce(function(min, value) {
-                       if (!isNaN(value)) {
-                               return Math.min(min, value);
-                       } else {
-                               return min;
-                       }
-               }, Number.POSITIVE_INFINITY);
-       };
-       helpers.sign = function(x) {
-               if (Math.sign) {
-                       return Math.sign(x);
-               } else {
-                       x = +x; // convert to a number
-                       if (x === 0 || isNaN(x)) {
-                               return x;
-                       }
-                       return x > 0 ? 1 : -1;
-               }
-       };
-       helpers.log10 = function(x) {
-               if (Math.log10) {
-                       return Math.log10(x);
-               } else {
-                       return Math.log(x) / Math.LN10;
-               }
-       };
-       helpers.toRadians = function(degrees) {
-               return degrees * (Math.PI / 180);
-       };
-       helpers.toDegrees = function(radians) {
-               return radians * (180 / Math.PI);
-       };
-       // Gets the angle from vertical upright to the point about a centre.
-       helpers.getAngleFromPoint = function(centrePoint, anglePoint) {
-               var distanceFromXCenter = anglePoint.x - centrePoint.x,
-                       distanceFromYCenter = anglePoint.y - centrePoint.y,
-                       radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);
-
-               var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);
-
-               if (angle < (-0.5 * Math.PI)) {
-                       angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]
-               }
-
-               return {
-                       angle: angle,
-                       distance: radialDistanceFromCenter
-               };
-       };
-       helpers.aliasPixel = function(pixelWidth) {
-               return (pixelWidth % 2 === 0) ? 0 : 0.5;
-       };
-       helpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {
-               //Props to Rob Spencer at scaled innovation for his post on splining between points
-               //http://scaledinnovation.com/analytics/splines/aboutSplines.html
-
-               // This function must also respect "skipped" points
-
-               var previous = firstPoint.skip ? middlePoint : firstPoint,
-                       current = middlePoint,
-                       next = afterPoint.skip ? middlePoint : afterPoint;
-
-               var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));
-               var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));
-
-               var s01 = d01 / (d01 + d12);
-               var s12 = d12 / (d01 + d12);
-
-               // If all points are the same, s01 & s02 will be inf
-               s01 = isNaN(s01) ? 0 : s01;
-               s12 = isNaN(s12) ? 0 : s12;
-
-               var fa = t * s01; // scaling factor for triangle Ta
-               var fb = t * s12;
-
-               return {
-                       previous: {
-                               x: current.x - fa * (next.x - previous.x),
-                               y: current.y - fa * (next.y - previous.y)
-                       },
-                       next: {
-                               x: current.x + fb * (next.x - previous.x),
-                               y: current.y + fb * (next.y - previous.y)
-                       }
-               };
-       };
-       helpers.nextItem = function(collection, index, loop) {
-               if (loop) {
-                       return index >= collection.length - 1 ? collection[0] : collection[index + 1];
-               }
-
-               return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];
-       };
-       helpers.previousItem = function(collection, index, loop) {
-               if (loop) {
-                       return index <= 0 ? collection[collection.length - 1] : collection[index - 1];
-               }
-               return index <= 0 ? collection[0] : collection[index - 1];
-       };
-       // Implementation of the nice number algorithm used in determining where axis labels will go
-       helpers.niceNum = function(range, round) {
-               var exponent = Math.floor(helpers.log10(range));
-               var fraction = range / Math.pow(10, exponent);
-               var niceFraction;
-
-               if (round) {
-                       if (fraction < 1.5) {
-                               niceFraction = 1;
-                       } else if (fraction < 3) {
-                               niceFraction = 2;
-                       } else if (fraction < 7) {
-                               niceFraction = 5;
-                       } else {
-                               niceFraction = 10;
-                       }
-               } else {
-                       if (fraction <= 1.0) {
-                               niceFraction = 1;
-                       } else if (fraction <= 2) {
-                               niceFraction = 2;
-                       } else if (fraction <= 5) {
-                               niceFraction = 5;
-                       } else {
-                               niceFraction = 10;
-                       }
-               }
-
-               return niceFraction * Math.pow(10, exponent);
-       };
-       //Easing functions adapted from Robert Penner's easing equations
-       //http://www.robertpenner.com/easing/
-       var easingEffects = helpers.easingEffects = {
-               linear: function(t) {
-                       return t;
-               },
-               easeInQuad: function(t) {
-                       return t * t;
-               },
-               easeOutQuad: function(t) {
-                       return -1 * t * (t - 2);
-               },
-               easeInOutQuad: function(t) {
-                       if ((t /= 1 / 2) < 1) {
-                               return 1 / 2 * t * t;
-                       }
-                       return -1 / 2 * ((--t) * (t - 2) - 1);
-               },
-               easeInCubic: function(t) {
-                       return t * t * t;
-               },
-               easeOutCubic: function(t) {
-                       return 1 * ((t = t / 1 - 1) * t * t + 1);
-               },
-               easeInOutCubic: function(t) {
-                       if ((t /= 1 / 2) < 1) {
-                               return 1 / 2 * t * t * t;
-                       }
-                       return 1 / 2 * ((t -= 2) * t * t + 2);
-               },
-               easeInQuart: function(t) {
-                       return t * t * t * t;
-               },
-               easeOutQuart: function(t) {
-                       return -1 * ((t = t / 1 - 1) * t * t * t - 1);
-               },
-               easeInOutQuart: function(t) {
-                       if ((t /= 1 / 2) < 1) {
-                               return 1 / 2 * t * t * t * t;
-                       }
-                       return -1 / 2 * ((t -= 2) * t * t * t - 2);
-               },
-               easeInQuint: function(t) {
-                       return 1 * (t /= 1) * t * t * t * t;
-               },
-               easeOutQuint: function(t) {
-                       return 1 * ((t = t / 1 - 1) * t * t * t * t + 1);
-               },
-               easeInOutQuint: function(t) {
-                       if ((t /= 1 / 2) < 1) {
-                               return 1 / 2 * t * t * t * t * t;
-                       }
-                       return 1 / 2 * ((t -= 2) * t * t * t * t + 2);
-               },
-               easeInSine: function(t) {
-                       return -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1;
-               },
-               easeOutSine: function(t) {
-                       return 1 * Math.sin(t / 1 * (Math.PI / 2));
-               },
-               easeInOutSine: function(t) {
-                       return -1 / 2 * (Math.cos(Math.PI * t / 1) - 1);
-               },
-               easeInExpo: function(t) {
-                       return (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1));
-               },
-               easeOutExpo: function(t) {
-                       return (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);
-               },
-               easeInOutExpo: function(t) {
-                       if (t === 0) {
-                               return 0;
-                       }
-                       if (t === 1) {
-                               return 1;
-                       }
-                       if ((t /= 1 / 2) < 1) {
-                               return 1 / 2 * Math.pow(2, 10 * (t - 1));
-                       }
-                       return 1 / 2 * (-Math.pow(2, -10 * --t) + 2);
-               },
-               easeInCirc: function(t) {
-                       if (t >= 1) {
-                               return t;
-                       }
-                       return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);
-               },
-               easeOutCirc: function(t) {
-                       return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);
-               },
-               easeInOutCirc: function(t) {
-                       if ((t /= 1 / 2) < 1) {
-                               return -1 / 2 * (Math.sqrt(1 - t * t) - 1);
-                       }
-                       return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);
-               },
-               easeInElastic: function(t) {
-                       var s = 1.70158;
-                       var p = 0;
-                       var a = 1;
-                       if (t === 0) {
-                               return 0;
-                       }
-                       if ((t /= 1) === 1) {
-                               return 1;
-                       }
-                       if (!p) {
-                               p = 1 * 0.3;
-                       }
-                       if (a < Math.abs(1)) {
-                               a = 1;
-                               s = p / 4;
-                       } else {
-                               s = p / (2 * Math.PI) * Math.asin(1 / a);
-                       }
-                       return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
-               },
-               easeOutElastic: function(t) {
-                       var s = 1.70158;
-                       var p = 0;
-                       var a = 1;
-                       if (t === 0) {
-                               return 0;
-                       }
-                       if ((t /= 1) === 1) {
-                               return 1;
-                       }
-                       if (!p) {
-                               p = 1 * 0.3;
-                       }
-                       if (a < Math.abs(1)) {
-                               a = 1;
-                               s = p / 4;
-                       } else {
-                               s = p / (2 * Math.PI) * Math.asin(1 / a);
-                       }
-                       return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;
-               },
-               easeInOutElastic: function(t) {
-                       var s = 1.70158;
-                       var p = 0;
-                       var a = 1;
-                       if (t === 0) {
-                               return 0;
-                       }
-                       if ((t /= 1 / 2) === 2) {
-                               return 1;
-                       }
-                       if (!p) {
-                               p = 1 * (0.3 * 1.5);
-                       }
-                       if (a < Math.abs(1)) {
-                               a = 1;
-                               s = p / 4;
-                       } else {
-                               s = p / (2 * Math.PI) * Math.asin(1 / a);
-                       }
-                       if (t < 1) {
-                               return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
-                       }
-                       return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;
-               },
-               easeInBack: function(t) {
-                       var s = 1.70158;
-                       return 1 * (t /= 1) * t * ((s + 1) * t - s);
-               },
-               easeOutBack: function(t) {
-                       var s = 1.70158;
-                       return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1);
-               },
-               easeInOutBack: function(t) {
-                       var s = 1.70158;
-                       if ((t /= 1 / 2) < 1) {
-                               return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));
-                       }
-                       return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);
-               },
-               easeInBounce: function(t) {
-                       return 1 - easingEffects.easeOutBounce(1 - t);
-               },
-               easeOutBounce: function(t) {
-                       if ((t /= 1) < (1 / 2.75)) {
-                               return 1 * (7.5625 * t * t);
-                       } else if (t < (2 / 2.75)) {
-                               return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75);
-                       } else if (t < (2.5 / 2.75)) {
-                               return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375);
-                       } else {
-                               return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375);
-                       }
-               },
-               easeInOutBounce: function(t) {
-                       if (t < 1 / 2) {
-                               return easingEffects.easeInBounce(t * 2) * 0.5;
-                       }
-                       return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;
-               }
-       };
-       //Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
-       helpers.requestAnimFrame = (function() {
-               return window.requestAnimationFrame ||
-                       window.webkitRequestAnimationFrame ||
-                       window.mozRequestAnimationFrame ||
-                       window.oRequestAnimationFrame ||
-                       window.msRequestAnimationFrame ||
-                       function(callback) {
-                               return window.setTimeout(callback, 1000 / 60);
-                       };
-       })();
-       helpers.cancelAnimFrame = (function() {
-               return window.cancelAnimationFrame ||
-                       window.webkitCancelAnimationFrame ||
-                       window.mozCancelAnimationFrame ||
-                       window.oCancelAnimationFrame ||
-                       window.msCancelAnimationFrame ||
-                       function(callback) {
-                               return window.clearTimeout(callback, 1000 / 60);
-                       };
-       })();
-       //-- DOM methods
-       helpers.getRelativePosition = function(evt, chart) {
-               var mouseX, mouseY;
-               var e = evt.originalEvent || evt,
-                       canvas = evt.currentTarget || evt.srcElement,
-                       boundingRect = canvas.getBoundingClientRect();
-
-               if (e.touches && e.touches.length > 0) {
-                       mouseX = e.touches[0].clientX;
-                       mouseY = e.touches[0].clientY;
-
-               } else {
-                       mouseX = e.clientX;
-                       mouseY = e.clientY;
-               }
-
-               // Scale mouse coordinates into canvas coordinates
-               // by following the pattern laid out by 'jerryj' in the comments of
-               // http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/
-               var paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));
-               var paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));
-               var paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));
-               var paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));
-               var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;
-               var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;
-
-               // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However
-               // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here
-               mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);
-               mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);
-
-               return {
-                       x: mouseX,
-                       y: mouseY
-               };
-
-       };
-       helpers.addEvent = function(node, eventType, method) {
-               if (node.addEventListener) {
-                       node.addEventListener(eventType, method);
-               } else if (node.attachEvent) {
-                       node.attachEvent("on" + eventType, method);
-               } else {
-                       node["on" + eventType] = method;
-               }
-       };
-       helpers.removeEvent = function(node, eventType, handler) {
-               if (node.removeEventListener) {
-                       node.removeEventListener(eventType, handler, false);
-               } else if (node.detachEvent) {
-                       node.detachEvent("on" + eventType, handler);
-               } else {
-                       node["on" + eventType] = helpers.noop;
-               }
-       };
-       helpers.bindEvents = function(chartInstance, arrayOfEvents, handler) {
-               // Create the events object if it's not already present
-               if (!chartInstance.events)
-                       chartInstance.events = {};
-
-               helpers.each(arrayOfEvents, function(eventName) {
-                       chartInstance.events[eventName] = function() {
-                               handler.apply(chartInstance, arguments);
-                       };
-                       helpers.addEvent(chartInstance.chart.canvas, eventName, chartInstance.events[eventName]);
-               });
-       };
-       helpers.unbindEvents = function(chartInstance, arrayOfEvents) {
-               helpers.each(arrayOfEvents, function(handler, eventName) {
-                       helpers.removeEvent(chartInstance.chart.canvas, eventName, handler);
-               });
-       };
-
-       // Private helper function to convert max-width/max-height values that may be percentages into a number
-       function parseMaxStyle(styleValue, node, parentProperty) {
-               var valueInPixels;
-               if (typeof(styleValue) === 'string') {
-                       valueInPixels = parseInt(styleValue, 10);
-
-                       if (styleValue.indexOf('%') != -1) {
-                               // percentage * size in dimension
-                               valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];
-                       }
-               } else {
-                       valueInPixels = styleValue;
-               }
-
-               return valueInPixels;
-       }
-
-       // Private helper to get a constraint dimension
-       // @param domNode : the node to check the constraint on
-       // @param maxStyle : the style that defines the maximum for the direction we are using (max-width / max-height)
-       // @param percentageProperty : property of parent to use when calculating width as a percentage
-       function getConstraintDimension(domNode, maxStyle, percentageProperty) {
-               var constrainedDimension;
-               var constrainedNode = document.defaultView.getComputedStyle(domNode)[maxStyle];
-               var constrainedContainer = document.defaultView.getComputedStyle(domNode.parentNode)[maxStyle];
-               var hasCNode = constrainedNode !== null && constrainedNode !== "none";
-               var hasCContainer = constrainedContainer !== null && constrainedContainer !== "none";
-
-               if (hasCNode || hasCContainer) {
-                       constrainedDimension = Math.min((hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : Number.POSITIVE_INFINITY), (hasCContainer ? parseMaxStyle(constrainedContainer, domNode.parentNode, percentageProperty) : Number.POSITIVE_INFINITY));
-               }
-               return constrainedDimension;
-       }
-       // returns Number or undefined if no constraint
-       helpers.getConstraintWidth = function(domNode) {
-               return getConstraintDimension(domNode, 'max-width', 'clientWidth');
-       };
-       // returns Number or undefined if no constraint
-       helpers.getConstraintHeight = function(domNode) {
-               return getConstraintDimension(domNode, 'max-height', 'clientHeight');
-       };
-       helpers.getMaximumWidth = function(domNode) {
-               var container = domNode.parentNode;
-               var padding = parseInt(helpers.getStyle(container, 'padding-left')) + parseInt(helpers.getStyle(container, 'padding-right'));
-
-               var w = container.clientWidth - padding;
-               var cw = helpers.getConstraintWidth(domNode);
-               if (cw !== undefined) {
-                       w = Math.min(w, cw);
-               }
-
-               return w;
-       };
-       helpers.getMaximumHeight = function(domNode) {
-               var container = domNode.parentNode;
-               var padding = parseInt(helpers.getStyle(container, 'padding-top')) + parseInt(helpers.getStyle(container, 'padding-bottom'));
-
-               var h = container.clientHeight - padding;
-               var ch = helpers.getConstraintHeight(domNode);
-               if (ch !== undefined) {
-                       h = Math.min(h, ch);
-               }
-
-               return h;
-       };
-       helpers.getStyle = function(el, property) {
-               return el.currentStyle ?
-                       el.currentStyle[property] :
-                       document.defaultView.getComputedStyle(el, null).getPropertyValue(property);
-       };
-       helpers.retinaScale = function(chart) {
-               var ctx = chart.ctx;
-               var width = chart.canvas.width;
-               var height = chart.canvas.height;
-               var pixelRatio = chart.currentDevicePixelRatio = window.devicePixelRatio || 1;
-
-               if (pixelRatio !== 1) {
-                       ctx.canvas.height = height * pixelRatio;
-                       ctx.canvas.width = width * pixelRatio;
-                       ctx.scale(pixelRatio, pixelRatio);
-
-                       // Store the device pixel ratio so that we can go backwards in `destroy`.
-                       // The devicePixelRatio changes with zoom, so there are no guarantees that it is the same
-                       // when destroy is called
-                       chart.originalDevicePixelRatio = chart.originalDevicePixelRatio || pixelRatio;
-               }
-
-               ctx.canvas.style.width = width + 'px';
-               ctx.canvas.style.height = height + 'px';
-       };
-       //-- Canvas methods
-       helpers.clear = function(chart) {
-               chart.ctx.clearRect(0, 0, chart.width, chart.height);
-       };
-       helpers.fontString = function(pixelSize, fontStyle, fontFamily) {
-               return fontStyle + " " + pixelSize + "px " + fontFamily;
-       };
-       helpers.longestText = function(ctx, font, arrayOfStrings, cache) {
-               cache = cache || {};
-               cache.data = cache.data || {};
-               cache.garbageCollect = cache.garbageCollect || [];
-
-               if (cache.font !== font) {
-                       cache.data = {};
-                       cache.garbageCollect = [];
-                       cache.font = font;
-               }
-
-               ctx.font = font;
-               var longest = 0;
-               helpers.each(arrayOfStrings, function(string) {
-                       // Undefined strings should not be measured
-                       if (string !== undefined && string !== null) {
-                               var textWidth = cache.data[string];
-                               if (!textWidth) {
-                                       textWidth = cache.data[string] = ctx.measureText(string).width;
-                                       cache.garbageCollect.push(string);
-                               }
-
-                               if (textWidth > longest) {
-                                       longest = textWidth;
-                               }
-                       }
-               });
-
-               var gcLen = cache.garbageCollect.length / 2;
-               if (gcLen > arrayOfStrings.length) {
-                       for (var i = 0; i < gcLen; i++) {
-                               delete cache.data[cache.garbageCollect[i]];
-                       }
-                       cache.garbageCollect.splice(0, gcLen);
-               }
-
-               return longest;
-       };
-       helpers.drawRoundedRectangle = function(ctx, x, y, width, height, radius) {
-               ctx.beginPath();
-               ctx.moveTo(x + radius, y);
-               ctx.lineTo(x + width - radius, y);
-               ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
-               ctx.lineTo(x + width, y + height - radius);
-               ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
-               ctx.lineTo(x + radius, y + height);
-               ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
-               ctx.lineTo(x, y + radius);
-               ctx.quadraticCurveTo(x, y, x + radius, y);
-               ctx.closePath();
-       };
-       helpers.color = function(c) {
-               if (!color) {
-                       console.log('Color.js not found!');
-                       return c;
-               }
-
-               /* global CanvasGradient */
-               if (c instanceof CanvasGradient) {
-                       return color(Chart.defaults.global.defaultColor);
-               }
-
-               return color(c);
-       };
-       helpers.addResizeListener = function(node, callback) {
-               // Hide an iframe before the node
-               var hiddenIframe = document.createElement('iframe');
-               var hiddenIframeClass = 'chartjs-hidden-iframe';
-
-               if (hiddenIframe.classlist) {
-                       // can use classlist
-                       hiddenIframe.classlist.add(hiddenIframeClass);
-               } else {
-                       hiddenIframe.setAttribute('class', hiddenIframeClass);
-               }
-
-               // Set the style
-               hiddenIframe.style.width = '100%';
-               hiddenIframe.style.display = 'block';
-               hiddenIframe.style.border = 0;
-               hiddenIframe.style.height = 0;
-               hiddenIframe.style.margin = 0;
-               hiddenIframe.style.position = 'absolute';
-               hiddenIframe.style.left = 0;
-               hiddenIframe.style.right = 0;
-               hiddenIframe.style.top = 0;
-               hiddenIframe.style.bottom = 0;
-
-               // Insert the iframe so that contentWindow is available
-               node.insertBefore(hiddenIframe, node.firstChild);
-
-               (hiddenIframe.contentWindow || hiddenIframe).onresize = function() {
-                       if (callback) {
-                               callback();
-                       }
-               };
-       };
-       helpers.removeResizeListener = function(node) {
-               var hiddenIframe = node.querySelector('.chartjs-hidden-iframe');
-
-               // Remove the resize detect iframe
-               if (hiddenIframe) {
-                       hiddenIframe.parentNode.removeChild(hiddenIframe);
-               }
-       };
-       helpers.isArray = function(obj) {
-               if (!Array.isArray) {
-                       return Object.prototype.toString.call(obj) === '[object Array]';
-               }
-               return Array.isArray(obj);
-       };
-       helpers.pushAllIfDefined = function(element, array) {
-               if (typeof element === "undefined") {
-                       return;
-               }
-
-               if (helpers.isArray(element)) {
-                       array.push.apply(array, element);
-               } else {
-                       array.push(element);
-               }
-       };
-       helpers.isDatasetVisible = function(dataset) {
-               return !dataset.hidden;
-       };
-       helpers.callCallback = function(fn, args, _tArg) {
-               if (fn && typeof fn.call === 'function') {
-                       fn.apply(_tArg, args);
-               }
-       };
-
-};
-
-},{"chartjs-color":6}],26:[function(require,module,exports){
-"use strict";
-
-module.exports = function() {
-
-       //Occupy the global variable of Chart, and create a simple base class
-       var Chart = function(context, config) {
-               this.config = config;
-
-               // Support a jQuery'd canvas element
-               if (context.length && context[0].getContext) {
-                       context = context[0];
-               }
-
-               // Support a canvas domnode
-               if (context.getContext) {
-                       context = context.getContext("2d");
-               }
-
-               this.ctx = context;
-               this.canvas = context.canvas;
-
-               // Figure out what the size of the chart will be.
-               // If the canvas has a specified width and height, we use those else
-               // we look to see if the canvas node has a CSS width and height.
-               // If there is still no height, fill the parent container
-               this.width = context.canvas.width || parseInt(Chart.helpers.getStyle(context.canvas, 'width')) || Chart.helpers.getMaximumWidth(context.canvas);
-               this.height = context.canvas.height || parseInt(Chart.helpers.getStyle(context.canvas, 'height')) || Chart.helpers.getMaximumHeight(context.canvas);
-
-               this.aspectRatio = this.width / this.height;
-
-               if (isNaN(this.aspectRatio) || isFinite(this.aspectRatio) === false) {
-                       // If the canvas has no size, try and figure out what the aspect ratio will be.
-                       // Some charts prefer square canvases (pie, radar, etc). If that is specified, use that
-                       // else use the canvas default ratio of 2
-                       this.aspectRatio = config.aspectRatio !== undefined ? config.aspectRatio : 2;
-               }
-
-               // Store the original style of the element so we can set it back
-               this.originalCanvasStyleWidth = context.canvas.style.width;
-               this.originalCanvasStyleHeight = context.canvas.style.height;
-
-               // High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.
-               Chart.helpers.retinaScale(this);
-
-               if (config) {
-                       this.controller = new Chart.Controller(this);
-               }
-
-               // Always bind this so that if the responsive state changes we still work
-               var _this = this;
-               Chart.helpers.addResizeListener(context.canvas.parentNode, function() {
-                       if (_this.controller && _this.controller.config.options.responsive) {
-                               _this.controller.resize();
-                       }
-               });
-
-               return this.controller ? this.controller : this;
-
-       };
-
-       //Globally expose the defaults to allow for user updating/changing
-       Chart.defaults = {
-               global: {
-                       responsive: true,
-                       responsiveAnimationDuration: 0,
-                       maintainAspectRatio: true,
-                       events: ["mousemove", "mouseout", "click", "touchstart", "touchmove"],
-                       hover: {
-                               onHover: null,
-                               mode: 'single',
-                               animationDuration: 400
-                       },
-                       onClick: null,
-                       defaultColor: 'rgba(0,0,0,0.1)',
-                       defaultFontColor: '#666',
-                       defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
-                       defaultFontSize: 12,
-                       defaultFontStyle: 'normal',
-                       showLines: true,
-
-                       // Element defaults defined in element extensions
-                       elements: {},
-
-                       // Legend callback string
-                       legendCallback: function(chart) {
-                               var text = [];
-                               text.push('<ul class="' + chart.id + '-legend">');
-                               for (var i = 0; i < chart.data.datasets.length; i++) {
-                                       text.push('<li><span style="background-color:' + chart.data.datasets[i].backgroundColor + '"></span>');
-                                       if (chart.data.datasets[i].label) {
-                                               text.push(chart.data.datasets[i].label);
-                                       }
-                                       text.push('</li>');
-                               }
-                               text.push('</ul>');
-
-                               return text.join("");
-                       }
-               }
-       };
-
-       return Chart;
-
-};
-
-},{}],27:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       // The layout service is very self explanatory.  It's responsible for the layout within a chart.
-       // Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need
-       // It is this service's responsibility of carrying out that layout.
-       Chart.layoutService = {
-               defaults: {},
-
-               // Register a box to a chartInstance. A box is simply a reference to an object that requires layout. eg. Scales, Legend, Plugins.
-               addBox: function(chartInstance, box) {
-                       if (!chartInstance.boxes) {
-                               chartInstance.boxes = [];
-                       }
-                       chartInstance.boxes.push(box);
-               },
-
-               removeBox: function(chartInstance, box) {
-                       if (!chartInstance.boxes) {
-                               return;
-                       }
-                       chartInstance.boxes.splice(chartInstance.boxes.indexOf(box), 1);
-               },
-
-               // The most important function
-               update: function(chartInstance, width, height) {
-
-                       if (!chartInstance) {
-                               return;
-                       }
-
-                       var xPadding = 0;
-                       var yPadding = 0;
-
-                       var leftBoxes = helpers.where(chartInstance.boxes, function(box) {
-                               return box.options.position === "left";
-                       });
-                       var rightBoxes = helpers.where(chartInstance.boxes, function(box) {
-                               return box.options.position === "right";
-                       });
-                       var topBoxes = helpers.where(chartInstance.boxes, function(box) {
-                               return box.options.position === "top";
-                       });
-                       var bottomBoxes = helpers.where(chartInstance.boxes, function(box) {
-                               return box.options.position === "bottom";
-                       });
-
-                       // Boxes that overlay the chartarea such as the radialLinear scale
-                       var chartAreaBoxes = helpers.where(chartInstance.boxes, function(box) {
-                               return box.options.position === "chartArea";
-                       });
-
-                       function fullWidthSorter(a, b) {
-
-                       }
-
-                       // Ensure that full width boxes are at the very top / bottom
-                       topBoxes.sort(function(a, b) {
-                               return (b.options.fullWidth ? 1 : 0) - (a.options.fullWidth ? 1 : 0);
-                       });
-                       bottomBoxes.sort(function(a, b) {
-                               return (a.options.fullWidth ? 1 : 0) - (b.options.fullWidth ? 1 : 0);
-                       });
-
-                       // Essentially we now have any number of boxes on each of the 4 sides.
-                       // Our canvas looks like the following.
-                       // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and
-                       // B1 is the bottom axis
-                       // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays
-                       // These locations are single-box locations only, when trying to register a chartArea location that is already taken,
-                       // an error will be thrown.
-                       //
-                       // |----------------------------------------------------|
-                       // |                  T1 (Full Width)                   |
-                       // |----------------------------------------------------|
-                       // |    |    |                 T2                  |    |
-                       // |    |----|-------------------------------------|----|
-                       // |    |    | C1 |                           | C2 |    |
-                       // |    |    |----|                           |----|    |
-                       // |    |    |                                     |    |
-                       // | L1 | L2 |           ChartArea (C0)            | R1 |
-                       // |    |    |                                     |    |
-                       // |    |    |----|                           |----|    |
-                       // |    |    | C3 |                           | C4 |    |
-                       // |    |----|-------------------------------------|----|
-                       // |    |    |                 B1                  |    |
-                       // |----------------------------------------------------|
-                       // |                  B2 (Full Width)                   |
-                       // |----------------------------------------------------|
-                       //
-                       // What we do to find the best sizing, we do the following
-                       // 1. Determine the minimum size of the chart area.
-                       // 2. Split the remaining width equally between each vertical axis
-                       // 3. Split the remaining height equally between each horizontal axis
-                       // 4. Give each layout the maximum size it can be. The layout will return it's minimum size
-                       // 5. Adjust the sizes of each axis based on it's minimum reported size.
-                       // 6. Refit each axis
-                       // 7. Position each axis in the final location
-                       // 8. Tell the chart the final location of the chart area
-                       // 9. Tell any axes that overlay the chart area the positions of the chart area
-
-                       // Step 1
-                       var chartWidth = width - (2 * xPadding);
-                       var chartHeight = height - (2 * yPadding);
-                       var chartAreaWidth = chartWidth / 2; // min 50%
-                       var chartAreaHeight = chartHeight / 2; // min 50%
-
-                       // Step 2
-                       var verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);
-
-                       // Step 3
-                       var horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);
-
-                       // Step 4
-                       var maxChartAreaWidth = chartWidth;
-                       var maxChartAreaHeight = chartHeight;
-                       var minBoxSizes = [];
-
-                       helpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);
-
-                       function getMinimumBoxSize(box) {
-                               var minSize;
-                               var isHorizontal = box.isHorizontal();
-
-                               if (isHorizontal) {
-                                       minSize = box.update(box.options.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);
-                                       maxChartAreaHeight -= minSize.height;
-                               } else {
-                                       minSize = box.update(verticalBoxWidth, chartAreaHeight);
-                                       maxChartAreaWidth -= minSize.width;
-                               }
-
-                               minBoxSizes.push({
-                                       horizontal: isHorizontal,
-                                       minSize: minSize,
-                                       box: box
-                               });
-                       }
-
-                       // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could
-                       // be if the axes are drawn at their minimum sizes.
-
-                       // Steps 5 & 6
-                       var totalLeftBoxesWidth = xPadding;
-                       var totalRightBoxesWidth = xPadding;
-                       var totalTopBoxesHeight = yPadding;
-                       var totalBottomBoxesHeight = yPadding;
-
-                       // Update, and calculate the left and right margins for the horizontal boxes
-                       helpers.each(leftBoxes.concat(rightBoxes), fitBox);
-
-                       helpers.each(leftBoxes, function(box) {
-                               totalLeftBoxesWidth += box.width;
-                       });
-
-                       helpers.each(rightBoxes, function(box) {
-                               totalRightBoxesWidth += box.width;
-                       });
-
-                       // Set the Left and Right margins for the horizontal boxes
-                       helpers.each(topBoxes.concat(bottomBoxes), fitBox);
-
-                       // Function to fit a box
-                       function fitBox(box) {
-                               var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBoxSize) {
-                                       return minBoxSize.box === box;
-                               });
-
-                               if (minBoxSize) {
-                                       if (box.isHorizontal()) {
-                                               var scaleMargin = {
-                                                       left: totalLeftBoxesWidth,
-                                                       right: totalRightBoxesWidth,
-                                                       top: 0,
-                                                       bottom: 0
-                                               };
-
-                                               // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends
-                                               // on the margin. Sometimes they need to increase in size slightly
-                                               box.update(box.options.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);
-                                       } else {
-                                               box.update(minBoxSize.minSize.width, maxChartAreaHeight);
-                                       }
-                               }
-                       }
-
-                       // Figure out how much margin is on the top and bottom of the vertical boxes
-                       helpers.each(topBoxes, function(box) {
-                               totalTopBoxesHeight += box.height;
-                       });
-
-                       helpers.each(bottomBoxes, function(box) {
-                               totalBottomBoxesHeight += box.height;
-                       });
-
-                       // Let the left layout know the final margin
-                       helpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);
-
-                       function finalFitVerticalBox(box) {
-                               var minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBoxSize) {
-                                       return minBoxSize.box === box;
-                               });
-
-                               var scaleMargin = {
-                                       left: 0,
-                                       right: 0,
-                                       top: totalTopBoxesHeight,
-                                       bottom: totalBottomBoxesHeight
-                               };
-
-                               if (minBoxSize) {
-                                       box.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);
-                               }
-                       }
-
-                       // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)
-                       totalLeftBoxesWidth = xPadding;
-                       totalRightBoxesWidth = xPadding;
-                       totalTopBoxesHeight = yPadding;
-                       totalBottomBoxesHeight = yPadding;
-
-                       helpers.each(leftBoxes, function(box) {
-                               totalLeftBoxesWidth += box.width;
-                       });
-
-                       helpers.each(rightBoxes, function(box) {
-                               totalRightBoxesWidth += box.width;
-                       });
-
-                       helpers.each(topBoxes, function(box) {
-                               totalTopBoxesHeight += box.height;
-                       });
-                       helpers.each(bottomBoxes, function(box) {
-                               totalBottomBoxesHeight += box.height;
-                       });
-
-                       // Figure out if our chart area changed. This would occur if the dataset layout label rotation
-                       // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do
-                       // without calling `fit` again
-                       var newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;
-                       var newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;
-
-                       if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {
-                               helpers.each(leftBoxes, function(box) {
-                                       box.height = newMaxChartAreaHeight;
-                               });
-
-                               helpers.each(rightBoxes, function(box) {
-                                       box.height = newMaxChartAreaHeight;
-                               });
-
-                               helpers.each(topBoxes, function(box) {
-                                       box.width = newMaxChartAreaWidth;
-                               });
-
-                               helpers.each(bottomBoxes, function(box) {
-                                       box.width = newMaxChartAreaWidth;
-                               });
-
-                               maxChartAreaHeight = newMaxChartAreaHeight;
-                               maxChartAreaWidth = newMaxChartAreaWidth;
-                       }
-
-                       // Step 7 - Position the boxes
-                       var left = xPadding;
-                       var top = yPadding;
-                       var right = 0;
-                       var bottom = 0;
-
-                       helpers.each(leftBoxes.concat(topBoxes), placeBox);
-
-                       // Account for chart width and height
-                       left += maxChartAreaWidth;
-                       top += maxChartAreaHeight;
-
-                       helpers.each(rightBoxes, placeBox);
-                       helpers.each(bottomBoxes, placeBox);
-
-                       function placeBox(box) {
-                               if (box.isHorizontal()) {
-                                       box.left = box.options.fullWidth ? xPadding : totalLeftBoxesWidth;
-                                       box.right = box.options.fullWidth ? width - xPadding : totalLeftBoxesWidth + maxChartAreaWidth;
-                                       box.top = top;
-                                       box.bottom = top + box.height;
-
-                                       // Move to next point
-                                       top = box.bottom;
-
-                               } else {
-
-                                       box.left = left;
-                                       box.right = left + box.width;
-                                       box.top = totalTopBoxesHeight;
-                                       box.bottom = totalTopBoxesHeight + maxChartAreaHeight;
-
-                                       // Move to next point
-                                       left = box.right;
-                               }
-                       }
-
-                       // Step 8
-                       chartInstance.chartArea = {
-                               left: totalLeftBoxesWidth,
-                               top: totalTopBoxesHeight,
-                               right: totalLeftBoxesWidth + maxChartAreaWidth,
-                               bottom: totalTopBoxesHeight + maxChartAreaHeight
-                       };
-
-                       // Step 9
-                       helpers.each(chartAreaBoxes, function(box) {
-                               box.left = chartInstance.chartArea.left;
-                               box.top = chartInstance.chartArea.top;
-                               box.right = chartInstance.chartArea.right;
-                               box.bottom = chartInstance.chartArea.bottom;
-
-                               box.update(maxChartAreaWidth, maxChartAreaHeight);
-                       });
-               }
-       };
-};
-
-},{}],28:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.global.legend = {
-
-               display: true,
-               position: 'top',
-               fullWidth: true, // marks that this box should take the full width of the canvas (pushing down other boxes)
-               reverse: false,
-
-               // a callback that will handle
-               onClick: function(e, legendItem) {
-                       var dataset = this.chart.data.datasets[legendItem.datasetIndex];
-                       dataset.hidden = !dataset.hidden;
-
-                       // We hid a dataset ... rerender the chart
-                       this.chart.update();
-               },
-
-               labels: {
-                       boxWidth: 40,
-                       padding: 10,
-                       // Generates labels shown in the legend
-                       // Valid properties to return:
-                       // text : text to display
-                       // fillStyle : fill of coloured box
-                       // strokeStyle: stroke of coloured box
-                       // hidden : if this legend item refers to a hidden item
-                       // lineCap : cap style for line
-                       // lineDash
-                       // lineDashOffset :
-                       // lineJoin :
-                       // lineWidth :
-                       generateLabels: function(data) {
-                               return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {
-                                       return {
-                                               text: dataset.label,
-                                               fillStyle: dataset.backgroundColor,
-                                               hidden: dataset.hidden,
-                                               lineCap: dataset.borderCapStyle,
-                                               lineDash: dataset.borderDash,
-                                               lineDashOffset: dataset.borderDashOffset,
-                                               lineJoin: dataset.borderJoinStyle,
-                                               lineWidth: dataset.borderWidth,
-                                               strokeStyle: dataset.borderColor,
-
-                                               // Below is extra data used for toggling the datasets
-                                               datasetIndex: i
-                                       };
-                               }, this) : [];
-                       }
-               }
-       };
-
-       Chart.Legend = Chart.Element.extend({
-
-               initialize: function(config) {
-                       helpers.extend(this, config);
-
-                       // Contains hit boxes for each dataset (in dataset order)
-                       this.legendHitBoxes = [];
-
-                       // Are we in doughnut mode which has a different data type
-                       this.doughnutMode = false;
-               },
-
-               // These methods are ordered by lifecyle. Utilities then follow.
-               // Any function defined here is inherited by all legend types.
-               // Any function can be extended by the legend type
-
-               beforeUpdate: helpers.noop,
-               update: function(maxWidth, maxHeight, margins) {
-
-                       // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)
-                       this.beforeUpdate();
-
-                       // Absorb the master measurements
-                       this.maxWidth = maxWidth;
-                       this.maxHeight = maxHeight;
-                       this.margins = margins;
-
-                       // Dimensions
-                       this.beforeSetDimensions();
-                       this.setDimensions();
-                       this.afterSetDimensions();
-                       // Labels
-                       this.beforeBuildLabels();
-                       this.buildLabels();
-                       this.afterBuildLabels();
-
-                       // Fit
-                       this.beforeFit();
-                       this.fit();
-                       this.afterFit();
-                       //
-                       this.afterUpdate();
-
-                       return this.minSize;
-
-               },
-               afterUpdate: helpers.noop,
-
-               //
-
-               beforeSetDimensions: helpers.noop,
-               setDimensions: function() {
-                       // Set the unconstrained dimension before label rotation
-                       if (this.isHorizontal()) {
-                               // Reset position before calculating rotation
-                               this.width = this.maxWidth;
-                               this.left = 0;
-                               this.right = this.width;
-                       } else {
-                               this.height = this.maxHeight;
-
-                               // Reset position before calculating rotation
-                               this.top = 0;
-                               this.bottom = this.height;
-                       }
-
-                       // Reset padding
-                       this.paddingLeft = 0;
-                       this.paddingTop = 0;
-                       this.paddingRight = 0;
-                       this.paddingBottom = 0;
-
-                       // Reset minSize
-                       this.minSize = {
-                               width: 0,
-                               height: 0
-                       };
-               },
-               afterSetDimensions: helpers.noop,
-
-               //
-
-               beforeBuildLabels: helpers.noop,
-               buildLabels: function() {
-                       this.legendItems = this.options.labels.generateLabels.call(this, this.chart.data);
-                       if(this.options.reverse){
-                               this.legendItems.reverse();
-                       }
-               },
-               afterBuildLabels: helpers.noop,
-
-               //
-
-               beforeFit: helpers.noop,
-               fit: function() {
-
-                       var ctx = this.ctx;
-                       var fontSize = helpers.getValueOrDefault(this.options.labels.fontSize, Chart.defaults.global.defaultFontSize);
-                       var fontStyle = helpers.getValueOrDefault(this.options.labels.fontStyle, Chart.defaults.global.defaultFontStyle);
-                       var fontFamily = helpers.getValueOrDefault(this.options.labels.fontFamily, Chart.defaults.global.defaultFontFamily);
-                       var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);
-
-                       // Reset hit boxes
-                       this.legendHitBoxes = [];
-
-                       // Width
-                       if (this.isHorizontal()) {
-                               this.minSize.width = this.maxWidth; // fill all the width
-                       } else {
-                               this.minSize.width = this.options.display ? 10 : 0;
-                       }
-
-                       // height
-                       if (this.isHorizontal()) {
-                               this.minSize.height = this.options.display ? 10 : 0;
-                       } else {
-                               this.minSize.height = this.maxHeight; // fill all the height
-                       }
-
-                       // Increase sizes here
-                       if (this.options.display) {
-                               if (this.isHorizontal()) {
-                                       // Labels
-
-                                       // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one
-                                       this.lineWidths = [0];
-                                       var totalHeight = this.legendItems.length ? fontSize + (this.options.labels.padding) : 0;
-
-                                       ctx.textAlign = "left";
-                                       ctx.textBaseline = 'top';
-                                       ctx.font = labelFont;
-
-                                       helpers.each(this.legendItems, function(legendItem, i) {
-                                               var width = this.options.labels.boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;
-                                               if (this.lineWidths[this.lineWidths.length - 1] + width + this.options.labels.padding >= this.width) {
-                                                       totalHeight += fontSize + (this.options.labels.padding);
-                                                       this.lineWidths[this.lineWidths.length] = this.left;
-                                               }
-
-                                               // Store the hitbox width and height here. Final position will be updated in `draw`
-                                               this.legendHitBoxes[i] = {
-                                                       left: 0,
-                                                       top: 0,
-                                                       width: width,
-                                                       height: fontSize
-                                               };
-
-                                               this.lineWidths[this.lineWidths.length - 1] += width + this.options.labels.padding;
-                                       }, this);
-
-                                       this.minSize.height += totalHeight;
-
-                               } else {
-                                       // TODO vertical
-                               }
-                       }
-
-                       this.width = this.minSize.width;
-                       this.height = this.minSize.height;
-
-               },
-               afterFit: helpers.noop,
-
-               // Shared Methods
-               isHorizontal: function() {
-                       return this.options.position === "top" || this.options.position === "bottom";
-               },
-
-               // Actualy draw the legend on the canvas
-               draw: function() {
-                       if (this.options.display) {
-                               var ctx = this.ctx;
-                               var cursor = {
-                                       x: this.left + ((this.width - this.lineWidths[0]) / 2),
-                                       y: this.top + this.options.labels.padding,
-                                       line: 0
-                               };
-
-                               var fontColor = helpers.getValueOrDefault(this.options.labels.fontColor, Chart.defaults.global.defaultFontColor);
-                               var fontSize = helpers.getValueOrDefault(this.options.labels.fontSize, Chart.defaults.global.defaultFontSize);
-                               var fontStyle = helpers.getValueOrDefault(this.options.labels.fontStyle, Chart.defaults.global.defaultFontStyle);
-                               var fontFamily = helpers.getValueOrDefault(this.options.labels.fontFamily, Chart.defaults.global.defaultFontFamily);
-                               var labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);
-
-                               // Horizontal
-                               if (this.isHorizontal()) {
-                                       // Labels
-                                       ctx.textAlign = "left";
-                                       ctx.textBaseline = 'top';
-                                       ctx.lineWidth = 0.5;
-                                       ctx.strokeStyle = fontColor; // for strikethrough effect
-                                       ctx.fillStyle = fontColor; // render in correct colour
-                                       ctx.font = labelFont;
-
-                                       helpers.each(this.legendItems, function(legendItem, i) {
-                                               var textWidth = ctx.measureText(legendItem.text).width;
-                                               var width = this.options.labels.boxWidth + (fontSize / 2) + textWidth;
-
-                                               if (cursor.x + width >= this.width) {
-                                                       cursor.y += fontSize + (this.options.labels.padding);
-                                                       cursor.line++;
-                                                       cursor.x = this.left + ((this.width - this.lineWidths[cursor.line]) / 2);
-                                               }
-
-                                               // Set the ctx for the box
-                                               ctx.save();
-
-                                               var itemOrDefault = function(item, defaulVal) {
-                                                       return item !== undefined ? item : defaulVal;
-                                               };
-
-                                               ctx.fillStyle = itemOrDefault(legendItem.fillStyle, Chart.defaults.global.defaultColor);
-                                               ctx.lineCap = itemOrDefault(legendItem.lineCap, Chart.defaults.global.elements.line.borderCapStyle);
-                                               ctx.lineDashOffset = itemOrDefault(legendItem.lineDashOffset, Chart.defaults.global.elements.line.borderDashOffset);
-                                               ctx.lineJoin = itemOrDefault(legendItem.lineJoin, Chart.defaults.global.elements.line.borderJoinStyle);
-                                               ctx.lineWidth = itemOrDefault(legendItem.lineWidth, Chart.defaults.global.elements.line.borderWidth);
-                                               ctx.strokeStyle = itemOrDefault(legendItem.strokeStyle, Chart.defaults.global.defaultColor);
-
-                                               if (ctx.setLineDash) {
-                                                       // IE 9 and 10 do not support line dash
-                                                       ctx.setLineDash(itemOrDefault(legendItem.lineDash, Chart.defaults.global.elements.line.borderDash));
-                                               }
-
-                                               // Draw the box
-                                               ctx.strokeRect(cursor.x, cursor.y, this.options.labels.boxWidth, fontSize);
-                                               ctx.fillRect(cursor.x, cursor.y, this.options.labels.boxWidth, fontSize);
-
-                                               ctx.restore();
-
-                                               this.legendHitBoxes[i].left = cursor.x;
-                                               this.legendHitBoxes[i].top = cursor.y;
-
-                                               // Fill the actual label
-                                               ctx.fillText(legendItem.text, this.options.labels.boxWidth + (fontSize / 2) + cursor.x, cursor.y);
-
-                                               if (legendItem.hidden) {
-                                                       // Strikethrough the text if hidden
-                                                       ctx.beginPath();
-                                                       ctx.lineWidth = 2;
-                                                       ctx.moveTo(this.options.labels.boxWidth + (fontSize / 2) + cursor.x, cursor.y + (fontSize / 2));
-                                                       ctx.lineTo(this.options.labels.boxWidth + (fontSize / 2) + cursor.x + textWidth, cursor.y + (fontSize / 2));
-                                                       ctx.stroke();
-                                               }
-
-                                               cursor.x += width + (this.options.labels.padding);
-                                       }, this);
-                               } else {
-
-                               }
-                       }
-               },
-
-               // Handle an event
-               handleEvent: function(e) {
-                       var position = helpers.getRelativePosition(e, this.chart.chart);
-
-                       if (position.x >= this.left && position.x <= this.right && position.y >= this.top && position.y <= this.bottom) {
-                               // See if we are touching one of the dataset boxes
-                               for (var i = 0; i < this.legendHitBoxes.length; ++i) {
-                                       var hitBox = this.legendHitBoxes[i];
-
-                                       if (position.x >= hitBox.left && position.x <= hitBox.left + hitBox.width && position.y >= hitBox.top && position.y <= hitBox.top + hitBox.height) {
-                                               // Touching an element
-                                               if (this.options.onClick) {
-                                                       this.options.onClick.call(this, e, this.legendItems[i]);
-                                               }
-                                               break;
-                                       }
-                               }
-                       }
-               }
-       });
-
-};
-
-},{}],29:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.scale = {
-               display: true,
-
-               // grid line settings
-               gridLines: {
-                       display: true,
-                       color: "rgba(0, 0, 0, 0.1)",
-                       lineWidth: 1,
-                       drawOnChartArea: true,
-                       drawTicks: true,
-                       zeroLineWidth: 1,
-                       zeroLineColor: "rgba(0,0,0,0.25)",
-                       offsetGridLines: false
-               },
-
-               // scale label
-               scaleLabel: {
-                       // actual label
-                       labelString: '',
-
-                       // display property
-                       display: false
-               },
-
-               // label settings
-               ticks: {
-                       beginAtZero: false,
-                       maxRotation: 50,
-                       mirror: false,
-                       padding: 10,
-                       reverse: false,
-                       display: true,
-                       autoSkip: true,
-                       autoSkipPadding: 0,
-                       callback: function(value) {
-                               return '' + value;
-                       }
-               }
-       };
-
-       Chart.Scale = Chart.Element.extend({
-
-               // These methods are ordered by lifecyle. Utilities then follow.
-               // Any function defined here is inherited by all scale types.
-               // Any function can be extended by the scale type
-
-               beforeUpdate: function() {
-                       helpers.callCallback(this.options.beforeUpdate, [this]);
-               },
-               update: function(maxWidth, maxHeight, margins) {
-
-                       // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)
-                       this.beforeUpdate();
-
-                       // Absorb the master measurements
-                       this.maxWidth = maxWidth;
-                       this.maxHeight = maxHeight;
-                       this.margins = helpers.extend({
-                               left: 0,
-                               right: 0,
-                               top: 0,
-                               bottom: 0
-                       }, margins);
-
-                       // Dimensions
-                       this.beforeSetDimensions();
-                       this.setDimensions();
-                       this.afterSetDimensions();
-
-                       // Data min/max
-                       this.beforeDataLimits();
-                       this.determineDataLimits();
-                       this.afterDataLimits();
-
-                       // Ticks
-                       this.beforeBuildTicks();
-                       this.buildTicks();
-                       this.afterBuildTicks();
-
-                       this.beforeTickToLabelConversion();
-                       this.convertTicksToLabels();
-                       this.afterTickToLabelConversion();
-
-                       // Tick Rotation
-                       this.beforeCalculateTickRotation();
-                       this.calculateTickRotation();
-                       this.afterCalculateTickRotation();
-                       // Fit
-                       this.beforeFit();
-                       this.fit();
-                       this.afterFit();
-                       //
-                       this.afterUpdate();
-
-                       return this.minSize;
-
-               },
-               afterUpdate: function() {
-                       helpers.callCallback(this.options.afterUpdate, [this]);
-               },
-
-               //
-
-               beforeSetDimensions: function() {
-                       helpers.callCallback(this.options.beforeSetDimensions, [this]);
-               },
-               setDimensions: function() {
-                       // Set the unconstrained dimension before label rotation
-                       if (this.isHorizontal()) {
-                               // Reset position before calculating rotation
-                               this.width = this.maxWidth;
-                               this.left = 0;
-                               this.right = this.width;
-                       } else {
-                               this.height = this.maxHeight;
-
-                               // Reset position before calculating rotation
-                               this.top = 0;
-                               this.bottom = this.height;
-                       }
-
-                       // Reset padding
-                       this.paddingLeft = 0;
-                       this.paddingTop = 0;
-                       this.paddingRight = 0;
-                       this.paddingBottom = 0;
-               },
-               afterSetDimensions: function() {
-                       helpers.callCallback(this.options.afterSetDimensions, [this]);
-               },
-
-               // Data limits
-               beforeDataLimits: function() {
-                       helpers.callCallback(this.options.beforeDataLimits, [this]);
-               },
-               determineDataLimits: helpers.noop,
-               afterDataLimits: function() {
-                       helpers.callCallback(this.options.afterDataLimits, [this]);
-               },
-
-               //
-               beforeBuildTicks: function() {
-                       helpers.callCallback(this.options.beforeBuildTicks, [this]);
-               },
-               buildTicks: helpers.noop,
-               afterBuildTicks: function() {
-                       helpers.callCallback(this.options.afterBuildTicks, [this]);
-               },
-
-               beforeTickToLabelConversion: function() {
-                       helpers.callCallback(this.options.beforeTickToLabelConversion, [this]);
-               },
-               convertTicksToLabels: function() {
-                       // Convert ticks to strings
-                       this.ticks = this.ticks.map(function(numericalTick, index, ticks) {
-                                       if (this.options.ticks.userCallback) {
-                                               return this.options.ticks.userCallback(numericalTick, index, ticks);
-                                       }
-                                       return this.options.ticks.callback(numericalTick, index, ticks);
-                               },
-                               this);
-               },
-               afterTickToLabelConversion: function() {
-                       helpers.callCallback(this.options.afterTickToLabelConversion, [this]);
-               },
-
-               //
-
-               beforeCalculateTickRotation: function() {
-                       helpers.callCallback(this.options.beforeCalculateTickRotation, [this]);
-               },
-               calculateTickRotation: function() {
-                       //Get the width of each grid by calculating the difference
-                       //between x offsets between 0 and 1.
-                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);
-                       var tickFontStyle = helpers.getValueOrDefault(this.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);
-                       var tickFontFamily = helpers.getValueOrDefault(this.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);
-                       var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);
-                       this.ctx.font = tickLabelFont;
-
-                       var firstWidth = this.ctx.measureText(this.ticks[0]).width;
-                       var lastWidth = this.ctx.measureText(this.ticks[this.ticks.length - 1]).width;
-                       var firstRotated;
-
-                       this.labelRotation = 0;
-                       this.paddingRight = 0;
-                       this.paddingLeft = 0;
-
-                       if (this.options.display) {
-                               if (this.isHorizontal()) {
-                                       this.paddingRight = lastWidth / 2 + 3;
-                                       this.paddingLeft = firstWidth / 2 + 3;
-
-                                       if (!this.longestTextCache) {
-                                               this.longestTextCache = {};
-                                       }
-                                       var originalLabelWidth = helpers.longestText(this.ctx, tickLabelFont, this.ticks, this.longestTextCache);
-                                       var labelWidth = originalLabelWidth;
-                                       var cosRotation;
-                                       var sinRotation;
-
-                                       // Allow 3 pixels x2 padding either side for label readability
-                                       // only the index matters for a dataset scale, but we want a consistent interface between scales
-                                       var tickWidth = this.getPixelForTick(1) - this.getPixelForTick(0) - 6;
-
-                                       //Max label rotation can be set or default to 90 - also act as a loop counter
-                                       while (labelWidth > tickWidth && this.labelRotation < this.options.ticks.maxRotation) {
-                                               cosRotation = Math.cos(helpers.toRadians(this.labelRotation));
-                                               sinRotation = Math.sin(helpers.toRadians(this.labelRotation));
-
-                                               firstRotated = cosRotation * firstWidth;
-
-                                               // We're right aligning the text now.
-                                               if (firstRotated + tickFontSize / 2 > this.yLabelWidth) {
-                                                       this.paddingLeft = firstRotated + tickFontSize / 2;
-                                               }
-
-                                               this.paddingRight = tickFontSize / 2;
-
-                                               if (sinRotation * originalLabelWidth > this.maxHeight) {
-                                                       // go back one step
-                                                       this.labelRotation--;
-                                                       break;
-                                               }
-
-                                               this.labelRotation++;
-                                               labelWidth = cosRotation * originalLabelWidth;
-                                       }
-                               }
-                       }
-
-                       if (this.margins) {
-                               this.paddingLeft = Math.max(this.paddingLeft - this.margins.left, 0);
-                               this.paddingRight = Math.max(this.paddingRight - this.margins.right, 0);
-                       }
-               },
-               afterCalculateTickRotation: function() {
-                       helpers.callCallback(this.options.afterCalculateTickRotation, [this]);
-               },
-
-               //
-
-               beforeFit: function() {
-                       helpers.callCallback(this.options.beforeFit, [this]);
-               },
-               fit: function() {
-
-                       this.minSize = {
-                               width: 0,
-                               height: 0
-                       };
-
-                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);
-                       var tickFontStyle = helpers.getValueOrDefault(this.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);
-                       var tickFontFamily = helpers.getValueOrDefault(this.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);
-                       var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);
-
-                       var scaleLabelFontSize = helpers.getValueOrDefault(this.options.scaleLabel.fontSize, Chart.defaults.global.defaultFontSize);
-                       var scaleLabelFontStyle = helpers.getValueOrDefault(this.options.scaleLabel.fontStyle, Chart.defaults.global.defaultFontStyle);
-                       var scaleLabelFontFamily = helpers.getValueOrDefault(this.options.scaleLabel.fontFamily, Chart.defaults.global.defaultFontFamily);
-                       var scaleLabelFont = helpers.fontString(scaleLabelFontSize, scaleLabelFontStyle, scaleLabelFontFamily);
-
-                       // Width
-                       if (this.isHorizontal()) {
-                               // subtract the margins to line up with the chartArea if we are a full width scale
-                               this.minSize.width = this.isFullWidth() ? this.maxWidth - this.margins.left - this.margins.right : this.maxWidth;
-                       } else {
-                               this.minSize.width = this.options.gridLines.display && this.options.display ? 10 : 0;
-                       }
-
-                       // height
-                       if (this.isHorizontal()) {
-                               this.minSize.height = this.options.gridLines.display && this.options.display ? 10 : 0;
-                       } else {
-                               this.minSize.height = this.maxHeight; // fill all the height
-                       }
-
-                       // Are we showing a title for the scale?
-                       if (this.options.scaleLabel.display) {
-                               if (this.isHorizontal()) {
-                                       this.minSize.height += (scaleLabelFontSize * 1.5);
-                               } else {
-                                       this.minSize.width += (scaleLabelFontSize * 1.5);
-                               }
-                       }
-
-                       if (this.options.ticks.display && this.options.display) {
-                               // Don't bother fitting the ticks if we are not showing them
-                               if (!this.longestTextCache) {
-                                       this.longestTextCache = {};
-                               }
-
-                               var largestTextWidth = helpers.longestText(this.ctx, tickLabelFont, this.ticks, this.longestTextCache);
-
-                               if (this.isHorizontal()) {
-                                       // A horizontal axis is more constrained by the height.
-                                       this.longestLabelWidth = largestTextWidth;
-
-                                       // TODO - improve this calculation
-                                       var labelHeight = (Math.sin(helpers.toRadians(this.labelRotation)) * this.longestLabelWidth) + 1.5 * tickFontSize;
-
-                                       this.minSize.height = Math.min(this.maxHeight, this.minSize.height + labelHeight);
-                                       this.ctx.font = tickLabelFont;
-
-                                       var firstLabelWidth = this.ctx.measureText(this.ticks[0]).width;
-                                       var lastLabelWidth = this.ctx.measureText(this.ticks[this.ticks.length - 1]).width;
-
-                                       // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned which means that the right padding is dominated
-                                       // by the font height
-                                       var cosRotation = Math.cos(helpers.toRadians(this.labelRotation));
-                                       var sinRotation = Math.sin(helpers.toRadians(this.labelRotation));
-                                       this.paddingLeft = this.labelRotation !== 0 ? (cosRotation * firstLabelWidth) + 3 : firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges
-                                       this.paddingRight = this.labelRotation !== 0 ? (sinRotation * (tickFontSize / 2)) + 3 : lastLabelWidth / 2 + 3; // when rotated
-                               } else {
-                                       // A vertical axis is more constrained by the width. Labels are the dominant factor here, so get that length first
-                                       var maxLabelWidth = this.maxWidth - this.minSize.width;
-
-                                       // Account for padding
-                                       if (!this.options.ticks.mirror) {
-                                               largestTextWidth += this.options.ticks.padding;
-                                       }
-
-                                       if (largestTextWidth < maxLabelWidth) {
-                                               // We don't need all the room
-                                               this.minSize.width += largestTextWidth;
-                                       } else {
-                                               // Expand to max size
-                                               this.minSize.width = this.maxWidth;
-                                       }
-
-                                       this.paddingTop = tickFontSize / 2;
-                                       this.paddingBottom = tickFontSize / 2;
-                               }
-                       }
-
-                       if (this.margins) {
-                               this.paddingLeft = Math.max(this.paddingLeft - this.margins.left, 0);
-                               this.paddingTop = Math.max(this.paddingTop - this.margins.top, 0);
-                               this.paddingRight = Math.max(this.paddingRight - this.margins.right, 0);
-                               this.paddingBottom = Math.max(this.paddingBottom - this.margins.bottom, 0);
-                       }
-
-                       this.width = this.minSize.width;
-                       this.height = this.minSize.height;
-
-               },
-               afterFit: function() {
-                       helpers.callCallback(this.options.afterFit, [this]);
-               },
-
-               // Shared Methods
-               isHorizontal: function() {
-                       return this.options.position === "top" || this.options.position === "bottom";
-               },
-               isFullWidth: function() {
-                       return (this.options.fullWidth);
-               },
-
-               // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not
-               getRightValue: function getRightValue(rawValue) {
-                       // Null and undefined values first
-                       if (rawValue === null || typeof(rawValue) === 'undefined') {
-                               return NaN;
-                       }
-                       // isNaN(object) returns true, so make sure NaN is checking for a number
-                       if (typeof(rawValue) === 'number' && isNaN(rawValue)) {
-                               return NaN;
-                       }
-                       // If it is in fact an object, dive in one more level
-                       if (typeof(rawValue) === "object") {
-                               if (rawValue instanceof Date) {
-                                       return rawValue;
-                               } else {
-                                       return getRightValue(this.isHorizontal() ? rawValue.x : rawValue.y);
-                               }
-                       }
-
-                       // Value is good, return it
-                       return rawValue;
-               },
-
-               // Used to get the value to display in the tooltip for the data at the given index
-               // function getLabelForIndex(index, datasetIndex)
-               getLabelForIndex: helpers.noop,
-
-               // Used to get data value locations.  Value can either be an index or a numerical value
-               getPixelForValue: helpers.noop,
-
-               // Used for tick location, should
-               getPixelForTick: function(index, includeOffset) {
-                       if (this.isHorizontal()) {
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);
-                               var tickWidth = innerWidth / Math.max((this.ticks.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
-                               var pixel = (tickWidth * index) + this.paddingLeft;
-
-                               if (includeOffset) {
-                                       pixel += tickWidth / 2;
-                               }
-
-                               var finalVal = this.left + Math.round(pixel);
-                               finalVal += this.isFullWidth() ? this.margins.left : 0;
-                               return finalVal;
-                       } else {
-                               var innerHeight = this.height - (this.paddingTop + this.paddingBottom);
-                               return this.top + (index * (innerHeight / (this.ticks.length - 1)));
-                       }
-               },
-
-               // Utility for getting the pixel location of a percentage of scale
-               getPixelForDecimal: function(decimal /*, includeOffset*/ ) {
-                       if (this.isHorizontal()) {
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);
-                               var valueOffset = (innerWidth * decimal) + this.paddingLeft;
-
-                               var finalVal = this.left + Math.round(valueOffset);
-                               finalVal += this.isFullWidth() ? this.margins.left : 0;
-                               return finalVal;
-                       } else {
-                               return this.top + (decimal * this.height);
-                       }
-               },
-
-               // Actualy draw the scale on the canvas
-               // @param {rectangle} chartArea : the area of the chart to draw full grid lines on
-               draw: function(chartArea) {
-                       if (this.options.display) {
-
-                               var setContextLineSettings;
-                               var isRotated = this.labelRotation !== 0;
-                               var skipRatio;
-                               var scaleLabelX;
-                               var scaleLabelY;
-                               var useAutoskipper = this.options.ticks.autoSkip;
-
-
-                               // figure out the maximum number of gridlines to show
-                               var maxTicks;
-
-                               if (this.options.ticks.maxTicksLimit) {
-                                       maxTicks = this.options.ticks.maxTicksLimit;
-                               }
-
-                               var tickFontColor = helpers.getValueOrDefault(this.options.ticks.fontColor, Chart.defaults.global.defaultFontColor);
-                               var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);
-                               var tickFontStyle = helpers.getValueOrDefault(this.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);
-                               var tickFontFamily = helpers.getValueOrDefault(this.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);
-                               var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);
-
-                               var scaleLabelFontColor = helpers.getValueOrDefault(this.options.scaleLabel.fontColor, Chart.defaults.global.defaultFontColor);
-                               var scaleLabelFontSize = helpers.getValueOrDefault(this.options.scaleLabel.fontSize, Chart.defaults.global.defaultFontSize);
-                               var scaleLabelFontStyle = helpers.getValueOrDefault(this.options.scaleLabel.fontStyle, Chart.defaults.global.defaultFontStyle);
-                               var scaleLabelFontFamily = helpers.getValueOrDefault(this.options.scaleLabel.fontFamily, Chart.defaults.global.defaultFontFamily);
-                               var scaleLabelFont = helpers.fontString(scaleLabelFontSize, scaleLabelFontStyle, scaleLabelFontFamily);
-
-                               var cosRotation = Math.cos(helpers.toRadians(this.labelRotation));
-                               var sinRotation = Math.sin(helpers.toRadians(this.labelRotation));
-                               var longestRotatedLabel = this.longestLabelWidth * cosRotation;
-                               var rotatedLabelHeight = tickFontSize * sinRotation;
-
-                               // Make sure we draw text in the correct color and font
-                               this.ctx.fillStyle = tickFontColor;
-
-                               if (this.isHorizontal()) {
-                                       setContextLineSettings = true;
-                                       var yTickStart = this.options.position === "bottom" ? this.top : this.bottom - 10;
-                                       var yTickEnd = this.options.position === "bottom" ? this.top + 10 : this.bottom;
-                                       skipRatio = false;
-
-                                       if (((longestRotatedLabel / 2) + this.options.ticks.autoSkipPadding) * this.ticks.length > (this.width - (this.paddingLeft + this.paddingRight))) {
-                                               skipRatio = 1 + Math.floor((((longestRotatedLabel / 2) + this.options.ticks.autoSkipPadding) * this.ticks.length) / (this.width - (this.paddingLeft + this.paddingRight)));
-                                       }
-
-                                       // if they defined a max number of ticks,
-                                       // increase skipRatio until that number is met
-                                       if (maxTicks && this.ticks.length > maxTicks) {
-                                               while (!skipRatio || this.ticks.length / (skipRatio || 1) > maxTicks) {
-                                                       if (!skipRatio) {
-                                                               skipRatio = 1;
-                                                       }
-                                                       skipRatio += 1;
-                                               }
-                                       }
-
-                                       if (!useAutoskipper) {
-                                               skipRatio = false;
-                                       }
-
-                                       helpers.each(this.ticks, function(label, index) {
-                                               // Blank ticks
-                                               var isLastTick = this.ticks.length === index + 1;
-
-                                               // Since we always show the last tick,we need may need to hide the last shown one before
-                                               var shouldSkip = (skipRatio > 1 && index % skipRatio > 0) || (index % skipRatio === 0 && index + skipRatio > this.ticks.length);
-                                               if (shouldSkip && !isLastTick || (label === undefined || label === null)) {
-                                                       return;
-                                               }
-                                               var xLineValue = this.getPixelForTick(index); // xvalues for grid lines
-                                               var xLabelValue = this.getPixelForTick(index, this.options.gridLines.offsetGridLines); // x values for ticks (need to consider offsetLabel option)
-
-                                               if (this.options.gridLines.display) {
-                                                       if (index === (typeof this.zeroLineIndex !== 'undefined' ? this.zeroLineIndex : 0)) {
-                                                               // Draw the first index specially
-                                                               this.ctx.lineWidth = this.options.gridLines.zeroLineWidth;
-                                                               this.ctx.strokeStyle = this.options.gridLines.zeroLineColor;
-                                                               setContextLineSettings = true; // reset next time
-                                                       } else if (setContextLineSettings) {
-                                                               this.ctx.lineWidth = this.options.gridLines.lineWidth;
-                                                               this.ctx.strokeStyle = this.options.gridLines.color;
-                                                               setContextLineSettings = false;
-                                                       }
-
-                                                       xLineValue += helpers.aliasPixel(this.ctx.lineWidth);
-
-                                                       // Draw the label area
-                                                       this.ctx.beginPath();
-
-                                                       if (this.options.gridLines.drawTicks) {
-                                                               this.ctx.moveTo(xLineValue, yTickStart);
-                                                               this.ctx.lineTo(xLineValue, yTickEnd);
-                                                       }
-
-                                                       // Draw the chart area
-                                                       if (this.options.gridLines.drawOnChartArea) {
-                                                               this.ctx.moveTo(xLineValue, chartArea.top);
-                                                               this.ctx.lineTo(xLineValue, chartArea.bottom);
-                                                       }
-
-                                                       // Need to stroke in the loop because we are potentially changing line widths & colours
-                                                       this.ctx.stroke();
-                                               }
-
-                                               if (this.options.ticks.display) {
-                                                       this.ctx.save();
-                                                       this.ctx.translate(xLabelValue, (isRotated) ? this.top + 12 : this.options.position === "top" ? this.bottom - 10 : this.top + 10);
-                                                       this.ctx.rotate(helpers.toRadians(this.labelRotation) * -1);
-                                                       this.ctx.font = tickLabelFont;
-                                                       this.ctx.textAlign = (isRotated) ? "right" : "center";
-                                                       this.ctx.textBaseline = (isRotated) ? "middle" : this.options.position === "top" ? "bottom" : "top";
-                                                       this.ctx.fillText(label, 0, 0);
-                                                       this.ctx.restore();
-                                               }
-                                       }, this);
-
-                                       if (this.options.scaleLabel.display) {
-                                               // Draw the scale label
-                                               this.ctx.textAlign = "center";
-                                               this.ctx.textBaseline = 'middle';
-                                               this.ctx.fillStyle = scaleLabelFontColor; // render in correct colour
-                                               this.ctx.font = scaleLabelFont;
-
-                                               scaleLabelX = this.left + ((this.right - this.left) / 2); // midpoint of the width
-                                               scaleLabelY = this.options.position === 'bottom' ? this.bottom - (scaleLabelFontSize / 2) : this.top + (scaleLabelFontSize / 2);
-
-                                               this.ctx.fillText(this.options.scaleLabel.labelString, scaleLabelX, scaleLabelY);
-                                       }
-
-                               } else {
-                                       setContextLineSettings = true;
-                                       var xTickStart = this.options.position === "right" ? this.left : this.right - 5;
-                                       var xTickEnd = this.options.position === "right" ? this.left + 5 : this.right;
-
-                                       helpers.each(this.ticks, function(label, index) {
-                                               // If the callback returned a null or undefined value, do not draw this line
-                                               if (label === undefined || label === null) {
-                                                       return;
-                                               }
-
-                                               var yLineValue = this.getPixelForTick(index); // xvalues for grid lines
-
-                                               if (this.options.gridLines.display) {
-                                                       if (index === (typeof this.zeroLineIndex !== 'undefined' ? this.zeroLineIndex : 0)) {
-                                                               // Draw the first index specially
-                                                               this.ctx.lineWidth = this.options.gridLines.zeroLineWidth;
-                                                               this.ctx.strokeStyle = this.options.gridLines.zeroLineColor;
-                                                               setContextLineSettings = true; // reset next time
-                                                       } else if (setContextLineSettings) {
-                                                               this.ctx.lineWidth = this.options.gridLines.lineWidth;
-                                                               this.ctx.strokeStyle = this.options.gridLines.color;
-                                                               setContextLineSettings = false;
-                                                       }
-
-                                                       yLineValue += helpers.aliasPixel(this.ctx.lineWidth);
-
-                                                       // Draw the label area
-                                                       this.ctx.beginPath();
-
-                                                       if (this.options.gridLines.drawTicks) {
-                                                               this.ctx.moveTo(xTickStart, yLineValue);
-                                                               this.ctx.lineTo(xTickEnd, yLineValue);
-                                                       }
-
-                                                       // Draw the chart area
-                                                       if (this.options.gridLines.drawOnChartArea) {
-                                                               this.ctx.moveTo(chartArea.left, yLineValue);
-                                                               this.ctx.lineTo(chartArea.right, yLineValue);
-                                                       }
-
-                                                       // Need to stroke in the loop because we are potentially changing line widths & colours
-                                                       this.ctx.stroke();
-                                               }
-
-                                               if (this.options.ticks.display) {
-                                                       var xLabelValue;
-                                                       var yLabelValue = this.getPixelForTick(index, this.options.gridLines.offsetGridLines); // x values for ticks (need to consider offsetLabel option)
-
-                                                       this.ctx.save();
-
-                                                       if (this.options.position === "left") {
-                                                               if (this.options.ticks.mirror) {
-                                                                       xLabelValue = this.right + this.options.ticks.padding;
-                                                                       this.ctx.textAlign = "left";
-                                                               } else {
-                                                                       xLabelValue = this.right - this.options.ticks.padding;
-                                                                       this.ctx.textAlign = "right";
-                                                               }
-                                                       } else {
-                                                               // right side
-                                                               if (this.options.ticks.mirror) {
-                                                                       xLabelValue = this.left - this.options.ticks.padding;
-                                                                       this.ctx.textAlign = "right";
-                                                               } else {
-                                                                       xLabelValue = this.left + this.options.ticks.padding;
-                                                                       this.ctx.textAlign = "left";
-                                                               }
-                                                       }
-
-                                                       this.ctx.translate(xLabelValue, yLabelValue);
-                                                       this.ctx.rotate(helpers.toRadians(this.labelRotation) * -1);
-                                                       this.ctx.font = tickLabelFont;
-                                                       this.ctx.textBaseline = "middle";
-                                                       this.ctx.fillText(label, 0, 0);
-                                                       this.ctx.restore();
-                                               }
-                                       }, this);
-
-                                       if (this.options.scaleLabel.display) {
-                                               // Draw the scale label
-                                               scaleLabelX = this.options.position === 'left' ? this.left + (scaleLabelFontSize / 2) : this.right - (scaleLabelFontSize / 2);
-                                               scaleLabelY = this.top + ((this.bottom - this.top) / 2);
-                                               var rotation = this.options.position === 'left' ? -0.5 * Math.PI : 0.5 * Math.PI;
-
-                                               this.ctx.save();
-                                               this.ctx.translate(scaleLabelX, scaleLabelY);
-                                               this.ctx.rotate(rotation);
-                                               this.ctx.textAlign = "center";
-                                               this.ctx.fillStyle =scaleLabelFontColor; // render in correct colour
-                                               this.ctx.font = scaleLabelFont;
-                                               this.ctx.textBaseline = 'middle';
-                                               this.ctx.fillText(this.options.scaleLabel.labelString, 0, 0);
-                                               this.ctx.restore();
-                                       }
-                               }
-
-                               // Draw the line at the edge of the axis
-                               this.ctx.lineWidth = this.options.gridLines.lineWidth;
-                               this.ctx.strokeStyle = this.options.gridLines.color;
-                               var x1 = this.left,
-                                       x2 = this.right,
-                                       y1 = this.top,
-                                       y2 = this.bottom;
-
-                               if (this.isHorizontal()) {
-                                       y1 = y2 = this.options.position === 'top' ? this.bottom : this.top;
-                                       y1 += helpers.aliasPixel(this.ctx.lineWidth);
-                                       y2 += helpers.aliasPixel(this.ctx.lineWidth);
-                               } else {
-                                       x1 = x2 = this.options.position === 'left' ? this.right : this.left;
-                                       x1 += helpers.aliasPixel(this.ctx.lineWidth);
-                                       x2 += helpers.aliasPixel(this.ctx.lineWidth);
-                               }
-
-                               this.ctx.beginPath();
-                               this.ctx.moveTo(x1, y1);
-                               this.ctx.lineTo(x2, y2);
-                               this.ctx.stroke();
-                       }
-               }
-       });
-};
-
-},{}],30:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.scaleService = {
-               // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then
-               // use the new chart options to grab the correct scale
-               constructors: {},
-               // Use a registration function so that we can move to an ES6 map when we no longer need to support
-               // old browsers
-
-               // Scale config defaults
-               defaults: {},
-               registerScaleType: function(type, scaleConstructor, defaults) {
-                       this.constructors[type] = scaleConstructor;
-                       this.defaults[type] = helpers.clone(defaults);
-               },
-               getScaleConstructor: function(type) {
-                       return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;
-               },
-               getScaleDefaults: function(type) {
-                       // Return the scale defaults merged with the global settings so that we always use the latest ones
-                       return this.defaults.hasOwnProperty(type) ? helpers.scaleMerge(Chart.defaults.scale, this.defaults[type]) : {};
-               },
-               addScalesToLayout: function(chartInstance) {
-                       // Adds each scale to the chart.boxes array to be sized accordingly
-                       helpers.each(chartInstance.scales, function(scale) {
-                               Chart.layoutService.addBox(chartInstance, scale);
-                       });
-               }
-       };
-};
-},{}],31:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.global.title = {
-               display: false,
-               position: 'top',
-               fullWidth: true, // marks that this box should take the full width of the canvas (pushing down other boxes)
-
-               fontStyle: 'bold',
-               padding: 10,
-
-               // actual title
-               text: ''
-       };
-
-       Chart.Title = Chart.Element.extend({
-
-               initialize: function(config) {
-                       helpers.extend(this, config);
-                       this.options = helpers.configMerge(Chart.defaults.global.title, config.options);
-
-                       // Contains hit boxes for each dataset (in dataset order)
-                       this.legendHitBoxes = [];
-               },
-
-               // These methods are ordered by lifecyle. Utilities then follow.
-
-               beforeUpdate: helpers.noop,
-               update: function(maxWidth, maxHeight, margins) {
-
-                       // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)
-                       this.beforeUpdate();
-
-                       // Absorb the master measurements
-                       this.maxWidth = maxWidth;
-                       this.maxHeight = maxHeight;
-                       this.margins = margins;
-
-                       // Dimensions
-                       this.beforeSetDimensions();
-                       this.setDimensions();
-                       this.afterSetDimensions();
-                       // Labels
-                       this.beforeBuildLabels();
-                       this.buildLabels();
-                       this.afterBuildLabels();
-
-                       // Fit
-                       this.beforeFit();
-                       this.fit();
-                       this.afterFit();
-                       //
-                       this.afterUpdate();
-
-                       return this.minSize;
-
-               },
-               afterUpdate: helpers.noop,
-
-               //
-
-               beforeSetDimensions: helpers.noop,
-               setDimensions: function() {
-                       // Set the unconstrained dimension before label rotation
-                       if (this.isHorizontal()) {
-                               // Reset position before calculating rotation
-                               this.width = this.maxWidth;
-                               this.left = 0;
-                               this.right = this.width;
-                       } else {
-                               this.height = this.maxHeight;
-
-                               // Reset position before calculating rotation
-                               this.top = 0;
-                               this.bottom = this.height;
-                       }
-
-                       // Reset padding
-                       this.paddingLeft = 0;
-                       this.paddingTop = 0;
-                       this.paddingRight = 0;
-                       this.paddingBottom = 0;
-
-                       // Reset minSize
-                       this.minSize = {
-                               width: 0,
-                               height: 0
-                       };
-               },
-               afterSetDimensions: helpers.noop,
-
-               //
-
-               beforeBuildLabels: helpers.noop,
-               buildLabels: helpers.noop,
-               afterBuildLabels: helpers.noop,
-
-               //
-
-               beforeFit: helpers.noop,
-               fit: function() {
-
-                       var ctx = this.ctx;
-                       var fontSize = helpers.getValueOrDefault(this.options.fontSize, Chart.defaults.global.defaultFontSize);
-                       var fontStyle = helpers.getValueOrDefault(this.options.fontStyle, Chart.defaults.global.defaultFontStyle);
-                       var fontFamily = helpers.getValueOrDefault(this.options.fontFamily, Chart.defaults.global.defaultFontFamily);
-                       var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);
-
-                       // Width
-                       if (this.isHorizontal()) {
-                               this.minSize.width = this.maxWidth; // fill all the width
-                       } else {
-                               this.minSize.width = 0;
-                       }
-
-                       // height
-                       if (this.isHorizontal()) {
-                               this.minSize.height = 0;
-                       } else {
-                               this.minSize.height = this.maxHeight; // fill all the height
-                       }
-
-                       // Increase sizes here
-                       if (this.isHorizontal()) {
-
-                               // Title
-                               if (this.options.display) {
-                                       this.minSize.height += fontSize + (this.options.padding * 2);
-                               }
-                       } else {
-                               if (this.options.display) {
-                                       this.minSize.width += fontSize + (this.options.padding * 2);
-                               }
-                       }
-
-                       this.width = this.minSize.width;
-                       this.height = this.minSize.height;
-
-               },
-               afterFit: helpers.noop,
-
-               // Shared Methods
-               isHorizontal: function() {
-                       return this.options.position === "top" || this.options.position === "bottom";
-               },
-
-               // Actualy draw the title block on the canvas
-               draw: function() {
-                       if (this.options.display) {
-                               var ctx = this.ctx;
-                               var titleX, titleY;
-
-                               var fontColor = helpers.getValueOrDefault(this.options.fontColor, Chart.defaults.global.defaultFontColor);
-                               var fontSize = helpers.getValueOrDefault(this.options.fontSize, Chart.defaults.global.defaultFontSize);
-                               var fontStyle = helpers.getValueOrDefault(this.options.fontStyle, Chart.defaults.global.defaultFontStyle);
-                               var fontFamily = helpers.getValueOrDefault(this.options.fontFamily, Chart.defaults.global.defaultFontFamily);
-                               var titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);
-
-                               ctx.fillStyle = fontColor; // render in correct colour
-                               ctx.font = titleFont;
-
-                               // Horizontal
-                               if (this.isHorizontal()) {
-                                       // Title
-                                       ctx.textAlign = "center";
-                                       ctx.textBaseline = 'middle';
-
-                                       titleX = this.left + ((this.right - this.left) / 2); // midpoint of the width
-                                       titleY = this.top + ((this.bottom - this.top) / 2); // midpoint of the height
-
-                                       ctx.fillText(this.options.text, titleX, titleY);
-                               } else {
-
-                                       // Title
-                                       titleX = this.options.position === 'left' ? this.left + (fontSize / 2) : this.right - (fontSize / 2);
-                                       titleY = this.top + ((this.bottom - this.top) / 2);
-                                       var rotation = this.options.position === 'left' ? -0.5 * Math.PI : 0.5 * Math.PI;
-
-                                       ctx.save();
-                                       ctx.translate(titleX, titleY);
-                                       ctx.rotate(rotation);
-                                       ctx.textAlign = "center";
-                                       ctx.textBaseline = 'middle';
-                                       ctx.fillText(this.options.text, 0, 0);
-                                       ctx.restore();
-                               }
-                       }
-               }
-       });
-};
-},{}],32:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.global.tooltips = {
-               enabled: true,
-               custom: null,
-               mode: 'single',
-               backgroundColor: "rgba(0,0,0,0.8)",
-               titleFontStyle: "bold",
-               titleSpacing: 2,
-               titleMarginBottom: 6,
-               titleColor: "#fff",
-               titleAlign: "left",
-               bodySpacing: 2,
-               bodyColor: "#fff",
-               bodyAlign: "left",
-               footerFontStyle: "bold",
-               footerSpacing: 2,
-               footerMarginTop: 6,
-               footerColor: "#fff",
-               footerAlign: "left",
-               yPadding: 6,
-               xPadding: 6,
-               yAlign : 'center',
-               xAlign : 'center',
-               caretSize: 5,
-               cornerRadius: 6,
-               multiKeyBackground: '#fff',
-               callbacks: {
-                       // Args are: (tooltipItems, data)
-                       beforeTitle: helpers.noop,
-                       title: function(tooltipItems, data) {
-                               // Pick first xLabel for now
-                               var title = '';
-
-                               if (tooltipItems.length > 0) {
-                                       if (tooltipItems[0].xLabel) {
-                                               title = tooltipItems[0].xLabel;
-                                       } else if (data.labels.length > 0 && tooltipItems[0].index < data.labels.length) {
-                                               title = data.labels[tooltipItems[0].index];
-                                       }
-                               }
-
-                               return title;
-                       },
-                       afterTitle: helpers.noop,
-
-                       // Args are: (tooltipItems, data)
-                       beforeBody: helpers.noop,
-
-                       // Args are: (tooltipItem, data)
-                       beforeLabel: helpers.noop,
-                       label: function(tooltipItem, data) {
-                               var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';
-                               return datasetLabel + ': ' + tooltipItem.yLabel;
-                       },
-                       afterLabel: helpers.noop,
-
-                       // Args are: (tooltipItems, data)
-                       afterBody: helpers.noop,
-
-                       // Args are: (tooltipItems, data)
-                       beforeFooter: helpers.noop,
-                       footer: helpers.noop,
-                       afterFooter: helpers.noop
-               }
-       };
-
-       // Helper to push or concat based on if the 2nd parameter is an array or not
-       function pushOrConcat(base, toPush) {
-               if (toPush) {
-                       if (helpers.isArray(toPush)) {
-                               base = base.concat(toPush);
-                       } else {
-                               base.push(toPush);
-                       }
-               }
-
-               return base;
-       }
-
-       Chart.Tooltip = Chart.Element.extend({
-               initialize: function() {
-                       var options = this._options;
-                       helpers.extend(this, {
-                               _model: {
-                                       // Positioning
-                                       xPadding: options.tooltips.xPadding,
-                                       yPadding: options.tooltips.yPadding,
-                                       xAlign : options.tooltips.yAlign,
-                                       yAlign : options.tooltips.xAlign,
-
-                                       // Body
-                                       bodyColor: options.tooltips.bodyColor,
-                                       _bodyFontFamily: helpers.getValueOrDefault(options.tooltips.bodyFontFamily, Chart.defaults.global.defaultFontFamily),
-                                       _bodyFontStyle: helpers.getValueOrDefault(options.tooltips.bodyFontStyle, Chart.defaults.global.defaultFontStyle),
-                                       _bodyAlign: options.tooltips.bodyAlign,
-                                       bodyFontSize: helpers.getValueOrDefault(options.tooltips.bodyFontSize, Chart.defaults.global.defaultFontSize),
-                                       bodySpacing: options.tooltips.bodySpacing,
-
-                                       // Title
-                                       titleColor: options.tooltips.titleColor,
-                                       _titleFontFamily: helpers.getValueOrDefault(options.tooltips.titleFontFamily, Chart.defaults.global.defaultFontFamily),
-                                       _titleFontStyle: helpers.getValueOrDefault(options.tooltips.titleFontStyle, Chart.defaults.global.defaultFontStyle),
-                                       titleFontSize: helpers.getValueOrDefault(options.tooltips.titleFontSize, Chart.defaults.global.defaultFontSize),
-                                       _titleAlign: options.tooltips.titleAlign,
-                                       titleSpacing: options.tooltips.titleSpacing,
-                                       titleMarginBottom: options.tooltips.titleMarginBottom,
-
-                                       // Footer
-                                       footerColor: options.tooltips.footerColor,
-                                       _footerFontFamily: helpers.getValueOrDefault(options.tooltips.footerFontFamily, Chart.defaults.global.defaultFontFamily),
-                                       _footerFontStyle: helpers.getValueOrDefault(options.tooltips.footerFontStyle, Chart.defaults.global.defaultFontStyle),
-                                       footerFontSize: helpers.getValueOrDefault(options.tooltips.footerFontSize, Chart.defaults.global.defaultFontSize),
-                                       _footerAlign: options.tooltips.footerAlign,
-                                       footerSpacing: options.tooltips.footerSpacing,
-                                       footerMarginTop: options.tooltips.footerMarginTop,
-
-                                       // Appearance
-                                       caretSize: options.tooltips.caretSize,
-                                       cornerRadius: options.tooltips.cornerRadius,
-                                       backgroundColor: options.tooltips.backgroundColor,
-                                       opacity: 0,
-                                       legendColorBackground: options.tooltips.multiKeyBackground
-                               }
-                       });
-               },
-
-               // Get the title
-               // Args are: (tooltipItem, data)
-               getTitle: function() {
-                       var beforeTitle = this._options.tooltips.callbacks.beforeTitle.apply(this, arguments),
-                               title = this._options.tooltips.callbacks.title.apply(this, arguments),
-                               afterTitle = this._options.tooltips.callbacks.afterTitle.apply(this, arguments);
-
-                       var lines = [];
-                       lines = pushOrConcat(lines, beforeTitle);
-                       lines = pushOrConcat(lines, title);
-                       lines = pushOrConcat(lines, afterTitle);
-
-                       return lines;
-               },
-
-               // Args are: (tooltipItem, data)
-               getBeforeBody: function() {
-                       var lines = this._options.tooltips.callbacks.beforeBody.apply(this, arguments);
-                       return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];
-               },
-
-               // Args are: (tooltipItem, data)
-               getBody: function(tooltipItems, data) {
-                       var lines = [];
-
-                       helpers.each(tooltipItems, function(bodyItem) {
-                               helpers.pushAllIfDefined(this._options.tooltips.callbacks.beforeLabel.call(this, bodyItem, data), lines);
-                               helpers.pushAllIfDefined(this._options.tooltips.callbacks.label.call(this, bodyItem, data), lines);
-                               helpers.pushAllIfDefined(this._options.tooltips.callbacks.afterLabel.call(this, bodyItem, data), lines);
-                       }, this);
-
-                       return lines;
-               },
-
-               // Args are: (tooltipItem, data)
-               getAfterBody: function() {
-                       var lines = this._options.tooltips.callbacks.afterBody.apply(this, arguments);
-                       return helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];
-               },
-
-               // Get the footer and beforeFooter and afterFooter lines
-               // Args are: (tooltipItem, data)
-               getFooter: function() {
-                       var beforeFooter = this._options.tooltips.callbacks.beforeFooter.apply(this, arguments);
-                       var footer = this._options.tooltips.callbacks.footer.apply(this, arguments);
-                       var afterFooter = this._options.tooltips.callbacks.afterFooter.apply(this, arguments);
-
-                       var lines = [];
-                       lines = pushOrConcat(lines, beforeFooter);
-                       lines = pushOrConcat(lines, footer);
-                       lines = pushOrConcat(lines, afterFooter);
-
-                       return lines;
-               },
-
-               getAveragePosition: function(elements) {
-
-                       if (!elements.length) {
-                               return false;
-                       }
-
-                       var xPositions = [];
-                       var yPositions = [];
-
-                       helpers.each(elements, function(el) {
-                               if (el) {
-                                       var pos = el.tooltipPosition();
-                                       xPositions.push(pos.x);
-                                       yPositions.push(pos.y);
-                               }
-                       });
-
-                       var x = 0,
-                               y = 0;
-                       for (var i = 0; i < xPositions.length; i++) {
-                               x += xPositions[i];
-                               y += yPositions[i];
-                       }
-
-                       return {
-                               x: Math.round(x / xPositions.length),
-                               y: Math.round(y / xPositions.length)
-                       };
-
-               },
-
-               update: function(changed) {
-                       if (this._active.length) {
-                               this._model.opacity = 1;
-
-                               var element = this._active[0],
-                                       labelColors = [],
-                                       tooltipPosition;
-
-                               var tooltipItems = [];
-
-                               if (this._options.tooltips.mode === 'single') {
-                                       var yScale = element._yScale || element._scale; // handle radar || polarArea charts
-                                       tooltipItems.push({
-                                               xLabel: element._xScale ? element._xScale.getLabelForIndex(element._index, element._datasetIndex) : '',
-                                               yLabel: yScale ? yScale.getLabelForIndex(element._index, element._datasetIndex) : '',
-                                               index: element._index,
-                                               datasetIndex: element._datasetIndex
-                                       });
-                                       tooltipPosition = this.getAveragePosition(this._active);
-                               } else {
-                                       helpers.each(this._data.datasets, function(dataset, datasetIndex) {
-                                               if (!helpers.isDatasetVisible(dataset)) {
-                                                       return;
-                                               }
-                                               var currentElement = dataset.metaData[element._index];
-                                               if (currentElement) {
-                                                       var yScale = element._yScale || element._scale; // handle radar || polarArea charts
-
-                                                       tooltipItems.push({
-                                                               xLabel: currentElement._xScale ? currentElement._xScale.getLabelForIndex(currentElement._index, currentElement._datasetIndex) : '',
-                                                               yLabel: yScale ? yScale.getLabelForIndex(currentElement._index, currentElement._datasetIndex) : '',
-                                                               index: element._index,
-                                                               datasetIndex: datasetIndex
-                                                       });
-                                               }
-                                       }, null, element._yScale.options.stacked);
-
-                                       helpers.each(this._active, function(active) {
-                                               if (active) {
-                                                       labelColors.push({
-                                                               borderColor: active._view.borderColor,
-                                                               backgroundColor: active._view.backgroundColor
-                                                       });
-                                               }
-                                       }, null, element._yScale.options.stacked);
-
-                                       tooltipPosition = this.getAveragePosition(this._active);
-                                       tooltipPosition.y = this._active[0]._yScale.getPixelForDecimal(0.5);
-                               }
-
-                               // Build the Text Lines
-                               helpers.extend(this._model, {
-                                       title: this.getTitle(tooltipItems, this._data),
-                                       beforeBody: this.getBeforeBody(tooltipItems, this._data),
-                                       body: this.getBody(tooltipItems, this._data),
-                                       afterBody: this.getAfterBody(tooltipItems, this._data),
-                                       footer: this.getFooter(tooltipItems, this._data)
-                               });
-
-                               helpers.extend(this._model, {
-                                       x: Math.round(tooltipPosition.x),
-                                       y: Math.round(tooltipPosition.y),
-                                       caretPadding: helpers.getValueOrDefault(tooltipPosition.padding, 2),
-                                       labelColors: labelColors
-                               });
-
-                               // We need to determine alignment of
-                               var tooltipSize = this.getTooltipSize(this._model);
-                               this.determineAlignment(tooltipSize); // Smart Tooltip placement to stay on the canvas
-
-                               helpers.extend(this._model, this.getBackgroundPoint(this._model, tooltipSize));
-                       } else {
-                               this._model.opacity = 0;
-                       }
-
-                       if (changed && this._options.tooltips.custom) {
-                               this._options.tooltips.custom.call(this, this._model);
-                       }
-
-                       return this;
-               },
-               getTooltipSize: function getTooltipSize(vm) {
-                       var ctx = this._chart.ctx;
-
-                       var size = {
-                               height: vm.yPadding * 2, // Tooltip Padding
-                               width: 0
-                       };
-                       var combinedBodyLength = vm.body.length + vm.beforeBody.length + vm.afterBody.length;
-
-                       size.height += vm.title.length * vm.titleFontSize; // Title Lines
-                       size.height += (vm.title.length - 1) * vm.titleSpacing; // Title Line Spacing
-                       size.height += vm.title.length ? vm.titleMarginBottom : 0; // Title's bottom Margin
-                       size.height += combinedBodyLength * vm.bodyFontSize; // Body Lines
-                       size.height += combinedBodyLength ? (combinedBodyLength - 1) * vm.bodySpacing : 0; // Body Line Spacing
-                       size.height += vm.footer.length ? vm.footerMarginTop : 0; // Footer Margin
-                       size.height += vm.footer.length * (vm.footerFontSize); // Footer Lines
-                       size.height += vm.footer.length ? (vm.footer.length - 1) * vm.footerSpacing : 0; // Footer Line Spacing
-
-                       // Width
-                       ctx.font = helpers.fontString(vm.titleFontSize, vm._titleFontStyle, vm._titleFontFamily);
-                       helpers.each(vm.title, function(line) {
-                               size.width = Math.max(size.width, ctx.measureText(line).width);
-                       });
-
-                       ctx.font = helpers.fontString(vm.bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);
-                       helpers.each(vm.beforeBody.concat(vm.afterBody), function(line) {
-                               size.width = Math.max(size.width, ctx.measureText(line).width);
-                       });
-                       helpers.each(vm.body, function(line) {
-                               size.width = Math.max(size.width, ctx.measureText(line).width + (this._options.tooltips.mode !== 'single' ? (vm.bodyFontSize + 2) : 0));
-                       }, this);
-
-                       ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);
-                       helpers.each(vm.footer, function(line) {
-                               size.width = Math.max(size.width, ctx.measureText(line).width);
-                       });
-                       size.width += 2 * vm.xPadding;
-
-                       return size;
-               },
-               determineAlignment: function determineAlignment(size) {
-                       if (this._model.y < size.height) {
-                               this._model.yAlign = 'top';
-                       } else if (this._model.y > (this._chart.height - size.height)) {
-                               this._model.yAlign = 'bottom';
-                       }
-
-                       var lf, rf; // functions to determine left, right alignment
-                       var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart
-                       var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges
-                       var _this = this;
-                       var midX = (this._chartInstance.chartArea.left + this._chartInstance.chartArea.right) / 2;
-                       var midY = (this._chartInstance.chartArea.top + this._chartInstance.chartArea.bottom) / 2;
-
-                       if (this._model.yAlign === 'center') {
-                               lf = function(x) {
-                                       return x <= midX;
-                               };
-                               rf = function(x) {
-                                       return x > midX;
-                               };
-                       } else {
-                               lf = function(x) {
-                                       return x <= (size.width / 2);
-                               };
-                               rf = function(x) {
-                                       return x >= (_this._chart.width - (size.width / 2));
-                               };
-                       }
-
-                       olf = function(x) {
-                               return x + size.width > _this._chart.width;
-                       };
-                       orf = function(x) {
-                               return x - size.width < 0;
-                       };
-                       yf = function(y) {
-                               return y <= midY ? 'top' : 'bottom';
-                       };
-
-                       if (lf(this._model.x)) {
-                               this._model.xAlign = 'left';
-
-                               // Is tooltip too wide and goes over the right side of the chart.?
-                               if (olf(this._model.x)) {
-                                       this._model.xAlign = 'center';
-                                       this._model.yAlign = yf(this._model.y);
-                               }
-                       } else if (rf(this._model.x)) {
-                               this._model.xAlign = 'right';
-
-                               // Is tooltip too wide and goes outside left edge of canvas?
-                               if (orf(this._model.x)) {
-                                       this._model.xAlign = 'center';
-                                       this._model.yAlign = yf(this._model.y);
-                               }
-                       }
-               },
-               getBackgroundPoint: function getBackgroundPoint(vm, size) {
-                       // Background Position
-                       var pt = {
-                               x: vm.x,
-                               y: vm.y
-                       };
-
-                       if (vm.xAlign === 'right') {
-                               pt.x -= size.width;
-                       } else if (vm.xAlign === 'center') {
-                               pt.x -= (size.width / 2);
-                       }
-
-                       if (vm.yAlign === 'top') {
-                               pt.y += vm.caretPadding + vm.caretSize;
-                       } else if (vm.yAlign === 'bottom') {
-                               pt.y -= size.height + vm.caretPadding + vm.caretSize;
-                       } else {
-                               pt.y -= (size.height / 2);
-                       }
-
-                       if (vm.yAlign === 'center') {
-                               if (vm.xAlign === 'left') {
-                                       pt.x += vm.caretPadding + vm.caretSize;
-                               } else if (vm.xAlign === 'right') {
-                                       pt.x -= vm.caretPadding + vm.caretSize;
-                               }
-                       } else {
-                               if (vm.xAlign === 'left') {
-                                       pt.x -= vm.cornerRadius + vm.caretPadding;
-                               } else if (vm.xAlign === 'right') {
-                                       pt.x += vm.cornerRadius + vm.caretPadding;
-                               }
-                       }
-
-                       return pt;
-               },
-               drawCaret: function drawCaret(tooltipPoint, size, opacity, caretPadding) {
-                       var vm = this._view;
-                       var ctx = this._chart.ctx;
-                       var x1, x2, x3;
-                       var y1, y2, y3;
-
-                       if (vm.yAlign === 'center') {
-                               // Left or right side
-                               if (vm.xAlign === 'left') {
-                                       x1 = tooltipPoint.x;
-                                       x2 = x1 - vm.caretSize;
-                                       x3 = x1;
-                               } else {
-                                       x1 = tooltipPoint.x + size.width;
-                                       x2 = x1 + vm.caretSize;
-                                       x3 = x1;
-                               }
-
-                               y2 = tooltipPoint.y + (size.height / 2);
-                               y1 = y2 - vm.caretSize;
-                               y3 = y2 + vm.caretSize;
-                       } else {
-                               if (vm.xAlign === 'left') {
-                                       x1 = tooltipPoint.x + vm.cornerRadius;
-                                       x2 = x1 + vm.caretSize;
-                                       x3 = x2 + vm.caretSize;
-                               } else if (vm.xAlign === 'right') {
-                                       x1 = tooltipPoint.x + size.width - vm.cornerRadius;
-                                       x2 = x1 - vm.caretSize;
-                                       x3 = x2 - vm.caretSize;
-                               } else {
-                                       x2 = tooltipPoint.x + (size.width / 2);
-                                       x1 = x2 - vm.caretSize;
-                                       x3 = x2 + vm.caretSize;
-                               }
-
-                               if (vm.yAlign === 'top') {
-                                       y1 = tooltipPoint.y;
-                                       y2 = y1 - vm.caretSize;
-                                       y3 = y1;
-                               } else {
-                                       y1 = tooltipPoint.y + size.height;
-                                       y2 = y1 + vm.caretSize;
-                                       y3 = y1;
-                               }
-                       }
-
-                       var bgColor = helpers.color(vm.backgroundColor);
-                       ctx.fillStyle = bgColor.alpha(opacity * bgColor.alpha()).rgbString();
-                       ctx.beginPath();
-                       ctx.moveTo(x1, y1);
-                       ctx.lineTo(x2, y2);
-                       ctx.lineTo(x3, y3);
-                       ctx.closePath();
-                       ctx.fill();
-               },
-               drawTitle: function drawTitle(pt, vm, ctx, opacity) {
-                       if (vm.title.length) {
-                               ctx.textAlign = vm._titleAlign;
-                               ctx.textBaseline = "top";
-                               
-                               var titleColor = helpers.color(vm.titleColor);
-                               ctx.fillStyle = titleColor.alpha(opacity * titleColor.alpha()).rgbString();
-                               ctx.font = helpers.fontString(vm.titleFontSize, vm._titleFontStyle, vm._titleFontFamily);
-
-                               helpers.each(vm.title, function(title, i) {
-                                       ctx.fillText(title, pt.x, pt.y);
-                                       pt.y += vm.titleFontSize + vm.titleSpacing; // Line Height and spacing
-
-                                       if (i + 1 === vm.title.length) {
-                                               pt.y += vm.titleMarginBottom - vm.titleSpacing; // If Last, add margin, remove spacing
-                                       }
-                               });
-                       }
-               },
-               drawBody: function drawBody(pt, vm, ctx, opacity) {
-                       ctx.textAlign = vm._bodyAlign;
-                       ctx.textBaseline = "top";
-
-                       var bodyColor = helpers.color(vm.bodyColor);
-                       ctx.fillStyle = bodyColor.alpha(opacity * bodyColor.alpha()).rgbString();
-                       ctx.font = helpers.fontString(vm.bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);
-
-                       // Before Body
-                       helpers.each(vm.beforeBody, function(beforeBody) {
-                               ctx.fillText(beforeBody, pt.x, pt.y);
-                               pt.y += vm.bodyFontSize + vm.bodySpacing;
-                       });
-
-                       helpers.each(vm.body, function(body, i) {
-                               // Draw Legend-like boxes if needed
-                               if (this._options.tooltips.mode !== 'single') {
-                                       // Fill a white rect so that colours merge nicely if the opacity is < 1
-                                       ctx.fillStyle = helpers.color(vm.legendColorBackground).alpha(opacity).rgbaString();
-                                       ctx.fillRect(pt.x, pt.y, vm.bodyFontSize, vm.bodyFontSize);
-
-                                       // Border
-                                       ctx.strokeStyle = helpers.color(vm.labelColors[i].borderColor).alpha(opacity).rgbaString();
-                                       ctx.strokeRect(pt.x, pt.y, vm.bodyFontSize, vm.bodyFontSize);
-
-                                       // Inner square
-                                       ctx.fillStyle = helpers.color(vm.labelColors[i].backgroundColor).alpha(opacity).rgbaString();
-                                       ctx.fillRect(pt.x + 1, pt.y + 1, vm.bodyFontSize - 2, vm.bodyFontSize - 2);
-
-                                       ctx.fillStyle = helpers.color(vm.bodyColor).alpha(opacity).rgbaString(); // Return fill style for text
-                               }
-
-                               // Body Line
-                               ctx.fillText(body, pt.x + (this._options.tooltips.mode !== 'single' ? (vm.bodyFontSize + 2) : 0), pt.y);
-
-                               pt.y += vm.bodyFontSize + vm.bodySpacing;
-                       }, this);
-
-                       // After Body
-                       helpers.each(vm.afterBody, function(afterBody) {
-                               ctx.fillText(afterBody, pt.x, pt.y);
-                               pt.y += vm.bodyFontSize;
-                       });
-
-                       pt.y -= vm.bodySpacing; // Remove last body spacing
-               },
-               drawFooter: function drawFooter(pt, vm, ctx, opacity) {
-                       if (vm.footer.length) {
-                               pt.y += vm.footerMarginTop;
-
-                               ctx.textAlign = vm._footerAlign;
-                               ctx.textBaseline = "top";
-                               
-                               var footerColor = helpers.color(vm.footerColor);
-                               ctx.fillStyle = footerColor.alpha(opacity * footerColor.alpha()).rgbString();
-                               ctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);
-
-                               helpers.each(vm.footer, function(footer) {
-                                       ctx.fillText(footer, pt.x, pt.y);
-                                       pt.y += vm.footerFontSize + vm.footerSpacing;
-                               });
-                       }
-               },
-               draw: function draw() {
-                       var ctx = this._chart.ctx;
-                       var vm = this._view;
-
-                       if (vm.opacity === 0) {
-                               return;
-                       }
-
-                       var caretPadding = vm.caretPadding;
-                       var tooltipSize = this.getTooltipSize(vm);
-                       var pt = {
-                               x: vm.x,
-                               y: vm.y
-                       };
-
-                       // IE11/Edge does not like very small opacities, so snap to 0
-                       var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;
-
-                       if (this._options.tooltips.enabled) {
-                               // Draw Background
-                               var bgColor = helpers.color(vm.backgroundColor);
-                               ctx.fillStyle = bgColor.alpha(opacity * bgColor.alpha()).rgbString();
-                               helpers.drawRoundedRectangle(ctx, pt.x, pt.y, tooltipSize.width, tooltipSize.height, vm.cornerRadius);
-                               ctx.fill();
-
-                               // Draw Caret
-                               this.drawCaret(pt, tooltipSize, opacity, caretPadding);
-
-                               // Draw Title, Body, and Footer
-                               pt.x += vm.xPadding;
-                               pt.y += vm.yPadding;
-
-                               // Titles
-                               this.drawTitle(pt, vm, ctx, opacity);
-
-                               // Body
-                               this.drawBody(pt, vm, ctx, opacity);
-
-                               // Footer
-                               this.drawFooter(pt, vm, ctx, opacity);
-                       }
-               }
-       });
-};
-
-},{}],33:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart, moment) {
-
-  var helpers = Chart.helpers;
-
-  Chart.defaults.global.elements.arc = {
-    backgroundColor: Chart.defaults.global.defaultColor,
-    borderColor: "#fff",
-    borderWidth: 2
-  };
-
-  Chart.elements.Arc = Chart.Element.extend({
-    inLabelRange: function(mouseX) {
-      var vm = this._view;
-
-      if (vm) {
-        return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));
-      } else {
-        return false;
-      }
-    },
-    inRange: function(chartX, chartY) {
-
-      var vm = this._view;
-
-      if (vm) {
-        var pointRelativePosition = helpers.getAngleFromPoint(vm, {
-          x: chartX,
-          y: chartY
-        });
-
-        //Sanitise angle range
-        var startAngle = vm.startAngle;
-        var endAngle = vm.endAngle;
-        while (endAngle < startAngle) {
-          endAngle += 2.0 * Math.PI;
-        }
-        while (pointRelativePosition.angle > endAngle) {
-          pointRelativePosition.angle -= 2.0 * Math.PI;
-        }
-        while (pointRelativePosition.angle < startAngle) {
-          pointRelativePosition.angle += 2.0 * Math.PI;
-        }
-
-        //Check if within the range of the open/close angle
-        var betweenAngles = (pointRelativePosition.angle >= startAngle && pointRelativePosition.angle <= endAngle),
-          withinRadius = (pointRelativePosition.distance >= vm.innerRadius && pointRelativePosition.distance <= vm.outerRadius);
-
-        return (betweenAngles && withinRadius);
-      } else {
-        return false;
-      }
-    },
-    tooltipPosition: function() {
-      var vm = this._view;
-
-      var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2),
-        rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;
-      return {
-        x: vm.x + (Math.cos(centreAngle) * rangeFromCentre),
-        y: vm.y + (Math.sin(centreAngle) * rangeFromCentre)
-      };
-    },
-    draw: function() {
-
-      var ctx = this._chart.ctx;
-      var vm = this._view;
-
-      ctx.beginPath();
-
-      ctx.arc(vm.x, vm.y, vm.outerRadius, vm.startAngle, vm.endAngle);
-
-      ctx.arc(vm.x, vm.y, vm.innerRadius, vm.endAngle, vm.startAngle, true);
-
-      ctx.closePath();
-      ctx.strokeStyle = vm.borderColor;
-      ctx.lineWidth = vm.borderWidth;
-
-      ctx.fillStyle = vm.backgroundColor;
-
-      ctx.fill();
-      ctx.lineJoin = 'bevel';
-
-      if (vm.borderWidth) {
-        ctx.stroke();
-      }
-    }
-  });
-};
-
-},{}],34:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.global.elements.line = {
-               tension: 0.4,
-               backgroundColor: Chart.defaults.global.defaultColor,
-               borderWidth: 3,
-               borderColor: Chart.defaults.global.defaultColor,
-               borderCapStyle: 'butt',
-               borderDash: [],
-               borderDashOffset: 0.0,
-               borderJoinStyle: 'miter',
-               fill: true // do we fill in the area between the line and its base axis
-       };
-
-       Chart.elements.Line = Chart.Element.extend({
-               lineToNextPoint: function(previousPoint, point, nextPoint, skipHandler, previousSkipHandler) {
-                       var ctx = this._chart.ctx;
-
-                       if (point._view.skip) {
-                               skipHandler.call(this, previousPoint, point, nextPoint);
-                       } else if (previousPoint._view.skip) {
-                               previousSkipHandler.call(this, previousPoint, point, nextPoint);
-                       } else if (point._view.tension === 0) {
-                               ctx.lineTo(point._view.x, point._view.y);
-                       } else {
-                               // Line between points
-                               ctx.bezierCurveTo(
-                                       previousPoint._view.controlPointNextX,
-                                       previousPoint._view.controlPointNextY,
-                                       point._view.controlPointPreviousX,
-                                       point._view.controlPointPreviousY,
-                                       point._view.x,
-                                       point._view.y
-                               );
-                       }
-               },
-
-               draw: function() {
-                       var _this = this;
-
-                       var vm = this._view;
-                       var ctx = this._chart.ctx;
-                       var first = this._children[0];
-                       var last = this._children[this._children.length - 1];
-
-                       function loopBackToStart(drawLineToCenter) {
-                               if (!first._view.skip && !last._view.skip) {
-                                       // Draw a bezier line from last to first
-                                       ctx.bezierCurveTo(
-                                               last._view.controlPointNextX,
-                                               last._view.controlPointNextY,
-                                               first._view.controlPointPreviousX,
-                                               first._view.controlPointPreviousY,
-                                               first._view.x,
-                                               first._view.y
-                                       );
-                               } else if (drawLineToCenter) {
-                                       // Go to center
-                                       ctx.lineTo(_this._view.scaleZero.x, _this._view.scaleZero.y);
-                               }
-                       }
-
-                       ctx.save();
-
-                       // If we had points and want to fill this line, do so.
-                       if (this._children.length > 0 && vm.fill) {
-                               // Draw the background first (so the border is always on top)
-                               ctx.beginPath();
-
-                               helpers.each(this._children, function(point, index) {
-                                       var previous = helpers.previousItem(this._children, index);
-                                       var next = helpers.nextItem(this._children, index);
-
-                                       // First point moves to it's starting position no matter what
-                                       if (index === 0) {
-                                               if (this._loop) {
-                                                       ctx.moveTo(vm.scaleZero.x, vm.scaleZero.y);
-                                               } else {
-                                                       ctx.moveTo(point._view.x, vm.scaleZero);
-                                               }
-
-                                               if (point._view.skip) {
-                                                       if (!this._loop) {
-                                                               ctx.moveTo(next._view.x, this._view.scaleZero);
-                                                       }
-                                               } else {
-                                                       ctx.lineTo(point._view.x, point._view.y);
-                                               }
-                                       } else {
-                                               this.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {
-                                                       if (this._loop) {
-                                                               // Go to center
-                                                               ctx.lineTo(this._view.scaleZero.x, this._view.scaleZero.y);
-                                                       } else {
-                                                               ctx.lineTo(previousPoint._view.x, this._view.scaleZero);
-                                                               ctx.moveTo(nextPoint._view.x, this._view.scaleZero);
-                                                       }
-                                               }, function(previousPoint, point) {
-                                                       // If we skipped the last point, draw a line to ourselves so that the fill is nice
-                                                       ctx.lineTo(point._view.x, point._view.y);
-                                               });
-                                       }
-                               }, this);
-
-                               // For radial scales, loop back around to the first point
-                               if (this._loop) {
-                                       loopBackToStart(true);
-                               } else {
-                                       //Round off the line by going to the base of the chart, back to the start, then fill.
-                                       ctx.lineTo(this._children[this._children.length - 1]._view.x, vm.scaleZero);
-                                       ctx.lineTo(this._children[0]._view.x, vm.scaleZero);
-                               }
-
-                               ctx.fillStyle = vm.backgroundColor || Chart.defaults.global.defaultColor;
-                               ctx.closePath();
-                               ctx.fill();
-                       }
-
-                       // Now draw the line between all the points with any borders
-                       ctx.lineCap = vm.borderCapStyle || Chart.defaults.global.elements.line.borderCapStyle;
-
-                       // IE 9 and 10 do not support line dash
-                       if (ctx.setLineDash) {
-                               ctx.setLineDash(vm.borderDash || Chart.defaults.global.elements.line.borderDash);
-                       }
-
-                       ctx.lineDashOffset = vm.borderDashOffset || Chart.defaults.global.elements.line.borderDashOffset;
-                       ctx.lineJoin = vm.borderJoinStyle || Chart.defaults.global.elements.line.borderJoinStyle;
-                       ctx.lineWidth = vm.borderWidth || Chart.defaults.global.elements.line.borderWidth;
-                       ctx.strokeStyle = vm.borderColor || Chart.defaults.global.defaultColor;
-                       ctx.beginPath();
-
-                       helpers.each(this._children, function(point, index) {
-                               var previous = helpers.previousItem(this._children, index);
-                               var next = helpers.nextItem(this._children, index);
-
-                               if (index === 0) {
-                                       ctx.moveTo(point._view.x, point._view.y);
-                               } else {
-                                       this.lineToNextPoint(previous, point, next, function(previousPoint, point, nextPoint) {
-                                               ctx.moveTo(nextPoint._view.x, nextPoint._view.y);
-                                       }, function(previousPoint, point) {
-                                               // If we skipped the last point, move up to our point preventing a line from being drawn
-                                               ctx.moveTo(point._view.x, point._view.y);
-                                       });
-                               }
-                       }, this);
-
-                       if (this._loop && this._children.length > 0) {
-                               loopBackToStart();
-                       }
-
-                       ctx.stroke();
-                       ctx.restore();
-               }
-       });
-};
-},{}],35:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.global.elements.point = {
-               radius: 3,
-               pointStyle: 'circle',
-               backgroundColor: Chart.defaults.global.defaultColor,
-               borderWidth: 1,
-               borderColor: Chart.defaults.global.defaultColor,
-               // Hover
-               hitRadius: 1,
-               hoverRadius: 4,
-               hoverBorderWidth: 1
-       };
-
-
-       Chart.elements.Point = Chart.Element.extend({
-               inRange: function(mouseX, mouseY) {
-                       var vm = this._view;
-
-                       if (vm) {
-                               var hoverRange = vm.hitRadius + vm.radius;
-                               return ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(hoverRange, 2));
-                       } else {
-                               return false;
-                       }
-               },
-               inLabelRange: function(mouseX) {
-                       var vm = this._view;
-
-                       if (vm) {
-                               return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2));
-                       } else {
-                               return false;
-                       }
-               },
-               tooltipPosition: function() {
-                       var vm = this._view;
-                       return {
-                               x: vm.x,
-                               y: vm.y,
-                               padding: vm.radius + vm.borderWidth
-                       };
-               },
-               draw: function() {
-
-                       var vm = this._view;
-                       var ctx = this._chart.ctx;
-
-
-                       if (vm.skip) {
-                               return;
-                       }
-
-                       if (typeof vm.pointStyle === 'object' && ((vm.pointStyle.toString() === '[object HTMLImageElement]') || (vm.pointStyle.toString() === '[object HTMLCanvasElement]'))) {
-                               ctx.drawImage(vm.pointStyle, vm.x - vm.pointStyle.width / 2, vm.y - vm.pointStyle.height / 2);
-                               return;
-                       }
-
-                       if (!isNaN(vm.radius) && vm.radius > 0) {
-
-                               ctx.strokeStyle = vm.borderColor || Chart.defaults.global.defaultColor;
-                               ctx.lineWidth = helpers.getValueOrDefault(vm.borderWidth, Chart.defaults.global.elements.point.borderWidth);
-
-                               ctx.fillStyle = vm.backgroundColor || Chart.defaults.global.defaultColor;
-
-                               var radius = vm.radius;
-
-                               var xOffset;
-                               var yOffset;
-
-                               switch (vm.pointStyle) {
-                                       // Default includes circle
-                                       default: ctx.beginPath();
-                                       ctx.arc(vm.x, vm.y, radius, 0, Math.PI * 2);
-                                       ctx.closePath();
-                                       ctx.fill();
-                                       break;
-                                       case 'triangle':
-                                                       ctx.beginPath();
-                                               var edgeLength = 3 * radius / Math.sqrt(3);
-                                               var height = edgeLength * Math.sqrt(3) / 2;
-                                               ctx.moveTo(vm.x - edgeLength / 2, vm.y + height / 3);
-                                               ctx.lineTo(vm.x + edgeLength / 2, vm.y + height / 3);
-                                               ctx.lineTo(vm.x, vm.y - 2 * height / 3);
-                                               ctx.closePath();
-                                               ctx.fill();
-                                               break;
-                                       case 'rect':
-                                                       ctx.fillRect(vm.x - 1 / Math.SQRT2 * radius, vm.y - 1 / Math.SQRT2 * radius, 2 / Math.SQRT2 * radius, 2 / Math.SQRT2 * radius);
-                                               ctx.strokeRect(vm.x - 1 / Math.SQRT2 * radius, vm.y - 1 / Math.SQRT2 * radius, 2 / Math.SQRT2 * radius, 2 / Math.SQRT2 * radius);
-                                               break;
-                                       case 'rectRot':
-                                                       ctx.translate(vm.x, vm.y);
-                                               ctx.rotate(Math.PI / 4);
-                                               ctx.fillRect(-1 / Math.SQRT2 * radius, -1 / Math.SQRT2 * radius, 2 / Math.SQRT2 * radius, 2 / Math.SQRT2 * radius);
-                                               ctx.strokeRect(-1 / Math.SQRT2 * radius, -1 / Math.SQRT2 * radius, 2 / Math.SQRT2 * radius, 2 / Math.SQRT2 * radius);
-                                               ctx.setTransform(1, 0, 0, 1, 0, 0);
-                                               break;
-                                       case 'cross':
-                                                       ctx.beginPath();
-                                               ctx.moveTo(vm.x, vm.y + radius);
-                                               ctx.lineTo(vm.x, vm.y - radius);
-                                               ctx.moveTo(vm.x - radius, vm.y);
-                                               ctx.lineTo(vm.x + radius, vm.y);
-                                               ctx.closePath();
-                                               break;
-                                       case 'crossRot':
-                                                       ctx.beginPath();
-                                               xOffset = Math.cos(Math.PI / 4) * radius;
-                                               yOffset = Math.sin(Math.PI / 4) * radius;
-                                               ctx.moveTo(vm.x - xOffset, vm.y - yOffset);
-                                               ctx.lineTo(vm.x + xOffset, vm.y + yOffset);
-                                               ctx.moveTo(vm.x - xOffset, vm.y + yOffset);
-                                               ctx.lineTo(vm.x + xOffset, vm.y - yOffset);
-                                               ctx.closePath();
-                                               break;
-                                       case 'star':
-                                                       ctx.beginPath();
-                                               ctx.moveTo(vm.x, vm.y + radius);
-                                               ctx.lineTo(vm.x, vm.y - radius);
-                                               ctx.moveTo(vm.x - radius, vm.y);
-                                               ctx.lineTo(vm.x + radius, vm.y);
-                                               xOffset = Math.cos(Math.PI / 4) * radius;
-                                               yOffset = Math.sin(Math.PI / 4) * radius;
-                                               ctx.moveTo(vm.x - xOffset, vm.y - yOffset);
-                                               ctx.lineTo(vm.x + xOffset, vm.y + yOffset);
-                                               ctx.moveTo(vm.x - xOffset, vm.y + yOffset);
-                                               ctx.lineTo(vm.x + xOffset, vm.y - yOffset);
-                                               ctx.closePath();
-                                               break;
-                                       case 'line':
-                                                       ctx.beginPath();
-                                               ctx.moveTo(vm.x - radius, vm.y);
-                                               ctx.lineTo(vm.x + radius, vm.y);
-                                               ctx.closePath();
-                                               break;
-                                       case 'dash':
-                                                       ctx.beginPath();
-                                               ctx.moveTo(vm.x, vm.y);
-                                               ctx.lineTo(vm.x + radius, vm.y);
-                                               ctx.closePath();
-                                               break;
-                               }
-
-                               ctx.stroke();
-                       }
-               }
-       });
-};
-},{}],36:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       Chart.defaults.global.elements.rectangle = {
-               backgroundColor: Chart.defaults.global.defaultColor,
-               borderWidth: 0,
-               borderColor: Chart.defaults.global.defaultColor,
-               borderSkipped: 'bottom'
-       };
-
-       Chart.elements.Rectangle = Chart.Element.extend({
-               draw: function() {
-
-                       var ctx = this._chart.ctx;
-                       var vm = this._view;
-
-                       var halfWidth = vm.width / 2,
-                               leftX = vm.x - halfWidth,
-                               rightX = vm.x + halfWidth,
-                               top = vm.base - (vm.base - vm.y),
-                               halfStroke = vm.borderWidth / 2;
-
-                       // Canvas doesn't allow us to stroke inside the width so we can
-                       // adjust the sizes to fit if we're setting a stroke on the line
-                       if (vm.borderWidth) {
-                               leftX += halfStroke;
-                               rightX -= halfStroke;
-                               top += halfStroke;
-                       }
-
-                       ctx.beginPath();
-
-                       ctx.fillStyle = vm.backgroundColor;
-                       ctx.strokeStyle = vm.borderColor;
-                       ctx.lineWidth = vm.borderWidth;
-
-                       // Corner points, from bottom-left to bottom-right clockwise
-                       // | 1 2 |
-                       // | 0 3 |
-                       var corners = [
-                               [leftX, vm.base],
-                               [leftX, top],
-                               [rightX, top],
-                               [rightX, vm.base]
-                       ];
-
-                       // Find first (starting) corner with fallback to 'bottom' 
-                       var borders = ['bottom', 'left', 'top', 'right'];
-                       var startCorner = borders.indexOf(vm.borderSkipped, 0);
-                       if (startCorner === -1)
-                               startCorner = 0;
-
-                       function cornerAt(index) {
-                               return corners[(startCorner + index) % 4];
-                       }
-
-                       // Draw rectangle from 'startCorner'
-                       ctx.moveTo.apply(ctx, cornerAt(0));
-                       for (var i = 1; i < 4; i++)
-                               ctx.lineTo.apply(ctx, cornerAt(i));
-
-                       ctx.fill();
-                       if (vm.borderWidth) {
-                               ctx.stroke();
-                       }
-               },
-               height: function() {
-                       var vm = this._view;
-                       return vm.base - vm.y;
-               },
-               inRange: function(mouseX, mouseY) {
-                       var vm = this._view;
-                       var inRange = false;
-
-                       if (vm) {
-                               if (vm.y < vm.base) {
-                                       inRange = (mouseX >= vm.x - vm.width / 2 && mouseX <= vm.x + vm.width / 2) && (mouseY >= vm.y && mouseY <= vm.base);
-                               } else {
-                                       inRange = (mouseX >= vm.x - vm.width / 2 && mouseX <= vm.x + vm.width / 2) && (mouseY >= vm.base && mouseY <= vm.y);
-                               }
-                       }
-
-                       return inRange;
-               },
-               inLabelRange: function(mouseX) {
-                       var vm = this._view;
-
-                       if (vm) {
-                               return (mouseX >= vm.x - vm.width / 2 && mouseX <= vm.x + vm.width / 2);
-                       } else {
-                               return false;
-                       }
-               },
-               tooltipPosition: function() {
-                       var vm = this._view;
-                       return {
-                               x: vm.x,
-                               y: vm.y
-                       };
-               }
-       });
-
-};
-},{}],37:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-       // Default config for a category scale
-       var defaultConfig = {
-               position: "bottom"
-       };
-
-       var DatasetScale = Chart.Scale.extend({
-               buildTicks: function(index) {
-                       this.startIndex = 0;
-                       this.endIndex = this.chart.data.labels.length;
-                       var findIndex;
-
-                       if (this.options.ticks.min !== undefined) {
-                               // user specified min value
-                               findIndex = helpers.indexOf(this.chart.data.labels, this.options.ticks.min);
-                               this.startIndex = findIndex !== -1 ? findIndex : this.startIndex;
-                       }
-
-                       if (this.options.ticks.max !== undefined) {
-                               // user specified max value
-                               findIndex = helpers.indexOf(this.chart.data.labels, this.options.ticks.max);
-                               this.endIndex = findIndex !== -1 ? findIndex : this.endIndex;
-                       }
-
-                       // If we are viewing some subset of labels, slice the original array
-                       this.ticks = (this.startIndex === 0 && this.endIndex === this.chart.data.labels.length) ? this.chart.data.labels : this.chart.data.labels.slice(this.startIndex, this.endIndex + 1);
-               },
-
-               getLabelForIndex: function(index, datasetIndex) {
-                       return this.ticks[index];
-               },
-
-               // Used to get data value locations.  Value can either be an index or a numerical value
-               getPixelForValue: function(value, index, datasetIndex, includeOffset) {
-                       // 1 is added because we need the length but we have the indexes
-                       var offsetAmt = Math.max((this.ticks.length - ((this.options.gridLines.offsetGridLines) ? 0 : 1)), 1);
-
-                       if (this.isHorizontal()) {
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);
-                               var valueWidth = innerWidth / offsetAmt;
-                               var widthOffset = (valueWidth * (index - this.startIndex)) + this.paddingLeft;
-
-                               if (this.options.gridLines.offsetGridLines && includeOffset) {
-                                       widthOffset += (valueWidth / 2);
-                               }
-
-                               return this.left + Math.round(widthOffset);
-                       } else {
-                               var innerHeight = this.height - (this.paddingTop + this.paddingBottom);
-                               var valueHeight = innerHeight / offsetAmt;
-                               var heightOffset = (valueHeight * (index - this.startIndex)) + this.paddingTop;
-
-                               if (this.options.gridLines.offsetGridLines && includeOffset) {
-                                       heightOffset += (valueHeight / 2);
-                               }
-
-                               return this.top + Math.round(heightOffset);
-                       }
-               },
-               getPixelForTick: function(index, includeOffset) {
-                       return this.getPixelForValue(this.ticks[index], index + this.startIndex, null, includeOffset);
-               }
-       });
-
-       Chart.scaleService.registerScaleType("category", DatasetScale, defaultConfig);
-
-};
-},{}],38:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       var defaultConfig = {
-               position: "left",
-               ticks: {
-                       callback: function(tickValue, index, ticks) {
-                               var delta = ticks[1] - ticks[0];
-
-                               // If we have a number like 2.5 as the delta, figure out how many decimal places we need
-                               if (Math.abs(delta) > 1) {
-                                       if (tickValue !== Math.floor(tickValue)) {
-                                               // not an integer
-                                               delta = tickValue - Math.floor(tickValue);
-                                       }
-                               }
-
-                               var logDelta = helpers.log10(Math.abs(delta));
-                               var tickString = '';
-
-                               if (tickValue !== 0) {
-                                       var numDecimal = -1 * Math.floor(logDelta);
-                                       numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places
-                                       tickString = tickValue.toFixed(numDecimal);
-                               } else {
-                                       tickString = '0'; // never show decimal places for 0
-                               }
-
-                               return tickString;
-                       }
-               }
-       };
-
-       var LinearScale = Chart.Scale.extend({
-               determineDataLimits: function() {
-                       // First Calculate the range
-                       this.min = null;
-                       this.max = null;
-
-                       if (this.options.stacked) {
-                               var valuesPerType = {};
-                               var hasPositiveValues = false;
-                               var hasNegativeValues = false;
-
-                               helpers.each(this.chart.data.datasets, function(dataset) {
-                                       if (valuesPerType[dataset.type] === undefined) {
-                                               valuesPerType[dataset.type] = {
-                                                       positiveValues: [],
-                                                       negativeValues: []
-                                               };
-                                       }
-
-                                       // Store these per type
-                                       var positiveValues = valuesPerType[dataset.type].positiveValues;
-                                       var negativeValues = valuesPerType[dataset.type].negativeValues;
-
-                                       if (helpers.isDatasetVisible(dataset) && (this.isHorizontal() ? dataset.xAxisID === this.id : dataset.yAxisID === this.id)) {
-                                               helpers.each(dataset.data, function(rawValue, index) {
-
-                                                       var value = +this.getRightValue(rawValue);
-                                                       if (isNaN(value)) {
-                                                               return;
-                                                       }
-
-                                                       positiveValues[index] = positiveValues[index] || 0;
-                                                       negativeValues[index] = negativeValues[index] || 0;
-
-                                                       if (this.options.relativePoints) {
-                                                               positiveValues[index] = 100;
-                                                       } else {
-                                                               if (value < 0) {
-                                                                       hasNegativeValues = true;
-                                                                       negativeValues[index] += value;
-                                                               } else {
-                                                                       hasPositiveValues = true;
-                                                                       positiveValues[index] += value;
-                                                               }
-                                                       }
-                                               }, this);
-                                       }
-                               }, this);
-
-                               helpers.each(valuesPerType, function(valuesForType) {
-                                       var values = valuesForType.positiveValues.concat(valuesForType.negativeValues);
-                                       var minVal = helpers.min(values);
-                                       var maxVal = helpers.max(values);
-                                       this.min = this.min === null ? minVal : Math.min(this.min, minVal);
-                                       this.max = this.max === null ? maxVal : Math.max(this.max, maxVal);
-                               }, this);
-
-                       } else {
-                               helpers.each(this.chart.data.datasets, function(dataset) {
-                                       if (helpers.isDatasetVisible(dataset) && (this.isHorizontal() ? dataset.xAxisID === this.id : dataset.yAxisID === this.id)) {
-                                               helpers.each(dataset.data, function(rawValue, index) {
-                                                       var value = +this.getRightValue(rawValue);
-                                                       if (isNaN(value)) {
-                                                               return;
-                                                       }
-
-                                                       if (this.min === null) {
-                                                               this.min = value;
-                                                       } else if (value < this.min) {
-                                                               this.min = value;
-                                                       }
-
-                                                       if (this.max === null) {
-                                                               this.max = value;
-                                                       } else if (value > this.max) {
-                                                               this.max = value;
-                                                       }
-                                               }, this);
-                                       }
-                               }, this);
-                       }
-
-                       // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,
-                       // do nothing since that would make the chart weird. If the user really wants a weird chart
-                       // axis, they can manually override it
-                       if (this.options.ticks.beginAtZero) {
-                               var minSign = helpers.sign(this.min);
-                               var maxSign = helpers.sign(this.max);
-
-                               if (minSign < 0 && maxSign < 0) {
-                                       // move the top up to 0
-                                       this.max = 0;
-                               } else if (minSign > 0 && maxSign > 0) {
-                                       // move the botttom down to 0
-                                       this.min = 0;
-                               }
-                       }
-
-                       if (this.options.ticks.min !== undefined) {
-                               this.min = this.options.ticks.min;
-                       } else if (this.options.ticks.suggestedMin !== undefined) {
-                               this.min = Math.min(this.min, this.options.ticks.suggestedMin);
-                       }
-
-                       if (this.options.ticks.max !== undefined) {
-                               this.max = this.options.ticks.max;
-                       } else if (this.options.ticks.suggestedMax !== undefined) {
-                               this.max = Math.max(this.max, this.options.ticks.suggestedMax);
-                       }
-
-                       if (this.min === this.max) {
-                               this.min--;
-                               this.max++;
-                       }
-               },
-               buildTicks: function() {
-
-                       // Then calulate the ticks
-                       this.ticks = [];
-
-                       // Figure out what the max number of ticks we can support it is based on the size of
-                       // the axis area. For now, we say that the minimum tick spacing in pixels must be 50
-                       // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on
-                       // the graph
-
-                       var maxTicks;
-
-                       if (this.isHorizontal()) {
-                               maxTicks = Math.min(this.options.ticks.maxTicksLimit ? this.options.ticks.maxTicksLimit : 11, Math.ceil(this.width / 50));
-                       } else {
-                               // The factor of 2 used to scale the font size has been experimentally determined.
-                               var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);
-                               maxTicks = Math.min(this.options.ticks.maxTicksLimit ? this.options.ticks.maxTicksLimit : 11, Math.ceil(this.height / (2 * tickFontSize)));
-                       }
-
-                       // Make sure we always have at least 2 ticks
-                       maxTicks = Math.max(2, maxTicks);
-
-                       // To get a "nice" value for the tick spacing, we will use the appropriately named
-                       // "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks
-                       // for details.
-
-                       var spacing;
-                       var fixedStepSizeSet = (this.options.ticks.fixedStepSize && this.options.ticks.fixedStepSize > 0) || (this.options.ticks.stepSize && this.options.ticks.stepSize > 0);
-                       if (fixedStepSizeSet) {
-                               spacing = helpers.getValueOrDefault(this.options.ticks.fixedStepSize, this.options.ticks.stepSize);
-                       } else {
-                               var niceRange = helpers.niceNum(this.max - this.min, false);
-                               spacing = helpers.niceNum(niceRange / (maxTicks - 1), true);
-                       }
-                       var niceMin = Math.floor(this.min / spacing) * spacing;
-                       var niceMax = Math.ceil(this.max / spacing) * spacing;
-                       var numSpaces = (niceMax - niceMin) / spacing;
-
-                       // If very close to our rounded value, use it.
-                       if (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {
-                               numSpaces = Math.round(numSpaces);
-                       } else {
-                               numSpaces = Math.ceil(numSpaces);
-                       }
-
-                       // Put the values into the ticks array
-                       this.ticks.push(this.options.ticks.min !== undefined ? this.options.ticks.min : niceMin);
-                       for (var j = 1; j < numSpaces; ++j) {
-                               this.ticks.push(niceMin + (j * spacing));
-                       }
-                       this.ticks.push(this.options.ticks.max !== undefined ? this.options.ticks.max : niceMax);
-
-                       if (this.options.position === "left" || this.options.position === "right") {
-                               // We are in a vertical orientation. The top value is the highest. So reverse the array
-                               this.ticks.reverse();
-                       }
-
-                       // At this point, we need to update our max and min given the tick values since we have expanded the
-                       // range of the scale
-                       this.max = helpers.max(this.ticks);
-                       this.min = helpers.min(this.ticks);
-
-                       if (this.options.ticks.reverse) {
-                               this.ticks.reverse();
-
-                               this.start = this.max;
-                               this.end = this.min;
-                       } else {
-                               this.start = this.min;
-                               this.end = this.max;
-                       }
-               },
-               getLabelForIndex: function(index, datasetIndex) {
-                       return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
-               },
-               convertTicksToLabels: function() {
-                       this.ticksAsNumbers = this.ticks.slice();
-                       this.zeroLineIndex = this.ticks.indexOf(0);
-
-                       Chart.Scale.prototype.convertTicksToLabels.call(this);
-               },
-               // Utils
-               getPixelForValue: function(value, index, datasetIndex, includeOffset) {
-                       // This must be called after fit has been run so that
-                       //      this.left, this.top, this.right, and this.bottom have been defined
-                       var rightValue = +this.getRightValue(value);
-                       var pixel;
-                       var range = this.end - this.start;
-
-                       if (this.isHorizontal()) {
-                               var innerWidth = this.width - (this.paddingLeft + this.paddingRight);
-                               pixel = this.left + (innerWidth / range * (rightValue - this.start));
-                               return Math.round(pixel + this.paddingLeft);
-                       } else {
-                               var innerHeight = this.height - (this.paddingTop + this.paddingBottom);
-                               pixel = (this.bottom - this.paddingBottom) - (innerHeight / range * (rightValue - this.start));
-                               return Math.round(pixel);
-                       }
-               },
-               getPixelForTick: function(index, includeOffset) {
-                       return this.getPixelForValue(this.ticksAsNumbers[index], null, null, includeOffset);
-               }
-       });
-       Chart.scaleService.registerScaleType("linear", LinearScale, defaultConfig);
-
-};
-},{}],39:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       var defaultConfig = {
-               position: "left",
-
-               // label settings
-               ticks: {
-                       callback: function(value, index, arr) {
-                               var remain = value / (Math.pow(10, Math.floor(Chart.helpers.log10(value))));
-
-                               if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === arr.length - 1) {
-                                       return value.toExponential();
-                               } else {
-                                       return '';
-                               }
-                       }
-               }
-       };
-
-       var LogarithmicScale = Chart.Scale.extend({
-               determineDataLimits: function() {
-                       // Calculate Range
-                       this.min = null;
-                       this.max = null;
-
-                       if (this.options.stacked) {
-                               var valuesPerType = {};
-
-                               helpers.each(this.chart.data.datasets, function(dataset) {
-                                       if (helpers.isDatasetVisible(dataset) && (this.isHorizontal() ? dataset.xAxisID === this.id : dataset.yAxisID === this.id)) {
-                                               if (valuesPerType[dataset.type] === undefined) {
-                                                       valuesPerType[dataset.type] = [];
-                                               }
-
-                                               helpers.each(dataset.data, function(rawValue, index) {
-                                                       var values = valuesPerType[dataset.type];
-                                                       var value = +this.getRightValue(rawValue);
-                                                       if (isNaN(value)) {
-                                                               return;
-                                                       }
-
-                                                       values[index] = values[index] || 0;
-
-                                                       if (this.options.relativePoints) {
-                                                               values[index] = 100;
-                                                       } else {
-                                                               // Don't need to split positive and negative since the log scale can't handle a 0 crossing
-                                                               values[index] += value;
-                                                       }
-                                               }, this);
-                                       }
-                               }, this);
-
-                               helpers.each(valuesPerType, function(valuesForType) {
-                                       var minVal = helpers.min(valuesForType);
-                                       var maxVal = helpers.max(valuesForType);
-                                       this.min = this.min === null ? minVal : Math.min(this.min, minVal);
-                                       this.max = this.max === null ? maxVal : Math.max(this.max, maxVal);
-                               }, this);
-
-                       } else {
-                               helpers.each(this.chart.data.datasets, function(dataset) {
-                                       if (helpers.isDatasetVisible(dataset) && (this.isHorizontal() ? dataset.xAxisID === this.id : dataset.yAxisID === this.id)) {
-                                               helpers.each(dataset.data, function(rawValue, index) {
-                                                       var value = +this.getRightValue(rawValue);
-                                                       if (isNaN(value)) {
-                                                               return;
-                                                       }
-
-                                                       if (this.min === null) {
-                                                               this.min = value;
-                                                       } else if (value < this.min) {
-                                                               this.min = value;
-                                                       }
-
-                                                       if (this.max === null) {
-                                                               this.max = value;
-                                                       } else if (value > this.max) {
-                                                               this.max = value;
-                                                       }
-                                               }, this);
-                                       }
-                               }, this);
-                       }
-
-                       this.min = this.options.ticks.min !== undefined ? this.options.ticks.min : this.min;
-                       this.max = this.options.ticks.max !== undefined ? this.options.ticks.max : this.max;
-
-                       if (this.min === this.max) {
-                               if (this.min !== 0 && this.min !== null) {
-                                       this.min = Math.pow(10, Math.floor(helpers.log10(this.min)) - 1);
-                                       this.max = Math.pow(10, Math.floor(helpers.log10(this.max)) + 1);
-                               } else {
-                                       this.min = 1;
-                                       this.max = 10;
-                               }
-                       }
-               },
-               buildTicks: function() {
-                       // Reset the ticks array. Later on, we will draw a grid line at these positions
-                       // The array simply contains the numerical value of the spots where ticks will be
-                       this.ticks = [];
-
-                       // Figure out what the max number of ticks we can support it is based on the size of
-                       // the axis area. For now, we say that the minimum tick spacing in pixels must be 50
-                       // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on
-                       // the graph
-
-                       var tickVal = this.options.ticks.min !== undefined ? this.options.ticks.min : Math.pow(10, Math.floor(helpers.log10(this.min)));
-
-                       while (tickVal < this.max) {
-                               this.ticks.push(tickVal);
-
-                               var exp = Math.floor(helpers.log10(tickVal));
-                               var significand = Math.floor(tickVal / Math.pow(10, exp)) + 1;
-
-                               if (significand === 10) {
-                                       significand = 1;
-                                       ++exp;
-                               }
-
-                               tickVal = significand * Math.pow(10, exp);
-                       }
-
-                       var lastTick = this.options.ticks.max !== undefined ? this.options.ticks.max : tickVal;
-                       this.ticks.push(lastTick);
-
-                       if (this.options.position === "left" || this.options.position === "right") {
-                               // We are in a vertical orientation. The top value is the highest. So reverse the array
-                               this.ticks.reverse();
-                       }
-
-                       // At this point, we need to update our max and min given the tick values since we have expanded the
-                       // range of the scale
-                       this.max = helpers.max(this.ticks);
-                       this.min = helpers.min(this.ticks);
-
-                       if (this.options.ticks.reverse) {
-                               this.ticks.reverse();
-
-                               this.start = this.max;
-                               this.end = this.min;
-                       } else {
-                               this.start = this.min;
-                               this.end = this.max;
-                       }
-               },
-               convertTicksToLabels: function() {
-                       this.tickValues = this.ticks.slice();
-
-                       Chart.Scale.prototype.convertTicksToLabels.call(this);
-               },
-               // Get the correct tooltip label
-               getLabelForIndex: function(index, datasetIndex) {
-                       return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
-               },
-               getPixelForTick: function(index, includeOffset) {
-                       return this.getPixelForValue(this.tickValues[index], null, null, includeOffset);
-               },
-               getPixelForValue: function(value, index, datasetIndex, includeOffset) {
-                       var pixel;
-
-                       var newVal = +this.getRightValue(value);
-                       var range = helpers.log10(this.end) - helpers.log10(this.start);
-
-                       if (this.isHorizontal()) {
-
-                               if (newVal === 0) {
-                                       pixel = this.left + this.paddingLeft;
-                               } else {
-                                       var innerWidth = this.width - (this.paddingLeft + this.paddingRight);
-                                       pixel = this.left + (innerWidth / range * (helpers.log10(newVal) - helpers.log10(this.start)));
-                                       pixel += this.paddingLeft;
-                               }
-                       } else {
-                               // Bottom - top since pixels increase downard on a screen
-                               if (newVal === 0) {
-                                       pixel = this.top + this.paddingTop;
-                               } else {
-                                       var innerHeight = this.height - (this.paddingTop + this.paddingBottom);
-                                       pixel = (this.bottom - this.paddingBottom) - (innerHeight / range * (helpers.log10(newVal) - helpers.log10(this.start)));
-                               }
-                       }
-
-                       return pixel;
-               }
-
-       });
-       Chart.scaleService.registerScaleType("logarithmic", LogarithmicScale, defaultConfig);
-
-};
-},{}],40:[function(require,module,exports){
-"use strict";
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-
-       var defaultConfig = {
-               display: true,
-
-               //Boolean - Whether to animate scaling the chart from the centre
-               animate: true,
-               lineArc: false,
-               position: "chartArea",
-
-               angleLines: {
-                       display: true,
-                       color: "rgba(0, 0, 0, 0.1)",
-                       lineWidth: 1
-               },
-
-               // label settings
-               ticks: {
-                       //Boolean - Show a backdrop to the scale label
-                       showLabelBackdrop: true,
-
-                       //String - The colour of the label backdrop
-                       backdropColor: "rgba(255,255,255,0.75)",
-
-                       //Number - The backdrop padding above & below the label in pixels
-                       backdropPaddingY: 2,
-
-                       //Number - The backdrop padding to the side of the label in pixels
-                       backdropPaddingX: 2
-               },
-
-               pointLabels: {
-                       //Number - Point label font size in pixels
-                       fontSize: 10,
-
-                       //Function - Used to convert point labels
-                       callback: function(label) {
-                               return label;
-                       }
-               }
-       };
-
-       var LinearRadialScale = Chart.Scale.extend({
-               getValueCount: function() {
-                       return this.chart.data.labels.length;
-               },
-               setDimensions: function() {
-                       // Set the unconstrained dimension before label rotation
-                       this.width = this.maxWidth;
-                       this.height = this.maxHeight;
-                       this.xCenter = Math.round(this.width / 2);
-                       this.yCenter = Math.round(this.height / 2);
-
-                       var minSize = helpers.min([this.height, this.width]);
-                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);
-                       this.drawingArea = (this.options.display) ? (minSize / 2) - (tickFontSize / 2 + this.options.ticks.backdropPaddingY) : (minSize / 2);
-               },
-               determineDataLimits: function() {
-                       this.min = null;
-                       this.max = null;
-
-                       helpers.each(this.chart.data.datasets, function(dataset) {
-                               if (helpers.isDatasetVisible(dataset)) {
-                                       helpers.each(dataset.data, function(rawValue, index) {
-                                               var value = +this.getRightValue(rawValue);
-                                               if (isNaN(value)) {
-                                                       return;
-                                               }
-
-                                               if (this.min === null) {
-                                                       this.min = value;
-                                               } else if (value < this.min) {
-                                                       this.min = value;
-                                               }
-
-                                               if (this.max === null) {
-                                                       this.max = value;
-                                               } else if (value > this.max) {
-                                                       this.max = value;
-                                               }
-                                       }, this);
-                               }
-                       }, this);
-
-                       // If we are forcing it to begin at 0, but 0 will already be rendered on the chart,
-                       // do nothing since that would make the chart weird. If the user really wants a weird chart
-                       // axis, they can manually override it
-                       if (this.options.ticks.beginAtZero) {
-                               var minSign = helpers.sign(this.min);
-                               var maxSign = helpers.sign(this.max);
-
-                               if (minSign < 0 && maxSign < 0) {
-                                       // move the top up to 0
-                                       this.max = 0;
-                               } else if (minSign > 0 && maxSign > 0) {
-                                       // move the botttom down to 0
-                                       this.min = 0;
-                               }
-                       }
-
-                       if (this.options.ticks.min !== undefined) {
-                               this.min = this.options.ticks.min;
-                       } else if (this.options.ticks.suggestedMin !== undefined) {
-                               this.min = Math.min(this.min, this.options.ticks.suggestedMin);
-                       }
-
-                       if (this.options.ticks.max !== undefined) {
-                               this.max = this.options.ticks.max;
-                       } else if (this.options.ticks.suggestedMax !== undefined) {
-                               this.max = Math.max(this.max, this.options.ticks.suggestedMax);
-                       }
-
-                       if (this.min === this.max) {
-                               this.min--;
-                               this.max++;
-                       }
-               },
-               buildTicks: function() {
-
-
-                       this.ticks = [];
-
-                       // Figure out what the max number of ticks we can support it is based on the size of
-                       // the axis area. For now, we say that the minimum tick spacing in pixels must be 50
-                       // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on
-                       // the graph
-                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);
-                       var maxTicks = Math.min(this.options.ticks.maxTicksLimit ? this.options.ticks.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));
-                       maxTicks = Math.max(2, maxTicks); // Make sure we always have at least 2 ticks
-
-                       // To get a "nice" value for the tick spacing, we will use the appropriately named
-                       // "nice number" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks
-                       // for details.
-
-                       var niceRange = helpers.niceNum(this.max - this.min, false);
-                       var spacing = helpers.niceNum(niceRange / (maxTicks - 1), true);
-                       var niceMin = Math.floor(this.min / spacing) * spacing;
-                       var niceMax = Math.ceil(this.max / spacing) * spacing;
-
-                       var numSpaces = Math.ceil((niceMax - niceMin) / spacing);
-
-                       // Put the values into the ticks array
-                       this.ticks.push(this.options.ticks.min !== undefined ? this.options.ticks.min : niceMin);
-                       for (var j = 1; j < numSpaces; ++j) {
-                               this.ticks.push(niceMin + (j * spacing));
-                       }
-                       this.ticks.push(this.options.ticks.max !== undefined ? this.options.ticks.max : niceMax);
-
-                       // At this point, we need to update our max and min given the tick values since we have expanded the
-                       // range of the scale
-                       this.max = helpers.max(this.ticks);
-                       this.min = helpers.min(this.ticks);
-
-                       if (this.options.ticks.reverse) {
-                               this.ticks.reverse();
-
-                               this.start = this.max;
-                               this.end = this.min;
-                       } else {
-                               this.start = this.min;
-                               this.end = this.max;
-                       }
-
-                       this.zeroLineIndex = this.ticks.indexOf(0);
-               },
-               convertTicksToLabels: function() {
-                       Chart.Scale.prototype.convertTicksToLabels.call(this);
-
-                       // Point labels
-                       this.pointLabels = this.chart.data.labels.map(this.options.pointLabels.callback, this);
-               },
-               getLabelForIndex: function(index, datasetIndex) {
-                       return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
-               },
-               fit: function() {
-                       /*
-                        * Right, this is really confusing and there is a lot of maths going on here
-                        * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9
-                        *
-                        * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif
-                        *
-                        * Solution:
-                        *
-                        * We assume the radius of the polygon is half the size of the canvas at first
-                        * at each index we check if the text overlaps.
-                        *
-                        * Where it does, we store that angle and that index.
-                        *
-                        * After finding the largest index and angle we calculate how much we need to remove
-                        * from the shape radius to move the point inwards by that x.
-                        *
-                        * We average the left and right distances to get the maximum shape radius that can fit in the box
-                        * along with labels.
-                        *
-                        * Once we have that, we can find the centre point for the chart, by taking the x text protrusion
-                        * on each side, removing that from the size, halving it and adding the left x protrusion width.
-                        *
-                        * This will mean we have a shape fitted to the canvas, as large as it can be with the labels
-                        * and position it in the most space efficient manner
-                        *
-                        * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif
-                        */
-
-                       var pointLabelFontSize = helpers.getValueOrDefault(this.options.pointLabels.fontSize, Chart.defaults.global.defaultFontSize);
-                       var pointLabeFontStyle = helpers.getValueOrDefault(this.options.pointLabels.fontStyle, Chart.defaults.global.defaultFontStyle);
-                       var pointLabeFontFamily = helpers.getValueOrDefault(this.options.pointLabels.fontFamily, Chart.defaults.global.defaultFontFamily);
-                       var pointLabeFont = helpers.fontString(pointLabelFontSize, pointLabeFontStyle, pointLabeFontFamily);
-
-                       // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.
-                       // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points
-                       var largestPossibleRadius = helpers.min([(this.height / 2 - pointLabelFontSize - 5), this.width / 2]),
-                               pointPosition,
-                               i,
-                               textWidth,
-                               halfTextWidth,
-                               furthestRight = this.width,
-                               furthestRightIndex,
-                               furthestRightAngle,
-                               furthestLeft = 0,
-                               furthestLeftIndex,
-                               furthestLeftAngle,
-                               xProtrusionLeft,
-                               xProtrusionRight,
-                               radiusReductionRight,
-                               radiusReductionLeft,
-                               maxWidthRadius;
-                       this.ctx.font = pointLabeFont;
-
-                       for (i = 0; i < this.getValueCount(); i++) {
-                               // 5px to space the text slightly out - similar to what we do in the draw function.
-                               pointPosition = this.getPointPosition(i, largestPossibleRadius);
-                               textWidth = this.ctx.measureText(this.pointLabels[i] ? this.pointLabels[i] : '').width + 5;
-                               if (i === 0 || i === this.getValueCount() / 2) {
-                                       // If we're at index zero, or exactly the middle, we're at exactly the top/bottom
-                                       // of the radar chart, so text will be aligned centrally, so we'll half it and compare
-                                       // w/left and right text sizes
-                                       halfTextWidth = textWidth / 2;
-                                       if (pointPosition.x + halfTextWidth > furthestRight) {
-                                               furthestRight = pointPosition.x + halfTextWidth;
-                                               furthestRightIndex = i;
-                                       }
-                                       if (pointPosition.x - halfTextWidth < furthestLeft) {
-                                               furthestLeft = pointPosition.x - halfTextWidth;
-                                               furthestLeftIndex = i;
-                                       }
-                               } else if (i < this.getValueCount() / 2) {
-                                       // Less than half the values means we'll left align the text
-                                       if (pointPosition.x + textWidth > furthestRight) {
-                                               furthestRight = pointPosition.x + textWidth;
-                                               furthestRightIndex = i;
-                                       }
-                               } else if (i > this.getValueCount() / 2) {
-                                       // More than half the values means we'll right align the text
-                                       if (pointPosition.x - textWidth < furthestLeft) {
-                                               furthestLeft = pointPosition.x - textWidth;
-                                               furthestLeftIndex = i;
-                                       }
-                               }
-                       }
-
-                       xProtrusionLeft = furthestLeft;
-                       xProtrusionRight = Math.ceil(furthestRight - this.width);
-
-                       furthestRightAngle = this.getIndexAngle(furthestRightIndex);
-                       furthestLeftAngle = this.getIndexAngle(furthestLeftIndex);
-
-                       radiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI / 2);
-                       radiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI / 2);
-
-                       // Ensure we actually need to reduce the size of the chart
-                       radiusReductionRight = (helpers.isNumber(radiusReductionRight)) ? radiusReductionRight : 0;
-                       radiusReductionLeft = (helpers.isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0;
-
-                       this.drawingArea = Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2);
-                       this.setCenterPoint(radiusReductionLeft, radiusReductionRight);
-               },
-               setCenterPoint: function(leftMovement, rightMovement) {
-
-                       var maxRight = this.width - rightMovement - this.drawingArea,
-                               maxLeft = leftMovement + this.drawingArea;
-
-                       this.xCenter = Math.round(((maxLeft + maxRight) / 2) + this.left);
-                       // Always vertically in the centre as the text height doesn't change
-                       this.yCenter = Math.round((this.height / 2) + this.top);
-               },
-
-               getIndexAngle: function(index) {
-                       var angleMultiplier = (Math.PI * 2) / this.getValueCount();
-                       // Start from the top instead of right, so remove a quarter of the circle
-
-                       return index * angleMultiplier - (Math.PI / 2);
-               },
-               getDistanceFromCenterForValue: function(value) {
-                       if (value === null) {
-                               return 0; // null always in center
-                       }
-
-                       // Take into account half font size + the yPadding of the top value
-                       var scalingFactor = this.drawingArea / (this.max - this.min);
-                       if (this.options.reverse) {
-                               return (this.max - value) * scalingFactor;
-                       } else {
-                               return (value - this.min) * scalingFactor;
-                       }
-               },
-               getPointPosition: function(index, distanceFromCenter) {
-                       var thisAngle = this.getIndexAngle(index);
-                       return {
-                               x: Math.round(Math.cos(thisAngle) * distanceFromCenter) + this.xCenter,
-                               y: Math.round(Math.sin(thisAngle) * distanceFromCenter) + this.yCenter
-                       };
-               },
-               getPointPositionForValue: function(index, value) {
-                       return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));
-               },
-               draw: function() {
-                       if (this.options.display) {
-                               var ctx = this.ctx;
-                               helpers.each(this.ticks, function(label, index) {
-                                       // Don't draw a centre value (if it is minimum)
-                                       if (index > 0 || this.options.reverse) {
-                                               var yCenterOffset = this.getDistanceFromCenterForValue(this.ticks[index]);
-                                               var yHeight = this.yCenter - yCenterOffset;
-
-                                               // Draw circular lines around the scale
-                                               if (this.options.gridLines.display) {
-                                                       ctx.strokeStyle = this.options.gridLines.color;
-                                                       ctx.lineWidth = this.options.gridLines.lineWidth;
-
-                                                       if (this.options.lineArc) {
-                                                               // Draw circular arcs between the points
-                                                               ctx.beginPath();
-                                                               ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI * 2);
-                                                               ctx.closePath();
-                                                               ctx.stroke();
-                                                       } else {
-                                                               // Draw straight lines connecting each index
-                                                               ctx.beginPath();
-                                                               for (var i = 0; i < this.getValueCount(); i++) {
-                                                                       var pointPosition = this.getPointPosition(i, this.getDistanceFromCenterForValue(this.ticks[index]));
-                                                                       if (i === 0) {
-                                                                               ctx.moveTo(pointPosition.x, pointPosition.y);
-                                                                       } else {
-                                                                               ctx.lineTo(pointPosition.x, pointPosition.y);
-                                                                       }
-                                                               }
-                                                               ctx.closePath();
-                                                               ctx.stroke();
-                                                       }
-                                               }
-
-                                               if (this.options.ticks.display) {
-                                                       var tickFontColor = helpers.getValueOrDefault(this.options.ticks.fontColor, Chart.defaults.global.defaultFontColor);
-                                                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);
-                                                       var tickFontStyle = helpers.getValueOrDefault(this.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);
-                                                       var tickFontFamily = helpers.getValueOrDefault(this.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);
-                                                       var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);
-                                                       ctx.font = tickLabelFont;
-
-                                                       if (this.options.ticks.showLabelBackdrop) {
-                                                               var labelWidth = ctx.measureText(label).width;
-                                                               ctx.fillStyle = this.options.ticks.backdropColor;
-                                                               ctx.fillRect(
-                                                                       this.xCenter - labelWidth / 2 - this.options.ticks.backdropPaddingX,
-                                                                       yHeight - tickFontSize / 2 - this.options.ticks.backdropPaddingY,
-                                                                       labelWidth + this.options.ticks.backdropPaddingX * 2,
-                                                                       tickFontSize + this.options.ticks.backdropPaddingY * 2
-                                                               );
-                                                       }
-
-                                                       ctx.textAlign = 'center';
-                                                       ctx.textBaseline = "middle";
-                                                       ctx.fillStyle = tickFontColor;
-                                                       ctx.fillText(label, this.xCenter, yHeight);
-                                               }
-                                       }
-                               }, this);
-
-                               if (!this.options.lineArc) {
-                                       ctx.lineWidth = this.options.angleLines.lineWidth;
-                                       ctx.strokeStyle = this.options.angleLines.color;
-
-                                       for (var i = this.getValueCount() - 1; i >= 0; i--) {
-                                               if (this.options.angleLines.display) {
-                                                       var outerPosition = this.getPointPosition(i, this.getDistanceFromCenterForValue(this.options.reverse ? this.min : this.max));
-                                                       ctx.beginPath();
-                                                       ctx.moveTo(this.xCenter, this.yCenter);
-                                                       ctx.lineTo(outerPosition.x, outerPosition.y);
-                                                       ctx.stroke();
-                                                       ctx.closePath();
-                                               }
-                                               // Extra 3px out for some label spacing
-                                               var pointLabelPosition = this.getPointPosition(i, this.getDistanceFromCenterForValue(this.options.reverse ? this.min : this.max) + 5);
-                                               
-                                               var pointLabelFontColor = helpers.getValueOrDefault(this.options.pointLabels.fontColor, Chart.defaults.global.defaultFontColor);
-                                               var pointLabelFontSize = helpers.getValueOrDefault(this.options.pointLabels.fontSize, Chart.defaults.global.defaultFontSize);
-                                               var pointLabeFontStyle = helpers.getValueOrDefault(this.options.pointLabels.fontStyle, Chart.defaults.global.defaultFontStyle);
-                                               var pointLabeFontFamily = helpers.getValueOrDefault(this.options.pointLabels.fontFamily, Chart.defaults.global.defaultFontFamily);
-                                               var pointLabeFont = helpers.fontString(pointLabelFontSize, pointLabeFontStyle, pointLabeFontFamily);
-
-                                               ctx.font = pointLabeFont;
-                                               ctx.fillStyle = pointLabelFontColor;
-
-                                               var labelsCount = this.pointLabels.length,
-                                                       halfLabelsCount = this.pointLabels.length / 2,
-                                                       quarterLabelsCount = halfLabelsCount / 2,
-                                                       upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount),
-                                                       exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount);
-                                               if (i === 0) {
-                                                       ctx.textAlign = 'center';
-                                               } else if (i === halfLabelsCount) {
-                                                       ctx.textAlign = 'center';
-                                               } else if (i < halfLabelsCount) {
-                                                       ctx.textAlign = 'left';
-                                               } else {
-                                                       ctx.textAlign = 'right';
-                                               }
-
-                                               // Set the correct text baseline based on outer positioning
-                                               if (exactQuarter) {
-                                                       ctx.textBaseline = 'middle';
-                                               } else if (upperHalf) {
-                                                       ctx.textBaseline = 'bottom';
-                                               } else {
-                                                       ctx.textBaseline = 'top';
-                                               }
-
-                                               ctx.fillText(this.pointLabels[i] ? this.pointLabels[i] : '', pointLabelPosition.x, pointLabelPosition.y);
-                                       }
-                               }
-                       }
-               }
-       });
-       Chart.scaleService.registerScaleType("radialLinear", LinearRadialScale, defaultConfig);
-
-};
-},{}],41:[function(require,module,exports){
-/*global window: false */
-"use strict";
-
-var moment = require('moment');
-moment = typeof(moment) === 'function' ? moment : window.moment;
-
-module.exports = function(Chart) {
-
-       var helpers = Chart.helpers;
-       var time = {
-               units: [{
-                       name: 'millisecond',
-                       steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]
-               }, {
-                       name: 'second',
-                       steps: [1, 2, 5, 10, 30]
-               }, {
-                       name: 'minute',
-                       steps: [1, 2, 5, 10, 30]
-               }, {
-                       name: 'hour',
-                       steps: [1, 2, 3, 6, 12]
-               }, {
-                       name: 'day',
-                       steps: [1, 2, 5]
-               }, {
-                       name: 'week',
-                       maxStep: 4
-               }, {
-                       name: 'month',
-                       maxStep: 3
-               }, {
-                       name: 'quarter',
-                       maxStep: 4
-               }, {
-                       name: 'year',
-                       maxStep: false
-               }]
-       };
-
-       var defaultConfig = {
-               position: "bottom",
-
-               time: {
-                       parser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment
-                       format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/
-                       unit: false, // false == automatic or override with week, month, year, etc.
-                       round: false, // none, or override with week, month, year, etc.
-                       displayFormat: false, // DEPRECATED
-
-                       // defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/
-                       displayFormats: {
-                               'millisecond': 'h:mm:ss.SSS a', // 11:20:01.123 AM,
-                               'second': 'h:mm:ss a', // 11:20:01 AM
-                               'minute': 'h:mm:ss a', // 11:20:01 AM
-                               'hour': 'MMM D, hA', // Sept 4, 5PM
-                               'day': 'll', // Sep 4 2015
-                               'week': 'll', // Week 46, or maybe "[W]WW - YYYY" ?
-                               'month': 'MMM YYYY', // Sept 2015
-                               'quarter': '[Q]Q - YYYY', // Q3
-                               'year': 'YYYY' // 2015
-                       }
-               },
-               ticks: {
-                       autoSkip: false
-               }
-       };
-
-       var TimeScale = Chart.Scale.extend({
-               initialize: function() {
-                       if (!moment) {
-                               throw new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');
-                       }
-
-                       Chart.Scale.prototype.initialize.call(this);
-               },
-               getLabelMoment: function(datasetIndex, index) {
-                       return this.labelMoments[datasetIndex][index];
-               },
-               determineDataLimits: function() {
-                       this.labelMoments = [];
-
-                       // Only parse these once. If the dataset does not have data as x,y pairs, we will use
-                       // these
-                       var scaleLabelMoments = [];
-                       if (this.chart.data.labels && this.chart.data.labels.length > 0) {
-                               helpers.each(this.chart.data.labels, function(label, index) {
-                                       var labelMoment = this.parseTime(label);
-                                       if (this.options.time.round) {
-                                               labelMoment.startOf(this.options.time.round);
-                                       }
-                                       scaleLabelMoments.push(labelMoment);
-                               }, this);
-
-                               this.firstTick = moment.min.call(this, scaleLabelMoments);
-                               this.lastTick = moment.max.call(this, scaleLabelMoments);
-                       } else {
-                               this.firstTick = null;
-                               this.lastTick = null;
-                       }
-
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {
-                               var momentsForDataset = [];
-
-                               if (typeof dataset.data[0] === 'object') {
-                                       helpers.each(dataset.data, function(value, index) {
-                                               var labelMoment = this.parseTime(this.getRightValue(value));
-                                               if (this.options.time.round) {
-                                                       labelMoment.startOf(this.options.time.round);
-                                               }
-                                               momentsForDataset.push(labelMoment);
-
-                                               // May have gone outside the scale ranges, make sure we keep the first and last ticks updated
-                                               this.firstTick = this.firstTick !== null ? moment.min(this.firstTick, labelMoment) : labelMoment;
-                                               this.lastTick = this.lastTick !== null ? moment.max(this.lastTick, labelMoment) : labelMoment;
-                                       }, this);
-                               } else {
-                                       // We have no labels. Use the ones from the scale
-                                       momentsForDataset = scaleLabelMoments;
-                               }
-
-                               this.labelMoments.push(momentsForDataset);
-                       }, this);
-
-                       // Set these after we've done all the data
-                       if (this.options.time.min) {
-                               this.firstTick = this.parseTime(this.options.time.min);
-                       }
-
-                       if (this.options.time.max) {
-                               this.lastTick = this.parseTime(this.options.time.max);
-                       }
-
-                       // We will modify these, so clone for later
-                       this.firstTick = (this.firstTick || moment()).clone();
-                       this.lastTick = (this.lastTick || moment()).clone();
-               },
-               buildTicks: function(index) {
-
-                       this.ctx.save();
-                       var tickFontSize = helpers.getValueOrDefault(this.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);
-                       var tickFontStyle = helpers.getValueOrDefault(this.options.ticks.fontStyle, Chart.defaults.global.defaultFontStyle);
-                       var tickFontFamily = helpers.getValueOrDefault(this.options.ticks.fontFamily, Chart.defaults.global.defaultFontFamily);
-                       var tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);
-                       this.ctx.font = tickLabelFont;
-
-                       this.ticks = [];
-                       this.unitScale = 1; // How much we scale the unit by, ie 2 means 2x unit per step
-                       this.scaleSizeInUnits = 0; // How large the scale is in the base unit (seconds, minutes, etc)
-
-                       // Set unit override if applicable
-                       if (this.options.time.unit) {
-                               this.tickUnit = this.options.time.unit || 'day';
-                               this.displayFormat = this.options.time.displayFormats[this.tickUnit];
-                               this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true);
-                               this.unitScale = helpers.getValueOrDefault(this.options.time.unitStepSize, 1);
-                       } else {
-                               // Determine the smallest needed unit of the time
-                               var innerWidth = this.isHorizontal() ? this.width - (this.paddingLeft + this.paddingRight) : this.height - (this.paddingTop + this.paddingBottom);
-
-                               // Crude approximation of what the label length might be
-                               var tempFirstLabel = this.tickFormatFunction(this.firstTick, 0, []);
-                               var tickLabelWidth = this.ctx.measureText(tempFirstLabel).width;
-                               var cosRotation = Math.cos(helpers.toRadians(this.options.ticks.maxRotation));
-                               var sinRotation = Math.sin(helpers.toRadians(this.options.ticks.maxRotation));
-                               tickLabelWidth = (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);
-                               var labelCapacity = innerWidth / (tickLabelWidth);
-
-                               // Start as small as possible
-                               this.tickUnit = 'millisecond';
-                               this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true);
-                               this.displayFormat = this.options.time.displayFormats[this.tickUnit];
-
-                               var unitDefinitionIndex = 0;
-                               var unitDefinition = time.units[unitDefinitionIndex];
-
-                               // While we aren't ideal and we don't have units left
-                               while (unitDefinitionIndex < time.units.length) {
-                                       // Can we scale this unit. If `false` we can scale infinitely
-                                       this.unitScale = 1;
-
-                                       if (helpers.isArray(unitDefinition.steps) && Math.ceil(this.scaleSizeInUnits / labelCapacity) < helpers.max(unitDefinition.steps)) {
-                                               // Use one of the prefedined steps
-                                               for (var idx = 0; idx < unitDefinition.steps.length; ++idx) {
-                                                       if (unitDefinition.steps[idx] >= Math.ceil(this.scaleSizeInUnits / labelCapacity)) {
-                                                               this.unitScale = helpers.getValueOrDefault(this.options.time.unitStepSize, unitDefinition.steps[idx]);
-                                                               break;
-                                                       }
-                                               }
-
-                                               break;
-                                       } else if ((unitDefinition.maxStep === false) || (Math.ceil(this.scaleSizeInUnits / labelCapacity) < unitDefinition.maxStep)) {
-                                               // We have a max step. Scale this unit
-                                               this.unitScale = helpers.getValueOrDefault(this.options.time.unitStepSize, Math.ceil(this.scaleSizeInUnits / labelCapacity));
-                                               break;
-                                       } else {
-                                               // Move to the next unit up
-                                               ++unitDefinitionIndex;
-                                               unitDefinition = time.units[unitDefinitionIndex];
-
-                                               this.tickUnit = unitDefinition.name;
-                                               this.scaleSizeInUnits = this.lastTick.diff(this.firstTick, this.tickUnit, true);
-                                               this.displayFormat = this.options.time.displayFormats[unitDefinition.name];
-                                       }
-                               }
-                       }
-
-                       var roundedStart;
-
-                       // Only round the first tick if we have no hard minimum
-                       if (!this.options.time.min) {
-                               this.firstTick.startOf(this.tickUnit);
-                               roundedStart = this.firstTick;
-                       } else {
-                               roundedStart = this.firstTick.clone().startOf(this.tickUnit);
-                       }
-
-                       // Only round the last tick if we have no hard maximum
-                       if (!this.options.time.max) {
-                               this.lastTick.endOf(this.tickUnit);
-                       }
-
-                       this.smallestLabelSeparation = this.width;
-
-                       helpers.each(this.chart.data.datasets, function(dataset, datasetIndex) {
-                               for (var i = 1; i < this.labelMoments[datasetIndex].length; i++) {
-                                       this.smallestLabelSeparation = Math.min(this.smallestLabelSeparation, this.labelMoments[datasetIndex][i].diff(this.labelMoments[datasetIndex][i - 1], this.tickUnit, true));
-                               }
-                       }, this);
-
-                       // Tick displayFormat override
-                       if (this.options.time.displayFormat) {
-                               this.displayFormat = this.options.time.displayFormat;
-                       }
-
-                       // first tick. will have been rounded correctly if options.time.min is not specified
-                       this.ticks.push(this.firstTick.clone());
-
-                       // For every unit in between the first and last moment, create a moment and add it to the ticks tick
-                       for (var i = 1; i < this.scaleSizeInUnits; ++i) {
-                               var newTick = roundedStart.clone().add(i, this.tickUnit);
-
-                               // Are we greater than the max time
-                               if (this.options.time.max && newTick.diff(this.lastTick, this.tickUnit, true) >= 0) {
-                                       break;
-                               }
-
-                               if (i % this.unitScale === 0) {
-                                       this.ticks.push(newTick);
-                               }
-                       }
-
-                       // Always show the right tick
-                       if (this.ticks[this.ticks.length - 1].diff(this.lastTick, this.tickUnit) !== 0 || this.scaleSizeInUnits === 0) {
-                       // this is a weird case. If the <max> option is the same as the end option, we can't just diff the times because the tick was created from the roundedStart
-                       // but the last tick was not rounded.
-                               if (this.options.time.max) {
-                                       this.ticks.push(this.lastTick.clone());
-                                       this.scaleSizeInUnits = this.lastTick.diff(this.ticks[0], this.tickUnit, true);
-                               } else {
-                                       this.scaleSizeInUnits = Math.ceil(this.scaleSizeInUnits / this.unitScale) * this.unitScale;
-                                       this.ticks.push(this.firstTick.clone().add(this.scaleSizeInUnits, this.tickUnit));
-                                       this.lastTick = this.ticks[this.ticks.length - 1].clone();
-                               }
-                       }
-                       this.ctx.restore();
-               },
-               // Get tooltip label
-               getLabelForIndex: function(index, datasetIndex) {
-                       var label = this.chart.data.labels && index < this.chart.data.labels.length ? this.chart.data.labels[index] : '';
-
-                       if (typeof this.chart.data.datasets[datasetIndex].data[0] === 'object') {
-                               label = this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);
-                       }
-
-                       // Format nicely
-                       if (this.options.time.tooltipFormat) {
-                               label = this.parseTime(label).format(this.options.time.tooltipFormat);
-                       }
-
-                       return label;
-               },
-               // Function to format an individual tick mark
-               tickFormatFunction: function tickFormatFunction(tick, index, ticks) {
-                       var formattedTick = tick.format(this.displayFormat);
-
-                       if (this.options.ticks.userCallback) {
-                               return this.options.ticks.userCallback(formattedTick, index, ticks);
-                       } else {
-                               return formattedTick;
-                       }
-               },
-               convertTicksToLabels: function() {
-                       this.ticks = this.ticks.map(this.tickFormatFunction, this);
-               },
-               getPixelForValue: function(value, index, datasetIndex, includeOffset) {
-                       var labelMoment = this.getLabelMoment(datasetIndex, index);
-
-                       if (labelMoment) {
-                               var offset = labelMoment.diff(this.firstTick, this.tickUnit, true);
-
-                               var decimal = offset / this.scaleSizeInUnits;
-
-                               if (this.isHorizontal()) {
-                                       var innerWidth = this.width - (this.paddingLeft + this.paddingRight);
-                                       var valueWidth = innerWidth / Math.max(this.ticks.length - 1, 1);
-                                       var valueOffset = (innerWidth * decimal) + this.paddingLeft;
-
-                                       return this.left + Math.round(valueOffset);
-                               } else {
-                                       var innerHeight = this.height - (this.paddingTop + this.paddingBottom);
-                                       var valueHeight = innerHeight / Math.max(this.ticks.length - 1, 1);
-                                       var heightOffset = (innerHeight * decimal) + this.paddingTop;
-
-                                       return this.top + Math.round(heightOffset);
-                               }
-                       }
-               },
-               parseTime: function(label) {
-                       if (typeof this.options.time.parser === 'string') {
-                               return moment(label, this.options.time.parser);
-                       }
-                       if (typeof this.options.time.parser === 'function') {
-                               return this.options.time.parser(label);
-                       }
-                       // Date objects
-                       if (typeof label.getMonth === 'function' || typeof label === 'number') {
-                               return moment(label);
-                       }
-                       // Moment support
-                       if (label.isValid && label.isValid()) {
-                               return label;
-                       }
-                       // Custom parsing (return an instance of moment)
-                       if (typeof this.options.time.format !== 'string' && this.options.time.format.call) {
-                               console.warn("options.time.format is deprecated and replaced by options.time.parser. See http://nnnick.github.io/Chart.js/docs-v2/#scales-time-scale");
-                               return this.options.time.format(label);
-                       }
-                       // Moment format parsing
-                       return moment(label, this.options.time.format);
-               }
-       });
-       Chart.scaleService.registerScaleType("time", TimeScale, defaultConfig);
-
-};
-
-},{"moment":1}]},{},[7]);
diff --git a/docs/javascript/clipboard.min.js b/docs/javascript/clipboard.min.js
deleted file mode 100644 (file)
index 35c4e1b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * clipboard.js v1.5.9
- * https://zenorocha.github.io/clipboard.js
- *
- * Licensed MIT Â© Zeno Rocha
- */
-!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function r(c,s){if(!n[c]){if(!e[c]){var a="function"==typeof require&&require;if(!s&&a)return a(c,!0);if(i)return i(c,!0);var l=new Error("Cannot find module '"+c+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[c]={exports:{}};e[c][0].call(u.exports,function(t){var n=e[c][1][t];return r(n?n:t)},u,u.exports,t,e,n,o)}return n[c].exports}for(var i="function"==typeof require&&require,c=0;c<o.length;c++)r(o[c]);return r}({1:[function(t,e,n){var o=t("matches-selector");e.exports=function(t,e,n){for(var r=n?t:t.parentNode;r&&r!==document;){if(o(r,e))return r;r=r.parentNode}}},{"matches-selector":5}],2:[function(t,e,n){function o(t,e,n,o,i){var c=r.apply(this,arguments);return t.addEventListener(n,c,i),{destroy:function(){t.removeEventListener(n,c,i)}}}function r(t,e,n,o){return function(n){n.delegateTarget=i(n.target,e,!0),n.delegateTarget&&o.call(t,n)}}var i=t("closest");e.exports=o},{closest:1}],3:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){var e=Object.prototype.toString.call(t);return"[object Function]"===e}},{}],4:[function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!s.string(e))throw new TypeError("Second argument must be a String");if(!s.fn(n))throw new TypeError("Third argument must be a Function");if(s.node(t))return r(t,e,n);if(s.nodeList(t))return i(t,e,n);if(s.string(t))return c(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function c(t,e,n){return a(document.body,t,e,n)}var s=t("./is"),a=t("delegate");e.exports=o},{"./is":3,delegate:2}],5:[function(t,e,n){function o(t,e){if(i)return i.call(t,e);for(var n=t.parentNode.querySelectorAll(e),o=0;o<n.length;++o)if(n[o]==t)return!0;return!1}var r=Element.prototype,i=r.matchesSelector||r.webkitMatchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector;e.exports=o},{}],6:[function(t,e,n){function o(t){var e;if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName)t.focus(),t.setSelectionRange(0,t.value.length),e=t.value;else{t.hasAttribute("contenteditable")&&t.focus();var n=window.getSelection(),o=document.createRange();o.selectNodeContents(t),n.removeAllRanges(),n.addRange(o),e=n.toString()}return e}e.exports=o},{}],7:[function(t,e,n){function o(){}o.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;r>o;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,c=o.length;c>i;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},e.exports=o},{}],8:[function(e,n,o){!function(r,i){if("function"==typeof t&&t.amd)t(["module","select"],i);else if("undefined"!=typeof o)i(n,e("select"));else{var c={exports:{}};i(c,r.select),r.clipboardAction=c.exports}}(this,function(t,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=n(e),i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},c=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),s=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return t.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action=e.action,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""},t.prototype.initSelection=function t(){if(this.text&&this.target)throw new Error('Multiple attributes declared, use either "target" or "text"');if(this.text)this.selectFake();else{if(!this.target)throw new Error('Missing required attributes, use either "target" or "text"');this.selectTarget()}},t.prototype.selectFake=function t(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandler=document.body.addEventListener("click",function(){return e.removeFake()}),this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="fixed",this.fakeElem.style[n?"right":"left"]="-9999px",this.fakeElem.style.top=(window.pageYOffset||document.documentElement.scrollTop)+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,r.default)(this.fakeElem),this.copyText()},t.prototype.removeFake=function t(){this.fakeHandler&&(document.body.removeEventListener("click"),this.fakeHandler=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)},t.prototype.selectTarget=function t(){this.selectedText=(0,r.default)(this.target),this.copyText()},t.prototype.copyText=function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(n){e=!1}this.handleResult(e)},t.prototype.handleResult=function t(e){e?this.emitter.emit("success",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)}):this.emitter.emit("error",{action:this.action,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})},t.prototype.clearSelection=function t(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()},t.prototype.destroy=function t(){this.removeFake()},c(t,[{key:"action",set:function t(){var e=arguments.length<=0||void 0===arguments[0]?"copy":arguments[0];if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function t(){return this._action}},{key:"target",set:function t(e){if(void 0!==e){if(!e||"object"!==("undefined"==typeof e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=s})},{select:6}],9:[function(e,n,o){!function(r,i){if("function"==typeof t&&t.amd)t(["module","./clipboard-action","tiny-emitter","good-listener"],i);else if("undefined"!=typeof o)i(n,e("./clipboard-action"),e("tiny-emitter"),e("good-listener"));else{var c={exports:{}};i(c,r.clipboardAction,r.tinyEmitter,r.goodListener),r.clipboard=c.exports}}(this,function(t,e,n,o){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var l=r(e),u=r(n),f=r(o),d=function(t){function e(n,o){i(this,e);var r=c(this,t.call(this));return r.resolveOptions(o),r.listenClick(n),r}return s(e,t),e.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText},e.prototype.listenClick=function t(e){var n=this;this.listener=(0,f.default)(e,"click",function(t){return n.onClick(t)})},e.prototype.onClick=function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})},e.prototype.defaultAction=function t(e){return a("action",e)},e.prototype.defaultTarget=function t(e){var n=a("target",e);return n?document.querySelector(n):void 0},e.prototype.defaultText=function t(e){return a("text",e)},e.prototype.destroy=function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)},e}(u.default);t.exports=d})},{"./clipboard-action":8,"good-listener":4,"tiny-emitter":7}]},{},[9])(9)});
\ No newline at end of file
diff --git a/docs/javascript/index.js b/docs/javascript/index.js
deleted file mode 100644 (file)
index b9ea77c..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-jQuery(document).ready(function ($) {
-
-  var $grid = $('#grid');
-  var $columns = $grid.children('.column');
-  var showing = 5;
-  var $markup = $('#markup code');
-  var $message = $('#message');
-  var $add = $('#add');
-  var $remove = $('#remove');
-
-  function showColumns() {
-    if (showing === 13) {
-      $message.show();
-    } else {
-      $message.hide();
-    }
-
-    showing = Math.min(Math.max(parseInt(showing), 2), 12);
-
-    $columns.hide();
-    $columns.slice(0, showing).show();
-
-    $markup.html('<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;columns&quot;</span><span class="nt">&gt;</span>');
-    $markup.append('\n');
-
-    for(i = 0; i < showing; i++) {
-      $markup.append('  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;column&quot;</span><span class="nt">&gt;</span>');
-      $markup.append(i + 1);
-      $markup.append('<span class="nt">&lt;/div&gt;</span>');
-      $markup.append('\n');
-    }
-
-    $markup.append('<span class="nt">&lt;/div&gt;</span>');
-  }
-
-  $add.click(function() {
-    showing++;
-    showColumns();
-  });
-
-  $remove.click(function() {
-    showing--;
-    showColumns();
-  });
-
-});
diff --git a/docs/javascript/jquery-2.2.0.min.js b/docs/javascript/jquery-2.2.0.min.js
deleted file mode 100644 (file)
index 06ac263..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v2.2.0 | (c) jQuery Foundation | jquery.org/license */
-!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=R.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c}catch(e){}O.set(a,b,c);
-}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=N.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var X=/^(?:checkbox|radio)$/i,Y=/<([\w:-]+)/,Z=/^$|\/(?:java|ecma)script/i,$={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return this;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||d,e=c.documentElement,f=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||f&&f.scrollLeft||0)-(e&&e.clientLeft||f&&f.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||f&&f.scrollTop||0)-(e&&e.clientTop||f&&f.clientTop||0)),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ea.test(f)?this.mouseHooks:da.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=d),3===a.target.nodeType&&(a.target=a.target.parentNode),h.filter?h.filter(a,g):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==ia()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===ia()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ga:ha):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:ha,isPropagationStopped:ha,isImmediatePropagationStopped:ha,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ga,a&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ga,a&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ga,a&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),n.fn.extend({on:function(a,b,c,d){return ja(this,a,b,c,d)},one:function(a,b,c,d){return ja(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=ha),this.each(function(){n.event.remove(this,a,c,b)})}});var ka=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,la=/<script|<style|<link/i,ma=/checked\s*(?:[^=]|=\s*.checked.)/i,na=/^true\/(.*)/,oa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=wa[0].contentDocument,b.write(),b.close(),c=ya(a,b),wa.detach()),xa[a]=c),c}var Aa=/^margin/,Ba=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ca=function(b){var c=b.ownerDocument.defaultView;return c.opener||(c=a),c.getComputedStyle(b)},Da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Ea=d.documentElement;!function(){var b,c,e,f,g=d.createElement("div"),h=d.createElement("div");if(h.style){h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,g.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",g.appendChild(h);function i(){h.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",h.innerHTML="",Ea.appendChild(g);var d=a.getComputedStyle(h);b="1%"!==d.top,f="2px"===d.marginLeft,c="4px"===d.width,h.style.marginRight="50%",e="4px"===d.marginRight,Ea.removeChild(g)}n.extend(l,{pixelPosition:function(){return i(),b},boxSizingReliable:function(){return null==c&&i(),c},pixelMarginRight:function(){return null==c&&i(),e},reliableMarginLeft:function(){return null==c&&i(),f},reliableMarginRight:function(){var b,c=h.appendChild(d.createElement("div"));return c.style.cssText=h.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",h.style.width="1px",Ea.appendChild(g),b=!parseFloat(a.getComputedStyle(c).marginRight),Ea.removeChild(g),h.removeChild(c),b}})}}();function Fa(a,b,c){var d,e,f,g,h=a.style;return c=c||Ca(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),!l.pixelMarginRight()&&Ba.test(g)&&Aa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Ga(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ha=/^(none|table(?!-c[ea]).+)/,Ia={position:"absolute",visibility:"hidden",display:"block"},Ja={letterSpacing:"0",fontWeight:"400"},Ka=["Webkit","O","Moz","ms"],La=d.createElement("div").style;function Ma(a){if(a in La)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ka.length;while(c--)if(a=Ka[c]+b,a in La)return a}function Na(a,b,c){var d=T.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Oa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Pa(b,c,e){var f=!0,g="width"===c?b.offsetWidth:b.offsetHeight,h=Ca(b),i="border-box"===n.css(b,"boxSizing",!1,h);if(d.msFullscreenElement&&a.top!==a&&b.getClientRects().length&&(g=Math.round(100*b.getBoundingClientRect()[c])),0>=g||null==g){if(g=Fa(b,c,h),(0>g||null==g)&&(g=b.style[c]),Ba.test(g))return g;f=i&&(l.boxSizingReliable()||g===b.style[c]),g=parseFloat(g)||0}return g+Oa(b,c,e||(i?"border":"content"),f,h)+"px"}function Qa(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=N.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=N.access(d,"olddisplay",za(d.nodeName)))):(e=V(d),"none"===c&&e||N.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Fa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=T.exec(c))&&e[1]&&(c=W(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Fa(a,b,d)),"normal"===e&&b in Ja&&(e=Ja[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Ha.test(n.css(a,"display"))&&0===a.offsetWidth?Da(a,Ia,function(){return Pa(a,b,d)}):Pa(a,b,d):void 0},set:function(a,c,d){var e,f=d&&Ca(a),g=d&&Oa(a,b,d,"border-box"===n.css(a,"boxSizing",!1,f),f);return g&&(e=T.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=n.css(a,b)),Na(a,c,g)}}}),n.cssHooks.marginLeft=Ga(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Fa(a,"marginLeft"))||a.getBoundingClientRect().left-Da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),n.cssHooks.marginRight=Ga(l.reliableMarginRight,function(a,b){return b?Da(a,{display:"inline-block"},Fa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Aa.test(a)||(n.cssHooks[a+b].set=Na)}),n.fn.extend({css:function(a,b){return K(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ca(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Qa(this,!0)},hide:function(){return Qa(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function Ra(a,b,c,d,e){return new Ra.prototype.init(a,b,c,d,e)}n.Tween=Ra,Ra.prototype={constructor:Ra,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ra.propHooks[this.prop];return a&&a.get?a.get(this):Ra.propHooks._default.get(this)},run:function(a){var b,c=Ra.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ra.propHooks._default.set(this),this}},Ra.prototype.init.prototype=Ra.prototype,Ra.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},Ra.propHooks.scrollTop=Ra.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=Ra.prototype.init,n.fx.step={};var Sa,Ta,Ua=/^(?:toggle|show|hide)$/,Va=/queueHooks$/;function Wa(){return a.setTimeout(function(){Sa=void 0}),Sa=n.now()}function Xa(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=U[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ya(a,b,c){for(var d,e=(_a.tweeners[b]||[]).concat(_a.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Za(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&V(a),q=N.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?N.get(a,"olddisplay")||za(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Ua.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?za(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=N.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;N.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ya(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function $a(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function _a(a,b,c){var d,e,f=0,g=_a.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Sa||Wa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:Sa||Wa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for($a(k,j.opts.specialEasing);g>f;f++)if(d=_a.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,Ya,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(_a,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],_a.tweeners[c]=_a.tweeners[c]||[],_a.tweeners[c].unshift(b)},prefilters:[Za],prefilter:function(a,b){b?_a.prefilters.unshift(a):_a.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=_a(this,n.extend({},a),f);(e||N.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=N.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Va.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=N.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Xa(b,!0),a,d,e)}}),n.each({slideDown:Xa("show"),slideUp:Xa("hide"),slideToggle:Xa("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Sa=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Sa=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ta||(Ta=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(Ta),Ta=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,b.disabled=!0,l.optDisabled=!c.disabled,a=d.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var ab,bb=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return K(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ab:void 0)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)}}),ab={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=bb[b]||n.find.attr;bb[b]=function(a,b,d){var e,f;return d||(f=bb[b],bb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,bb[b]=f),e}});var cb=/^(?:input|select|textarea|button)$/i,db=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return K(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b];
-},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):cb.test(a.nodeName)||db.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var eb=/[\t\r\n\f]/g;function fb(a){return a.getAttribute&&a.getAttribute("class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,fb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,fb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,fb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(void 0===a||"boolean"===c)&&(b=fb(this),b&&N.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":N.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+fb(c)+" ").replace(eb," ").indexOf(b)>-1)return!0;return!1}});var gb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(gb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){return n.trim(a.value)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(n.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var hb=/^(?:focusinfocus|focusoutblur)$/;n.extend(n.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!hb.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},f||!o.trigger||o.trigger.apply(e,c)!==!1)){if(!f&&!o.noBubble&&!n.isWindow(e)){for(j=o.delegateType||q,hb.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}g=0;while((h=p[g++])&&!b.isPropagationStopped())b.type=g>1?j:o.bindType||q,m=(N.get(h,"events")||{})[b.type]&&N.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&L(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!L(e)||l&&n.isFunction(e[q])&&!n.isWindow(e)&&(i=e[l],i&&(e[l]=null),n.event.triggered=q,e[q](),n.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}}),n.fn.extend({trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=N.access(d,b);e||d.addEventListener(a,c,!0),N.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=N.access(d,b)-1;e?N.access(d,b,e):(d.removeEventListener(a,c,!0),N.remove(d,b))}}});var ib=a.location,jb=n.now(),kb=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return(!c||c.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+b),c};var lb=/#.*$/,mb=/([?&])_=[^&]*/,nb=/^(.*?):[ \t]*([^\r\n]*)$/gm,ob=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,pb=/^(?:GET|HEAD)$/,qb=/^\/\//,rb={},sb={},tb="*/".concat("*"),ub=d.createElement("a");ub.href=ib.href;function vb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function wb(a,b,c,d){var e={},f=a===sb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function xb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function yb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function zb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ib.href,type:"GET",isLocal:ob.test(ib.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":tb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?xb(xb(a,n.ajaxSettings),b):xb(n.ajaxSettings,a)},ajaxPrefilter:vb(rb),ajaxTransport:vb(sb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m=n.ajaxSetup({},c),o=m.context||m,p=m.context&&(o.nodeType||o.jquery)?n(o):n.event,q=n.Deferred(),r=n.Callbacks("once memory"),s=m.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(2===v){if(!h){h={};while(b=nb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===v?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return v||(a=u[c]=u[c]||a,t[a]=b),this},overrideMimeType:function(a){return v||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>v)for(b in a)s[b]=[s[b],a[b]];else x.always(a[x.status]);return this},abort:function(a){var b=a||w;return e&&e.abort(b),z(0,b),this}};if(q.promise(x).complete=r.add,x.success=x.done,x.error=x.fail,m.url=((b||m.url||ib.href)+"").replace(lb,"").replace(qb,ib.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=n.trim(m.dataType||"*").toLowerCase().match(G)||[""],null==m.crossDomain){j=d.createElement("a");try{j.href=m.url,j.href=j.href,m.crossDomain=ub.protocol+"//"+ub.host!=j.protocol+"//"+j.host}catch(y){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=n.param(m.data,m.traditional)),wb(rb,m,c,x),2===v)return x;k=n.event&&m.global,k&&0===n.active++&&n.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!pb.test(m.type),f=m.url,m.hasContent||(m.data&&(f=m.url+=(kb.test(f)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=mb.test(f)?f.replace(mb,"$1_="+jb++):f+(kb.test(f)?"&":"?")+"_="+jb++)),m.ifModified&&(n.lastModified[f]&&x.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&x.setRequestHeader("If-None-Match",n.etag[f])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",m.contentType),x.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+tb+"; q=0.01":""):m.accepts["*"]);for(l in m.headers)x.setRequestHeader(l,m.headers[l]);if(m.beforeSend&&(m.beforeSend.call(o,x,m)===!1||2===v))return x.abort();w="abort";for(l in{success:1,error:1,complete:1})x[l](m[l]);if(e=wb(sb,m,c,x)){if(x.readyState=1,k&&p.trigger("ajaxSend",[x,m]),2===v)return x;m.async&&m.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},m.timeout));try{v=1,e.send(t,z)}catch(y){if(!(2>v))throw y;z(-1,y)}}else z(-1,"No Transport");function z(b,c,d,h){var j,l,t,u,w,y=c;2!==v&&(v=2,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(u=yb(m,x,d)),u=zb(m,u,x,j),j?(m.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(n.lastModified[f]=w),w=x.getResponseHeader("etag"),w&&(n.etag[f]=w)),204===b||"HEAD"===m.type?y="nocontent":304===b?y="notmodified":(y=u.state,l=u.data,t=u.error,j=!t)):(t=y,(b||!y)&&(y="error",0>b&&(b=0))),x.status=b,x.statusText=(c||y)+"",j?q.resolveWith(o,[l,y,x]):q.rejectWith(o,[x,y,t]),x.statusCode(s),s=void 0,k&&p.trigger(j?"ajaxSuccess":"ajaxError",[x,m,j?l:t]),r.fireWith(o,[x,y]),k&&(p.trigger("ajaxComplete",[x,m]),--n.active||n.event.trigger("ajaxStop")))}return x},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return!n.expr.filters.visible(a)},n.expr.filters.visible=function(a){return a.offsetWidth>0||a.offsetHeight>0||a.getClientRects().length>0};var Ab=/%20/g,Bb=/\[\]$/,Cb=/\r?\n/g,Db=/^(?:submit|button|image|reset|file)$/i,Eb=/^(?:input|select|textarea|keygen)/i;function Fb(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Bb.test(a)?d(a,e):Fb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Fb(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Fb(c,a[c],b,e);return d.join("&").replace(Ab,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Eb.test(this.nodeName)&&!Db.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Cb,"\r\n")}}):{name:b.name,value:c.replace(Cb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Gb={0:200,1223:204},Hb=n.ajaxSettings.xhr();l.cors=!!Hb&&"withCredentials"in Hb,l.ajax=Hb=!!Hb,n.ajaxTransport(function(b){var c,d;return l.cors||Hb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Gb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=n("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Ib=[],Jb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Ib.pop()||n.expando+"_"+jb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Jb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Jb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Jb,"$1"+e):b.jsonp!==!1&&(b.url+=(kb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Ib.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),l.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||(l.createHTMLDocument?d.implementation.createHTMLDocument(""):d);var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ca([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var Kb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Kb)return Kb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(g,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function Lb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(e=d.getBoundingClientRect(),c=Lb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0)-a.scrollTop(),d.left+=n.css(a[0],"borderLeftWidth",!0)-a.scrollLeft()),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ea})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;n.fn[a]=function(d){return K(this,function(a,d,e){var f=Lb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ga(l.pixelPosition,function(a,c){return c?(c=Fa(a,b),Ba.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return K(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},size:function(){return this.length}}),n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Mb=a.jQuery,Nb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Nb),b&&a.jQuery===n&&(a.jQuery=Mb),n},b||(a.jQuery=a.$=n),n});
diff --git a/docs/javascript/main.js b/docs/javascript/main.js
deleted file mode 100644 (file)
index 9df2d1d..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-document.addEventListener('DOMContentLoaded', () => {
-
-  const $navBurger = document.getElementById('navBurger');
-  const $navMenu = document.getElementById('navMenu');
-
-  if ($navBurger) {
-    $navBurger.addEventListener('click', () => {
-      $navBurger.classList.toggle('is-active');
-      $navMenu.classList.toggle('is-active');
-    });
-  }
-
-});
diff --git a/docs/lib/bulma.js b/docs/lib/bulma.js
new file mode 100644 (file)
index 0000000..62e5bc9
--- /dev/null
@@ -0,0 +1,66 @@
+'use strict';
+
+jQuery(document).ready(function ($) {
+
+  var $toggle = $('#nav-toggle');
+  var $menu = $('#nav-menu');
+
+  $toggle.click(function () {
+    $(this).toggleClass('is-active');
+    $menu.toggleClass('is-active');
+  });
+
+  $('.modal-button').click(function () {
+    var target = $(this).data('target');
+    $('html').addClass('is-clipped');
+    $(target).addClass('is-active');
+  });
+
+  $('.modal-background, .modal-close').click(function () {
+    $('html').removeClass('is-clipped');
+    $(this).parent().removeClass('is-active');
+  });
+
+  $('.modal-card-head .delete, .modal-card-foot .button').click(function () {
+    $('html').removeClass('is-clipped');
+    $('#modal-ter').removeClass('is-active');
+  });
+
+  $(document).on('keyup', function (e) {
+    if (e.keyCode == 27) {
+      $('html').removeClass('is-clipped');
+      $('.modal').removeClass('is-active');
+    }
+  });
+
+  var $highlights = $('.highlight');
+
+  $highlights.each(function () {
+    var $el = $(this);
+    var copy = '<button class="copy">Copy</button>';
+    var expand = '<button class="expand">Expand</button>';
+    $el.append(copy);
+
+    if ($el.find('pre code').innerHeight() > 600) {
+      $el.append(expand);
+    }
+  });
+
+  var $highlightButtons = $('.highlight .copy, .highlight .expand');
+
+  $highlightButtons.hover(function () {
+    $(this).parent().css('box-shadow', '0 0 0 1px #ed6c63');
+  }, function () {
+    $(this).parent().css('box-shadow', 'none');
+  });
+
+  $('.highlight .expand').click(function () {
+    $(this).parent().children('pre').css('max-height', 'none');
+  });
+
+  new Clipboard('.copy', {
+    target: function target(trigger) {
+      return trigger.previousSibling;
+    }
+  });
+});
\ No newline at end of file
diff --git a/docs/lib/clipboard.min.js b/docs/lib/clipboard.min.js
new file mode 100644 (file)
index 0000000..0a5f5f8
--- /dev/null
@@ -0,0 +1,222 @@
+"use strict";
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; }
+
+/*!
+ * clipboard.js v1.5.9
+ * https://zenorocha.github.io/clipboard.js
+ *
+ * Licensed MIT Â© Zeno Rocha
+ */
+!function (t) {
+  if ("object" == (typeof exports === "undefined" ? "undefined" : _typeof(exports)) && "undefined" != typeof module) module.exports = t();else if ("function" == typeof define && define.amd) define([], t);else {
+    var e;e = "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this, e.Clipboard = t();
+  }
+}(function () {
+  var t, e, n;return function t(e, n, o) {
+    function r(c, s) {
+      if (!n[c]) {
+        if (!e[c]) {
+          var a = "function" == typeof require && require;if (!s && a) return a(c, !0);if (i) return i(c, !0);var l = new Error("Cannot find module '" + c + "'");throw l.code = "MODULE_NOT_FOUND", l;
+        }var u = n[c] = { exports: {} };e[c][0].call(u.exports, function (t) {
+          var n = e[c][1][t];return r(n ? n : t);
+        }, u, u.exports, t, e, n, o);
+      }return n[c].exports;
+    }for (var i = "function" == typeof require && require, c = 0; c < o.length; c++) {
+      r(o[c]);
+    }return r;
+  }({ 1: [function (t, e, n) {
+      var o = t("matches-selector");e.exports = function (t, e, n) {
+        for (var r = n ? t : t.parentNode; r && r !== document;) {
+          if (o(r, e)) return r;r = r.parentNode;
+        }
+      };
+    }, { "matches-selector": 5 }], 2: [function (t, e, n) {
+      function o(t, e, n, o, i) {
+        var c = r.apply(this, arguments);return t.addEventListener(n, c, i), { destroy: function destroy() {
+            t.removeEventListener(n, c, i);
+          } };
+      }function r(t, e, n, o) {
+        return function (n) {
+          n.delegateTarget = i(n.target, e, !0), n.delegateTarget && o.call(t, n);
+        };
+      }var i = t("closest");e.exports = o;
+    }, { closest: 1 }], 3: [function (t, e, n) {
+      n.node = function (t) {
+        return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType;
+      }, n.nodeList = function (t) {
+        var e = Object.prototype.toString.call(t);return void 0 !== t && ("[object NodeList]" === e || "[object HTMLCollection]" === e) && "length" in t && (0 === t.length || n.node(t[0]));
+      }, n.string = function (t) {
+        return "string" == typeof t || t instanceof String;
+      }, n.fn = function (t) {
+        var e = Object.prototype.toString.call(t);return "[object Function]" === e;
+      };
+    }, {}], 4: [function (t, e, n) {
+      function o(t, e, n) {
+        if (!t && !e && !n) throw new Error("Missing required arguments");if (!s.string(e)) throw new TypeError("Second argument must be a String");if (!s.fn(n)) throw new TypeError("Third argument must be a Function");if (s.node(t)) return r(t, e, n);if (s.nodeList(t)) return i(t, e, n);if (s.string(t)) return c(t, e, n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");
+      }function r(t, e, n) {
+        return t.addEventListener(e, n), { destroy: function destroy() {
+            t.removeEventListener(e, n);
+          } };
+      }function i(t, e, n) {
+        return Array.prototype.forEach.call(t, function (t) {
+          t.addEventListener(e, n);
+        }), { destroy: function destroy() {
+            Array.prototype.forEach.call(t, function (t) {
+              t.removeEventListener(e, n);
+            });
+          } };
+      }function c(t, e, n) {
+        return a(document.body, t, e, n);
+      }var s = t("./is"),
+          a = t("delegate");e.exports = o;
+    }, { "./is": 3, delegate: 2 }], 5: [function (t, e, n) {
+      function o(t, e) {
+        if (i) return i.call(t, e);for (var n = t.parentNode.querySelectorAll(e), o = 0; o < n.length; ++o) {
+          if (n[o] == t) return !0;
+        }return !1;
+      }var r = Element.prototype,
+          i = r.matchesSelector || r.webkitMatchesSelector || r.mozMatchesSelector || r.msMatchesSelector || r.oMatchesSelector;e.exports = o;
+    }, {}], 6: [function (t, e, n) {
+      function o(t) {
+        var e;if ("INPUT" === t.nodeName || "TEXTAREA" === t.nodeName) t.focus(), t.setSelectionRange(0, t.value.length), e = t.value;else {
+          t.hasAttribute("contenteditable") && t.focus();var n = window.getSelection(),
+              o = document.createRange();o.selectNodeContents(t), n.removeAllRanges(), n.addRange(o), e = n.toString();
+        }return e;
+      }e.exports = o;
+    }, {}], 7: [function (t, e, n) {
+      function o() {}o.prototype = { on: function on(t, e, n) {
+          var o = this.e || (this.e = {});return (o[t] || (o[t] = [])).push({ fn: e, ctx: n }), this;
+        }, once: function once(t, e, n) {
+          function o() {
+            r.off(t, o), e.apply(n, arguments);
+          }var r = this;return o._ = e, this.on(t, o, n);
+        }, emit: function emit(t) {
+          var e = [].slice.call(arguments, 1),
+              n = ((this.e || (this.e = {}))[t] || []).slice(),
+              o = 0,
+              r = n.length;for (o; r > o; o++) {
+            n[o].fn.apply(n[o].ctx, e);
+          }return this;
+        }, off: function off(t, e) {
+          var n = this.e || (this.e = {}),
+              o = n[t],
+              r = [];if (o && e) for (var i = 0, c = o.length; c > i; i++) {
+            o[i].fn !== e && o[i].fn._ !== e && r.push(o[i]);
+          }return r.length ? n[t] = r : delete n[t], this;
+        } }, e.exports = o;
+    }, {}], 8: [function (e, n, o) {
+      !function (r, i) {
+        if ("function" == typeof t && t.amd) t(["module", "select"], i);else if ("undefined" != typeof o) i(n, e("select"));else {
+          var c = { exports: {} };i(c, r.select), r.clipboardAction = c.exports;
+        }
+      }(this, function (t, e) {
+        "use strict";
+        function n(t) {
+          return t && t.__esModule ? t : { "default": t };
+        }function o(t, e) {
+          if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function");
+        }var r = n(e),
+            i = "function" == typeof Symbol && "symbol" == _typeof(Symbol.iterator) ? function (t) {
+          return typeof t === "undefined" ? "undefined" : _typeof(t);
+        } : function (t) {
+          return t && "function" == typeof Symbol && t.constructor === Symbol ? "symbol" : typeof t === "undefined" ? "undefined" : _typeof(t);
+        },
+            c = function () {
+          function t(t, e) {
+            for (var n = 0; n < e.length; n++) {
+              var o = e[n];o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o);
+            }
+          }return function (e, n, o) {
+            return n && t(e.prototype, n), o && t(e, o), e;
+          };
+        }(),
+            s = function () {
+          function t(e) {
+            o(this, t), this.resolveOptions(e), this.initSelection();
+          }return t.prototype.resolveOptions = function t() {
+            var e = arguments.length <= 0 || void 0 === arguments[0] ? {} : arguments[0];this.action = e.action, this.emitter = e.emitter, this.target = e.target, this.text = e.text, this.trigger = e.trigger, this.selectedText = "";
+          }, t.prototype.initSelection = function t() {
+            if (this.text && this.target) throw new Error('Multiple attributes declared, use either "target" or "text"');if (this.text) this.selectFake();else {
+              if (!this.target) throw new Error('Missing required attributes, use either "target" or "text"');this.selectTarget();
+            }
+          }, t.prototype.selectFake = function t() {
+            var e = this,
+                n = "rtl" == document.documentElement.getAttribute("dir");this.removeFake(), this.fakeHandler = document.body.addEventListener("click", function () {
+              return e.removeFake();
+            }), this.fakeElem = document.createElement("textarea"), this.fakeElem.style.fontSize = "12pt", this.fakeElem.style.border = "0", this.fakeElem.style.padding = "0", this.fakeElem.style.margin = "0", this.fakeElem.style.position = "fixed", this.fakeElem.style[n ? "right" : "left"] = "-9999px", this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + "px", this.fakeElem.setAttribute("readonly", ""), this.fakeElem.value = this.text, document.body.appendChild(this.fakeElem), this.selectedText = (0, r.default)(this.fakeElem), this.copyText();
+          }, t.prototype.removeFake = function t() {
+            this.fakeHandler && (document.body.removeEventListener("click"), this.fakeHandler = null), this.fakeElem && (document.body.removeChild(this.fakeElem), this.fakeElem = null);
+          }, t.prototype.selectTarget = function t() {
+            this.selectedText = (0, r.default)(this.target), this.copyText();
+          }, t.prototype.copyText = function t() {
+            var e = void 0;try {
+              e = document.execCommand(this.action);
+            } catch (n) {
+              e = !1;
+            }this.handleResult(e);
+          }, t.prototype.handleResult = function t(e) {
+            e ? this.emitter.emit("success", { action: this.action, text: this.selectedText, trigger: this.trigger, clearSelection: this.clearSelection.bind(this) }) : this.emitter.emit("error", { action: this.action, trigger: this.trigger, clearSelection: this.clearSelection.bind(this) });
+          }, t.prototype.clearSelection = function t() {
+            this.target && this.target.blur(), window.getSelection().removeAllRanges();
+          }, t.prototype.destroy = function t() {
+            this.removeFake();
+          }, c(t, [{ key: "action", set: function t() {
+              var e = arguments.length <= 0 || void 0 === arguments[0] ? "copy" : arguments[0];if (this._action = e, "copy" !== this._action && "cut" !== this._action) throw new Error('Invalid "action" value, use either "copy" or "cut"');
+            }, get: function t() {
+              return this._action;
+            } }, { key: "target", set: function t(e) {
+              if (void 0 !== e) {
+                if (!e || "object" !== ("undefined" == typeof e ? "undefined" : i(e)) || 1 !== e.nodeType) throw new Error('Invalid "target" value, use a valid Element');this._target = e;
+              }
+            }, get: function t() {
+              return this._target;
+            } }]), t;
+        }();t.exports = s;
+      });
+    }, { select: 6 }], 9: [function (e, n, o) {
+      !function (r, i) {
+        if ("function" == typeof t && t.amd) t(["module", "./clipboard-action", "tiny-emitter", "good-listener"], i);else if ("undefined" != typeof o) i(n, e("./clipboard-action"), e("tiny-emitter"), e("good-listener"));else {
+          var c = { exports: {} };i(c, r.clipboardAction, r.tinyEmitter, r.goodListener), r.clipboard = c.exports;
+        }
+      }(this, function (t, e, n, o) {
+        "use strict";
+        function r(t) {
+          return t && t.__esModule ? t : { "default": t };
+        }function i(t, e) {
+          if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function");
+        }function c(t, e) {
+          if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return !e || "object" != (typeof e === "undefined" ? "undefined" : _typeof(e)) && "function" != typeof e ? t : e;
+        }function s(t, e) {
+          if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + (typeof e === "undefined" ? "undefined" : _typeof(e)));t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : _defaults(t, e));
+        }function a(t, e) {
+          var n = "data-clipboard-" + t;if (e.hasAttribute(n)) return e.getAttribute(n);
+        }var l = r(e),
+            u = r(n),
+            f = r(o),
+            d = function (t) {
+          function e(n, o) {
+            i(this, e);var r = c(this, t.call(this));return r.resolveOptions(o), r.listenClick(n), r;
+          }return s(e, t), e.prototype.resolveOptions = function t() {
+            var e = arguments.length <= 0 || void 0 === arguments[0] ? {} : arguments[0];this.action = "function" == typeof e.action ? e.action : this.defaultAction, this.target = "function" == typeof e.target ? e.target : this.defaultTarget, this.text = "function" == typeof e.text ? e.text : this.defaultText;
+          }, e.prototype.listenClick = function t(e) {
+            var n = this;this.listener = (0, f.default)(e, "click", function (t) {
+              return n.onClick(t);
+            });
+          }, e.prototype.onClick = function t(e) {
+            var n = e.delegateTarget || e.currentTarget;this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new l.default({ action: this.action(n), target: this.target(n), text: this.text(n), trigger: n, emitter: this });
+          }, e.prototype.defaultAction = function t(e) {
+            return a("action", e);
+          }, e.prototype.defaultTarget = function t(e) {
+            var n = a("target", e);return n ? document.querySelector(n) : void 0;
+          }, e.prototype.defaultText = function t(e) {
+            return a("text", e);
+          }, e.prototype.destroy = function t() {
+            this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction = null);
+          }, e;
+        }(u.default);t.exports = d;
+      });
+    }, { "./clipboard-action": 8, "good-listener": 4, "tiny-emitter": 7 }] }, {}, [9])(9);
+});
\ No newline at end of file
diff --git a/docs/lib/index.js b/docs/lib/index.js
new file mode 100644 (file)
index 0000000..e953f8b
--- /dev/null
@@ -0,0 +1,52 @@
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function () {
+
+  var $grid = document.getElementById('grid');
+  var $columns = Array.prototype.slice.call(document.querySelectorAll('#grid > .column'), 0);
+  console.log('$columns', $columns);
+  var $markup = document.querySelector('#markup code');
+  var $message = document.getElementById('message');
+  var $add = document.getElementById('add');
+  var $remove = document.getElementById('remove');
+  var showing = 5;
+
+  function showColumns() {
+    if (showing === 13) {
+      $message.style.display = 'block';
+    } else {
+      $message.style.display = 'none';
+    }
+
+    showing = Math.min(Math.max(parseInt(showing), 2), 12);
+
+    $columns.forEach(function ($el) {
+      $el.style.display = 'none';
+    });
+    $columns.slice(0, showing).forEach(function ($el) {
+      $el.style.display = 'block';
+    });
+
+    $markup.innerHTML = '<span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;columns&quot;</span><span class="nt">&gt;</span>';
+    $markup.insertAdjacentHTML('beforeend', '\n');
+
+    for (var i = 0; i < showing; i++) {
+      $markup.insertAdjacentHTML('beforeend', '  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;column&quot;</span><span class="nt">&gt;</span>');
+      $markup.insertAdjacentHTML('beforeend', i + 1);
+      $markup.insertAdjacentHTML('beforeend', '<span class="nt">&lt;/div&gt;</span>');
+      $markup.insertAdjacentHTML('beforeend', '\n');
+    }
+
+    $markup.insertAdjacentHTML('beforeend', '<span class="nt">&lt;/div&gt;</span>');
+  }
+
+  $add.addEventListener('click', function () {
+    showing++;
+    showColumns();
+  });
+
+  $remove.addEventListener('click', function () {
+    showing--;
+    showColumns();
+  });
+});
\ No newline at end of file
diff --git a/docs/lib/javascript/main.js b/docs/lib/javascript/main.js
new file mode 100644 (file)
index 0000000..fe02814
--- /dev/null
@@ -0,0 +1,57 @@
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function () {
+
+  // Navbar burger menu
+
+  var $navBurger = document.getElementById('navBurger');
+  var $navMenu = document.getElementById('navMenu');
+
+  if ($navBurger) {
+    $navBurger.addEventListener('click', function () {
+      $navBurger.classList.toggle('is-active');
+      $navMenu.classList.toggle('is-active');
+    });
+  }
+
+  // Modals
+
+  var $html = document.documentElement;
+  var $modals = Array.prototype.slice.call(document.querySelectorAll('.modal'), 0);
+  var $modalButtons = Array.prototype.slice.call(document.querySelectorAll('.modal-button'), 0);
+  var $modalCloses = Array.prototype.slice.call(document.querySelectorAll('.modal-background, .modal-close, .modal-card-head .delete, .modal-card-foot .button'), 0);
+
+  if ($modalButtons.length > 0) {
+    $modalButtons.forEach(function ($el) {
+      $el.addEventListener('click', function () {
+        var target = $el.dataset.target;
+        console.log('target', target);
+        var $target = document.getElementById(target);
+        $html.classList.add('is-clipped');
+        $target.classList.add('is-active');
+      });
+    });
+  }
+
+  if ($modalCloses.length > 0) {
+    $modalCloses.forEach(function ($el) {
+      $el.addEventListener('click', function () {
+        $html.classList.remove('is-clipped');
+        closeModals();
+      });
+    });
+  }
+
+  document.addEventListener('keydown', function (e) {
+    if (e.keyCode === 27) {
+      $html.classList.remove('is-clipped');
+      closeModals();
+    }
+  });
+
+  function closeModals() {
+    $modals.forEach(function ($el) {
+      $el.classList.remove('is-active');
+    });
+  }
+});
\ No newline at end of file
diff --git a/docs/lib/main.js b/docs/lib/main.js
new file mode 100644 (file)
index 0000000..fe02814
--- /dev/null
@@ -0,0 +1,57 @@
+'use strict';
+
+document.addEventListener('DOMContentLoaded', function () {
+
+  // Navbar burger menu
+
+  var $navBurger = document.getElementById('navBurger');
+  var $navMenu = document.getElementById('navMenu');
+
+  if ($navBurger) {
+    $navBurger.addEventListener('click', function () {
+      $navBurger.classList.toggle('is-active');
+      $navMenu.classList.toggle('is-active');
+    });
+  }
+
+  // Modals
+
+  var $html = document.documentElement;
+  var $modals = Array.prototype.slice.call(document.querySelectorAll('.modal'), 0);
+  var $modalButtons = Array.prototype.slice.call(document.querySelectorAll('.modal-button'), 0);
+  var $modalCloses = Array.prototype.slice.call(document.querySelectorAll('.modal-background, .modal-close, .modal-card-head .delete, .modal-card-foot .button'), 0);
+
+  if ($modalButtons.length > 0) {
+    $modalButtons.forEach(function ($el) {
+      $el.addEventListener('click', function () {
+        var target = $el.dataset.target;
+        console.log('target', target);
+        var $target = document.getElementById(target);
+        $html.classList.add('is-clipped');
+        $target.classList.add('is-active');
+      });
+    });
+  }
+
+  if ($modalCloses.length > 0) {
+    $modalCloses.forEach(function ($el) {
+      $el.addEventListener('click', function () {
+        $html.classList.remove('is-clipped');
+        closeModals();
+      });
+    });
+  }
+
+  document.addEventListener('keydown', function (e) {
+    if (e.keyCode === 27) {
+      $html.classList.remove('is-clipped');
+      closeModals();
+    }
+  });
+
+  function closeModals() {
+    $modals.forEach(function ($el) {
+      $el.classList.remove('is-active');
+    });
+  }
+});
\ No newline at end of file
diff --git a/docs/package.json b/docs/package.json
new file mode 100644 (file)
index 0000000..f1186d2
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  "name": "bulma-docs",
+  "version": "1.0.0",
+  "main": "index.html",
+  "author": "Jeremy Thomas <bbxdesign@gmail.com> (http://jgthms.com)",
+  "license": "MIT",
+  "devDependencies": {
+    "babel-cli": "^6.24.1",
+    "babel-preset-env": "^1.5.2",
+    "babel-preset-es2015-ie": "^6.7.0",
+    "i": "^0.3.5",
+    "npm": "^5.0.4"
+  },
+  "scripts": {
+    "build": "babel _javascript --out-dir lib",
+    "watch": "npm run build -- --watch"
+  }
+}
diff --git a/docs/sass/bsa.sass b/docs/sass/bsa.sass
deleted file mode 100644 (file)
index c9ed085..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-.bsa
-  padding: 2rem
-
-.bsa-cpc
-  min-height: 1px
-
-#_default_
-  .default-ad
-    background-color: rgba(black, 0.3)
-    border-radius: 2px
-    color: $white
-    display: inline-block
-    font-size: 10px
-    font-weight: bold
-    padding: 0 4px
-    text-transform: uppercase
-    vertical-align: top
-  & > a
-    background-color: $white
-    border-radius: $radius-large
-    box-shadow: 0 2px 3px rgba($black, 0.1), 0 0 0 1px rgba($black, 0.1)
-    color: $text
-    display: block
-    line-height: 1.375
-    margin-top: 15px
-    min-height: 70px
-    padding: 15px
-    padding-left: 70px
-    position: relative
-    &:hover,
-    &:focus
-      box-shadow: 0 2px 3px rgba($black, 0.1), 0 0 0 1px $link
-    &:active
-      box-shadow: inset 0 1px 2px rgba($black, 0.2), 0 0 0 1px $link
-    span
-      display: block
-    .default-image
-      display: block
-      left: 15px
-      height: 40px
-      position: absolute
-      top: 15px
-      width: 40px
-      img
-        display: block
-        height: 40px
-        width: 40px
-    .default-title
-      color: $text-strong
-      display: inline
-      font-weight: $weight-bold
-      &:after
-        content: " â€” "
-    .default-description
-      display: inline
-
-+tablet
-  .bsa
-    .columns
-      min-height: 120px
-  #_default_
-    display: flex
-    justify-content: center
-    position: relative
-    .default-ad
-      left: 100%
-      margin-left: 2rem
-      position: absolute
-      top: 0
-    & > a
-      margin: 0
-      &:not(:nth-child(2))
-        margin-left: 2rem
diff --git a/docs/sass/callout.sass b/docs/sass/callout.sass
deleted file mode 100644 (file)
index 56807f9..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-.callout
-  +block
-  background-color: $background
-  border-radius: $radius
-  padding: 1.25rem 2.5rem 1.25rem 1.5rem
-  position: relative
-  // Colors
-  @each $name, $pair in $colors
-    $color: nth($pair, 1)
-    $color-invert: nth($pair, 2)
-    &.is-#{$name}
-      background-color: $color
-      color: $color-invert
diff --git a/docs/sass/example.sass b/docs/sass/example.sass
deleted file mode 100644 (file)
index c8b9767..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-.example,
-.structure
-  border: 1px solid $warning
-  border-top-right-radius: $radius
-  color: $warning-invert
-  padding: 1.5rem
-  position: relative
-  &:not(:first-child)
-    margin-top: 2rem
-  &:not(:last-child)
-    margin-bottom: 1.5rem
-  &:before
-    background: $warning
-    border-radius: $radius $radius 0 0
-    bottom: 100%
-    content: "Example"
-    display: inline-block
-    font-size: 7px
-    font-weight: bold
-    left: -1px
-    letter-spacing: 1px
-    padding: 3px 5px
-    position: absolute
-    text-transform: uppercase
-    vertical-align: top
-  +tablet
-    &.is-fullwidth
-      border-left: none
-      border-right: none
-      padding: 0
-
-.example
-  & + .highlight
-    border: 1px solid $warning
-    border-radius: 0 0 $radius $radius
-    border-top: none
-    margin-top: -1.5rem
-    &:not(:last-child)
-      margin-bottom: 1.5rem
-
-.highlight pre
-  max-height: 600px
-  margin-bottom: 0 !important
-
-$structure: $danger
-$structure-invert: $danger-invert
-
-.structure
-  border-color: $structure
-  border-radius: $radius
-  padding: 1.5rem
-  &:before
-    background: $structure
-    color: $structure-invert
-    content: "Structure"
-
-.structure-item
-  position: relative
-  &:before
-    +overlay
-    background: rgba($black, 0.7)
-    background: $background
-    border: 1px solid $border
-    content: ""
-    display: block
-    z-index: 1
-  &:after
-    +overlay
-    align-items: center
-    content: attr(title)
-    display: flex
-    font-family: $family-monospace
-    font-size: 11px
-    justify-content: center
-    padding: 3px 5px
-    z-index: 2
-  &.is-structure-container
-    padding: 1.5rem 0.75rem 0.75rem
-    &:after
-      align-items: flex-start
-      justify-content: flex-start
-      padding: 0.5rem 0.75rem
-
-.highlight
-  position: relative
-  .copy,
-  .expand
-    +unselectable
-    background: $white
-    border: solid $border
-    border-width: 0 0 1px 1px
-    color: $text-light
-    cursor: pointer
-    outline: none
-    position: absolute
-    right: 0
-    top: 0
-    &:hover
-      border-color: $code
-      color: $code
-  .expand
-    border-right-width: 1px
-    right: 50px
-  +tablet
-    pre
-      white-space: pre-wrap
-
-+tablet
-  .section:not(.is-fullwidth) > .example:not(.is-fullwidth)
-    margin-left: 1.5rem
-    margin-right: 1.5rem
-    & + .highlight
-      margin-left: 1.5rem
-      margin-right: 1.5rem
-
-.section.is-fullwidth
-  padding: 0 !important
-  .example
-    border-left: none
-    border-radius: 0
-    border-right: none
-    padding: 0
-    & + .highlight
-      border-left: none
-      border-radius: 0
-      border-right: none
diff --git a/docs/sass/footer.sass b/docs/sass/footer.sass
deleted file mode 100644 (file)
index 8154b8f..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#about
-  .twitter-container
-    display: block
-    height: 30px
-    line-height: 30px
-    margin-top: 5px
-  small
-    display: block
-    margin-top: 5px
-
-#mc_embed_signup
-  .field
-    margin-bottom: 0
-  .notification
-    margin-top: 0.75rem
-
-#share
-  form
-    height: 30px
-    margin-top: 10px
-
-#social
-  align-items: center
-  display: flex
-  flex-wrap: wrap
-  justify-content: flex-start
-  > iframe,
-  > a,
-  > form,
-  > div
-    display: inline-block
-    font-size: 11px
-    height: 30px
-    line-height: 30px
-    margin-top: 5px
-  .github-btn
-    width: 160px
-  .twitter-share-button
-    margin-right: 10px
-    min-width: 76px
-  .paypal-form
-    min-width: 148px
-  .fb-like
-    align-items: center
-    display: flex
-    width: 130px
-
-#newsletter
-  .input
-    border-color: $white
-    box-shadow: none
-
-#sister
-  ul
-    display: flex
-    flex-wrap: wrap
-  li
-    display: flex
-    height: 30px
-    margin: 5px 1rem 0 0
-  img
-    height: 30px
-
-#tsp
-  small
-    display: block
diff --git a/docs/sass/global.sass b/docs/sass/global.sass
deleted file mode 100644 (file)
index ec2f282..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-svg
-  max-height: 100%
-  max-width: 100%
-
-$carbon-space: 15px
-
-#carbon
-  margin-left: auto
-  margin-right: auto
-  max-width: 340px
-  min-height: 120px + ($carbon-space * 2)
-  padding: 0
-  position: relative
-  &:hover
-    box-shadow: 0 2px 3px rgba($black, 0.1), 0 0 0 1px $primary
-  +tablet
-    width: 340px
-
-#carbonads
-  font-size: 14px
-  text-align: left
-  a,
-  span
-    display: block
-  .carbon-wrap
-    position: relative
-  .carbon-img
-    background: $background
-    float: left
-    height: 100px
-    margin: 15px 0 15px 15px
-    width: 130px
-    img
-      display: block
-      height: 100px
-      width: 130px
-  .carbon-text
-    display: block
-    color: $text-strong
-    line-height: 20px
-    padding: 15px 15px 35px 160px
-  .carbon-poweredby
-    bottom: 0
-    color: $text-light
-    font-size: $size-small
-    left: 160px
-    line-height: 20px
-    padding: 0 15px 10px 0
-    position: absolute
-    right: 0
diff --git a/docs/sass/header.sass b/docs/sass/header.sass
deleted file mode 100644 (file)
index edbfb62..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-$github: #333333
-$twitter: #55acee
-
-#github
-  color: $github
-  border-color: $github
-  &:hover
-    background: $github
-    border-color: $github
-    color: $white
-
-#twitter
-  color: $twitter
-  border-color: $twitter
-  &:hover
-    background: $twitter
-    border-color: $twitter
-    color: $white
diff --git a/docs/sass/highlight.sass b/docs/sass/highlight.sass
deleted file mode 100644 (file)
index 3d7601d..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-.highlight
-  background-color: #f5f5f5
-  color: #586e75
-  .c
-    color: #93a1a1
-  .err,
-  .g
-    color: #586e75
-  .k
-    color: #859900
-  .l,
-  .n
-    color: #586e75
-  .o
-    color: #859900
-  .x
-    color: #cb4b16
-  .p
-    color: #586e75
-  .cm
-    color: #93a1a1
-  .cp
-    color: #859900
-  .c1
-    color: #93a1a1
-  .cs
-    color: #859900
-  .gd
-    color: #2aa198
-  .ge
-    color: #586e75
-    font-style: italic
-  .gr
-    color: #dc322f
-  .gh
-    color: #cb4b16
-  .gi
-    color: #859900
-  .go,
-  .gp
-    color: #586e75
-  .gs
-    color: #586e75
-    font-weight: bold
-  .gu
-    color: #cb4b16
-  .gt
-    color: #586e75
-  .kc
-    color: #cb4b16
-  .kd
-    color: #268bd2
-  .kn,
-  .kp
-    color: #859900
-  .kr
-    color: #268bd2
-  .kt
-    color: #dc322f
-  .ld
-    color: #586e75
-  .m,
-  .s
-    color: #2aa198
-  .na
-    color: #B58900
-  .nb
-    color: #586e75
-  .nc
-    color: #268bd2
-  .no
-    color: #cb4b16
-  .nd
-    color: #268bd2
-  .ni,
-  .ne
-    color: #cb4b16
-  .nf
-    color: #268bd2
-  .nl,
-  .nn,
-  .nx,
-  .py
-    color: #586e75
-  .nt,
-  .nv
-    color: #268bd2
-  .ow
-    color: #859900
-  .w
-    color: #586e75
-  .mf,
-  .mh,
-  .mi,
-  .mo
-    color: #2aa198
-  .sb
-    color: #93a1a1
-  .sc
-    color: #2aa198
-  .sd
-    color: #586e75
-  .s2
-    color: #2aa198
-  .se
-    color: #cb4b16
-  .sh
-    color: #586e75
-  .si,
-  .sx
-    color: #2aa198
-  .sr
-    color: #dc322f
-  .s1,
-  .ss
-    color: #2aa198
-  .bp,
-  .vc,
-  .vg,
-  .vi
-    color: #268bd2
-  .il
-    color: #2aa198
-
-.content .highlight
-  text-align: left
\ No newline at end of file
diff --git a/docs/sass/index.sass b/docs/sass/index.sass
deleted file mode 100644 (file)
index 1bd31ed..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-@keyframes floatUp
-  0%
-    box-shadow: 0 0 0 rgba($black, 0), 0 0 0 rgba($black, 0), 0 0 0 rgba($black, 0)
-    transform: scale(0.86)
-  67%
-    box-shadow: 0 0 0 rgba($black, 0), 0 5px 10px rgba($black, 0.1), 0 1px 1px rgba($black, 0.2)
-    transform: scale(1)
-  100%
-    box-shadow: 0 20px 60px rgba($black, 0.05), 0 5px 10px rgba($black, 0.1), 0 1px 1px rgba($black, 0.2)
-    transform: scale(1)
-
-@keyframes strokePath
-  from
-    stroke-dashoffset: 880
-  to
-    stroke-dashoffset: 0
-
-@keyframes fadeIn
-  from
-    opacity: 0
-    transform: scale(0.86)
-  to
-    opacity: 1
-    transform: scale(1)
-
-@keyframes fadeOut
-  0%
-    opacity: 1
-    transform: scale(0.86)
-  67%
-    opacity: 1
-    transform: scale(0.86)
-  100%
-    opacity: 0
-    transform: scale(1)
-
-@keyframes slideDown
-  0%
-    opacity: 0
-    transform: translateY(-10px)
-  100%
-    opacity: 1
-    transform: translateY(0)
-
-@keyframes slideUp
-  0%
-    opacity: 0
-    transform: translateY(10px)
-  100%
-    opacity: 1
-    transform: translateY(0)
-
-$curve: cubic-bezier(0, 0.71, 0.29, 1)
-
-#b
-  // animation-delay: 1s
-  animation-duration: 1.5s
-  animation-fill-mode: both
-  animation-name: floatUp
-  animation-timing-function: $curve
-  border-radius: 24px
-  display: inline-block
-  height: 240px
-  margin-bottom: 40px
-  position: relative
-  vertical-align: top
-  width: 240px
-  svg
-    +overlay
-    display: block
-    height: 240px
-    width: 240px
-    &:first-child
-      animation-duration: 1.5s
-      animation-fill-mode: both
-      animation-name: fadeOut
-      animation-timing-function: $curve
-      g
-        animation-duration: 1s
-        animation-fill-mode: both
-        animation-name: strokePath
-        animation-timing-function: $curve
-        fill: none
-        stroke: $turquoise
-        stroke-dasharray: 880
-        stroke-width: 2px
-    &:last-child
-      animation-delay: 1s
-      animation-duration: 1s
-      animation-fill-mode: both
-      animation-name: fadeIn
-      animation-timing-function: $curve
-      g
-        fill: $turquoise
-  +mobile
-    border-radius: 16px
-    height: 160px
-    width: 160px
-
-#bulma
-  animation: slideDown 500ms both
-  // animation-delay: 1s
-
-#modern-framework
-  animation: slideUp 500ms both
-  animation-delay: 0.2s
-
-#npm
-  align-items: center
-  animation: fadeIn 500ms both
-  animation-delay: 0.4s
-  background: none
-  display: flex
-  justify-content: center
-  margin: -10px 0 20px
-  code
-    background: $background
-    border-radius: $radius
-    color: $primary
-    display: inline-block
-    font-size: 16px
-    padding: 16px 32px
-
-#ghbtns
-  animation: slideDown 500ms both
-  animation-delay: 0.6s
-
-html.route-index #carbon
-  animation: slideUp 500ms both
-  animation-delay: 0.8s
-
-#download
-  animation: fadeIn 500ms both
-  animation-delay: 1s
-
-#grid
-  .notification
-    padding-left: 0
-    padding-right: 0
-
-#message
-  display: none
-
-#tweet
-  background: $white
-  border-radius: $radius-large
-  box-shadow: 0 2px 3px rgba($black, 0.1), 0 0 0 1px rgba($black, 0.1)
-  padding: 1.5rem
diff --git a/docs/sass/override.sass b/docs/sass/override.sass
deleted file mode 100644 (file)
index da3cbdc..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-.button
-  +tablet
-    small
-      color: $text
-      left: 0
-      margin-top: 10px
-      position: absolute
-      top: 100%
-      width: 100%
-
-body.page-grid .column > .notification
-  padding-left: 0
-  padding-right: 0
-  text-align: center
-
-+tablet
-  .header-item .button + .button
-    margin-left: 0.75rem
diff --git a/docs/sass/route.sass b/docs/sass/route.sass
deleted file mode 100644 (file)
index 7e40335..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-html.route-index
-  .title.is-2
-    position: relative
-
-  .title.is-2 a
-    color: #242424
-    padding-left: 48px
-    position: relative
-
-  .title.is-2 a:hover
-    color: #00d1b2
-
-  .title.is-2 .icon.is-medium
-    left: 8px
-    position: absolute
-    top: 10px
-
-  .hero .title.is-2 a
-    color: white
-
-  .hero .title.is-2 a:hover
-    color: white
-
-  .hero.is-primary a.column,
-  .hero.is-primary a.column:hover
-    color: white
-
-  .hero.is-primary a.column:hover .title strong
-    border-bottom: 1px solid
-
-  @media screen and (max-width: 979px)
-    .title.is-2 a
-      padding-left: 0
-
-    .title.is-2 .icon.is-medium
-      display: none
diff --git a/docs/sass/specific.sass b/docs/sass/specific.sass
deleted file mode 100644 (file)
index 3b87f78..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#images
-  tr
-    td:nth-child(2)
-      width: 320px
-
-.color
-  border-radius: 2px
-  box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.1), inset 0 0 0 1px rgba(0, 0, 0, 0.1)
-  display: inline-block
-  float: left
-  height: 24px
-  margin-right: 8px
-  width: 24px
-
diff --git a/docs/vendor/clipboard-1.7.1.min.js b/docs/vendor/clipboard-1.7.1.min.js
new file mode 100644 (file)
index 0000000..90fd15b
--- /dev/null
@@ -0,0 +1,7 @@
+/*!
+ * clipboard.js v1.7.1
+ * https://zenorocha.github.io/clipboard.js
+ *
+ * Licensed MIT Â© Zeno Rocha
+ */
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function i(a,c){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!c&&l)return l(a,!0);if(r)return r(a,!0);var s=new Error("Cannot find module '"+a+"'");throw s.code="MODULE_NOT_FOUND",s}var u=n[a]={exports:{}};e[a][0].call(u.exports,function(t){var n=e[a][1][t];return i(n||t)},u,u.exports,t,e,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a<o.length;a++)i(o[a]);return i}({1:[function(t,e,n){function o(t,e){for(;t&&t.nodeType!==i;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}var i=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}e.exports=o},{}],2:[function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function i(t,e,n,o){return function(n){n.delegateTarget=r(n.target,e),n.delegateTarget&&o.call(t,n)}}var r=t("./closest");e.exports=o},{"./closest":1}],3:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},{}],4:[function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return i(t,e,n);if(c.nodeList(t))return r(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function r(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return l(document.body,t,e,n)}var c=t("./is"),l=t("delegate");e.exports=o},{"./is":3,delegate:2}],5:[function(t,e,n){function o(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),i=document.createRange();i.selectNodeContents(t),o.removeAllRanges(),o.addRange(i),e=o.toString()}return e}e.exports=o},{}],6:[function(t,e,n){function o(){}o.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){i.off(t,o),e.apply(n,arguments)}var i=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,i=n.length;for(o;o<i;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],i=[];if(o&&e)for(var r=0,a=o.length;r<a;r++)o[r].fn!==e&&o[r].fn._!==e&&i.push(o[r]);return i.length?n[t]=i:delete n[t],this}},e.exports=o},{}],7:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","select"],r);else if(void 0!==o)r(n,e("select"));else{var a={exports:{}};r(a,i.select),i.clipboardAction=a.exports}}(this,function(t,e){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=n(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},a=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),c=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return a(t,[{key:"resolveOptions",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function t(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function t(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=o+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function t(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function t(){this.selectedText=(0,i.default)(this.target),this.copyText()}},{key:"copyText",value:function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function t(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function t(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function t(){this.removeFake()}},{key:"action",set:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function t(){return this._action}},{key:"target",set:function t(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":r(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=c})},{select:5}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if(void 0!==o)r(n,e("./clipboard-action"),e("tiny-emitter"),e("good-listener"));else{var a={exports:{}};r(a,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=a.exports}}(this,function(t,e,n,o){"use strict";function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var s=i(e),u=i(n),f=i(o),d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},h=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),p=function(t){function e(t,n){r(this,e);var o=a(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return o.resolveOptions(n),o.listenClick(t),o}return c(e,t),h(e,[{key:"resolveOptions",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===d(e.container)?e.container:document.body}},{key:"listenClick",value:function t(e){var n=this;this.listener=(0,f.default)(e,"click",function(t){return n.onClick(t)})}},{key:"onClick",value:function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new s.default({action:this.action(n),target:this.target(n),text:this.text(n),container:this.container,trigger:n,emitter:this})}},{key:"defaultAction",value:function t(e){return l("action",e)}},{key:"defaultTarget",value:function t(e){var n=l("target",e);if(n)return document.querySelector(n)}},{key:"defaultText",value:function t(e){return l("text",e)}},{key:"destroy",value:function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],n="string"==typeof e?[e]:e,o=!!document.queryCommandSupported;return n.forEach(function(t){o=o&&!!document.queryCommandSupported(t)}),o}}]),e}(u.default);t.exports=p})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)});
\ No newline at end of file
diff --git a/docs/yarn.lock b/docs/yarn.lock
new file mode 100644 (file)
index 0000000..207248a
--- /dev/null
@@ -0,0 +1,2913 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+JSONStream@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a"
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
+abbrev@1, abbrev@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
+
+agent-base@4, agent-base@^4.0.1, agent-base@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.1.0.tgz#20e17401cd49b3c076bf56a4bc6c5b436ffa8d55"
+  dependencies:
+    es6-promisify "^5.0.0"
+
+agentkeepalive@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.3.0.tgz#6d5de5829afd3be2712201a39275fd11c651857c"
+  dependencies:
+    humanize-ms "^1.2.1"
+
+ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+ansi-align@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
+  dependencies:
+    string-width "^2.0.0"
+
+ansi-regex@^2.0.0, ansi-regex@~2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansicolors@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
+
+ansistyles@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
+
+anymatch@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
+  dependencies:
+    arrify "^1.0.0"
+    micromatch "^2.1.5"
+
+aproba@^1.0.3, aproba@^1.1.1, aproba@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1"
+
+archy@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arrify@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@^2.0.0:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+babel-cli@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283"
+  dependencies:
+    babel-core "^6.24.1"
+    babel-polyfill "^6.23.0"
+    babel-register "^6.24.1"
+    babel-runtime "^6.22.0"
+    commander "^2.8.1"
+    convert-source-map "^1.1.0"
+    fs-readdir-recursive "^1.0.0"
+    glob "^7.0.0"
+    lodash "^4.2.0"
+    output-file-sync "^1.1.0"
+    path-is-absolute "^1.0.0"
+    slash "^1.0.0"
+    source-map "^0.5.0"
+    v8flags "^2.0.10"
+  optionalDependencies:
+    chokidar "^1.6.1"
+
+babel-code-frame@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
+  dependencies:
+    chalk "^1.1.0"
+    esutils "^2.0.2"
+    js-tokens "^3.0.0"
+
+babel-core@^6.24.1:
+  version "6.25.0"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.25.0.tgz#7dd42b0463c742e9d5296deb3ec67a9322dad729"
+  dependencies:
+    babel-code-frame "^6.22.0"
+    babel-generator "^6.25.0"
+    babel-helpers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-register "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.25.0"
+    babel-traverse "^6.25.0"
+    babel-types "^6.25.0"
+    babylon "^6.17.2"
+    convert-source-map "^1.1.0"
+    debug "^2.1.1"
+    json5 "^0.5.0"
+    lodash "^4.2.0"
+    minimatch "^3.0.2"
+    path-is-absolute "^1.0.0"
+    private "^0.1.6"
+    slash "^1.0.0"
+    source-map "^0.5.0"
+
+babel-generator@^6.25.0:
+  version "6.25.0"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc"
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-types "^6.25.0"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.2.0"
+    source-map "^0.5.0"
+    trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+  dependencies:
+    babel-helper-explode-assignable-expression "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    lodash "^4.2.0"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+  dependencies:
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    lodash "^4.2.0"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+  dependencies:
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.5.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+  dependencies:
+    babel-helper-remap-async-to-generator "^6.24.1"
+    babel-plugin-syntax-async-functions "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.5.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.5.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+    lodash "^4.2.0"
+
+babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+  dependencies:
+    babel-helper-define-map "^6.24.1"
+    babel-helper-function-name "^6.24.1"
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-helper-replace-supers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.5.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0, babel-plugin-transform-es2015-destructuring@^6.6.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0, babel-plugin-transform-es2015-for-of@^6.6.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.5.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.5.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+  dependencies:
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe"
+  dependencies:
+    babel-plugin-transform-strict-mode "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+  dependencies:
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.5.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+  dependencies:
+    babel-helper-replace-supers "^6.24.1"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+  dependencies:
+    babel-helper-call-delegate "^6.24.1"
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.5.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.5.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.5.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.5.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+  dependencies:
+    babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+    babel-plugin-syntax-exponentiation-operator "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-assign@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-assign/-/babel-plugin-transform-object-assign-6.22.0.tgz#f99d2f66f1a0b0d498e346c5359684740caa20ba"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-proto-to-assign@^6.6.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-proto-to-assign/-/babel-plugin-transform-proto-to-assign-6.23.0.tgz#1c24951598793fc6a1d18118a11de1c36376fe2e"
+  dependencies:
+    babel-runtime "^6.22.0"
+    lodash "^4.2.0"
+
+babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418"
+  dependencies:
+    regenerator-transform "0.9.11"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-polyfill@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    core-js "^2.4.0"
+    regenerator-runtime "^0.10.0"
+
+babel-preset-env@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.5.2.tgz#cd4ae90a6e94b709f97374b33e5f8b983556adef"
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.22.0"
+    babel-plugin-syntax-trailing-function-commas "^6.22.0"
+    babel-plugin-transform-async-to-generator "^6.22.0"
+    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoping "^6.23.0"
+    babel-plugin-transform-es2015-classes "^6.23.0"
+    babel-plugin-transform-es2015-computed-properties "^6.22.0"
+    babel-plugin-transform-es2015-destructuring "^6.23.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+    babel-plugin-transform-es2015-for-of "^6.23.0"
+    babel-plugin-transform-es2015-function-name "^6.22.0"
+    babel-plugin-transform-es2015-literals "^6.22.0"
+    babel-plugin-transform-es2015-modules-amd "^6.22.0"
+    babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+    babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+    babel-plugin-transform-es2015-modules-umd "^6.23.0"
+    babel-plugin-transform-es2015-object-super "^6.22.0"
+    babel-plugin-transform-es2015-parameters "^6.23.0"
+    babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+    babel-plugin-transform-es2015-spread "^6.22.0"
+    babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+    babel-plugin-transform-es2015-template-literals "^6.22.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+    babel-plugin-transform-exponentiation-operator "^6.22.0"
+    babel-plugin-transform-regenerator "^6.22.0"
+    browserslist "^2.1.2"
+    invariant "^2.2.2"
+    semver "^5.3.0"
+
+babel-preset-es2015-ie@^6.7.0:
+  version "6.7.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-es2015-ie/-/babel-preset-es2015-ie-6.7.0.tgz#4fc39ff3310d07323a04bcd97c9c72979b407b62"
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.5.0"
+    babel-plugin-transform-es2015-arrow-functions "^6.5.0"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.5.0"
+    babel-plugin-transform-es2015-block-scoping "^6.6.0"
+    babel-plugin-transform-es2015-classes "^6.6.0"
+    babel-plugin-transform-es2015-computed-properties "^6.5.0"
+    babel-plugin-transform-es2015-destructuring "^6.6.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.6.0"
+    babel-plugin-transform-es2015-for-of "^6.6.0"
+    babel-plugin-transform-es2015-function-name "^6.5.0"
+    babel-plugin-transform-es2015-literals "^6.5.0"
+    babel-plugin-transform-es2015-modules-commonjs "^6.6.0"
+    babel-plugin-transform-es2015-object-super "^6.5.0"
+    babel-plugin-transform-es2015-parameters "^6.6.0"
+    babel-plugin-transform-es2015-shorthand-properties "^6.5.0"
+    babel-plugin-transform-es2015-spread "^6.5.0"
+    babel-plugin-transform-es2015-sticky-regex "^6.5.0"
+    babel-plugin-transform-es2015-template-literals "^6.6.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.6.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.5.0"
+    babel-plugin-transform-object-assign "^6.22.0"
+    babel-plugin-transform-proto-to-assign "^6.6.0"
+    babel-plugin-transform-regenerator "^6.6.0"
+
+babel-register@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
+  dependencies:
+    babel-core "^6.24.1"
+    babel-runtime "^6.22.0"
+    core-js "^2.4.0"
+    home-or-tmp "^2.0.0"
+    lodash "^4.2.0"
+    mkdirp "^0.5.1"
+    source-map-support "^0.4.2"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.10.0"
+
+babel-template@^6.24.1, babel-template@^6.25.0:
+  version "6.25.0"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.25.0"
+    babel-types "^6.25.0"
+    babylon "^6.17.2"
+    lodash "^4.2.0"
+
+babel-traverse@^6.24.1, babel-traverse@^6.25.0:
+  version "6.25.0"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1"
+  dependencies:
+    babel-code-frame "^6.22.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-types "^6.25.0"
+    babylon "^6.17.2"
+    debug "^2.2.0"
+    globals "^9.0.0"
+    invariant "^2.2.0"
+    lodash "^4.2.0"
+
+babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.25.0:
+  version "6.25.0"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e"
+  dependencies:
+    babel-runtime "^6.22.0"
+    esutils "^2.0.2"
+    lodash "^4.2.0"
+    to-fast-properties "^1.0.1"
+
+babylon@^6.17.2:
+  version "6.17.4"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+binary-extensions@^1.0.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
+
+bl@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e"
+  dependencies:
+    readable-stream "^2.0.5"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bluebird@^3.5.0, bluebird@~3.5.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
+
+boom@2.x.x:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    hoek "2.x.x"
+
+boxen@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102"
+  dependencies:
+    ansi-align "^2.0.0"
+    camelcase "^4.0.0"
+    chalk "^1.1.1"
+    cli-boxes "^1.0.0"
+    string-width "^2.0.0"
+    term-size "^0.1.0"
+    widest-line "^1.0.0"
+
+brace-expansion@^1.1.7:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+browserslist@^2.1.2:
+  version "2.1.5"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.5.tgz#e882550df3d1cd6d481c1a3e0038f2baf13a4711"
+  dependencies:
+    caniuse-lite "^1.0.30000684"
+    electron-to-chromium "^1.3.14"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtins@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
+
+cacache@^9.2.9, cacache@~9.2.8:
+  version "9.2.9"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-9.2.9.tgz#f9d7ffe039851ec94c28290662afa4dd4bb9e8dd"
+  dependencies:
+    bluebird "^3.5.0"
+    chownr "^1.0.1"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    lru-cache "^4.1.1"
+    mississippi "^1.3.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.1"
+    ssri "^4.1.6"
+    unique-filename "^1.1.0"
+    y18n "^3.2.1"
+
+call-limit@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea"
+
+camelcase@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caniuse-lite@^1.0.30000684:
+  version "1.0.30000696"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000696.tgz#30f2695d2a01a0dfd779a26ab83f4d134b3da5cc"
+
+capture-stack-trace@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chokidar@^1.6.1:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^1.0.0"
+    glob-parent "^2.0.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^2.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+chownr@^1.0.1, chownr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+cli-boxes@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+
+clone@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
+
+cmd-shim@~2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb"
+  dependencies:
+    graceful-fs "^4.1.2"
+    mkdirp "~0.5.0"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+columnify@~1.5.4:
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb"
+  dependencies:
+    strip-ansi "^3.0.0"
+    wcwidth "^1.0.0"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^2.8.1:
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.10.0.tgz#e1f5d3245de246d1a5ca04702fa1ad1bd7e405fe"
+  dependencies:
+    graceful-readlink ">= 1.0.0"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.5.0, concat-stream@^1.5.2:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+config-chain@~1.1.11:
+  version "1.1.11"
+  resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2"
+  dependencies:
+    ini "^1.3.4"
+    proto-list "~1.2.1"
+
+configstore@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1"
+  dependencies:
+    dot-prop "^4.1.0"
+    graceful-fs "^4.1.2"
+    make-dir "^1.0.0"
+    unique-string "^1.0.0"
+    write-file-atomic "^2.0.0"
+    xdg-basedir "^3.0.0"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+convert-source-map@^1.1.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+copy-concurrently@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.3.tgz#45fb7866249a1ca889aa5708e6cbd273e75bb250"
+  dependencies:
+    aproba "^1.1.1"
+    fs-write-stream-atomic "^1.0.8"
+    iferr "^0.1.5"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.0"
+
+core-js@^2.4.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
+
+core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-error-class@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+  dependencies:
+    capture-stack-trace "^1.0.0"
+
+cross-spawn-async@^2.1.1:
+  version "2.2.5"
+  resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc"
+  dependencies:
+    lru-cache "^4.0.0"
+    which "^1.2.8"
+
+cryptiles@2.x.x:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    boom "2.x.x"
+
+crypto-random-string@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+
+cyclist@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+debug@2, debug@^2.1.1, debug@^2.2.0, debug@^2.4.1:
+  version "2.6.8"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
+  dependencies:
+    ms "2.0.0"
+
+debuglog@*, debuglog@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
+
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+defaults@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+  dependencies:
+    clone "^1.0.2"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detect-indent@~5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
+
+dezalgo@^1.0.0, dezalgo@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
+  dependencies:
+    asap "^2.0.0"
+    wrappy "1"
+
+dot-prop@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1"
+  dependencies:
+    is-obj "^1.0.0"
+
+duplexer3@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+duplexify@^3.1.2, duplexify@^3.4.2:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604"
+  dependencies:
+    end-of-stream "1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
+editor@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742"
+
+electron-to-chromium@^1.3.14:
+  version "1.3.15"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz#08397934891cbcfaebbd18b82a95b5a481138369"
+
+encoding@^0.1.11:
+  version "0.1.12"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+  dependencies:
+    iconv-lite "~0.4.13"
+
+end-of-stream@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e"
+  dependencies:
+    once "~1.3.0"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
+  dependencies:
+    once "^1.4.0"
+
+err-code@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
+
+es6-promise@^4.0.3:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.1.1.tgz#8811e90915d9a0dba36274f0b242dbda78f9c92a"
+
+es6-promisify@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+  dependencies:
+    es6-promise "^4.0.3"
+
+escape-string-regexp@^1.0.2:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+execa@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3"
+  dependencies:
+    cross-spawn-async "^2.1.1"
+    is-stream "^1.1.0"
+    npm-run-path "^1.0.0"
+    object-assign "^4.0.1"
+    path-key "^1.0.0"
+    strip-eof "^1.0.0"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+extend@~3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extsprintf@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fill-range@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^1.1.3"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+flush-write-stream@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.4"
+
+for-in@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+from2@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~1.1.10"
+
+from2@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-readdir-recursive@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
+
+fs-vacuum@~1.2.10:
+  version "1.2.10"
+  resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36"
+  dependencies:
+    graceful-fs "^4.1.2"
+    path-is-inside "^1.0.1"
+    rimraf "^2.5.2"
+
+fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  dependencies:
+    graceful-fs "^4.1.2"
+    iferr "^0.1.5"
+    imurmurhash "^0.1.4"
+    readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4"
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.36"
+
+fstream-ignore@^1.0.0, fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream-npm@~1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.2.1.tgz#08c4a452f789dcbac4c89a4563c902b2c862fd5b"
+  dependencies:
+    fstream-ignore "^1.0.0"
+    inherits "2"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2, fstream@~1.0.11:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+genfun@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1"
+
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^9.0.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+got@^6.7.1:
+  version "6.7.1"
+  resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
+  dependencies:
+    create-error-class "^3.0.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    is-redirect "^1.0.0"
+    is-retry-allowed "^1.0.0"
+    is-stream "^1.0.0"
+    lowercase-keys "^1.0.0"
+    safe-buffer "^5.0.1"
+    timed-out "^4.0.0"
+    unzip-response "^2.0.1"
+    url-parse-lax "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@~4.1.11:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+"graceful-readlink@>= 1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    har-schema "^1.0.5"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-unicode@^2.0.0, has-unicode@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.x.x"
+    sntp "1.x.x"
+
+hoek@2.x.x:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4, hosted-git-info@^2.4.2, hosted-git-info@~2.4.2:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
+
+http-cache-semantics@^3.7.3:
+  version "3.7.3"
+  resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.7.3.tgz#2f35c532ecd29f1e5413b9af833b724a3c6f7f72"
+
+http-proxy-agent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.0.0.tgz#46482a2f0523a4d6082551709f469cb3e4a85ff4"
+  dependencies:
+    agent-base "4"
+    debug "2"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+https-proxy-agent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.0.0.tgz#ffaa4b6faf586ac340c18a140431e76b7d7f2944"
+  dependencies:
+    agent-base "^4.1.0"
+    debug "^2.4.1"
+
+humanize-ms@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+  dependencies:
+    ms "^2.0.0"
+
+i@^0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/i/-/i-0.3.5.tgz#1d2b854158ec8169113c6cb7f6b6801e99e211d5"
+
+iconv-lite@~0.4.13:
+  version "0.4.18"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.18.tgz#23d8656b16aae6742ac29732ea8f0336a4789cf2"
+
+iferr@^0.1.5, iferr@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+imurmurhash@*, imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+inflight@^1.0.4, inflight@~1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+ini@^1.3.4, ini@~1.3.0, ini@~1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+init-package-json@~1.10.1:
+  version "1.10.1"
+  resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.1.tgz#cd873a167796befb99612b28762a0b6393fd8f6a"
+  dependencies:
+    glob "^7.1.1"
+    npm-package-arg "^4.0.0 || ^5.0.0"
+    promzard "^0.3.0"
+    read "~1.0.1"
+    read-package-json "1 || 2"
+    semver "2.x || 3.x || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+    validate-npm-package-name "^3.0.0"
+
+invariant@^2.2.0, invariant@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+  dependencies:
+    loose-envify "^1.0.0"
+
+ip@^1.1.4:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-npm@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-obj@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-redirect@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
+is-retry-allowed@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-stream@^1.0.0, is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+jju@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa"
+
+js-tokens@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-parse-helpfulerror@^1.0.2, json-parse-helpfulerror@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc"
+  dependencies:
+    jju "^1.1.0"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json5@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+
+jsprim@^1.2.2:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.0.2"
+    json-schema "0.2.3"
+    verror "1.3.6"
+
+kind-of@^3.0.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+latest-version@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
+  dependencies:
+    package-json "^4.0.0"
+
+lazy-property@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147"
+
+lazy-req@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4"
+
+lockfile@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79"
+
+lodash._baseindexof@*:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c"
+
+lodash._baseuniq@~4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
+  dependencies:
+    lodash._createset "~4.0.0"
+    lodash._root "~3.0.0"
+
+lodash._bindcallback@*:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
+
+lodash._cacheindexof@*:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92"
+
+lodash._createcache@*:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093"
+  dependencies:
+    lodash._getnative "^3.0.0"
+
+lodash._createset@~4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
+
+lodash._getnative@*, lodash._getnative@^3.0.0:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
+lodash._root@~3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692"
+
+lodash.clonedeep@~4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+
+lodash.restparam@*:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+
+lodash.union@~4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
+
+lodash.uniq@~4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+
+lodash.without@~4.4.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
+
+lodash@^4.2.0:
+  version "4.17.4"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+loose-envify@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+  dependencies:
+    js-tokens "^3.0.0"
+
+lowercase-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+
+lru-cache@^4.0.0, lru-cache@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+lru-cache@~4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e"
+  dependencies:
+    pseudomap "^1.0.1"
+    yallist "^2.0.0"
+
+make-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978"
+  dependencies:
+    pify "^2.3.0"
+
+make-fetch-happen@^2.4.13:
+  version "2.4.13"
+  resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-2.4.13.tgz#3139ba2f4230a8384e7ba394534816c872ecbf4b"
+  dependencies:
+    agentkeepalive "^3.3.0"
+    cacache "^9.2.9"
+    http-cache-semantics "^3.7.3"
+    http-proxy-agent "^2.0.0"
+    https-proxy-agent "^2.0.0"
+    lru-cache "^4.1.1"
+    mississippi "^1.2.0"
+    node-fetch-npm "^2.0.1"
+    promise-retry "^1.1.1"
+    socks-proxy-agent "^3.0.0"
+    ssri "^4.1.6"
+
+micromatch@^2.1.5:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+mime-db@~1.27.0:
+  version "1.27.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
+
+mime-types@^2.1.12, mime-types@~2.1.7:
+  version "2.1.15"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
+  dependencies:
+    mime-db "~1.27.0"
+
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+mississippi@^1.2.0, mississippi@^1.3.0, mississippi@~1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.0.tgz#d201583eb12327e3c5c1642a404a9cacf94e34f5"
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^1.0.0"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+move-concurrently@^1.0.1, move-concurrently@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  dependencies:
+    aproba "^1.1.1"
+    copy-concurrently "^1.0.0"
+    fs-write-stream-atomic "^1.0.8"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.3"
+
+ms@2.0.0, ms@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+mute-stream@~0.0.4:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+nan@^2.3.0:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
+
+node-fetch-npm@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.1.tgz#4dd3355ce526c01bc5ab29ccdf48352dc8a79465"
+  dependencies:
+    encoding "^0.1.11"
+    json-parse-helpfulerror "^1.0.3"
+    safe-buffer "^5.0.1"
+
+node-gyp@~3.6.2:
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60"
+  dependencies:
+    fstream "^1.0.0"
+    glob "^7.0.3"
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.0"
+    nopt "2 || 3"
+    npmlog "0 || 1 || 2 || 3 || 4"
+    osenv "0"
+    request "2"
+    rimraf "2"
+    semver "~5.3.0"
+    tar "^2.0.0"
+    which "1"
+
+node-pre-gyp@^0.6.36:
+  version "0.6.36"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
+  dependencies:
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    npmlog "^4.0.2"
+    rc "^1.1.7"
+    request "^2.81.0"
+    rimraf "^2.6.1"
+    semver "^5.3.0"
+    tar "^2.2.1"
+    tar-pack "^3.4.0"
+
+"nopt@2 || 3":
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+  dependencies:
+    abbrev "1"
+
+nopt@^4.0.1, nopt@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.0.0, normalize-package-data@^2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+"normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.3.8:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+npm-cache-filename@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11"
+
+npm-install-checks@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7"
+  dependencies:
+    semver "^2.3.0 || 3.x || 4 || 5"
+
+"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0", "npm-package-arg@^4.0.0 || ^5.0.0", npm-package-arg@^5.1.2, npm-package-arg@~5.1.2:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-5.1.2.tgz#fb18d17bb61e60900d6312619919bd753755ab37"
+  dependencies:
+    hosted-git-info "^2.4.2"
+    osenv "^0.1.4"
+    semver "^5.1.0"
+    validate-npm-package-name "^3.0.0"
+
+npm-pick-manifest@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-1.0.4.tgz#a5ee6510c1fe7221c0bc0414e70924c14045f7e8"
+  dependencies:
+    npm-package-arg "^5.1.2"
+    semver "^5.3.0"
+
+npm-registry-client@~8.3.0:
+  version "8.3.0"
+  resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.3.0.tgz#a86d5b1f97945de8df73c471d33602d5cd15130f"
+  dependencies:
+    concat-stream "^1.5.2"
+    graceful-fs "^4.1.6"
+    normalize-package-data "~1.0.1 || ^2.0.0"
+    npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0"
+    once "^1.3.3"
+    request "^2.74.0"
+    retry "^0.10.0"
+    semver "2 >=2.2.1 || 3.x || 4 || 5"
+    slide "^1.1.3"
+    ssri "^4.1.2"
+  optionalDependencies:
+    npmlog "2 || ^3.1.0 || ^4.0.0"
+
+npm-run-path@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f"
+  dependencies:
+    path-key "^1.0.0"
+
+npm-user-validate@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951"
+
+npm@^5.0.4:
+  version "5.0.4"
+  resolved "https://registry.yarnpkg.com/npm/-/npm-5.0.4.tgz#67a201dd6fb4de7b27d02761432fb27df12e35ce"
+  dependencies:
+    JSONStream "~1.3.1"
+    abbrev "~1.1.0"
+    ansi-regex "~2.1.1"
+    ansicolors "~0.3.2"
+    ansistyles "~0.1.3"
+    aproba "~1.1.2"
+    archy "~1.0.0"
+    bluebird "~3.5.0"
+    cacache "~9.2.8"
+    call-limit "~1.1.0"
+    chownr "~1.0.1"
+    cmd-shim "~2.0.2"
+    columnify "~1.5.4"
+    config-chain "~1.1.11"
+    detect-indent "~5.0.0"
+    dezalgo "~1.0.3"
+    editor "~1.0.0"
+    fs-vacuum "~1.2.10"
+    fs-write-stream-atomic "~1.0.10"
+    fstream "~1.0.11"
+    fstream-npm "~1.2.1"
+    glob "~7.1.2"
+    graceful-fs "~4.1.11"
+    has-unicode "~2.0.1"
+    hosted-git-info "~2.4.2"
+    iferr "~0.1.5"
+    inflight "~1.0.6"
+    inherits "~2.0.3"
+    ini "~1.3.4"
+    init-package-json "~1.10.1"
+    lazy-property "~1.0.0"
+    lockfile "~1.0.3"
+    lodash._baseuniq "~4.6.0"
+    lodash.clonedeep "~4.5.0"
+    lodash.union "~4.6.0"
+    lodash.uniq "~4.5.0"
+    lodash.without "~4.4.0"
+    lru-cache "~4.0.2"
+    mississippi "~1.3.0"
+    mkdirp "~0.5.1"
+    move-concurrently "~1.0.1"
+    node-gyp "~3.6.2"
+    nopt "~4.0.1"
+    normalize-package-data "~2.3.8"
+    npm-cache-filename "~1.0.2"
+    npm-install-checks "~3.0.0"
+    npm-package-arg "~5.1.2"
+    npm-registry-client "~8.3.0"
+    npm-user-validate "~1.0.0"
+    npmlog "~4.1.0"
+    once "~1.4.0"
+    opener "~1.4.3"
+    osenv "~0.1.4"
+    pacote "~2.7.34"
+    path-is-inside "~1.0.2"
+    promise-inflight "~1.0.1"
+    read "~1.0.7"
+    read-cmd-shim "~1.0.1"
+    read-installed "~4.0.3"
+    read-package-json "~2.0.5"
+    read-package-tree "~5.1.6"
+    readable-stream "~2.2.10"
+    request "~2.81.0"
+    retry "~0.10.1"
+    rimraf "~2.6.1"
+    safe-buffer "~5.1.0"
+    semver "~5.3.0"
+    sha "~2.0.1"
+    slide "~1.1.6"
+    sorted-object "~2.0.1"
+    sorted-union-stream "~2.1.3"
+    ssri "~4.1.6"
+    strip-ansi "~3.0.1"
+    tar "~2.2.1"
+    text-table "~0.2.0"
+    uid-number "0.0.6"
+    umask "~1.1.0"
+    unique-filename "~1.1.0"
+    unpipe "~1.0.0"
+    update-notifier "~2.1.0"
+    uuid "~3.0.1"
+    validate-npm-package-name "~3.0.0"
+    which "~1.2.14"
+    wrappy "~1.0.2"
+    write-file-atomic "~2.1.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.2, npmlog@~4.1.0:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+oauth-sign@~0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+once@~1.3.0:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20"
+  dependencies:
+    wrappy "1"
+
+opener@~1.4.3:
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8"
+
+os-homedir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@0, osenv@^0.1.4, osenv@~0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+output-file-sync@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
+  dependencies:
+    graceful-fs "^4.1.4"
+    mkdirp "^0.5.1"
+    object-assign "^4.1.0"
+
+package-json@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
+  dependencies:
+    got "^6.7.1"
+    registry-auth-token "^3.0.1"
+    registry-url "^3.0.3"
+    semver "^5.1.0"
+
+pacote@~2.7.34:
+  version "2.7.38"
+  resolved "https://registry.yarnpkg.com/pacote/-/pacote-2.7.38.tgz#5091f8774298c26c3eca24606037f1bb73db74c1"
+  dependencies:
+    bluebird "^3.5.0"
+    cacache "^9.2.9"
+    glob "^7.1.2"
+    lru-cache "^4.1.1"
+    make-fetch-happen "^2.4.13"
+    minimatch "^3.0.4"
+    mississippi "^1.2.0"
+    normalize-package-data "^2.4.0"
+    npm-package-arg "^5.1.2"
+    npm-pick-manifest "^1.0.4"
+    osenv "^0.1.4"
+    promise-inflight "^1.0.1"
+    promise-retry "^1.1.1"
+    protoduck "^4.0.0"
+    safe-buffer "^5.1.1"
+    semver "^5.3.0"
+    ssri "^4.1.6"
+    tar-fs "^1.15.3"
+    tar-stream "^1.5.4"
+    unique-filename "^1.1.0"
+    which "^1.2.12"
+
+parallel-transform@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+  dependencies:
+    cyclist "~0.2.2"
+    inherits "^2.0.3"
+    readable-stream "^2.1.5"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1, path-is-inside@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af"
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+pify@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+prepend-http@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+private@^0.1.6:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+promise-inflight@^1.0.1, promise-inflight@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+promise-retry@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d"
+  dependencies:
+    err-code "^1.0.0"
+    retry "^0.10.0"
+
+promzard@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee"
+  dependencies:
+    read "1"
+
+proto-list@~1.2.1:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+
+protoduck@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-4.0.0.tgz#fe4874d8c7913366cfd9ead12453a22cd3657f8e"
+  dependencies:
+    genfun "^4.0.1"
+
+pseudomap@^1.0.1, pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+pump@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pumpify@^1.3.3:
+  version "1.3.5"
+  resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b"
+  dependencies:
+    duplexify "^3.1.2"
+    inherits "^2.0.1"
+    pump "^1.0.0"
+
+punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+qs@~6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+randomatic@^1.1.3:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
+  dependencies:
+    deep-extend "~0.4.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+read-cmd-shim@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b"
+  dependencies:
+    graceful-fs "^4.1.2"
+
+read-installed@~4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067"
+  dependencies:
+    debuglog "^1.0.1"
+    read-package-json "^2.0.0"
+    readdir-scoped-modules "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    slide "~1.1.3"
+    util-extend "^1.0.1"
+  optionalDependencies:
+    graceful-fs "^4.1.2"
+
+"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@~2.0.5:
+  version "2.0.10"
+  resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.10.tgz#dc0229f6dde6b4b705b39e25b2d970ebe95685ae"
+  dependencies:
+    glob "^7.1.1"
+    json-parse-helpfulerror "^1.0.2"
+    normalize-package-data "^2.0.0"
+  optionalDependencies:
+    graceful-fs "^4.1.2"
+
+read-package-tree@~5.1.6:
+  version "5.1.6"
+  resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.1.6.tgz#4f03e83d0486856fb60d97c94882841c2a7b1b7a"
+  dependencies:
+    debuglog "^1.0.1"
+    dezalgo "^1.0.0"
+    once "^1.3.0"
+    read-package-json "^2.0.0"
+    readdir-scoped-modules "^1.0.0"
+
+read@1, read@~1.0.1, read@~1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
+  dependencies:
+    mute-stream "~0.0.4"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.0.3"
+    util-deprecate "~1.0.1"
+
+readable-stream@~1.1.10:
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@~2.2.10:
+  version "2.2.11"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a8088d34aa17c0f72"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    safe-buffer "~5.0.1"
+    string_decoder "~1.0.0"
+    util-deprecate "~1.0.1"
+
+readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747"
+  dependencies:
+    debuglog "^1.0.1"
+    dezalgo "^1.0.0"
+    graceful-fs "^4.1.2"
+    once "^1.3.0"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+regenerate@^1.2.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
+
+regenerator-runtime@^0.10.0:
+  version "0.10.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
+regenerator-transform@0.9.11:
+  version "0.9.11"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283"
+  dependencies:
+    babel-runtime "^6.18.0"
+    babel-types "^6.19.0"
+    private "^0.1.6"
+
+regex-cache@^0.4.2:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+    is-primitive "^2.0.0"
+
+regexpu-core@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+registry-auth-token@^3.0.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006"
+  dependencies:
+    rc "^1.1.6"
+    safe-buffer "^5.0.1"
+
+registry-url@^3.0.3:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
+  dependencies:
+    rc "^1.0.1"
+
+regjsgen@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+  dependencies:
+    jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+request@2, request@^2.74.0, request@^2.81.0, request@~2.81.0:
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+retry@^0.10.0, retry@~0.10.1:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
+
+rimraf@2, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@~2.6.1:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
+  dependencies:
+    glob "^7.0.5"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  dependencies:
+    aproba "^1.1.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+safe-buffer@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
+
+semver-diff@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
+  dependencies:
+    semver "^5.0.3"
+
+"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@~5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+sha@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae"
+  dependencies:
+    graceful-fs "^4.1.2"
+    readable-stream "^2.0.2"
+
+signal-exit@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slide@^1.1.3, slide@^1.1.5, slide@~1.1.3, slide@~1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+
+smart-buffer@^1.0.13:
+  version "1.1.15"
+  resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16"
+
+sntp@1.x.x:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+  dependencies:
+    hoek "2.x.x"
+
+socks-proxy-agent@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.0.tgz#ea23085cd2bde94d084a62448f31139ca7ed6245"
+  dependencies:
+    agent-base "^4.0.1"
+    socks "^1.1.10"
+
+socks@^1.1.10:
+  version "1.1.10"
+  resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a"
+  dependencies:
+    ip "^1.1.4"
+    smart-buffer "^1.0.13"
+
+sorted-object@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc"
+
+sorted-union-stream@~2.1.3:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7"
+  dependencies:
+    from2 "^1.3.0"
+    stream-iterate "^1.1.0"
+
+source-map-support@^0.4.2:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1"
+  dependencies:
+    source-map "^0.5.6"
+
+source-map@^0.5.0, source-map@^0.5.6:
+  version "0.5.6"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+
+spdx-correct@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+  dependencies:
+    spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+sshpk@^1.7.0:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+ssri@^4.1.2, ssri@^4.1.6, ssri@~4.1.6:
+  version "4.1.6"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-4.1.6.tgz#0cb49b6ac84457e7bdd466cb730c3cb623e9a25b"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+stream-each@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.0.tgz#1e95d47573f580d814dc0ff8cd0f66f1ce53c991"
+  dependencies:
+    end-of-stream "^1.1.0"
+    stream-shift "^1.0.0"
+
+stream-iterate@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1"
+  dependencies:
+    readable-stream "^2.1.5"
+    stream-shift "^1.0.0"
+
+stream-shift@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string-width@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.0.tgz#030664561fc146c9423ec7d978fe2457437fe6d0"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.0, string_decoder@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+stringstream@~0.0.4:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+tar-fs@^1.15.3:
+  version "1.15.3"
+  resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.15.3.tgz#eccf935e941493d8151028e636e51ce4c3ca7f20"
+  dependencies:
+    chownr "^1.0.1"
+    mkdirp "^0.5.1"
+    pump "^1.0.0"
+    tar-stream "^1.1.2"
+
+tar-pack@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
+  dependencies:
+    debug "^2.2.0"
+    fstream "^1.0.10"
+    fstream-ignore "^1.0.5"
+    once "^1.3.3"
+    readable-stream "^2.1.4"
+    rimraf "^2.5.1"
+    tar "^2.2.1"
+    uid-number "^0.0.6"
+
+tar-stream@^1.1.2, tar-stream@^1.5.4:
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016"
+  dependencies:
+    bl "^1.0.0"
+    end-of-stream "^1.0.0"
+    readable-stream "^2.0.0"
+    xtend "^4.0.0"
+
+tar@^2.0.0, tar@^2.2.1, tar@~2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+term-size@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca"
+  dependencies:
+    execa "^0.4.0"
+
+text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+through2@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+"through@>=2.2.7 <3":
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+timed-out@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+
+to-fast-properties@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+tough-cookie@~2.3.0:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
+  dependencies:
+    punycode "^1.4.1"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uid-number@0.0.6, uid-number@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+umask@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
+
+unique-filename@^1.1.0, unique-filename@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+  dependencies:
+    imurmurhash "^0.1.4"
+
+unique-string@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
+  dependencies:
+    crypto-random-string "^1.0.0"
+
+unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+unzip-response@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
+
+update-notifier@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9"
+  dependencies:
+    boxen "^1.0.0"
+    chalk "^1.0.0"
+    configstore "^3.0.0"
+    is-npm "^1.0.0"
+    latest-version "^3.0.0"
+    lazy-req "^2.0.0"
+    semver-diff "^2.0.0"
+    xdg-basedir "^3.0.0"
+
+url-parse-lax@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+  dependencies:
+    prepend-http "^1.0.1"
+
+user-home@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util-extend@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f"
+
+uuid@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
+
+uuid@~3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+
+v8flags@^2.0.10:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
+  dependencies:
+    user-home "^1.1.1"
+
+validate-npm-package-license@*, validate-npm-package-license@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+  dependencies:
+    spdx-correct "~1.0.0"
+    spdx-expression-parse "~1.0.0"
+
+validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
+  dependencies:
+    builtins "^1.0.3"
+
+verror@1.3.6:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
+  dependencies:
+    extsprintf "1.0.2"
+
+wcwidth@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+  dependencies:
+    defaults "^1.0.3"
+
+which@1, which@^1.2.12, which@^1.2.8, which@~1.2.14:
+  version "1.2.14"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+  dependencies:
+    string-width "^1.0.2"
+
+widest-line@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c"
+  dependencies:
+    string-width "^1.0.1"
+
+wrappy@1, wrappy@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^2.0.0, write-file-atomic@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    slide "^1.1.5"
+
+xdg-basedir@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
+
+xtend@^4.0.0, xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.0.0, yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
index d3220a4dc1beb1fa2ff2bf5dd1dd1182c91220c8..4fc23a75c5189243353e4413d7312c2dd254fd3d 100644 (file)
@@ -2,16 +2,18 @@ $navbar-background: $white !default
 $navbar-height: 3.25rem !default
 
 $navbar-item: $grey-dark !default
-$navbar-item-hover: $grey-darker !default
+$navbar-item-hover: $black !default
 $navbar-item-hover-background: $background !default
-$navbar-item-desktop-hover-background: transparent !default
+$navbar-item-active: $black !default
 
 $navbar-dropdown-background: $white !default
+$navbar-dropdown-border: $border !default
 $navbar-dropdown-offset: -4px !default
 $navbar-dropdown-arrow: $link !default
 $navbar-dropdown-radius: $radius-large !default
 
 $navbar-dropdown-item-hover-background: $background !default
+$navbar-dropdown-item-active: $primary !default
 
 $navbar-divider-background: $border !default
 
@@ -45,6 +47,8 @@ a.navbar-item,
   &:hover
     background-color: $navbar-item-hover-background
     color: $navbar-item-hover
+  &.is-active
+    color: $navbar-item-active
 
 .navbar-item
   flex-grow: 0
@@ -68,8 +72,11 @@ a.navbar-item,
   .navbar-item
     padding-left: 1.5rem
     padding-right: 1.5rem
-  a.navbar-item:hover
-    background-color: $navbar-dropdown-item-hover-background
+  a.navbar-item
+    &:hover
+      background-color: $navbar-dropdown-item-hover-background
+    &.is-active
+      color: $navbar-dropdown-item-active
 
 .navbar-divider
   background-color: $navbar-divider-background
@@ -97,6 +104,14 @@ a.navbar-item,
     display: flex
   .navbar
     height: $navbar-height
+    &.is-transparent
+      .navbar-brand,
+      .navbar-start,
+      .navbar-end
+        .navbar-link,
+        & > a.navbar-item
+          &:hover
+            background-color: transparent
   .navbar-burger
     display: none
   .navbar-item,
@@ -115,10 +130,10 @@ a.navbar-item,
     &.is-hoverable:hover
         .navbar-dropdown
           display: block
-  a.navbar-item,
-  .navbar-link
-    &:hover
-     background-color: $navbar-item-desktop-hover-background
+          &.is-boxed
+            opacity: 1
+            pointer-events: auto
+            transform: translateY(0)
   .navbar-menu
     flex-grow: 1
     flex-shrink: 0
@@ -130,18 +145,31 @@ a.navbar-item,
     margin-left: auto
   .navbar-dropdown
     background-color: $navbar-dropdown-background
-    border-radius: $navbar-dropdown-radius
-    box-shadow: 0 8px 8px rgba($black, 0.1), 0 0 0 1px rgba($black, 0.1)
+    border-bottom-left-radius: $navbar-dropdown-radius
+    border-bottom-right-radius: $navbar-dropdown-radius
+    border-top: 1px solid $navbar-dropdown-border
+    box-shadow: 0 8px 8px rgba($black, 0.1)
     display: none
     font-size: 0.875rem
     left: 0
     min-width: 100%
     position: absolute
-    top: calc(100% + (#{$navbar-dropdown-offset}))
+    top: 100%
     z-index: 20
     .navbar-item
       padding: 0.375rem 1rem
       white-space: nowrap
+    &.is-boxed
+      border-radius: $navbar-dropdown-radius
+      border-top: none
+      box-shadow: 0 8px 8px rgba($black, 0.1), 0 0 0 1px rgba($black, 0.1)
+      display: block
+      opacity: 0
+      pointer-events: none
+      top: calc(100% + (#{$navbar-dropdown-offset}))
+      transform: translateY(-5px)
+      transition-duration: $speed
+      transition-property: opacity, transform
   .navbar-divider
     display: block
   .container > .navbar