diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index b028f949581689d368b7a18a5b7c7264343ea6fa..e492bf2aee1a7d9ea2ad525cd3cd71213ec2620b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -25,8 +25,8 @@ deploy_production:
         - bundle exec jekyll build -d public
         - /www/utils/deploycourseweb.sh
     variables:
-        quarter: 21wi
-        course: cse340
+        quarter: eg21wi
+        course: egcse340
         source_path: public
     only:
         refs:
diff --git a/Gemfile b/Gemfile
index 1e2d8910c870b02d62d7134ad14af0276cfbcd88..a2389ab68edde805de231d9050d9cc7dda2f6c10 100644
--- a/Gemfile
+++ b/Gemfile
@@ -15,6 +15,7 @@ gem "jekyll", "< 4.0"
 # If you have any plugins, put them here!
 group :jekyll_plugins do
   gem 'execjs'
+  gem 'jekyll-seo-tag'
   gem 'jekyll-redirect-from'
   gem 'jekyll-target-blank'
   gem "jekyll-feed"
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000000000000000000000000000000000000..ecd5d235c394aebfe8791651f65c67b0f42a4484
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,171 @@
+PATH
+  remote: .
+  specs:
+    jekyll-theme-cayman (0.1.1)
+      jekyll (~> 3.1)
+      jekyll-seo-tag (~> 2.0)
+
+GEM
+  remote: https://rubygems.org/
+  specs:
+    addressable (2.7.0)
+      public_suffix (>= 2.0.2, < 5.0)
+    ast (2.4.0)
+    colorator (1.1.0)
+    concurrent-ruby (1.1.6)
+    em-websocket (0.5.1)
+      eventmachine (>= 0.12.9)
+      http_parser.rb (~> 0.6.0)
+    ethon (0.12.0)
+      ffi (>= 1.3.0)
+    eventmachine (1.2.7)
+    execjs (2.7.0)
+    extras (0.3.0)
+      forwardable-extended (~> 2.5)
+    fastimage (2.1.7)
+    ffi (1.12.2)
+    font-awesome-sass (5.12.0)
+      sassc (>= 1.11)
+    forwardable-extended (2.6.0)
+    hpricot (0.8.6)
+    html-proofer (3.15.1)
+      addressable (~> 2.3)
+      mercenary (~> 0.3)
+      nokogumbo (~> 2.0)
+      parallel (~> 1.3)
+      rainbow (~> 3.0)
+      typhoeus (~> 1.3)
+      yell (~> 2.0)
+    http_parser.rb (0.6.0)
+    i18n (0.9.5)
+      concurrent-ruby (~> 1.0)
+    jaro_winkler (1.5.4)
+    jekyll (3.7.4)
+      addressable (~> 2.4)
+      colorator (~> 1.0)
+      em-websocket (~> 0.5)
+      i18n (~> 0.7)
+      jekyll-sass-converter (~> 1.0)
+      jekyll-watch (~> 2.0)
+      kramdown (~> 1.14)
+      liquid (~> 4.0)
+      mercenary (~> 0.3.3)
+      pathutil (~> 0.9)
+      rouge (>= 1.7, < 4)
+      safe_yaml (~> 1.0)
+    jekyll-assets (2.4.0)
+      concurrent-ruby (~> 1.0)
+      extras (~> 0.2)
+      fastimage (~> 2.0, >= 1.8)
+      jekyll (~> 3.1, >= 3.0)
+      pathutil (>= 0.8)
+      rack (~> 1.6)
+      sprockets (~> 3.3, < 3.8)
+    jekyll-contentblocks (1.2.0)
+      jekyll
+    jekyll-feed (0.13.0)
+      jekyll (>= 3.7, < 5.0)
+    jekyll-font-awesome-sass (0.1.1)
+      font-awesome-sass (>= 4)
+      jekyll (>= 2.5, < 4.0)
+    jekyll-mermaid (1.0.0)
+    jekyll-paginate (1.1.0)
+    jekyll-redirect-from (0.16.0)
+      jekyll (>= 3.3, < 5.0)
+    jekyll-sass-converter (1.5.2)
+      sass (~> 3.4)
+    jekyll-seo-tag (2.6.1)
+      jekyll (>= 3.3, < 5.0)
+    jekyll-target-blank (2.0.0)
+      jekyll (>= 3.0, < 5.0)
+      nokogiri (~> 1.10)
+    jekyll-watch (2.2.1)
+      listen (~> 3.0)
+    json (2.3.0)
+    kramdown (1.17.0)
+    libv8 (3.16.14.19)
+    liquid (4.0.3)
+    listen (3.2.1)
+      rb-fsevent (~> 0.10, >= 0.10.3)
+      rb-inotify (~> 0.9, >= 0.9.10)
+    mercenary (0.3.6)
+    mini_portile2 (2.4.0)
+    nokogiri (1.10.8)
+      mini_portile2 (~> 2.4.0)
+    nokogumbo (2.0.2)
+      nokogiri (~> 1.8, >= 1.8.4)
+    parallel (1.19.1)
+    parser (2.7.0.2)
+      ast (~> 2.4.0)
+    pathutil (0.16.2)
+      forwardable-extended (~> 2.6)
+    public_suffix (4.0.3)
+    rack (1.6.10)
+    rainbow (3.0.0)
+    rb-fsevent (0.10.3)
+    rb-inotify (0.10.1)
+      ffi (~> 1.0)
+    ref (2.0.0)
+    remark (0.3.2)
+      hpricot (~> 0.8.2)
+    rexml (3.2.4)
+    rouge (3.16.0)
+    rubocop (0.80.0)
+      jaro_winkler (~> 1.5.1)
+      parallel (~> 1.10)
+      parser (>= 2.7.0.1)
+      rainbow (>= 2.2.2, < 4.0)
+      rexml
+      ruby-progressbar (~> 1.7)
+      unicode-display_width (>= 1.4.0, < 1.7)
+    ruby-progressbar (1.10.1)
+    safe_yaml (1.0.5)
+    sass (3.7.4)
+      sass-listen (~> 4.0.0)
+    sass-listen (4.0.0)
+      rb-fsevent (~> 0.9, >= 0.9.4)
+      rb-inotify (~> 0.9, >= 0.9.7)
+    sassc (2.2.1)
+      ffi (~> 1.9)
+    sprockets (3.7.2)
+      concurrent-ruby (~> 1.0)
+      rack (> 1, < 3)
+    therubyracer (0.12.3)
+      libv8 (~> 3.16.14.15)
+      ref
+    typhoeus (1.3.1)
+      ethon (>= 0.9.0)
+    uglifier (4.2.0)
+      execjs (>= 0.3.0, < 3)
+    unicode-display_width (1.6.1)
+    w3c_validators (1.3.4)
+      json (>= 1.8)
+      nokogiri (~> 1.6)
+    yell (2.2.2)
+
+PLATFORMS
+  ruby
+
+DEPENDENCIES
+  execjs
+  html-proofer (~> 3.0)
+  jekyll (= 3.7.4)
+  jekyll-assets (= 2.4.0)
+  jekyll-contentblocks
+  jekyll-feed
+  jekyll-font-awesome-sass
+  jekyll-mermaid
+  jekyll-paginate
+  jekyll-redirect-from
+  jekyll-seo-tag
+  jekyll-target-blank
+  jekyll-theme-cayman!
+  remark
+  rubocop (~> 0.50)
+  therubyracer
+  tzinfo-data
+  uglifier
+  w3c_validators (~> 1.3)
+
+BUNDLED WITH
+   1.17.3
diff --git a/_config.yml b/_config.yml
index ab0a495e7245416c5a95088a4a621bb167d55f91..6ebd72175c923535fb1d256c320744dd0ee83ff5 100644
--- a/_config.yml
+++ b/_config.yml
@@ -4,31 +4,29 @@
 # You can create any custom variable you would like, and they will be accessible
 # in the templates via {{ site.myvariable }}.
 
-title: Interaction Programming (CSE 340)
-description: Interactive Tech is changing society. Help invent the future!
+title: Name and number of your class
+description: Description of your class
 
-baseurl: "/courses/cse340/21wi"
+baseurl: "/courses/csexxx/xxqq"
 url: https://courses.cs.washington.edu # the base hostname & protocol for your site, e.g. http://example.com
-twitter_username: jcmankoff
-git_username:  jmankoff
-git_url: https://gitlab.cs.washington.edu/cse340-21wi-tas
-git_branch: CSE340-WI21
-piazza: https://us.edstem.org/courses/381/discussion/
-canvas: https://canvas.uw.edu/courses/1370612
-gitlab: https://gitlab.cs.washington.edu/cse340-21wi-students
-gitgrade: https://gitgrade.cs.washington.edu/student/summary/8723
-hcibook: "No HCI Textbook, just readings"
-androidbook: "No Android Textbook, just readings"
+twitter_username: username
+git_username:  username
+git_url: https://gitlab.cs.washington.edu/jmankoff/class-website-core
+git_branch: CSExxx-xxQQ
+piazza: https://us.edstem.org/courses/xxx/discussion/
+canvas: https://canvas.uw.edu/courses/xxxxx
+gitlab: https://gitlab.cs.washington.edu/students-group-for-assignments
+gitgrade: https://gitgrade.cs.washington.edu/student/summary/xxxx
 paginate:            5
-quarter: "Winter 2021"
+quarter: "Quarter YYYY"
 copydate: "3/30/20"
 status: draft
 
 author:
-    name: Jennifer Mankoff
-    url: "https://make4all.org/jennifer-mankoff/"
+    name: Name
+    url: "https://website"
 
-email: "jmankoff@uw.edu"            # Your contact email
+email: "email@university.edu"            # Your contact email
   # probably want to update this to be the class teaching staff mailing list
 
 # The Reveal theme
@@ -38,9 +36,6 @@ reveal_theme: black.css
 markdown: kramdown
 theme: jekyll-theme-cayman
 
-gems:
-  - jekyll-font-awesome-sass
-
 plugins:
   - jekyll-feed
   - jekyll-seo-tag
@@ -85,7 +80,7 @@ remarkConfig:
 
 
 # Custom vars
-version:             1.1.0
+version:             2.1.0
 
 # Exclude from processing.
 # The following items will not be processed, by default. Create a custom list
diff --git a/_config_production.yml b/_config_production.yml
index 0801788b10f4c947aaf4a0d89f5dcdf5fe5b7662..34b95420c600dc4eff1603e22b94f82b8c708b8a 100644
--- a/_config_production.yml
+++ b/_config_production.yml
@@ -4,31 +4,29 @@
 # You can create any custom variable you would like, and they will be accessible
 # in the templates via {{ site.myvariable }}.
 
-title: Interaction Programming (CSE 340)
-description: Interactive Tech is changing society. Help invent the future!
+title: Name and number of your class
+description: Description of your class
 
-baseurl: "/courses/cse340/21wi"
+baseurl: "/courses/csexxx/xxqq"
 url: https://courses.cs.washington.edu # the base hostname & protocol for your site, e.g. http://example.com
-twitter_username: jcmankoff
-git_username:  jmankoff
-git_url: https://gitlab.cs.washington.edu/cse340-21wi-tas
-git_branch: CSE340-WI21
-piazza: https://us.edstem.org/courses/381/discussion/
-canvas: https://canvas.uw.edu/courses/1370612
-gitlab: https://gitlab.cs.washington.edu/cse340-21wi-students
-gitgrade: https://gitgrade.cs.washington.edu/student/summary/8723
-hcibook: "No HCI Textbook, just readings"
-androidbook: "No Android Textbook, just readings"
+twitter_username: username
+git_username:  username
+git_url: https://gitlab.cs.washington.edu/jmankoff/class-website-core
+git_branch: CSExxx-xxQQ
+piazza: https://us.edstem.org/courses/xxx/discussion/
+canvas: https://canvas.uw.edu/courses/xxxxx
+gitlab: https://gitlab.cs.washington.edu/students-group-for-assignments
+gitgrade: https://gitgrade.cs.washington.edu/student/summary/xxxx
 paginate:            5
-quarter: "Winter 2021"
+quarter: "Quarter YYYY"
 copydate: "3/30/20"
 status: draft
 
 author:
-    name: Jennifer Mankoff
-    url: "https://make4all.org/jennifer-mankoff/"
+    name: Name
+    url: "https://website"
 
-email: "jmankoff@uw.edu"            # Your contact email
+email: "email@university.edu"            # Your contact email
   # probably want to update this to be the class teaching staff mailing list
 
 # The Reveal theme
diff --git a/_includes/footer.html b/_includes/footer.html
index 4e1f63e633db88a3191fcb193b179c07751b210d..ed43141f4e75c8c742e3820aa2e15ea48363520d 100644
--- a/_includes/footer.html
+++ b/_includes/footer.html
@@ -5,11 +5,6 @@
 
     <h2 class="footer-heading">{{ site.title | escape }}</h2>
 
-    The material taught in this class was inspired by many others, who
-    have generously shared slides and syllabi with me. Some of the
-    most frequently used of these include Scott Hudson's SSUI class
-    (at CMU's HCII) and James Landay's CS 160 class and Eric Paulos'
-    class of the same title (at UC Berkeley).
 
     <span class="site-footer-owner"><a href="{{ site.url }}">{{ site.title }}</a> is maintained by
       <a href="{{ site.author.url }}">{{ site.author.name }}</a> &nbsp;
diff --git a/_includes/navigation.html b/_includes/navigation.html
index ad05a41adc6f00ba36abacad23e5de86753c6c6d..15c9aa2b1f9a5a063f46c740de523fbb540aae1c 100644
--- a/_includes/navigation.html
+++ b/_includes/navigation.html
@@ -17,7 +17,7 @@
 {% endfor %}
 
 <nav aria-label="{{site.data.navigation.nav_list_title}}" id="mainNav"
-     class="navbar navbar-expand-lg navbar-dark fixed-top" style="background-color: #050505;">
+     class="navbar navbar-expand-lg navbar-dark fixed-top">
   <div class="container">
     <a class="navbar-brand js-scroll-trigg"
        href="https://www.cs.washington.edu" aria-label="{{site.data.navigation.nav_list_title}}">
diff --git a/_layouts/presentation.html b/_layouts/presentation.html
index 457003bf8ad178bc138f7b47caebaeefc0fb690b..7f25cd0a9bb557317c393587bbabc543064d3090 100644
--- a/_layouts/presentation.html
+++ b/_layouts/presentation.html
@@ -46,6 +46,7 @@
     <script type="text/javascript" src="{{'assets/js/mathjax-sre.js' | relative_url}}"></script>
     <script type="text/javascript" src="{{'assets/js/html2canvas.min.js' | relative_url}}"></script>
     <script type="text/javascript" src="{{'assets/js/presentation-export.js' | relative_url}}"></script>
+    <script type="text/javascript" src="{{'assets/js/mermaid.js' | relative_url}}"></script>
 
     <script type="text/javascript">
       var slideshow = remark.create({
@@ -55,9 +56,23 @@
           highlightLines: 'true',
           slideNumberFormat: 'Slide %current% of %total%'
       }); 
+      var config = {
+          startOnLoad:false,
+	  cloneCssStyles:false,
+	  htmlLabels:true,
+	  useMaxWidth:false,
+	  callback:function(id){
+                console.log(id,' rendered');
+          }
+      };
+
+      mermaid.initialize(config);
+
+     slideshow.on("afterShowSlide", s => {
+	 const [slide] = document.getElementsByClassName("remark-visible");
+	 mermaid.init(Array.from(slide.getElementsByClassName("mermaid")));
+     });
     </script>
-  <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
-  </body>
 
 <!--
 class center middle
diff --git a/_layouts/presentation_production.html b/_layouts/presentation_production.html
index 1cc1d4fe2f738500a6a80bda86c7d1f44a22df86..947c340d1503d820a77509ad2779914f279a7108 100644
--- a/_layouts/presentation_production.html
+++ b/_layouts/presentation_production.html
@@ -47,6 +47,7 @@
     <script type="text/javascript" src="{{'assets/js/mathjax-sre.js' | relative_url}}"></script>
     <script type="text/javascript" src="{{'assets/js/html2canvas.min.js' | relative_url}}"></script>
     <script type="text/javascript" src="{{'assets/js/presentation-export.js' | relative_url}}"></script>
+    <script type="text/javascript" src="{{'assets/js/mermaid.js' | relative_url}}"></script>
 
     <script type="text/javascript">
       var slideshow = remark.create({
@@ -56,8 +57,25 @@
           highlightLines: 'true',
           slideNumberFormat: 'Slide %current% of %total%'
       });
+
+      var config = {
+          startOnLoad:false,
+	  cloneCssStyles:false,
+	  htmlLabels:true,
+	  useMaxWidth:false,
+	  callback:function(id){
+                console.log(id,' rendered');
+          }
+      };
+
+      mermaid.initialize(config);
+
+     slideshow.on("afterShowSlide", s => {
+	 const [slide] = document.getElementsByClassName("remark-visible");
+	 mermaid.init(Array.from(slide.getElementsByClassName("mermaid")));
+     });
+
     </script>
-    <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
   </body>
 
 <!--
diff --git a/_submodules/mermaid/.ackrc b/_submodules/mermaid/.ackrc
new file mode 100644
index 0000000000000000000000000000000000000000..5390d7b92156fb09773917c6b453ec3cf18d5948
--- /dev/null
+++ b/_submodules/mermaid/.ackrc
@@ -0,0 +1,4 @@
+--ignore-dir=dist
+--ignore-file=match:/^yarn\.lock$/
+--ignore-file=match:/^yarn-error\.log$/
+--ignore-dir=coverage
diff --git a/_submodules/mermaid/.babelrc b/_submodules/mermaid/.babelrc
new file mode 100644
index 0000000000000000000000000000000000000000..b207aefdded3fae007f56bcc2f28d7a6c958fb26
--- /dev/null
+++ b/_submodules/mermaid/.babelrc
@@ -0,0 +1,5 @@
+{
+  "presets": [
+    "env"
+  ]
+}
diff --git a/_submodules/mermaid/.editorconfig b/_submodules/mermaid/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..ab70fef5e64a0b2cf3dcb28e5781c98fa7c36679
--- /dev/null
+++ b/_submodules/mermaid/.editorconfig
@@ -0,0 +1,11 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+indent_size = 4
diff --git a/_submodules/mermaid/.gitignore b/_submodules/mermaid/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..f2c5e769955120f6793cbe1b3322a802dda60f47
--- /dev/null
+++ b/_submodules/mermaid/.gitignore
@@ -0,0 +1,9 @@
+.DS_Store
+
+node_modules/
+coverage/
+
+dist/*.js
+dist/*.map
+
+yarn-error.log
diff --git a/_submodules/mermaid/.travis.yml b/_submodules/mermaid/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d28528ef6b5ed96a03761e97e2fec02f1d759b46
--- /dev/null
+++ b/_submodules/mermaid/.travis.yml
@@ -0,0 +1,8 @@
+dist: trusty
+language: node_js
+node_js:
+  - "8"
+script:
+  - yarn test --coverage
+after_success:
+  - cat ./coverage/lcov.info | ./node_modules/.bin/coveralls
diff --git a/_submodules/mermaid/CHANGELOG.md b/_submodules/mermaid/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..3bbf313664ce7ec9f3820c9ba2c97c8a4a959e02
--- /dev/null
+++ b/_submodules/mermaid/CHANGELOG.md
@@ -0,0 +1,386 @@
+# Change Log
+
+## [Unreleased](https://github.com/knsv/mermaid/tree/HEAD)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.4.0...HEAD)
+
+**Implemented enhancements:**
+
+- Add a css file, mermaid.css, with default styling [\#122](https://github.com/knsv/mermaid/issues/122)
+
+**Closed issues:**
+
+- Some examples not displayed on Firefox 36.0.1 [\#138](https://github.com/knsv/mermaid/issues/138)
+
+- inoperable in an AMD/requirejs environment: IPython Notebook [\#127](https://github.com/knsv/mermaid/issues/127)
+
+- Add capability for gantt diagrams [\#118](https://github.com/knsv/mermaid/issues/118)
+
+- lower case v causes error in the parser [\#108](https://github.com/knsv/mermaid/issues/108)
+
+- Label's css conflict with boostrap's .label [\#67](https://github.com/knsv/mermaid/issues/67)
+
+**Merged pull requests:**
+
+- Adding init argument to the global API [\#137](https://github.com/knsv/mermaid/pull/137) ([bollwyvl](https://github.com/bollwyvl))
+
+- Add description of manual calling of init [\#136](https://github.com/knsv/mermaid/pull/136) ([bollwyvl](https://github.com/bollwyvl))
+
+- Allow other forms of node selection for init\(\) [\#135](https://github.com/knsv/mermaid/pull/135) ([bollwyvl](https://github.com/bollwyvl))
+
+- Use a library-level variable for assigning ids [\#134](https://github.com/knsv/mermaid/pull/134) ([bollwyvl](https://github.com/bollwyvl))
+
+## [0.4.0](https://github.com/knsv/mermaid/tree/0.4.0) (2015-03-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.5...0.4.0)
+
+**Implemented enhancements:**
+
+- Assymetric shapes not documented [\#82](https://github.com/knsv/mermaid/issues/82)
+
+- Improve arrows [\#3](https://github.com/knsv/mermaid/issues/3)
+
+**Fixed bugs:**
+
+- NoModificationAllowedError [\#23](https://github.com/knsv/mermaid/issues/23)
+
+**Closed issues:**
+
+- subgraph background is black in rendered flowchart PNG via CLI [\#121](https://github.com/knsv/mermaid/issues/121)
+
+- Integrate editor at https://github.com/naseer/mermaid-webapp [\#110](https://github.com/knsv/mermaid/issues/110)
+
+- Internet Explorer Support [\#99](https://github.com/knsv/mermaid/issues/99)
+
+## [0.3.5](https://github.com/knsv/mermaid/tree/0.3.5) (2015-02-15)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.4...0.3.5)
+
+## [0.3.4](https://github.com/knsv/mermaid/tree/0.3.4) (2015-02-15)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.3...0.3.4)
+
+**Implemented enhancements:**
+
+- Apply styling from css when using the CLI utility [\#85](https://github.com/knsv/mermaid/issues/85)
+
+- Generated SVG works poorly outside web browsers [\#58](https://github.com/knsv/mermaid/issues/58)
+
+- Generating SVG text blob for use in Node [\#2](https://github.com/knsv/mermaid/issues/2)
+
+**Closed issues:**
+
+- Subgraph syntax bug? [\#120](https://github.com/knsv/mermaid/issues/120)
+
+- Live editor [\#115](https://github.com/knsv/mermaid/issues/115)
+
+- Error in "Basic Syntax" wiki page [\#113](https://github.com/knsv/mermaid/issues/113)
+
+- semicolons, anyone? [\#111](https://github.com/knsv/mermaid/issues/111)
+
+- undefined `sequenceConfig` fails [\#109](https://github.com/knsv/mermaid/issues/109)
+
+- Sequence Diagrams: Show Actors below as well [\#106](https://github.com/knsv/mermaid/issues/106)
+
+- Allow overriding sequence diagram configuration \(SVG properties\) [\#103](https://github.com/knsv/mermaid/issues/103)
+
+- Error when rendering A-- This is the text -- B [\#102](https://github.com/knsv/mermaid/issues/102)
+
+- Clipping in documentation [\#97](https://github.com/knsv/mermaid/issues/97)
+
+- isolate class styling to the svg container [\#92](https://github.com/knsv/mermaid/issues/92)
+
+- Make the new graph declaration more visual [\#40](https://github.com/knsv/mermaid/issues/40)
+
+**Merged pull requests:**
+
+- Add live editor [\#119](https://github.com/knsv/mermaid/pull/119) ([naseer](https://github.com/naseer))
+
+- Adds CSS option to the CLI [\#116](https://github.com/knsv/mermaid/pull/116) ([fardog](https://github.com/fardog))
+
+- Update flowchart.md in response Issue \#113 [\#114](https://github.com/knsv/mermaid/pull/114) ([vijay40](https://github.com/vijay40))
+
+- Ignore all files except the license and dist/ folder when installing with Bower. [\#112](https://github.com/knsv/mermaid/pull/112) ([jasonbellamy](https://github.com/jasonbellamy))
+
+## [0.3.3](https://github.com/knsv/mermaid/tree/0.3.3) (2015-01-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.2...0.3.3)
+
+**Implemented enhancements:**
+
+- Support for dotted links [\#26](https://github.com/knsv/mermaid/issues/26)
+
+**Closed issues:**
+
+- Missing arrows in sequence diagram [\#98](https://github.com/knsv/mermaid/issues/98)
+
+- Error with \>9 linkStyles [\#95](https://github.com/knsv/mermaid/issues/95)
+
+**Merged pull requests:**
+
+- Require d3 directly to better support Node usage [\#107](https://github.com/knsv/mermaid/pull/107) ([markdalgleish](https://github.com/markdalgleish))
+
+- update doc with -c option [\#105](https://github.com/knsv/mermaid/pull/105) ([jjmr](https://github.com/jjmr))
+
+- Add new parameter to the console client to override the svg configuration in sequence diagrams [\#104](https://github.com/knsv/mermaid/pull/104) ([jjmr](https://github.com/jjmr))
+
+- Text based labels, new shape [\#101](https://github.com/knsv/mermaid/pull/101) ([bjowes](https://github.com/bjowes))
+
+- fix html tags in example usage [\#100](https://github.com/knsv/mermaid/pull/100) ([deiwin](https://github.com/deiwin))
+
+## [0.3.2](https://github.com/knsv/mermaid/tree/0.3.2) (2015-01-11)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.1...0.3.2)
+
+**Implemented enhancements:**
+
+- Make link text look like it is on the line [\#53](https://github.com/knsv/mermaid/issues/53)
+
+**Closed issues:**
+
+- disable auto render [\#91](https://github.com/knsv/mermaid/issues/91)
+
+- Tidy breaks mermaid \(linebreaks in <div\>\) [\#87](https://github.com/knsv/mermaid/issues/87)
+
+- Bug: <br\> being rendered as text in node [\#73](https://github.com/knsv/mermaid/issues/73)
+
+- Graph edges appear to render outside of the canvas [\#70](https://github.com/knsv/mermaid/issues/70)
+
+**Merged pull requests:**
+
+- Merge pull request \#1 from knsv/master [\#96](https://github.com/knsv/mermaid/pull/96) ([gkchic](https://github.com/gkchic))
+
+- Removed duplicated section in flowchart docs [\#94](https://github.com/knsv/mermaid/pull/94) ([kaime](https://github.com/kaime))
+
+- Grammar changes to sequence page [\#93](https://github.com/knsv/mermaid/pull/93) ([gkchic](https://github.com/gkchic))
+
+- Grammar changes to development page [\#90](https://github.com/knsv/mermaid/pull/90) ([gkchic](https://github.com/gkchic))
+
+- Github buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic))
+
+- Template change [\#88](https://github.com/knsv/mermaid/pull/88) ([gkchic](https://github.com/gkchic))
+
+- New content template [\#86](https://github.com/knsv/mermaid/pull/86) ([gkchic](https://github.com/gkchic))
+
+## [0.3.1](https://github.com/knsv/mermaid/tree/0.3.1) (2015-01-05)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.3.0...0.3.1)
+
+**Implemented enhancements:**
+
+- Support for sequence diagrams [\#16](https://github.com/knsv/mermaid/issues/16)
+
+- Client utility for mermaid [\#6](https://github.com/knsv/mermaid/issues/6)
+
+**Closed issues:**
+
+- Non ASCII chars in labels [\#84](https://github.com/knsv/mermaid/issues/84)
+
+- 'undefined' titles of Quicklinks on the usage page [\#80](https://github.com/knsv/mermaid/issues/80)
+
+- \[cli\] Enhancement proposal: not fail --version / --help if phantomjs isn't installed [\#71](https://github.com/knsv/mermaid/issues/71)
+
+**Merged pull requests:**
+
+- Formatting of the CONTRIBUTING file [\#83](https://github.com/knsv/mermaid/pull/83) ([Grahack](https://github.com/Grahack))
+
+- Flowchart doc: Text in the circle now in a circle [\#81](https://github.com/knsv/mermaid/pull/81) ([Grahack](https://github.com/Grahack))
+
+- Fix for issue \#73 [\#79](https://github.com/knsv/mermaid/pull/79) ([it0a](https://github.com/it0a))
+
+- Ink template [\#78](https://github.com/knsv/mermaid/pull/78) ([gkchic](https://github.com/gkchic))
+
+- Index template file [\#77](https://github.com/knsv/mermaid/pull/77) ([gkchic](https://github.com/gkchic))
+
+- Index template file [\#76](https://github.com/knsv/mermaid/pull/76) ([gkchic](https://github.com/gkchic))
+
+- Show help and version even if phantom isn't present. Fixes \#71 [\#75](https://github.com/knsv/mermaid/pull/75) ([fardog](https://github.com/fardog))
+
+- Add apostrophe & 'and' [\#72](https://github.com/knsv/mermaid/pull/72) ([sudodoki](https://github.com/sudodoki))
+
+## [0.3.0](https://github.com/knsv/mermaid/tree/0.3.0) (2014-12-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.16...0.3.0)
+
+**Implemented enhancements:**
+
+- How do I do comments? [\#47](https://github.com/knsv/mermaid/issues/47)
+
+- Improve readability with new line as terminator and whitespace [\#38](https://github.com/knsv/mermaid/issues/38)
+
+**Fixed bugs:**
+
+- This characters failed the lexical parsing [\#46](https://github.com/knsv/mermaid/issues/46)
+
+**Closed issues:**
+
+- Trailing whitespace at the end of lines is not ignored [\#55](https://github.com/knsv/mermaid/issues/55)
+
+- Use classes instead of inline style for easy styling [\#24](https://github.com/knsv/mermaid/issues/24)
+
+**Merged pull requests:**
+
+- Adds Command Line Interface for generating PNGs from mermaid description files [\#69](https://github.com/knsv/mermaid/pull/69) ([fardog](https://github.com/fardog))
+
+- Allow special symbols for direction along with acronyms [\#66](https://github.com/knsv/mermaid/pull/66) ([vijay40](https://github.com/vijay40))
+
+## [0.2.16](https://github.com/knsv/mermaid/tree/0.2.16) (2014-12-15)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.15...0.2.16)
+
+**Fixed bugs:**
+
+- Lines routed outside visible area [\#19](https://github.com/knsv/mermaid/issues/19)
+
+**Closed issues:**
+
+- Mermaid not rendering properly on Wordpress pages [\#59](https://github.com/knsv/mermaid/issues/59)
+
+- Improve example page with live demo [\#52](https://github.com/knsv/mermaid/issues/52)
+
+- Does not render upon AngularJS Updates [\#45](https://github.com/knsv/mermaid/issues/45)
+
+- Download link in README.MD doesn't work. [\#42](https://github.com/knsv/mermaid/issues/42)
+
+- linkStyle usage is not obvious [\#41](https://github.com/knsv/mermaid/issues/41)
+
+- Move \*.spec.js in src/ to test/ [\#35](https://github.com/knsv/mermaid/issues/35)
+
+**Merged pull requests:**
+
+- New grammar will allow statements ending without semicolon as disccused in Issue \#38 [\#63](https://github.com/knsv/mermaid/pull/63) ([vijay40](https://github.com/vijay40))
+
+- Class based styling [\#62](https://github.com/knsv/mermaid/pull/62) ([bjowes](https://github.com/bjowes))
+
+- Update from master [\#61](https://github.com/knsv/mermaid/pull/61) ([bjowes](https://github.com/bjowes))
+
+- Fix typos [\#60](https://github.com/knsv/mermaid/pull/60) ([sublimino](https://github.com/sublimino))
+
+- Included .DS\_Store in gitignore [\#57](https://github.com/knsv/mermaid/pull/57) ([alvynmcq](https://github.com/alvynmcq))
+
+- Improves readablity discussed in issue \#38 [\#56](https://github.com/knsv/mermaid/pull/56) ([vijay40](https://github.com/vijay40))
+
+- Added a linting task for gulp [\#43](https://github.com/knsv/mermaid/pull/43) ([serv](https://github.com/serv))
+
+## [0.2.15](https://github.com/knsv/mermaid/tree/0.2.15) (2014-12-05)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.14...0.2.15)
+
+**Fixed bugs:**
+
+- Error with some characters [\#25](https://github.com/knsv/mermaid/issues/25)
+
+- Cap-cased words break parser [\#8](https://github.com/knsv/mermaid/issues/8)
+
+**Closed issues:**
+
+- Question marks don't render properly with /dist/mermaid.full.min.js [\#30](https://github.com/knsv/mermaid/issues/30)
+
+- Provide parse function in browser widthout `require`? [\#21](https://github.com/knsv/mermaid/issues/21)
+
+- Better label text support [\#18](https://github.com/knsv/mermaid/issues/18)
+
+**Merged pull requests:**
+
+- Include bower\_components/ to .gitignore [\#33](https://github.com/knsv/mermaid/pull/33) ([serv](https://github.com/serv))
+
+- Fixed reference to Git repo. [\#32](https://github.com/knsv/mermaid/pull/32) ([guyellis](https://github.com/guyellis))
+
+## [0.2.14](https://github.com/knsv/mermaid/tree/0.2.14) (2014-12-03)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.13...0.2.14)
+
+## [0.2.13](https://github.com/knsv/mermaid/tree/0.2.13) (2014-12-03)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.10...0.2.13)
+
+**Implemented enhancements:**
+
+- Publish to NPM [\#7](https://github.com/knsv/mermaid/issues/7)
+
+**Closed issues:**
+
+- modified init to be applied more than once [\#29](https://github.com/knsv/mermaid/issues/29)
+
+- Wanted to know build process for the project. [\#28](https://github.com/knsv/mermaid/issues/28)
+
+- can not support Chinese description [\#20](https://github.com/knsv/mermaid/issues/20)
+
+- Support unicode chars in labels [\#9](https://github.com/knsv/mermaid/issues/9)
+
+**Merged pull requests:**
+
+- initial setup for editor page to generate graph through textarea input [\#14](https://github.com/knsv/mermaid/pull/14) ([ImanimalXI](https://github.com/ImanimalXI))
+
+## [0.2.10](https://github.com/knsv/mermaid/tree/0.2.10) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.9...0.2.10)
+
+## [0.2.9](https://github.com/knsv/mermaid/tree/0.2.9) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.8...0.2.9)
+
+**Closed issues:**
+
+- Add link to jsbin playground to README [\#11](https://github.com/knsv/mermaid/issues/11)
+
+- What are the requirements ? [\#10](https://github.com/knsv/mermaid/issues/10)
+
+**Merged pull requests:**
+
+- Allow unicode chars in labels [\#13](https://github.com/knsv/mermaid/pull/13) ([codebeige](https://github.com/codebeige))
+
+- Formatting Update [\#12](https://github.com/knsv/mermaid/pull/12) ([darrencauthon](https://github.com/darrencauthon))
+
+## [0.2.8](https://github.com/knsv/mermaid/tree/0.2.8) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.7...0.2.8)
+
+## [0.2.7](https://github.com/knsv/mermaid/tree/0.2.7) (2014-12-01)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.6...0.2.7)
+
+**Closed issues:**
+
+- Provide parser as separate module [\#4](https://github.com/knsv/mermaid/issues/4)
+
+## [0.2.6](https://github.com/knsv/mermaid/tree/0.2.6) (2014-11-27)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.5...0.2.6)
+
+## [0.2.5](https://github.com/knsv/mermaid/tree/0.2.5) (2014-11-27)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.4...0.2.5)
+
+**Merged pull requests:**
+
+- Added new shapes! [\#1](https://github.com/knsv/mermaid/pull/1) ([bjowes](https://github.com/bjowes))
+
+## [0.2.4](https://github.com/knsv/mermaid/tree/0.2.4) (2014-11-25)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.3...0.2.4)
+
+## [0.2.3](https://github.com/knsv/mermaid/tree/0.2.3) (2014-11-24)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.2...0.2.3)
+
+## [0.2.2](https://github.com/knsv/mermaid/tree/0.2.2) (2014-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.1...0.2.2)
+
+## [0.2.1](https://github.com/knsv/mermaid/tree/0.2.1) (2014-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.2.0...0.2.1)
+
+## [0.2.0](https://github.com/knsv/mermaid/tree/0.2.0) (2014-11-22)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.1.1...0.2.0)
+
+## [0.1.1](https://github.com/knsv/mermaid/tree/0.1.1) (2014-11-17)
+
+[Full Changelog](https://github.com/knsv/mermaid/compare/0.1.0...0.1.1)
+
+## [0.1.0](https://github.com/knsv/mermaid/tree/0.1.0) (2014-11-16)
+
+
+\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
\ No newline at end of file
diff --git a/_submodules/mermaid/LICENSE b/_submodules/mermaid/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..77b04c3aba988265626d86accec3a33d3979305b
--- /dev/null
+++ b/_submodules/mermaid/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 - 2018 Knut Sveidqvist
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/_submodules/mermaid/README.md b/_submodules/mermaid/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..45464c0ea22edc7152814c4d504d80a9e131d5e4
--- /dev/null
+++ b/_submodules/mermaid/README.md
@@ -0,0 +1,206 @@
+# mermaid
+
+[![Build Status](https://travis-ci.org/knsv/mermaid.svg?branch=master)](https://travis-ci.org/knsv/mermaid)
+[![Coverage Status](https://coveralls.io/repos/github/knsv/mermaid/badge.svg?branch=master)](https://coveralls.io/github/knsv/mermaid?branch=master)
+[![Join the chat at https://gitter.im/knsv/mermaid](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/knsv/mermaid?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+![banner](./img/header.png)
+
+Generation of diagrams and flowcharts from text in a similar manner as markdown.
+
+Ever wanted to simplify documentation and avoid heavy tools like Visio when explaining your code?
+
+This is why mermaid was born, a simple markdown-like script language for generating charts from text via javascript.
+
+
+### Flowchart
+
+```
+graph TD;
+    A-->B;
+    A-->C;
+    B-->D;
+    C-->D;
+```
+![Flowchart](./img/flow.png)
+
+
+### Sequence diagram
+
+```
+sequenceDiagram
+    participant Alice
+    participant Bob
+    Alice->>John: Hello John, how are you?
+    loop Healthcheck
+        John->>John: Fight against hypochondria
+    end
+    Note right of John: Rational thoughts <br/>prevail...
+    John-->>Alice: Great!
+    John->>Bob: How about you?
+    Bob-->>John: Jolly good!
+```
+![Sequence diagram](./img/sequence.png)
+
+
+### Gantt diagram
+
+```
+gantt
+dateFormat  YYYY-MM-DD
+title Adding GANTT diagram to mermaid
+
+section A section
+Completed task            :done,    des1, 2014-01-06,2014-01-08
+Active task               :active,  des2, 2014-01-09, 3d
+Future task               :         des3, after des2, 5d
+Future task2               :         des4, after des3, 5d
+```
+![Gantt diagram](./img/gantt.png)
+
+
+### Class diagram - :exclamation: experimental
+
+```
+classDiagram
+Class01 <|-- AveryLongClass : Cool
+Class03 *-- Class04
+Class05 o-- Class06
+Class07 .. Class08
+Class09 --> C2 : Where am i?
+Class09 --* C3
+Class09 --|> Class07
+Class07 : equals()
+Class07 : Object[] elementData
+Class01 : size()
+Class01 : int chimp
+Class01 : int gorilla
+Class08 <--> C2: Cool label
+```
+![Class diagram](./img/class.png)
+
+
+### Git graph - :exclamation: experimental
+
+```
+gitGraph:
+options
+{
+    "nodeSpacing": 150,
+    "nodeRadius": 10
+}
+end
+commit
+branch newbranch
+checkout newbranch
+commit
+commit
+checkout master
+commit
+commit
+merge newbranch
+
+```
+
+![Git graph](./img/git.png)
+
+
+## Installation
+
+### CDN
+
+```
+https://unpkg.com/mermaid@<version>/dist/
+```
+
+Replace `<version>` with expected version number.
+
+Example: https://unpkg.com/mermaid@7.1.0/dist/
+
+### Node.js
+
+```
+yarn add mermaid
+```
+
+
+## Documentation
+
+https://mermaidjs.github.io
+
+
+## Sibling projects
+
+- [mermaid CLI](https://github.com/mermaidjs/mermaid.cli)
+- [mermaid live editor](https://github.com/mermaidjs/mermaid-live-editor)
+- [mermaid webpack demo](https://github.com/mermaidjs/mermaid-webpack-demo)
+- [mermaid Parcel demo](https://github.com/mermaidjs/mermaid-parcel-demo)
+
+
+# Request for assistance
+
+Things are piling up and I have hard time keeping up. To remedy this
+it would be great if we could form a core team of developers to cooperate
+with the future development mermaid.
+
+As part of this team you would get write access to the repository and would
+represent the project when answering questions and issues.
+
+Together we could continue the work with things like:
+* adding more typers of diagrams like mindmaps, ert digrams etc
+* improving existing diagrams
+
+Don't hesitate to contact me if you want to get involved.
+
+
+# For contributors
+
+## Setup
+
+    yarn install
+
+
+## Build
+
+    yarn build:watch
+
+
+## Lint
+
+    yarn lint
+
+We use [JavaScript Standard Style](https://github.com/feross/standard).
+We recommend you installing [editor plugins](https://github.com/feross/standard#are-there-text-editor-plugins) so you can get real time lint result.
+
+
+## Test
+
+    yarn test
+
+Manual test in browser:
+
+    open dist/index.html
+
+
+## Release
+
+For those who have the permission to do so:
+
+Update version number in `package.json`.
+
+    npm publish
+
+Command above generates files into the `dist` folder and publishes them to npmjs.org.
+
+
+# Credits
+
+Many thanks to the [d3](http://d3js.org/) and [dagre-d3](https://github.com/cpettitt/dagre-d3) projects for providing the graphical layout and drawing libraries!
+
+Thanks also to the [js-sequence-diagram](http://bramp.github.io/js-sequence-diagrams) project for usage of the grammar for the sequence diagrams. Thanks to Jessica Peter for inspiration and starting point for gantt rendering.
+
+*Mermaid was created by Knut Sveidqvist for easier documentation.*
+
+*[Tyler Long](https://github.com/tylerlong) has became a collaborator since April 2017.*
+
+Here is the full list of the projects [contributors](https://github.com/knsv/mermaid/graphs/contributors).
diff --git a/_submodules/mermaid/__mocks__/d3.js b/_submodules/mermaid/__mocks__/d3.js
new file mode 100644
index 0000000000000000000000000000000000000000..218ed9754f70b895a3e1310c43e3be269b74fd2d
--- /dev/null
+++ b/_submodules/mermaid/__mocks__/d3.js
@@ -0,0 +1,38 @@
+let NewD3 = function () {
+  return {
+    append: function () {
+      return NewD3()
+    },
+    attr: function () {
+      return this
+    },
+    style: function () {
+      return this
+    },
+    text: function () {
+      return this
+    },
+    0: {
+      0: {
+        getBBox: function () {
+          return {
+            height: 10,
+            width: 20
+          }
+        }
+      }
+    }
+  }
+}
+
+export const select = function () {
+  return new NewD3()
+}
+
+export const selectAll = function () {
+  return new NewD3()
+}
+
+export const curveBasis = 'basis'
+export const curveLinear = 'linear'
+export const curveCardinal = 'cardinal'
diff --git a/_submodules/mermaid/gulpfile.js b/_submodules/mermaid/gulpfile.js
new file mode 100644
index 0000000000000000000000000000000000000000..613cf83c1430012153d05236eede68bd0ee060a2
--- /dev/null
+++ b/_submodules/mermaid/gulpfile.js
@@ -0,0 +1,10 @@
+import gulp from 'gulp'
+import jison from 'gulp-jison'
+import filelog from 'gulp-filelog'
+
+gulp.task('jison', function () {
+  return gulp.src('./src/**/*.jison')
+    .pipe(filelog('Jison file:'))
+    .pipe(jison({ 'token-stack': true }))
+    .pipe(gulp.dest('./src/'))
+})
diff --git a/_submodules/mermaid/img/class.png b/_submodules/mermaid/img/class.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf6e379e1abf5db97fcd3d7bb06cad26400b8a7f
Binary files /dev/null and b/_submodules/mermaid/img/class.png differ
diff --git a/_submodules/mermaid/img/flow.png b/_submodules/mermaid/img/flow.png
new file mode 100644
index 0000000000000000000000000000000000000000..e324299764ef1540b37b891a76484514ce5d6d15
Binary files /dev/null and b/_submodules/mermaid/img/flow.png differ
diff --git a/_submodules/mermaid/img/gantt.png b/_submodules/mermaid/img/gantt.png
new file mode 100644
index 0000000000000000000000000000000000000000..64645cb5baf307d7804bf2050ab7f4fb1b2cb312
Binary files /dev/null and b/_submodules/mermaid/img/gantt.png differ
diff --git a/_submodules/mermaid/img/git.png b/_submodules/mermaid/img/git.png
new file mode 100644
index 0000000000000000000000000000000000000000..2da331a1eda912e1fb6057726dc8608985b045ac
Binary files /dev/null and b/_submodules/mermaid/img/git.png differ
diff --git a/_submodules/mermaid/img/header.png b/_submodules/mermaid/img/header.png
new file mode 100644
index 0000000000000000000000000000000000000000..06159b2c94e22cc09fb507db6c7a1562fe4bdeb7
Binary files /dev/null and b/_submodules/mermaid/img/header.png differ
diff --git a/_submodules/mermaid/img/sequence.png b/_submodules/mermaid/img/sequence.png
new file mode 100644
index 0000000000000000000000000000000000000000..b35e3b74db9e96de970ec63af9345f0046ec9fcd
Binary files /dev/null and b/_submodules/mermaid/img/sequence.png differ
diff --git a/_submodules/mermaid/package.json b/_submodules/mermaid/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..3c2a5b38f7448fa7827728acc36e46f067d61ea2
--- /dev/null
+++ b/_submodules/mermaid/package.json
@@ -0,0 +1,80 @@
+{
+  "name": "mermaid",
+  "version": "8.0.0-rc.8",
+  "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.",
+  "main": "dist/mermaid.core.js",
+  "keywords": [
+    "diagram",
+    "markdown",
+    "flowchart",
+    "sequence diagram",
+    "gantt",
+    "class diagram",
+    "git graph"
+  ],
+  "scripts": {
+    "build": "webpack --progress --colors",
+    "build:watch": "yarn build --watch",
+    "release": "yarn build -p --config webpack.config.prod.babel.js",
+    "upgrade": "yarn-upgrade-all",
+    "lint": "standard",
+    "test": "yarn lint && jest",
+    "test:watch": "jest --watch",
+    "jison": "node -r babel-register node_modules/.bin/gulp jison",
+    "prepublishOnly": "yarn build && yarn release && yarn test",
+    "prepush": "yarn test"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/knsv/mermaid"
+  },
+  "author": "Knut Sveidqvist",
+  "license": "MIT",
+  "standard": {
+    "ignore": [
+      "**/parser/*.js",
+      "dist/**/*.js"
+    ]
+  },
+  "dependencies": {
+    "d3": "^4.13.0",
+    "dagre-d3-renderer": "^0.5.8",
+    "dagre-layout": "^0.8.8",
+    "graphlibrary": "^2.2.0",
+    "he": "^1.1.1",
+    "lodash": "^4.17.5",
+    "moment": "^2.21.0",
+    "scope-css": "^1.0.5"
+  },
+  "devDependencies": {
+    "babel-core": "^6.26.0",
+    "babel-loader": "^7.1.4",
+    "babel-preset-env": "^1.6.1",
+    "coveralls": "^3.0.0",
+    "css-loader": "^0.28.11",
+    "css-to-string-loader": "^0.1.3",
+    "gulp": "^3.9.1",
+    "gulp-filelog": "^0.4.1",
+    "gulp-jison": "^1.2.0",
+    "husky": "^0.14.3",
+    "identity-obj-proxy": "^3.0.0",
+    "jest": "^22.4.2",
+    "jison": "^0.4.18",
+    "node-sass": "^4.7.2",
+    "sass-loader": "^6.0.7",
+    "standard": "^11.0.1",
+    "webpack": "^4.1.1",
+    "webpack-cli": "^2.0.12",
+    "webpack-node-externals": "^1.6.0",
+    "yarn-upgrade-all": "^0.3.0"
+  },
+  "files": [
+    "dist",
+    "src"
+  ],
+  "jest": {
+    "moduleNameMapper": {
+      "\\.(css|scss)$": "identity-obj-proxy"
+    }
+  }
+}
diff --git a/_submodules/mermaid/src/diagrams/class/classDb.js b/_submodules/mermaid/src/diagrams/class/classDb.js
new file mode 100644
index 0000000000000000000000000000000000000000..6be4bb7736a1d5a324846d8618f3555d09e7e8c9
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/class/classDb.js
@@ -0,0 +1,89 @@
+
+import { logger } from '../../logger'
+
+let relations = []
+let classes = {}
+
+/**
+ * Function called by parser when a node definition has been found.
+ * @param id
+ * @param text
+ * @param type
+ * @param style
+ */
+export const addClass = function (id) {
+  if (typeof classes[id] === 'undefined') {
+    classes[id] = {
+      id: id,
+      methods: [],
+      members: []
+    }
+  }
+}
+
+export const clear = function () {
+  relations = []
+  classes = {}
+}
+
+export const getClass = function (id) {
+  return classes[id]
+}
+export const getClasses = function () {
+  return classes
+}
+
+export const getRelations = function () {
+  return relations
+}
+
+export const addRelation = function (relation) {
+  logger.debug('Adding relation: ' + JSON.stringify(relation))
+  addClass(relation.id1)
+  addClass(relation.id2)
+  relations.push(relation)
+}
+
+export const addMembers = function (className, MembersArr) {
+  const theClass = classes[className]
+  if (typeof MembersArr === 'string') {
+    if (MembersArr.substr(-1) === ')') {
+      theClass.methods.push(MembersArr)
+    } else {
+      theClass.members.push(MembersArr)
+    }
+  }
+}
+
+export const cleanupLabel = function (label) {
+  if (label.substring(0, 1) === ':') {
+    return label.substr(2).trim()
+  } else {
+    return label.trim()
+  }
+}
+
+export const lineType = {
+  LINE: 0,
+  DOTTED_LINE: 1
+}
+
+export const relationType = {
+  AGGREGATION: 0,
+  EXTENSION: 1,
+  COMPOSITION: 2,
+  DEPENDENCY: 3
+}
+
+export default {
+  addClass,
+  clear,
+  getClass,
+  getClasses,
+  getRelations,
+  addRelation,
+  addMembers,
+  cleanupLabel,
+  lineType,
+  relationType
+}
diff --git a/_submodules/mermaid/src/diagrams/class/classDiagram.spec.js b/_submodules/mermaid/src/diagrams/class/classDiagram.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..38657e11d2d0fa22a72e8c54f503df09acb420c4
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/class/classDiagram.spec.js
@@ -0,0 +1,208 @@
+/* eslint-env jasmine */
+import { parser } from './parser/classDiagram'
+import classDb from './classDb'
+
+describe('class diagram, ', function () {
+  describe('when parsing an info graph it', function () {
+    beforeEach(function () {
+      parser.yy = classDb
+    })
+
+    it('should handle relation definitions', function () {
+      const str = 'classDiagram\n' +
+'Class01 <|-- Class02\n' +
+'Class03 *-- Class04\n' +
+'Class05 o-- Class06\n' +
+'Class07 .. Class08\n' +
+'Class09 -- Class1'
+
+      parser.parse(str)
+    })
+    it('should handle relation definition of different types and directions', function () {
+      const str = 'classDiagram\n' +
+'Class11 <|.. Class12\n' +
+'Class13 --> Class14\n' +
+'Class15 ..> Class16\n' +
+'Class17 ..|> Class18\n' +
+'Class19 <--* Class20'
+
+      parser.parse(str)
+    })
+
+    it('should handle cardinality and labels', function () {
+      const str = 'classDiagram\n' +
+'Class01 "1" *-- "many" Class02 : contains\n' +
+'Class03 o-- Class04 : aggregation\n' +
+'Class05 --> "1" Class06'
+
+      parser.parse(str)
+    })
+    it('should handle class definitions', function () {
+      const str = 'classDiagram\n' +
+'class Car\n' +
+'Driver -- Car : drives >\n' +
+'Car *-- Wheel : have 4 >\n' +
+'Car -- Person : < owns'
+
+      parser.parse(str)
+    })
+
+    it('should handle method statements', function () {
+      const str = 'classDiagram\n' +
+'Object <|-- ArrayList\n' +
+'Object : equals()\n' +
+'ArrayList : Object[] elementData\n' +
+'ArrayList : size()'
+
+      parser.parse(str)
+    })
+    it('should handle parsing of method statements  grouped by brackets', function () {
+      const str = 'classDiagram\n' +
+'class Dummy {\n' +
+'String data\n' +
+'  void methods()\n' +
+'}\n' +
+'\n' +
+'class Flight {\n' +
+'   flightNumber : Integer\n' +
+'   departureTime : Date\n' +
+'}'
+
+      parser.parse(str)
+    })
+
+    it('should handle parsing of separators', function () {
+      const str = 'classDiagram\n' +
+                'class Foo1 {\n' +
+                '  You can use\n' +
+                '  several lines\n' +
+                '..\n' +
+                'as you want\n' +
+                'and group\n' +
+                '==\n' +
+                'things together.\n' +
+                '__\n' +
+                'You can have as many groups\n' +
+                'as you want\n' +
+                '--\n' +
+                'End of class\n' +
+                '}\n' +
+                '\n' +
+                'class User {\n' +
+                '.. Simple Getter ..\n' +
+                '+ getName()\n' +
+                '+ getAddress()\n' +
+                '.. Some setter ..\n' +
+                '+ setName()\n' +
+                '__ private data __\n' +
+                'int age\n' +
+                '-- encrypted --\n' +
+                'String password\n' +
+                '}'
+
+      parser.parse(str)
+    })
+  })
+
+  describe('when fetching data from an classDiagram graph it', function () {
+    beforeEach(function () {
+      parser.yy = classDb
+      parser.yy.clear()
+    })
+    it('should handle relation definitions EXTENSION', function () {
+      const str = 'classDiagram\n' +
+                        'Class01 <|-- Class02'
+
+      parser.parse(str)
+
+      const relations = parser.yy.getRelations()
+
+      expect(parser.yy.getClass('Class01').id).toBe('Class01')
+      expect(parser.yy.getClass('Class02').id).toBe('Class02')
+      expect(relations[0].relation.type1).toBe(classDb.relationType.EXTENSION)
+      expect(relations[0].relation.type2).toBe('none')
+      expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE)
+    })
+    it('should handle relation definitions AGGREGATION and dotted line', function () {
+      const str = 'classDiagram\n' +
+                        'Class01 o.. Class02'
+
+      parser.parse(str)
+
+      const relations = parser.yy.getRelations()
+
+      expect(parser.yy.getClass('Class01').id).toBe('Class01')
+      expect(parser.yy.getClass('Class02').id).toBe('Class02')
+      expect(relations[0].relation.type1).toBe(classDb.relationType.AGGREGATION)
+      expect(relations[0].relation.type2).toBe('none')
+      expect(relations[0].relation.lineType).toBe(classDb.lineType.DOTTED_LINE)
+    })
+    it('should handle relation definitions COMPOSITION on both sides', function () {
+      const str = 'classDiagram\n' +
+                       'Class01 *--* Class02'
+
+      parser.parse(str)
+
+      const relations = parser.yy.getRelations()
+
+      expect(parser.yy.getClass('Class01').id).toBe('Class01')
+      expect(parser.yy.getClass('Class02').id).toBe('Class02')
+      expect(relations[0].relation.type1).toBe(classDb.relationType.COMPOSITION)
+      expect(relations[0].relation.type2).toBe(classDb.relationType.COMPOSITION)
+      expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE)
+    })
+    it('should handle relation definitions no types', function () {
+      const str = 'classDiagram\n' +
+                        'Class01 -- Class02'
+
+      parser.parse(str)
+
+      const relations = parser.yy.getRelations()
+
+      expect(parser.yy.getClass('Class01').id).toBe('Class01')
+      expect(parser.yy.getClass('Class02').id).toBe('Class02')
+      expect(relations[0].relation.type1).toBe('none')
+      expect(relations[0].relation.type2).toBe('none')
+      expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE)
+    })
+    it('should handle relation definitions with type only on right side', function () {
+      const str = 'classDiagram\n' +
+                       'Class01 --|> Class02'
+
+      parser.parse(str)
+
+      const relations = parser.yy.getRelations()
+
+      expect(parser.yy.getClass('Class01').id).toBe('Class01')
+      expect(parser.yy.getClass('Class02').id).toBe('Class02')
+      expect(relations[0].relation.type1).toBe('none')
+      expect(relations[0].relation.type2).toBe(classDb.relationType.EXTENSION)
+      expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE)
+    })
+
+    it('should handle multiple classes and relation definitions', function () {
+      const str = 'classDiagram\n' +
+                        'Class01 <|-- Class02\n' +
+                        'Class03 *-- Class04\n' +
+                        'Class05 o-- Class06\n' +
+                        'Class07 .. Class08\n' +
+                        'Class09 -- Class10'
+
+      parser.parse(str)
+
+      const relations = parser.yy.getRelations()
+
+      expect(parser.yy.getClass('Class01').id).toBe('Class01')
+      expect(parser.yy.getClass('Class10').id).toBe('Class10')
+
+      expect(relations.length).toBe(5)
+
+      expect(relations[0].relation.type1).toBe(classDb.relationType.EXTENSION)
+      expect(relations[0].relation.type2).toBe('none')
+      expect(relations[0].relation.lineType).toBe(classDb.lineType.LINE)
+      expect(relations[3].relation.type1).toBe('none')
+      expect(relations[3].relation.type2).toBe('none')
+      expect(relations[3].relation.lineType).toBe(classDb.lineType.DOTTED_LINE)
+    })
+  })
+})
diff --git a/_submodules/mermaid/src/diagrams/class/classRenderer.js b/_submodules/mermaid/src/diagrams/class/classRenderer.js
new file mode 100644
index 0000000000000000000000000000000000000000..5169fce4bf3db14087082700cd498423855a3a2c
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/class/classRenderer.js
@@ -0,0 +1,365 @@
+import dagre from 'dagre-layout'
+import graphlib from 'graphlibrary'
+import * as d3 from 'd3'
+
+import classDb from './classDb'
+import { logger } from '../../logger'
+import { parser } from './parser/classDiagram'
+
+parser.yy = classDb
+
+const idCache = {}
+
+let classCnt = 0
+const conf = {
+  dividerMargin: 10,
+  padding: 5,
+  textHeight: 10
+}
+
+// Todo optimize
+const getGraphId = function (label) {
+  const keys = Object.keys(idCache)
+
+  for (let i = 0; i < keys.length; i++) {
+    if (idCache[keys[i]].label === label) {
+      return keys[i]
+    }
+  }
+
+  return undefined
+}
+
+/**
+ * Setup arrow head and define the marker. The result is appended to the svg.
+ */
+const insertMarkers = function (elem) {
+  elem.append('defs').append('marker')
+    .attr('id', 'extensionStart')
+    .attr('class', 'extension')
+    .attr('refX', 0)
+    .attr('refY', 7)
+    .attr('markerWidth', 190)
+    .attr('markerHeight', 240)
+    .attr('orient', 'auto')
+    .append('path')
+    .attr('d', 'M 1,7 L18,13 V 1 Z')
+
+  elem.append('defs').append('marker')
+    .attr('id', 'extensionEnd')
+    .attr('refX', 19)
+    .attr('refY', 7)
+    .attr('markerWidth', 20)
+    .attr('markerHeight', 28)
+    .attr('orient', 'auto')
+    .append('path')
+    .attr('d', 'M 1,1 V 13 L18,7 Z') // this is actual shape for arrowhead
+
+  elem.append('defs').append('marker')
+    .attr('id', 'compositionStart')
+    .attr('class', 'extension')
+    .attr('refX', 0)
+    .attr('refY', 7)
+    .attr('markerWidth', 190)
+    .attr('markerHeight', 240)
+    .attr('orient', 'auto')
+    .append('path')
+    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z')
+
+  elem.append('defs').append('marker')
+    .attr('id', 'compositionEnd')
+    .attr('refX', 19)
+    .attr('refY', 7)
+    .attr('markerWidth', 20)
+    .attr('markerHeight', 28)
+    .attr('orient', 'auto')
+    .append('path')
+    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z')
+
+  elem.append('defs').append('marker')
+    .attr('id', 'aggregationStart')
+    .attr('class', 'extension')
+    .attr('refX', 0)
+    .attr('refY', 7)
+    .attr('markerWidth', 190)
+    .attr('markerHeight', 240)
+    .attr('orient', 'auto')
+    .append('path')
+    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z')
+
+  elem.append('defs').append('marker')
+    .attr('id', 'aggregationEnd')
+    .attr('refX', 19)
+    .attr('refY', 7)
+    .attr('markerWidth', 20)
+    .attr('markerHeight', 28)
+    .attr('orient', 'auto')
+    .append('path')
+    .attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z')
+
+  elem.append('defs').append('marker')
+    .attr('id', 'dependencyStart')
+    .attr('class', 'extension')
+    .attr('refX', 0)
+    .attr('refY', 7)
+    .attr('markerWidth', 190)
+    .attr('markerHeight', 240)
+    .attr('orient', 'auto')
+    .append('path')
+    .attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z')
+
+  elem.append('defs').append('marker')
+    .attr('id', 'dependencyEnd')
+    .attr('refX', 19)
+    .attr('refY', 7)
+    .attr('markerWidth', 20)
+    .attr('markerHeight', 28)
+    .attr('orient', 'auto')
+    .append('path')
+    .attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z')
+}
+
+let edgeCount = 0
+const drawEdge = function (elem, path, relation) {
+  const getRelationType = function (type) {
+    switch (type) {
+      case classDb.relationType.AGGREGATION:
+        return 'aggregation'
+      case classDb.relationType.EXTENSION:
+        return 'extension'
+      case classDb.relationType.COMPOSITION:
+        return 'composition'
+      case classDb.relationType.DEPENDENCY:
+        return 'dependency'
+    }
+  }
+
+  // The data for our line
+  const lineData = path.points
+
+  // This is the accessor function we talked about above
+  const lineFunction = d3.line()
+    .x(function (d) {
+      return d.x
+    })
+    .y(function (d) {
+      return d.y
+    })
+    .curve(d3.curveBasis)
+
+  const svgPath = elem.append('path')
+    .attr('d', lineFunction(lineData))
+    .attr('id', 'edge' + edgeCount)
+    .attr('class', 'relation')
+  let url = ''
+  if (conf.arrowMarkerAbsolute) {
+    url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search
+    url = url.replace(/\(/g, '\\(')
+    url = url.replace(/\)/g, '\\)')
+  }
+
+  if (relation.relation.type1 !== 'none') {
+    svgPath.attr('marker-start', 'url(' + url + '#' + getRelationType(relation.relation.type1) + 'Start' + ')')
+  }
+  if (relation.relation.type2 !== 'none') {
+    svgPath.attr('marker-end', 'url(' + url + '#' + getRelationType(relation.relation.type2) + 'End' + ')')
+  }
+
+  let x, y
+  const l = path.points.length
+  if ((l % 2) !== 0) {
+    const p1 = path.points[Math.floor(l / 2)]
+    const p2 = path.points[Math.ceil(l / 2)]
+    x = (p1.x + p2.x) / 2
+    y = (p1.y + p2.y) / 2
+  } else {
+    const p = path.points[Math.floor(l / 2)]
+    x = p.x
+    y = p.y
+  }
+
+  if (typeof relation.title !== 'undefined') {
+    const g = elem.append('g')
+      .attr('class', 'classLabel')
+    const label = g.append('text')
+      .attr('class', 'label')
+      .attr('x', x)
+      .attr('y', y)
+      .attr('fill', 'red')
+      .attr('text-anchor', 'middle')
+      .text(relation.title)
+
+    window.label = label
+    const bounds = label.node().getBBox()
+
+    g.insert('rect', ':first-child')
+      .attr('class', 'box')
+      .attr('x', bounds.x - conf.padding / 2)
+      .attr('y', bounds.y - conf.padding / 2)
+      .attr('width', bounds.width + conf.padding)
+      .attr('height', bounds.height + conf.padding)
+  }
+
+  edgeCount++
+}
+
+const drawClass = function (elem, classDef) {
+  logger.info('Rendering class ' + classDef)
+
+  const addTspan = function (textEl, txt, isFirst) {
+    const tSpan = textEl.append('tspan')
+      .attr('x', conf.padding)
+      .text(txt)
+    if (!isFirst) {
+      tSpan.attr('dy', conf.textHeight)
+    }
+  }
+
+  const id = 'classId' + classCnt
+  const classInfo = {
+    id: id,
+    label: classDef.id,
+    width: 0,
+    height: 0
+  }
+
+  const g = elem.append('g')
+    .attr('id', id)
+    .attr('class', 'classGroup')
+  const title = g.append('text')
+    .attr('x', conf.padding)
+    .attr('y', conf.textHeight + conf.padding)
+    .text(classDef.id)
+
+  const titleHeight = title.node().getBBox().height
+
+  const membersLine = g.append('line') // text label for the x axis
+    .attr('x1', 0)
+    .attr('y1', conf.padding + titleHeight + conf.dividerMargin / 2)
+    .attr('y2', conf.padding + titleHeight + conf.dividerMargin / 2)
+
+  const members = g.append('text') // text label for the x axis
+    .attr('x', conf.padding)
+    .attr('y', titleHeight + (conf.dividerMargin) + conf.textHeight)
+    .attr('fill', 'white')
+    .attr('class', 'classText')
+
+  let isFirst = true
+  classDef.members.forEach(function (member) {
+    addTspan(members, member, isFirst)
+    isFirst = false
+  })
+
+  const membersBox = members.node().getBBox()
+
+  const methodsLine = g.append('line') // text label for the x axis
+    .attr('x1', 0)
+    .attr('y1', conf.padding + titleHeight + conf.dividerMargin + membersBox.height)
+    .attr('y2', conf.padding + titleHeight + conf.dividerMargin + membersBox.height)
+
+  const methods = g.append('text') // text label for the x axis
+    .attr('x', conf.padding)
+    .attr('y', titleHeight + 2 * conf.dividerMargin + membersBox.height + conf.textHeight)
+    .attr('fill', 'white')
+    .attr('class', 'classText')
+
+  isFirst = true
+
+  classDef.methods.forEach(function (method) {
+    addTspan(methods, method, isFirst)
+    isFirst = false
+  })
+
+  const classBox = g.node().getBBox()
+  g.insert('rect', ':first-child')
+    .attr('x', 0)
+    .attr('y', 0)
+    .attr('width', classBox.width + 2 * conf.padding)
+    .attr('height', classBox.height + conf.padding + 0.5 * conf.dividerMargin)
+
+  membersLine.attr('x2', classBox.width + 2 * conf.padding)
+  methodsLine.attr('x2', classBox.width + 2 * conf.padding)
+
+  classInfo.width = classBox.width + 2 * conf.padding
+  classInfo.height = classBox.height + conf.padding + 0.5 * conf.dividerMargin
+
+  idCache[id] = classInfo
+  classCnt++
+  return classInfo
+}
+
+export const setConf = function (cnf) {
+  const keys = Object.keys(cnf)
+
+  keys.forEach(function (key) {
+    conf[key] = cnf[key]
+  })
+}
+/**
+ * Draws a flowchart in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+export const draw = function (text, id) {
+  parser.yy.clear()
+  parser.parse(text)
+
+  logger.info('Rendering diagram ' + text)
+
+  /// / Fetch the default direction, use TD if none was found
+  const diagram = d3.select(`[id="${id}"]`)
+  insertMarkers(diagram)
+
+  // Layout graph, Create a new directed graph
+  const g = new graphlib.Graph({
+    multigraph: true
+  })
+
+  // Set an object for the graph label
+  g.setGraph({
+    isMultiGraph: true
+  })
+
+  // Default to assigning a new object as a label for each new edge.
+  g.setDefaultEdgeLabel(function () {
+    return {}
+  })
+
+  const classes = classDb.getClasses()
+  const keys = Object.keys(classes)
+  for (let i = 0; i < keys.length; i++) {
+    const classDef = classes[keys[i]]
+    const node = drawClass(diagram, classDef)
+    // Add nodes to the graph. The first argument is the node id. The second is
+    // metadata about the node. In this case we're going to add labels to each of
+    // our nodes.
+    g.setNode(node.id, node)
+    logger.info('Org height: ' + node.height)
+  }
+
+  const relations = classDb.getRelations()
+  relations.forEach(function (relation) {
+    logger.info('tjoho' + getGraphId(relation.id1) + getGraphId(relation.id2) + JSON.stringify(relation))
+    g.setEdge(getGraphId(relation.id1), getGraphId(relation.id2), { relation: relation })
+  })
+  dagre.layout(g)
+  g.nodes().forEach(function (v) {
+    if (typeof v !== 'undefined') {
+      logger.debug('Node ' + v + ': ' + JSON.stringify(g.node(v)))
+      d3.select('#' + v).attr('transform', 'translate(' + (g.node(v).x - (g.node(v).width / 2)) + ',' + (g.node(v).y - (g.node(v).height / 2)) + ' )')
+    }
+  })
+  g.edges().forEach(function (e) {
+    logger.debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(g.edge(e)))
+    drawEdge(diagram, g.edge(e), g.edge(e).relation)
+  })
+
+  diagram.attr('height', '100%')
+  diagram.attr('width', '100%')
+  diagram.attr('viewBox', '0 0 ' + (g.graph().width + 20) + ' ' + (g.graph().height + 20))
+}
+
+export default {
+  setConf,
+  draw
+}
diff --git a/_submodules/mermaid/src/diagrams/class/parser/classDiagram.jison b/_submodules/mermaid/src/diagrams/class/parser/classDiagram.jison
new file mode 100644
index 0000000000000000000000000000000000000000..f633d144cb260a86c0ffaf05fa80bfcc43825751
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/class/parser/classDiagram.jison
@@ -0,0 +1,196 @@
+/** mermaid
+ *  https://mermaidjs.github.io/
+ *  (c) 2015 Knut Sveidqvist
+ *  MIT license.
+ */
+
+/* lexical grammar */
+%lex
+%x string struct
+
+%%
+\%\%[^\n]*            /* do nothing */
+\n+                   return 'NEWLINE';
+\s+                     /* skip whitespace */
+"classDiagram"          return 'CLASS_DIAGRAM';
+[\{]                    { this.begin("struct"); /*console.log('Starting struct');*/return 'STRUCT_START';}
+<struct>\}           { /*console.log('Ending struct');*/this.popState(); return 'STRUCT_STOP';}}
+<struct>[\n]              /* nothing */
+<struct>[^\{\}\n]*     { /*console.log('lex-member: ' + yytext);*/  return "MEMBER";}
+
+
+
+"class"               return 'CLASS';
+["]                   this.begin("string");
+<string>["]           this.popState();
+<string>[^"]*         return "STR";
+
+
+\s*\<\|               return 'EXTENSION';
+\s*\|\>               return 'EXTENSION';
+\s*\>                 return 'DEPENDENCY';
+\s*\<                 return 'DEPENDENCY';
+\s*\*                  return 'COMPOSITION';
+\s*o                  return 'AGGREGATION';
+\-\-                  return 'LINE';
+\.\.                  return 'DOTTED_LINE';
+":"[^#\n;]+        return 'LABEL';
+\-                    return 'MINUS';
+"."                   return 'DOT';
+\+                    return 'PLUS';
+\%                    return 'PCT';
+"="                   return 'EQUALS';
+\=                    return 'EQUALS';
+[A-Za-z]+             return 'ALPHA';
+[!"#$%&'*+,-.`?\\_/]  return 'PUNCTUATION';
+[0-9]+                 return 'NUM';
+[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|
+[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|
+[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|
+[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|
+[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|
+[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|
+[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|
+[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|
+[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|
+[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|
+[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|
+[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|
+[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|
+[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|
+[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|
+[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|
+[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|
+[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|
+[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|
+[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|
+[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|
+[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|
+[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|
+[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|
+[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|
+[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|
+[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|
+[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|
+[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|
+[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|
+[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|
+[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|
+[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|
+[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|
+[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|
+[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|
+[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|
+[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|
+[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|
+[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|
+[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|
+[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|
+[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|
+[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|
+[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|
+[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|
+[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|
+[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|
+[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|
+[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|
+[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|
+[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|
+[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|
+[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|
+[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|
+[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|
+[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|
+[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|
+[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|
+[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|
+[\uFFD2-\uFFD7\uFFDA-\uFFDC]
+                      return 'UNICODE_TEXT';
+\s                    return 'SPACE';
+<<EOF>>               return 'EOF';
+
+/lex
+
+/* operator associations and precedence */
+
+%left '^'
+
+%start mermaidDoc
+
+%% /* language grammar */
+
+mermaidDoc: graphConfig;
+
+graphConfig
+    : CLASS_DIAGRAM NEWLINE statements EOF
+    ;
+
+statements
+    : statement
+    | statement NEWLINE statements
+    ;
+
+
+className
+    : alphaNumToken className { $$=$1+$2; }
+    | alphaNumToken { $$=$1; }
+    ;
+
+statement
+    : relationStatement       { yy.addRelation($1); }
+    | relationStatement LABEL { $1.title =  yy.cleanupLabel($2); yy.addRelation($1);        }
+    | classStatement
+    | methodStatement
+    ;
+
+classStatement
+    : CLASS className
+    | CLASS className STRUCT_START members STRUCT_STOP {/*console.log($2,JSON.stringify($4));*/yy.addMembers($2,$4);}
+    ;
+
+members
+    : MEMBER { $$ = [$1]; }
+    | MEMBER members { $2.push($1);$$=$2;}
+    ;
+
+methodStatement
+    : className {/*console.log('Rel found',$1);*/}
+    | className LABEL {yy.addMembers($1,yy.cleanupLabel($2));}
+    | MEMBER {console.warn('Member',$1);}
+    | SEPARATOR {/*console.log('sep found',$1);*/}
+    ;
+
+relationStatement
+    : className relation className          { $$ = {'id1':$1,'id2':$3, relation:$2, relationTitle1:'none', relationTitle2:'none'}; }
+    | className STR relation className      { $$ = {id1:$1, id2:$4, relation:$3, relationTitle1:$2, relationTitle2:'none'}}
+    | className relation STR className      { $$ = {id1:$1, id2:$4, relation:$2, relationTitle1:'none', relationTitle2:$3}; }
+    | className STR relation STR className  { $$ = {id1:$1, id2:$5, relation:$3, relationTitle1:$2, relationTitle2:$4} }
+    ;
+
+relation
+    : relationType lineType relationType { $$={type1:$1,type2:$3,lineType:$2}; }
+    | lineType relationType { $$={type1:'none',type2:$2,lineType:$1}; }
+    | relationType lineType { $$={type1:$1,type2:'none',lineType:$2}; }
+    | lineType { $$={type1:'none',type2:'none',lineType:$1}; }
+    ;
+
+relationType
+    : AGGREGATION { $$=yy.relationType.AGGREGATION;}
+    | EXTENSION   { $$=yy.relationType.EXTENSION;}
+    | COMPOSITION { $$=yy.relationType.COMPOSITION;}
+    | DEPENDENCY  { $$=yy.relationType.DEPENDENCY;}
+    ;
+
+lineType
+    : LINE          {$$=yy.lineType.LINE;}
+    | DOTTED_LINE   {$$=yy.lineType.DOTTED_LINE;}
+    ;
+
+commentToken   : textToken | graphCodeTokens ;
+
+textToken      : textNoTagsToken | TAGSTART | TAGEND | '=='  | '--' | PCT | DEFAULT;
+
+textNoTagsToken: alphaNumToken | SPACE | MINUS | keywords ;
+
+alphaNumToken  : UNICODE_TEXT | NUM | ALPHA;
+%%
diff --git a/_submodules/mermaid/src/diagrams/class/parser/classDiagram.js b/_submodules/mermaid/src/diagrams/class/parser/classDiagram.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ff57a54d2a1b6d0baa3c3ce6a50f75381c4e3c9
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/class/parser/classDiagram.js
@@ -0,0 +1,740 @@
+/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,11],$V1=[1,12],$V2=[1,13],$V3=[1,15],$V4=[1,16],$V5=[1,17],$V6=[6,8],$V7=[1,26],$V8=[1,27],$V9=[1,28],$Va=[1,29],$Vb=[1,30],$Vc=[1,31],$Vd=[6,8,13,17,23,26,27,28,29,30,31],$Ve=[6,8,13,17,23,26,27,28,29,30,31,45,46,47],$Vf=[23,45,46,47],$Vg=[23,30,31,45,46,47],$Vh=[23,26,27,28,29,45,46,47],$Vi=[6,8,13],$Vj=[1,46];
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"mermaidDoc":3,"graphConfig":4,"CLASS_DIAGRAM":5,"NEWLINE":6,"statements":7,"EOF":8,"statement":9,"className":10,"alphaNumToken":11,"relationStatement":12,"LABEL":13,"classStatement":14,"methodStatement":15,"CLASS":16,"STRUCT_START":17,"members":18,"STRUCT_STOP":19,"MEMBER":20,"SEPARATOR":21,"relation":22,"STR":23,"relationType":24,"lineType":25,"AGGREGATION":26,"EXTENSION":27,"COMPOSITION":28,"DEPENDENCY":29,"LINE":30,"DOTTED_LINE":31,"commentToken":32,"textToken":33,"graphCodeTokens":34,"textNoTagsToken":35,"TAGSTART":36,"TAGEND":37,"==":38,"--":39,"PCT":40,"DEFAULT":41,"SPACE":42,"MINUS":43,"keywords":44,"UNICODE_TEXT":45,"NUM":46,"ALPHA":47,"$accept":0,"$end":1},
+terminals_: {2:"error",5:"CLASS_DIAGRAM",6:"NEWLINE",8:"EOF",13:"LABEL",16:"CLASS",17:"STRUCT_START",19:"STRUCT_STOP",20:"MEMBER",21:"SEPARATOR",23:"STR",26:"AGGREGATION",27:"EXTENSION",28:"COMPOSITION",29:"DEPENDENCY",30:"LINE",31:"DOTTED_LINE",34:"graphCodeTokens",36:"TAGSTART",37:"TAGEND",38:"==",39:"--",40:"PCT",41:"DEFAULT",42:"SPACE",43:"MINUS",44:"keywords",45:"UNICODE_TEXT",46:"NUM",47:"ALPHA"},
+productions_: [0,[3,1],[4,4],[7,1],[7,3],[10,2],[10,1],[9,1],[9,2],[9,1],[9,1],[14,2],[14,5],[18,1],[18,2],[15,1],[15,2],[15,1],[15,1],[12,3],[12,4],[12,4],[12,5],[22,3],[22,2],[22,2],[22,1],[24,1],[24,1],[24,1],[24,1],[25,1],[25,1],[32,1],[32,1],[33,1],[33,1],[33,1],[33,1],[33,1],[33,1],[33,1],[35,1],[35,1],[35,1],[35,1],[11,1],[11,1],[11,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 5:
+ this.$=$$[$0-1]+$$[$0]; 
+break;
+case 6:
+ this.$=$$[$0]; 
+break;
+case 7:
+ yy.addRelation($$[$0]); 
+break;
+case 8:
+ $$[$0-1].title =  yy.cleanupLabel($$[$0]); yy.addRelation($$[$0-1]);        
+break;
+case 12:
+/*console.log($$[$0-3],JSON.stringify($$[$0-1]));*/yy.addMembers($$[$0-3],$$[$0-1]);
+break;
+case 13:
+ this.$ = [$$[$0]]; 
+break;
+case 14:
+ $$[$0].push($$[$0-1]);this.$=$$[$0];
+break;
+case 15:
+/*console.log('Rel found',$$[$0]);*/
+break;
+case 16:
+yy.addMembers($$[$0-1],yy.cleanupLabel($$[$0]));
+break;
+case 17:
+console.warn('Member',$$[$0]);
+break;
+case 18:
+/*console.log('sep found',$$[$0]);*/
+break;
+case 19:
+ this.$ = {'id1':$$[$0-2],'id2':$$[$0], relation:$$[$0-1], relationTitle1:'none', relationTitle2:'none'}; 
+break;
+case 20:
+ this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-1], relationTitle1:$$[$0-2], relationTitle2:'none'}
+break;
+case 21:
+ this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-2], relationTitle1:'none', relationTitle2:$$[$0-1]}; 
+break;
+case 22:
+ this.$ = {id1:$$[$0-4], id2:$$[$0], relation:$$[$0-2], relationTitle1:$$[$0-3], relationTitle2:$$[$0-1]} 
+break;
+case 23:
+ this.$={type1:$$[$0-2],type2:$$[$0],lineType:$$[$0-1]}; 
+break;
+case 24:
+ this.$={type1:'none',type2:$$[$0],lineType:$$[$0-1]}; 
+break;
+case 25:
+ this.$={type1:$$[$0-1],type2:'none',lineType:$$[$0]}; 
+break;
+case 26:
+ this.$={type1:'none',type2:'none',lineType:$$[$0]}; 
+break;
+case 27:
+ this.$=yy.relationType.AGGREGATION;
+break;
+case 28:
+ this.$=yy.relationType.EXTENSION;
+break;
+case 29:
+ this.$=yy.relationType.COMPOSITION;
+break;
+case 30:
+ this.$=yy.relationType.DEPENDENCY;
+break;
+case 31:
+this.$=yy.lineType.LINE;
+break;
+case 32:
+this.$=yy.lineType.DOTTED_LINE;
+break;
+}
+},
+table: [{3:1,4:2,5:[1,3]},{1:[3]},{1:[2,1]},{6:[1,4]},{7:5,9:6,10:10,11:14,12:7,14:8,15:9,16:$V0,20:$V1,21:$V2,45:$V3,46:$V4,47:$V5},{8:[1,18]},{6:[1,19],8:[2,3]},o($V6,[2,7],{13:[1,20]}),o($V6,[2,9]),o($V6,[2,10]),o($V6,[2,15],{22:21,24:24,25:25,13:[1,23],23:[1,22],26:$V7,27:$V8,28:$V9,29:$Va,30:$Vb,31:$Vc}),{10:32,11:14,45:$V3,46:$V4,47:$V5},o($V6,[2,17]),o($V6,[2,18]),o($Vd,[2,6],{11:14,10:33,45:$V3,46:$V4,47:$V5}),o($Ve,[2,46]),o($Ve,[2,47]),o($Ve,[2,48]),{1:[2,2]},{7:34,9:6,10:10,11:14,12:7,14:8,15:9,16:$V0,20:$V1,21:$V2,45:$V3,46:$V4,47:$V5},o($V6,[2,8]),{10:35,11:14,23:[1,36],45:$V3,46:$V4,47:$V5},{22:37,24:24,25:25,26:$V7,27:$V8,28:$V9,29:$Va,30:$Vb,31:$Vc},o($V6,[2,16]),{25:38,30:$Vb,31:$Vc},o($Vf,[2,26],{24:39,26:$V7,27:$V8,28:$V9,29:$Va}),o($Vg,[2,27]),o($Vg,[2,28]),o($Vg,[2,29]),o($Vg,[2,30]),o($Vh,[2,31]),o($Vh,[2,32]),o($V6,[2,11],{17:[1,40]}),o($Vd,[2,5]),{8:[2,4]},o($Vi,[2,19]),{10:41,11:14,45:$V3,46:$V4,47:$V5},{10:42,11:14,23:[1,43],45:$V3,46:$V4,47:$V5},o($Vf,[2,25],{24:44,26:$V7,27:$V8,28:$V9,29:$Va}),o($Vf,[2,24]),{18:45,20:$Vj},o($Vi,[2,21]),o($Vi,[2,20]),{10:47,11:14,45:$V3,46:$V4,47:$V5},o($Vf,[2,23]),{19:[1,48]},{18:49,19:[2,13],20:$Vj},o($Vi,[2,22]),o($V6,[2,12]),{19:[2,14]}],
+defaultActions: {2:[2,1],18:[2,2],34:[2,4],49:[2,14]},
+parseError: function parseError(str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function (match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex() {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin(condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState() {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules() {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState(n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState(condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:/* do nothing */
+break;
+case 1:return 6;
+break;
+case 2:/* skip whitespace */
+break;
+case 3:return 5;
+break;
+case 4: this.begin("struct"); /*console.log('Starting struct');*/return 17;
+break;
+case 5: /*console.log('Ending struct');*/this.popState(); return 19;
+break;
+case 6:/* nothing */
+break;
+case 7: /*console.log('lex-member: ' + yy_.yytext);*/  return "MEMBER";
+break;
+case 8:return 16;
+break;
+case 9:this.begin("string");
+break;
+case 10:this.popState();
+break;
+case 11:return "STR";
+break;
+case 12:return 27;
+break;
+case 13:return 27;
+break;
+case 14:return 29;
+break;
+case 15:return 29;
+break;
+case 16:return 28;
+break;
+case 17:return 26;
+break;
+case 18:return 30;
+break;
+case 19:return 31;
+break;
+case 20:return 13;
+break;
+case 21:return 43;
+break;
+case 22:return 'DOT';
+break;
+case 23:return 'PLUS';
+break;
+case 24:return 40;
+break;
+case 25:return 'EQUALS';
+break;
+case 26:return 'EQUALS';
+break;
+case 27:return 47;
+break;
+case 28:return 'PUNCTUATION';
+break;
+case 29:return 46;
+break;
+case 30:return 45;
+break;
+case 31:return 42;
+break;
+case 32:return 8;
+break;
+}
+},
+rules: [/^(?:%%[^\n]*)/,/^(?:\n+)/,/^(?:\s+)/,/^(?:classDiagram\b)/,/^(?:[\{])/,/^(?:\})/,/^(?:[\n])/,/^(?:[^\{\}\n]*)/,/^(?:class\b)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:--)/,/^(?:\.\.)/,/^(?::[^#\n;]+)/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:[A-Za-z]+)/,/^(?:[!"#$%&'*+,-.`?\\_\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],
+conditions: {"string":{"rules":[10,11],"inclusive":false},"struct":{"rules":[5,6,7],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,8,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain(args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if (typeof module !== 'undefined' && require.main === module) {
+  exports.main(process.argv.slice(1));
+}
+}
\ No newline at end of file
diff --git a/_submodules/mermaid/src/diagrams/flowchart/flowDb.js b/_submodules/mermaid/src/diagrams/flowchart/flowDb.js
new file mode 100644
index 0000000000000000000000000000000000000000..275e9c39df5c52839455f0adff0af0c4f131115f
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/flowchart/flowDb.js
@@ -0,0 +1,423 @@
+import * as d3 from 'd3'
+
+import { logger } from '../../logger'
+import utils from '../../utils'
+
+let vertices = {}
+let edges = []
+let classes = []
+let subGraphs = []
+let tooltips = {}
+let subCount = 0
+let direction
+// Functions to be run after graph rendering
+let funs = []
+/**
+ * Function called by parser when a node definition has been found
+ * @param id
+ * @param text
+ * @param type
+ * @param style
+ */
+export const addVertex = function (id, text, type, style) {
+  let txt
+
+  if (typeof id === 'undefined') {
+    return
+  }
+  if (id.trim().length === 0) {
+    return
+  }
+
+  if (typeof vertices[id] === 'undefined') {
+    vertices[id] = { id: id, styles: [], classes: [] }
+  }
+  if (typeof text !== 'undefined') {
+    txt = text.trim()
+
+    // strip quotes if string starts and exnds with a quote
+    if (txt[0] === '"' && txt[txt.length - 1] === '"') {
+      txt = txt.substring(1, txt.length - 1)
+    }
+
+    vertices[id].text = txt
+  }
+  if (typeof type !== 'undefined') {
+    vertices[id].type = type
+  }
+  if (typeof type !== 'undefined') {
+    vertices[id].type = type
+  }
+  if (typeof style !== 'undefined') {
+    if (style !== null) {
+      style.forEach(function (s) {
+        vertices[id].styles.push(s)
+      })
+    }
+  }
+}
+
+/**
+ * Function called by parser when a link/edge definition has been found
+ * @param start
+ * @param end
+ * @param type
+ * @param linktext
+ */
+export const addLink = function (start, end, type, linktext) {
+  logger.info('Got edge...', start, end)
+  const edge = { start: start, end: end, type: undefined, text: '' }
+  linktext = type.text
+
+  if (typeof linktext !== 'undefined') {
+    edge.text = linktext.trim()
+
+    // strip quotes if string starts and exnds with a quote
+    if (edge.text[0] === '"' && edge.text[edge.text.length - 1] === '"') {
+      edge.text = edge.text.substring(1, edge.text.length - 1)
+    }
+  }
+
+  if (typeof type !== 'undefined') {
+    edge.type = type.type
+    edge.stroke = type.stroke
+  }
+  edges.push(edge)
+}
+
+/**
+ * Updates a link's line interpolation algorithm
+ * @param pos
+ * @param interpolate
+ */
+export const updateLinkInterpolate = function (pos, interp) {
+  if (pos === 'default') {
+    edges.defaultInterpolate = interp
+  } else {
+    edges[pos].interpolate = interp
+  }
+}
+
+/**
+ * Updates a link with a style
+ * @param pos
+ * @param style
+ */
+export const updateLink = function (pos, style) {
+  if (pos === 'default') {
+    edges.defaultStyle = style
+  } else {
+    if (utils.isSubstringInArray('fill', style) === -1) {
+      style.push('fill:none')
+    }
+    edges[pos].style = style
+  }
+}
+
+export const addClass = function (id, style) {
+  if (typeof classes[id] === 'undefined') {
+    classes[id] = { id: id, styles: [] }
+  }
+
+  if (typeof style !== 'undefined') {
+    if (style !== null) {
+      style.forEach(function (s) {
+        classes[id].styles.push(s)
+      })
+    }
+  }
+}
+
+/**
+ * Called by parser when a graph definition is found, stores the direction of the chart.
+ * @param dir
+ */
+export const setDirection = function (dir) {
+  direction = dir
+}
+
+/**
+ * Called by parser when a graph definition is found, stores the direction of the chart.
+ * @param dir
+ */
+export const setClass = function (id, className) {
+  if (id.indexOf(',') > 0) {
+    id.split(',').forEach(function (id2) {
+      if (typeof vertices[id2] !== 'undefined') {
+        vertices[id2].classes.push(className)
+      }
+    })
+  } else {
+    if (typeof vertices[id] !== 'undefined') {
+      vertices[id].classes.push(className)
+    }
+  }
+}
+
+const setTooltip = function (id, tooltip) {
+  if (typeof tooltip !== 'undefined') {
+    tooltips[id] = tooltip
+  }
+}
+
+const setClickFun = function (id, functionName) {
+  if (typeof functionName === 'undefined') {
+    return
+  }
+  if (typeof vertices[id] !== 'undefined') {
+    funs.push(function (element) {
+      const elem = d3.select(element).select(`[id="${id}"]`)
+      if (elem !== null) {
+        elem.on('click', function () {
+          window[functionName](id)
+        })
+      }
+    })
+  }
+}
+
+const setLink = function (id, linkStr) {
+  if (typeof linkStr === 'undefined') {
+    return
+  }
+  if (typeof vertices[id] !== 'undefined') {
+    funs.push(function (element) {
+      const elem = d3.select(element).select(`[id="${id}"]`)
+      if (elem !== null) {
+        elem.on('click', function () {
+          window.open(linkStr, 'newTab')
+        })
+      }
+    })
+  }
+}
+export const getTooltip = function (id) {
+  return tooltips[id]
+}
+
+/**
+ * Called by parser when a graph definition is found, stores the direction of the chart.
+ * @param dir
+ */
+export const setClickEvent = function (id, functionName, link, tooltip) {
+  if (id.indexOf(',') > 0) {
+    id.split(',').forEach(function (id2) {
+      setTooltip(id2, tooltip)
+      setClickFun(id2, functionName)
+      setLink(id2, link)
+      setClass(id, 'clickable')
+    })
+  } else {
+    setTooltip(id, tooltip)
+    setClickFun(id, functionName)
+    setLink(id, link)
+    setClass(id, 'clickable')
+  }
+}
+
+export const bindFunctions = function (element) {
+  funs.forEach(function (fun) {
+    fun(element)
+  })
+}
+export const getDirection = function () {
+  return direction
+}
+/**
+ * Retrieval function for fetching the found nodes after parsing has completed.
+ * @returns {{}|*|vertices}
+ */
+export const getVertices = function () {
+  return vertices
+}
+
+/**
+ * Retrieval function for fetching the found links after parsing has completed.
+ * @returns {{}|*|edges}
+ */
+export const getEdges = function () {
+  return edges
+}
+
+/**
+ * Retrieval function for fetching the found class definitions after parsing has completed.
+ * @returns {{}|*|classes}
+ */
+export const getClasses = function () {
+  return classes
+}
+
+const setupToolTips = function (element) {
+  let tooltipElem = d3.select('.mermaidTooltip')
+  if ((tooltipElem._groups || tooltipElem)[0][0] === null) {
+    tooltipElem = d3.select('body')
+      .append('div')
+      .attr('class', 'mermaidTooltip')
+      .style('opacity', 0)
+  }
+
+  const svg = d3.select(element).select('svg')
+
+  const nodes = svg.selectAll('g.node')
+  nodes
+    .on('mouseover', function () {
+      const el = d3.select(this)
+      const title = el.attr('title')
+      // Dont try to draw a tooltip if no data is provided
+      if (title === null) {
+        return
+      }
+      const rect = this.getBoundingClientRect()
+
+      tooltipElem.transition()
+        .duration(200)
+        .style('opacity', '.9')
+      tooltipElem.html(el.attr('title'))
+        .style('left', (rect.left + (rect.right - rect.left) / 2) + 'px')
+        .style('top', (rect.top - 14 + document.body.scrollTop) + 'px')
+      el.classed('hover', true)
+    })
+    .on('mouseout', function () {
+      tooltipElem.transition()
+        .duration(500)
+        .style('opacity', 0)
+      const el = d3.select(this)
+      el.classed('hover', false)
+    })
+}
+funs.push(setupToolTips)
+
+/**
+ * Clears the internal graph db so that a new graph can be parsed.
+ */
+export const clear = function () {
+  vertices = {}
+  classes = {}
+  edges = []
+  funs = []
+  funs.push(setupToolTips)
+  subGraphs = []
+  subCount = 0
+  tooltips = []
+}
+/**
+ *
+ * @returns {string}
+ */
+export const defaultStyle = function () {
+  return 'fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;'
+}
+
+/**
+ * Clears the internal graph db so that a new graph can be parsed.
+ */
+export const addSubGraph = function (list, title) {
+  function uniq (a) {
+    const prims = { 'boolean': {}, 'number': {}, 'string': {} }
+    const objs = []
+
+    return a.filter(function (item) {
+      const type = typeof item
+      if (item.trim() === '') {
+        return false
+      }
+      if (type in prims) { return prims[type].hasOwnProperty(item) ? false : (prims[type][item] = true) } else { return objs.indexOf(item) >= 0 ? false : objs.push(item) }
+    })
+  }
+
+  let nodeList = []
+
+  nodeList = uniq(nodeList.concat.apply(nodeList, list))
+
+  const subGraph = { id: 'subGraph' + subCount, nodes: nodeList, title: title.trim() }
+  subGraphs.push(subGraph)
+  subCount = subCount + 1
+  return subGraph.id
+}
+
+const getPosForId = function (id) {
+  for (let i = 0; i < subGraphs.length; i++) {
+    if (subGraphs[i].id === id) {
+      return i
+    }
+  }
+  return -1
+}
+let secCount = -1
+const posCrossRef = []
+const indexNodes2 = function (id, pos) {
+  const nodes = subGraphs[pos].nodes
+  secCount = secCount + 1
+  if (secCount > 2000) {
+    return
+  }
+  posCrossRef[secCount] = pos
+  // Check if match
+  if (subGraphs[pos].id === id) {
+    return {
+      result: true,
+      count: 0
+    }
+  }
+
+  let count = 0
+  let posCount = 1
+  while (count < nodes.length) {
+    const childPos = getPosForId(nodes[count])
+    // Ignore regular nodes (pos will be -1)
+    if (childPos >= 0) {
+      const res = indexNodes2(id, childPos)
+      if (res.result) {
+        return {
+          result: true,
+          count: posCount + res.count
+        }
+      } else {
+        posCount = posCount + res.count
+      }
+    }
+    count = count + 1
+  }
+
+  return {
+    result: false,
+    count: posCount
+  }
+}
+
+export const getDepthFirstPos = function (pos) {
+  return posCrossRef[pos]
+}
+export const indexNodes = function () {
+  secCount = -1
+  if (subGraphs.length > 0) {
+    indexNodes2('none', subGraphs.length - 1, 0)
+  }
+}
+
+export const getSubGraphs = function () {
+  return subGraphs
+}
+
+export default {
+  addVertex,
+  addLink,
+  updateLinkInterpolate,
+  updateLink,
+  addClass,
+  setDirection,
+  setClass,
+  getTooltip,
+  setClickEvent,
+  bindFunctions,
+  getDirection,
+  getVertices,
+  getEdges,
+  getClasses,
+  clear,
+  defaultStyle,
+  addSubGraph,
+  getDepthFirstPos,
+  indexNodes,
+  getSubGraphs
+}
diff --git a/_submodules/mermaid/src/diagrams/flowchart/flowRenderer.js b/_submodules/mermaid/src/diagrams/flowchart/flowRenderer.js
new file mode 100644
index 0000000000000000000000000000000000000000..2375265055373bbbc2a609e7717fe0a3eadd8069
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/flowchart/flowRenderer.js
@@ -0,0 +1,473 @@
+import graphlib from 'graphlibrary'
+import * as d3 from 'd3'
+
+import flowDb from './flowDb'
+import flow from './parser/flow'
+import dagreD3 from 'dagre-d3-renderer'
+import { logger } from '../../logger'
+import { interpolateToCurve } from '../../utils'
+
+const conf = {
+}
+export const setConf = function (cnf) {
+  const keys = Object.keys(cnf)
+  for (let i = 0; i < keys.length; i++) {
+    conf[keys[i]] = cnf[keys[i]]
+  }
+}
+
+/**
+ * Function that adds the vertices found in the graph definition to the graph to be rendered.
+ * @param vert Object containing the vertices.
+ * @param g The graph that is to be drawn.
+ */
+export const addVertices = function (vert, g) {
+  const keys = Object.keys(vert)
+
+  const styleFromStyleArr = function (styleStr, arr) {
+    // Create a compound style definition from the style definitions found for the node in the graph definition
+    for (let i = 0; i < arr.length; i++) {
+      if (typeof arr[i] !== 'undefined') {
+        styleStr = styleStr + arr[i] + ';'
+      }
+    }
+
+    return styleStr
+  }
+
+  // Iterate through each item in the vertice object (containing all the vertices found) in the graph definition
+  keys.forEach(function (id) {
+    const vertice = vert[id]
+    let verticeText
+
+    /**
+     * Variable for storing the classes for the vertice
+     * @type {string}
+     */
+    let classStr = ''
+    if (vertice.classes.length > 0) {
+      classStr = vertice.classes.join(' ')
+    }
+
+    /**
+     * Variable for storing the extracted style for the vertice
+     * @type {string}
+     */
+    let style = ''
+    // Create a compound style definition from the style definitions found for the node in the graph definition
+    style = styleFromStyleArr(style, vertice.styles)
+
+    // Use vertice id as text in the box if no text is provided by the graph definition
+    if (typeof vertice.text === 'undefined') {
+      verticeText = vertice.id
+    } else {
+      verticeText = vertice.text
+    }
+
+    let labelTypeStr = ''
+    if (conf.htmlLabels) {
+      labelTypeStr = 'html'
+      verticeText = verticeText.replace(/fa:fa[\w-]+/g, function (s) {
+        return '<i class="fa ' + s.substring(3) + '"></i>'
+      })
+    } else {
+      const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text')
+
+      const rows = verticeText.split(/<br>/)
+
+      for (let j = 0; j < rows.length; j++) {
+        const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan')
+        tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve')
+        tspan.setAttribute('dy', '1em')
+        tspan.setAttribute('x', '1')
+        tspan.textContent = rows[j]
+        svgLabel.appendChild(tspan)
+      }
+
+      labelTypeStr = 'svg'
+      verticeText = svgLabel
+    }
+
+    let radious = 0
+    let _shape = ''
+    // Set the shape based parameters
+    switch (vertice.type) {
+      case 'round':
+        radious = 5
+        _shape = 'rect'
+        break
+      case 'square':
+        _shape = 'rect'
+        break
+      case 'diamond':
+        _shape = 'question'
+        break
+      case 'odd':
+        _shape = 'rect_left_inv_arrow'
+        break
+      case 'odd_right':
+        _shape = 'rect_left_inv_arrow'
+        break
+      case 'circle':
+        _shape = 'circle'
+        break
+      case 'ellipse':
+        _shape = 'ellipse'
+        break
+      case 'group':
+        _shape = 'rect'
+        // Need to create a text node if using svg labels, see #367
+        verticeText = conf.htmlLabels ? '' : document.createElementNS('http://www.w3.org/2000/svg', 'text')
+        break
+      default:
+        _shape = 'rect'
+    }
+    // Add the node
+    g.setNode(vertice.id, { labelType: labelTypeStr, shape: _shape, label: verticeText, rx: radious, ry: radious, 'class': classStr, style: style, id: vertice.id })
+  })
+}
+
+/**
+ * Add edges to graph based on parsed graph defninition
+ * @param {Object} edges The edges to add to the graph
+ * @param {Object} g The graph object
+ */
+export const addEdges = function (edges, g) {
+  let cnt = 0
+
+  let defaultStyle
+  if (typeof edges.defaultStyle !== 'undefined') {
+    defaultStyle = edges.defaultStyle.toString().replace(/,/g, ';')
+  }
+
+  edges.forEach(function (edge) {
+    cnt++
+    const edgeData = {}
+
+    // Set link type for rendering
+    if (edge.type === 'arrow_open') {
+      edgeData.arrowhead = 'none'
+    } else {
+      edgeData.arrowhead = 'normal'
+    }
+
+    let style = ''
+    if (typeof edge.style !== 'undefined') {
+      edge.style.forEach(function (s) {
+        style = style + s + ';'
+      })
+    } else {
+      switch (edge.stroke) {
+        case 'normal':
+          style = 'fill:none'
+          if (typeof defaultStyle !== 'undefined') {
+            style = defaultStyle
+          }
+          break
+        case 'dotted':
+          style = 'stroke: #333; fill:none;stroke-width:2px;stroke-dasharray:3;'
+          break
+        case 'thick':
+          style = 'stroke: #333; stroke-width: 3.5px;fill:none'
+          break
+      }
+    }
+    edgeData.style = style
+
+    if (typeof edge.interpolate !== 'undefined') {
+      edgeData.curve = interpolateToCurve(edge.interpolate, d3.curveLinear)
+    } else if (typeof edges.defaultInterpolate !== 'undefined') {
+      edgeData.curve = interpolateToCurve(edges.defaultInterpolate, d3.curveLinear)
+    } else {
+      edgeData.curve = interpolateToCurve(conf.curve, d3.curveLinear)
+    }
+
+    if (typeof edge.text === 'undefined') {
+      if (typeof edge.style !== 'undefined') {
+        edgeData.arrowheadStyle = 'fill: #333'
+      }
+    } else {
+      edgeData.arrowheadStyle = 'fill: #333'
+      if (typeof edge.style === 'undefined') {
+        edgeData.labelpos = 'c'
+        if (conf.htmlLabels) {
+          edgeData.labelType = 'html'
+          edgeData.label = '<span class="edgeLabel">' + edge.text + '</span>'
+        } else {
+          edgeData.labelType = 'text'
+          edgeData.style = 'stroke: #333; stroke-width: 1.5px;fill:none'
+          edgeData.label = edge.text.replace(/<br>/g, '\n')
+        }
+      } else {
+        edgeData.label = edge.text.replace(/<br>/g, '\n')
+      }
+    }
+    // Add the edge to the graph
+    g.setEdge(edge.start, edge.end, edgeData, cnt)
+  })
+}
+
+/**
+ * Returns the all the styles from classDef statements in the graph definition.
+ * @returns {object} classDef styles
+ */
+export const getClasses = function (text) {
+  flowDb.clear()
+  const parser = flow.parser
+  parser.yy = flowDb
+
+  // Parse the graph definition
+  parser.parse(text)
+  return flowDb.getClasses()
+}
+
+/**
+ * Draws a flowchart in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+export const draw = function (text, id) {
+  logger.debug('Drawing flowchart')
+  flowDb.clear()
+  const parser = flow.parser
+  parser.yy = flowDb
+
+  // Parse the graph definition
+  try {
+    parser.parse(text)
+  } catch (err) {
+    logger.debug('Parsing failed')
+  }
+
+  // Fetch the default direction, use TD if none was found
+  let dir = flowDb.getDirection()
+  if (typeof dir === 'undefined') {
+    dir = 'TD'
+  }
+
+  // Create the input mermaid.graph
+  const g = new graphlib.Graph({
+    multigraph: true,
+    compound: true
+  })
+    .setGraph({
+      rankdir: dir,
+      marginx: 20,
+      marginy: 20
+
+    })
+    .setDefaultEdgeLabel(function () {
+      return {}
+    })
+
+  let subG
+  const subGraphs = flowDb.getSubGraphs()
+  for (let i = subGraphs.length - 1; i >= 0; i--) {
+    subG = subGraphs[i]
+    flowDb.addVertex(subG.id, subG.title, 'group', undefined)
+  }
+
+  // Fetch the verices/nodes and edges/links from the parsed graph definition
+  const vert = flowDb.getVertices()
+
+  const edges = flowDb.getEdges()
+
+  let i = 0
+  for (i = subGraphs.length - 1; i >= 0; i--) {
+    subG = subGraphs[i]
+
+    d3.selectAll('cluster').append('text')
+
+    for (let j = 0; j < subG.nodes.length; j++) {
+      g.setParent(subG.nodes[j], subG.id)
+    }
+  }
+  addVertices(vert, g)
+  addEdges(edges, g)
+
+  // Create the renderer
+  const Render = dagreD3.render
+  const render = new Render()
+
+  // Add custom shape for rhombus type of boc (decision)
+  render.shapes().question = function (parent, bbox, node) {
+    const w = bbox.width
+    const h = bbox.height
+    const s = (w + h) * 0.9
+    const points = [
+      { x: s / 2, y: 0 },
+      { x: s, y: -s / 2 },
+      { x: s / 2, y: -s },
+      { x: 0, y: -s / 2 }
+    ]
+    const shapeSvg = parent.insert('polygon', ':first-child')
+      .attr('points', points.map(function (d) {
+        return d.x + ',' + d.y
+      }).join(' '))
+      .attr('rx', 5)
+      .attr('ry', 5)
+      .attr('transform', 'translate(' + (-s / 2) + ',' + (s * 2 / 4) + ')')
+    node.intersect = function (point) {
+      return dagreD3.intersect.polygon(node, points, point)
+    }
+    return shapeSvg
+  }
+
+  // Add custom shape for box with inverted arrow on left side
+  render.shapes().rect_left_inv_arrow = function (parent, bbox, node) {
+    const w = bbox.width
+    const h = bbox.height
+    const points = [
+      { x: -h / 2, y: 0 },
+      { x: w, y: 0 },
+      { x: w, y: -h },
+      { x: -h / 2, y: -h },
+      { x: 0, y: -h / 2 }
+    ]
+    const shapeSvg = parent.insert('polygon', ':first-child')
+      .attr('points', points.map(function (d) {
+        return d.x + ',' + d.y
+      }).join(' '))
+      .attr('transform', 'translate(' + (-w / 2) + ',' + (h * 2 / 4) + ')')
+    node.intersect = function (point) {
+      return dagreD3.intersect.polygon(node, points, point)
+    }
+    return shapeSvg
+  }
+
+  // Add custom shape for box with inverted arrow on right side
+  render.shapes().rect_right_inv_arrow = function (parent, bbox, node) {
+    const w = bbox.width
+    const h = bbox.height
+    const points = [
+      { x: 0, y: 0 },
+      { x: w + h / 2, y: 0 },
+      { x: w, y: -h / 2 },
+      { x: w + h / 2, y: -h },
+      { x: 0, y: -h }
+    ]
+    const shapeSvg = parent.insert('polygon', ':first-child')
+      .attr('points', points.map(function (d) {
+        return d.x + ',' + d.y
+      }).join(' '))
+      .attr('transform', 'translate(' + (-w / 2) + ',' + (h * 2 / 4) + ')')
+    node.intersect = function (point) {
+      return dagreD3.intersect.polygon(node, points, point)
+    }
+    return shapeSvg
+  }
+
+  // Add our custom arrow - an empty arrowhead
+  render.arrows().none = function normal (parent, id, edge, type) {
+    const marker = parent.append('marker')
+      .attr('id', id)
+      .attr('viewBox', '0 0 10 10')
+      .attr('refX', 9)
+      .attr('refY', 5)
+      .attr('markerUnits', 'strokeWidth')
+      .attr('markerWidth', 8)
+      .attr('markerHeight', 6)
+      .attr('orient', 'auto')
+
+    const path = marker.append('path')
+      .attr('d', 'M 0 0 L 0 0 L 0 0 z')
+    dagreD3.util.applyStyle(path, edge[type + 'Style'])
+  }
+
+  // Override normal arrowhead defined in d3. Remove style & add class to allow css styling.
+  render.arrows().normal = function normal (parent, id, edge, type) {
+    const marker = parent.append('marker')
+      .attr('id', id)
+      .attr('viewBox', '0 0 10 10')
+      .attr('refX', 9)
+      .attr('refY', 5)
+      .attr('markerUnits', 'strokeWidth')
+      .attr('markerWidth', 8)
+      .attr('markerHeight', 6)
+      .attr('orient', 'auto')
+
+    marker.append('path')
+      .attr('d', 'M 0 0 L 10 5 L 0 10 z')
+      .attr('class', 'arrowheadPath')
+      .style('stroke-width', 1)
+      .style('stroke-dasharray', '1,0')
+  }
+
+  // Set up an SVG group so that we can translate the final graph.
+  const svg = d3.select(`[id="${id}"]`)
+
+  // Run the renderer. This is what draws the final graph.
+  const element = d3.select('#' + id + ' g')
+  render(element, g)
+
+  element.selectAll('g.node')
+    .attr('title', function () {
+      return flowDb.getTooltip(this.id)
+    })
+
+  const padding = 8
+  const width = g.maxX - g.minX + padding * 2
+  const height = g.maxY - g.minY + padding * 2
+  svg.attr('width', '100%')
+  svg.attr('style', `max-width: ${width}px;`)
+  svg.attr('viewBox', `0 0 ${width} ${height}`)
+  svg.select('g').attr('transform', `translate(${padding - g.minX}, ${padding - g.minY})`)
+
+  // Index nodes
+  flowDb.indexNodes('subGraph' + i)
+
+  for (i = 0; i < subGraphs.length; i++) {
+    subG = subGraphs[i]
+
+    if (subG.title !== 'undefined') {
+      const clusterRects = document.querySelectorAll('#' + id + ' #' + subG.id + ' rect')
+      const clusterEl = document.querySelectorAll('#' + id + ' #' + subG.id)
+
+      const xPos = clusterRects[0].x.baseVal.value
+      const yPos = clusterRects[0].y.baseVal.value
+      const width = clusterRects[0].width.baseVal.value
+      const cluster = d3.select(clusterEl[0])
+      const te = cluster.append('text')
+      te.attr('x', xPos + width / 2)
+      te.attr('y', yPos + 14)
+      te.attr('fill', 'black')
+      te.attr('stroke', 'none')
+      te.attr('id', id + 'Text')
+      te.style('text-anchor', 'middle')
+
+      if (typeof subG.title === 'undefined') {
+        te.text('Undef')
+      } else {
+        te.text(subG.title)
+      }
+    }
+  }
+
+  // Add label rects for non html labels
+  if (!conf.htmlLabels) {
+    const labels = document.querySelectorAll('#' + id + ' .edgeLabel .label')
+    for (let k = 0; k < labels.length; k++) {
+      const label = labels[k]
+
+      // Get dimensions of label
+      const dim = label.getBBox()
+
+      const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')
+      rect.setAttribute('rx', 0)
+      rect.setAttribute('ry', 0)
+      rect.setAttribute('width', dim.width)
+      rect.setAttribute('height', dim.height)
+      rect.setAttribute('style', 'fill:#e8e8e8;')
+
+      label.insertBefore(rect, label.firstChild)
+    }
+  }
+}
+
+export default {
+  setConf,
+  addVertices,
+  addEdges,
+  getClasses,
+  draw
+}
diff --git a/_submodules/mermaid/src/diagrams/flowchart/parser/flow.jison b/_submodules/mermaid/src/diagrams/flowchart/parser/flow.jison
new file mode 100644
index 0000000000000000000000000000000000000000..0bbb4281eafe0d5cf53a1b1f842e11d9acd455b1
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/flowchart/parser/flow.jison
@@ -0,0 +1,452 @@
+/** mermaid
+ *  https://mermaidjs.github.io/
+ *  (c) 2015 Knut Sveidqvist
+ *  MIT license.
+ */
+
+/* lexical grammar */
+%lex
+%x string
+
+%%
+\%\%[^\n]*            /* do nothing */
+["]                     this.begin("string");
+<string>["]             this.popState();
+<string>[^"]*           return "STR";
+"style"               return 'STYLE';
+"default"             return 'DEFAULT';
+"linkStyle"           return 'LINKSTYLE';
+"interpolate"         return 'INTERPOLATE';
+"classDef"            return 'CLASSDEF';
+"class"               return 'CLASS';
+"click"               return 'CLICK';
+"graph"               return 'GRAPH';
+"subgraph"            return 'subgraph';
+"end"\b\s*            return 'end';
+"LR"                  return 'DIR';
+"RL"                  return 'DIR';
+"TB"                  return 'DIR';
+"BT"                  return 'DIR';
+"TD"                  return 'DIR';
+"BR"                  return 'DIR';
+[0-9]+                 return 'NUM';
+\#                    return 'BRKT';
+":"                   return 'COLON';
+";"                   return 'SEMI';
+","                   return 'COMMA';
+"*"                   return 'MULT';
+"<"                   return 'TAGSTART';
+">"                   return 'TAGEND';
+"^"                   return 'UP';
+"v"                   return 'DOWN';
+\s*\-\-[x]\s*            return 'ARROW_CROSS';
+\s*\-\-\>\s*             return 'ARROW_POINT';
+\s*\-\-[o]\s*            return 'ARROW_CIRCLE';
+\s*\-\-\-\s*             return 'ARROW_OPEN';
+\s*\-\.\-[x]\s*          return 'DOTTED_ARROW_CROSS';
+\s*\-\.\-\>\s*           return 'DOTTED_ARROW_POINT';
+\s*\-\.\-[o]\s*          return 'DOTTED_ARROW_CIRCLE';
+\s*\-\.\-\s*             return 'DOTTED_ARROW_OPEN';
+\s*.\-[x]\s*             return 'DOTTED_ARROW_CROSS';
+\s*\.\-\>\s*             return 'DOTTED_ARROW_POINT';
+\s*\.\-[o]\s*            return 'DOTTED_ARROW_CIRCLE';
+\s*\.\-\s*               return 'DOTTED_ARROW_OPEN';
+\s*\=\=[x]\s*            return 'THICK_ARROW_CROSS';
+\s*\=\=\>\s*             return 'THICK_ARROW_POINT';
+\s*\=\=[o]\s*            return 'THICK_ARROW_CIRCLE';
+\s*\=\=[\=]\s*           return 'THICK_ARROW_OPEN';
+\s*\-\-\s*               return '--';
+\s*\-\.\s*               return '-.';
+\s*\=\=\s*               return '==';
+"(-"                  return '(-';
+"-)"                  return '-)';
+\-                    return 'MINUS';
+"."                   return 'DOT';
+\+                    return 'PLUS';
+\%                    return 'PCT';
+"="                   return 'EQUALS';
+\=                    return 'EQUALS';
+[A-Za-z]+             return 'ALPHA';
+[!"#$%&'*+,-.`?\\_/]  return 'PUNCTUATION';
+[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|
+[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|
+[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|
+[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|
+[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|
+[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|
+[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|
+[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|
+[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|
+[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|
+[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|
+[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|
+[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|
+[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|
+[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|
+[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|
+[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|
+[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|
+[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|
+[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|
+[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|
+[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|
+[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|
+[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|
+[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|
+[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|
+[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|
+[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|
+[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|
+[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|
+[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|
+[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|
+[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|
+[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|
+[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|
+[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|
+[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|
+[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|
+[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|
+[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|
+[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|
+[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|
+[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|
+[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|
+[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|
+[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|
+[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|
+[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|
+[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|
+[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|
+[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|
+[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|
+[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|
+[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|
+[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|
+[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|
+[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|
+[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|
+[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|
+[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|
+[\uFFD2-\uFFD7\uFFDA-\uFFDC]
+                      return 'UNICODE_TEXT';
+"|"                   return 'PIPE';
+"("                   return 'PS';
+")"                   return 'PE';
+"["                   return 'SQS';
+"]"                   return 'SQE';
+"{"                   return 'DIAMOND_START'
+"}"                   return 'DIAMOND_STOP'
+"\""                  return 'QUOTE';
+\n+                   return 'NEWLINE';
+\s                    return 'SPACE';
+<<EOF>>               return 'EOF';
+
+/lex
+
+/* operator associations and precedence */
+
+%left '^'
+
+%start mermaidDoc
+
+%% /* language grammar */
+
+mermaidDoc: graphConfig document;
+
+document
+	: /* empty */
+	{ $$ = [];}
+	| document line
+	{
+	    if($2 !== []){
+	        $1.push($2);
+	    }
+	    $$=$1;}
+	;
+
+line
+	: statement
+	{$$=$1;}
+	| SEMI
+	| NEWLINE
+	| SPACE
+	| EOF
+	;
+
+graphConfig
+    : SPACE graphConfig
+    | NEWLINE graphConfig
+    | GRAPH SPACE DIR FirstStmtSeperator
+        { yy.setDirection($3);$$ = $3;}
+    | GRAPH SPACE TAGEND FirstStmtSeperator
+        { yy.setDirection("LR");$$ = $3;}
+    | GRAPH SPACE TAGSTART FirstStmtSeperator
+        { yy.setDirection("RL");$$ = $3;}
+    | GRAPH SPACE UP FirstStmtSeperator
+        { yy.setDirection("BT");$$ = $3;}
+    | GRAPH SPACE DOWN FirstStmtSeperator
+        { yy.setDirection("TB");$$ = $3;}
+    ;
+
+ending: endToken ending
+      | endToken
+      ;
+
+endToken: NEWLINE | SPACE | EOF;
+
+FirstStmtSeperator
+    : SEMI | NEWLINE | spaceList NEWLINE ;
+
+
+spaceListNewline
+    : SPACE spaceListNewline
+    | NEWLINE spaceListNewline
+    | NEWLINE
+    | SPACE
+    ;
+
+
+spaceList
+    : SPACE spaceList
+    | SPACE
+    ;
+
+statement
+    : verticeStatement separator
+    {$$=$1}
+    | styleStatement separator
+    {$$=[];}
+    | linkStyleStatement separator
+    {$$=[];}
+    | classDefStatement separator
+    {$$=[];}
+    | classStatement separator
+    {$$=[];}
+    | clickStatement separator
+    {$$=[];}
+    | subgraph text separator document end
+    {$$=yy.addSubGraph($4,$2);}
+    | subgraph separator document end
+    {$$=yy.addSubGraph($3,undefined);}
+    ;
+
+separator: NEWLINE | SEMI | EOF ;
+
+verticeStatement:
+     vertex link vertex
+        { yy.addLink($1,$3,$2);$$ = [$1,$3];}
+     | vertex
+        {$$ = [$1];}
+    ;
+
+vertex:  alphaNum SQS text SQE
+        {$$ = $1;yy.addVertex($1,$3,'square');}
+    |  alphaNum SQS text SQE spaceList
+        {$$ = $1;yy.addVertex($1,$3,'square');}
+    | alphaNum PS PS text PE PE
+        {$$ = $1;yy.addVertex($1,$4,'circle');}
+    | alphaNum PS PS text PE PE spaceList
+        {$$ = $1;yy.addVertex($1,$4,'circle');}
+    | alphaNum '(-' text '-)'
+        {$$ = $1;yy.addVertex($1,$3,'ellipse');}
+    | alphaNum '(-' text '-)' spaceList
+        {$$ = $1;yy.addVertex($1,$3,'ellipse');}
+    | alphaNum PS text PE
+        {$$ = $1;yy.addVertex($1,$3,'round');}
+    | alphaNum PS text PE spaceList
+        {$$ = $1;yy.addVertex($1,$3,'round');}
+    | alphaNum DIAMOND_START text DIAMOND_STOP
+        {$$ = $1;yy.addVertex($1,$3,'diamond');}
+    | alphaNum DIAMOND_START text DIAMOND_STOP spaceList
+        {$$ = $1;yy.addVertex($1,$3,'diamond');}
+    | alphaNum TAGEND text SQE
+        {$$ = $1;yy.addVertex($1,$3,'odd');}
+    | alphaNum TAGEND text SQE spaceList
+        {$$ = $1;yy.addVertex($1,$3,'odd');}
+/*  | alphaNum SQS text TAGSTART
+        {$$ = $1;yy.addVertex($1,$3,'odd_right');}
+    | alphaNum SQS text TAGSTART spaceList
+        {$$ = $1;yy.addVertex($1,$3,'odd_right');} */
+    | alphaNum
+        {$$ = $1;yy.addVertex($1);}
+    | alphaNum spaceList
+        {$$ = $1;yy.addVertex($1);}
+    ;
+
+alphaNum
+    : alphaNumStatement
+    {$$=$1;}
+    | alphaNum alphaNumStatement
+    {$$=$1+''+$2;}
+    ;
+
+alphaNumStatement
+    : DIR
+        {$$=$1;}
+    | alphaNumToken
+        {$$=$1;}
+    | DOWN
+        {$$='v';}
+    | MINUS
+        {$$='-';}
+    ;
+
+link: linkStatement arrowText
+    {$1.text = $2;$$ = $1;}
+    | linkStatement TESTSTR SPACE
+    {$1.text = $2;$$ = $1;}
+    | linkStatement arrowText SPACE
+    {$1.text = $2;$$ = $1;}
+    | linkStatement
+    {$$ = $1;}
+    | '--' text ARROW_POINT
+        {$$ = {"type":"arrow","stroke":"normal","text":$2};}
+    | '--' text ARROW_CIRCLE
+        {$$ = {"type":"arrow_circle","stroke":"normal","text":$2};}
+    | '--' text ARROW_CROSS
+        {$$ = {"type":"arrow_cross","stroke":"normal","text":$2};}
+    | '--' text ARROW_OPEN
+        {$$ = {"type":"arrow_open","stroke":"normal","text":$2};}
+    | '-.' text DOTTED_ARROW_POINT
+        {$$ = {"type":"arrow","stroke":"dotted","text":$2};}
+    | '-.' text DOTTED_ARROW_CIRCLE
+        {$$ = {"type":"arrow_circle","stroke":"dotted","text":$2};}
+    | '-.' text DOTTED_ARROW_CROSS
+        {$$ = {"type":"arrow_cross","stroke":"dotted","text":$2};}
+    | '-.' text DOTTED_ARROW_OPEN
+        {$$ = {"type":"arrow_open","stroke":"dotted","text":$2};}
+    | '==' text THICK_ARROW_POINT
+        {$$ = {"type":"arrow","stroke":"thick","text":$2};}
+    | '==' text THICK_ARROW_CIRCLE
+        {$$ = {"type":"arrow_circle","stroke":"thick","text":$2};}
+    | '==' text THICK_ARROW_CROSS
+        {$$ = {"type":"arrow_cross","stroke":"thick","text":$2};}
+    | '==' text THICK_ARROW_OPEN
+        {$$ = {"type":"arrow_open","stroke":"thick","text":$2};}
+    ;
+
+linkStatement: ARROW_POINT
+        {$$ = {"type":"arrow","stroke":"normal"};}
+    | ARROW_CIRCLE
+        {$$ = {"type":"arrow_circle","stroke":"normal"};}
+    | ARROW_CROSS
+        {$$ = {"type":"arrow_cross","stroke":"normal"};}
+    | ARROW_OPEN
+        {$$ = {"type":"arrow_open","stroke":"normal"};}
+    | DOTTED_ARROW_POINT
+        {$$ = {"type":"arrow","stroke":"dotted"};}
+    | DOTTED_ARROW_CIRCLE
+        {$$ = {"type":"arrow_circle","stroke":"dotted"};}
+    | DOTTED_ARROW_CROSS
+        {$$ = {"type":"arrow_cross","stroke":"dotted"};}
+    | DOTTED_ARROW_OPEN
+        {$$ = {"type":"arrow_open","stroke":"dotted"};}
+    | THICK_ARROW_POINT
+        {$$ = {"type":"arrow","stroke":"thick"};}
+    | THICK_ARROW_CIRCLE
+        {$$ = {"type":"arrow_circle","stroke":"thick"};}
+    | THICK_ARROW_CROSS
+        {$$ = {"type":"arrow_cross","stroke":"thick"};}
+    | THICK_ARROW_OPEN
+        {$$ = {"type":"arrow_open","stroke":"thick"};}
+        ;
+
+arrowText:
+    PIPE text PIPE
+    {$$ = $2;}
+    ;
+
+text: textToken
+    {$$=$1;}
+    | text textToken
+    {$$=$1+''+$2;}
+    | STR
+    {$$=$1;}
+    ;
+
+
+
+commentText: commentToken
+    {$$=$1;}
+    | commentText commentToken
+    {$$=$1+''+$2;}
+    ;
+
+
+keywords
+    : STYLE | LINKSTYLE | CLASSDEF | CLASS | CLICK | GRAPH | DIR | subgraph | end | DOWN | UP;
+
+
+textNoTags: textNoTagsToken
+    {$$=$1;}
+    | textNoTags textNoTagsToken
+    {$$=$1+''+$2;}
+    ;
+
+
+classDefStatement:CLASSDEF SPACE DEFAULT SPACE stylesOpt
+    {$$ = $1;yy.addClass($3,$5);}
+    | CLASSDEF SPACE alphaNum SPACE stylesOpt
+          {$$ = $1;yy.addClass($3,$5);}
+    ;
+
+classStatement:CLASS SPACE alphaNum SPACE alphaNum
+    {$$ = $1;yy.setClass($3, $5);}
+    ;
+
+clickStatement
+    : CLICK SPACE alphaNum SPACE alphaNum           {$$ = $1;yy.setClickEvent($3,        $5, undefined, undefined);}
+    | CLICK SPACE alphaNum SPACE alphaNum SPACE STR {$$ = $1;yy.setClickEvent($3,        $5, undefined, $7)       ;}
+    | CLICK SPACE alphaNum SPACE STR                {$$ = $1;yy.setClickEvent($3, undefined,        $5, undefined);}
+    | CLICK SPACE alphaNum SPACE STR SPACE STR      {$$ = $1;yy.setClickEvent($3, undefined,        $5, $7       );}
+    ;
+
+styleStatement:STYLE SPACE alphaNum SPACE stylesOpt
+    {$$ = $1;yy.addVertex($3,undefined,undefined,$5);}
+    | STYLE SPACE HEX SPACE stylesOpt
+          {$$ = $1;yy.updateLink($3,$5);}
+    ;
+
+linkStyleStatement
+    : LINKSTYLE SPACE DEFAULT SPACE stylesOpt
+          {$$ = $1;yy.updateLink($3,$5);}
+    | LINKSTYLE SPACE NUM SPACE stylesOpt
+          {$$ = $1;yy.updateLink($3,$5);}
+    | LINKSTYLE SPACE DEFAULT SPACE INTERPOLATE SPACE alphaNum SPACE stylesOpt
+          {$$ = $1;yy.updateLinkInterpolate($3,$7);yy.updateLink($3,$9);}
+    | LINKSTYLE SPACE NUM SPACE INTERPOLATE SPACE alphaNum SPACE stylesOpt
+          {$$ = $1;yy.updateLinkInterpolate($3,$7);yy.updateLink($3,$9);}
+    | LINKSTYLE SPACE DEFAULT SPACE INTERPOLATE SPACE alphaNum
+          {$$ = $1;yy.updateLinkInterpolate($3,$7);}
+    | LINKSTYLE SPACE NUM SPACE INTERPOLATE SPACE alphaNum
+          {$$ = $1;yy.updateLinkInterpolate($3,$7);}
+    ;
+
+commentStatement: PCT PCT commentText;
+
+stylesOpt: style
+        {$$ = [$1]}
+    | stylesOpt COMMA style
+        {$1.push($3);$$ = $1;}
+    ;
+
+style: styleComponent
+    |style styleComponent
+    {$$ = $1 + $2;}
+    ;
+
+styleComponent: ALPHA | COLON | MINUS | NUM | UNIT | SPACE | HEX | BRKT | DOT | STYLE | PCT ;
+
+/* Token lists */
+
+commentToken   : textToken | graphCodeTokens ;
+
+textToken      : textNoTagsToken | TAGSTART | TAGEND | '=='  | '--' | PCT | DEFAULT;
+
+textNoTagsToken: alphaNumToken | SPACE | MINUS | keywords ;
+
+alphaNumToken  : ALPHA | PUNCTUATION | UNICODE_TEXT | NUM | COLON | COMMA | PLUS | EQUALS | MULT | DOT | BRKT ;
+
+graphCodeTokens:  PIPE | PS | PE | SQS | SQE | DIAMOND_START | DIAMOND_STOP | TAG_START | TAG_END | ARROW_CROSS | ARROW_POINT | ARROW_CIRCLE | ARROW_OPEN | QUOTE | SEMI ;
+%%
diff --git a/_submodules/mermaid/src/diagrams/flowchart/parser/flow.js b/_submodules/mermaid/src/diagrams/flowchart/parser/flow.js
new file mode 100644
index 0000000000000000000000000000000000000000..f45c6fd71d64f1a4567f1f0c4ffd65c44331166f
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/flowchart/parser/flow.js
@@ -0,0 +1,961 @@
+/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,4],$V1=[1,3],$V2=[1,5],$V3=[1,8,9,10,11,13,18,30,46,71,72,73,74,75,81,86,88,89,91,92,94,95,96,97,98],$V4=[2,2],$V5=[1,12],$V6=[1,13],$V7=[1,14],$V8=[1,15],$V9=[1,31],$Va=[1,33],$Vb=[1,22],$Vc=[1,34],$Vd=[1,24],$Ve=[1,25],$Vf=[1,26],$Vg=[1,27],$Vh=[1,28],$Vi=[1,38],$Vj=[1,40],$Vk=[1,35],$Vl=[1,39],$Vm=[1,45],$Vn=[1,44],$Vo=[1,36],$Vp=[1,37],$Vq=[1,41],$Vr=[1,42],$Vs=[1,43],$Vt=[1,8,9,10,11,13,18,30,32,46,71,72,73,74,75,81,86,88,89,91,92,94,95,96,97,98],$Vu=[1,53],$Vv=[1,52],$Vw=[1,54],$Vx=[1,72],$Vy=[1,80],$Vz=[1,81],$VA=[1,66],$VB=[1,65],$VC=[1,85],$VD=[1,84],$VE=[1,82],$VF=[1,83],$VG=[1,73],$VH=[1,68],$VI=[1,67],$VJ=[1,63],$VK=[1,75],$VL=[1,76],$VM=[1,77],$VN=[1,78],$VO=[1,79],$VP=[1,70],$VQ=[1,69],$VR=[8,9,11],$VS=[8,9,11,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64],$VT=[1,115],$VU=[8,9,10,11,13,15,18,36,38,40,42,46,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,86,88,89,91,92,94,95,96,97,98],$VV=[8,9,10,11,12,13,15,16,17,18,30,32,36,37,38,39,40,41,42,43,46,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,71,72,73,74,75,78,81,84,86,88,89,91,92,94,95,96,97,98],$VW=[1,117],$VX=[1,118],$VY=[8,9,10,11,13,18,30,32,46,71,72,73,74,75,81,86,88,89,91,92,94,95,96,97,98],$VZ=[8,9,10,11,12,13,15,16,17,18,30,32,37,39,41,43,46,50,51,52,53,54,56,57,58,59,60,61,62,63,64,65,71,72,73,74,75,78,81,84,86,88,89,91,92,94,95,96,97,98],$V_=[13,18,46,81,86,88,89,91,92,94,95,96,97,98],$V$=[13,18,46,49,65,81,86,88,89,91,92,94,95,96,97,98],$V01=[1,191],$V11=[1,188],$V21=[1,195],$V31=[1,192],$V41=[1,189],$V51=[1,196],$V61=[1,186],$V71=[1,187],$V81=[1,190],$V91=[1,193],$Va1=[1,194],$Vb1=[1,213],$Vc1=[8,9,11,86],$Vd1=[8,9,10,11,46,71,80,81,84,86,88,89,90,91,92];
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"mermaidDoc":3,"graphConfig":4,"document":5,"line":6,"statement":7,"SEMI":8,"NEWLINE":9,"SPACE":10,"EOF":11,"GRAPH":12,"DIR":13,"FirstStmtSeperator":14,"TAGEND":15,"TAGSTART":16,"UP":17,"DOWN":18,"ending":19,"endToken":20,"spaceList":21,"spaceListNewline":22,"verticeStatement":23,"separator":24,"styleStatement":25,"linkStyleStatement":26,"classDefStatement":27,"classStatement":28,"clickStatement":29,"subgraph":30,"text":31,"end":32,"vertex":33,"link":34,"alphaNum":35,"SQS":36,"SQE":37,"PS":38,"PE":39,"(-":40,"-)":41,"DIAMOND_START":42,"DIAMOND_STOP":43,"alphaNumStatement":44,"alphaNumToken":45,"MINUS":46,"linkStatement":47,"arrowText":48,"TESTSTR":49,"--":50,"ARROW_POINT":51,"ARROW_CIRCLE":52,"ARROW_CROSS":53,"ARROW_OPEN":54,"-.":55,"DOTTED_ARROW_POINT":56,"DOTTED_ARROW_CIRCLE":57,"DOTTED_ARROW_CROSS":58,"DOTTED_ARROW_OPEN":59,"==":60,"THICK_ARROW_POINT":61,"THICK_ARROW_CIRCLE":62,"THICK_ARROW_CROSS":63,"THICK_ARROW_OPEN":64,"PIPE":65,"textToken":66,"STR":67,"commentText":68,"commentToken":69,"keywords":70,"STYLE":71,"LINKSTYLE":72,"CLASSDEF":73,"CLASS":74,"CLICK":75,"textNoTags":76,"textNoTagsToken":77,"DEFAULT":78,"stylesOpt":79,"HEX":80,"NUM":81,"INTERPOLATE":82,"commentStatement":83,"PCT":84,"style":85,"COMMA":86,"styleComponent":87,"ALPHA":88,"COLON":89,"UNIT":90,"BRKT":91,"DOT":92,"graphCodeTokens":93,"PUNCTUATION":94,"UNICODE_TEXT":95,"PLUS":96,"EQUALS":97,"MULT":98,"TAG_START":99,"TAG_END":100,"QUOTE":101,"$accept":0,"$end":1},
+terminals_: {2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"DIR",15:"TAGEND",16:"TAGSTART",17:"UP",18:"DOWN",30:"subgraph",32:"end",36:"SQS",37:"SQE",38:"PS",39:"PE",40:"(-",41:"-)",42:"DIAMOND_START",43:"DIAMOND_STOP",46:"MINUS",49:"TESTSTR",50:"--",51:"ARROW_POINT",52:"ARROW_CIRCLE",53:"ARROW_CROSS",54:"ARROW_OPEN",55:"-.",56:"DOTTED_ARROW_POINT",57:"DOTTED_ARROW_CIRCLE",58:"DOTTED_ARROW_CROSS",59:"DOTTED_ARROW_OPEN",60:"==",61:"THICK_ARROW_POINT",62:"THICK_ARROW_CIRCLE",63:"THICK_ARROW_CROSS",64:"THICK_ARROW_OPEN",65:"PIPE",67:"STR",71:"STYLE",72:"LINKSTYLE",73:"CLASSDEF",74:"CLASS",75:"CLICK",78:"DEFAULT",80:"HEX",81:"NUM",82:"INTERPOLATE",84:"PCT",86:"COMMA",88:"ALPHA",89:"COLON",90:"UNIT",91:"BRKT",92:"DOT",94:"PUNCTUATION",95:"UNICODE_TEXT",96:"PLUS",97:"EQUALS",98:"MULT",99:"TAG_START",100:"TAG_END",101:"QUOTE"},
+productions_: [0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,4],[4,4],[4,4],[4,4],[4,4],[19,2],[19,1],[20,1],[20,1],[20,1],[14,1],[14,1],[14,2],[22,2],[22,2],[22,1],[22,1],[21,2],[21,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,5],[7,4],[24,1],[24,1],[24,1],[23,3],[23,1],[33,4],[33,5],[33,6],[33,7],[33,4],[33,5],[33,4],[33,5],[33,4],[33,5],[33,4],[33,5],[33,1],[33,2],[35,1],[35,2],[44,1],[44,1],[44,1],[44,1],[34,2],[34,3],[34,3],[34,1],[34,3],[34,3],[34,3],[34,3],[34,3],[34,3],[34,3],[34,3],[34,3],[34,3],[34,3],[34,3],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[47,1],[48,3],[31,1],[31,2],[31,1],[68,1],[68,2],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[70,1],[76,1],[76,2],[27,5],[27,5],[28,5],[29,5],[29,7],[29,5],[29,7],[25,5],[25,5],[26,5],[26,5],[26,9],[26,9],[26,7],[26,7],[83,3],[79,1],[79,3],[85,1],[85,2],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[87,1],[69,1],[69,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[66,1],[77,1],[77,1],[77,1],[77,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1],[93,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 2:
+ this.$ = [];
+break;
+case 3:
+
+	    if($$[$0] !== []){
+	        $$[$0-1].push($$[$0]);
+	    }
+	    this.$=$$[$0-1];
+break;
+case 4: case 57: case 59: case 60: case 92: case 94: case 95: case 108:
+this.$=$$[$0];
+break;
+case 11:
+ yy.setDirection($$[$0-1]);this.$ = $$[$0-1];
+break;
+case 12:
+ yy.setDirection("LR");this.$ = $$[$0-1];
+break;
+case 13:
+ yy.setDirection("RL");this.$ = $$[$0-1];
+break;
+case 14:
+ yy.setDirection("BT");this.$ = $$[$0-1];
+break;
+case 15:
+ yy.setDirection("TB");this.$ = $$[$0-1];
+break;
+case 30:
+this.$=$$[$0-1]
+break;
+case 31: case 32: case 33: case 34: case 35:
+this.$=[];
+break;
+case 36:
+this.$=yy.addSubGraph($$[$0-1],$$[$0-3]);
+break;
+case 37:
+this.$=yy.addSubGraph($$[$0-1],undefined);
+break;
+case 41:
+ yy.addLink($$[$0-2],$$[$0],$$[$0-1]);this.$ = [$$[$0-2],$$[$0]];
+break;
+case 42:
+this.$ = [$$[$0]];
+break;
+case 43:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'square');
+break;
+case 44:
+this.$ = $$[$0-4];yy.addVertex($$[$0-4],$$[$0-2],'square');
+break;
+case 45:
+this.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'circle');
+break;
+case 46:
+this.$ = $$[$0-6];yy.addVertex($$[$0-6],$$[$0-3],'circle');
+break;
+case 47:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'ellipse');
+break;
+case 48:
+this.$ = $$[$0-4];yy.addVertex($$[$0-4],$$[$0-2],'ellipse');
+break;
+case 49:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'round');
+break;
+case 50:
+this.$ = $$[$0-4];yy.addVertex($$[$0-4],$$[$0-2],'round');
+break;
+case 51:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'diamond');
+break;
+case 52:
+this.$ = $$[$0-4];yy.addVertex($$[$0-4],$$[$0-2],'diamond');
+break;
+case 53:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'odd');
+break;
+case 54:
+this.$ = $$[$0-4];yy.addVertex($$[$0-4],$$[$0-2],'odd');
+break;
+case 55:
+this.$ = $$[$0];yy.addVertex($$[$0]);
+break;
+case 56:
+this.$ = $$[$0-1];yy.addVertex($$[$0-1]);
+break;
+case 58: case 93: case 96: case 109:
+this.$=$$[$0-1]+''+$$[$0];
+break;
+case 61:
+this.$='v';
+break;
+case 62:
+this.$='-';
+break;
+case 63:
+$$[$0-1].text = $$[$0];this.$ = $$[$0-1];
+break;
+case 64: case 65:
+$$[$0-2].text = $$[$0-1];this.$ = $$[$0-2];
+break;
+case 66:
+this.$ = $$[$0];
+break;
+case 67:
+this.$ = {"type":"arrow","stroke":"normal","text":$$[$0-1]};
+break;
+case 68:
+this.$ = {"type":"arrow_circle","stroke":"normal","text":$$[$0-1]};
+break;
+case 69:
+this.$ = {"type":"arrow_cross","stroke":"normal","text":$$[$0-1]};
+break;
+case 70:
+this.$ = {"type":"arrow_open","stroke":"normal","text":$$[$0-1]};
+break;
+case 71:
+this.$ = {"type":"arrow","stroke":"dotted","text":$$[$0-1]};
+break;
+case 72:
+this.$ = {"type":"arrow_circle","stroke":"dotted","text":$$[$0-1]};
+break;
+case 73:
+this.$ = {"type":"arrow_cross","stroke":"dotted","text":$$[$0-1]};
+break;
+case 74:
+this.$ = {"type":"arrow_open","stroke":"dotted","text":$$[$0-1]};
+break;
+case 75:
+this.$ = {"type":"arrow","stroke":"thick","text":$$[$0-1]};
+break;
+case 76:
+this.$ = {"type":"arrow_circle","stroke":"thick","text":$$[$0-1]};
+break;
+case 77:
+this.$ = {"type":"arrow_cross","stroke":"thick","text":$$[$0-1]};
+break;
+case 78:
+this.$ = {"type":"arrow_open","stroke":"thick","text":$$[$0-1]};
+break;
+case 79:
+this.$ = {"type":"arrow","stroke":"normal"};
+break;
+case 80:
+this.$ = {"type":"arrow_circle","stroke":"normal"};
+break;
+case 81:
+this.$ = {"type":"arrow_cross","stroke":"normal"};
+break;
+case 82:
+this.$ = {"type":"arrow_open","stroke":"normal"};
+break;
+case 83:
+this.$ = {"type":"arrow","stroke":"dotted"};
+break;
+case 84:
+this.$ = {"type":"arrow_circle","stroke":"dotted"};
+break;
+case 85:
+this.$ = {"type":"arrow_cross","stroke":"dotted"};
+break;
+case 86:
+this.$ = {"type":"arrow_open","stroke":"dotted"};
+break;
+case 87:
+this.$ = {"type":"arrow","stroke":"thick"};
+break;
+case 88:
+this.$ = {"type":"arrow_circle","stroke":"thick"};
+break;
+case 89:
+this.$ = {"type":"arrow_cross","stroke":"thick"};
+break;
+case 90:
+this.$ = {"type":"arrow_open","stroke":"thick"};
+break;
+case 91:
+this.$ = $$[$0-1];
+break;
+case 110: case 111:
+this.$ = $$[$0-4];yy.addClass($$[$0-2],$$[$0]);
+break;
+case 112:
+this.$ = $$[$0-4];yy.setClass($$[$0-2], $$[$0]);
+break;
+case 113:
+this.$ = $$[$0-4];yy.setClickEvent($$[$0-2],        $$[$0], undefined, undefined);
+break;
+case 114:
+this.$ = $$[$0-6];yy.setClickEvent($$[$0-4],        $$[$0-2], undefined, $$[$0])       ;
+break;
+case 115:
+this.$ = $$[$0-4];yy.setClickEvent($$[$0-2], undefined,        $$[$0], undefined);
+break;
+case 116:
+this.$ = $$[$0-6];yy.setClickEvent($$[$0-4], undefined,        $$[$0-2], $$[$0]       );
+break;
+case 117:
+this.$ = $$[$0-4];yy.addVertex($$[$0-2],undefined,undefined,$$[$0]);
+break;
+case 118: case 119: case 120:
+this.$ = $$[$0-4];yy.updateLink($$[$0-2],$$[$0]);
+break;
+case 121: case 122:
+this.$ = $$[$0-8];yy.updateLinkInterpolate($$[$0-6],$$[$0-2]);yy.updateLink($$[$0-6],$$[$0]);
+break;
+case 123: case 124:
+this.$ = $$[$0-6];yy.updateLinkInterpolate($$[$0-4],$$[$0]);
+break;
+case 126:
+this.$ = [$$[$0]]
+break;
+case 127:
+$$[$0-2].push($$[$0]);this.$ = $$[$0-2];
+break;
+case 129:
+this.$ = $$[$0-1] + $$[$0];
+break;
+}
+},
+table: [{3:1,4:2,9:$V0,10:$V1,12:$V2},{1:[3]},o($V3,$V4,{5:6}),{4:7,9:$V0,10:$V1,12:$V2},{4:8,9:$V0,10:$V1,12:$V2},{10:[1,9]},{1:[2,1],6:10,7:11,8:$V5,9:$V6,10:$V7,11:$V8,13:$V9,18:$Va,23:16,25:17,26:18,27:19,28:20,29:21,30:$Vb,33:23,35:29,44:30,45:32,46:$Vc,71:$Vd,72:$Ve,73:$Vf,74:$Vg,75:$Vh,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($V3,[2,9]),o($V3,[2,10]),{13:[1,46],15:[1,47],16:[1,48],17:[1,49],18:[1,50]},o($Vt,[2,3]),o($Vt,[2,4]),o($Vt,[2,5]),o($Vt,[2,6]),o($Vt,[2,7]),o($Vt,[2,8]),{8:$Vu,9:$Vv,11:$Vw,24:51},{8:$Vu,9:$Vv,11:$Vw,24:55},{8:$Vu,9:$Vv,11:$Vw,24:56},{8:$Vu,9:$Vv,11:$Vw,24:57},{8:$Vu,9:$Vv,11:$Vw,24:58},{8:$Vu,9:$Vv,11:$Vw,24:59},{8:$Vu,9:$Vv,10:$Vx,11:$Vw,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,24:61,30:$VE,31:60,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($VR,[2,42],{34:86,47:87,50:[1,88],51:[1,91],52:[1,92],53:[1,93],54:[1,94],55:[1,89],56:[1,95],57:[1,96],58:[1,97],59:[1,98],60:[1,90],61:[1,99],62:[1,100],63:[1,101],64:[1,102]}),{10:[1,103]},{10:[1,104]},{10:[1,105]},{10:[1,106]},{10:[1,107]},o($VS,[2,55],{45:32,21:113,44:114,10:$VT,13:$V9,15:[1,112],18:$Va,36:[1,108],38:[1,109],40:[1,110],42:[1,111],46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs}),o($VU,[2,57]),o($VU,[2,59]),o($VU,[2,60]),o($VU,[2,61]),o($VU,[2,62]),o($VV,[2,154]),o($VV,[2,155]),o($VV,[2,156]),o($VV,[2,157]),o($VV,[2,158]),o($VV,[2,159]),o($VV,[2,160]),o($VV,[2,161]),o($VV,[2,162]),o($VV,[2,163]),o($VV,[2,164]),{8:$VW,9:$VX,10:$VT,14:116,21:119},{8:$VW,9:$VX,10:$VT,14:120,21:119},{8:$VW,9:$VX,10:$VT,14:121,21:119},{8:$VW,9:$VX,10:$VT,14:122,21:119},{8:$VW,9:$VX,10:$VT,14:123,21:119},o($Vt,[2,30]),o($Vt,[2,38]),o($Vt,[2,39]),o($Vt,[2,40]),o($Vt,[2,31]),o($Vt,[2,32]),o($Vt,[2,33]),o($Vt,[2,34]),o($Vt,[2,35]),{8:$Vu,9:$Vv,10:$Vx,11:$Vw,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,24:124,30:$VE,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($VY,$V4,{5:126}),o($VZ,[2,92]),o($VZ,[2,94]),o($VZ,[2,143]),o($VZ,[2,144]),o($VZ,[2,145]),o($VZ,[2,146]),o($VZ,[2,147]),o($VZ,[2,148]),o($VZ,[2,149]),o($VZ,[2,150]),o($VZ,[2,151]),o($VZ,[2,152]),o($VZ,[2,153]),o($VZ,[2,97]),o($VZ,[2,98]),o($VZ,[2,99]),o($VZ,[2,100]),o($VZ,[2,101]),o($VZ,[2,102]),o($VZ,[2,103]),o($VZ,[2,104]),o($VZ,[2,105]),o($VZ,[2,106]),o($VZ,[2,107]),{13:$V9,18:$Va,33:127,35:29,44:30,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($V_,[2,66],{48:128,49:[1,129],65:[1,130]}),{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:131,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:132,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:133,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($V$,[2,79]),o($V$,[2,80]),o($V$,[2,81]),o($V$,[2,82]),o($V$,[2,83]),o($V$,[2,84]),o($V$,[2,85]),o($V$,[2,86]),o($V$,[2,87]),o($V$,[2,88]),o($V$,[2,89]),o($V$,[2,90]),{13:$V9,18:$Va,35:134,44:30,45:32,46:$Vc,80:[1,135],81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{78:[1,136],81:[1,137]},{13:$V9,18:$Va,35:139,44:30,45:32,46:$Vc,78:[1,138],81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{13:$V9,18:$Va,35:140,44:30,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{13:$V9,18:$Va,35:141,44:30,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:142,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:144,32:$VF,38:[1,143],45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:145,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:146,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:147,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($VS,[2,56]),o($VU,[2,58]),o($VS,[2,29],{21:148,10:$VT}),o($V3,[2,11]),o($V3,[2,21]),o($V3,[2,22]),{9:[1,149]},o($V3,[2,12]),o($V3,[2,13]),o($V3,[2,14]),o($V3,[2,15]),o($VY,$V4,{5:150}),o($VZ,[2,93]),{6:10,7:11,8:$V5,9:$V6,10:$V7,11:$V8,13:$V9,18:$Va,23:16,25:17,26:18,27:19,28:20,29:21,30:$Vb,32:[1,151],33:23,35:29,44:30,45:32,46:$Vc,71:$Vd,72:$Ve,73:$Vf,74:$Vg,75:$Vh,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($VR,[2,41]),o($V_,[2,63],{10:[1,152]}),{10:[1,153]},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:154,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,45:71,46:$VG,50:$VH,51:[1,155],52:[1,156],53:[1,157],54:[1,158],60:$VI,66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,45:71,46:$VG,50:$VH,56:[1,159],57:[1,160],58:[1,161],59:[1,162],60:$VI,66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,45:71,46:$VG,50:$VH,60:$VI,61:[1,163],62:[1,164],63:[1,165],64:[1,166],66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:[1,167],13:$V9,18:$Va,44:114,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:[1,168]},{10:[1,169]},{10:[1,170]},{10:[1,171]},{10:[1,172],13:$V9,18:$Va,44:114,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:[1,173],13:$V9,18:$Va,44:114,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:[1,174],13:$V9,18:$Va,44:114,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,37:[1,175],45:71,46:$VG,50:$VH,60:$VI,66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,31:176,32:$VF,45:71,46:$VG,50:$VH,60:$VI,66:62,67:$VJ,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,39:[1,177],45:71,46:$VG,50:$VH,60:$VI,66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,41:[1,178],45:71,46:$VG,50:$VH,60:$VI,66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,43:[1,179],45:71,46:$VG,50:$VH,60:$VI,66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,37:[1,180],45:71,46:$VG,50:$VH,60:$VI,66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($VS,[2,28]),o($V3,[2,23]),{6:10,7:11,8:$V5,9:$V6,10:$V7,11:$V8,13:$V9,18:$Va,23:16,25:17,26:18,27:19,28:20,29:21,30:$Vb,32:[1,181],33:23,35:29,44:30,45:32,46:$Vc,71:$Vd,72:$Ve,73:$Vf,74:$Vg,75:$Vh,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($Vt,[2,37]),o($V_,[2,65]),o($V_,[2,64]),{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,45:71,46:$VG,50:$VH,60:$VI,65:[1,182],66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($V_,[2,67]),o($V_,[2,68]),o($V_,[2,69]),o($V_,[2,70]),o($V_,[2,71]),o($V_,[2,72]),o($V_,[2,73]),o($V_,[2,74]),o($V_,[2,75]),o($V_,[2,76]),o($V_,[2,77]),o($V_,[2,78]),{10:$V01,46:$V11,71:$V21,79:183,80:$V31,81:$V41,84:$V51,85:184,87:185,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1},{10:$V01,46:$V11,71:$V21,79:197,80:$V31,81:$V41,84:$V51,85:184,87:185,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1},{10:$V01,46:$V11,71:$V21,79:198,80:$V31,81:$V41,82:[1,199],84:$V51,85:184,87:185,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1},{10:$V01,46:$V11,71:$V21,79:200,80:$V31,81:$V41,82:[1,201],84:$V51,85:184,87:185,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1},{10:$V01,46:$V11,71:$V21,79:202,80:$V31,81:$V41,84:$V51,85:184,87:185,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1},{10:$V01,46:$V11,71:$V21,79:203,80:$V31,81:$V41,84:$V51,85:184,87:185,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1},{13:$V9,18:$Va,35:204,44:30,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{13:$V9,18:$Va,35:205,44:30,45:32,46:$Vc,67:[1,206],81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($VS,[2,43],{21:207,10:$VT}),{10:$Vx,12:$Vy,13:$Vz,15:$VA,16:$VB,17:$VC,18:$VD,30:$VE,32:$VF,39:[1,208],45:71,46:$VG,50:$VH,60:$VI,66:125,70:74,71:$VK,72:$VL,73:$VM,74:$VN,75:$VO,77:64,78:$VP,81:$Vi,84:$VQ,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},o($VS,[2,49],{21:209,10:$VT}),o($VS,[2,47],{21:210,10:$VT}),o($VS,[2,51],{21:211,10:$VT}),o($VS,[2,53],{21:212,10:$VT}),o($Vt,[2,36]),o([10,13,18,46,81,86,88,89,91,92,94,95,96,97,98],[2,91]),o($VR,[2,117],{86:$Vb1}),o($Vc1,[2,126],{87:214,10:$V01,46:$V11,71:$V21,80:$V31,81:$V41,84:$V51,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1}),o($Vd1,[2,128]),o($Vd1,[2,130]),o($Vd1,[2,131]),o($Vd1,[2,132]),o($Vd1,[2,133]),o($Vd1,[2,134]),o($Vd1,[2,135]),o($Vd1,[2,136]),o($Vd1,[2,137]),o($Vd1,[2,138]),o($Vd1,[2,139]),o($Vd1,[2,140]),o($VR,[2,118],{86:$Vb1}),o($VR,[2,119],{86:$Vb1}),{10:[1,215]},o($VR,[2,120],{86:$Vb1}),{10:[1,216]},o($VR,[2,110],{86:$Vb1}),o($VR,[2,111],{86:$Vb1}),o($VR,[2,112],{45:32,44:114,13:$V9,18:$Va,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs}),o($VR,[2,113],{45:32,44:114,10:[1,217],13:$V9,18:$Va,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs}),o($VR,[2,115],{10:[1,218]}),o($VS,[2,44]),{39:[1,219]},o($VS,[2,50]),o($VS,[2,48]),o($VS,[2,52]),o($VS,[2,54]),{10:$V01,46:$V11,71:$V21,80:$V31,81:$V41,84:$V51,85:220,87:185,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1},o($Vd1,[2,129]),{13:$V9,18:$Va,35:221,44:30,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{13:$V9,18:$Va,35:222,44:30,45:32,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs},{67:[1,223]},{67:[1,224]},o($VS,[2,45],{21:225,10:$VT}),o($Vc1,[2,127],{87:214,10:$V01,46:$V11,71:$V21,80:$V31,81:$V41,84:$V51,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1}),o($VR,[2,123],{45:32,44:114,10:[1,226],13:$V9,18:$Va,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs}),o($VR,[2,124],{45:32,44:114,10:[1,227],13:$V9,18:$Va,46:$Vc,81:$Vi,86:$Vj,88:$Vk,89:$Vl,91:$Vm,92:$Vn,94:$Vo,95:$Vp,96:$Vq,97:$Vr,98:$Vs}),o($VR,[2,114]),o($VR,[2,116]),o($VS,[2,46]),{10:$V01,46:$V11,71:$V21,79:228,80:$V31,81:$V41,84:$V51,85:184,87:185,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1},{10:$V01,46:$V11,71:$V21,79:229,80:$V31,81:$V41,84:$V51,85:184,87:185,88:$V61,89:$V71,90:$V81,91:$V91,92:$Va1},o($VR,[2,121],{86:$Vb1}),o($VR,[2,122],{86:$Vb1})],
+defaultActions: {},
+parseError: function parseError(str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function (match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex() {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin(condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState() {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules() {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState(n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState(condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:/* do nothing */
+break;
+case 1:this.begin("string");
+break;
+case 2:this.popState();
+break;
+case 3:return "STR";
+break;
+case 4:return 71;
+break;
+case 5:return 78;
+break;
+case 6:return 72;
+break;
+case 7:return 82;
+break;
+case 8:return 73;
+break;
+case 9:return 74;
+break;
+case 10:return 75;
+break;
+case 11:return 12;
+break;
+case 12:return 30;
+break;
+case 13:return 32;
+break;
+case 14:return 13;
+break;
+case 15:return 13;
+break;
+case 16:return 13;
+break;
+case 17:return 13;
+break;
+case 18:return 13;
+break;
+case 19:return 13;
+break;
+case 20:return 81;
+break;
+case 21:return 91;
+break;
+case 22:return 89;
+break;
+case 23:return 8;
+break;
+case 24:return 86;
+break;
+case 25:return 98;
+break;
+case 26:return 16;
+break;
+case 27:return 15;
+break;
+case 28:return 17;
+break;
+case 29:return 18;
+break;
+case 30:return 53;
+break;
+case 31:return 51;
+break;
+case 32:return 52;
+break;
+case 33:return 54;
+break;
+case 34:return 58;
+break;
+case 35:return 56;
+break;
+case 36:return 57;
+break;
+case 37:return 59;
+break;
+case 38:return 58;
+break;
+case 39:return 56;
+break;
+case 40:return 57;
+break;
+case 41:return 59;
+break;
+case 42:return 63;
+break;
+case 43:return 61;
+break;
+case 44:return 62;
+break;
+case 45:return 64;
+break;
+case 46:return 50;
+break;
+case 47:return 55;
+break;
+case 48:return 60;
+break;
+case 49:return 40;
+break;
+case 50:return 41;
+break;
+case 51:return 46;
+break;
+case 52:return 92;
+break;
+case 53:return 96;
+break;
+case 54:return 84;
+break;
+case 55:return 97;
+break;
+case 56:return 97;
+break;
+case 57:return 88;
+break;
+case 58:return 94;
+break;
+case 59:return 95;
+break;
+case 60:return 65;
+break;
+case 61:return 38;
+break;
+case 62:return 39;
+break;
+case 63:return 36;
+break;
+case 64:return 37;
+break;
+case 65:return 42
+break;
+case 66:return 43
+break;
+case 67:return 101;
+break;
+case 68:return 9;
+break;
+case 69:return 10;
+break;
+case 70:return 11;
+break;
+}
+},
+rules: [/^(?:%%[^\n]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:click\b)/,/^(?:graph\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:LR\b)/,/^(?:RL\b)/,/^(?:TB\b)/,/^(?:BT\b)/,/^(?:TD\b)/,/^(?:BR\b)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:v\b)/,/^(?:\s*--[x]\s*)/,/^(?:\s*-->\s*)/,/^(?:\s*--[o]\s*)/,/^(?:\s*---\s*)/,/^(?:\s*-\.-[x]\s*)/,/^(?:\s*-\.->\s*)/,/^(?:\s*-\.-[o]\s*)/,/^(?:\s*-\.-\s*)/,/^(?:\s*.-[x]\s*)/,/^(?:\s*\.->\s*)/,/^(?:\s*\.-[o]\s*)/,/^(?:\s*\.-\s*)/,/^(?:\s*==[x]\s*)/,/^(?:\s*==>\s*)/,/^(?:\s*==[o]\s*)/,/^(?:\s*==[\=]\s*)/,/^(?:\s*--\s*)/,/^(?:\s*-\.\s*)/,/^(?:\s*==\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:[A-Za-z]+)/,/^(?:[!"#$%&'*+,-.`?\\_\/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:\n+)/,/^(?:\s)/,/^(?:$)/],
+conditions: {"string":{"rules":[2,3],"inclusive":false},"INITIAL":{"rules":[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain(args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if (typeof module !== 'undefined' && require.main === module) {
+  exports.main(process.argv.slice(1));
+}
+}
\ No newline at end of file
diff --git a/_submodules/mermaid/src/diagrams/flowchart/parser/flow.spec.js b/_submodules/mermaid/src/diagrams/flowchart/parser/flow.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..28d273bafe26097bf32323451349027b0decd928
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/flowchart/parser/flow.spec.js
@@ -0,0 +1,1346 @@
+import flowDb from '../flowDb'
+import flow from './flow'
+
+describe('when parsing ', function () {
+  beforeEach(function () {
+    flow.parser.yy = flowDb
+    flow.parser.yy.clear()
+  })
+
+  it('should handle a nodes and edges', function () {
+    const res = flow.parser.parse('graph TD;\nA-->B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('should handle subgraph with tab indentation', function () {
+    const res = flow.parser.parse('graph TB\nsubgraph One\n\ta1-->a2\nend')
+    const subgraphs = flow.parser.yy.getSubGraphs()
+    expect(subgraphs.length).toBe(1)
+    const subgraph = subgraphs[0]
+    expect(subgraph.nodes.length).toBe(2)
+    expect(subgraph.nodes[0]).toBe('a1')
+    expect(subgraph.nodes[1]).toBe('a2')
+    expect(subgraph.title).toBe('One')
+  })
+
+  it('should handle angle bracket ' > ' as direction LR', function () {
+    const res = flow.parser.parse('graph >;A-->B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+    const direction = flow.parser.yy.getDirection()
+
+    expect(direction).toBe('LR')
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('should handle angle bracket ' < ' as direction RL', function () {
+    const res = flow.parser.parse('graph <;A-->B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+    const direction = flow.parser.yy.getDirection()
+
+    expect(direction).toBe('RL')
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('should handle caret ' ^ ' as direction BT', function () {
+    const res = flow.parser.parse('graph ^;A-->B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+    const direction = flow.parser.yy.getDirection()
+
+    expect(direction).toBe('BT')
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('should handle lower-case \'v\' as direction TB', function () {
+    const res = flow.parser.parse('graph v;A-->B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+    const direction = flow.parser.yy.getDirection()
+
+    expect(direction).toBe('TB')
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('should handle a nodes and edges and a space between link and node', function () {
+    const res = flow.parser.parse('graph TD;A --> B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('should handle a nodes and edges, a space between link and node and each line ending without semicolon', function () {
+    const res = flow.parser.parse('graph TD\nA --> B\n style e red')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+  it('should handle statements ending without semicolon', function () {
+    const res = flow.parser.parse('graph TD\nA-->B\nB-->C')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(2)
+    expect(edges[1].start).toBe('B')
+    expect(edges[1].end).toBe('C')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('should handle a comments', function () {
+    const res = flow.parser.parse('graph TD;\n%% CComment\n A-->B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+  it('should handle comments a at the start', function () {
+    const res = flow.parser.parse('%% Comment\ngraph TD;\n A-->B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+  it('should handle comments at the end', function () {
+    const res = flow.parser.parse('graph TD;\n A-->B\n %% Comment at the find\n')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+  it('should handle comments at the end no trailing newline', function () {
+    const res = flow.parser.parse('graph TD;\n A-->B\n%% Commento')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+  it('should handle comments at the end many trailing newlines', function () {
+    const res = flow.parser.parse('graph TD;\n A-->B\n%% Commento\n\n\n')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+  it('should handle no trailing newlines', function () {
+    const res = flow.parser.parse('graph TD;\n A-->B')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+  it('should handle many trailing newlines', function () {
+    const res = flow.parser.parse('graph TD;\n A-->B\n\n')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+  it('should handle a comments with blank rows in-between', function () {
+    const res = flow.parser.parse('graph TD;\n\n\n %% Comment\n A-->B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('should handle a comments mermaid flowchart code in them', function () {
+    const res = flow.parser.parse('graph TD;\n\n\n %% Test od>Odd shape]-->|Two line<br>edge comment|ro;\n A-->B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(1)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('it should handle a trailing whitespaces after statememnts', function () {
+    const res = flow.parser.parse('graph TD;\n\n\n %% Comment\n A-->B; \n B-->C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(2)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].type).toBe('arrow')
+    expect(edges[0].text).toBe('')
+  })
+
+  it('should handle node names with "end" substring', function () {
+    const res = flow.parser.parse('graph TD\nendpoint --> sender')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['endpoint'].id).toBe('endpoint')
+    expect(vert['sender'].id).toBe('sender')
+    expect(edges[0].start).toBe('endpoint')
+    expect(edges[0].end).toBe('sender')
+  })
+
+  it('should handle node names ending with keywords', function () {
+    const res = flow.parser.parse('graph TD\nblend --> monograph')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['blend'].id).toBe('blend')
+    expect(vert['monograph'].id).toBe('monograph')
+    expect(edges[0].start).toBe('blend')
+    expect(edges[0].end).toBe('monograph')
+  })
+
+  it('should handle open ended edges', function () {
+    const res = flow.parser.parse('graph TD;A---B;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow_open')
+  })
+
+  it('should handle cross ended edges', function () {
+    const res = flow.parser.parse('graph TD;A--xB;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow_cross')
+  })
+
+  it('should handle open ended edges', function () {
+    const res = flow.parser.parse('graph TD;A--oB;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow_circle')
+  })
+  it('should handle subgraphs', function () {
+    const res = flow.parser.parse('graph TD;A-->B;subgraph myTitle;c-->d;end;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow')
+  })
+
+  it('should handle subgraphs', function () {
+    const res = flow.parser.parse('graph TD\nA-->B\nsubgraph myTitle\n\n c-->d \nend\n')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow')
+  })
+
+  it('should handle nested subgraphs', function () {
+    const str = 'graph TD\n' +
+            'A-->B\n' +
+            'subgraph myTitle\n\n' +
+            ' c-->d \n\n' +
+            ' subgraph inner\n\n   e-->f \n end \n\n' +
+            ' subgraph inner\n\n   h-->i \n end \n\n' +
+            'end\n'
+    const res = flow.parser.parse(str)
+  })
+
+  it('should handle subgraphs', function () {
+    const res = flow.parser.parse('graph TD\nA-->B\nsubgraph myTitle\nc-->d\nend;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow')
+  })
+
+  it('should handle subgraphs', function () {
+    const res = flow.parser.parse('graph TD\nA-->B\nsubgraph myTitle\nc-- text -->d\nd-->e\n end;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow')
+  })
+
+  it('should handle classDefs with style in classes', function () {
+    const res = flow.parser.parse('graph TD\nA-->B\nclassDef exClass font-style:bold;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow')
+  })
+
+  it('should handle classDefs with % in classes', function () {
+    const res = flow.parser.parse('graph TD\nA-->B\nclassDef exClass fill:#f96,stroke:#333,stroke-width:4px,font-size:50%,font-style:bold;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow')
+  })
+
+  it('should handle style definitons with more then 1 digit in a row', function () {
+    const res = flow.parser.parse('graph TD\n' +
+        'A-->B1\n' +
+        'A-->B2\n' +
+        'A-->B3\n' +
+        'A-->B4\n' +
+        'A-->B5\n' +
+        'A-->B6\n' +
+        'A-->B7\n' +
+        'A-->B8\n' +
+        'A-->B9\n' +
+        'A-->B10\n' +
+        'A-->B11\n' +
+        'linkStyle 10 stroke-width:1px;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow')
+  })
+
+  it('should handle line interpolation default definitions', function () {
+    const res = flow.parser.parse('graph TD\n' +
+        'A-->B\n' +
+        'linkStyle default interpolate basis')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.defaultInterpolate).toBe('basis')
+  })
+
+  it('should handle line interpolation numbered definitions', function () {
+    const res = flow.parser.parse('graph TD\n' +
+        'A-->B\n' +
+        'A-->C\n' +
+        'linkStyle 0 interpolate basis\n' +
+        'linkStyle 1 interpolate cardinal')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].interpolate).toBe('basis')
+    expect(edges[1].interpolate).toBe('cardinal')
+  })
+
+  it('should handle line interpolation default with style', function () {
+    const res = flow.parser.parse('graph TD\n' +
+        'A-->B\n' +
+        'linkStyle default interpolate basis stroke-width:1px;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.defaultInterpolate).toBe('basis')
+  })
+
+  it('should handle line interpolation numbered with style', function () {
+    const res = flow.parser.parse('graph TD\n' +
+        'A-->B\n' +
+        'A-->C\n' +
+        'linkStyle 0 interpolate basis stroke-width:1px;\n' +
+        'linkStyle 1 interpolate cardinal stroke-width:1px;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].interpolate).toBe('basis')
+    expect(edges[1].interpolate).toBe('cardinal')
+  })
+
+  describe('it should handle interaction, ', function () {
+    it('it should be possible to use click to a callback', function () {
+      spyOn(flowDb, 'setClickEvent')
+      const res = flow.parser.parse('graph TD\nA-->B\nclick A callback')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(flowDb.setClickEvent).toHaveBeenCalledWith('A', 'callback', undefined, undefined)
+    })
+
+    it('it should be possible to use click to a callback with toolip', function () {
+      spyOn(flowDb, 'setClickEvent')
+      const res = flow.parser.parse('graph TD\nA-->B\nclick A callback "tooltip"')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(flowDb.setClickEvent).toHaveBeenCalledWith('A', 'callback', undefined, 'tooltip')
+    })
+
+    it('should handle interaction - click to a link', function () {
+      spyOn(flowDb, 'setClickEvent')
+      const res = flow.parser.parse('graph TD\nA-->B\nclick A "click.html"')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(flowDb.setClickEvent).toHaveBeenCalledWith('A', undefined, 'click.html', undefined)
+    })
+    it('should handle interaction - click to a link with tooltip', function () {
+      spyOn(flowDb, 'setClickEvent')
+      const res = flow.parser.parse('graph TD\nA-->B\nclick A "click.html" "tooltip"')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(flowDb.setClickEvent).toHaveBeenCalledWith('A', undefined, 'click.html', 'tooltip')
+    })
+  })
+
+  describe('it should handle text on edges', function () {
+    it('it should handle text without space', function () {
+      const res = flow.parser.parse('graph TD;A--x|textNoSpace|B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+    })
+
+    it('should handle  with space', function () {
+      const res = flow.parser.parse('graph TD;A--x|text including space|B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+    })
+
+    it('it should handle text with /', function () {
+      const res = flow.parser.parse('graph TD;A--x|text with / should work|B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].text).toBe('text with / should work')
+    })
+
+    it('it should handle space and space between vertices and link', function () {
+      const res = flow.parser.parse('graph TD;A --x|textNoSpace| B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+    })
+
+    it('should handle space and CAPS', function () {
+      const res = flow.parser.parse('graph TD;A--x|text including CAPS space|B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+    })
+
+    it('should handle space and dir', function () {
+      const res = flow.parser.parse('graph TD;A--x|text including URL space|B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+      expect(edges[0].text).toBe('text including URL space')
+    })
+
+    it('should handle space and send', function () {
+      const res = flow.parser.parse('graph TD;A--text including URL space and send-->B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow')
+      expect(edges[0].text).toBe('text including URL space and send')
+    })
+    it('should handle space and send', function () {
+      const res = flow.parser.parse('graph TD;A-- text including URL space and send -->B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow')
+      expect(edges[0].text).toBe('text including URL space and send')
+    })
+
+    it('should handle space and dir (TD)', function () {
+      const res = flow.parser.parse('graph TD;A--x|text including R TD space|B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+      expect(edges[0].text).toBe('text including R TD space')
+    })
+    it('should handle `', function () {
+      const res = flow.parser.parse('graph TD;A--x|text including `|B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+      expect(edges[0].text).toBe('text including `')
+    })
+    it('should handle v in node ids only v', function () {
+            // only v
+      const res = flow.parser.parse('graph TD;A--xv(my text);')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+      expect(vert['v'].text).toBe('my text')
+    })
+    it('should handle v in node ids v at end', function () {
+            // v at end
+      const res = flow.parser.parse('graph TD;A--xcsv(my text);')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+      expect(vert['csv'].text).toBe('my text')
+    })
+    it('should handle v in node ids v in middle', function () {
+            // v in middle
+      const res = flow.parser.parse('graph TD;A--xava(my text);')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+      expect(vert['ava'].text).toBe('my text')
+    })
+    it('should handle v in node ids, v at start', function () {
+            // v at start
+      const res = flow.parser.parse('graph TD;A--xva(my text);')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+      expect(vert['va'].text).toBe('my text')
+    })
+    it('should handle keywords', function () {
+      const res = flow.parser.parse('graph TD;A--x|text including graph space|B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].text).toBe('text including graph space')
+    })
+    it('should handle keywords', function () {
+      const res = flow.parser.parse('graph TD;V-->a[v]')
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+      expect(vert['a'].text).toBe('v')
+    })
+    it('should handle keywords', function () {
+      const res = flow.parser.parse('graph TD;V-->a[v]')
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+      expect(vert['a'].text).toBe('v')
+    })
+    it('should handle quoted text', function () {
+      const res = flow.parser.parse('graph TD;V-- "test string()" -->a[v]')
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+      expect(edges[0].text).toBe('test string()')
+    })
+  })
+
+  describe('it should handle new line type notation', function () {
+    it('it should handle regular lines', function () {
+      const res = flow.parser.parse('graph TD;A-->B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].stroke).toBe('normal')
+    })
+    it('it should handle dotted lines', function () {
+      const res = flow.parser.parse('graph TD;A-.->B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].stroke).toBe('dotted')
+    })
+    it('it should handle dotted lines', function () {
+      const res = flow.parser.parse('graph TD;A==>B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].stroke).toBe('thick')
+    })
+    it('it should handle text on lines', function () {
+      const res = flow.parser.parse('graph TD;A-- test text with == -->B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].stroke).toBe('normal')
+    })
+    it('it should handle text on lines', function () {
+      const res = flow.parser.parse('graph TD;A-. test text with == .->B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].stroke).toBe('dotted')
+    })
+    it('it should handle text on lines', function () {
+      const res = flow.parser.parse('graph TD;A== test text with - ==>B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].stroke).toBe('thick')
+    })
+  })
+
+  describe('it should handle text on edges using the new notation', function () {
+    it('it should handle text without space', function () {
+      const res = flow.parser.parse('graph TD;A-- textNoSpace --xB;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+    })
+
+    it('it should handle text with multiple leading space', function () {
+      const res = flow.parser.parse('graph TD;A--    textNoSpace --xB;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+    })
+
+    it('should handle  with space', function () {
+      const res = flow.parser.parse('graph TD;A-- text including space --xB;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+    })
+
+    it('it should handle text with /', function () {
+      const res = flow.parser.parse('graph TD;A -- text with / should work --x B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].text).toBe('text with / should work')
+    })
+
+    it('it should handle space and space between vertices and link', function () {
+      const res = flow.parser.parse('graph TD;A -- textNoSpace --x B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+    })
+
+    it('should handle space and CAPS', function () {
+      const res = flow.parser.parse('graph TD;A-- text including CAPS space --xB;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+    })
+
+    it('should handle space and dir', function () {
+      const res = flow.parser.parse('graph TD;A-- text including URL space --xB;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+      expect(edges[0].text).toBe('text including URL space')
+    })
+
+    it('should handle space and dir (TD)', function () {
+      const res = flow.parser.parse('graph TD;A-- text including R TD space --xB;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].type).toBe('arrow_cross')
+      expect(edges[0].text).toBe('text including R TD space')
+    })
+    it('should handle keywords', function () {
+      const res = flow.parser.parse('graph TD;A-- text including graph space and v --xB;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].text).toBe('text including graph space and v')
+    })
+    it('should handle keywords', function () {
+      const res = flow.parser.parse('graph TD;A-- text including graph space and v --xB[blav]')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(edges[0].text).toBe('text including graph space and v')
+    })
+        // xit('should handle text on open links',function(){
+        //    const res = flow.parser.parse('graph TD;A-- text including graph space --B');
+        //
+        //    const vert = flow.parser.yy.getVertices();
+        //    const edges = flow.parser.yy.getEdges();
+        //
+        //    expect(edges[0].text).toBe('text including graph space');
+        //
+        // });
+  })
+
+  it('should handle multi-line text', function () {
+    const res = flow.parser.parse('graph TD;A--o|text space|B;\n B-->|more text with space|C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges[0].type).toBe('arrow_circle')
+    expect(edges[1].type).toBe('arrow')
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(vert['C'].id).toBe('C')
+    expect(edges.length).toBe(2)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+        // expect(edges[0].text).toBe('text space');
+    expect(edges[1].start).toBe('B')
+    expect(edges[1].end).toBe('C')
+    expect(edges[1].text).toBe('more text with space')
+  })
+
+  it('should handle multiple edges', function () {
+    const res = flow.parser.parse('graph TD;A---|This is the 123 s text|B;\nA---|This is the second edge|B;')
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].id).toBe('A')
+    expect(vert['B'].id).toBe('B')
+    expect(edges.length).toBe(2)
+    expect(edges[0].start).toBe('A')
+    expect(edges[0].end).toBe('B')
+    expect(edges[0].text).toBe('This is the 123 s text')
+    expect(edges[1].start).toBe('A')
+    expect(edges[1].end).toBe('B')
+    expect(edges[1].text).toBe('This is the second edge')
+  })
+
+  it('should handle text in vertices with space', function () {
+    const res = flow.parser.parse('graph TD;A[chimpansen hoppar]-->C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].type).toBe('square')
+    expect(vert['A'].text).toBe('chimpansen hoppar')
+  })
+
+  it('should handle text in vertices with space with spaces between vertices and link', function () {
+    const res = flow.parser.parse('graph TD;A[chimpansen hoppar] --> C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].type).toBe('square')
+    expect(vert['A'].text).toBe('chimpansen hoppar')
+  })
+
+  it('should handle quoted text in vertices ', function () {
+    const res = flow.parser.parse('graph TD;A["chimpansen hoppar ()[]"] --> C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].type).toBe('square')
+    expect(vert['A'].text).toBe('chimpansen hoppar ()[]')
+  })
+
+  it('should handle text in circle vertices with space', function () {
+    const res = flow.parser.parse('graph TD;A((chimpansen hoppar))-->C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].type).toBe('circle')
+    expect(vert['A'].text).toBe('chimpansen hoppar')
+  })
+
+  it('should handle text in ellipse vertices', function () {
+    const res = flow.parser.parse('graph TD\nA(-this is an ellipse-)-->B')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].type).toBe('ellipse')
+    expect(vert['A'].text).toBe('this is an ellipse')
+  })
+
+  it('should handle text in diamond vertices with space', function () {
+    const res = flow.parser.parse('graph TD;A(chimpansen hoppar)-->C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].type).toBe('round')
+    expect(vert['A'].text).toBe('chimpansen hoppar')
+  })
+
+  it('should handle text in with ?', function () {
+    const res = flow.parser.parse('graph TD;A(?)-->|?|C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].text).toBe('?')
+    expect(edges[0].text).toBe('?')
+  })
+  it('should handle text in with éèêàçô', function () {
+    const res = flow.parser.parse('graph TD;A(éèêàçô)-->|éèêàçô|C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].text).toBe('éèêàçô')
+    expect(edges[0].text).toBe('éèêàçô')
+  })
+
+  it('should handle text in with ,.?!+-*', function () {
+    const res = flow.parser.parse('graph TD;A(,.?!+-*)-->|,.?!+-*|C;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['A'].text).toBe(',.?!+-*')
+    expect(edges[0].text).toBe(',.?!+-*')
+  })
+
+  describe('it should handle text in vertices, ', function () {
+    it('it should handle space', function () {
+      const res = flow.parser.parse('graph TD;A-->C(Chimpansen hoppar);')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(vert['C'].type).toBe('round')
+      expect(vert['C'].text).toBe('Chimpansen hoppar')
+    })
+    it('it should handle åäö and minus', function () {
+      const res = flow.parser.parse('graph TD;A-->C{Chimpansen hoppar åäö-ÅÄÖ};')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(vert['C'].type).toBe('diamond')
+      expect(vert['C'].text).toBe('Chimpansen hoppar åäö-ÅÄÖ')
+    })
+
+    it('it should handle with åäö, minus and space and br', function () {
+      const res = flow.parser.parse('graph TD;A-->C(Chimpansen hoppar åäö  <br> -  ÅÄÖ);')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(vert['C'].type).toBe('round')
+      expect(vert['C'].text).toBe('Chimpansen hoppar åäö  <br> -  ÅÄÖ')
+    })
+        // xit('it should handle åäö, minus and space and br',function(){
+        //    const res = flow.parser.parse('graph TD; A[Object&#40;foo,bar&#41;]-->B(Thing);');
+        //
+        //    const vert = flow.parser.yy.getVertices();
+        //    const edges = flow.parser.yy.getEdges();
+        //
+        //    expect(vert['C'].type).toBe('round');
+        //    expect(vert['C'].text).toBe(' A[Object&#40;foo,bar&#41;]-->B(Thing);');
+        // });
+    it('it should handle unicode chars', function () {
+      const res = flow.parser.parse('graph TD;A-->C(Начало);')
+
+      const vert = flow.parser.yy.getVertices()
+
+      expect(vert['C'].text).toBe('Начало')
+    })
+    it('it should handle backslask', function () {
+      const res = flow.parser.parse('graph TD;A-->C(c:\\windows);')
+
+      const vert = flow.parser.yy.getVertices()
+
+      expect(vert['C'].text).toBe('c:\\windows')
+    })
+    it('it should handle CAPS', function () {
+      const res = flow.parser.parse('graph TD;A-->C(some CAPS);')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(vert['C'].type).toBe('round')
+      expect(vert['C'].text).toBe('some CAPS')
+    })
+    it('it should handle directions', function () {
+      const res = flow.parser.parse('graph TD;A-->C(some URL);')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(vert['C'].type).toBe('round')
+      expect(vert['C'].text).toBe('some URL')
+    })
+  })
+
+  it('should handle a single node', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;A;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['A'].styles.length).toBe(0)
+  })
+
+  it('should handle a single square node', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;a[A];')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['a'].styles.length).toBe(0)
+    expect(vert['a'].type).toBe('square')
+  })
+  it('should handle a single round square node', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;a[A];')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['a'].styles.length).toBe(0)
+    expect(vert['a'].type).toBe('square')
+  })
+  it('should handle a single circle node', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;a((A));')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['a'].type).toBe('circle')
+  })
+  it('should handle a single round node', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;a(A);')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['a'].type).toBe('round')
+  })
+  it('should handle a single odd node', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;a>A];')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['a'].type).toBe('odd')
+  })
+  it('should handle a single diamond node', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;a{A};')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['a'].type).toBe('diamond')
+  })
+  it('should handle a single diamond node with html in it', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;a{A <br> end};')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['a'].type).toBe('diamond')
+    expect(vert['a'].text).toBe('A <br> end')
+  })
+  it('should handle a single round node with html in it', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;a(A <br> end);')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['a'].type).toBe('round')
+    expect(vert['a'].text).toBe('A <br> end')
+  })
+  it('should handle a single node with alphanumerics starting on a char', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;id1;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['id1'].styles.length).toBe(0)
+  })
+  it('should handle a single node with alphanumerics starting on a num', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;1id;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['1id'].styles.length).toBe(0)
+  })
+  it('should handle a single node with alphanumerics containing a minus sign', function () {
+        // Silly but syntactically correct
+    const res = flow.parser.parse('graph TD;i-d;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(0)
+    expect(vert['i-d'].styles.length).toBe(0)
+  })
+    // log.debug(flow.parser.parse('graph TD;style Q background:#fff;'));
+  it('should handle styles for vertices', function () {
+    const res = flow.parser.parse('graph TD;style Q background:#fff;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    const style = vert['Q'].styles[0]
+
+    expect(vert['Q'].styles.length).toBe(1)
+    expect(vert['Q'].styles[0]).toBe('background:#fff')
+  })
+
+    // log.debug(flow.parser.parse('graph TD;style Q background:#fff;'));
+  it('should handle styles for edges', function () {
+    const res = flow.parser.parse('graph TD;a-->b;\nstyle #0 stroke: #f66;')
+
+    const edges = flow.parser.yy.getEdges()
+
+    expect(edges.length).toBe(1)
+  })
+
+  it('should handle multiple styles for a vortex', function () {
+    const res = flow.parser.parse('graph TD;style R background:#fff,border:1px solid red;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['R'].styles.length).toBe(2)
+    expect(vert['R'].styles[0]).toBe('background:#fff')
+    expect(vert['R'].styles[1]).toBe('border:1px solid red')
+  })
+
+  it('should handle multiple styles in a graph', function () {
+    const res = flow.parser.parse('graph TD;style S background:#aaa;\nstyle T background:#bbb,border:1px solid red;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['S'].styles.length).toBe(1)
+    expect(vert['T'].styles.length).toBe(2)
+    expect(vert['S'].styles[0]).toBe('background:#aaa')
+    expect(vert['T'].styles[0]).toBe('background:#bbb')
+    expect(vert['T'].styles[1]).toBe('border:1px solid red')
+  })
+
+  it('should handle styles and graph definitons in a graph', function () {
+    const res = flow.parser.parse('graph TD;S-->T;\nstyle S background:#aaa;\nstyle T background:#bbb,border:1px solid red;')
+
+    const vert = flow.parser.yy.getVertices()
+    const edges = flow.parser.yy.getEdges()
+
+    expect(vert['S'].styles.length).toBe(1)
+    expect(vert['T'].styles.length).toBe(2)
+    expect(vert['S'].styles[0]).toBe('background:#aaa')
+    expect(vert['T'].styles[0]).toBe('background:#bbb')
+    expect(vert['T'].styles[1]).toBe('border:1px solid red')
+  })
+  it('should handle styles and graph definitons in a graph', function () {
+    const res = flow.parser.parse('graph TD;style T background:#bbb,border:1px solid red;')
+        // const res = flow.parser.parse('graph TD;style T background: #bbb;');
+
+    const vert = flow.parser.yy.getVertices()
+
+    expect(vert['T'].styles.length).toBe(2)
+    expect(vert['T'].styles[0]).toBe('background:#bbb')
+    expect(vert['T'].styles[1]).toBe('border:1px solid red')
+  })
+
+  describe('special characters should be be handled.', function () {
+    const charTest = function (char) {
+      const res = flow.parser.parse('graph TD;A(' + char + ')-->B;')
+
+      const vert = flow.parser.yy.getVertices()
+      const edges = flow.parser.yy.getEdges()
+
+      expect(vert['A'].id).toBe('A')
+      expect(vert['B'].id).toBe('B')
+      expect(vert['A'].text).toBe(char)
+    }
+
+    it('it should be able to parse a \'.\'', function () {
+      charTest('.')
+      charTest('Start 103a.a1')
+    })
+
+    it('it should be able to parse text containing \'_\'', function () {
+      charTest('_')
+    })
+
+    it('it should be able to parse a \':\'', function () {
+      charTest(':')
+    })
+
+    it('it should be able to parse a \',\'', function () {
+      charTest(',')
+    })
+
+    it('it should be able to parse text containing \'-\'', function () {
+      charTest('a-b')
+    })
+
+    it('it should be able to parse a \'+\'', function () {
+      charTest('+')
+    })
+
+    it('it should be able to parse a \'*\'', function () {
+      charTest('*')
+    })
+
+    it('it should be able to parse a \'<\'', function () {
+      charTest('<')
+    })
+
+    it('it should be able to parse a \'>\'', function () {
+      charTest('>')
+    })
+
+    it('it should be able to parse a \'=\'', function () {
+      charTest('=')
+    })
+  })
+
+  it('should be possible to declare a class', function () {
+    const res = flow.parser.parse('graph TD;classDef exClass background:#bbb,border:1px solid red;')
+        // const res = flow.parser.parse('graph TD;style T background: #bbb;');
+
+    const classes = flow.parser.yy.getClasses()
+
+    expect(classes['exClass'].styles.length).toBe(2)
+    expect(classes['exClass'].styles[0]).toBe('background:#bbb')
+    expect(classes['exClass'].styles[1]).toBe('border:1px solid red')
+  })
+
+  it('should be possible to declare a class with a dot in the style', function () {
+    const res = flow.parser.parse('graph TD;classDef exClass background:#bbb,border:1.5px solid red;')
+        // const res = flow.parser.parse('graph TD;style T background: #bbb;');
+
+    const classes = flow.parser.yy.getClasses()
+
+    expect(classes['exClass'].styles.length).toBe(2)
+    expect(classes['exClass'].styles[0]).toBe('background:#bbb')
+    expect(classes['exClass'].styles[1]).toBe('border:1.5px solid red')
+  })
+  it('should be possible to declare a class with a space in the style', function () {
+    const res = flow.parser.parse('graph TD;classDef exClass background:  #bbb,border:1.5px solid red;')
+        // const res = flow.parser.parse('graph TD;style T background  :  #bbb;');
+
+    const classes = flow.parser.yy.getClasses()
+
+    expect(classes['exClass'].styles.length).toBe(2)
+    expect(classes['exClass'].styles[0]).toBe('background:  #bbb')
+    expect(classes['exClass'].styles[1]).toBe('border:1.5px solid red')
+  })
+  it('should be possible to apply a class to a vertex', function () {
+    let statement = ''
+
+    statement = statement + 'graph TD;' + '\n'
+    statement = statement + 'classDef exClass background:#bbb,border:1px solid red;' + '\n'
+    statement = statement + 'a-->b;' + '\n'
+    statement = statement + 'class a exClass;'
+
+    const res = flow.parser.parse(statement)
+
+    const classes = flow.parser.yy.getClasses()
+
+    expect(classes['exClass'].styles.length).toBe(2)
+    expect(classes['exClass'].styles[0]).toBe('background:#bbb')
+    expect(classes['exClass'].styles[1]).toBe('border:1px solid red')
+  })
+  it('should be possible to apply a class to a comma separated list of vertices', function () {
+    let statement = ''
+
+    statement = statement + 'graph TD;' + '\n'
+    statement = statement + 'classDef exClass background:#bbb,border:1px solid red;' + '\n'
+    statement = statement + 'a-->b;' + '\n'
+    statement = statement + 'class a,b exClass;'
+
+    const res = flow.parser.parse(statement)
+
+    const classes = flow.parser.yy.getClasses()
+    const vertices = flow.parser.yy.getVertices()
+
+    expect(classes['exClass'].styles.length).toBe(2)
+    expect(classes['exClass'].styles[0]).toBe('background:#bbb')
+    expect(classes['exClass'].styles[1]).toBe('border:1px solid red')
+    expect(vertices['a'].classes[0]).toBe('exClass')
+    expect(vertices['b'].classes[0]).toBe('exClass')
+  })
+})
diff --git a/_submodules/mermaid/src/diagrams/gantt/gantt.spec.js b/_submodules/mermaid/src/diagrams/gantt/gantt.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..a170be6e1ffc4ba4dcf4a5366e5ed5c2d9e6a97b
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/gantt/gantt.spec.js
@@ -0,0 +1,48 @@
+/* eslint-env jasmine */
+import { parser } from './parser/gantt'
+import ganttDb from './ganttDb'
+
+describe('when parsing a gantt diagram it', function () {
+  beforeEach(function () {
+    parser.yy = ganttDb
+  })
+
+  it('should handle a dateFormat definition', function () {
+    const str = 'gantt\ndateFormat yyyy-mm-dd'
+
+    parser.parse(str)
+  })
+  it('should handle a title definition', function () {
+    const str = 'gantt\ndateFormat yyyy-mm-dd\ntitle Adding gantt diagram functionality to mermaid'
+
+    parser.parse(str)
+  })
+  it('should handle a section definition', function () {
+    const str = 'gantt\n' +
+      'dateFormat yyyy-mm-dd\n' +
+      'title Adding gantt diagram functionality to mermaid\n' +
+      'section Documentation'
+
+    parser.parse(str)
+  })
+  /**
+   * Beslutsflöde inligt nedan. Obs bla bla bla
+   * ```
+   * graph TD
+   * A[Hard pledge] -- text on link -->B(Round edge)
+   * B --> C{to do or not to do}
+   * C -->|Too| D[Result one]
+   * C -->|Doo| E[Result two]
+   ```
+   * params bapa - a unique bapap
+   */
+  it('should handle a task definition', function () {
+    const str = 'gantt\n' +
+      'dateFormat yyyy-mm-dd\n' +
+      'title Adding gantt diagram functionality to mermaid\n' +
+      'section Documentation\n' +
+      'Design jison grammar:des1, 2014-01-01, 2014-01-04'
+
+    parser.parse(str)
+  })
+})
diff --git a/_submodules/mermaid/src/diagrams/gantt/ganttDb.js b/_submodules/mermaid/src/diagrams/gantt/ganttDb.js
new file mode 100644
index 0000000000000000000000000000000000000000..b4e4fda763a9305d5d7b3fb5065d8aacc6e213a2
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/gantt/ganttDb.js
@@ -0,0 +1,363 @@
+import moment from 'moment'
+import { logger } from '../../logger'
+
+let dateFormat = ''
+let axisFormat = ''
+let title = ''
+let sections = []
+let tasks = []
+let currentSection = ''
+
+export const clear = function () {
+  sections = []
+  tasks = []
+  currentSection = ''
+  title = ''
+  taskCnt = 0
+  lastTask = undefined
+  lastTaskID = undefined
+  rawTasks = []
+}
+
+export const setAxisFormat = function (txt) {
+  axisFormat = txt
+}
+
+export const getAxisFormat = function () {
+  return axisFormat
+}
+
+export const setDateFormat = function (txt) {
+  dateFormat = txt
+}
+
+export const setTitle = function (txt) {
+  title = txt
+}
+
+export const getTitle = function () {
+  return title
+}
+
+export const addSection = function (txt) {
+  currentSection = txt
+  sections.push(txt)
+}
+
+export const getTasks = function () {
+  let allItemsPricessed = compileTasks()
+  const maxDepth = 10
+  let iterationCount = 0
+  while (!allItemsPricessed && (iterationCount < maxDepth)) {
+    allItemsPricessed = compileTasks()
+    iterationCount++
+  }
+
+  tasks = rawTasks
+
+  return tasks
+}
+
+const getStartDate = function (prevTime, dateFormat, str) {
+  str = str.trim()
+
+  // Test for after
+  const re = /^after\s+([\d\w-]+)/
+  const afterStatement = re.exec(str.trim())
+
+  if (afterStatement !== null) {
+    const task = findTaskById(afterStatement[1])
+
+    if (typeof task === 'undefined') {
+      const dt = new Date()
+      dt.setHours(0, 0, 0, 0)
+      return dt
+    }
+    return task.endTime
+  }
+
+  // Check for actual date set
+  if (moment(str, dateFormat.trim(), true).isValid()) {
+    return moment(str, dateFormat.trim(), true).toDate()
+  } else {
+    logger.debug('Invalid date:' + str)
+    logger.debug('With date format:' + dateFormat.trim())
+  }
+
+  // Default date - now
+  return new Date()
+}
+
+const getEndDate = function (prevTime, dateFormat, str) {
+  str = str.trim()
+
+  // Check for actual date
+  if (moment(str, dateFormat.trim(), true).isValid()) {
+    return moment(str, dateFormat.trim()).toDate()
+  }
+
+  const d = moment(prevTime)
+  // Check for length
+  const re = /^([\d]+)([wdhms])/
+  const durationStatement = re.exec(str.trim())
+
+  if (durationStatement !== null) {
+    switch (durationStatement[2]) {
+      case 's':
+        d.add(durationStatement[1], 'seconds')
+        break
+      case 'm':
+        d.add(durationStatement[1], 'minutes')
+        break
+      case 'h':
+        d.add(durationStatement[1], 'hours')
+        break
+      case 'd':
+        d.add(durationStatement[1], 'days')
+        break
+      case 'w':
+        d.add(durationStatement[1], 'weeks')
+        break
+    }
+    return d.toDate()
+  }
+  // Default date - now
+  return d.toDate()
+}
+
+let taskCnt = 0
+const parseId = function (idStr) {
+  if (typeof idStr === 'undefined') {
+    taskCnt = taskCnt + 1
+    return 'task' + taskCnt
+  }
+  return idStr
+}
+// id, startDate, endDate
+// id, startDate, length
+// id, after x, endDate
+// id, after x, length
+// startDate, endDate
+// startDate, length
+// after x, endDate
+// after x, length
+// endDate
+// length
+
+const compileData = function (prevTask, dataStr) {
+  let ds
+
+  if (dataStr.substr(0, 1) === ':') {
+    ds = dataStr.substr(1, dataStr.length)
+  } else {
+    ds = dataStr
+  }
+
+  const data = ds.split(',')
+
+  const task = {}
+
+  // Get tags like active, done cand crit
+  let matchFound = true
+  while (matchFound) {
+    matchFound = false
+    if (data[0].match(/^\s*active\s*$/)) {
+      task.active = true
+      data.shift(1)
+      matchFound = true
+    }
+    if (data[0].match(/^\s*done\s*$/)) {
+      task.done = true
+      data.shift(1)
+      matchFound = true
+    }
+    if (data[0].match(/^\s*crit\s*$/)) {
+      task.crit = true
+      data.shift(1)
+      matchFound = true
+    }
+  }
+  for (let i = 0; i < data.length; i++) {
+    data[i] = data[i].trim()
+  }
+
+  switch (data.length) {
+    case 1:
+      task.id = parseId()
+      task.startTime = prevTask.endTime
+      task.endTime = getEndDate(task.startTime, dateFormat, data[0])
+      break
+    case 2:
+      task.id = parseId()
+      task.startTime = getStartDate(undefined, dateFormat, data[0])
+      task.endTime = getEndDate(task.startTime, dateFormat, data[1])
+      break
+    case 3:
+      task.id = parseId(data[0])
+      task.startTime = getStartDate(undefined, dateFormat, data[1])
+      task.endTime = getEndDate(task.startTime, dateFormat, data[2])
+      break
+    default:
+  }
+
+  return task
+}
+
+const parseData = function (prevTaskId, dataStr) {
+  let ds
+  if (dataStr.substr(0, 1) === ':') {
+    ds = dataStr.substr(1, dataStr.length)
+  } else {
+    ds = dataStr
+  }
+
+  const data = ds.split(',')
+
+  const task = {}
+
+  // Get tags like active, done cand crit
+  let matchFound = true
+  while (matchFound) {
+    matchFound = false
+    if (data[0].match(/^\s*active\s*$/)) {
+      task.active = true
+      data.shift(1)
+      matchFound = true
+    }
+    if (data[0].match(/^\s*done\s*$/)) {
+      task.done = true
+      data.shift(1)
+      matchFound = true
+    }
+    if (data[0].match(/^\s*crit\s*$/)) {
+      task.crit = true
+      data.shift(1)
+      matchFound = true
+    }
+  }
+  for (let i = 0; i < data.length; i++) {
+    data[i] = data[i].trim()
+  }
+
+  switch (data.length) {
+    case 1:
+      task.id = parseId()
+      task.startTime = { type: 'prevTaskEnd', id: prevTaskId }
+      task.endTime = { data: data[0] }
+      break
+    case 2:
+      task.id = parseId()
+      task.startTime = { type: 'getStartDate', startData: data[0] }
+      task.endTime = { data: data[1] }
+      break
+    case 3:
+      task.id = parseId(data[0])
+      task.startTime = { type: 'getStartDate', startData: data[1] }
+      task.endTime = { data: data[2] }
+      break
+    default:
+  }
+
+  return task
+}
+
+let lastTask
+let lastTaskID
+let rawTasks = []
+const taskDb = {}
+export const addTask = function (descr, data) {
+  const rawTask = {
+    section: currentSection,
+    type: currentSection,
+    processed: false,
+    raw: { data: data },
+    task: descr
+  }
+  const taskInfo = parseData(lastTaskID, data)
+  rawTask.raw.startTime = taskInfo.startTime
+  rawTask.raw.endTime = taskInfo.endTime
+  rawTask.id = taskInfo.id
+  rawTask.prevTaskId = lastTaskID
+  rawTask.active = taskInfo.active
+  rawTask.done = taskInfo.done
+  rawTask.crit = taskInfo.crit
+
+  const pos = rawTasks.push(rawTask)
+
+  lastTaskID = rawTask.id
+  // Store cross ref
+  taskDb[rawTask.id] = pos - 1
+}
+
+export const findTaskById = function (id) {
+  const pos = taskDb[id]
+  return rawTasks[pos]
+}
+
+export const addTaskOrg = function (descr, data) {
+  const newTask = {
+    section: currentSection,
+    type: currentSection,
+    description: descr,
+    task: descr
+  }
+  const taskInfo = compileData(lastTask, data)
+  newTask.startTime = taskInfo.startTime
+  newTask.endTime = taskInfo.endTime
+  newTask.id = taskInfo.id
+  newTask.active = taskInfo.active
+  newTask.done = taskInfo.done
+  newTask.crit = taskInfo.crit
+  lastTask = newTask
+  tasks.push(newTask)
+}
+
+const compileTasks = function () {
+  const compileTask = function (pos) {
+    const task = rawTasks[pos]
+    let startTime = ''
+    switch (rawTasks[pos].raw.startTime.type) {
+      case 'prevTaskEnd':
+        const prevTask = findTaskById(task.prevTaskId)
+        task.startTime = prevTask.endTime
+        break
+      case 'getStartDate':
+        startTime = getStartDate(undefined, dateFormat, rawTasks[pos].raw.startTime.startData)
+        if (startTime) {
+          rawTasks[pos].startTime = startTime
+        }
+        break
+    }
+
+    if (rawTasks[pos].startTime) {
+      rawTasks[pos].endTime = getEndDate(rawTasks[pos].startTime, dateFormat, rawTasks[pos].raw.endTime.data)
+      if (rawTasks[pos].endTime) {
+        rawTasks[pos].processed = true
+      }
+    }
+
+    return rawTasks[pos].processed
+  }
+
+  let allProcessed = true
+  for (let i = 0; i < rawTasks.length; i++) {
+    compileTask(i)
+
+    allProcessed = allProcessed && rawTasks[i].processed
+  }
+  return allProcessed
+}
+
+export default {
+  clear,
+  setDateFormat,
+  setAxisFormat,
+  getAxisFormat,
+  setTitle,
+  getTitle,
+  addSection,
+  getTasks,
+  addTask,
+  findTaskById,
+  addTaskOrg
+}
diff --git a/_submodules/mermaid/src/diagrams/gantt/ganttDb.spec.js b/_submodules/mermaid/src/diagrams/gantt/ganttDb.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..a956e3605324b0bf9b671071856444f03c6b262e
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/gantt/ganttDb.spec.js
@@ -0,0 +1,175 @@
+/* eslint-env jasmine */
+import moment from 'moment'
+import ganttDb from './ganttDb'
+
+describe('when using the ganttDb', function () {
+  beforeEach(function () {
+    ganttDb.clear()
+  })
+
+  it('should handle an fixed dates', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2013-01-12')
+    const tasks = ganttDb.getTasks()
+    expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].endTime).toEqual(moment('2013-01-12', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].id).toEqual('id1')
+    expect(tasks[0].task).toEqual('test1')
+  })
+  it('should handle duration (days) instead of fixed date to determine end date', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2d')
+    const tasks = ganttDb.getTasks()
+    expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].endTime).toEqual(moment('2013-01-03', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].id).toEqual('id1')
+    expect(tasks[0].task).toEqual('test1')
+  })
+  it('should handle duration (hours) instead of fixed date to determine end date', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2h')
+    const tasks = ganttDb.getTasks()
+    expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].endTime).toEqual(moment('2013-01-01 2:00', 'YYYY-MM-DD hh:mm').toDate())
+    expect(tasks[0].id).toEqual('id1')
+    expect(tasks[0].task).toEqual('test1')
+  })
+  it('should handle duration (minutes) instead of fixed date to determine end date', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2m')
+    const tasks = ganttDb.getTasks()
+    expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].endTime).toEqual(moment('2013-01-01 00:02', 'YYYY-MM-DD hh:mm').toDate())
+    expect(tasks[0].id).toEqual('id1')
+    expect(tasks[0].task).toEqual('test1')
+  })
+  it('should handle duration (seconds) instead of fixed date to determine end date', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2s')
+    const tasks = ganttDb.getTasks()
+    expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].endTime).toEqual(moment('2013-01-01 00:00:02', 'YYYY-MM-DD hh:mm:ss').toDate())
+    expect(tasks[0].id).toEqual('id1')
+    expect(tasks[0].task).toEqual('test1')
+  })
+  it('should handle duration (weeks) instead of fixed date to determine end date', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2w')
+    const tasks = ganttDb.getTasks()
+    expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].endTime).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].id).toEqual('id1')
+    expect(tasks[0].task).toEqual('test1')
+  })
+
+  it('should handle relative start date based on id', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2w')
+    ganttDb.addTask('test2', 'id2,after id1,1d')
+
+    const tasks = ganttDb.getTasks()
+
+    expect(tasks[1].startTime).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate())
+    expect(tasks[1].id).toEqual('id2')
+    expect(tasks[1].task).toEqual('test2')
+  })
+
+  it('should handle relative start date based on id when id is invalid', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2w')
+    ganttDb.addTask('test2', 'id2,after id3,1d')
+    const tasks = ganttDb.getTasks()
+    expect(tasks[1].startTime).toEqual(new Date((new Date()).setHours(0, 0, 0, 0)))
+    expect(tasks[1].id).toEqual('id2')
+    expect(tasks[1].task).toEqual('test2')
+  })
+
+  it('should handle fixed dates without id', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', '2013-01-01,2013-01-12')
+    const tasks = ganttDb.getTasks()
+    expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].endTime).toEqual(moment('2013-01-12', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].id).toEqual('task1')
+    expect(tasks[0].task).toEqual('test1')
+  })
+
+  it('should handle duration instead of a fixed date to determine end date without id', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', '2013-01-01,4d')
+    const tasks = ganttDb.getTasks()
+    expect(tasks[0].startTime).toEqual(moment('2013-01-01', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].endTime).toEqual(moment('2013-01-05', 'YYYY-MM-DD').toDate())
+    expect(tasks[0].id).toEqual('task1')
+    expect(tasks[0].task).toEqual('test1')
+  })
+
+  it('should handle relative start date of a fixed date to determine end date without id', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2w')
+    ganttDb.addTask('test2', 'after id1,1d')
+
+    const tasks = ganttDb.getTasks()
+
+    expect(tasks[1].startTime).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate())
+    expect(tasks[1].id).toEqual('task1')
+    expect(tasks[1].task).toEqual('test2')
+  })
+  it('should handle a new task with only an end date as definition', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2w')
+    ganttDb.addTask('test2', '2013-01-26')
+
+    const tasks = ganttDb.getTasks()
+
+    expect(tasks[1].startTime).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate())
+    expect(tasks[1].endTime).toEqual(moment('2013-01-26', 'YYYY-MM-DD').toDate())
+    expect(tasks[1].id).toEqual('task1')
+    expect(tasks[1].task).toEqual('test2')
+  })
+  it('should handle a new task with only an end date as definition', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2w')
+    ganttDb.addTask('test2', '2d')
+
+    const tasks = ganttDb.getTasks()
+
+    expect(tasks[1].startTime).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate())
+    expect(tasks[1].endTime).toEqual(moment('2013-01-17', 'YYYY-MM-DD').toDate())
+    expect(tasks[1].id).toEqual('task1')
+    expect(tasks[1].task).toEqual('test2')
+  })
+  it('should handle relative start date based on id regardless of sections', function () {
+    ganttDb.setDateFormat('YYYY-MM-DD')
+    ganttDb.addSection('testa1')
+    ganttDb.addTask('test1', 'id1,2013-01-01,2w')
+    ganttDb.addTask('test2', 'id2,after id3,1d')
+    ganttDb.addSection('testa2')
+    ganttDb.addTask('test3', 'id3,after id1,2d')
+
+    const tasks = ganttDb.getTasks()
+
+    expect(tasks[1].startTime).toEqual(moment('2013-01-17', 'YYYY-MM-DD').toDate())
+    expect(tasks[1].endTime).toEqual(moment('2013-01-18', 'YYYY-MM-DD').toDate())
+    expect(tasks[1].id).toEqual('id2')
+    expect(tasks[1].task).toEqual('test2')
+
+    expect(tasks[2].id).toEqual('id3')
+    expect(tasks[2].task).toEqual('test3')
+    expect(tasks[2].startTime).toEqual(moment('2013-01-15', 'YYYY-MM-DD').toDate())
+    expect(tasks[2].endTime).toEqual(moment('2013-01-17', 'YYYY-MM-DD').toDate())
+  })
+})
diff --git a/_submodules/mermaid/src/diagrams/gantt/ganttRenderer.js b/_submodules/mermaid/src/diagrams/gantt/ganttRenderer.js
new file mode 100644
index 0000000000000000000000000000000000000000..7d24df2a4c4defa0cd12be30e28a0bbd478f0063
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/gantt/ganttRenderer.js
@@ -0,0 +1,344 @@
+import * as d3 from 'd3'
+
+import { parser } from './parser/gantt'
+import ganttDb from './ganttDb'
+
+parser.yy = ganttDb
+
+const conf = {
+  titleTopMargin: 25,
+  barHeight: 20,
+  barGap: 4,
+  topPadding: 50,
+  rightPadding: 75,
+  leftPadding: 75,
+  gridLineStartPadding: 35,
+  fontSize: 11,
+  fontFamily: '"Open-Sans", "sans-serif"'
+}
+export const setConf = function (cnf) {
+  const keys = Object.keys(cnf)
+
+  keys.forEach(function (key) {
+    conf[key] = cnf[key]
+  })
+}
+let w
+export const draw = function (text, id) {
+  parser.yy.clear()
+  parser.parse(text)
+
+  const elem = document.getElementById(id)
+  w = elem.parentElement.offsetWidth
+
+  if (typeof w === 'undefined') {
+    w = 1200
+  }
+
+  if (typeof conf.useWidth !== 'undefined') {
+    w = conf.useWidth
+  }
+
+  const taskArray = parser.yy.getTasks()
+
+  // Set height based on number of tasks
+  const h = taskArray.length * (conf.barHeight + conf.barGap) + 2 * conf.topPadding
+
+  elem.setAttribute('height', '100%')
+  // Set viewBox
+  elem.setAttribute('viewBox', '0 0 ' + w + ' ' + h)
+  const svg = d3.select(`[id="${id}"]`)
+
+  // Set timescale
+  const timeScale = d3.scaleTime()
+    .domain([d3.min(taskArray, function (d) {
+      return d.startTime
+    }),
+    d3.max(taskArray, function (d) {
+      return d.endTime
+    })])
+    .rangeRound([0, w - conf.leftPadding - conf.rightPadding])
+
+  let categories = []
+
+  for (let i = 0; i < taskArray.length; i++) {
+    categories.push(taskArray[i].type)
+  }
+
+  const catsUnfiltered = categories // for vert labels
+
+  categories = checkUnique(categories)
+
+  makeGant(taskArray, w, h)
+  if (typeof conf.useWidth !== 'undefined') {
+    elem.setAttribute('width', w)
+  }
+
+  svg.append('text')
+    .text(parser.yy.getTitle())
+    .attr('x', w / 2)
+    .attr('y', conf.titleTopMargin)
+    .attr('class', 'titleText')
+
+  function makeGant (tasks, pageWidth, pageHeight) {
+    const barHeight = conf.barHeight
+    const gap = barHeight + conf.barGap
+    const topPadding = conf.topPadding
+    const leftPadding = conf.leftPadding
+
+    const colorScale = d3.scaleLinear()
+      .domain([0, categories.length])
+      .range(['#00B9FA', '#F95002'])
+      .interpolate(d3.interpolateHcl)
+
+    makeGrid(leftPadding, topPadding, pageWidth, pageHeight)
+    drawRects(tasks, gap, topPadding, leftPadding, barHeight, colorScale, pageWidth, pageHeight)
+    vertLabels(gap, topPadding, leftPadding, barHeight, colorScale)
+    drawToday(leftPadding, topPadding, pageWidth, pageHeight)
+  }
+
+  function drawRects (theArray, theGap, theTopPad, theSidePad, theBarHeight, theColorScale, w, h) {
+    svg.append('g')
+      .selectAll('rect')
+      .data(theArray)
+      .enter()
+      .append('rect')
+      .attr('x', 0)
+      .attr('y', function (d, i) {
+        return i * theGap + theTopPad - 2
+      })
+      .attr('width', function () {
+        return w - conf.rightPadding / 2
+      })
+      .attr('height', theGap)
+      .attr('class', function (d) {
+        for (let i = 0; i < categories.length; i++) {
+          if (d.type === categories[i]) {
+            return 'section section' + (i % conf.numberSectionStyles)
+          }
+        }
+        return 'section section0'
+      })
+
+    const rectangles = svg.append('g')
+      .selectAll('rect')
+      .data(theArray)
+      .enter()
+
+    rectangles.append('rect')
+      .attr('rx', 3)
+      .attr('ry', 3)
+      .attr('x', function (d) {
+        return timeScale(d.startTime) + theSidePad
+      })
+      .attr('y', function (d, i) {
+        return i * theGap + theTopPad
+      })
+      .attr('width', function (d) {
+        return (timeScale(d.endTime) - timeScale(d.startTime))
+      })
+      .attr('height', theBarHeight)
+      .attr('class', function (d) {
+        const res = 'task '
+
+        let secNum = 0
+        for (let i = 0; i < categories.length; i++) {
+          if (d.type === categories[i]) {
+            secNum = (i % conf.numberSectionStyles)
+          }
+        }
+
+        if (d.active) {
+          if (d.crit) {
+            return res + ' activeCrit' + secNum
+          } else {
+            return res + ' active' + secNum
+          }
+        }
+
+        if (d.done) {
+          if (d.crit) {
+            return res + ' doneCrit' + secNum
+          } else {
+            return res + ' done' + secNum
+          }
+        }
+
+        if (d.crit) {
+          return res + ' crit' + secNum
+        }
+
+        return res + ' task' + secNum
+      })
+
+    rectangles.append('text')
+      .text(function (d) {
+        return d.task
+      })
+      .attr('font-size', conf.fontSize)
+      .attr('x', function (d) {
+        const startX = timeScale(d.startTime)
+        const endX = timeScale(d.endTime)
+        const textWidth = this.getBBox().width
+
+        // Check id text width > width of rectangle
+        if (textWidth > (endX - startX)) {
+          if (endX + textWidth + 1.5 * conf.leftPadding > w) {
+            return startX + theSidePad - 5
+          } else {
+            return endX + theSidePad + 5
+          }
+        } else {
+          return (endX - startX) / 2 + startX + theSidePad
+        }
+      })
+      .attr('y', function (d, i) {
+        return i * theGap + (conf.barHeight / 2) + (conf.fontSize / 2 - 2) + theTopPad
+      })
+      .attr('text-height', theBarHeight)
+      .attr('class', function (d) {
+        const startX = timeScale(d.startTime)
+        const endX = timeScale(d.endTime)
+        const textWidth = this.getBBox().width
+        let secNum = 0
+        for (let i = 0; i < categories.length; i++) {
+          if (d.type === categories[i]) {
+            secNum = (i % conf.numberSectionStyles)
+          }
+        }
+
+        let taskType = ''
+        if (d.active) {
+          if (d.crit) {
+            taskType = 'activeCritText' + secNum
+          } else {
+            taskType = 'activeText' + secNum
+          }
+        }
+
+        if (d.done) {
+          if (d.crit) {
+            taskType = taskType + ' doneCritText' + secNum
+          } else {
+            taskType = taskType + ' doneText' + secNum
+          }
+        } else {
+          if (d.crit) {
+            taskType = taskType + ' critText' + secNum
+          }
+        }
+
+        // Check id text width > width of rectangle
+        if (textWidth > (endX - startX)) {
+          if (endX + textWidth + 1.5 * conf.leftPadding > w) {
+            return 'taskTextOutsideLeft taskTextOutside' + secNum + ' ' + taskType
+          } else {
+            return 'taskTextOutsideRight taskTextOutside' + secNum + ' ' + taskType
+          }
+        } else {
+          return 'taskText taskText' + secNum + ' ' + taskType
+        }
+      })
+  }
+
+  function makeGrid (theSidePad, theTopPad, w, h) {
+    let xAxis = d3.axisBottom(timeScale)
+      .tickSize(-h + theTopPad + conf.gridLineStartPadding)
+      .tickFormat(d3.timeFormat(parser.yy.getAxisFormat() || conf.axisFormat || '%Y-%m-%d'))
+
+    svg.append('g')
+      .attr('class', 'grid')
+      .attr('transform', 'translate(' + theSidePad + ', ' + (h - 50) + ')')
+      .call(xAxis)
+      .selectAll('text')
+      .style('text-anchor', 'middle')
+      .attr('fill', '#000')
+      .attr('stroke', 'none')
+      .attr('font-size', 10)
+      .attr('dy', '1em')
+  }
+
+  function vertLabels (theGap, theTopPad) {
+    const numOccurances = []
+    let prevGap = 0
+
+    for (let i = 0; i < categories.length; i++) {
+      numOccurances[i] = [categories[i], getCount(categories[i], catsUnfiltered)]
+    }
+
+    svg.append('g') // without doing this, impossible to put grid lines behind text
+      .selectAll('text')
+      .data(numOccurances)
+      .enter()
+      .append('text')
+      .text(function (d) {
+        return d[0]
+      })
+      .attr('x', 10)
+      .attr('y', function (d, i) {
+        if (i > 0) {
+          for (let j = 0; j < i; j++) {
+            prevGap += numOccurances[i - 1][1]
+            return d[1] * theGap / 2 + prevGap * theGap + theTopPad
+          }
+        } else {
+          return d[1] * theGap / 2 + theTopPad
+        }
+      })
+      .attr('class', function (d) {
+        for (let i = 0; i < categories.length; i++) {
+          if (d[0] === categories[i]) {
+            return 'sectionTitle sectionTitle' + (i % conf.numberSectionStyles)
+          }
+        }
+        return 'sectionTitle'
+      })
+  }
+
+  function drawToday (theSidePad, theTopPad, w, h) {
+    const todayG = svg.append('g')
+      .attr('class', 'today')
+
+    const today = new Date()
+
+    todayG.append('line')
+      .attr('x1', timeScale(today) + theSidePad)
+      .attr('x2', timeScale(today) + theSidePad)
+      .attr('y1', conf.titleTopMargin)
+      .attr('y2', h - conf.titleTopMargin)
+      .attr('class', 'today')
+  }
+
+  // from this stackexchange question: http://stackoverflow.com/questions/1890203/unique-for-arrays-in-javascript
+  function checkUnique (arr) {
+    const hash = {}
+    const result = []
+    for (let i = 0, l = arr.length; i < l; ++i) {
+      if (!hash.hasOwnProperty(arr[i])) { // it works with objects! in FF, at least
+        hash[arr[i]] = true
+        result.push(arr[i])
+      }
+    }
+    return result
+  }
+
+  // from this stackexchange question: http://stackoverflow.com/questions/14227981/count-how-many-strings-in-an-array-have-duplicates-in-the-same-array
+  function getCounts (arr) {
+    let i = arr.length // const to loop over
+    const obj = {} // obj to store results
+    while (i) {
+      obj[arr[--i]] = (obj[arr[i]] || 0) + 1 // count occurrences
+    }
+    return obj
+  }
+
+  // get specific from everything
+  function getCount (word, arr) {
+    return getCounts(arr)[word] || 0
+  }
+}
+
+export default {
+  setConf,
+  draw
+}
diff --git a/_submodules/mermaid/src/diagrams/gantt/parser/gantt.jison b/_submodules/mermaid/src/diagrams/gantt/parser/gantt.jison
new file mode 100644
index 0000000000000000000000000000000000000000..49ab3ad477e027544f2ef62de2c709c7caeda6af
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/gantt/parser/gantt.jison
@@ -0,0 +1,64 @@
+/** mermaid
+ *  https://mermaidjs.github.io/
+ *  (c) 2015 Knut Sveidqvist
+ *  MIT license.
+ */
+%lex
+
+%options case-insensitive
+
+%{
+	// Pre-lexer code can go here
+%}
+
+%%
+
+[\n]+                   return 'NL';
+\s+                     /* skip whitespace */
+\#[^\n]*                /* skip comments */
+\%%[^\n]*               /* skip comments */
+"gantt"     	        return 'gantt';
+"dateFormat"\s[^#\n;]+  return 'dateFormat';
+"axisFormat"\s[^#\n;]+  return 'axisFormat';
+\d\d\d\d"-"\d\d"-"\d\d  return 'date';
+"title"\s[^#\n;]+       return 'title';
+"section"\s[^#:\n;]+    return 'section';
+[^#:\n;]+               return 'taskTxt';
+":"[^#\n;]+             return 'taskData';
+":"                         return ':';
+<<EOF>>                     return 'EOF';
+.                           return 'INVALID';
+
+/lex
+
+%left '^'
+
+%start start
+
+%% /* language grammar */
+
+start
+	: gantt document 'EOF' { return $2; }
+	;
+
+document
+	: /* empty */ { $$ = [] }
+	| document line {$1.push($2);$$ = $1}
+	;
+
+line
+	: SPACE statement { $$ = $2 }
+	| statement { $$ = $1 }
+	| NL { $$=[];}
+	| EOF { $$=[];}
+	;
+
+statement
+	: 'dateFormat' {yy.setDateFormat($1.substr(11));$$=$1.substr(11);}
+  | 'axisFormat' {yy.setAxisFormat($1.substr(11));$$=$1.substr(11);}
+	| title {yy.setTitle($1.substr(6));$$=$1.substr(6);}
+	| section {yy.addSection($1.substr(8));$$=$1.substr(8);}
+	| taskTxt taskData {yy.addTask($1,$2);$$='task';}
+	;
+
+%%
diff --git a/_submodules/mermaid/src/diagrams/gantt/parser/gantt.js b/_submodules/mermaid/src/diagrams/gantt/parser/gantt.js
new file mode 100644
index 0000000000000000000000000000000000000000..38ff324ee092da87330859d58b37870f000f39b8
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/gantt/parser/gantt.js
@@ -0,0 +1,661 @@
+/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,8,10,11,12,13,14,15],$V1=[1,9],$V2=[1,10],$V3=[1,11],$V4=[1,12],$V5=[1,13];
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"start":3,"gantt":4,"document":5,"EOF":6,"line":7,"SPACE":8,"statement":9,"NL":10,"dateFormat":11,"axisFormat":12,"title":13,"section":14,"taskTxt":15,"taskData":16,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",11:"dateFormat",12:"axisFormat",13:"title",14:"section",15:"taskTxt",16:"taskData"},
+productions_: [0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,2]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1:
+ return $$[$0-1]; 
+break;
+case 2:
+ this.$ = [] 
+break;
+case 3:
+$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
+break;
+case 4: case 5:
+ this.$ = $$[$0] 
+break;
+case 6: case 7:
+ this.$=[];
+break;
+case 8:
+yy.setDateFormat($$[$0].substr(11));this.$=$$[$0].substr(11);
+break;
+case 9:
+yy.setAxisFormat($$[$0].substr(11));this.$=$$[$0].substr(11);
+break;
+case 10:
+yy.setTitle($$[$0].substr(6));this.$=$$[$0].substr(6);
+break;
+case 11:
+yy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);
+break;
+case 12:
+yy.addTask($$[$0-1],$$[$0]);this.$='task';
+break;
+}
+},
+table: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:$V1,12:$V2,13:$V3,14:$V4,15:$V5},o($V0,[2,7],{1:[2,1]}),o($V0,[2,3]),{9:14,11:$V1,12:$V2,13:$V3,14:$V4,15:$V5},o($V0,[2,5]),o($V0,[2,6]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),{16:[1,15]},o($V0,[2,4]),o($V0,[2,12])],
+defaultActions: {},
+parseError: function parseError(str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function (match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex() {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin(condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState() {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules() {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState(n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState(condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+	// Pre-lexer code can go here
+
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:return 10;
+break;
+case 1:/* skip whitespace */
+break;
+case 2:/* skip comments */
+break;
+case 3:/* skip comments */
+break;
+case 4:return 4;
+break;
+case 5:return 11;
+break;
+case 6:return 12;
+break;
+case 7:return 'date';
+break;
+case 8:return 13;
+break;
+case 9:return 14;
+break;
+case 10:return 15;
+break;
+case 11:return 16;
+break;
+case 12:return ':';
+break;
+case 13:return 6;
+break;
+case 14:return 'INVALID';
+break;
+}
+},
+rules: [/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],
+conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain(args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if (typeof module !== 'undefined' && require.main === module) {
+  exports.main(process.argv.slice(1));
+}
+}
\ No newline at end of file
diff --git a/_submodules/mermaid/src/diagrams/git/gitGraphAst.js b/_submodules/mermaid/src/diagrams/git/gitGraphAst.js
new file mode 100644
index 0000000000000000000000000000000000000000..e734453b761e66a73d1ab5ef5d668774fb166e83
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/git/gitGraphAst.js
@@ -0,0 +1,228 @@
+import _ from 'lodash'
+
+import { logger } from '../../logger'
+
+let commits = {}
+let head = null
+let branches = { 'master': head }
+let curBranch = 'master'
+let direction = 'LR'
+let seq = 0
+
+function getRandomInt (min, max) {
+  return Math.floor(Math.random() * (max - min)) + min
+}
+
+function getId () {
+  const pool = '0123456789abcdef'
+  let id = ''
+  for (let i = 0; i < 7; i++) {
+    id += pool[getRandomInt(0, 16)]
+  }
+  return id
+}
+
+function isfastforwardable (currentCommit, otherCommit) {
+  logger.debug('Entering isfastforwardable:', currentCommit.id, otherCommit.id)
+  while (currentCommit.seq <= otherCommit.seq && currentCommit !== otherCommit) {
+    // only if other branch has more commits
+    if (otherCommit.parent == null) break
+    if (Array.isArray(otherCommit.parent)) {
+      logger.debug('In merge commit:', otherCommit.parent)
+      return isfastforwardable(currentCommit, commits[otherCommit.parent[0]]) ||
+        isfastforwardable(currentCommit, commits[otherCommit.parent[1]])
+    } else {
+      otherCommit = commits[otherCommit.parent]
+    }
+  }
+  logger.debug(currentCommit.id, otherCommit.id)
+  return currentCommit.id === otherCommit.id
+}
+
+function isReachableFrom (currentCommit, otherCommit) {
+  const currentSeq = currentCommit.seq
+  const otherSeq = otherCommit.seq
+  if (currentSeq > otherSeq) return isfastforwardable(otherCommit, currentCommit)
+  return false
+}
+
+export const setDirection = function (dir) {
+  direction = dir
+}
+let options = {}
+export const setOptions = function (rawOptString) {
+  logger.debug('options str', rawOptString)
+  rawOptString = rawOptString && rawOptString.trim()
+  rawOptString = rawOptString || '{}'
+  try {
+    options = JSON.parse(rawOptString)
+  } catch (e) {
+    logger.error('error while parsing gitGraph options', e.message)
+  }
+}
+
+export const getOptions = function () {
+  return options
+}
+
+export const commit = function (msg) {
+  const commit = {
+    id: getId(),
+    message: msg,
+    seq: seq++,
+    parent: head == null ? null : head.id
+  }
+  head = commit
+  commits[commit.id] = commit
+  branches[curBranch] = commit.id
+  logger.debug('in pushCommit ' + commit.id)
+}
+
+export const branch = function (name) {
+  branches[name] = head != null ? head.id : null
+  logger.debug('in createBranch')
+}
+
+export const merge = function (otherBranch) {
+  const currentCommit = commits[branches[curBranch]]
+  const otherCommit = commits[branches[otherBranch]]
+  if (isReachableFrom(currentCommit, otherCommit)) {
+    logger.debug('Already merged')
+    return
+  }
+  if (isfastforwardable(currentCommit, otherCommit)) {
+    branches[curBranch] = branches[otherBranch]
+    head = commits[branches[curBranch]]
+  } else {
+    // create merge commit
+    const commit = {
+      id: getId(),
+      message: 'merged branch ' + otherBranch + ' into ' + curBranch,
+      seq: seq++,
+      parent: [head == null ? null : head.id, branches[otherBranch]]
+    }
+    head = commit
+    commits[commit.id] = commit
+    branches[curBranch] = commit.id
+  }
+  logger.debug(branches)
+  logger.debug('in mergeBranch')
+}
+
+export const checkout = function (branch) {
+  logger.debug('in checkout')
+  curBranch = branch
+  const id = branches[curBranch]
+  head = commits[id]
+}
+
+export const reset = function (commitRef) {
+  logger.debug('in reset', commitRef)
+  const ref = commitRef.split(':')[0]
+  let parentCount = parseInt(commitRef.split(':')[1])
+  let commit = ref === 'HEAD' ? head : commits[branches[ref]]
+  logger.debug(commit, parentCount)
+  while (parentCount > 0) {
+    commit = commits[commit.parent]
+    parentCount--
+    if (!commit) {
+      const err = 'Critical error - unique parent commit not found during reset'
+      logger.error(err)
+      throw err
+    }
+  }
+  head = commit
+  branches[curBranch] = commit.id
+}
+
+function upsert (arr, key, newval) {
+  const index = arr.indexOf(key)
+  if (index === -1) {
+    arr.push(newval)
+  } else {
+    arr.splice(index, 1, newval)
+  }
+}
+
+function prettyPrintCommitHistory (commitArr) {
+  const commit = _.maxBy(commitArr, 'seq')
+  let line = ''
+  commitArr.forEach(function (c) {
+    if (c === commit) {
+      line += '\t*'
+    } else {
+      line += '\t|'
+    }
+  })
+  const label = [line, commit.id, commit.seq]
+  _.each(branches, function (value, key) {
+    if (value === commit.id) label.push(key)
+  })
+  logger.debug(label.join(' '))
+  if (Array.isArray(commit.parent)) {
+    const newCommit = commits[commit.parent[0]]
+    upsert(commitArr, commit, newCommit)
+    commitArr.push(commits[commit.parent[1]])
+  } else if (commit.parent == null) {
+    return
+  } else {
+    const nextCommit = commits[commit.parent]
+    upsert(commitArr, commit, nextCommit)
+  }
+  commitArr = _.uniqBy(commitArr, 'id')
+  prettyPrintCommitHistory(commitArr)
+}
+
+export const prettyPrint = function () {
+  logger.debug(commits)
+  const node = getCommitsArray()[0]
+  prettyPrintCommitHistory([node])
+}
+
+export const clear = function () {
+  commits = {}
+  head = null
+  branches = { 'master': head }
+  curBranch = 'master'
+  seq = 0
+}
+
+export const getBranchesAsObjArray = function () {
+  const branchArr = _.map(branches, function (value, key) {
+    return { 'name': key, 'commit': commits[value] }
+  })
+  return branchArr
+}
+
+export const getBranches = function () { return branches }
+export const getCommits = function () { return commits }
+export const getCommitsArray = function () {
+  const commitArr = Object.keys(commits).map(function (key) {
+    return commits[key]
+  })
+  commitArr.forEach(function (o) { logger.debug(o.id) })
+  return _.orderBy(commitArr, ['seq'], ['desc'])
+}
+export const getCurrentBranch = function () { return curBranch }
+export const getDirection = function () { return direction }
+export const getHead = function () { return head }
+
+export default {
+  setDirection,
+  setOptions,
+  getOptions,
+  commit,
+  branch,
+  merge,
+  checkout,
+  reset,
+  prettyPrint,
+  clear,
+  getBranchesAsObjArray,
+  getBranches,
+  getCommits,
+  getCommitsArray,
+  getCurrentBranch,
+  getDirection,
+  getHead
+}
diff --git a/_submodules/mermaid/src/diagrams/git/gitGraphParser.spec.js b/_submodules/mermaid/src/diagrams/git/gitGraphParser.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..aba2812d99ac3e2166a694de1fb700960ea9b30e
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/git/gitGraphParser.spec.js
@@ -0,0 +1,241 @@
+/* eslint-env jasmine */
+import gitGraphAst from './gitGraphAst'
+import { parser } from './parser/gitGraph'
+
+describe('when parsing a gitGraph', function () {
+  beforeEach(function () {
+    parser.yy = gitGraphAst
+    parser.yy.clear()
+  })
+  it('should handle a gitGraph defintion', function () {
+    const str = 'gitGraph:\n' +
+      'commit\n'
+
+    parser.parse(str)
+    const commits = parser.yy.getCommits()
+
+    expect(Object.keys(commits).length).toBe(1)
+    expect(parser.yy.getCurrentBranch()).toBe('master')
+    expect(parser.yy.getDirection()).toBe('LR')
+    expect(Object.keys(parser.yy.getBranches()).length).toBe(1)
+  })
+
+  it('should handle a gitGraph defintion with empty options', function () {
+    const str = 'gitGraph:\n' +
+      'options\n' +
+      'end\n' +
+      'commit\n'
+
+    parser.parse(str)
+    const commits = parser.yy.getCommits()
+
+    expect(parser.yy.getOptions()).toEqual({})
+    expect(Object.keys(commits).length).toBe(1)
+    expect(parser.yy.getCurrentBranch()).toBe('master')
+    expect(parser.yy.getDirection()).toBe('LR')
+    expect(Object.keys(parser.yy.getBranches()).length).toBe(1)
+  })
+
+  it('should handle a gitGraph defintion with valid options', function () {
+    const str = 'gitGraph:\n' +
+      'options\n' +
+      '{"key": "value"}\n' +
+      'end\n' +
+      'commit\n'
+
+    parser.parse(str)
+    const commits = parser.yy.getCommits()
+    expect(parser.yy.getOptions()['key']).toBe('value')
+    expect(Object.keys(commits).length).toBe(1)
+    expect(parser.yy.getCurrentBranch()).toBe('master')
+    expect(parser.yy.getDirection()).toBe('LR')
+    expect(Object.keys(parser.yy.getBranches()).length).toBe(1)
+  })
+
+  it('should not fail on a gitGraph with malformed json', function () {
+    const str = 'gitGraph:\n' +
+      'options\n' +
+      '{"key": "value"\n' +
+      'end\n' +
+      'commit\n'
+
+    parser.parse(str)
+    const commits = parser.yy.getCommits()
+    expect(Object.keys(commits).length).toBe(1)
+    expect(parser.yy.getCurrentBranch()).toBe('master')
+    expect(parser.yy.getDirection()).toBe('LR')
+    expect(Object.keys(parser.yy.getBranches()).length).toBe(1)
+  })
+
+  it('should handle set direction', function () {
+    const str = 'gitGraph BT:\n' +
+      'commit\n'
+
+    parser.parse(str)
+    const commits = parser.yy.getCommits()
+
+    expect(Object.keys(commits).length).toBe(1)
+    expect(parser.yy.getCurrentBranch()).toBe('master')
+    expect(parser.yy.getDirection()).toBe('BT')
+    expect(Object.keys(parser.yy.getBranches()).length).toBe(1)
+  })
+
+  it('should checkout a branch', function () {
+    const str = 'gitGraph:\n' +
+      'branch new\n' +
+      'checkout new\n'
+
+    parser.parse(str)
+    const commits = parser.yy.getCommits()
+
+    expect(Object.keys(commits).length).toBe(0)
+    expect(parser.yy.getCurrentBranch()).toBe('new')
+  })
+
+  it('should add commits to checked out branch', function () {
+    const str = 'gitGraph:\n' +
+      'branch new\n' +
+      'checkout new\n' +
+      'commit\n' +
+      'commit\n'
+
+    parser.parse(str)
+    const commits = parser.yy.getCommits()
+
+    expect(Object.keys(commits).length).toBe(2)
+    expect(parser.yy.getCurrentBranch()).toBe('new')
+    const branchCommit = parser.yy.getBranches()['new']
+    expect(branchCommit).not.toBeNull()
+    expect(commits[branchCommit].parent).not.toBeNull()
+  })
+  it('should handle commit with args', function () {
+    const str = 'gitGraph:\n' +
+      'commit "a commit"\n'
+
+    parser.parse(str)
+    const commits = parser.yy.getCommits()
+
+    expect(Object.keys(commits).length).toBe(1)
+    const key = Object.keys(commits)[0]
+    expect(commits[key].message).toBe('a commit')
+    expect(parser.yy.getCurrentBranch()).toBe('master')
+  })
+
+  it('it should reset a branch', function () {
+    const str = 'gitGraph:\n' +
+      'commit\n' +
+      'commit\n' +
+      'branch newbranch\n' +
+      'checkout newbranch\n' +
+      'commit\n' +
+      'reset master\n'
+
+    parser.parse(str)
+
+    const commits = parser.yy.getCommits()
+    expect(Object.keys(commits).length).toBe(3)
+    expect(parser.yy.getCurrentBranch()).toBe('newbranch')
+    expect(parser.yy.getBranches()['newbranch']).toEqual(parser.yy.getBranches()['master'])
+    expect(parser.yy.getHead().id).toEqual(parser.yy.getBranches()['newbranch'])
+  })
+
+  it('reset can take an argument', function () {
+    const str = 'gitGraph:\n' +
+      'commit\n' +
+      'commit\n' +
+      'branch newbranch\n' +
+      'checkout newbranch\n' +
+      'commit\n' +
+      'reset master^\n'
+
+    parser.parse(str)
+
+    const commits = parser.yy.getCommits()
+    expect(Object.keys(commits).length).toBe(3)
+    expect(parser.yy.getCurrentBranch()).toBe('newbranch')
+    const master = commits[parser.yy.getBranches()['master']]
+    expect(parser.yy.getHead().id).toEqual(master.parent)
+  })
+
+  it('it should handle fast forwardable merges', function () {
+    const str = 'gitGraph:\n' +
+      'commit\n' +
+      'branch newbranch\n' +
+      'checkout newbranch\n' +
+      'commit\n' +
+      'commit\n' +
+      'checkout master\n' +
+      'merge newbranch\n'
+
+    parser.parse(str)
+
+    const commits = parser.yy.getCommits()
+    expect(Object.keys(commits).length).toBe(3)
+    expect(parser.yy.getCurrentBranch()).toBe('master')
+    expect(parser.yy.getBranches()['newbranch']).toEqual(parser.yy.getBranches()['master'])
+    expect(parser.yy.getHead().id).toEqual(parser.yy.getBranches()['newbranch'])
+  })
+
+  it('it should handle cases when merge is a noop', function () {
+    const str = 'gitGraph:\n' +
+      'commit\n' +
+      'branch newbranch\n' +
+      'checkout newbranch\n' +
+      'commit\n' +
+      'commit\n' +
+      'merge master\n'
+
+    parser.parse(str)
+
+    const commits = parser.yy.getCommits()
+    expect(Object.keys(commits).length).toBe(3)
+    expect(parser.yy.getCurrentBranch()).toBe('newbranch')
+    expect(parser.yy.getBranches()['newbranch']).not.toEqual(parser.yy.getBranches()['master'])
+    expect(parser.yy.getHead().id).toEqual(parser.yy.getBranches()['newbranch'])
+  })
+
+  it('it should handle merge with 2 parents', function () {
+    const str = 'gitGraph:\n' +
+      'commit\n' +
+      'branch newbranch\n' +
+      'checkout newbranch\n' +
+      'commit\n' +
+      'commit\n' +
+      'checkout master\n' +
+      'commit\n' +
+      'merge newbranch\n'
+
+    parser.parse(str)
+
+    const commits = parser.yy.getCommits()
+    expect(Object.keys(commits).length).toBe(5)
+    expect(parser.yy.getCurrentBranch()).toBe('master')
+    expect(parser.yy.getBranches()['newbranch']).not.toEqual(parser.yy.getBranches()['master'])
+    expect(parser.yy.getHead().id).toEqual(parser.yy.getBranches()['master'])
+  })
+
+  it('it should handle ff merge when history walk has two parents (merge commit)', function () {
+    const str = 'gitGraph:\n' +
+      'commit\n' +
+      'branch newbranch\n' +
+      'checkout newbranch\n' +
+      'commit\n' +
+      'commit\n' +
+      'checkout master\n' +
+      'commit\n' +
+      'merge newbranch\n' +
+      'commit\n' +
+      'checkout newbranch\n' +
+      'merge master\n'
+
+    parser.parse(str)
+
+    const commits = parser.yy.getCommits()
+    expect(Object.keys(commits).length).toBe(6)
+    expect(parser.yy.getCurrentBranch()).toBe('newbranch')
+    expect(parser.yy.getBranches()['newbranch']).toEqual(parser.yy.getBranches()['master'])
+    expect(parser.yy.getHead().id).toEqual(parser.yy.getBranches()['master'])
+
+    parser.yy.prettyPrint()
+  })
+})
diff --git a/_submodules/mermaid/src/diagrams/git/gitGraphRenderer.js b/_submodules/mermaid/src/diagrams/git/gitGraphRenderer.js
new file mode 100644
index 0000000000000000000000000000000000000000..3ef56478da7e4d3ffddd0c9d23c0dd639c5dcc84
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/git/gitGraphRenderer.js
@@ -0,0 +1,280 @@
+import _ from 'lodash'
+import * as d3 from 'd3'
+
+import db from './gitGraphAst'
+import gitGraphParser from './parser/gitGraph'
+import { logger } from '../../logger'
+import { interpolateToCurve } from '../../utils'
+
+let allCommitsDict = {}
+let branchNum
+let config = {
+  nodeSpacing: 150,
+  nodeFillColor: 'yellow',
+  nodeStrokeWidth: 2,
+  nodeStrokeColor: 'grey',
+  lineStrokeWidth: 4,
+  branchOffset: 50,
+  lineColor: 'grey',
+  leftMargin: 50,
+  branchColors: ['#442f74', '#983351', '#609732', '#AA9A39'],
+  nodeRadius: 10,
+  nodeLabel: {
+    width: 75,
+    height: 100,
+    x: -25,
+    y: 0
+  }
+}
+let apiConfig = {}
+export const setConf = function (c) {
+  apiConfig = c
+}
+
+function svgCreateDefs (svg) {
+  svg
+    .append('defs')
+    .append('g')
+    .attr('id', 'def-commit')
+    .append('circle')
+    .attr('r', config.nodeRadius)
+    .attr('cx', 0)
+    .attr('cy', 0)
+  svg.select('#def-commit')
+    .append('foreignObject')
+    .attr('width', config.nodeLabel.width)
+    .attr('height', config.nodeLabel.height)
+    .attr('x', config.nodeLabel.x)
+    .attr('y', config.nodeLabel.y)
+    .attr('class', 'node-label')
+    .attr('requiredFeatures', 'http://www.w3.org/TR/SVG11/feature#Extensibility')
+    .append('p')
+    .html('')
+}
+
+function svgDrawLine (svg, points, colorIdx, interpolate) {
+  const curve = interpolateToCurve(interpolate, d3.curveBasis)
+  const color = config.branchColors[colorIdx % config.branchColors.length]
+  const lineGen = d3.line()
+    .x(function (d) {
+      return Math.round(d.x)
+    })
+    .y(function (d) {
+      return Math.round(d.y)
+    })
+    .curve(curve)
+
+  svg
+    .append('svg:path')
+    .attr('d', lineGen(points))
+    .style('stroke', color)
+    .style('stroke-width', config.lineStrokeWidth)
+    .style('fill', 'none')
+}
+
+// Pass in the element and its pre-transform coords
+function getElementCoords (element, coords) {
+  coords = coords || element.node().getBBox()
+  const ctm = element.node().getCTM()
+  const xn = ctm.e + coords.x * ctm.a
+  const yn = ctm.f + coords.y * ctm.d
+  return {
+    left: xn,
+    top: yn,
+    width: coords.width,
+    height: coords.height
+  }
+}
+
+function svgDrawLineForCommits (svg, fromId, toId, direction, color) {
+  logger.debug('svgDrawLineForCommits: ', fromId, toId)
+  const fromBbox = getElementCoords(svg.select('#node-' + fromId + ' circle'))
+  const toBbox = getElementCoords(svg.select('#node-' + toId + ' circle'))
+  switch (direction) {
+    case 'LR':
+      // (toBbox)
+      //  +--------
+      //          + (fromBbox)
+      if (fromBbox.left - toBbox.left > config.nodeSpacing) {
+        const lineStart = { x: fromBbox.left - config.nodeSpacing, y: toBbox.top + toBbox.height / 2 }
+        const lineEnd = { x: toBbox.left + toBbox.width, y: toBbox.top + toBbox.height / 2 }
+        svgDrawLine(svg, [lineStart, lineEnd], color, 'linear')
+        svgDrawLine(svg, [
+          { x: fromBbox.left, y: fromBbox.top + fromBbox.height / 2 },
+          { x: fromBbox.left - config.nodeSpacing / 2, y: fromBbox.top + fromBbox.height / 2 },
+          { x: fromBbox.left - config.nodeSpacing / 2, y: lineStart.y },
+          lineStart], color)
+      } else {
+        svgDrawLine(svg, [{
+          'x': fromBbox.left,
+          'y': fromBbox.top + fromBbox.height / 2
+        }, {
+          'x': fromBbox.left - config.nodeSpacing / 2,
+          'y': fromBbox.top + fromBbox.height / 2
+        }, {
+          'x': fromBbox.left - config.nodeSpacing / 2,
+          'y': toBbox.top + toBbox.height / 2
+        }, {
+          'x': toBbox.left + toBbox.width,
+          'y': toBbox.top + toBbox.height / 2
+        }], color)
+      }
+      break
+    case 'BT':
+      //      +           (fromBbox)
+      //      |
+      //      |
+      //              +   (toBbox)
+      if (toBbox.top - fromBbox.top > config.nodeSpacing) {
+        const lineStart = { x: toBbox.left + toBbox.width / 2, y: fromBbox.top + fromBbox.height + config.nodeSpacing }
+        const lineEnd = { x: toBbox.left + toBbox.width / 2, y: toBbox.top }
+        svgDrawLine(svg, [lineStart, lineEnd], color, 'linear')
+        svgDrawLine(svg, [
+          { x: fromBbox.left + fromBbox.width / 2, y: fromBbox.top + fromBbox.height },
+          { x: fromBbox.left + fromBbox.width / 2, y: fromBbox.top + fromBbox.height + config.nodeSpacing / 2 },
+          { x: toBbox.left + toBbox.width / 2, y: lineStart.y - config.nodeSpacing / 2 },
+          lineStart], color)
+      } else {
+        svgDrawLine(svg, [{
+          'x': fromBbox.left + fromBbox.width / 2,
+          'y': fromBbox.top + fromBbox.height
+        }, {
+          'x': fromBbox.left + fromBbox.width / 2,
+          'y': fromBbox.top + config.nodeSpacing / 2
+        }, {
+          'x': toBbox.left + toBbox.width / 2,
+          'y': toBbox.top - config.nodeSpacing / 2
+        }, {
+          'x': toBbox.left + toBbox.width / 2,
+          'y': toBbox.top
+        }], color)
+      }
+      break
+  }
+}
+
+function cloneNode (svg, selector) {
+  return svg.select(selector).node().cloneNode(true)
+}
+
+function renderCommitHistory (svg, commitid, branches, direction) {
+  let commit
+  const numCommits = Object.keys(allCommitsDict).length
+  if (_.isString(commitid)) {
+    do {
+      commit = allCommitsDict[commitid]
+      logger.debug('in renderCommitHistory', commit.id, commit.seq)
+      if (svg.select('#node-' + commitid).size() > 0) {
+        return
+      }
+      svg
+        .append(function () {
+          return cloneNode(svg, '#def-commit')
+        })
+        .attr('class', 'commit')
+        .attr('id', function () {
+          return 'node-' + commit.id
+        })
+        .attr('transform', function () {
+          switch (direction) {
+            case 'LR':
+              return 'translate(' + (commit.seq * config.nodeSpacing + config.leftMargin) + ', ' +
+                (branchNum * config.branchOffset) + ')'
+            case 'BT':
+              return 'translate(' + (branchNum * config.branchOffset + config.leftMargin) + ', ' +
+                ((numCommits - commit.seq) * config.nodeSpacing) + ')'
+          }
+        })
+        .attr('fill', config.nodeFillColor)
+        .attr('stroke', config.nodeStrokeColor)
+        .attr('stroke-width', config.nodeStrokeWidth)
+
+      const branch = _.find(branches, ['commit', commit])
+      if (branch) {
+        logger.debug('found branch ', branch.name)
+        svg.select('#node-' + commit.id + ' p')
+          .append('xhtml:span')
+          .attr('class', 'branch-label')
+          .text(branch.name + ', ')
+      }
+      svg.select('#node-' + commit.id + ' p')
+        .append('xhtml:span')
+        .attr('class', 'commit-id')
+        .text(commit.id)
+      if (commit.message !== '' && direction === 'BT') {
+        svg.select('#node-' + commit.id + ' p')
+          .append('xhtml:span')
+          .attr('class', 'commit-msg')
+          .text(', ' + commit.message)
+      }
+      commitid = commit.parent
+    } while (commitid && allCommitsDict[commitid])
+  }
+
+  if (_.isArray(commitid)) {
+    logger.debug('found merge commmit', commitid)
+    renderCommitHistory(svg, commitid[0], branches, direction)
+    branchNum++
+    renderCommitHistory(svg, commitid[1], branches, direction)
+    branchNum--
+  }
+}
+
+function renderLines (svg, commit, direction, branchColor) {
+  branchColor = branchColor || 0
+  while (commit.seq > 0 && !commit.lineDrawn) {
+    if (_.isString(commit.parent)) {
+      svgDrawLineForCommits(svg, commit.id, commit.parent, direction, branchColor)
+      commit.lineDrawn = true
+      commit = allCommitsDict[commit.parent]
+    } else if (_.isArray(commit.parent)) {
+      svgDrawLineForCommits(svg, commit.id, commit.parent[0], direction, branchColor)
+      svgDrawLineForCommits(svg, commit.id, commit.parent[1], direction, branchColor + 1)
+      renderLines(svg, allCommitsDict[commit.parent[1]], direction, branchColor + 1)
+      commit.lineDrawn = true
+      commit = allCommitsDict[commit.parent[0]]
+    }
+  }
+}
+
+export const draw = function (txt, id, ver) {
+  try {
+    const parser = gitGraphParser.parser
+    parser.yy = db
+
+    logger.debug('in gitgraph renderer', txt, id, ver)
+    // Parse the graph definition
+    parser.parse(txt + '\n')
+
+    config = _.extend(config, apiConfig, db.getOptions())
+    logger.debug('effective options', config)
+    const direction = db.getDirection()
+    allCommitsDict = db.getCommits()
+    const branches = db.getBranchesAsObjArray()
+    if (direction === 'BT') {
+      config.nodeLabel.x = branches.length * config.branchOffset
+      config.nodeLabel.width = '100%'
+      config.nodeLabel.y = -1 * 2 * config.nodeRadius
+    }
+    const svg = d3.select(`[id="${id}"]`)
+    svgCreateDefs(svg)
+    branchNum = 1
+    _.each(branches, function (v) {
+      renderCommitHistory(svg, v.commit.id, branches, direction)
+      renderLines(svg, v.commit, direction)
+      branchNum++
+    })
+    svg.attr('height', function () {
+      if (direction === 'BT') return Object.keys(allCommitsDict).length * config.nodeSpacing
+      return (branches.length + 1) * config.branchOffset
+    })
+  } catch (e) {
+    logger.error('Error while rendering gitgraph')
+    logger.error(e.message)
+  }
+}
+
+export default {
+  setConf,
+  draw
+}
diff --git a/_submodules/mermaid/src/diagrams/git/parser/gitGraph.jison b/_submodules/mermaid/src/diagrams/git/parser/gitGraph.jison
new file mode 100644
index 0000000000000000000000000000000000000000..e675a56e45fba82802e940bc7b8eb074a3d89192
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/git/parser/gitGraph.jison
@@ -0,0 +1,92 @@
+
+/*
+ * Parse following
+ * gitGraph:
+ *  commit
+ *  commit
+ *  branch 
+ */
+%lex
+
+%x string
+%x options
+%options case-insensitive
+
+%%
+
+(\r?\n)+                           return 'NL';
+\s+                             /* skip all whitespace */
+\#[^\n]*                        /* skip comments */
+\%%[^\n]*                       /* skip comments */
+"gitGraph"                      return 'GG';
+"commit"                        return 'COMMIT';
+"branch"                        return 'BRANCH';
+"merge"                         return 'MERGE';
+"reset"                         return 'RESET';
+"checkout"                         return 'CHECKOUT';
+"LR"                            return 'DIR';
+"BT"                            return 'DIR';
+":"                             return ':';
+"^"                             return 'CARET'
+"options"\r?\n                       this.begin("options");
+<options>"end"\r?\n                   this.popState();
+<options>[^\n]+\r?\n                 return 'OPT';
+["]                             this.begin("string");
+<string>["]                     this.popState();
+<string>[^"]*                     return 'STR';
+[a-zA-Z][a-zA-Z0-9_]+           return 'ID';
+<<EOF>>                         return 'EOF';
+
+/lex
+
+%left '^'
+
+%start start
+
+%% /* language grammar */
+
+start
+    : GG ':' document EOF{ return $3; }
+    | GG DIR ':' document EOF {yy.setDirection($2); return $4;}
+    ;
+
+
+document
+    : /*empty*/
+    | options body { yy.setOptions($1); $$ = $2}
+    ;
+
+options
+    : options OPT {$1 +=$2; $$=$1}
+    | NL
+    ;
+body
+    : /*emmpty*/ {$$ = []}
+    | body line {$1.push($2); $$=$1;}
+    ;
+line
+    : statement NL{$$ =$1}
+    | NL
+    ;
+
+statement
+    : COMMIT commit_arg {yy.commit($2)}
+    | BRANCH ID {yy.branch($2)}
+    | CHECKOUT ID {yy.checkout($2)}
+    | MERGE ID {yy.merge($2)}
+    | RESET reset_arg {yy.reset($2)}
+    ;
+
+commit_arg
+    : /* empty */ {$$ = ""}
+    | STR {$$=$1}
+    ;
+
+reset_arg
+    : 'HEAD' reset_parents{$$ = $1+ ":" + $2 }
+    | ID reset_parents{$$ = $1+ ":"  + yy.count; yy.count = 0}
+    ;
+reset_parents
+    : /* empty */ {yy.count = 0}
+    | CARET reset_parents { yy.count += 1 }
+    ;
diff --git a/_submodules/mermaid/src/diagrams/git/parser/gitGraph.js b/_submodules/mermaid/src/diagrams/git/parser/gitGraph.js
new file mode 100644
index 0000000000000000000000000000000000000000..fd981cafb53fe346f0457b00a881b850530ce586
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/git/parser/gitGraph.js
@@ -0,0 +1,696 @@
+/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[2,3],$V1=[1,7],$V2=[7,12,15,17,19,20,21],$V3=[7,11,12,15,17,19,20,21],$V4=[2,20],$V5=[1,32];
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"start":3,"GG":4,":":5,"document":6,"EOF":7,"DIR":8,"options":9,"body":10,"OPT":11,"NL":12,"line":13,"statement":14,"COMMIT":15,"commit_arg":16,"BRANCH":17,"ID":18,"CHECKOUT":19,"MERGE":20,"RESET":21,"reset_arg":22,"STR":23,"HEAD":24,"reset_parents":25,"CARET":26,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"GG",5:":",7:"EOF",8:"DIR",11:"OPT",12:"NL",15:"COMMIT",17:"BRANCH",18:"ID",19:"CHECKOUT",20:"MERGE",21:"RESET",23:"STR",24:"HEAD",26:"CARET"},
+productions_: [0,[3,4],[3,5],[6,0],[6,2],[9,2],[9,1],[10,0],[10,2],[13,2],[13,1],[14,2],[14,2],[14,2],[14,2],[14,2],[16,0],[16,1],[22,2],[22,2],[25,0],[25,2]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1:
+ return $$[$0-1]; 
+break;
+case 2:
+yy.setDirection($$[$0-3]); return $$[$0-1];
+break;
+case 4:
+ yy.setOptions($$[$0-1]); this.$ = $$[$0]
+break;
+case 5:
+$$[$0-1] +=$$[$0]; this.$=$$[$0-1]
+break;
+case 7:
+this.$ = []
+break;
+case 8:
+$$[$0-1].push($$[$0]); this.$=$$[$0-1];
+break;
+case 9:
+this.$ =$$[$0-1]
+break;
+case 11:
+yy.commit($$[$0])
+break;
+case 12:
+yy.branch($$[$0])
+break;
+case 13:
+yy.checkout($$[$0])
+break;
+case 14:
+yy.merge($$[$0])
+break;
+case 15:
+yy.reset($$[$0])
+break;
+case 16:
+this.$ = ""
+break;
+case 17:
+this.$=$$[$0]
+break;
+case 18:
+this.$ = $$[$0-1]+ ":" + $$[$0] 
+break;
+case 19:
+this.$ = $$[$0-1]+ ":"  + yy.count; yy.count = 0
+break;
+case 20:
+yy.count = 0
+break;
+case 21:
+ yy.count += 1 
+break;
+}
+},
+table: [{3:1,4:[1,2]},{1:[3]},{5:[1,3],8:[1,4]},{6:5,7:$V0,9:6,12:$V1},{5:[1,8]},{7:[1,9]},o($V2,[2,7],{10:10,11:[1,11]}),o($V3,[2,6]),{6:12,7:$V0,9:6,12:$V1},{1:[2,1]},{7:[2,4],12:[1,15],13:13,14:14,15:[1,16],17:[1,17],19:[1,18],20:[1,19],21:[1,20]},o($V3,[2,5]),{7:[1,21]},o($V2,[2,8]),{12:[1,22]},o($V2,[2,10]),{12:[2,16],16:23,23:[1,24]},{18:[1,25]},{18:[1,26]},{18:[1,27]},{18:[1,30],22:28,24:[1,29]},{1:[2,2]},o($V2,[2,9]),{12:[2,11]},{12:[2,17]},{12:[2,12]},{12:[2,13]},{12:[2,14]},{12:[2,15]},{12:$V4,25:31,26:$V5},{12:$V4,25:33,26:$V5},{12:[2,18]},{12:$V4,25:34,26:$V5},{12:[2,19]},{12:[2,21]}],
+defaultActions: {9:[2,1],21:[2,2],23:[2,11],24:[2,17],25:[2,12],26:[2,13],27:[2,14],28:[2,15],31:[2,18],33:[2,19],34:[2,21]},
+parseError: function parseError(str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function (match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex() {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin(condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState() {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules() {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState(n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState(condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:return 12;
+break;
+case 1:/* skip all whitespace */
+break;
+case 2:/* skip comments */
+break;
+case 3:/* skip comments */
+break;
+case 4:return 4;
+break;
+case 5:return 15;
+break;
+case 6:return 17;
+break;
+case 7:return 20;
+break;
+case 8:return 21;
+break;
+case 9:return 19;
+break;
+case 10:return 8;
+break;
+case 11:return 8;
+break;
+case 12:return 5;
+break;
+case 13:return 26
+break;
+case 14:this.begin("options");
+break;
+case 15:this.popState();
+break;
+case 16:return 11;
+break;
+case 17:this.begin("string");
+break;
+case 18:this.popState();
+break;
+case 19:return 23;
+break;
+case 20:return 18;
+break;
+case 21:return 7;
+break;
+}
+},
+rules: [/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit\b)/i,/^(?:branch\b)/i,/^(?:merge\b)/i,/^(?:reset\b)/i,/^(?:checkout\b)/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:end\r?\n)/i,/^(?:[^\n]+\r?\n)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[a-zA-Z][a-zA-Z0-9_]+)/i,/^(?:$)/i],
+conditions: {"options":{"rules":[15,16],"inclusive":false},"string":{"rules":[18,19],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,20,21],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain(args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if (typeof module !== 'undefined' && require.main === module) {
+  exports.main(process.argv.slice(1));
+}
+}
\ No newline at end of file
diff --git a/_submodules/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison b/_submodules/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison
new file mode 100644
index 0000000000000000000000000000000000000000..507956ee49ad978027602a9350f8b53a4039c295
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison
@@ -0,0 +1,192 @@
+/** mermaid
+ *  https://mermaidjs.github.io/
+ *  (c) 2014-2015 Knut Sveidqvist
+ *  MIT license.
+ *
+ *  Based on js sequence diagrams jison grammr
+ *  http://bramp.github.io/js-sequence-diagrams/
+ *  (c) 2012-2013 Andrew Brampton (bramp.net)
+ *  Simplified BSD license.
+ */
+%lex
+
+%options case-insensitive
+
+// Special states for recognizing aliases
+%x ID
+%x ALIAS
+
+// A special state for grabbing text up to the first comment/newline
+%x LINE
+
+%%
+
+[\n]+                            return 'NL';
+\s+                              /* skip all whitespace */
+<ID,ALIAS,LINE>((?!\n)\s)+       /* skip same-line whitespace */
+<INITIAL,ID,ALIAS,LINE>\#[^\n]*  /* skip comments */
+\%%[^\n]*                        /* skip comments */
+"participant"     { this.begin('ID'); return 'participant'; }
+<ID>[^\->:\n,;]+?(?=((?!\n)\s)+"as"(?!\n)\s|[#\n;]|$)  { this.begin('ALIAS'); return 'ACTOR'; }
+<ALIAS>"as"       { this.popState(); this.popState(); this.begin('LINE'); return 'AS'; }
+<ALIAS>(?:)       { this.popState(); this.popState(); return 'NL'; }
+"loop"            { this.begin('LINE'); return 'loop'; }
+"opt"             { this.begin('LINE'); return 'opt'; }
+"alt"             { this.begin('LINE'); return 'alt'; }
+"else"            { this.begin('LINE'); return 'else'; }
+"par"             { this.begin('LINE'); return 'par'; }
+"and"             { this.begin('LINE'); return 'and'; }
+<LINE>[^#\n;]*    { this.popState(); return 'restOfLine'; }
+"end"             return 'end';
+"left of"         return 'left_of';
+"right of"        return 'right_of';
+"over"            return 'over';
+"note"            return 'note';
+"activate"        { this.begin('ID'); return 'activate'; }
+"deactivate"      { this.begin('ID'); return 'deactivate'; }
+"title"           return 'title';
+"sequenceDiagram" return 'SD';
+","               return ',';
+";"               return 'NL';
+[^\+\->:\n,;]+      { yytext = yytext.trim(); return 'ACTOR'; }
+"->>"             return 'SOLID_ARROW';
+"-->>"            return 'DOTTED_ARROW';
+"->"              return 'SOLID_OPEN_ARROW';
+"-->"             return 'DOTTED_OPEN_ARROW';
+\-[x]             return 'SOLID_CROSS';
+\-\-[x]           return 'DOTTED_CROSS';
+":"[^#\n;]+       return 'TXT';
+"+"               return '+';
+"-"               return '-';
+<<EOF>>           return 'NL';
+.                 return 'INVALID';
+
+/lex
+
+%left '^'
+
+%start start
+
+%% /* language grammar */
+
+start
+	: SPACE start
+	| NL start
+	| SD document { yy.apply($2);return $2; }
+	;
+
+document
+	: /* empty */ { $$ = [] }
+	| document line {$1.push($2);$$ = $1}
+	;
+
+line
+	: SPACE statement { $$ = $2 }
+	| statement { $$ = $1 }
+	| NL { $$=[];}
+	;
+
+statement
+	: 'participant' actor 'AS' restOfLine 'NL' {$2.description=$4; $$=$2;}
+	| 'participant' actor 'NL' {$$=$2;}
+	| signal 'NL'
+	| 'activate' actor 'NL' {$$={type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $2};}
+	| 'deactivate' actor 'NL' {$$={type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $2};}
+	| note_statement 'NL'
+	| title text2 'NL' {$$=[{type:'setTitle', text:$2}]}
+	| 'loop' restOfLine document end
+	{
+		$3.unshift({type: 'loopStart', loopText:$2, signalType: yy.LINETYPE.LOOP_START});
+		$3.push({type: 'loopEnd', loopText:$2, signalType: yy.LINETYPE.LOOP_END});
+		$$=$3;}
+	| opt restOfLine document end
+	{
+		$3.unshift({type: 'optStart', optText:$2, signalType: yy.LINETYPE.OPT_START});
+		$3.push({type: 'optEnd', optText:$2, signalType: yy.LINETYPE.OPT_END});
+		$$=$3;}
+	| alt restOfLine else_sections end
+	{
+		// Alt start
+		$3.unshift({type: 'altStart', altText:$2, signalType: yy.LINETYPE.ALT_START});
+		// Content in alt is already in $3
+		// End
+		$3.push({type: 'altEnd', signalType: yy.LINETYPE.ALT_END});
+		$$=$3;}
+	| par restOfLine par_sections end
+	{
+		// Parallel start
+		$3.unshift({type: 'parStart', parText:$2, signalType: yy.LINETYPE.PAR_START});
+		// Content in par is already in $3
+		// End
+		$3.push({type: 'parEnd', signalType: yy.LINETYPE.PAR_END});
+		$$=$3;}
+	;
+
+par_sections
+	: document
+	| document and restOfLine par_sections
+	{ $$ = $1.concat([{type: 'and', parText:$3, signalType: yy.LINETYPE.PAR_AND}, $4]); }
+	;
+
+else_sections
+	: document
+	| document else restOfLine else_sections
+	{ $$ = $1.concat([{type: 'else', altText:$3, signalType: yy.LINETYPE.ALT_ELSE}, $4]); }
+	;
+
+note_statement
+	: 'note' placement actor text2
+	{
+		$$ = [$3, {type:'addNote', placement:$2, actor:$3.actor, text:$4}];}
+	| 'note' 'over' actor_pair text2
+	{
+		// Coerce actor_pair into a [to, from, ...] array
+		$2 = [].concat($3, $3).slice(0, 2);
+		$2[0] = $2[0].actor;
+		$2[1] = $2[1].actor;
+		$$ = [$3, {type:'addNote', placement:yy.PLACEMENT.OVER, actor:$2.slice(0, 2), text:$4}];}
+	;
+
+spaceList
+    : SPACE spaceList
+    | SPACE
+    ;
+actor_pair
+	: actor ',' actor   { $$ = [$1, $3]; }
+	| actor             { $$ = $1; }
+	;
+
+placement
+	: 'left_of'   { $$ = yy.PLACEMENT.LEFTOF; }
+	| 'right_of'  { $$ = yy.PLACEMENT.RIGHTOF; }
+	;
+
+signal
+	: actor signaltype '+' actor text2
+	{ $$ = [$1,$4,{type: 'addMessage', from:$1.actor, to:$4.actor, signalType:$2, msg:$5},
+	              {type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $4}
+	             ]}
+	| actor signaltype '-' actor text2
+	{ $$ = [$1,$4,{type: 'addMessage', from:$1.actor, to:$4.actor, signalType:$2, msg:$5},
+	             {type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $1}
+	             ]}
+	| actor signaltype actor text2
+	{ $$ = [$1,$3,{type: 'addMessage', from:$1.actor, to:$3.actor, signalType:$2, msg:$4}]}
+	;
+
+actor
+	: ACTOR {$$={type: 'addActor', actor:$1}}
+	;
+
+signaltype
+	: SOLID_OPEN_ARROW  { $$ = yy.LINETYPE.SOLID_OPEN; }
+	| DOTTED_OPEN_ARROW { $$ = yy.LINETYPE.DOTTED_OPEN; }
+	| SOLID_ARROW       { $$ = yy.LINETYPE.SOLID; }
+	| DOTTED_ARROW      { $$ = yy.LINETYPE.DOTTED; }
+	| SOLID_CROSS       { $$ = yy.LINETYPE.SOLID_CROSS; }
+	| DOTTED_CROSS      { $$ = yy.LINETYPE.DOTTED_CROSS; }
+	;
+
+text2: TXT {$$ = $1.substring(1).trim().replace(/\\n/gm, "\n");} ;
+
+%%
diff --git a/_submodules/mermaid/src/diagrams/sequence/parser/sequenceDiagram.js b/_submodules/mermaid/src/diagrams/sequence/parser/sequenceDiagram.js
new file mode 100644
index 0000000000000000000000000000000000000000..aa94350990f6cfb09cfe3160f6e4bf2040307fd0
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/sequence/parser/sequenceDiagram.js
@@ -0,0 +1,804 @@
+/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,4],$V3=[2,4],$V4=[1,9],$V5=[1,11],$V6=[1,12],$V7=[1,14],$V8=[1,15],$V9=[1,17],$Va=[1,18],$Vb=[1,19],$Vc=[1,20],$Vd=[1,21],$Ve=[1,23],$Vf=[1,24],$Vg=[1,4,5,10,15,16,18,20,21,22,23,25,27,28,29,40],$Vh=[1,32],$Vi=[4,5,10,15,16,18,20,21,22,23,25,29,40],$Vj=[4,5,10,15,16,18,20,21,22,23,25,28,29,40],$Vk=[4,5,10,15,16,18,20,21,22,23,25,27,29,40],$Vl=[38,39,40];
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"start":3,"SPACE":4,"NL":5,"SD":6,"document":7,"line":8,"statement":9,"participant":10,"actor":11,"AS":12,"restOfLine":13,"signal":14,"activate":15,"deactivate":16,"note_statement":17,"title":18,"text2":19,"loop":20,"end":21,"opt":22,"alt":23,"else_sections":24,"par":25,"par_sections":26,"and":27,"else":28,"note":29,"placement":30,"over":31,"actor_pair":32,"spaceList":33,",":34,"left_of":35,"right_of":36,"signaltype":37,"+":38,"-":39,"ACTOR":40,"SOLID_OPEN_ARROW":41,"DOTTED_OPEN_ARROW":42,"SOLID_ARROW":43,"DOTTED_ARROW":44,"SOLID_CROSS":45,"DOTTED_CROSS":46,"TXT":47,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"SPACE",5:"NL",6:"SD",10:"participant",12:"AS",13:"restOfLine",15:"activate",16:"deactivate",18:"title",20:"loop",21:"end",22:"opt",23:"alt",25:"par",27:"and",28:"else",29:"note",31:"over",34:",",35:"left_of",36:"right_of",38:"+",39:"-",40:"ACTOR",41:"SOLID_OPEN_ARROW",42:"DOTTED_OPEN_ARROW",43:"SOLID_ARROW",44:"DOTTED_ARROW",45:"SOLID_CROSS",46:"DOTTED_CROSS",47:"TXT"},
+productions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,5],[9,3],[9,2],[9,3],[9,3],[9,2],[9,3],[9,4],[9,4],[9,4],[9,4],[26,1],[26,4],[24,1],[24,4],[17,4],[17,4],[33,2],[33,1],[32,3],[32,1],[30,1],[30,1],[14,5],[14,5],[14,4],[11,1],[37,1],[37,1],[37,1],[37,1],[37,1],[37,1],[19,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 3:
+ yy.apply($$[$0]);return $$[$0]; 
+break;
+case 4:
+ this.$ = [] 
+break;
+case 5:
+$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
+break;
+case 6: case 7:
+ this.$ = $$[$0] 
+break;
+case 8:
+ this.$=[];
+break;
+case 9:
+$$[$0-3].description=$$[$0-1]; this.$=$$[$0-3];
+break;
+case 10:
+this.$=$$[$0-1];
+break;
+case 12:
+this.$={type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]};
+break;
+case 13:
+this.$={type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-1]};
+break;
+case 15:
+this.$=[{type:'setTitle', text:$$[$0-1]}]
+break;
+case 16:
+
+		$$[$0-1].unshift({type: 'loopStart', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_START});
+		$$[$0-1].push({type: 'loopEnd', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_END});
+		this.$=$$[$0-1];
+break;
+case 17:
+
+		$$[$0-1].unshift({type: 'optStart', optText:$$[$0-2], signalType: yy.LINETYPE.OPT_START});
+		$$[$0-1].push({type: 'optEnd', optText:$$[$0-2], signalType: yy.LINETYPE.OPT_END});
+		this.$=$$[$0-1];
+break;
+case 18:
+
+		// Alt start
+		$$[$0-1].unshift({type: 'altStart', altText:$$[$0-2], signalType: yy.LINETYPE.ALT_START});
+		// Content in alt is already in $$[$0-1]
+		// End
+		$$[$0-1].push({type: 'altEnd', signalType: yy.LINETYPE.ALT_END});
+		this.$=$$[$0-1];
+break;
+case 19:
+
+		// Parallel start
+		$$[$0-1].unshift({type: 'parStart', parText:$$[$0-2], signalType: yy.LINETYPE.PAR_START});
+		// Content in par is already in $$[$0-1]
+		// End
+		$$[$0-1].push({type: 'parEnd', signalType: yy.LINETYPE.PAR_END});
+		this.$=$$[$0-1];
+break;
+case 21:
+ this.$ = $$[$0-3].concat([{type: 'and', parText:$$[$0-1], signalType: yy.LINETYPE.PAR_AND}, $$[$0]]); 
+break;
+case 23:
+ this.$ = $$[$0-3].concat([{type: 'else', altText:$$[$0-1], signalType: yy.LINETYPE.ALT_ELSE}, $$[$0]]); 
+break;
+case 24:
+
+		this.$ = [$$[$0-1], {type:'addNote', placement:$$[$0-2], actor:$$[$0-1].actor, text:$$[$0]}];
+break;
+case 25:
+
+		// Coerce actor_pair into a [to, from, ...] array
+		$$[$0-2] = [].concat($$[$0-1], $$[$0-1]).slice(0, 2);
+		$$[$0-2][0] = $$[$0-2][0].actor;
+		$$[$0-2][1] = $$[$0-2][1].actor;
+		this.$ = [$$[$0-1], {type:'addNote', placement:yy.PLACEMENT.OVER, actor:$$[$0-2].slice(0, 2), text:$$[$0]}];
+break;
+case 28:
+ this.$ = [$$[$0-2], $$[$0]]; 
+break;
+case 29:
+ this.$ = $$[$0]; 
+break;
+case 30:
+ this.$ = yy.PLACEMENT.LEFTOF; 
+break;
+case 31:
+ this.$ = yy.PLACEMENT.RIGHTOF; 
+break;
+case 32:
+ this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},
+	              {type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]}
+	             ]
+break;
+case 33:
+ this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},
+	             {type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-4]}
+	             ]
+break;
+case 34:
+ this.$ = [$$[$0-3],$$[$0-1],{type: 'addMessage', from:$$[$0-3].actor, to:$$[$0-1].actor, signalType:$$[$0-2], msg:$$[$0]}]
+break;
+case 35:
+this.$={type: 'addActor', actor:$$[$0]}
+break;
+case 36:
+ this.$ = yy.LINETYPE.SOLID_OPEN; 
+break;
+case 37:
+ this.$ = yy.LINETYPE.DOTTED_OPEN; 
+break;
+case 38:
+ this.$ = yy.LINETYPE.SOLID; 
+break;
+case 39:
+ this.$ = yy.LINETYPE.DOTTED; 
+break;
+case 40:
+ this.$ = yy.LINETYPE.SOLID_CROSS; 
+break;
+case 41:
+ this.$ = yy.LINETYPE.DOTTED_CROSS; 
+break;
+case 42:
+this.$ = $$[$0].substring(1).trim().replace(/\\n/gm, "\n");
+break;
+}
+},
+table: [{3:1,4:$V0,5:$V1,6:$V2},{1:[3]},{3:5,4:$V0,5:$V1,6:$V2},{3:6,4:$V0,5:$V1,6:$V2},o([1,4,5,10,15,16,18,20,22,23,25,29,40],$V3,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,22:$Vb,23:$Vc,25:$Vd,29:$Ve,40:$Vf},o($Vg,[2,5]),{9:25,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,22:$Vb,23:$Vc,25:$Vd,29:$Ve,40:$Vf},o($Vg,[2,7]),o($Vg,[2,8]),{11:26,40:$Vf},{5:[1,27]},{11:28,40:$Vf},{11:29,40:$Vf},{5:[1,30]},{19:31,47:$Vh},{13:[1,33]},{13:[1,34]},{13:[1,35]},{13:[1,36]},{37:37,41:[1,38],42:[1,39],43:[1,40],44:[1,41],45:[1,42],46:[1,43]},{30:44,31:[1,45],35:[1,46],36:[1,47]},o([5,12,34,41,42,43,44,45,46,47],[2,35]),o($Vg,[2,6]),{5:[1,49],12:[1,48]},o($Vg,[2,11]),{5:[1,50]},{5:[1,51]},o($Vg,[2,14]),{5:[1,52]},{5:[2,42]},o($Vi,$V3,{7:53}),o($Vi,$V3,{7:54}),o($Vj,$V3,{24:55,7:56}),o($Vk,$V3,{26:57,7:58}),{11:61,38:[1,59],39:[1,60],40:$Vf},o($Vl,[2,36]),o($Vl,[2,37]),o($Vl,[2,38]),o($Vl,[2,39]),o($Vl,[2,40]),o($Vl,[2,41]),{11:62,40:$Vf},{11:64,32:63,40:$Vf},{40:[2,30]},{40:[2,31]},{13:[1,65]},o($Vg,[2,10]),o($Vg,[2,12]),o($Vg,[2,13]),o($Vg,[2,15]),{4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[1,66],22:$Vb,23:$Vc,25:$Vd,29:$Ve,40:$Vf},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[1,67],22:$Vb,23:$Vc,25:$Vd,29:$Ve,40:$Vf},{21:[1,68]},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[2,22],22:$Vb,23:$Vc,25:$Vd,28:[1,69],29:$Ve,40:$Vf},{21:[1,70]},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:22,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[2,20],22:$Vb,23:$Vc,25:$Vd,27:[1,71],29:$Ve,40:$Vf},{11:72,40:$Vf},{11:73,40:$Vf},{19:74,47:$Vh},{19:75,47:$Vh},{19:76,47:$Vh},{34:[1,77],47:[2,29]},{5:[1,78]},o($Vg,[2,16]),o($Vg,[2,17]),o($Vg,[2,18]),{13:[1,79]},o($Vg,[2,19]),{13:[1,80]},{19:81,47:$Vh},{19:82,47:$Vh},{5:[2,34]},{5:[2,24]},{5:[2,25]},{11:83,40:$Vf},o($Vg,[2,9]),o($Vj,$V3,{7:56,24:84}),o($Vk,$V3,{7:58,26:85}),{5:[2,32]},{5:[2,33]},{47:[2,28]},{21:[2,23]},{21:[2,21]}],
+defaultActions: {5:[2,1],6:[2,2],32:[2,42],46:[2,30],47:[2,31],74:[2,34],75:[2,24],76:[2,25],81:[2,32],82:[2,33],83:[2,28],84:[2,23],85:[2,21]},
+parseError: function parseError(str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function (match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex() {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin(condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState() {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules() {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState(n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState(condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:return 5;
+break;
+case 1:/* skip all whitespace */
+break;
+case 2:/* skip same-line whitespace */
+break;
+case 3:/* skip comments */
+break;
+case 4:/* skip comments */
+break;
+case 5: this.begin('ID'); return 10; 
+break;
+case 6: this.begin('ALIAS'); return 40; 
+break;
+case 7: this.popState(); this.popState(); this.begin('LINE'); return 12; 
+break;
+case 8: this.popState(); this.popState(); return 5; 
+break;
+case 9: this.begin('LINE'); return 20; 
+break;
+case 10: this.begin('LINE'); return 22; 
+break;
+case 11: this.begin('LINE'); return 23; 
+break;
+case 12: this.begin('LINE'); return 28; 
+break;
+case 13: this.begin('LINE'); return 25; 
+break;
+case 14: this.begin('LINE'); return 27; 
+break;
+case 15: this.popState(); return 13; 
+break;
+case 16:return 21;
+break;
+case 17:return 35;
+break;
+case 18:return 36;
+break;
+case 19:return 31;
+break;
+case 20:return 29;
+break;
+case 21: this.begin('ID'); return 15; 
+break;
+case 22: this.begin('ID'); return 16; 
+break;
+case 23:return 18;
+break;
+case 24:return 6;
+break;
+case 25:return 34;
+break;
+case 26:return 5;
+break;
+case 27: yy_.yytext = yy_.yytext.trim(); return 40; 
+break;
+case 28:return 43;
+break;
+case 29:return 44;
+break;
+case 30:return 41;
+break;
+case 31:return 42;
+break;
+case 32:return 45;
+break;
+case 33:return 46;
+break;
+case 34:return 47;
+break;
+case 35:return 38;
+break;
+case 36:return 39;
+break;
+case 37:return 5;
+break;
+case 38:return 'INVALID';
+break;
+}
+},
+rules: [/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:participant\b)/i,/^(?:[^\->:\n,;]+?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\b)/i,/^(?:sequenceDiagram\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?::[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],
+conditions: {"LINE":{"rules":[2,3,15],"inclusive":false},"ALIAS":{"rules":[2,3,7,8],"inclusive":false},"ID":{"rules":[2,3,6],"inclusive":false},"INITIAL":{"rules":[0,1,3,4,5,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain(args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if (typeof module !== 'undefined' && require.main === module) {
+  exports.main(process.argv.slice(1));
+}
+}
\ No newline at end of file
diff --git a/_submodules/mermaid/src/diagrams/sequence/sequenceDb.js b/_submodules/mermaid/src/diagrams/sequence/sequenceDb.js
new file mode 100644
index 0000000000000000000000000000000000000000..665ca820d82c9d1d67863896196c76727bcad069
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/sequence/sequenceDb.js
@@ -0,0 +1,172 @@
+import { logger } from '../../logger'
+
+let actors = {}
+let messages = []
+const notes = []
+let title = ''
+
+export const addActor = function (id, name, description) {
+  // Don't allow description nulling
+  const old = actors[id]
+  if (old && name === old.name && description == null) return
+
+  // Don't allow null descriptions, either
+  if (description == null) description = name
+
+  actors[id] = { name: name, description: description }
+}
+
+export const addMessage = function (idFrom, idTo, message, answer) {
+  messages.push({ from: idFrom, to: idTo, message: message, answer: answer })
+}
+
+export const addSignal = function (idFrom, idTo, message, messageType) {
+  logger.debug('Adding message from=' + idFrom + ' to=' + idTo + ' message=' + message + ' type=' + messageType)
+  messages.push({ from: idFrom, to: idTo, message: message, type: messageType })
+}
+
+export const getMessages = function () {
+  return messages
+}
+
+export const getActors = function () {
+  return actors
+}
+export const getActor = function (id) {
+  return actors[id]
+}
+export const getActorKeys = function () {
+  return Object.keys(actors)
+}
+export const getTitle = function () {
+  return title
+}
+
+export const clear = function () {
+  actors = {}
+  messages = []
+}
+
+export const LINETYPE = {
+  SOLID: 0,
+  DOTTED: 1,
+  NOTE: 2,
+  SOLID_CROSS: 3,
+  DOTTED_CROSS: 4,
+  SOLID_OPEN: 5,
+  DOTTED_OPEN: 6,
+  LOOP_START: 10,
+  LOOP_END: 11,
+  ALT_START: 12,
+  ALT_ELSE: 13,
+  ALT_END: 14,
+  OPT_START: 15,
+  OPT_END: 16,
+  ACTIVE_START: 17,
+  ACTIVE_END: 18,
+  PAR_START: 19,
+  PAR_AND: 20,
+  PAR_END: 21
+}
+
+export const ARROWTYPE = {
+  FILLED: 0,
+  OPEN: 1
+}
+
+export const PLACEMENT = {
+  LEFTOF: 0,
+  RIGHTOF: 1,
+  OVER: 2
+}
+
+export const addNote = function (actor, placement, message) {
+  const note = { actor: actor, placement: placement, message: message }
+
+  // Coerce actor into a [to, from, ...] array
+  const actors = [].concat(actor, actor)
+
+  notes.push(note)
+  messages.push({ from: actors[0], to: actors[1], message: message, type: LINETYPE.NOTE, placement: placement })
+}
+
+export const setTitle = function (titleText) {
+  title = titleText
+}
+
+export const apply = function (param) {
+  if (param instanceof Array) {
+    param.forEach(function (item) {
+      apply(item)
+    })
+  } else {
+    switch (param.type) {
+      case 'addActor':
+        addActor(param.actor, param.actor, param.description)
+        break
+      case 'activeStart':
+        addSignal(param.actor, undefined, undefined, param.signalType)
+        break
+      case 'activeEnd':
+        addSignal(param.actor, undefined, undefined, param.signalType)
+        break
+      case 'addNote':
+        addNote(param.actor, param.placement, param.text)
+        break
+      case 'addMessage':
+        addSignal(param.from, param.to, param.msg, param.signalType)
+        break
+      case 'loopStart':
+        addSignal(undefined, undefined, param.loopText, param.signalType)
+        break
+      case 'loopEnd':
+        addSignal(undefined, undefined, undefined, param.signalType)
+        break
+      case 'optStart':
+        addSignal(undefined, undefined, param.optText, param.signalType)
+        break
+      case 'optEnd':
+        addSignal(undefined, undefined, undefined, param.signalType)
+        break
+      case 'altStart':
+        addSignal(undefined, undefined, param.altText, param.signalType)
+        break
+      case 'else':
+        addSignal(undefined, undefined, param.altText, param.signalType)
+        break
+      case 'altEnd':
+        addSignal(undefined, undefined, undefined, param.signalType)
+        break
+      case 'setTitle':
+        setTitle(param.text)
+        break
+      case 'parStart':
+        addSignal(undefined, undefined, param.parText, param.signalType)
+        break
+      case 'and':
+        addSignal(undefined, undefined, param.parText, param.signalType)
+        break
+      case 'parEnd':
+        addSignal(undefined, undefined, undefined, param.signalType)
+        break
+    }
+  }
+}
+
+export default {
+  addActor,
+  addMessage,
+  addSignal,
+  getMessages,
+  getActors,
+  getActor,
+  getActorKeys,
+  getTitle,
+  clear,
+  LINETYPE,
+  ARROWTYPE,
+  PLACEMENT,
+  addNote,
+  setTitle,
+  apply
+}
diff --git a/_submodules/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js b/_submodules/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..0631d1a610f743133fe7005a936ae51979dd35c8
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js
@@ -0,0 +1,962 @@
+/* eslint-env jasmine */
+import { parser } from './parser/sequenceDiagram'
+import sequenceDb from './sequenceDb'
+import renderer from './sequenceRenderer'
+
+function addConf (conf, key, value) {
+  if (value !== undefined) {
+    conf[key] = value
+  }
+  return conf
+}
+
+describe('when parsing a sequenceDiagram', function () {
+  beforeEach(function () {
+    parser.yy = sequenceDb
+    parser.yy.clear()
+  })
+  it('it should handle a sequenceDiagram defintion', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob:Hello Bob, how are you?\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'Bob-->Alice: I am good thanks!'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(3)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[2].from).toBe('Bob')
+  })
+  it('it should handle a sequenceDiagram definition with a title', function () {
+    const str = 'sequenceDiagram\n' +
+      'title: Diagram Title\n' +
+      'Alice->Bob:Hello Bob, how are you?\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'Bob-->Alice: I am good thanks!'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+    const title = parser.yy.getTitle()
+
+    expect(messages.length).toBe(3)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[2].from).toBe('Bob')
+    expect(title).toBe('Diagram Title')
+  })
+  it('it should space in actor names', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob:Hello Bob, how are - you?\n' +
+      'Bob-->Alice: I am good thanks!'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(2)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[1].from).toBe('Bob')
+  })
+  it('it should alias participants', function () {
+    const str = 'sequenceDiagram\n' +
+      'participant A as Alice\n' +
+      'participant B as Bob\n' +
+      'A->B:Hello Bob, how are you?\n' +
+      'B-->A: I am good thanks!'
+
+    parser.parse(str)
+
+    const actors = parser.yy.getActors()
+    expect(Object.keys(actors)).toEqual(['A', 'B'])
+    expect(actors.A.description).toBe('Alice')
+    expect(actors.B.description).toBe('Bob')
+
+    const messages = parser.yy.getMessages()
+    expect(messages.length).toBe(2)
+    expect(messages[0].from).toBe('A')
+    expect(messages[1].from).toBe('B')
+  })
+  it('it should handle in async messages', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice-xBob:Hello Bob, how are you?'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    expect(actors.Bob.description).toBe('Bob')
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(1)
+    expect(messages[0].type).toBe(parser.yy.LINETYPE.SOLID_CROSS)
+  })
+  it('it should handle in async dotted messages', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice--xBob:Hello Bob, how are you?'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    expect(actors.Bob.description).toBe('Bob')
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(1)
+    expect(messages[0].type).toBe(parser.yy.LINETYPE.DOTTED_CROSS)
+  })
+  it('it should handle in arrow messages', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->>Bob:Hello Bob, how are you?'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    expect(actors.Bob.description).toBe('Bob')
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(1)
+    expect(messages[0].type).toBe(parser.yy.LINETYPE.SOLID)
+  })
+  it('it should handle in arrow messages', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice-->>Bob:Hello Bob, how are you?'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    expect(actors.Bob.description).toBe('Bob')
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(1)
+    expect(messages[0].type).toBe(parser.yy.LINETYPE.DOTTED)
+  })
+  it('it should handle actor activation', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice-->>Bob:Hello Bob, how are you?\n' +
+      'activate Bob\n' +
+      'Bob-->>Alice:Hello Alice, I\'m fine and  you?\n' +
+      'deactivate Bob'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    expect(actors.Bob.description).toBe('Bob')
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(4)
+    expect(messages[0].type).toBe(parser.yy.LINETYPE.DOTTED)
+    expect(messages[1].type).toBe(parser.yy.LINETYPE.ACTIVE_START)
+    expect(messages[1].from.actor).toBe('Bob')
+    expect(messages[2].type).toBe(parser.yy.LINETYPE.DOTTED)
+    expect(messages[3].type).toBe(parser.yy.LINETYPE.ACTIVE_END)
+    expect(messages[3].from.actor).toBe('Bob')
+  })
+  it('it should handle actor one line notation activation', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice-->>+Bob:Hello Bob, how are you?\n' +
+      'Bob-->>- Alice:Hello Alice, I\'m fine and  you?'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    expect(actors.Bob.description).toBe('Bob')
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(4)
+    expect(messages[0].type).toBe(parser.yy.LINETYPE.DOTTED)
+    expect(messages[1].type).toBe(parser.yy.LINETYPE.ACTIVE_START)
+    expect(messages[1].from.actor).toBe('Bob')
+    expect(messages[2].type).toBe(parser.yy.LINETYPE.DOTTED)
+    expect(messages[3].type).toBe(parser.yy.LINETYPE.ACTIVE_END)
+    expect(messages[3].from.actor).toBe('Bob')
+  })
+  it('it should handle stacked activations', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice-->>+Bob:Hello Bob, how are you?\n' +
+      'Bob-->>+Carol:Carol, let me introduce Alice?\n' +
+      'Bob-->>- Alice:Hello Alice, please meet Carol?\n' +
+      'Carol->>- Bob:Oh Bob, I\'m so happy to be here!'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    expect(actors.Bob.description).toBe('Bob')
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(8)
+    expect(messages[0].type).toBe(parser.yy.LINETYPE.DOTTED)
+    expect(messages[1].type).toBe(parser.yy.LINETYPE.ACTIVE_START)
+    expect(messages[1].from.actor).toBe('Bob')
+    expect(messages[2].type).toBe(parser.yy.LINETYPE.DOTTED)
+    expect(messages[3].type).toBe(parser.yy.LINETYPE.ACTIVE_START)
+    expect(messages[3].from.actor).toBe('Carol')
+    expect(messages[5].type).toBe(parser.yy.LINETYPE.ACTIVE_END)
+    expect(messages[5].from.actor).toBe('Bob')
+    expect(messages[7].type).toBe(parser.yy.LINETYPE.ACTIVE_END)
+    expect(messages[7].from.actor).toBe('Carol')
+  })
+  it('it should handle comments in a sequenceDiagram', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      '%% Comment\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'Bob-->Alice: I am good thanks!'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(3)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[2].from).toBe('Bob')
+  })
+  it('it should handle new lines in a sequenceDiagram', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n\n' +
+      '%% Comment\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'Bob-->Alice: I am good thanks!\n'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(3)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[2].from).toBe('Bob')
+  })
+  it('it should handle semicolons', function () {
+    const str = 'sequenceDiagram;' +
+      'Alice->Bob: Hello Bob, how are you?;' +
+      'Note right of Bob: Bob thinks;' +
+      'Bob-->Alice: I am good thanks!;'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(3)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[2].from).toBe('Bob')
+  })
+  it('it should handle one leading space in lines in a sequenceDiagram', function () {
+    const str = 'sequenceDiagram\n' +
+      ' Alice->Bob: Hello Bob, how are you?\n\n' +
+      '%% Comment\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'Bob-->Alice: I am good thanks!'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(3)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[2].from).toBe('Bob')
+  })
+  it('it should handle several leading spaces in lines in a sequenceDiagram', function () {
+    const str = 'sequenceDiagram\n' +
+      '   Alice->Bob: Hello Bob, how are you?\n\n' +
+      '%% Comment\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'Bob-->Alice: I am good thanks!'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(3)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[2].from).toBe('Bob')
+  })
+  it('it should handle several leading spaces in lines in a sequenceDiagram', function () {
+    const str = 'sequenceDiagram\n' +
+      'participant Alice\n' +
+      'participant Bob\n' +
+      'Alice->John: Hello John, how are you?\n' +
+      '    loop Healthcheck\n' +
+      'John->John: Fight against hypochondria\n' +
+      ' end\n' +
+      'Note right of John: Rational thoughts<br/>prevail...\n' +
+      '    John-->Alice: Great!\n' +
+      '    John->Bob: How about you?\n' +
+      'Bob-->John: Jolly good!'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(8)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[2].from).toBe('John')
+  })
+  it('it should handle notes over a single actor', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'Note over Bob: Bob thinks\n'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].from).toBe('Bob')
+    expect(messages[1].to).toBe('Bob')
+  })
+  it('it should handle notes over multiple actors', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'Note over Alice,Bob: confusion\n' +
+      'Note over Bob,Alice: resolution\n'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].from).toBe('Alice')
+    expect(messages[1].to).toBe('Bob')
+    expect(messages[2].from).toBe('Bob')
+    expect(messages[2].to).toBe('Alice')
+  })
+  it('it should handle loop statements', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n\n' +
+      '%% Comment\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'loop Multiple happy responses\n\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(5)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[1].from).toBe('Bob')
+  })
+  it('it should handle opt statements', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n\n' +
+      '%% Comment\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'opt Perhaps a happy response\n\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(5)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[1].from).toBe('Bob')
+  })
+  it('it should handle alt statements', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n\n' +
+      '%% Comment\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'alt isWell\n\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'else isSick\n' +
+      'Bob-->Alice: Feel sick...\n' +
+      'end'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+
+    expect(actors.Alice.description).toBe('Alice')
+    actors.Bob.description = 'Bob'
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(7)
+    expect(messages[0].from).toBe('Alice')
+    expect(messages[1].from).toBe('Bob')
+  })
+  it('it should handle alt statements with multiple elses', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n\n' +
+      '%% Comment\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'alt isWell\n\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'else isSick\n' +
+      'Bob-->Alice: Feel sick...\n' +
+      'else default\n' +
+      'Bob-->Alice: :-)\n' +
+      'end'
+    parser.parse(str)
+    const messages = parser.yy.getMessages()
+    expect(messages.length).toBe(9)
+    expect(messages[1].from).toBe('Bob')
+    expect(messages[2].type).toBe(parser.yy.LINETYPE.ALT_START)
+    expect(messages[3].from).toBe('Bob')
+    expect(messages[4].type).toBe(parser.yy.LINETYPE.ALT_ELSE)
+    expect(messages[5].from).toBe('Bob')
+    expect(messages[6].type).toBe(parser.yy.LINETYPE.ALT_ELSE)
+    expect(messages[7].from).toBe('Bob')
+    expect(messages[8].type).toBe(parser.yy.LINETYPE.ALT_END)
+  })
+  it('it should handle par statements a sequenceDiagram', function () {
+    const str = 'sequenceDiagram\n' +
+      'par Parallel one\n' +
+      'Alice->>Bob: Hello Bob, how are you?\n' +
+      'Bob-->>Alice: I am good thanks!\n' +
+      'and Parallel two\n' +
+      'Alice->>Bob: Are you OK?\n' +
+      'Bob-->>Alice: Fine!\n' +
+      'and Parallel three\n' +
+      'Alice->>Bob: What do you think about it?\n' +
+      'Bob-->>Alice: It\'s good!\n' +
+      'end'
+
+    parser.parse(str)
+    const actors = parser.yy.getActors()
+
+    expect(actors.Alice.description).toBe('Alice')
+    expect(actors.Bob.description).toBe('Bob')
+
+    const messages = parser.yy.getMessages()
+
+    expect(messages.length).toBe(10)
+    expect(messages[0].message).toBe('Parallel one')
+    expect(messages[1].from).toBe('Alice')
+    expect(messages[2].from).toBe('Bob')
+  })
+  it('it should handle special characters in signals', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: -:<>,;# comment'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[0].message).toBe('-:<>,')
+  })
+  it('it should handle special characters in notes', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'Note right of Bob: -:<>,;# comment'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].message).toBe('-:<>,')
+  })
+  it('it should handle special characters in loop', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'loop -:<>,;# comment\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].message).toBe('-:<>,')
+  })
+  it('it should handle special characters in opt', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'opt -:<>,;# comment\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].message).toBe('-:<>,')
+  })
+  it('it should handle special characters in alt', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'alt -:<>,;# comment\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'else ,<>:-#; comment\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].message).toBe('-:<>,')
+    expect(messages[3].message).toBe(',<>:-')
+  })
+  it('it should handle special characters in par', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'par -:<>,;# comment\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'and ,<>:-#; comment\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].message).toBe('-:<>,')
+    expect(messages[3].message).toBe(',<>:-')
+  })
+  it('it should handle no-label loop', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'loop\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].message).toBe('')
+    expect(messages[2].message).toBe('I am good thanks!')
+  })
+  it('it should handle no-label opt', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'opt # comment\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].message).toBe('')
+    expect(messages[2].message).toBe('I am good thanks!')
+  })
+  it('it should handle no-label alt', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'alt;' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'else # comment\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].message).toBe('')
+    expect(messages[2].message).toBe('I am good thanks!')
+    expect(messages[3].message).toBe('')
+    expect(messages[4].message).toBe('I am good thanks!')
+  })
+  it('it should handle no-label par', function () {
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'par;' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'and # comment\n' +
+      'Bob-->Alice: I am good thanks!\n' +
+      'end'
+
+    parser.parse(str)
+
+    const messages = parser.yy.getMessages()
+    expect(messages[1].message).toBe('')
+    expect(messages[2].message).toBe('I am good thanks!')
+    expect(messages[3].message).toBe('')
+    expect(messages[4].message).toBe('I am good thanks!')
+  })
+})
+
+describe('when checking the bounds in a sequenceDiagram', function () {
+  let conf
+  beforeEach(function () {
+    parser.yy = sequenceDb
+    parser.yy.clear()
+    conf = {
+      diagramMarginX: 50,
+      diagramMarginY: 10,
+      actorMargin: 50,
+      width: 150,
+      // Height of actor boxes
+      height: 65,
+      boxMargin: 10,
+      messageMargin: 40,
+      boxTextMargin: 15,
+      noteMargin: 25
+    }
+    renderer.setConf(conf)
+  })
+  it('it should handle a simple bound call', function () {
+    renderer.bounds.init()
+
+    renderer.bounds.insert(100, 100, 200, 200)
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(100)
+    expect(bounds.starty).toBe(100)
+    expect(bounds.stopx).toBe(200)
+    expect(bounds.stopy).toBe(200)
+  })
+  it('it should handle an expanding bound', function () {
+    renderer.bounds.init()
+
+    renderer.bounds.insert(100, 100, 200, 200)
+    renderer.bounds.insert(25, 50, 300, 400)
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(25)
+    expect(bounds.starty).toBe(50)
+    expect(bounds.stopx).toBe(300)
+    expect(bounds.stopy).toBe(400)
+  })
+  it('it should handle inserts within the bound without changing the outer bounds', function () {
+    renderer.bounds.init()
+
+    renderer.bounds.insert(100, 100, 200, 200)
+    renderer.bounds.insert(25, 50, 300, 400)
+    renderer.bounds.insert(125, 150, 150, 200)
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(25)
+    expect(bounds.starty).toBe(50)
+    expect(bounds.stopx).toBe(300)
+    expect(bounds.stopy).toBe(400)
+  })
+  it('it should handle a loop without expanding the area', function () {
+    renderer.bounds.init()
+
+    renderer.bounds.insert(25, 50, 300, 400)
+    renderer.bounds.verticalPos = 150
+    renderer.bounds.newLoop()
+    renderer.bounds.insert(125, 150, 150, 200)
+
+    const loop = renderer.bounds.endLoop()
+
+    expect(loop.startx).toBe(125 - conf.boxMargin)
+    expect(loop.starty).toBe(150 - conf.boxMargin)
+    expect(loop.stopx).toBe(150 + conf.boxMargin)
+    expect(loop.stopy).toBe(200 + conf.boxMargin)
+
+    // Check bounds of first loop
+    const bounds = renderer.bounds.getBounds()
+
+    expect(bounds.startx).toBe(25)
+    expect(bounds.starty).toBe(50)
+    expect(bounds.stopx).toBe(300)
+    expect(bounds.stopy).toBe(400)
+  })
+  it('it should handle multiple loops withtout expanding the bounds', function () {
+    renderer.bounds.init()
+
+    renderer.bounds.insert(100, 100, 1000, 1000)
+    renderer.bounds.verticalPos = 200
+    renderer.bounds.newLoop()
+    renderer.bounds.newLoop()
+    renderer.bounds.insert(200, 200, 300, 300)
+
+    // Check bounds of first loop
+    let loop = renderer.bounds.endLoop()
+
+    expect(loop.startx).toBe(200 - conf.boxMargin)
+    expect(loop.starty).toBe(200 - conf.boxMargin)
+    expect(loop.stopx).toBe(300 + conf.boxMargin)
+    expect(loop.stopy).toBe(300 + conf.boxMargin)
+
+    // Check bounds of second loop
+    loop = renderer.bounds.endLoop()
+
+    expect(loop.startx).toBe(200 - 2 * conf.boxMargin)
+    expect(loop.starty).toBe(200 - 2 * conf.boxMargin)
+    expect(loop.stopx).toBe(300 + 2 * conf.boxMargin)
+    expect(loop.stopy).toBe(300 + 2 * conf.boxMargin)
+
+    // Check bounds of first loop
+    const bounds = renderer.bounds.getBounds()
+
+    expect(bounds.startx).toBe(100)
+    expect(bounds.starty).toBe(100)
+    expect(bounds.stopx).toBe(1000)
+    expect(bounds.stopy).toBe(1000)
+  })
+  it('it should handle a loop that expands the area', function () {
+    renderer.bounds.init()
+
+    renderer.bounds.insert(100, 100, 200, 200)
+    renderer.bounds.verticalPos = 200
+    renderer.bounds.newLoop()
+    renderer.bounds.insert(50, 50, 300, 300)
+
+    const loop = renderer.bounds.endLoop()
+
+    expect(loop.startx).toBe(50 - conf.boxMargin)
+    expect(loop.starty).toBe(50 - conf.boxMargin)
+    expect(loop.stopx).toBe(300 + conf.boxMargin)
+    expect(loop.stopy).toBe(300 + conf.boxMargin)
+
+    // Check bounds after the loop
+    const bounds = renderer.bounds.getBounds()
+
+    expect(bounds.startx).toBe(loop.startx)
+    expect(bounds.starty).toBe(loop.starty)
+    expect(bounds.stopx).toBe(loop.stopx)
+    expect(bounds.stopy).toBe(loop.stopy)
+  })
+})
+
+describe('when rendering a sequenceDiagram', function () {
+  let conf
+  beforeEach(function () {
+    parser.yy = sequenceDb
+    parser.yy.clear()
+
+    conf = {
+      diagramMarginX: 50,
+      diagramMarginY: 10,
+      actorMargin: 50,
+      width: 150,
+      // Height of actor boxes
+      height: 65,
+      boxMargin: 10,
+      messageMargin: 40,
+      boxTextMargin: 15,
+      noteMargin: 25
+    }
+    renderer.setConf(conf)
+  });
+  ['tspan', 'fo', 'old', undefined].forEach(function (textPlacement) {
+    it('it should handle one actor, when textPlacement is ' + textPlacement, function () {
+      renderer.setConf(addConf(conf, 'textPlacement', textPlacement))
+      renderer.bounds.init()
+      const str = 'sequenceDiagram\n' +
+        'participant Alice'
+
+      parser.parse(str)
+      renderer.draw(str, 'tst')
+
+      const bounds = renderer.bounds.getBounds()
+      expect(bounds.startx).toBe(0)
+      expect(bounds.starty).toBe(0)
+      expect(bounds.stopx).toBe(conf.width)
+      expect(bounds.stopy).toBe(conf.height)
+    })
+  })
+  it('it should handle one actor and a centered note', function () {
+    renderer.bounds.init()
+    const str = 'sequenceDiagram\n' +
+      'participant Alice\n' +
+      'Note over Alice: Alice thinks\n'
+
+    parser.parse(str)
+    renderer.draw(str, 'tst')
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(0)
+    expect(bounds.starty).toBe(0)
+    expect(bounds.stopx).toBe(conf.width)
+    // 10 comes from mock of text height
+    expect(bounds.stopy).toBe(conf.height + conf.boxMargin + 2 * conf.noteMargin + 10)
+  })
+  it('it should handle one actor and a note to the left', function () {
+    renderer.bounds.init()
+    const str = 'sequenceDiagram\n' +
+      'participant Alice\n' +
+      'Note left of Alice: Alice thinks'
+
+    parser.parse(str)
+    renderer.draw(str, 'tst')
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(-(conf.width / 2) - (conf.actorMargin / 2))
+    expect(bounds.starty).toBe(0)
+    expect(bounds.stopx).toBe(conf.width)
+    // 10 comes from mock of text height
+    expect(bounds.stopy).toBe(conf.height + conf.boxMargin + 2 * conf.noteMargin + 10)
+  })
+  it('it should handle one actor and a note to the right', function () {
+    renderer.bounds.init()
+    const str = 'sequenceDiagram\n' +
+      'participant Alice\n' +
+      'Note right of Alice: Alice thinks'
+
+    parser.parse(str)
+    renderer.draw(str, 'tst')
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(0)
+    expect(bounds.starty).toBe(0)
+    expect(bounds.stopx).toBe((conf.width / 2) + (conf.actorMargin / 2) + conf.width)
+    // 10 comes from mock of text height
+    expect(bounds.stopy).toBe(conf.height + conf.boxMargin + 2 * conf.noteMargin + 10)
+  })
+  it('it should handle two actors', function () {
+    renderer.bounds.init()
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?'
+
+    parser.parse(str)
+    renderer.draw(str, 'tst')
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(0)
+    expect(bounds.starty).toBe(0)
+    expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin)
+    expect(bounds.stopy).toBe(0 + conf.messageMargin + conf.height)
+  })
+  it('it should handle two actors and two centered shared notes', function () {
+    renderer.bounds.init()
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'Note over Alice,Bob: Looks\n' +
+      'Note over Bob,Alice: Looks back\n'
+
+    parser.parse(str)
+    renderer.draw(str, 'tst')
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(0)
+    expect(bounds.starty).toBe(0)
+    expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin)
+    expect(bounds.stopy).toBe(conf.height + conf.messageMargin + 2 * (conf.boxMargin + 2 * conf.noteMargin + 10))
+  })
+  it('it should draw two actors and two messages', function () {
+    renderer.bounds.init()
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'Bob->Alice: Fine!'
+
+    parser.parse(str)
+    renderer.draw(str, 'tst')
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(0)
+    expect(bounds.starty).toBe(0)
+    expect(bounds.stopx).toBe(0 + conf.width * 2 + conf.actorMargin)
+    expect(bounds.stopy).toBe(0 + 2 * conf.messageMargin + conf.height)
+  })
+  it('it should draw two actors notes to the right', function () {
+    renderer.bounds.init()
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'Note right of Bob: Bob thinks\n' +
+      'Bob->Alice: Fine!'
+
+    parser.parse(str)
+    renderer.draw(str, 'tst')
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(0)
+    expect(bounds.starty).toBe(0)
+
+    const expStopX = conf.actorMargin + conf.width + (conf.width / 2) + conf.noteMargin + conf.width
+
+    expect(bounds.stopx).toBe(expStopX)
+    expect(bounds.stopy).toBe(2 * conf.messageMargin + conf.height + conf.boxMargin + 10 + 2 * conf.noteMargin)
+  })
+  it('it should draw two actors notes to the left', function () {
+    renderer.bounds.init()
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'Note left of Alice: Bob thinks\n' +
+      'Bob->Alice: Fine!'
+
+    parser.parse(str)
+    renderer.draw(str, 'tst')
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(-(conf.width / 2) - (conf.actorMargin / 2))
+    expect(bounds.starty).toBe(0)
+
+    expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin)
+    expect(bounds.stopy).toBe(2 * conf.messageMargin + conf.height + conf.boxMargin + 10 + 2 * conf.noteMargin)
+  })
+  it('it should draw two loops', function () {
+    renderer.bounds.init()
+    const str = 'sequenceDiagram\n' +
+      'Alice->Bob: Hello Bob, how are you?\n' +
+      'loop Cheers\n' +
+      'Bob->Alice: Fine!\n' +
+      'end'
+    parser.parse(str)
+    renderer.draw(str, 'tst')
+
+    const bounds = renderer.bounds.getBounds()
+    expect(bounds.startx).toBe(0)
+    expect(bounds.starty).toBe(0)
+
+    expect(bounds.stopx).toBe(0 + conf.width * 2 + conf.actorMargin)
+    expect(bounds.stopy).toBe(0 + 2 * conf.messageMargin + conf.height + 3 * conf.boxMargin + conf.boxTextMargin)
+  })
+})
+
+describe('when rendering a sequenceDiagram with actor mirror activated', function () {
+  let conf
+  beforeEach(function () {
+    parser.yy = sequenceDb
+    parser.yy.clear()
+
+    conf = {
+      diagramMarginX: 50,
+      diagramMarginY: 10,
+      actorMargin: 50,
+      width: 150,
+      // Height of actor boxes
+      height: 65,
+      boxMargin: 10,
+      messageMargin: 40,
+      boxTextMargin: 15,
+      noteMargin: 25,
+      mirrorActors: true,
+      // Depending on css styling this might need adjustment
+      // Prolongs the edge of the diagram downwards
+      bottomMarginAdj: 1
+    }
+    renderer.setConf(conf)
+  });
+  ['tspan', 'fo', 'old', undefined].forEach(function (textPlacement) {
+    it('it should handle one actor, when textPlacement is' + textPlacement, function () {
+      renderer.setConf(addConf(conf, 'textPlacement', textPlacement))
+      renderer.bounds.init()
+      const str = 'sequenceDiagram\n' +
+        'participant Alice'
+
+      parser.parse(str)
+      renderer.draw(str, 'tst')
+
+      const bounds = renderer.bounds.getBounds()
+      expect(bounds.startx).toBe(0)
+      expect(bounds.starty).toBe(0)
+      expect(bounds.stopx).toBe(conf.width)
+      expect(bounds.stopy).toBe(2 * conf.height + 2 * conf.boxMargin)
+    })
+  })
+})
diff --git a/_submodules/mermaid/src/diagrams/sequence/sequenceRenderer.js b/_submodules/mermaid/src/diagrams/sequence/sequenceRenderer.js
new file mode 100644
index 0000000000000000000000000000000000000000..fcf41d28eabb88c092f29264c50e067cd6c28109
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/sequence/sequenceRenderer.js
@@ -0,0 +1,496 @@
+import * as d3 from 'd3'
+
+import svgDraw from './svgDraw'
+import { logger } from '../../logger'
+import { parser } from './parser/sequenceDiagram'
+import sequenceDb from './sequenceDb'
+
+parser.yy = sequenceDb
+
+const conf = {
+
+  diagramMarginX: 50,
+  diagramMarginY: 30,
+  // Margin between actors
+  actorMargin: 50,
+  // Width of actor boxes
+  width: 150,
+  // Height of actor boxes
+  height: 65,
+  // Margin around loop boxes
+  boxMargin: 10,
+  boxTextMargin: 5,
+  noteMargin: 10,
+  // Space between messages
+  messageMargin: 35,
+  // mirror actors under diagram
+  mirrorActors: false,
+  // Depending on css styling this might need adjustment
+  // Prolongs the edge of the diagram downwards
+  bottomMarginAdj: 1,
+
+  // width of activation box
+  activationWidth: 10,
+
+  // text placement as: tspan | fo | old only text as before
+  textPlacement: 'tspan'
+}
+
+export const bounds = {
+  data: {
+    startx: undefined,
+    stopx: undefined,
+    starty: undefined,
+    stopy: undefined
+  },
+  verticalPos: 0,
+
+  sequenceItems: [],
+  activations: [],
+  init: function () {
+    this.sequenceItems = []
+    this.activations = []
+    this.data = {
+      startx: undefined,
+      stopx: undefined,
+      starty: undefined,
+      stopy: undefined
+    }
+    this.verticalPos = 0
+  },
+  updateVal: function (obj, key, val, fun) {
+    if (typeof obj[key] === 'undefined') {
+      obj[key] = val
+    } else {
+      obj[key] = fun(val, obj[key])
+    }
+  },
+  updateBounds: function (startx, starty, stopx, stopy) {
+    const _self = this
+    let cnt = 0
+    function updateFn (type) {
+      return function updateItemBounds (item) {
+        cnt++
+        // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems
+        const n = _self.sequenceItems.length - cnt + 1
+
+        _self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min)
+        _self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max)
+
+        _self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min)
+        _self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max)
+
+        if (!(type === 'activation')) {
+          _self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min)
+          _self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max)
+
+          _self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min)
+          _self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max)
+        }
+      }
+    }
+
+    this.sequenceItems.forEach(updateFn())
+    this.activations.forEach(updateFn('activation'))
+  },
+  insert: function (startx, starty, stopx, stopy) {
+    const _startx = Math.min(startx, stopx)
+    const _stopx = Math.max(startx, stopx)
+    const _starty = Math.min(starty, stopy)
+    const _stopy = Math.max(starty, stopy)
+
+    this.updateVal(bounds.data, 'startx', _startx, Math.min)
+    this.updateVal(bounds.data, 'starty', _starty, Math.min)
+    this.updateVal(bounds.data, 'stopx', _stopx, Math.max)
+    this.updateVal(bounds.data, 'stopy', _stopy, Math.max)
+
+    this.updateBounds(_startx, _starty, _stopx, _stopy)
+  },
+  newActivation: function (message, diagram) {
+    const actorRect = parser.yy.getActors()[message.from.actor]
+    const stackedSize = actorActivations(message.from.actor).length
+    const x = actorRect.x + conf.width / 2 + (stackedSize - 1) * conf.activationWidth / 2
+    this.activations.push({
+      startx: x,
+      starty: this.verticalPos + 2,
+      stopx: x + conf.activationWidth,
+      stopy: undefined,
+      actor: message.from.actor,
+      anchored: svgDraw.anchorElement(diagram)
+    })
+  },
+  endActivation: function (message) {
+    // find most recent activation for given actor
+    const lastActorActivationIdx = this.activations
+      .map(function (activation) { return activation.actor })
+      .lastIndexOf(message.from.actor)
+    const activation = this.activations.splice(lastActorActivationIdx, 1)[0]
+    return activation
+  },
+  newLoop: function (title) {
+    this.sequenceItems.push({ startx: undefined, starty: this.verticalPos, stopx: undefined, stopy: undefined, title: title })
+  },
+  endLoop: function () {
+    const loop = this.sequenceItems.pop()
+    return loop
+  },
+  addSectionToLoop: function (message) {
+    const loop = this.sequenceItems.pop()
+    loop.sections = loop.sections || []
+    loop.sectionTitles = loop.sectionTitles || []
+    loop.sections.push(bounds.getVerticalPos())
+    loop.sectionTitles.push(message)
+    this.sequenceItems.push(loop)
+  },
+  bumpVerticalPos: function (bump) {
+    this.verticalPos = this.verticalPos + bump
+    this.data.stopy = this.verticalPos
+  },
+  getVerticalPos: function () {
+    return this.verticalPos
+  },
+  getBounds: function () {
+    return this.data
+  }
+}
+
+const _drawLongText = (text, x, y, g, width) => {
+  let textHeight = 0
+  const lines = text.split(/<br\/?>/ig)
+  for (const line of lines) {
+    const textObj = svgDraw.getTextObj()
+    textObj.x = x
+    textObj.y = y + textHeight
+    textObj.textMargin = conf.noteMargin
+    textObj.dy = '1em'
+    textObj.text = line
+    textObj.class = 'noteText'
+    const textElem = svgDraw.drawText(g, textObj, width)
+    textHeight += (textElem._groups || textElem)[0][0].getBBox().height
+  }
+  return textHeight
+}
+
+/**
+ * Draws an actor in the diagram with the attaced line
+ * @param center - The center of the the actor
+ * @param pos The position if the actor in the liost of actors
+ * @param description The text in the box
+ */
+const drawNote = function (elem, startx, verticalPos, msg, forceWidth) {
+  const rect = svgDraw.getNoteRect()
+  rect.x = startx
+  rect.y = verticalPos
+  rect.width = forceWidth || conf.width
+  rect.class = 'note'
+
+  let g = elem.append('g')
+  const rectElem = svgDraw.drawRect(g, rect)
+
+  const textHeight = _drawLongText(msg.message, startx - 4, verticalPos + 24, g, rect.width - conf.noteMargin)
+
+  bounds.insert(startx, verticalPos, startx + rect.width, verticalPos + 2 * conf.noteMargin + textHeight)
+  rectElem.attr('height', textHeight + 2 * conf.noteMargin)
+  bounds.bumpVerticalPos(textHeight + 2 * conf.noteMargin)
+}
+
+/**
+ * Draws a message
+ * @param elem
+ * @param startx
+ * @param stopx
+ * @param verticalPos
+ * @param txtCenter
+ * @param msg
+ */
+const drawMessage = function (elem, startx, stopx, verticalPos, msg) {
+  const g = elem.append('g')
+  const txtCenter = startx + (stopx - startx) / 2
+
+  const textElem = g.append('text') // text label for the x axis
+    .attr('x', txtCenter)
+    .attr('y', verticalPos - 7)
+    .style('text-anchor', 'middle')
+    .attr('class', 'messageText')
+    .text(msg.message)
+
+  let textWidth = (textElem._groups || textElem)[0][0].getBBox().width
+
+  let line
+  if (startx === stopx) {
+    line = g.append('path')
+      .attr('d', 'M ' + startx + ',' + verticalPos + ' C ' + (startx + 60) + ',' + (verticalPos - 10) + ' ' + (startx + 60) + ',' +
+      (verticalPos + 30) + ' ' + startx + ',' + (verticalPos + 20))
+
+    bounds.bumpVerticalPos(30)
+    const dx = Math.max(textWidth / 2, 100)
+    bounds.insert(startx - dx, bounds.getVerticalPos() - 10, stopx + dx, bounds.getVerticalPos())
+  } else {
+    line = g.append('line')
+    line.attr('x1', startx)
+    line.attr('y1', verticalPos)
+    line.attr('x2', stopx)
+    line.attr('y2', verticalPos)
+    bounds.insert(startx, bounds.getVerticalPos() - 10, stopx, bounds.getVerticalPos())
+  }
+  // Make an SVG Container
+  // Draw the line
+  if (msg.type === parser.yy.LINETYPE.DOTTED || msg.type === parser.yy.LINETYPE.DOTTED_CROSS || msg.type === parser.yy.LINETYPE.DOTTED_OPEN) {
+    line.style('stroke-dasharray', ('3, 3'))
+    line.attr('class', 'messageLine1')
+  } else {
+    line.attr('class', 'messageLine0')
+  }
+
+  let url = ''
+  if (conf.arrowMarkerAbsolute) {
+    url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search
+    url = url.replace(/\(/g, '\\(')
+    url = url.replace(/\)/g, '\\)')
+  }
+
+  line.attr('stroke-width', 2)
+  line.attr('stroke', 'black')
+  line.style('fill', 'none') // remove any fill colour
+  if (msg.type === parser.yy.LINETYPE.SOLID || msg.type === parser.yy.LINETYPE.DOTTED) {
+    line.attr('marker-end', 'url(' + url + '#arrowhead)')
+  }
+
+  if (msg.type === parser.yy.LINETYPE.SOLID_CROSS || msg.type === parser.yy.LINETYPE.DOTTED_CROSS) {
+    line.attr('marker-end', 'url(' + url + '#crosshead)')
+  }
+}
+
+export const drawActors = function (diagram, actors, actorKeys, verticalPos) {
+  // Draw the actors
+  for (let i = 0; i < actorKeys.length; i++) {
+    const key = actorKeys[i]
+
+    // Add some rendering data to the object
+    actors[key].x = i * conf.actorMargin + i * conf.width
+    actors[key].y = verticalPos
+    actors[key].width = conf.diagramMarginX
+    actors[key].height = conf.diagramMarginY
+
+    // Draw the box with the attached line
+    svgDraw.drawActor(diagram, actors[key].x, verticalPos, actors[key].description, conf)
+    bounds.insert(actors[key].x, verticalPos, actors[key].x + conf.width, conf.height)
+  }
+
+  // Add a margin between the actor boxes and the first arrow
+  bounds.bumpVerticalPos(conf.height)
+}
+
+export const setConf = function (cnf) {
+  const keys = Object.keys(cnf)
+
+  keys.forEach(function (key) {
+    conf[key] = cnf[key]
+  })
+}
+
+const actorActivations = function (actor) {
+  return bounds.activations.filter(function (activation) {
+    return activation.actor === actor
+  })
+}
+
+const actorFlowVerticaBounds = function (actor) {
+  // handle multiple stacked activations for same actor
+  const actors = parser.yy.getActors()
+  const activations = actorActivations(actor)
+
+  const left = activations.reduce(function (acc, activation) { return Math.min(acc, activation.startx) }, actors[actor].x + conf.width / 2)
+  const right = activations.reduce(function (acc, activation) { return Math.max(acc, activation.stopx) }, actors[actor].x + conf.width / 2)
+  return [left, right]
+}
+
+/**
+ * Draws a flowchart in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+export const draw = function (text, id) {
+  parser.yy.clear()
+  parser.parse(text + '\n')
+
+  bounds.init()
+  const diagram = d3.select(`[id="${id}"]`)
+
+  let startx
+  let stopx
+  let forceWidth
+
+  // Fetch data from the parsing
+  const actors = parser.yy.getActors()
+  const actorKeys = parser.yy.getActorKeys()
+  const messages = parser.yy.getMessages()
+  const title = parser.yy.getTitle()
+  drawActors(diagram, actors, actorKeys, 0)
+
+  // The arrow head definition is attached to the svg once
+  svgDraw.insertArrowHead(diagram)
+  svgDraw.insertArrowCrossHead(diagram)
+
+  function activeEnd (msg, verticalPos) {
+    const activationData = bounds.endActivation(msg)
+    if (activationData.starty + 18 > verticalPos) {
+      activationData.starty = verticalPos - 6
+      verticalPos += 12
+    }
+    svgDraw.drawActivation(diagram, activationData, verticalPos, conf)
+
+    bounds.insert(activationData.startx, verticalPos - 10, activationData.stopx, verticalPos)
+  }
+
+  // const lastMsg
+
+  // Draw the messages/signals
+  messages.forEach(function (msg) {
+    let loopData
+    switch (msg.type) {
+      case parser.yy.LINETYPE.NOTE:
+        bounds.bumpVerticalPos(conf.boxMargin)
+
+        startx = actors[msg.from].x
+        stopx = actors[msg.to].x
+
+        if (msg.placement === parser.yy.PLACEMENT.RIGHTOF) {
+          drawNote(diagram, startx + (conf.width + conf.actorMargin) / 2, bounds.getVerticalPos(), msg)
+        } else if (msg.placement === parser.yy.PLACEMENT.LEFTOF) {
+          drawNote(diagram, startx - (conf.width + conf.actorMargin) / 2, bounds.getVerticalPos(), msg)
+        } else if (msg.to === msg.from) {
+          // Single-actor over
+          drawNote(diagram, startx, bounds.getVerticalPos(), msg)
+        } else {
+          // Multi-actor over
+          forceWidth = Math.abs(startx - stopx) + conf.actorMargin
+          drawNote(diagram, (startx + stopx + conf.width - forceWidth) / 2, bounds.getVerticalPos(), msg,
+            forceWidth)
+        }
+        break
+      case parser.yy.LINETYPE.ACTIVE_START:
+        bounds.newActivation(msg, diagram)
+        break
+      case parser.yy.LINETYPE.ACTIVE_END:
+        activeEnd(msg, bounds.getVerticalPos())
+        break
+      case parser.yy.LINETYPE.LOOP_START:
+        bounds.bumpVerticalPos(conf.boxMargin)
+        bounds.newLoop(msg.message)
+        bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin)
+        break
+      case parser.yy.LINETYPE.LOOP_END:
+        loopData = bounds.endLoop()
+
+        svgDraw.drawLoop(diagram, loopData, 'loop', conf)
+        bounds.bumpVerticalPos(conf.boxMargin)
+        break
+      case parser.yy.LINETYPE.OPT_START:
+        bounds.bumpVerticalPos(conf.boxMargin)
+        bounds.newLoop(msg.message)
+        bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin)
+        break
+      case parser.yy.LINETYPE.OPT_END:
+        loopData = bounds.endLoop()
+
+        svgDraw.drawLoop(diagram, loopData, 'opt', conf)
+        bounds.bumpVerticalPos(conf.boxMargin)
+        break
+      case parser.yy.LINETYPE.ALT_START:
+        bounds.bumpVerticalPos(conf.boxMargin)
+        bounds.newLoop(msg.message)
+        bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin)
+        break
+      case parser.yy.LINETYPE.ALT_ELSE:
+        bounds.bumpVerticalPos(conf.boxMargin)
+        loopData = bounds.addSectionToLoop(msg.message)
+        bounds.bumpVerticalPos(conf.boxMargin)
+        break
+      case parser.yy.LINETYPE.ALT_END:
+        loopData = bounds.endLoop()
+
+        svgDraw.drawLoop(diagram, loopData, 'alt', conf)
+        bounds.bumpVerticalPos(conf.boxMargin)
+        break
+      case parser.yy.LINETYPE.PAR_START:
+        bounds.bumpVerticalPos(conf.boxMargin)
+        bounds.newLoop(msg.message)
+        bounds.bumpVerticalPos(conf.boxMargin + conf.boxTextMargin)
+        break
+      case parser.yy.LINETYPE.PAR_AND:
+        bounds.bumpVerticalPos(conf.boxMargin)
+        loopData = bounds.addSectionToLoop(msg.message)
+        bounds.bumpVerticalPos(conf.boxMargin)
+        break
+      case parser.yy.LINETYPE.PAR_END:
+        loopData = bounds.endLoop()
+        svgDraw.drawLoop(diagram, loopData, 'par', conf)
+        bounds.bumpVerticalPos(conf.boxMargin)
+        break
+      default:
+        try {
+          // lastMsg = msg
+          bounds.bumpVerticalPos(conf.messageMargin)
+          const fromBounds = actorFlowVerticaBounds(msg.from)
+          const toBounds = actorFlowVerticaBounds(msg.to)
+          const fromIdx = fromBounds[0] <= toBounds[0] ? 1 : 0
+          const toIdx = fromBounds[0] < toBounds[0] ? 0 : 1
+          startx = fromBounds[fromIdx]
+          stopx = toBounds[toIdx]
+
+          const verticalPos = bounds.getVerticalPos()
+          drawMessage(diagram, startx, stopx, verticalPos, msg)
+          const allBounds = fromBounds.concat(toBounds)
+          bounds.insert(Math.min.apply(null, allBounds), verticalPos, Math.max.apply(null, allBounds), verticalPos)
+        } catch (e) {
+          logger.error('error while drawing message', e)
+        }
+    }
+  })
+
+  if (conf.mirrorActors) {
+    // Draw actors below diagram
+    bounds.bumpVerticalPos(conf.boxMargin * 2)
+    drawActors(diagram, actors, actorKeys, bounds.getVerticalPos())
+  }
+
+  const box = bounds.getBounds()
+
+  // Adjust line height of actor lines now that the height of the diagram is known
+  logger.debug('For line height fix Querying: #' + id + ' .actor-line')
+  const actorLines = d3.selectAll('#' + id + ' .actor-line')
+  actorLines.attr('y2', box.stopy)
+
+  let height = box.stopy - box.starty + 2 * conf.diagramMarginY
+  if (conf.mirrorActors) {
+    height = height - conf.boxMargin + conf.bottomMarginAdj
+  }
+
+  const width = (box.stopx - box.startx) + (2 * conf.diagramMarginX)
+
+  if (title) {
+    diagram.append('text')
+      .text(title)
+      .attr('x', ((box.stopx - box.startx) / 2) - (2 * conf.diagramMarginX))
+      .attr('y', -25)
+  }
+
+  if (conf.useMaxWidth) {
+    diagram.attr('height', '100%')
+    diagram.attr('width', '100%')
+    diagram.attr('style', 'max-width:' + (width) + 'px;')
+  } else {
+    diagram.attr('height', height)
+    diagram.attr('width', width)
+  }
+  const extraVertForTitle = title ? 40 : 0
+  diagram.attr('viewBox', (box.startx - conf.diagramMarginX) + ' -' + (conf.diagramMarginY + extraVertForTitle) + ' ' + width + ' ' + (height + extraVertForTitle))
+}
+
+export default {
+  bounds,
+  drawActors,
+  setConf,
+  draw
+}
diff --git a/_submodules/mermaid/src/diagrams/sequence/svgDraw.js b/_submodules/mermaid/src/diagrams/sequence/svgDraw.js
new file mode 100644
index 0000000000000000000000000000000000000000..29dbbafba57237f9ec987edc7c030c2df474dca8
--- /dev/null
+++ b/_submodules/mermaid/src/diagrams/sequence/svgDraw.js
@@ -0,0 +1,313 @@
+export const drawRect = function (elem, rectData) {
+  const rectElem = elem.append('rect')
+  rectElem.attr('x', rectData.x)
+  rectElem.attr('y', rectData.y)
+  rectElem.attr('fill', rectData.fill)
+  rectElem.attr('stroke', rectData.stroke)
+  rectElem.attr('width', rectData.width)
+  rectElem.attr('height', rectData.height)
+  rectElem.attr('rx', rectData.rx)
+  rectElem.attr('ry', rectData.ry)
+
+  if (typeof rectData.class !== 'undefined') {
+    rectElem.attr('class', rectData.class)
+  }
+
+  return rectElem
+}
+
+export const drawText = function (elem, textData, width) {
+  // Remove and ignore br:s
+  const nText = textData.text.replace(/<br\/?>/ig, ' ')
+
+  const textElem = elem.append('text')
+  textElem.attr('x', textData.x)
+  textElem.attr('y', textData.y)
+  textElem.style('text-anchor', textData.anchor)
+  textElem.attr('fill', textData.fill)
+  if (typeof textData.class !== 'undefined') {
+    textElem.attr('class', textData.class)
+  }
+
+  const span = textElem.append('tspan')
+  span.attr('x', textData.x + textData.textMargin * 2)
+  span.attr('fill', textData.fill)
+  span.text(nText)
+
+  return textElem
+}
+
+export const drawLabel = function (elem, txtObject) {
+  function genPoints (x, y, width, height, cut) {
+    return x + ',' + y + ' ' +
+      (x + width) + ',' + y + ' ' +
+      (x + width) + ',' + (y + height - cut) + ' ' +
+      (x + width - cut * 1.2) + ',' + (y + height) + ' ' +
+      (x) + ',' + (y + height)
+  }
+  const polygon = elem.append('polygon')
+  polygon.attr('points', genPoints(txtObject.x, txtObject.y, 50, 20, 7))
+  polygon.attr('class', 'labelBox')
+
+  txtObject.y = txtObject.y + txtObject.labelMargin
+  txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin
+  drawText(elem, txtObject)
+}
+
+let actorCnt = -1
+/**
+ * Draws an actor in the diagram with the attaced line
+ * @param center - The center of the the actor
+ * @param pos The position if the actor in the liost of actors
+ * @param description The text in the box
+ */
+export const drawActor = function (elem, left, verticalPos, description, conf) {
+  const center = left + (conf.width / 2)
+  const g = elem.append('g')
+  if (verticalPos === 0) {
+    actorCnt++
+    g.append('line')
+      .attr('id', 'actor' + actorCnt)
+      .attr('x1', center)
+      .attr('y1', 5)
+      .attr('x2', center)
+      .attr('y2', 2000)
+      .attr('class', 'actor-line')
+      .attr('stroke-width', '0.5px')
+      .attr('stroke', '#999')
+  }
+
+  const rect = getNoteRect()
+  rect.x = left
+  rect.y = verticalPos
+  rect.fill = '#eaeaea'
+  rect.width = conf.width
+  rect.height = conf.height
+  rect.class = 'actor'
+  rect.rx = 3
+  rect.ry = 3
+  drawRect(g, rect)
+
+  _drawTextCandidateFunc(conf)(description, g,
+    rect.x, rect.y, rect.width, rect.height, { 'class': 'actor' })
+}
+
+export const anchorElement = function (elem) {
+  return elem.append('g')
+}
+/**
+ * Draws an actor in the diagram with the attaced line
+ * @param elem - element to append activation rect
+ * @param bounds - activation box bounds
+ * @param verticalPos - precise y cooridnate of bottom activation box edge
+ */
+export const drawActivation = function (elem, bounds, verticalPos) {
+  const rect = getNoteRect()
+  const g = bounds.anchored
+  rect.x = bounds.startx
+  rect.y = bounds.starty
+  rect.fill = '#f4f4f4'
+  rect.width = bounds.stopx - bounds.startx
+  rect.height = verticalPos - bounds.starty
+  drawRect(g, rect)
+}
+
+/**
+ * Draws an actor in the diagram with the attaced line
+ * @param center - The center of the the actor
+ * @param pos The position if the actor in the list of actors
+ * @param description The text in the box
+ */
+export const drawLoop = function (elem, bounds, labelText, conf) {
+  const g = elem.append('g')
+  const drawLoopLine = function (startx, starty, stopx, stopy) {
+    return g.append('line')
+      .attr('x1', startx)
+      .attr('y1', starty)
+      .attr('x2', stopx)
+      .attr('y2', stopy)
+      .attr('class', 'loopLine')
+  }
+  drawLoopLine(bounds.startx, bounds.starty, bounds.stopx, bounds.starty)
+  drawLoopLine(bounds.stopx, bounds.starty, bounds.stopx, bounds.stopy)
+  drawLoopLine(bounds.startx, bounds.stopy, bounds.stopx, bounds.stopy)
+  drawLoopLine(bounds.startx, bounds.starty, bounds.startx, bounds.stopy)
+  if (typeof bounds.sections !== 'undefined') {
+    bounds.sections.forEach(function (item) {
+      drawLoopLine(bounds.startx, item, bounds.stopx, item).style('stroke-dasharray', '3, 3')
+    })
+  }
+
+  let txt = getTextObj()
+  txt.text = labelText
+  txt.x = bounds.startx
+  txt.y = bounds.starty
+  txt.labelMargin = 1.5 * 10 // This is the small box that says "loop"
+  txt.class = 'labelText' // Its size & position are fixed.
+
+  drawLabel(g, txt)
+
+  txt = getTextObj()
+  txt.text = '[ ' + bounds.title + ' ]'
+  txt.x = bounds.startx + (bounds.stopx - bounds.startx) / 2
+  txt.y = bounds.starty + 1.5 * conf.boxMargin
+  txt.anchor = 'middle'
+  txt.class = 'loopText'
+
+  drawText(g, txt)
+
+  if (typeof bounds.sectionTitles !== 'undefined') {
+    bounds.sectionTitles.forEach(function (item, idx) {
+      if (item !== '') {
+        txt.text = '[ ' + item + ' ]'
+        txt.y = bounds.sections[idx] + 1.5 * conf.boxMargin
+        drawText(g, txt)
+      }
+    })
+  }
+}
+
+/**
+ * Setup arrow head and define the marker. The result is appended to the svg.
+ */
+export const insertArrowHead = function (elem) {
+  elem.append('defs').append('marker')
+    .attr('id', 'arrowhead')
+    .attr('refX', 5)
+    .attr('refY', 2)
+    .attr('markerWidth', 6)
+    .attr('markerHeight', 4)
+    .attr('orient', 'auto')
+    .append('path')
+    .attr('d', 'M 0,0 V 4 L6,2 Z') // this is actual shape for arrowhead
+}
+/**
+ * Setup arrow head and define the marker. The result is appended to the svg.
+ */
+export const insertArrowCrossHead = function (elem) {
+  const defs = elem.append('defs')
+  const marker = defs.append('marker')
+    .attr('id', 'crosshead')
+    .attr('markerWidth', 15)
+    .attr('markerHeight', 8)
+    .attr('orient', 'auto')
+    .attr('refX', 16)
+    .attr('refY', 4)
+
+  // The arrow
+  marker.append('path')
+    .attr('fill', 'black')
+    .attr('stroke', '#000000')
+    .style('stroke-dasharray', ('0, 0'))
+    .attr('stroke-width', '1px')
+    .attr('d', 'M 9,2 V 6 L16,4 Z')
+
+  // The cross
+  marker.append('path')
+    .attr('fill', 'none')
+    .attr('stroke', '#000000')
+    .style('stroke-dasharray', ('0, 0'))
+    .attr('stroke-width', '1px')
+    .attr('d', 'M 0,1 L 6,7 M 6,1 L 0,7')
+  // this is actual shape for arrowhead
+}
+
+export const getTextObj = function () {
+  const txt = {
+    x: 0,
+    y: 0,
+    'fill': 'black',
+    'text-anchor': 'start',
+    style: '#666',
+    width: 100,
+    height: 100,
+    textMargin: 0,
+    rx: 0,
+    ry: 0
+  }
+  return txt
+}
+
+export const getNoteRect = function () {
+  const rect = {
+    x: 0,
+    y: 0,
+    fill: '#EDF2AE',
+    stroke: '#666',
+    width: 100,
+    anchor: 'start',
+    height: 100,
+    rx: 0,
+    ry: 0
+  }
+  return rect
+}
+
+const _drawTextCandidateFunc = (function () {
+  function byText (content, g, x, y, width, height, textAttrs) {
+    const text = g.append('text')
+      .attr('x', x + width / 2).attr('y', y + height / 2 + 5)
+      .style('text-anchor', 'middle')
+      .text(content)
+    _setTextAttrs(text, textAttrs)
+  }
+
+  function byTspan (content, g, x, y, width, height, textAttrs) {
+    const text = g.append('text')
+      .attr('x', x + width / 2).attr('y', y)
+      .style('text-anchor', 'middle')
+    text.append('tspan')
+      .attr('x', x + width / 2).attr('dy', '0')
+      .text(content)
+
+    text.attr('y', y + height / 2.0)
+      .attr('dominant-baseline', 'central')
+      .attr('alignment-baseline', 'central')
+
+    _setTextAttrs(text, textAttrs)
+  }
+
+  function byFo (content, g, x, y, width, height, textAttrs) {
+    const s = g.append('switch')
+    const f = s.append('foreignObject')
+      .attr('x', x).attr('y', y)
+      .attr('width', width).attr('height', height)
+
+    const text = f.append('div').style('display', 'table')
+      .style('height', '100%').style('width', '100%')
+
+    text.append('div').style('display', 'table-cell')
+      .style('text-align', 'center').style('vertical-align', 'middle')
+      .text(content)
+
+    byTspan(content, s, x, y, width, height, textAttrs)
+    _setTextAttrs(text, textAttrs)
+  }
+
+  function _setTextAttrs (toText, fromTextAttrsDict) {
+    for (const key in fromTextAttrsDict) {
+      if (fromTextAttrsDict.hasOwnProperty(key)) {
+        toText.attr(key, fromTextAttrsDict[key])
+      }
+    }
+  }
+
+  return function (conf) {
+    return conf.textPlacement === 'fo' ? byFo : (
+      conf.textPlacement === 'old' ? byText : byTspan)
+  }
+})()
+
+export default {
+  drawRect,
+  drawText,
+  drawLabel,
+  drawActor,
+  anchorElement,
+  drawActivation,
+  drawLoop,
+  insertArrowHead,
+  insertArrowCrossHead,
+  getTextObj,
+  getNoteRect
+}
diff --git a/_submodules/mermaid/src/logger.js b/_submodules/mermaid/src/logger.js
new file mode 100644
index 0000000000000000000000000000000000000000..adaadf31d34554bec1e13a0aacda57cfbf3703b3
--- /dev/null
+++ b/_submodules/mermaid/src/logger.js
@@ -0,0 +1,45 @@
+import moment from 'moment'
+
+export const LEVELS = {
+  debug: 1,
+  info: 2,
+  warn: 3,
+  error: 4,
+  fatal: 5
+}
+
+export const logger = {
+  debug: () => {},
+  info: () => {},
+  warn: () => {},
+  error: () => {},
+  fatal: () => {}
+}
+
+export const setLogLevel = function (level) {
+  logger.debug = () => {}
+  logger.info = () => {}
+  logger.warn = () => {}
+  logger.error = () => {}
+  logger.fatal = () => {}
+  if (level <= LEVELS.fatal) {
+    logger.fatal = console.log.bind(console, '\x1b[35m', format('FATAL'))
+  }
+  if (level <= LEVELS.error) {
+    logger.error = console.log.bind(console, '\x1b[31m', format('ERROR'))
+  }
+  if (level <= LEVELS.warn) {
+    logger.warn = console.log.bind(console, `\x1b[33m`, format('WARN'))
+  }
+  if (level <= LEVELS.info) {
+    logger.info = console.log.bind(console, '\x1b[34m', format('INFO'))
+  }
+  if (level <= LEVELS.debug) {
+    logger.debug = console.log.bind(console, '\x1b[32m', format('DEBUG'))
+  }
+}
+
+const format = (level) => {
+  const time = moment().format('HH:mm:ss.SSS')
+  return `${time} : ${level} : `
+}
diff --git a/_submodules/mermaid/src/mermaid.js b/_submodules/mermaid/src/mermaid.js
new file mode 100644
index 0000000000000000000000000000000000000000..a8f05ffea1df32ef3a8f80bf9112b3fe30a199b8
--- /dev/null
+++ b/_submodules/mermaid/src/mermaid.js
@@ -0,0 +1,167 @@
+/**
+ * Web page integration module for the mermaid framework. It uses the mermaidAPI for mermaid functionality and to render
+ * the diagrams to svg code.
+ */
+import he from 'he'
+
+import mermaidAPI from './mermaidAPI'
+import { logger } from './logger'
+
+/**
+ * ## init
+ * Function that goes through the document to find the chart definitions in there and render them.
+ *
+ * The function tags the processed attributes with the attribute data-processed and ignores found elements with the
+ * attribute already set. This way the init function can be triggered several times.
+ *
+ * Optionally, `init` can accept in the second argument one of the following:
+ * - a DOM Node
+ * - an array of DOM nodes (as would come from a jQuery selector)
+ * - a W3C selector, a la `.mermaid`
+ *
+ * ```mermaid
+ * graph LR;
+ *  a(Find elements)-->b{Processed}
+ *  b-->|Yes|c(Leave element)
+ *  b-->|No |d(Transform)
+ * ```
+ * Renders the mermaid diagrams
+ * @param nodes a css selector or an array of nodes
+ */
+const init = function () {
+  const conf = mermaidAPI.getConfig()
+  logger.debug('Starting rendering diagrams')
+  let nodes
+  if (arguments.length >= 2) {
+    /*! sequence config was passed as #1 */
+    if (typeof arguments[0] !== 'undefined') {
+      mermaid.sequenceConfig = arguments[0]
+    }
+
+    nodes = arguments[1]
+  } else {
+    nodes = arguments[0]
+  }
+
+  // if last argument is a function this is the callback function
+  let callback
+  if (typeof arguments[arguments.length - 1] === 'function') {
+    callback = arguments[arguments.length - 1]
+    logger.debug('Callback function found')
+  } else {
+    if (typeof conf.mermaid !== 'undefined') {
+      if (typeof conf.mermaid.callback === 'function') {
+        callback = conf.mermaid.callback
+        logger.debug('Callback function found')
+      } else {
+        logger.debug('No Callback function found')
+      }
+    }
+  }
+  nodes = nodes === undefined ? document.querySelectorAll('.mermaid')
+    : typeof nodes === 'string' ? document.querySelectorAll(nodes)
+      : nodes instanceof window.Node ? [nodes]
+        : nodes // Last case  - sequence config was passed pick next
+
+  logger.debug('Start On Load before: ' + mermaid.startOnLoad)
+  if (typeof mermaid.startOnLoad !== 'undefined') {
+    logger.debug('Start On Load inner: ' + mermaid.startOnLoad)
+    mermaidAPI.initialize({ startOnLoad: mermaid.startOnLoad })
+  }
+
+  if (typeof mermaid.ganttConfig !== 'undefined') {
+    mermaidAPI.initialize({ gantt: mermaid.ganttConfig })
+  }
+
+  let txt
+
+  for (let i = 0; i < nodes.length; i++) {
+    const element = nodes[i]
+
+    /*! Check if previously processed */
+    if (!element.getAttribute('data-processed')) {
+      element.setAttribute('data-processed', true)
+    } else {
+      continue
+    }
+
+    const id = `mermaid-${Date.now()}`
+
+    // Fetch the graph definition including tags
+    txt = element.innerHTML
+
+    // transforms the html to pure text
+    txt = he.decode(txt).trim().replace(/<br>/ig, '<br/>')
+
+    mermaidAPI.render(id, txt, (svgCode, bindFunctions) => {
+      element.innerHTML = svgCode
+      if (typeof callback !== 'undefined') {
+        callback(id)
+      }
+      bindFunctions(element)
+    }, element)
+  }
+}
+
+const initialize = function (config) {
+  logger.debug('Initializing mermaid')
+  if (typeof config.mermaid !== 'undefined') {
+    if (typeof config.mermaid.startOnLoad !== 'undefined') {
+      mermaid.startOnLoad = config.mermaid.startOnLoad
+    }
+    if (typeof config.mermaid.htmlLabels !== 'undefined') {
+      mermaid.htmlLabels = config.mermaid.htmlLabels
+    }
+  }
+  mermaidAPI.initialize(config)
+}
+
+/**
+ * ##contentLoaded
+ * Callback function that is called when page is loaded. This functions fetches configuration for mermaid rendering and
+ * calls init for rendering the mermaid diagrams on the page.
+ */
+const contentLoaded = function () {
+  let config
+
+  if (mermaid.startOnLoad) {
+    // No config found, do check API config
+    config = mermaidAPI.getConfig()
+    if (config.startOnLoad) {
+      mermaid.init()
+    }
+  } else {
+    if (typeof mermaid.startOnLoad === 'undefined') {
+      logger.debug('In start, no config')
+      config = mermaidAPI.getConfig()
+      if (config.startOnLoad) {
+        mermaid.init()
+      }
+    }
+  }
+}
+
+if (typeof document !== 'undefined') {
+  /*!
+   * Wait for document loaded before starting the execution
+   */
+  window.addEventListener('load', function () {
+    contentLoaded()
+  }, false)
+}
+
+const mermaid = {
+  startOnLoad: true,
+  htmlLabels: true,
+
+  mermaidAPI,
+  parse: mermaidAPI.parse,
+  render: mermaidAPI.render,
+
+  init,
+  initialize,
+
+  contentLoaded
+}
+
+export default mermaid
diff --git a/_submodules/mermaid/src/mermaid.spec.js b/_submodules/mermaid/src/mermaid.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..996ad21f56078261dad2752e45bd629f1f159569
--- /dev/null
+++ b/_submodules/mermaid/src/mermaid.spec.js
@@ -0,0 +1,217 @@
+/* eslint-env jasmine */
+import mermaid from './mermaid'
+import flowDb from './diagrams/flowchart/flowDb'
+import flowParser from './diagrams/flowchart/parser/flow'
+import flowRenderer from './diagrams/flowchart/flowRenderer'
+
+describe('when using mermaid and ', function () {
+  describe('when detecting chart type ', function () {
+    it('should not start rendering with mermaid.startOnLoad set to false', function () {
+      mermaid.startOnLoad = false
+      document.body.innerHTML = '<div class="mermaid">graph TD;\na;</div>'
+      spyOn(mermaid, 'init')
+      mermaid.contentLoaded()
+      expect(mermaid.init).not.toHaveBeenCalled()
+    })
+
+    it('should start rendering with both startOnLoad set', function () {
+      mermaid.startOnLoad = true
+      document.body.innerHTML = '<div class="mermaid">graph TD;\na;</div>'
+      spyOn(mermaid, 'init')
+      mermaid.contentLoaded()
+      expect(mermaid.init).toHaveBeenCalled()
+    })
+
+    it('should start rendering with mermaid.startOnLoad', function () {
+      mermaid.startOnLoad = true
+      document.body.innerHTML = '<div class="mermaid">graph TD;\na;</div>'
+      spyOn(mermaid, 'init')
+      mermaid.contentLoaded()
+      expect(mermaid.init).toHaveBeenCalled()
+    })
+
+    it('should start rendering as a default with no changes performed', function () {
+      document.body.innerHTML = '<div class="mermaid">graph TD;\na;</div>'
+      spyOn(mermaid, 'init')
+      mermaid.contentLoaded()
+      expect(mermaid.init).toHaveBeenCalled()
+    })
+  })
+
+  describe('when calling addEdges ', function () {
+    beforeEach(function () {
+      flowParser.parser.yy = flowDb
+      flowDb.clear()
+    })
+    it('it should handle edges with text', function () {
+      flowParser.parser.parse('graph TD;A-->|text ex|B;')
+      flowParser.parser.yy.getVertices()
+      const edges = flowParser.parser.yy.getEdges()
+
+      const mockG = {
+        setEdge: function (start, end, options) {
+          expect(start).toBe('A')
+          expect(end).toBe('B')
+          expect(options.arrowhead).toBe('normal')
+          expect(options.label.match('text ex')).toBeTruthy()
+        }
+      }
+
+      flowRenderer.addEdges(edges, mockG)
+    })
+
+    it('should handle edges without text', function () {
+      flowParser.parser.parse('graph TD;A-->B;')
+      flowParser.parser.yy.getVertices()
+      const edges = flowParser.parser.yy.getEdges()
+
+      const mockG = {
+        setEdge: function (start, end, options) {
+          expect(start).toBe('A')
+          expect(end).toBe('B')
+          expect(options.arrowhead).toBe('normal')
+        }
+      }
+
+      flowRenderer.addEdges(edges, mockG)
+    })
+
+    it('should handle open-ended edges', function () {
+      flowParser.parser.parse('graph TD;A---B;')
+      flowParser.parser.yy.getVertices()
+      const edges = flowParser.parser.yy.getEdges()
+
+      const mockG = {
+        setEdge: function (start, end, options) {
+          expect(start).toBe('A')
+          expect(end).toBe('B')
+          expect(options.arrowhead).toBe('none')
+        }
+      }
+
+      flowRenderer.addEdges(edges, mockG)
+    })
+
+    it('should handle edges with styles defined', function () {
+      flowParser.parser.parse('graph TD;A---B; linkStyle 0 stroke:val1,stroke-width:val2;')
+      flowParser.parser.yy.getVertices()
+      const edges = flowParser.parser.yy.getEdges()
+
+      const mockG = {
+        setEdge: function (start, end, options) {
+          expect(start).toBe('A')
+          expect(end).toBe('B')
+          expect(options.arrowhead).toBe('none')
+          expect(options.style).toBe('stroke:val1;stroke-width:val2;fill:none;')
+        }
+      }
+
+      flowRenderer.addEdges(edges, mockG)
+    })
+    it('should handle edges with interpolation defined', function () {
+      flowParser.parser.parse('graph TD;A---B; linkStyle 0 interpolate basis')
+      flowParser.parser.yy.getVertices()
+      const edges = flowParser.parser.yy.getEdges()
+
+      const mockG = {
+        setEdge: function (start, end, options) {
+          expect(start).toBe('A')
+          expect(end).toBe('B')
+          expect(options.arrowhead).toBe('none')
+          expect(options.curve).toBe('basis') // mocked as string
+        }
+      }
+
+      flowRenderer.addEdges(edges, mockG)
+    })
+    it('should handle edges with text and styles defined', function () {
+      flowParser.parser.parse('graph TD;A---|the text|B; linkStyle 0 stroke:val1,stroke-width:val2;')
+      flowParser.parser.yy.getVertices()
+      const edges = flowParser.parser.yy.getEdges()
+
+      const mockG = {
+        setEdge: function (start, end, options) {
+          expect(start).toBe('A')
+          expect(end).toBe('B')
+          expect(options.arrowhead).toBe('none')
+          expect(options.label.match('the text')).toBeTruthy()
+          expect(options.style).toBe('stroke:val1;stroke-width:val2;fill:none;')
+        }
+      }
+
+      flowRenderer.addEdges(edges, mockG)
+    })
+
+    it('should set fill to "none" by default when handling edges', function () {
+      flowParser.parser.parse('graph TD;A---B; linkStyle 0 stroke:val1,stroke-width:val2;')
+      flowParser.parser.yy.getVertices()
+      const edges = flowParser.parser.yy.getEdges()
+
+      const mockG = {
+        setEdge: function (start, end, options) {
+          expect(start).toBe('A')
+          expect(end).toBe('B')
+          expect(options.arrowhead).toBe('none')
+          expect(options.style).toBe('stroke:val1;stroke-width:val2;fill:none;')
+        }
+      }
+
+      flowRenderer.addEdges(edges, mockG)
+    })
+
+    it('should not set fill to none if fill is set in linkStyle', function () {
+      flowParser.parser.parse('graph TD;A---B; linkStyle 0 stroke:val1,stroke-width:val2,fill:blue;')
+      flowParser.parser.yy.getVertices()
+      const edges = flowParser.parser.yy.getEdges()
+      const mockG = {
+        setEdge: function (start, end, options) {
+          expect(start).toBe('A')
+          expect(end).toBe('B')
+          expect(options.arrowhead).toBe('none')
+          expect(options.style).toBe('stroke:val1;stroke-width:val2;fill:blue;')
+        }
+      }
+
+      flowRenderer.addEdges(edges, mockG)
+    })
+  })
+
+  describe('checking validity of input ', function () {
+    it('it should throw for an invalid definiton', function () {
+      expect(() => mermaid.parse('this is not a mermaid diagram definition')).toThrow()
+    })
+
+    it('it should not throw for a valid flow definition', function () {
+      expect(() => mermaid.parse('graph TD;A--x|text including URL space|B;')).not.toThrow()
+    })
+    it('it should throw for an invalid flow definition', function () {
+      expect(() => mermaid.parse('graph TQ;A--x|text including URL space|B;')).toThrow()
+    })
+
+    it('it should not throw for a valid sequenceDiagram definition', function () {
+      const text = 'sequenceDiagram\n' +
+        'Alice->Bob: Hello Bob, how are you?\n\n' +
+        '%% Comment\n' +
+        'Note right of Bob: Bob thinks\n' +
+        'alt isWell\n\n' +
+        'Bob-->Alice: I am good thanks!\n' +
+        'else isSick\n' +
+        'Bob-->Alice: Feel sick...\n' +
+        'end'
+      expect(() => mermaid.parse(text)).not.toThrow()
+    })
+
+    it('it should throw for an invalid sequenceDiagram definition', function () {
+      const text = 'sequenceDiagram\n' +
+        'Alice:->Bob: Hello Bob, how are you?\n\n' +
+        '%% Comment\n' +
+        'Note right of Bob: Bob thinks\n' +
+        'alt isWell\n\n' +
+        'Bob-->Alice: I am good thanks!\n' +
+        'else isSick\n' +
+        'Bob-->Alice: Feel sick...\n' +
+        'end'
+      expect(() => mermaid.parse(text)).toThrow()
+    })
+  })
+})
diff --git a/_submodules/mermaid/src/mermaidAPI.js b/_submodules/mermaid/src/mermaidAPI.js
new file mode 100644
index 0000000000000000000000000000000000000000..d40c336c4290e95d9b84bd817e910fb68028fc8f
--- /dev/null
+++ b/_submodules/mermaid/src/mermaidAPI.js
@@ -0,0 +1,487 @@
+/**
+ * ---
+ * title: mermaidAPI
+ * order: 5
+ * ---
+ * # mermaidAPI
+ * This is the api to be used when handling the integration with the web page instead of using the default integration
+ * (mermaid.js).
+ *
+ * The core of this api is the **render** function that given a graph definitionas text renders the graph/diagram and
+ * returns a svg element for the graph. It is is then up to the user of the API to make use of the svg, either insert it
+ * somewhere in the page or something completely different.
+*/
+import * as d3 from 'd3'
+import scope from 'scope-css'
+
+import { logger, setLogLevel } from './logger'
+import utils from './utils'
+import flowRenderer from './diagrams/flowchart/flowRenderer'
+import flowParser from './diagrams/flowchart/parser/flow'
+import flowDb from './diagrams/flowchart/flowDb'
+import sequenceRenderer from './diagrams/sequence/sequenceRenderer'
+import sequenceParser from './diagrams/sequence/parser/sequenceDiagram'
+import sequenceDb from './diagrams/sequence/sequenceDb'
+import ganttRenderer from './diagrams/gantt/ganttRenderer'
+import ganttParser from './diagrams/gantt/parser/gantt'
+import ganttDb from './diagrams/gantt/ganttDb'
+import classRenderer from './diagrams/class/classRenderer'
+import classParser from './diagrams/class/parser/classDiagram'
+import classDb from './diagrams/class/classDb'
+import gitGraphRenderer from './diagrams/git/gitGraphRenderer'
+import gitGraphParser from './diagrams/git/parser/gitGraph'
+import gitGraphAst from './diagrams/git/gitGraphAst'
+
+const themes = {}
+for (const themeName of ['default', 'forest', 'dark', 'neutral']) {
+  themes[themeName] = require(`./themes/${themeName}/index.scss`)
+}
+
+/**
+ * ## Configuration
+ * These are the default options which can be overridden with the initialization call as in the example below:
+ * ```
+ * mermaid.initialize({
+ *   flowchart:{
+ *      htmlLabels: false
+ *   }
+ * });
+ * ```
+ */
+const config = {
+  theme: 'default',
+  themeCSS: undefined,
+
+  /**
+   * logLevel , decides the amount of logging to be used.
+   *    * debug: 1
+   *    * info: 2
+   *    * warn: 3
+   *    * error: 4
+   *    * fatal: 5
+   */
+  logLevel: 5,
+
+  /**
+   * **startOnLoad** - This options controls whether or mermaid starts when the page loads
+   */
+  startOnLoad: true,
+
+  /**
+   * **arrowMarkerAbsolute** - This options controls whether or arrow markers in html code will be absolute paths or
+   * an anchor, #. This matters if you are using base tag settings.
+   */
+  arrowMarkerAbsolute: false,
+
+  /**
+   * ### flowchart
+   * *The object containing configurations specific for flowcharts*
+   */
+  flowchart: {
+    /**
+     * **htmlLabels** - Flag for setting whether or not a html tag should be used for rendering labels
+     * on the edges
+     */
+    htmlLabels: true,
+
+    curve: 'linear'
+  },
+
+  /**
+   * ###  sequenceDiagram
+   * The object containing configurations specific for sequence diagrams
+   */
+  sequence: {
+
+    /**
+     * **diagramMarginX** - margin to the right and left of the sequence diagram
+     */
+    diagramMarginX: 50,
+
+    /**
+     * **diagramMarginY** - margin to the over and under the sequence diagram
+     */
+    diagramMarginY: 10,
+
+    /**
+     * **actorMargin** - Margin between actors
+     */
+    actorMargin: 50,
+
+    /**
+     * **width** - Width of actor boxes
+     */
+    width: 150,
+
+    /**
+     * **height** - Height of actor boxes
+     */
+    height: 65,
+
+    /**
+     * **boxMargin** - Margin around loop boxes
+     */
+    boxMargin: 10,
+
+    /**
+     * **boxTextMargin** - margin around the text in loop/alt/opt boxes
+     */
+    boxTextMargin: 5,
+
+    /**
+     * **noteMargin** - margin around notes
+     */
+    noteMargin: 10,
+
+    /**
+     * **messageMargin** - Space between messages
+     */
+    messageMargin: 35,
+
+    /**
+     * **mirrorActors** - mirror actors under diagram
+     */
+    mirrorActors: true,
+
+    /**
+     * **bottomMarginAdj** - Depending on css styling this might need adjustment.
+     * Prolongs the edge of the diagram downwards
+     */
+    bottomMarginAdj: 1,
+
+    /**
+     * **useMaxWidth** - when this flag is set the height and width is set to 100% and is then scaling with the
+     * available space if not the absolute space required is used
+     */
+    useMaxWidth: true
+  },
+
+  /** ### gantt
+   * The object containing configurations specific for gantt diagrams*
+   */
+  gantt: {
+    /**
+     * **titleTopMargin** - margin top for the text over the gantt diagram
+     */
+    titleTopMargin: 25,
+
+    /**
+     * **barHeight** - the height of the bars in the graph
+     */
+    barHeight: 20,
+
+    /**
+     * **barGap** - the margin between the different activities in the gantt diagram
+     */
+    barGap: 4,
+
+    /**
+     *  **topPadding** - margin between title and gantt diagram and between axis and gantt diagram.
+     */
+    topPadding: 50,
+
+    /**
+     *  **leftPadding** - the space allocated for the section name to the left of the activities.
+     */
+    leftPadding: 75,
+
+    /**
+     *  **gridLineStartPadding** - Vertical starting position of the grid lines
+     */
+    gridLineStartPadding: 35,
+
+    /**
+     *  **fontSize** - font size ...
+     */
+    fontSize: 11,
+
+    /**
+     * **fontFamily** - font family ...
+     */
+    fontFamily: '"Open-Sans", "sans-serif"',
+
+    /**
+     * **numberSectionStyles** - the number of alternating section styles
+     */
+    numberSectionStyles: 4,
+
+    /**
+     * **axisFormat** - datetime format of the axis, this might need adjustment to match your locale and preferences
+     */
+    axisFormat: '%Y-%m-%d'
+  },
+  class: {},
+  git: {}
+}
+
+setLogLevel(config.logLevel)
+
+function parse (text) {
+  const graphType = utils.detectType(text)
+  let parser
+
+  switch (graphType) {
+    case 'git':
+      parser = gitGraphParser
+      parser.parser.yy = gitGraphAst
+      break
+    case 'flowchart':
+      parser = flowParser
+      parser.parser.yy = flowDb
+      break
+    case 'sequence':
+      parser = sequenceParser
+      parser.parser.yy = sequenceDb
+      break
+    case 'gantt':
+      parser = ganttParser
+      parser.parser.yy = ganttDb
+      break
+    case 'class':
+      parser = classParser
+      parser.parser.yy = classDb
+      break
+  }
+
+  parser.parser.yy.parseError = (str, hash) => {
+    const error = { str, hash }
+    throw error
+  }
+
+  parser.parse(text)
+}
+
+export const encodeEntities = function (text) {
+  let txt = text
+
+  txt = txt.replace(/style.*:\S*#.*;/g, function (s) {
+    const innerTxt = s.substring(0, s.length - 1)
+    return innerTxt
+  })
+  txt = txt.replace(/classDef.*:\S*#.*;/g, function (s) {
+    const innerTxt = s.substring(0, s.length - 1)
+    return innerTxt
+  })
+
+  txt = txt.replace(/#\w+;/g, function (s) {
+    const innerTxt = s.substring(1, s.length - 1)
+
+    const isInt = /^\+?\d+$/.test(innerTxt)
+    if (isInt) {
+      return 'fl°°' + innerTxt + '¶ß'
+    } else {
+      return 'fl°' + innerTxt + '¶ß'
+    }
+  })
+
+  return txt
+}
+
+export const decodeEntities = function (text) {
+  let txt = text
+
+  txt = txt.replace(/fl°°/g, function () {
+    return '&#'
+  })
+  txt = txt.replace(/fl°/g, function () {
+    return '&'
+  })
+  txt = txt.replace(/¶ß/g, function () {
+    return ';'
+  })
+
+  return txt
+}
+/**
+ * ##render
+ * Function that renders an svg with a graph from a chart definition. Usage example below.
+ *
+ * ```
+ * mermaidAPI.initialize({
+ *      startOnLoad:true
+ *  });
+ *  $(function(){
+ *      const graphDefinition = 'graph TB\na-->b';
+ *      const cb = function(svgGraph){
+ *          console.log(svgGraph);
+ *      };
+ *      mermaidAPI.render('id1',graphDefinition,cb);
+ *  });
+ *```
+ * @param id the id of the element to be rendered
+ * @param txt the graph definition
+ * @param cb callback which is called after rendering is finished with the svg code as inparam.
+ * @param container selector to element in which a div with the graph temporarily will be inserted. In one is
+ * provided a hidden div will be inserted in the body of the page instead. The element will be removed when rendering is
+ * completed.
+ */
+const render = function (id, txt, cb, container) {
+  if (typeof container !== 'undefined') {
+    container.innerHTML = ''
+
+    d3.select(container).append('div')
+      .attr('id', 'd' + id)
+      .append('svg')
+      .attr('id', id)
+      .attr('width', '100%')
+      .attr('xmlns', 'http://www.w3.org/2000/svg')
+      .append('g')
+  } else {
+    const element = document.querySelector('#' + 'd' + id)
+    if (element) {
+      element.innerHTML = ''
+    }
+
+    d3.select('body').append('div')
+      .attr('id', 'd' + id)
+      .append('svg')
+      .attr('id', id)
+      .attr('width', '100%')
+      .attr('xmlns', 'http://www.w3.org/2000/svg')
+      .append('g')
+  }
+
+  window.txt = txt
+  txt = encodeEntities(txt)
+
+  const element = d3.select('#d' + id).node()
+  const graphType = utils.detectType(txt)
+
+  // insert inline style into svg
+  const svg = element.firstChild
+  const firstChild = svg.firstChild
+
+  // pre-defined theme
+  let style = themes[config.theme]
+  if (style === undefined) {
+    style = ''
+  }
+
+  // user provided theme CSS
+  if (config.themeCSS !== undefined) {
+    style += `\n${config.themeCSS}`
+  }
+
+  // classDef
+  if (graphType === 'flowchart') {
+    const classes = flowRenderer.getClasses(txt)
+    for (const className in classes) {
+      style += `\n.${className} > * { ${classes[className].styles.join(' !important; ')} !important; }`
+    }
+  }
+
+  const style1 = document.createElement('style')
+  style1.innerHTML = scope(style, `#${id}`)
+  svg.insertBefore(style1, firstChild)
+
+  const style2 = document.createElement('style')
+  const cs = window.getComputedStyle(svg)
+  style2.innerHTML = `#${id} {
+    color: ${cs.color};
+    font: ${cs.font};
+  }`
+  svg.insertBefore(style2, firstChild)
+
+  switch (graphType) {
+    case 'git':
+      config.flowchart.arrowMarkerAbsolute = config.arrowMarkerAbsolute
+      gitGraphRenderer.setConf(config.git)
+      gitGraphRenderer.draw(txt, id, false)
+      break
+    case 'flowchart':
+      config.flowchart.arrowMarkerAbsolute = config.arrowMarkerAbsolute
+      flowRenderer.setConf(config.flowchart)
+      flowRenderer.draw(txt, id, false)
+      break
+    case 'sequence':
+      config.sequence.arrowMarkerAbsolute = config.arrowMarkerAbsolute
+      if (config.sequenceDiagram) { // backwards compatibility
+        sequenceRenderer.setConf(Object.assign(config.sequence, config.sequenceDiagram))
+        console.error('`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.')
+      } else {
+        sequenceRenderer.setConf(config.sequence)
+      }
+      sequenceRenderer.draw(txt, id)
+      break
+    case 'gantt':
+      config.gantt.arrowMarkerAbsolute = config.arrowMarkerAbsolute
+      ganttRenderer.setConf(config.gantt)
+      ganttRenderer.draw(txt, id)
+      break
+    case 'class':
+      config.class.arrowMarkerAbsolute = config.arrowMarkerAbsolute
+      classRenderer.setConf(config.class)
+      classRenderer.draw(txt, id)
+      break
+  }
+
+  d3.select(`[id="${id}"]`).selectAll('foreignobject > *').attr('xmlns', 'http://www.w3.org/1999/xhtml')
+
+  let url = ''
+  if (config.arrowMarkerAbsolute) {
+    url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search
+    url = url.replace(/\(/g, '\\(')
+    url = url.replace(/\)/g, '\\)')
+  }
+
+  // Fix for when the base tag is used
+  let svgCode = d3.select('#d' + id).node().innerHTML.replace(/url\(#arrowhead/g, 'url(' + url + '#arrowhead', 'g')
+
+  svgCode = decodeEntities(svgCode)
+
+  if (typeof cb !== 'undefined') {
+    cb(svgCode, flowDb.bindFunctions)
+  } else {
+    logger.warn('CB = undefined!')
+  }
+
+  const node = d3.select('#d' + id).node()
+  if (node !== null && typeof node.remove === 'function') {
+    d3.select('#d' + id).node().remove()
+  }
+
+  return svgCode
+}
+
+const setConf = function (cnf) {
+  // Top level initially mermaid, gflow, sequenceDiagram and gantt
+  const lvl1Keys = Object.keys(cnf)
+  for (let i = 0; i < lvl1Keys.length; i++) {
+    if (typeof cnf[lvl1Keys[i]] === 'object' && cnf[lvl1Keys[i]] != null) {
+      const lvl2Keys = Object.keys(cnf[lvl1Keys[i]])
+
+      for (let j = 0; j < lvl2Keys.length; j++) {
+        logger.debug('Setting conf ', lvl1Keys[i], '-', lvl2Keys[j])
+        if (typeof config[lvl1Keys[i]] === 'undefined') {
+          config[lvl1Keys[i]] = {}
+        }
+        logger.debug('Setting config: ' + lvl1Keys[i] + ' ' + lvl2Keys[j] + ' to ' + cnf[lvl1Keys[i]][lvl2Keys[j]])
+        config[lvl1Keys[i]][lvl2Keys[j]] = cnf[lvl1Keys[i]][lvl2Keys[j]]
+      }
+    } else {
+      config[lvl1Keys[i]] = cnf[lvl1Keys[i]]
+    }
+  }
+}
+
+function initialize (options) {
+  logger.debug('Initializing mermaidAPI')
+  // Update default config with options supplied at initialization
+  if (typeof options === 'object') {
+    setConf(options)
+  }
+  setLogLevel(config.logLevel)
+}
+
+function getConfig () {
+  return config
+}
+
+const mermaidAPI = {
+  render,
+  parse,
+  initialize,
+  getConfig
+}
+
+export default mermaidAPI
diff --git a/_submodules/mermaid/src/mermaidAPI.spec.js b/_submodules/mermaid/src/mermaidAPI.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..51749677cd7090172b2dec138d96e71f5d365d73
--- /dev/null
+++ b/_submodules/mermaid/src/mermaidAPI.spec.js
@@ -0,0 +1,45 @@
+/* eslint-env jasmine */
+import mermaidAPI from './mermaidAPI'
+
+describe('when using mermaidAPI and ', function () {
+  describe('doing initialize ', function () {
+    beforeEach(function () {
+      document.body.innerHTML = ''
+    })
+
+    it('should copy a literal into the configuration', function () {
+      const orgConfig = mermaidAPI.getConfig()
+      expect(orgConfig.testLiteral).toBe(undefined)
+
+      mermaidAPI.initialize({ 'testLiteral': true })
+      const config = mermaidAPI.getConfig()
+
+      expect(config.testLiteral).toBe(true)
+    })
+    it('should copy a an object into the configuration', function () {
+      const orgConfig = mermaidAPI.getConfig()
+      expect(orgConfig.testObject).toBe(undefined)
+
+      const object = {
+        test1: 1,
+        test2: false
+      }
+
+      mermaidAPI.initialize({ 'testObject': object })
+      mermaidAPI.initialize({ 'testObject': { 'test3': true } })
+      const config = mermaidAPI.getConfig()
+
+      expect(config.testObject.test1).toBe(1)
+      expect(config.testObject.test2).toBe(false)
+      expect(config.testObject.test3).toBe(true)
+    })
+  })
+  describe('checking validity of input ', function () {
+    it('it should throw for an invalid definiton', function () {
+      expect(() => mermaidAPI.parse('this is not a mermaid diagram definition')).toThrow()
+    })
+    it('it should not throw for a valid definiton', function () {
+      expect(() => mermaidAPI.parse('graph TD;A--x|text including URL space|B;')).not.toThrow()
+    })
+  })
+})
diff --git a/_submodules/mermaid/src/themes/class.scss b/_submodules/mermaid/src/themes/class.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5e7de91503d085c62ad225d75c6edf8633eb00ed
--- /dev/null
+++ b/_submodules/mermaid/src/themes/class.scss
@@ -0,0 +1,78 @@
+g.classGroup text {
+  fill: $nodeBorder;
+  stroke: none;
+  font-family: 'trebuchet ms', verdana, arial;
+  font-size: 10px;
+}
+
+g.classGroup rect {
+  fill: $nodeBkg;
+  stroke: $nodeBorder;
+}
+
+g.classGroup line {
+  stroke: $nodeBorder;
+  stroke-width: 1;
+}
+
+.classLabel .box {
+  stroke: none;
+  stroke-width: 0;
+  fill: $nodeBkg;
+  opacity: 0.5;
+}
+
+.classLabel .label {
+  fill: $nodeBorder;
+  font-size: 10px;
+}
+
+.relation {
+  stroke: $nodeBorder;
+  stroke-width: 1;
+  fill: none;
+}
+
+@mixin composition {
+  fill: $nodeBorder;
+  stroke: $nodeBorder;
+  stroke-width: 1;
+}
+
+#compositionStart {
+  @include composition;
+}
+
+#compositionEnd {
+  @include composition;
+}
+
+@mixin aggregation {
+  fill: $nodeBkg;
+  stroke: $nodeBorder;
+  stroke-width: 1;
+}
+
+#aggregationStart {
+  @include aggregation;
+}
+
+#aggregationEnd {
+  @include aggregation;
+}
+
+#dependencyStart {
+  @include composition;
+}
+
+#dependencyEnd {
+  @include composition;
+}
+
+#extensionStart {
+  @include composition;
+}
+
+#extensionEnd {
+  @include composition;
+}
diff --git a/_submodules/mermaid/src/themes/default/index.scss b/_submodules/mermaid/src/themes/default/index.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e98fc0741e34cc34363934f6db1489a5bfc2db4a
--- /dev/null
+++ b/_submodules/mermaid/src/themes/default/index.scss
@@ -0,0 +1,52 @@
+$mainBkg: #ECECFF;
+$secondBkg: #ffffde;
+$lineColor: #333333;
+$border1: #CCCCFF;
+$border2: #aaaa33;
+$arrowheadColor: #333333;
+
+/* Flowchart variables */
+
+$nodeBkg: $mainBkg;
+$nodeBorder: #9370DB;
+$clusterBkg: $secondBkg;
+$clusterBorder: $border2;
+$defaultLinkColor: $lineColor;
+$titleColor: #333;
+$edgeLabelBackground: #e8e8e8;
+
+/* Sequence Diagram variables */
+
+$actorBorder: $border1;
+$actorBkg: $mainBkg;
+$actorTextColor: black;
+$actorLineColor: grey;
+$signalColor: #333;
+$signalTextColor: #333;
+$labelBoxBkgColor: $actorBkg;
+$labelBoxBorderColor: $actorBorder;
+$labelTextColor: $actorTextColor;
+$noteBorderColor: $border2;
+$noteBkgColor: #fff5ad;
+
+/* Gantt chart variables */
+
+$sectionBkgColor: rgba(102, 102, 255, 0.49);
+$altSectionBkgColor: white;
+$sectionBkgColor2: #fff400;
+$taskBorderColor: #534fbc;
+$taskBkgColor: #8a90dd;
+$taskTextLightColor: white;
+$taskTextColor: $taskTextLightColor;
+$taskTextDarkColor: black;
+$taskTextOutsideColor: $taskTextDarkColor;
+$activeTaskBorderColor: #534fbc;
+$activeTaskBkgColor: #bfc7ff;
+$gridColor: lightgrey;
+$doneTaskBkgColor: lightgrey;
+$doneTaskBorderColor: grey;
+$critBorderColor: #ff8888;
+$critBkgColor: red;
+$todayLineColor: red;
+
+@import '../mermaid';
diff --git a/_submodules/mermaid/src/themes/flowchart.scss b/_submodules/mermaid/src/themes/flowchart.scss
new file mode 100644
index 0000000000000000000000000000000000000000..edafcf5e75e4d52906c291cce0703878ec92454e
--- /dev/null
+++ b/_submodules/mermaid/src/themes/flowchart.scss
@@ -0,0 +1,54 @@
+.label {
+  font-family: 'trebuchet ms', verdana, arial;
+  color: #333;
+}
+
+.node rect,
+.node circle,
+.node ellipse,
+.node polygon {
+  fill: $mainBkg;
+  stroke: $nodeBorder;
+  stroke-width: 1px;
+}
+
+.node.clickable {
+  cursor: pointer;
+}
+
+.arrowheadPath {
+  fill: $arrowheadColor;
+}
+
+.edgePath .path {
+  stroke: $lineColor;
+  stroke-width: 1.5px;
+}
+
+.edgeLabel {
+  background-color: $edgeLabelBackground;
+}
+
+.cluster rect {
+  fill: $secondBkg !important;
+  stroke: $clusterBorder !important;
+  stroke-width: 1px !important;
+}
+
+.cluster text {
+  fill: $titleColor;
+}
+
+div.mermaidTooltip {
+  position: absolute;
+  text-align: center;
+  max-width: 200px;
+  padding: 2px;
+  font-family: 'trebuchet ms', verdana, arial;
+  font-size: 12px;
+  background: $secondBkg;
+  border: 1px solid $border2;
+  border-radius: 2px;
+  pointer-events: none;
+  z-index: 100;
+}
diff --git a/_submodules/mermaid/src/themes/forest/index.scss b/_submodules/mermaid/src/themes/forest/index.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f6e1a1dae7fd6c12d6533d8e7fa8914c764d943a
--- /dev/null
+++ b/_submodules/mermaid/src/themes/forest/index.scss
@@ -0,0 +1,53 @@
+$mainBkg: #cde498;
+$secondBkg: #cdffb2;
+$lineColor: #1a3318;
+$lineColor: green;
+$border1: #13540c;
+$border2: #6eaa49;
+$arrowheadColor: green;
+
+/* Flowchart variables */
+
+$nodeBkg: $mainBkg;
+$nodeBorder: $border1;
+$clusterBkg: $secondBkg;
+$clusterBorder: $border2;
+$defaultLinkColor: $lineColor;
+$titleColor: #333;
+$edgeLabelBackground: #e8e8e8;
+
+/* Sequence Diagram variables */
+
+$actorBorder: $border1;
+$actorBkg: $mainBkg;
+$actorTextColor: black;
+$actorLineColor: grey;
+$signalColor: #333;
+$signalTextColor: #333;
+$labelBoxBkgColor: $actorBkg;
+$labelBoxBorderColor: #326932;
+$labelTextColor: $actorTextColor;
+$noteBorderColor: $border2;
+$noteBkgColor: #fff5ad;
+
+/* Gantt chart variables */
+
+$sectionBkgColor: #6eaa49;
+$altSectionBkgColor: white;
+$sectionBkgColor2: #6eaa49;
+$taskBorderColor: $border1;
+$taskBkgColor: #487e3a;
+$taskTextLightColor: white;
+$taskTextColor: $taskTextLightColor;
+$taskTextDarkColor: black;
+$taskTextOutsideColor: $taskTextDarkColor;
+$activeTaskBorderColor: $taskBorderColor;
+$activeTaskBkgColor: $mainBkg;
+$gridColor: lightgrey;
+$doneTaskBkgColor: lightgrey;
+$doneTaskBorderColor: grey;
+$critBorderColor: #ff8888;
+$critBkgColor: red;
+$todayLineColor: red;
+
+@import '../mermaid';
diff --git a/_submodules/mermaid/src/themes/gantt.scss b/_submodules/mermaid/src/themes/gantt.scss
new file mode 100644
index 0000000000000000000000000000000000000000..6793135ec854b44e26f15d006c1a5cb151f5d1f8
--- /dev/null
+++ b/_submodules/mermaid/src/themes/gantt.scss
@@ -0,0 +1,209 @@
+/** Section styling */
+
+.section {
+  stroke: none;
+  opacity: 0.2;
+}
+
+.section0 {
+  fill: $sectionBkgColor;
+}
+
+.section2 {
+  fill: $sectionBkgColor2;
+}
+
+.section1,
+.section3 {
+  fill: $altSectionBkgColor;
+  opacity: 0.2;
+}
+
+.sectionTitle0 {
+  fill: $titleColor;
+}
+
+.sectionTitle1 {
+  fill: $titleColor;
+}
+
+.sectionTitle2 {
+  fill: $titleColor;
+}
+
+.sectionTitle3 {
+  fill: $titleColor;
+}
+
+.sectionTitle {
+  text-anchor: start;
+  font-size: 11px;
+  text-height: 14px;
+}
+
+
+/* Grid and axis */
+
+.grid .tick {
+  stroke: $gridColor;
+  opacity: 0.3;
+  shape-rendering: crispEdges;
+}
+
+.grid path {
+  stroke-width: 0;
+}
+
+
+/* Today line */
+
+.today {
+  fill: none;
+  stroke: $todayLineColor;
+  stroke-width: 2px;
+}
+
+
+/* Task styling */
+
+
+/* Default task */
+
+.task {
+  stroke-width: 2;
+}
+
+.taskText {
+  text-anchor: middle;
+  font-size: 11px;
+}
+
+.taskTextOutsideRight {
+  fill: $taskTextDarkColor;
+  text-anchor: start;
+  font-size: 11px;
+}
+
+.taskTextOutsideLeft {
+  fill: $taskTextDarkColor;
+  text-anchor: end;
+  font-size: 11px;
+}
+
+
+/* Specific task settings for the sections*/
+
+.taskText0,
+.taskText1,
+.taskText2,
+.taskText3 {
+  fill: $taskTextColor;
+}
+
+.task0,
+.task1,
+.task2,
+.task3 {
+  fill: $taskBkgColor;
+  stroke: $taskBorderColor;
+}
+
+.taskTextOutside0,
+.taskTextOutside2,
+{
+  fill: $taskTextOutsideColor;
+}
+
+.taskTextOutside1,
+.taskTextOutside3 {
+  fill: $taskTextOutsideColor;
+}
+
+
+/* Active task */
+
+.active0,
+.active1,
+.active2,
+.active3 {
+  fill: $activeTaskBkgColor;
+  stroke: $activeTaskBorderColor;
+}
+
+.activeText0,
+.activeText1,
+.activeText2,
+.activeText3 {
+  fill: $taskTextDarkColor !important;
+}
+
+
+/* Completed task */
+
+.done0,
+.done1,
+.done2,
+.done3 {
+  stroke: $doneTaskBorderColor;
+  fill: $doneTaskBkgColor;
+  stroke-width: 2;
+}
+
+.doneText0,
+.doneText1,
+.doneText2,
+.doneText3 {
+  fill: $taskTextDarkColor !important;
+}
+
+
+/* Tasks on the critical line */
+
+.crit0,
+.crit1,
+.crit2,
+.crit3 {
+  stroke: $critBorderColor;
+  fill: $critBkgColor;
+  stroke-width: 2;
+}
+
+.activeCrit0,
+.activeCrit1,
+.activeCrit2,
+.activeCrit3 {
+  stroke: $critBorderColor;
+  fill: $activeTaskBkgColor;
+  stroke-width: 2;
+}
+
+.doneCrit0,
+.doneCrit1,
+.doneCrit2,
+.doneCrit3 {
+  stroke: $critBorderColor;
+  fill: $doneTaskBkgColor;
+  stroke-width: 2;
+  cursor: pointer;
+  shape-rendering: crispEdges;
+}
+
+.doneCritText0,
+.doneCritText1,
+.doneCritText2,
+.doneCritText3 {
+  fill: $taskTextDarkColor !important;
+}
+
+.activeCritText0,
+.activeCritText1,
+.activeCritText2,
+.activeCritText3 {
+  fill: $taskTextDarkColor !important;
+}
+
+.titleText {
+  text-anchor: middle;
+  font-size: 18px;
+  fill: $taskTextDarkColor;
+}
diff --git a/_submodules/mermaid/src/themes/git.scss b/_submodules/mermaid/src/themes/git.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f4072ef6526819fb162af3b02146ceb4f79f8dcb
--- /dev/null
+++ b/_submodules/mermaid/src/themes/git.scss
@@ -0,0 +1,6 @@
+.commit-id,
+.commit-msg,
+.branch-label {
+  fill: lightgrey;
+  color: lightgrey;
+}
diff --git a/_submodules/mermaid/src/themes/mermaid.scss b/_submodules/mermaid/src/themes/mermaid.scss
new file mode 100644
index 0000000000000000000000000000000000000000..9a46f5142e06ce354a2dad513acc5a678360c314
--- /dev/null
+++ b/_submodules/mermaid/src/themes/mermaid.scss
@@ -0,0 +1,5 @@
+@import 'flowchart';
+@import 'sequence';
+@import 'gantt';
+@import 'class';
+@import 'git';
diff --git a/_submodules/mermaid/src/themes/neutral/index.scss b/_submodules/mermaid/src/themes/neutral/index.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f0560142f0d87358ce74356362e49fd805f818b1
--- /dev/null
+++ b/_submodules/mermaid/src/themes/neutral/index.scss
@@ -0,0 +1,57 @@
+$mainBkg: #eee;
+$contrast: #26a;
+$secondBkg: lighten($contrast, 55%);
+$lineColor: #666;
+$border1: #999;
+$border2: $contrast;
+$note: #ffa;
+$text: #333;
+$critical: #d42;
+$done: #bbb;
+$arrowheadColor: #333333;
+
+/* Flowchart variables */
+
+$nodeBkg: $mainBkg;
+$nodeBorder: $border1;
+$clusterBkg: $secondBkg;
+$clusterBorder: $border2;
+$defaultLinkColor: $lineColor;
+$titleColor: $text;
+$edgeLabelBackground: white;
+
+/* Sequence Diagram variables */
+
+$actorBorder: $border1;
+$actorBkg: $mainBkg;
+$actorTextColor: $text;
+$actorLineColor: $lineColor;
+$signalColor: $text;
+$signalTextColor: $text;
+$labelBoxBkgColor: $actorBkg;
+$labelBoxBorderColor: $actorBorder;
+$labelTextColor: white;
+$noteBorderColor: darken($note, 60%);
+$noteBkgColor: $note;
+
+/* Gantt chart variables */
+
+$sectionBkgColor: lighten($contrast, 30%);
+$altSectionBkgColor: white;
+$sectionBkgColor2: lighten($contrast, 30%);
+$taskBorderColor: darken($contrast, 10%);
+$taskBkgColor: $contrast;
+$taskTextLightColor: white;
+$taskTextColor: $taskTextLightColor;
+$taskTextDarkColor: $text;
+$taskTextOutsideColor: $taskTextDarkColor;
+$activeTaskBorderColor: $taskBorderColor;
+$activeTaskBkgColor: $mainBkg;
+$gridColor: lighten($border1, 30%);
+$doneTaskBkgColor: $done;
+$doneTaskBorderColor: $lineColor;
+$critBkgColor: $critical;
+$critBorderColor: darken($critBkgColor, 10%);
+$todayLineColor: $critBkgColor;
+
+@import '../mermaid';
diff --git a/_submodules/mermaid/src/themes/sequence.scss b/_submodules/mermaid/src/themes/sequence.scss
new file mode 100644
index 0000000000000000000000000000000000000000..780e8ecf5dc74059d24730fe46a01937667c99f8
--- /dev/null
+++ b/_submodules/mermaid/src/themes/sequence.scss
@@ -0,0 +1,75 @@
+.actor {
+  stroke: $actorBorder;
+  fill: $actorBkg;
+}
+
+text.actor {
+  fill: $actorTextColor;
+  stroke: none;
+}
+
+.actor-line {
+  stroke: $actorLineColor;
+}
+
+.messageLine0 {
+  stroke-width: 1.5;
+  stroke-dasharray: '2 2';
+  marker-end: 'url(#arrowhead)';
+  stroke: $signalColor;
+}
+
+.messageLine1 {
+  stroke-width: 1.5;
+  stroke-dasharray: '2 2';
+  stroke: $signalColor;
+}
+
+#arrowhead {
+  fill: $signalColor;
+}
+
+#crosshead path {
+  fill: $signalColor !important;
+  stroke: $signalColor !important;
+}
+
+.messageText {
+  fill: $signalTextColor;
+  stroke: none;
+}
+
+.labelBox {
+  stroke: $labelBoxBorderColor;
+  fill: $labelBoxBkgColor;
+}
+
+.labelText {
+  fill: $labelTextColor;
+  stroke: none;
+}
+
+.loopText {
+  fill: $labelTextColor;
+  stroke: none;
+}
+
+.loopLine {
+  stroke-width: 2;
+  stroke-dasharray: '2 2';
+  marker-end: 'url(#arrowhead)';
+  stroke: $labelBoxBorderColor;
+}
+
+.note {
+  //stroke: #decc93;
+  stroke: $noteBorderColor;
+  fill: $noteBkgColor;
+}
+
+.noteText {
+  fill: black;
+  stroke: none;
+  font-family: 'trebuchet ms', verdana, arial;
+  font-size: 14px;
+}
diff --git a/_submodules/mermaid/src/utils.js b/_submodules/mermaid/src/utils.js
new file mode 100644
index 0000000000000000000000000000000000000000..a18bed14a61f89aef49dc423976d83cc0dfa59bf
--- /dev/null
+++ b/_submodules/mermaid/src/utils.js
@@ -0,0 +1,66 @@
+import * as d3 from 'd3'
+
+/**
+ * @function detectType
+ * Detects the type of the graph text.
+ * ```mermaid
+ * graph LR
+ *  a-->b
+ *  b-->c
+ *  c-->d
+ *  d-->e
+ *  e-->f
+ *  f-->g
+ *  g-->h
+ * ```
+ *
+ * @param {string} text The text defining the graph
+ * @returns {string} A graph definition key
+ */
+export const detectType = function (text) {
+  text = text.replace(/^\s*%%.*\n/g, '\n')
+  if (text.match(/^\s*sequenceDiagram/)) {
+    return 'sequence'
+  }
+
+  if (text.match(/^\s*gantt/)) {
+    return 'gantt'
+  }
+
+  if (text.match(/^\s*classDiagram/)) {
+    return 'class'
+  }
+
+  if (text.match(/^\s*gitGraph/)) {
+    return 'git'
+  }
+  return 'flowchart'
+}
+
+/**
+ * @function isSubstringInArray
+ * Detects whether a substring in present in a given array
+ * @param {string} str The substring to detect
+ * @param {array} arr The array to search
+ * @returns {number} the array index containing the substring or -1 if not present
+ **/
+export const isSubstringInArray = function (str, arr) {
+  for (let i = 0; i < arr.length; i++) {
+    if (arr[i].match(str)) return i
+  }
+  return -1
+}
+
+export const interpolateToCurve = (interpolate, defaultCurve) => {
+  if (!interpolate) {
+    return defaultCurve
+  }
+  const curveName = `curve${interpolate.charAt(0).toUpperCase() + interpolate.slice(1)}`
+  return d3[curveName] || defaultCurve
+}
+
+export default {
+  detectType,
+  isSubstringInArray,
+  interpolateToCurve
+}
diff --git a/_submodules/mermaid/src/utils.spec.js b/_submodules/mermaid/src/utils.spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..43341fb6d116b0a8f9af03ee6a3b33b9964c1d59
--- /dev/null
+++ b/_submodules/mermaid/src/utils.spec.js
@@ -0,0 +1,39 @@
+/* eslint-env jasmine */
+import utils from './utils'
+
+describe('when detecting chart type ', function () {
+  it('should handle a graph defintion', function () {
+    const str = 'graph TB\nbfs1:queue'
+    const type = utils.detectType(str)
+    expect(type).toBe('flowchart')
+  })
+  it('should handle a graph defintion with leading spaces', function () {
+    const str = '    graph TB\nbfs1:queue'
+    const type = utils.detectType(str)
+    expect(type).toBe('flowchart')
+  })
+
+  it('should handle a graph defintion with leading spaces and newline', function () {
+    const str = '  \n  graph TB\nbfs1:queue'
+    const type = utils.detectType(str)
+    expect(type).toBe('flowchart')
+  })
+  it('should handle a graph defintion for gitGraph', function () {
+    const str = '  \n  gitGraph TB:\nbfs1:queue'
+    const type = utils.detectType(str)
+    expect(type).toBe('git')
+  })
+})
+
+describe('when finding substring in array ', function () {
+  it('should return the array index that contains the substring', function () {
+    const arr = ['stroke:val1', 'fill:val2']
+    const result = utils.isSubstringInArray('fill', arr)
+    expect(result).toEqual(1)
+  })
+  it('should return -1 if the substring is not found in the array', function () {
+    const arr = ['stroke:val1', 'stroke-width:val2']
+    const result = utils.isSubstringInArray('fill', arr)
+    expect(result).toEqual(-1)
+  })
+})
diff --git a/_submodules/mermaid/todo.md b/_submodules/mermaid/todo.md
new file mode 100644
index 0000000000000000000000000000000000000000..615856d5a1626e59b1974b30ef2d904717e9fa93
--- /dev/null
+++ b/_submodules/mermaid/todo.md
@@ -0,0 +1,4 @@
+- Get familar with jison
+- git graph requires a blank line at the end. why?
+- Create a desktop client
+- Do the rendering in an iframe to avoid global CSS to affect rendering.
diff --git a/_submodules/mermaid/webpack.config.babel.js b/_submodules/mermaid/webpack.config.babel.js
new file mode 100644
index 0000000000000000000000000000000000000000..73faab7840d7fcfa6826a556c55aa9319c270c60
--- /dev/null
+++ b/_submodules/mermaid/webpack.config.babel.js
@@ -0,0 +1,11 @@
+import nodeExternals from 'webpack-node-externals'
+
+import { jsConfig } from './webpack.config.base'
+
+const config = jsConfig()
+
+const coreConfig = jsConfig()
+coreConfig.externals = [nodeExternals()]
+coreConfig.output.filename = '[name].core.js'
+
+export default [config, coreConfig]
diff --git a/_submodules/mermaid/webpack.config.base.js b/_submodules/mermaid/webpack.config.base.js
new file mode 100644
index 0000000000000000000000000000000000000000..727880fd64d4c649df1bb8bd6b3ac0b4aff3663f
--- /dev/null
+++ b/_submodules/mermaid/webpack.config.base.js
@@ -0,0 +1,48 @@
+import path from 'path'
+
+const amdRule = {
+  parser: {
+    amd: false // https://github.com/lodash/lodash/issues/3052
+  }
+}
+
+const jsRule = {
+  test: /\.js$/,
+  exclude: /node_modules/,
+  use: {
+    loader: 'babel-loader'
+  }
+}
+
+const scssRule = { // load scss to string
+  test: /\.scss$/,
+  use: [
+    { loader: 'css-to-string-loader' },
+    { loader: 'css-loader' },
+    { loader: 'sass-loader' }
+  ]
+}
+
+export const jsConfig = () => {
+  return {
+    mode: 'development',
+    target: 'web',
+    entry: {
+      mermaid: './src/mermaid.js'
+    },
+    node: {
+      fs: 'empty' // jison generated code requires 'fs'
+    },
+    output: {
+      path: path.join(__dirname, './dist/'),
+      filename: '[name].js',
+      library: 'mermaid',
+      libraryTarget: 'umd',
+      libraryExport: 'default'
+    },
+    module: {
+      rules: [amdRule, jsRule, scssRule]
+    },
+    devtool: 'source-map'
+  }
+}
diff --git a/_submodules/mermaid/webpack.config.prod.babel.js b/_submodules/mermaid/webpack.config.prod.babel.js
new file mode 100644
index 0000000000000000000000000000000000000000..9ae00d575982af91b85916bc0c9a73df49bf4d36
--- /dev/null
+++ b/_submodules/mermaid/webpack.config.prod.babel.js
@@ -0,0 +1,7 @@
+import { jsConfig } from './webpack.config.base'
+
+const minConfig = jsConfig()
+minConfig.mode = 'production'
+minConfig.output.filename = '[name].min.js'
+
+export default [minConfig]
diff --git a/assets/css/mermaid.css b/assets/css/mermaid.css
index 92ff7fc7e4259fcf1752983077320b537ece74a9..05db666f4e021d2a9d1174b7b386b9abc2d4cd95 100644
--- a/assets/css/mermaid.css
+++ b/assets/css/mermaid.css
@@ -13,7 +13,6 @@
 
 .mermaid .label {
   color: #333;
-  font-size: 16pt;
 }
 
 .node rect,
@@ -59,19 +58,6 @@ text.actor {
   stroke: grey;
 }
 
-.messageLine0 {
-  stroke-width: 1.5;
-  stroke-dasharray: "2 2";
-  marker-end: "url(#arrowhead)";
-  stroke: #333;
-}
-
-.messageLine1 {
-  stroke-width: 1.5;
-  stroke-dasharray: "2 2";
-  stroke: #333;
-}
-
 #arrowhead {
   fill: #333;
 }
@@ -101,13 +87,6 @@ text.actor {
   stroke: none;
 }
 
-.loopLine {
-  stroke-width: 2;
-  stroke-dasharray: "2 2";
-  marker-end: "url(#arrowhead)";
-  stroke: #CCCCFF;
-}
-
 .note {
   stroke: #aaaa33;
   fill: #fff5ad;
@@ -116,8 +95,6 @@ text.actor {
 .noteText {
   fill: black;
   stroke: none;
-  font-family: 'trebuchet ms', verdana, arial;
-  font-size: 12px;
 }
 
 /** Section styling */
@@ -158,8 +135,6 @@ text.actor {
 
 .sectionTitle {
   text-anchor: start;
-  font-size: 10px;
-  text-height: 12px;
 }
 
 /* Grid and axis */
@@ -188,19 +163,16 @@ text.actor {
 
 .taskText {
   text-anchor: middle;
-  font-size: 10px;
 }
 
 .taskTextOutsideRight {
   fill: black;
   text-anchor: start;
-  font-size: 10px;
 }
 
 .taskTextOutsideLeft {
   fill: black;
   text-anchor: end;
-  font-size: 10px;
 }
 
 /* Specific task settings for the sections*/
@@ -308,22 +280,13 @@ text.actor {
 
 .titleText {
   text-anchor: middle;
-  font-size: 16px;
   fill: black;
 }
 
-.node text {
-  font-family: 'trebuchet ms', verdana, arial;
-  font-size: 12px;
-}
 
 div.mermaidTooltip {
   position: absolute;
   text-align: center;
-  max-width: 200px;
-  padding: 2px;
-  font-family: 'trebuchet ms', verdana, arial;
-  font-size: 12px;
   background: #ffffde;
   border: 1px solid #aaaa33;
   border-radius: 2px;
@@ -472,17 +435,3 @@ g.classGroup rect {
   fill: #FFFFFF00 !important;
 }
 
-/* Keep svgs within containing div */
-div.mermaid > svg {
-  width: 100%;
-  aspect-ratio: none;
-}
-
-g > foreignObject > div {
-    position:relative;
-    font-size: .8em;
-    height:auto;
-    width:auto;
-    padding:3px;
-    display:inline-block;
-}
diff --git a/assets/css/my-remark.scss b/assets/css/my-remark.scss
index 50847cf3335742a0db00a7275e0ca5b0f240ffd0..8c8e18521b027699fad676c09c5bb9e04bbcbdfc 100644
--- a/assets/css/my-remark.scss
+++ b/assets/css/my-remark.scss
@@ -661,19 +661,25 @@ html.remark-container, body.remark-container {
 }
 
 .left-column-half {
-  color: #111;
-  width: 50%;
-  float: left;
-  h2:last-of-type, h3:last-child {
-    color: #000;
-  }
-  padding-left: 1em;
+    vertical-align:top;
+    width: 50%;
+    height: 92%;
+    float: left;
+    h2:last-of-type, h3:last-child {
+	color: #000;
+    }
+    padding-left: 1em;
 }
 
 .right-column-half {
-  width: 45%;
-  float: right;
-  padding-top: 1em;
+    width: 45%;
+    height: 92%;
+    float: right;
+    vertical-align:top;
+    h2:last-of-type, h3:last-child {
+	color: #000
+    }
+    padding-left: 1em;
 }
 
 .left-column40 {
diff --git a/assets/css/style.scss b/assets/css/style.scss
index 22fcd4f118e4bc83a81be2fb1878eeefb67f85da..d49312b1457c6c1ffe0260780db223b586bb1ff7 100644
--- a/assets/css/style.scss
+++ b/assets/css/style.scss
@@ -1,10 +1,10 @@
 ---
 # This is where the style colors for the website are set
 ---
-$navbar-color: #3a1c6f;
-$dark-color: #3a1c6f;
-$gradient-dark: #3a1c6f;
-$gradient-light:  #006666;
+$navbar-color: #003459;
+$dark-color: #003459;
+$gradient-dark:  #004d85;
+$gradient-light:   #004d85;
 $lecture-background: #164756 ;
 $lab-background:#d8e6c9;
 $background: #d8e6c9;
@@ -120,7 +120,7 @@ dl dt.lab {
 }
 
 .navbar {
-    background-color:  $gradient-dark;
+    background-color:  $navbar-color;
 }
 
 table.schedule {
diff --git a/assets/img/favicon.ico b/assets/img/favicon.ico
index 3de0ab46720fce42c4729feab729cefe27aa7dcf..ab8b4f414a5efddf26f976d9ce62347ade1d9567 100644
Binary files a/assets/img/favicon.ico and b/assets/img/favicon.ico differ
diff --git a/assets/img/favicon.png b/assets/img/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..88dfa211eefa5809335386ac67d8ccf80bb9f132
Binary files /dev/null and b/assets/img/favicon.png differ
diff --git a/assets/img/staff/bricker.jpg b/assets/img/staff/bricker.jpg
deleted file mode 100644
index abe76467726d570ebe746fda39cc2f8f1b13cac9..0000000000000000000000000000000000000000
Binary files a/assets/img/staff/bricker.jpg and /dev/null differ
diff --git a/assets/img/staff/cheung.jpg b/assets/img/staff/cheung.jpg
deleted file mode 100644
index 4648b38f0ca813ddf9af8be7942c660f919049ac..0000000000000000000000000000000000000000
Binary files a/assets/img/staff/cheung.jpg and /dev/null differ
diff --git a/assets/img/staff/tian.jpg b/assets/img/staff/tian.jpg
deleted file mode 100644
index a531ec3bb4af788679e53de05212e40e93a7de43..0000000000000000000000000000000000000000
Binary files a/assets/img/staff/tian.jpg and /dev/null differ
diff --git a/assets/js/mermaid.js b/assets/js/mermaid.js
new file mode 100644
index 0000000000000000000000000000000000000000..4912479c192c0e10cc5405128596f29afda60cde
--- /dev/null
+++ b/assets/js/mermaid.js
@@ -0,0 +1,73628 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else if(typeof exports === 'object')
+		exports["mermaid"] = factory();
+	else
+		root["mermaid"] = factory();
+})(typeof self !== "undefined" ? self : this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = "./src/mermaid.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./node_modules/@braintree/sanitize-url/index.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/@braintree/sanitize-url/index.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var invalidPrototcolRegex = /^(%20|\s)*(javascript|data)/im;
+var ctrlCharactersRegex = /[^\x20-\x7E]/gmi;
+var urlSchemeRegex = /^([^:]+):/gm;
+var relativeFirstCharacters = ['.', '/']
+
+function isRelativeUrl(url) {
+  return relativeFirstCharacters.indexOf(url[0]) > -1;
+}
+
+function sanitizeUrl(url) {
+  if (!url) {
+    return 'about:blank';
+  }
+
+  var urlScheme, urlSchemeParseResults;
+  var sanitizedUrl = url.replace(ctrlCharactersRegex, '').trim();
+
+  if (isRelativeUrl(sanitizedUrl)) {
+    return sanitizedUrl;
+  }
+
+  urlSchemeParseResults = sanitizedUrl.match(urlSchemeRegex);
+
+  if (!urlSchemeParseResults) {
+    return 'about:blank';
+  }
+
+  urlScheme = urlSchemeParseResults[0];
+
+  if (invalidPrototcolRegex.test(urlScheme)) {
+    return 'about:blank';
+  }
+
+  return sanitizedUrl;
+}
+
+module.exports = {
+  sanitizeUrl: sanitizeUrl
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/array.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-array/src/array.js ***!
+  \********************************************/
+/*! exports provided: slice, map */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; });
+var array = Array.prototype;
+
+var slice = array.slice;
+var map = array.map;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/ascending.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-array/src/ascending.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/bisect.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-array/src/bisect.js ***!
+  \*********************************************/
+/*! exports provided: bisectRight, bisectLeft, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bisectRight", function() { return bisectRight; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bisectLeft", function() { return bisectLeft; });
+/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
+/* harmony import */ var _bisector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bisector */ "./node_modules/d3-array/src/bisector.js");
+
+
+
+var ascendingBisect = Object(_bisector__WEBPACK_IMPORTED_MODULE_1__["default"])(_ascending__WEBPACK_IMPORTED_MODULE_0__["default"]);
+var bisectRight = ascendingBisect.right;
+var bisectLeft = ascendingBisect.left;
+/* harmony default export */ __webpack_exports__["default"] = (bisectRight);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/bisector.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-array/src/bisector.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(compare) {
+  if (compare.length === 1) compare = ascendingComparator(compare);
+  return {
+    left: function(a, x, lo, hi) {
+      if (lo == null) lo = 0;
+      if (hi == null) hi = a.length;
+      while (lo < hi) {
+        var mid = lo + hi >>> 1;
+        if (compare(a[mid], x) < 0) lo = mid + 1;
+        else hi = mid;
+      }
+      return lo;
+    },
+    right: function(a, x, lo, hi) {
+      if (lo == null) lo = 0;
+      if (hi == null) hi = a.length;
+      while (lo < hi) {
+        var mid = lo + hi >>> 1;
+        if (compare(a[mid], x) > 0) hi = mid;
+        else lo = mid + 1;
+      }
+      return lo;
+    }
+  };
+});
+
+function ascendingComparator(f) {
+  return function(d, x) {
+    return Object(_ascending__WEBPACK_IMPORTED_MODULE_0__["default"])(f(d), x);
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/constant.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-array/src/constant.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/cross.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-array/src/cross.js ***!
+  \********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _pairs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pairs */ "./node_modules/d3-array/src/pairs.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values0, values1, reduce) {
+  var n0 = values0.length,
+      n1 = values1.length,
+      values = new Array(n0 * n1),
+      i0,
+      i1,
+      i,
+      value0;
+
+  if (reduce == null) reduce = _pairs__WEBPACK_IMPORTED_MODULE_0__["pair"];
+
+  for (i0 = i = 0; i0 < n0; ++i0) {
+    for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
+      values[i] = reduce(value0, values1[i1]);
+    }
+  }
+
+  return values;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/descending.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-array/src/descending.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/deviation.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-array/src/deviation.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _variance__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./variance */ "./node_modules/d3-array/src/variance.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(array, f) {
+  var v = Object(_variance__WEBPACK_IMPORTED_MODULE_0__["default"])(array, f);
+  return v ? Math.sqrt(v) : v;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/extent.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-array/src/extent.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
+  var n = values.length,
+      i = -1,
+      value,
+      min,
+      max;
+
+  if (valueof == null) {
+    while (++i < n) { // Find the first comparable value.
+      if ((value = values[i]) != null && value >= value) {
+        min = max = value;
+        while (++i < n) { // Compare the remaining values.
+          if ((value = values[i]) != null) {
+            if (min > value) min = value;
+            if (max < value) max = value;
+          }
+        }
+      }
+    }
+  }
+
+  else {
+    while (++i < n) { // Find the first comparable value.
+      if ((value = valueof(values[i], i, values)) != null && value >= value) {
+        min = max = value;
+        while (++i < n) { // Compare the remaining values.
+          if ((value = valueof(values[i], i, values)) != null) {
+            if (min > value) min = value;
+            if (max < value) max = value;
+          }
+        }
+      }
+    }
+  }
+
+  return [min, max];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/histogram.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-array/src/histogram.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./array */ "./node_modules/d3-array/src/array.js");
+/* harmony import */ var _bisect__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bisect */ "./node_modules/d3-array/src/bisect.js");
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-array/src/constant.js");
+/* harmony import */ var _extent__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./extent */ "./node_modules/d3-array/src/extent.js");
+/* harmony import */ var _identity__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./identity */ "./node_modules/d3-array/src/identity.js");
+/* harmony import */ var _range__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./range */ "./node_modules/d3-array/src/range.js");
+/* harmony import */ var _ticks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./ticks */ "./node_modules/d3-array/src/ticks.js");
+/* harmony import */ var _threshold_sturges__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./threshold/sturges */ "./node_modules/d3-array/src/threshold/sturges.js");
+
+
+
+
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var value = _identity__WEBPACK_IMPORTED_MODULE_4__["default"],
+      domain = _extent__WEBPACK_IMPORTED_MODULE_3__["default"],
+      threshold = _threshold_sturges__WEBPACK_IMPORTED_MODULE_7__["default"];
+
+  function histogram(data) {
+    var i,
+        n = data.length,
+        x,
+        values = new Array(n);
+
+    for (i = 0; i < n; ++i) {
+      values[i] = value(data[i], i, data);
+    }
+
+    var xz = domain(values),
+        x0 = xz[0],
+        x1 = xz[1],
+        tz = threshold(values, x0, x1);
+
+    // Convert number of thresholds into uniform thresholds.
+    if (!Array.isArray(tz)) {
+      tz = Object(_ticks__WEBPACK_IMPORTED_MODULE_6__["tickStep"])(x0, x1, tz);
+      tz = Object(_range__WEBPACK_IMPORTED_MODULE_5__["default"])(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive
+    }
+
+    // Remove any thresholds outside the domain.
+    var m = tz.length;
+    while (tz[0] <= x0) tz.shift(), --m;
+    while (tz[m - 1] > x1) tz.pop(), --m;
+
+    var bins = new Array(m + 1),
+        bin;
+
+    // Initialize bins.
+    for (i = 0; i <= m; ++i) {
+      bin = bins[i] = [];
+      bin.x0 = i > 0 ? tz[i - 1] : x0;
+      bin.x1 = i < m ? tz[i] : x1;
+    }
+
+    // Assign data to bins by value, ignoring any outside the domain.
+    for (i = 0; i < n; ++i) {
+      x = values[i];
+      if (x0 <= x && x <= x1) {
+        bins[Object(_bisect__WEBPACK_IMPORTED_MODULE_1__["default"])(tz, x, 0, m)].push(data[i]);
+      }
+    }
+
+    return bins;
+  }
+
+  histogram.value = function(_) {
+    return arguments.length ? (value = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(_), histogram) : value;
+  };
+
+  histogram.domain = function(_) {
+    return arguments.length ? (domain = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])([_[0], _[1]]), histogram) : domain;
+  };
+
+  histogram.thresholds = function(_) {
+    return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(_array__WEBPACK_IMPORTED_MODULE_0__["slice"].call(_)) : Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(_), histogram) : threshold;
+  };
+
+  return histogram;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/identity.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-array/src/identity.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return x;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-array/src/index.js ***!
+  \********************************************/
+/*! exports provided: bisect, bisectRight, bisectLeft, ascending, bisector, cross, descending, deviation, extent, histogram, thresholdFreedmanDiaconis, thresholdScott, thresholdSturges, max, mean, median, merge, min, pairs, permute, quantile, range, scan, shuffle, sum, ticks, tickIncrement, tickStep, transpose, variance, zip */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _bisect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./bisect */ "./node_modules/d3-array/src/bisect.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisect", function() { return _bisect__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisectRight", function() { return _bisect__WEBPACK_IMPORTED_MODULE_0__["bisectRight"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisectLeft", function() { return _bisect__WEBPACK_IMPORTED_MODULE_0__["bisectLeft"]; });
+
+/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ascending", function() { return _ascending__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _bisector__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bisector */ "./node_modules/d3-array/src/bisector.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisector", function() { return _bisector__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _cross__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./cross */ "./node_modules/d3-array/src/cross.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cross", function() { return _cross__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _descending__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./descending */ "./node_modules/d3-array/src/descending.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "descending", function() { return _descending__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _deviation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./deviation */ "./node_modules/d3-array/src/deviation.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "deviation", function() { return _deviation__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _extent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./extent */ "./node_modules/d3-array/src/extent.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "extent", function() { return _extent__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony import */ var _histogram__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./histogram */ "./node_modules/d3-array/src/histogram.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "histogram", function() { return _histogram__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+/* harmony import */ var _threshold_freedmanDiaconis__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./threshold/freedmanDiaconis */ "./node_modules/d3-array/src/threshold/freedmanDiaconis.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "thresholdFreedmanDiaconis", function() { return _threshold_freedmanDiaconis__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony import */ var _threshold_scott__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./threshold/scott */ "./node_modules/d3-array/src/threshold/scott.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "thresholdScott", function() { return _threshold_scott__WEBPACK_IMPORTED_MODULE_9__["default"]; });
+
+/* harmony import */ var _threshold_sturges__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./threshold/sturges */ "./node_modules/d3-array/src/threshold/sturges.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "thresholdSturges", function() { return _threshold_sturges__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony import */ var _max__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./max */ "./node_modules/d3-array/src/max.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _max__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony import */ var _mean__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./mean */ "./node_modules/d3-array/src/mean.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mean", function() { return _mean__WEBPACK_IMPORTED_MODULE_12__["default"]; });
+
+/* harmony import */ var _median__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./median */ "./node_modules/d3-array/src/median.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "median", function() { return _median__WEBPACK_IMPORTED_MODULE_13__["default"]; });
+
+/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./merge */ "./node_modules/d3-array/src/merge.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _merge__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+/* harmony import */ var _min__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./min */ "./node_modules/d3-array/src/min.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _min__WEBPACK_IMPORTED_MODULE_15__["default"]; });
+
+/* harmony import */ var _pairs__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./pairs */ "./node_modules/d3-array/src/pairs.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return _pairs__WEBPACK_IMPORTED_MODULE_16__["default"]; });
+
+/* harmony import */ var _permute__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./permute */ "./node_modules/d3-array/src/permute.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "permute", function() { return _permute__WEBPACK_IMPORTED_MODULE_17__["default"]; });
+
+/* harmony import */ var _quantile__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./quantile */ "./node_modules/d3-array/src/quantile.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "quantile", function() { return _quantile__WEBPACK_IMPORTED_MODULE_18__["default"]; });
+
+/* harmony import */ var _range__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./range */ "./node_modules/d3-array/src/range.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _range__WEBPACK_IMPORTED_MODULE_19__["default"]; });
+
+/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./scan */ "./node_modules/d3-array/src/scan.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _scan__WEBPACK_IMPORTED_MODULE_20__["default"]; });
+
+/* harmony import */ var _shuffle__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./shuffle */ "./node_modules/d3-array/src/shuffle.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shuffle", function() { return _shuffle__WEBPACK_IMPORTED_MODULE_21__["default"]; });
+
+/* harmony import */ var _sum__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./sum */ "./node_modules/d3-array/src/sum.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sum", function() { return _sum__WEBPACK_IMPORTED_MODULE_22__["default"]; });
+
+/* harmony import */ var _ticks__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./ticks */ "./node_modules/d3-array/src/ticks.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ticks", function() { return _ticks__WEBPACK_IMPORTED_MODULE_23__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tickIncrement", function() { return _ticks__WEBPACK_IMPORTED_MODULE_23__["tickIncrement"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tickStep", function() { return _ticks__WEBPACK_IMPORTED_MODULE_23__["tickStep"]; });
+
+/* harmony import */ var _transpose__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./transpose */ "./node_modules/d3-array/src/transpose.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transpose", function() { return _transpose__WEBPACK_IMPORTED_MODULE_24__["default"]; });
+
+/* harmony import */ var _variance__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./variance */ "./node_modules/d3-array/src/variance.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "variance", function() { return _variance__WEBPACK_IMPORTED_MODULE_25__["default"]; });
+
+/* harmony import */ var _zip__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./zip */ "./node_modules/d3-array/src/zip.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _zip__WEBPACK_IMPORTED_MODULE_26__["default"]; });
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/max.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-array/src/max.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
+  var n = values.length,
+      i = -1,
+      value,
+      max;
+
+  if (valueof == null) {
+    while (++i < n) { // Find the first comparable value.
+      if ((value = values[i]) != null && value >= value) {
+        max = value;
+        while (++i < n) { // Compare the remaining values.
+          if ((value = values[i]) != null && value > max) {
+            max = value;
+          }
+        }
+      }
+    }
+  }
+
+  else {
+    while (++i < n) { // Find the first comparable value.
+      if ((value = valueof(values[i], i, values)) != null && value >= value) {
+        max = value;
+        while (++i < n) { // Compare the remaining values.
+          if ((value = valueof(values[i], i, values)) != null && value > max) {
+            max = value;
+          }
+        }
+      }
+    }
+  }
+
+  return max;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/mean.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-array/src/mean.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./number */ "./node_modules/d3-array/src/number.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
+  var n = values.length,
+      m = n,
+      i = -1,
+      value,
+      sum = 0;
+
+  if (valueof == null) {
+    while (++i < n) {
+      if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(values[i]))) sum += value;
+      else --m;
+    }
+  }
+
+  else {
+    while (++i < n) {
+      if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(valueof(values[i], i, values)))) sum += value;
+      else --m;
+    }
+  }
+
+  if (m) return sum / m;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/median.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-array/src/median.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
+/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./number */ "./node_modules/d3-array/src/number.js");
+/* harmony import */ var _quantile__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./quantile */ "./node_modules/d3-array/src/quantile.js");
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
+  var n = values.length,
+      i = -1,
+      value,
+      numbers = [];
+
+  if (valueof == null) {
+    while (++i < n) {
+      if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_1__["default"])(values[i]))) {
+        numbers.push(value);
+      }
+    }
+  }
+
+  else {
+    while (++i < n) {
+      if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_1__["default"])(valueof(values[i], i, values)))) {
+        numbers.push(value);
+      }
+    }
+  }
+
+  return Object(_quantile__WEBPACK_IMPORTED_MODULE_2__["default"])(numbers.sort(_ascending__WEBPACK_IMPORTED_MODULE_0__["default"]), 0.5);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/merge.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-array/src/merge.js ***!
+  \********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(arrays) {
+  var n = arrays.length,
+      m,
+      i = -1,
+      j = 0,
+      merged,
+      array;
+
+  while (++i < n) j += arrays[i].length;
+  merged = new Array(j);
+
+  while (--n >= 0) {
+    array = arrays[n];
+    m = array.length;
+    while (--m >= 0) {
+      merged[--j] = array[m];
+    }
+  }
+
+  return merged;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/min.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-array/src/min.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
+  var n = values.length,
+      i = -1,
+      value,
+      min;
+
+  if (valueof == null) {
+    while (++i < n) { // Find the first comparable value.
+      if ((value = values[i]) != null && value >= value) {
+        min = value;
+        while (++i < n) { // Compare the remaining values.
+          if ((value = values[i]) != null && min > value) {
+            min = value;
+          }
+        }
+      }
+    }
+  }
+
+  else {
+    while (++i < n) { // Find the first comparable value.
+      if ((value = valueof(values[i], i, values)) != null && value >= value) {
+        min = value;
+        while (++i < n) { // Compare the remaining values.
+          if ((value = valueof(values[i], i, values)) != null && min > value) {
+            min = value;
+          }
+        }
+      }
+    }
+  }
+
+  return min;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/number.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-array/src/number.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return x === null ? NaN : +x;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/pairs.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-array/src/pairs.js ***!
+  \********************************************/
+/*! exports provided: default, pair */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pair", function() { return pair; });
+/* harmony default export */ __webpack_exports__["default"] = (function(array, f) {
+  if (f == null) f = pair;
+  var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
+  while (i < n) pairs[i] = f(p, p = array[++i]);
+  return pairs;
+});
+
+function pair(a, b) {
+  return [a, b];
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/permute.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-array/src/permute.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(array, indexes) {
+  var i = indexes.length, permutes = new Array(i);
+  while (i--) permutes[i] = array[indexes[i]];
+  return permutes;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/quantile.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-array/src/quantile.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./number */ "./node_modules/d3-array/src/number.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values, p, valueof) {
+  if (valueof == null) valueof = _number__WEBPACK_IMPORTED_MODULE_0__["default"];
+  if (!(n = values.length)) return;
+  if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
+  if (p >= 1) return +valueof(values[n - 1], n - 1, values);
+  var n,
+      i = (n - 1) * p,
+      i0 = Math.floor(i),
+      value0 = +valueof(values[i0], i0, values),
+      value1 = +valueof(values[i0 + 1], i0 + 1, values);
+  return value0 + (value1 - value0) * (i - i0);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/range.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-array/src/range.js ***!
+  \********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(start, stop, step) {
+  start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
+
+  var i = -1,
+      n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
+      range = new Array(n);
+
+  while (++i < n) {
+    range[i] = start + i * step;
+  }
+
+  return range;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/scan.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-array/src/scan.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-array/src/ascending.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values, compare) {
+  if (!(n = values.length)) return;
+  var n,
+      i = 0,
+      j = 0,
+      xi,
+      xj = values[j];
+
+  if (compare == null) compare = _ascending__WEBPACK_IMPORTED_MODULE_0__["default"];
+
+  while (++i < n) {
+    if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
+      xj = xi, j = i;
+    }
+  }
+
+  if (compare(xj, xj) === 0) return j;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/shuffle.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-array/src/shuffle.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(array, i0, i1) {
+  var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
+      t,
+      i;
+
+  while (m) {
+    i = Math.random() * m-- | 0;
+    t = array[m + i0];
+    array[m + i0] = array[i + i0];
+    array[i + i0] = t;
+  }
+
+  return array;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/sum.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-array/src/sum.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
+  var n = values.length,
+      i = -1,
+      value,
+      sum = 0;
+
+  if (valueof == null) {
+    while (++i < n) {
+      if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
+    }
+  }
+
+  else {
+    while (++i < n) {
+      if (value = +valueof(values[i], i, values)) sum += value;
+    }
+  }
+
+  return sum;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/threshold/freedmanDiaconis.js":
+/*!*****************************************************************!*\
+  !*** ./node_modules/d3-array/src/threshold/freedmanDiaconis.js ***!
+  \*****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../array */ "./node_modules/d3-array/src/array.js");
+/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ascending */ "./node_modules/d3-array/src/ascending.js");
+/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../number */ "./node_modules/d3-array/src/number.js");
+/* harmony import */ var _quantile__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../quantile */ "./node_modules/d3-array/src/quantile.js");
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values, min, max) {
+  values = _array__WEBPACK_IMPORTED_MODULE_0__["map"].call(values, _number__WEBPACK_IMPORTED_MODULE_2__["default"]).sort(_ascending__WEBPACK_IMPORTED_MODULE_1__["default"]);
+  return Math.ceil((max - min) / (2 * (Object(_quantile__WEBPACK_IMPORTED_MODULE_3__["default"])(values, 0.75) - Object(_quantile__WEBPACK_IMPORTED_MODULE_3__["default"])(values, 0.25)) * Math.pow(values.length, -1 / 3)));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/threshold/scott.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-array/src/threshold/scott.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _deviation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../deviation */ "./node_modules/d3-array/src/deviation.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values, min, max) {
+  return Math.ceil((max - min) / (3.5 * Object(_deviation__WEBPACK_IMPORTED_MODULE_0__["default"])(values) * Math.pow(values.length, -1 / 3)));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/threshold/sturges.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-array/src/threshold/sturges.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(values) {
+  return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/ticks.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-array/src/ticks.js ***!
+  \********************************************/
+/*! exports provided: default, tickIncrement, tickStep */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tickIncrement", function() { return tickIncrement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tickStep", function() { return tickStep; });
+var e10 = Math.sqrt(50),
+    e5 = Math.sqrt(10),
+    e2 = Math.sqrt(2);
+
+/* harmony default export */ __webpack_exports__["default"] = (function(start, stop, count) {
+  var reverse,
+      i = -1,
+      n,
+      ticks,
+      step;
+
+  stop = +stop, start = +start, count = +count;
+  if (start === stop && count > 0) return [start];
+  if (reverse = stop < start) n = start, start = stop, stop = n;
+  if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
+
+  if (step > 0) {
+    start = Math.ceil(start / step);
+    stop = Math.floor(stop / step);
+    ticks = new Array(n = Math.ceil(stop - start + 1));
+    while (++i < n) ticks[i] = (start + i) * step;
+  } else {
+    start = Math.floor(start * step);
+    stop = Math.ceil(stop * step);
+    ticks = new Array(n = Math.ceil(start - stop + 1));
+    while (++i < n) ticks[i] = (start - i) / step;
+  }
+
+  if (reverse) ticks.reverse();
+
+  return ticks;
+});
+
+function tickIncrement(start, stop, count) {
+  var step = (stop - start) / Math.max(0, count),
+      power = Math.floor(Math.log(step) / Math.LN10),
+      error = step / Math.pow(10, power);
+  return power >= 0
+      ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
+      : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
+}
+
+function tickStep(start, stop, count) {
+  var step0 = Math.abs(stop - start) / Math.max(0, count),
+      step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
+      error = step0 / step1;
+  if (error >= e10) step1 *= 10;
+  else if (error >= e5) step1 *= 5;
+  else if (error >= e2) step1 *= 2;
+  return stop < start ? -step1 : step1;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/transpose.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-array/src/transpose.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _min__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./min */ "./node_modules/d3-array/src/min.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(matrix) {
+  if (!(n = matrix.length)) return [];
+  for (var i = -1, m = Object(_min__WEBPACK_IMPORTED_MODULE_0__["default"])(matrix, length), transpose = new Array(m); ++i < m;) {
+    for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
+      row[j] = matrix[j][i];
+    }
+  }
+  return transpose;
+});
+
+function length(d) {
+  return d.length;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/variance.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-array/src/variance.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./number */ "./node_modules/d3-array/src/number.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values, valueof) {
+  var n = values.length,
+      m = 0,
+      i = -1,
+      mean = 0,
+      value,
+      delta,
+      sum = 0;
+
+  if (valueof == null) {
+    while (++i < n) {
+      if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(values[i]))) {
+        delta = value - mean;
+        mean += delta / ++m;
+        sum += delta * (value - mean);
+      }
+    }
+  }
+
+  else {
+    while (++i < n) {
+      if (!isNaN(value = Object(_number__WEBPACK_IMPORTED_MODULE_0__["default"])(valueof(values[i], i, values)))) {
+        delta = value - mean;
+        mean += delta / ++m;
+        sum += delta * (value - mean);
+      }
+    }
+  }
+
+  if (m > 1) return sum / (m - 1);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-array/src/zip.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-array/src/zip.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _transpose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transpose */ "./node_modules/d3-array/src/transpose.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_transpose__WEBPACK_IMPORTED_MODULE_0__["default"])(arguments);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-axis/src/array.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-axis/src/array.js ***!
+  \*******************************************/
+/*! exports provided: slice */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
+var slice = Array.prototype.slice;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-axis/src/axis.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-axis/src/axis.js ***!
+  \******************************************/
+/*! exports provided: axisTop, axisRight, axisBottom, axisLeft */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "axisTop", function() { return axisTop; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "axisRight", function() { return axisRight; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "axisBottom", function() { return axisBottom; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "axisLeft", function() { return axisLeft; });
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./array */ "./node_modules/d3-axis/src/array.js");
+/* harmony import */ var _identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./identity */ "./node_modules/d3-axis/src/identity.js");
+
+
+
+var top = 1,
+    right = 2,
+    bottom = 3,
+    left = 4,
+    epsilon = 1e-6;
+
+function translateX(x) {
+  return "translate(" + (x + 0.5) + ",0)";
+}
+
+function translateY(y) {
+  return "translate(0," + (y + 0.5) + ")";
+}
+
+function number(scale) {
+  return function(d) {
+    return +scale(d);
+  };
+}
+
+function center(scale) {
+  var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
+  if (scale.round()) offset = Math.round(offset);
+  return function(d) {
+    return +scale(d) + offset;
+  };
+}
+
+function entering() {
+  return !this.__axis;
+}
+
+function axis(orient, scale) {
+  var tickArguments = [],
+      tickValues = null,
+      tickFormat = null,
+      tickSizeInner = 6,
+      tickSizeOuter = 6,
+      tickPadding = 3,
+      k = orient === top || orient === left ? -1 : 1,
+      x = orient === left || orient === right ? "x" : "y",
+      transform = orient === top || orient === bottom ? translateX : translateY;
+
+  function axis(context) {
+    var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
+        format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : _identity__WEBPACK_IMPORTED_MODULE_1__["default"]) : tickFormat,
+        spacing = Math.max(tickSizeInner, 0) + tickPadding,
+        range = scale.range(),
+        range0 = +range[0] + 0.5,
+        range1 = +range[range.length - 1] + 0.5,
+        position = (scale.bandwidth ? center : number)(scale.copy()),
+        selection = context.selection ? context.selection() : context,
+        path = selection.selectAll(".domain").data([null]),
+        tick = selection.selectAll(".tick").data(values, scale).order(),
+        tickExit = tick.exit(),
+        tickEnter = tick.enter().append("g").attr("class", "tick"),
+        line = tick.select("line"),
+        text = tick.select("text");
+
+    path = path.merge(path.enter().insert("path", ".tick")
+        .attr("class", "domain")
+        .attr("stroke", "currentColor"));
+
+    tick = tick.merge(tickEnter);
+
+    line = line.merge(tickEnter.append("line")
+        .attr("stroke", "currentColor")
+        .attr(x + "2", k * tickSizeInner));
+
+    text = text.merge(tickEnter.append("text")
+        .attr("fill", "currentColor")
+        .attr(x, k * spacing)
+        .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
+
+    if (context !== selection) {
+      path = path.transition(context);
+      tick = tick.transition(context);
+      line = line.transition(context);
+      text = text.transition(context);
+
+      tickExit = tickExit.transition(context)
+          .attr("opacity", epsilon)
+          .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
+
+      tickEnter
+          .attr("opacity", epsilon)
+          .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
+    }
+
+    tickExit.remove();
+
+    path
+        .attr("d", orient === left || orient == right
+            ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1)
+            : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1));
+
+    tick
+        .attr("opacity", 1)
+        .attr("transform", function(d) { return transform(position(d)); });
+
+    line
+        .attr(x + "2", k * tickSizeInner);
+
+    text
+        .attr(x, k * spacing)
+        .text(format);
+
+    selection.filter(entering)
+        .attr("fill", "none")
+        .attr("font-size", 10)
+        .attr("font-family", "sans-serif")
+        .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
+
+    selection
+        .each(function() { this.__axis = position; });
+  }
+
+  axis.scale = function(_) {
+    return arguments.length ? (scale = _, axis) : scale;
+  };
+
+  axis.ticks = function() {
+    return tickArguments = _array__WEBPACK_IMPORTED_MODULE_0__["slice"].call(arguments), axis;
+  };
+
+  axis.tickArguments = function(_) {
+    return arguments.length ? (tickArguments = _ == null ? [] : _array__WEBPACK_IMPORTED_MODULE_0__["slice"].call(_), axis) : tickArguments.slice();
+  };
+
+  axis.tickValues = function(_) {
+    return arguments.length ? (tickValues = _ == null ? null : _array__WEBPACK_IMPORTED_MODULE_0__["slice"].call(_), axis) : tickValues && tickValues.slice();
+  };
+
+  axis.tickFormat = function(_) {
+    return arguments.length ? (tickFormat = _, axis) : tickFormat;
+  };
+
+  axis.tickSize = function(_) {
+    return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
+  };
+
+  axis.tickSizeInner = function(_) {
+    return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
+  };
+
+  axis.tickSizeOuter = function(_) {
+    return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
+  };
+
+  axis.tickPadding = function(_) {
+    return arguments.length ? (tickPadding = +_, axis) : tickPadding;
+  };
+
+  return axis;
+}
+
+function axisTop(scale) {
+  return axis(top, scale);
+}
+
+function axisRight(scale) {
+  return axis(right, scale);
+}
+
+function axisBottom(scale) {
+  return axis(bottom, scale);
+}
+
+function axisLeft(scale) {
+  return axis(left, scale);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-axis/src/identity.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-axis/src/identity.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return x;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-axis/src/index.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-axis/src/index.js ***!
+  \*******************************************/
+/*! exports provided: axisTop, axisRight, axisBottom, axisLeft */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _axis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./axis */ "./node_modules/d3-axis/src/axis.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "axisTop", function() { return _axis__WEBPACK_IMPORTED_MODULE_0__["axisTop"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "axisRight", function() { return _axis__WEBPACK_IMPORTED_MODULE_0__["axisRight"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "axisBottom", function() { return _axis__WEBPACK_IMPORTED_MODULE_0__["axisBottom"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "axisLeft", function() { return _axis__WEBPACK_IMPORTED_MODULE_0__["axisLeft"]; });
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-brush/src/brush.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-brush/src/brush.js ***!
+  \********************************************/
+/*! exports provided: brushSelection, brushX, brushY, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "brushSelection", function() { return brushSelection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "brushX", function() { return brushX; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "brushY", function() { return brushY; });
+/* harmony import */ var d3_dispatch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-dispatch */ "./node_modules/d3-dispatch/src/index.js");
+/* harmony import */ var d3_drag__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-drag */ "./node_modules/d3-drag/src/index.js");
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var d3_transition__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! d3-transition */ "./node_modules/d3-transition/src/index.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-brush/src/constant.js");
+/* harmony import */ var _event_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./event.js */ "./node_modules/d3-brush/src/event.js");
+/* harmony import */ var _noevent_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./noevent.js */ "./node_modules/d3-brush/src/noevent.js");
+
+
+
+
+
+
+
+
+
+var MODE_DRAG = {name: "drag"},
+    MODE_SPACE = {name: "space"},
+    MODE_HANDLE = {name: "handle"},
+    MODE_CENTER = {name: "center"};
+
+function number1(e) {
+  return [+e[0], +e[1]];
+}
+
+function number2(e) {
+  return [number1(e[0]), number1(e[1])];
+}
+
+function toucher(identifier) {
+  return function(target) {
+    return Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["touch"])(target, d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].touches, identifier);
+  };
+}
+
+var X = {
+  name: "x",
+  handles: ["w", "e"].map(type),
+  input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; },
+  output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
+};
+
+var Y = {
+  name: "y",
+  handles: ["n", "s"].map(type),
+  input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; },
+  output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
+};
+
+var XY = {
+  name: "xy",
+  handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type),
+  input: function(xy) { return xy == null ? null : number2(xy); },
+  output: function(xy) { return xy; }
+};
+
+var cursors = {
+  overlay: "crosshair",
+  selection: "move",
+  n: "ns-resize",
+  e: "ew-resize",
+  s: "ns-resize",
+  w: "ew-resize",
+  nw: "nwse-resize",
+  ne: "nesw-resize",
+  se: "nwse-resize",
+  sw: "nesw-resize"
+};
+
+var flipX = {
+  e: "w",
+  w: "e",
+  nw: "ne",
+  ne: "nw",
+  se: "sw",
+  sw: "se"
+};
+
+var flipY = {
+  n: "s",
+  s: "n",
+  nw: "sw",
+  ne: "se",
+  se: "ne",
+  sw: "nw"
+};
+
+var signsX = {
+  overlay: +1,
+  selection: +1,
+  n: null,
+  e: +1,
+  s: null,
+  w: -1,
+  nw: -1,
+  ne: +1,
+  se: +1,
+  sw: -1
+};
+
+var signsY = {
+  overlay: +1,
+  selection: +1,
+  n: -1,
+  e: null,
+  s: +1,
+  w: null,
+  nw: -1,
+  ne: -1,
+  se: +1,
+  sw: +1
+};
+
+function type(t) {
+  return {type: t};
+}
+
+// Ignore right-click, since that should open the context menu.
+function defaultFilter() {
+  return !d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].ctrlKey && !d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].button;
+}
+
+function defaultExtent() {
+  var svg = this.ownerSVGElement || this;
+  if (svg.hasAttribute("viewBox")) {
+    svg = svg.viewBox.baseVal;
+    return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]];
+  }
+  return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
+}
+
+function defaultTouchable() {
+  return navigator.maxTouchPoints || ("ontouchstart" in this);
+}
+
+// Like d3.local, but with the name “__brush” rather than auto-generated.
+function local(node) {
+  while (!node.__brush) if (!(node = node.parentNode)) return;
+  return node.__brush;
+}
+
+function empty(extent) {
+  return extent[0][0] === extent[1][0]
+      || extent[0][1] === extent[1][1];
+}
+
+function brushSelection(node) {
+  var state = node.__brush;
+  return state ? state.dim.output(state.selection) : null;
+}
+
+function brushX() {
+  return brush(X);
+}
+
+function brushY() {
+  return brush(Y);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return brush(XY);
+});
+
+function brush(dim) {
+  var extent = defaultExtent,
+      filter = defaultFilter,
+      touchable = defaultTouchable,
+      keys = true,
+      listeners = Object(d3_dispatch__WEBPACK_IMPORTED_MODULE_0__["dispatch"])("start", "brush", "end"),
+      handleSize = 6,
+      touchending;
+
+  function brush(group) {
+    var overlay = group
+        .property("__brush", initialize)
+      .selectAll(".overlay")
+      .data([type("overlay")]);
+
+    overlay.enter().append("rect")
+        .attr("class", "overlay")
+        .attr("pointer-events", "all")
+        .attr("cursor", cursors.overlay)
+      .merge(overlay)
+        .each(function() {
+          var extent = local(this).extent;
+          Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(this)
+              .attr("x", extent[0][0])
+              .attr("y", extent[0][1])
+              .attr("width", extent[1][0] - extent[0][0])
+              .attr("height", extent[1][1] - extent[0][1]);
+        });
+
+    group.selectAll(".selection")
+      .data([type("selection")])
+      .enter().append("rect")
+        .attr("class", "selection")
+        .attr("cursor", cursors.selection)
+        .attr("fill", "#777")
+        .attr("fill-opacity", 0.3)
+        .attr("stroke", "#fff")
+        .attr("shape-rendering", "crispEdges");
+
+    var handle = group.selectAll(".handle")
+      .data(dim.handles, function(d) { return d.type; });
+
+    handle.exit().remove();
+
+    handle.enter().append("rect")
+        .attr("class", function(d) { return "handle handle--" + d.type; })
+        .attr("cursor", function(d) { return cursors[d.type]; });
+
+    group
+        .each(redraw)
+        .attr("fill", "none")
+        .attr("pointer-events", "all")
+        .on("mousedown.brush", started)
+      .filter(touchable)
+        .on("touchstart.brush", started)
+        .on("touchmove.brush", touchmoved)
+        .on("touchend.brush touchcancel.brush", touchended)
+        .style("touch-action", "none")
+        .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+  }
+
+  brush.move = function(group, selection) {
+    if (group.selection) {
+      group
+          .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
+          .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
+          .tween("brush", function() {
+            var that = this,
+                state = that.__brush,
+                emit = emitter(that, arguments),
+                selection0 = state.selection,
+                selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
+                i = Object(d3_interpolate__WEBPACK_IMPORTED_MODULE_2__["interpolate"])(selection0, selection1);
+
+            function tween(t) {
+              state.selection = t === 1 && selection1 === null ? null : i(t);
+              redraw.call(that);
+              emit.brush();
+            }
+
+            return selection0 !== null && selection1 !== null ? tween : tween(1);
+          });
+    } else {
+      group
+          .each(function() {
+            var that = this,
+                args = arguments,
+                state = that.__brush,
+                selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
+                emit = emitter(that, args).beforestart();
+
+            Object(d3_transition__WEBPACK_IMPORTED_MODULE_4__["interrupt"])(that);
+            state.selection = selection1 === null ? null : selection1;
+            redraw.call(that);
+            emit.start().brush().end();
+          });
+    }
+  };
+
+  brush.clear = function(group) {
+    brush.move(group, null);
+  };
+
+  function redraw() {
+    var group = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(this),
+        selection = local(this).selection;
+
+    if (selection) {
+      group.selectAll(".selection")
+          .style("display", null)
+          .attr("x", selection[0][0])
+          .attr("y", selection[0][1])
+          .attr("width", selection[1][0] - selection[0][0])
+          .attr("height", selection[1][1] - selection[0][1]);
+
+      group.selectAll(".handle")
+          .style("display", null)
+          .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
+          .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
+          .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
+          .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
+    }
+
+    else {
+      group.selectAll(".selection,.handle")
+          .style("display", "none")
+          .attr("x", null)
+          .attr("y", null)
+          .attr("width", null)
+          .attr("height", null);
+    }
+  }
+
+  function emitter(that, args, clean) {
+    return (!clean && that.__brush.emitter) || new Emitter(that, args);
+  }
+
+  function Emitter(that, args) {
+    this.that = that;
+    this.args = args;
+    this.state = that.__brush;
+    this.active = 0;
+  }
+
+  Emitter.prototype = {
+    beforestart: function() {
+      if (++this.active === 1) this.state.emitter = this, this.starting = true;
+      return this;
+    },
+    start: function() {
+      if (this.starting) this.starting = false, this.emit("start");
+      else this.emit("brush");
+      return this;
+    },
+    brush: function() {
+      this.emit("brush");
+      return this;
+    },
+    end: function() {
+      if (--this.active === 0) delete this.state.emitter, this.emit("end");
+      return this;
+    },
+    emit: function(type) {
+      Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["customEvent"])(new _event_js__WEBPACK_IMPORTED_MODULE_6__["default"](brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
+    }
+  };
+
+  function started() {
+    if (touchending && !d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].touches) return;
+    if (!filter.apply(this, arguments)) return;
+
+    var that = this,
+        type = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].target.__data__.type,
+        mode = (keys && d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].altKey ? MODE_CENTER : MODE_HANDLE),
+        signX = dim === Y ? null : signsX[type],
+        signY = dim === X ? null : signsY[type],
+        state = local(that),
+        extent = state.extent,
+        selection = state.selection,
+        W = extent[0][0], w0, w1,
+        N = extent[0][1], n0, n1,
+        E = extent[1][0], e0, e1,
+        S = extent[1][1], s0, s1,
+        dx = 0,
+        dy = 0,
+        moving,
+        shifting = signX && signY && keys && d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].shiftKey,
+        lockX,
+        lockY,
+        pointer = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].touches ? toucher(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].changedTouches[0].identifier) : d3_selection__WEBPACK_IMPORTED_MODULE_3__["mouse"],
+        point0 = pointer(that),
+        point = point0,
+        emit = emitter(that, arguments, true).beforestart();
+
+    if (type === "overlay") {
+      if (selection) moving = true;
+      state.selection = selection = [
+        [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
+        [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
+      ];
+    } else {
+      w0 = selection[0][0];
+      n0 = selection[0][1];
+      e0 = selection[1][0];
+      s0 = selection[1][1];
+    }
+
+    w1 = w0;
+    n1 = n0;
+    e1 = e0;
+    s1 = s0;
+
+    var group = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(that)
+        .attr("pointer-events", "none");
+
+    var overlay = group.selectAll(".overlay")
+        .attr("cursor", cursors[type]);
+
+    if (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].touches) {
+      emit.moved = moved;
+      emit.ended = ended;
+    } else {
+      var view = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].view)
+          .on("mousemove.brush", moved, true)
+          .on("mouseup.brush", ended, true);
+      if (keys) view
+          .on("keydown.brush", keydowned, true)
+          .on("keyup.brush", keyupped, true)
+
+      Object(d3_drag__WEBPACK_IMPORTED_MODULE_1__["dragDisable"])(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].view);
+    }
+
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_7__["nopropagation"])();
+    Object(d3_transition__WEBPACK_IMPORTED_MODULE_4__["interrupt"])(that);
+    redraw.call(that);
+    emit.start();
+
+    function moved() {
+      var point1 = pointer(that);
+      if (shifting && !lockX && !lockY) {
+        if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
+        else lockX = true;
+      }
+      point = point1;
+      moving = true;
+      Object(_noevent_js__WEBPACK_IMPORTED_MODULE_7__["default"])();
+      move();
+    }
+
+    function move() {
+      var t;
+
+      dx = point[0] - point0[0];
+      dy = point[1] - point0[1];
+
+      switch (mode) {
+        case MODE_SPACE:
+        case MODE_DRAG: {
+          if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
+          if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
+          break;
+        }
+        case MODE_HANDLE: {
+          if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
+          else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
+          if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
+          else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
+          break;
+        }
+        case MODE_CENTER: {
+          if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
+          if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
+          break;
+        }
+      }
+
+      if (e1 < w1) {
+        signX *= -1;
+        t = w0, w0 = e0, e0 = t;
+        t = w1, w1 = e1, e1 = t;
+        if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
+      }
+
+      if (s1 < n1) {
+        signY *= -1;
+        t = n0, n0 = s0, s0 = t;
+        t = n1, n1 = s1, s1 = t;
+        if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
+      }
+
+      if (state.selection) selection = state.selection; // May be set by brush.move!
+      if (lockX) w1 = selection[0][0], e1 = selection[1][0];
+      if (lockY) n1 = selection[0][1], s1 = selection[1][1];
+
+      if (selection[0][0] !== w1
+          || selection[0][1] !== n1
+          || selection[1][0] !== e1
+          || selection[1][1] !== s1) {
+        state.selection = [[w1, n1], [e1, s1]];
+        redraw.call(that);
+        emit.brush();
+      }
+    }
+
+    function ended() {
+      Object(_noevent_js__WEBPACK_IMPORTED_MODULE_7__["nopropagation"])();
+      if (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].touches) {
+        if (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].touches.length) return;
+        if (touchending) clearTimeout(touchending);
+        touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
+      } else {
+        Object(d3_drag__WEBPACK_IMPORTED_MODULE_1__["dragEnable"])(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].view, moving);
+        view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
+      }
+      group.attr("pointer-events", "all");
+      overlay.attr("cursor", cursors.overlay);
+      if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
+      if (empty(selection)) state.selection = null, redraw.call(that);
+      emit.end();
+    }
+
+    function keydowned() {
+      switch (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].keyCode) {
+        case 16: { // SHIFT
+          shifting = signX && signY;
+          break;
+        }
+        case 18: { // ALT
+          if (mode === MODE_HANDLE) {
+            if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
+            if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
+            mode = MODE_CENTER;
+            move();
+          }
+          break;
+        }
+        case 32: { // SPACE; takes priority over ALT
+          if (mode === MODE_HANDLE || mode === MODE_CENTER) {
+            if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
+            if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
+            mode = MODE_SPACE;
+            overlay.attr("cursor", cursors.selection);
+            move();
+          }
+          break;
+        }
+        default: return;
+      }
+      Object(_noevent_js__WEBPACK_IMPORTED_MODULE_7__["default"])();
+    }
+
+    function keyupped() {
+      switch (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].keyCode) {
+        case 16: { // SHIFT
+          if (shifting) {
+            lockX = lockY = shifting = false;
+            move();
+          }
+          break;
+        }
+        case 18: { // ALT
+          if (mode === MODE_CENTER) {
+            if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
+            if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
+            mode = MODE_HANDLE;
+            move();
+          }
+          break;
+        }
+        case 32: { // SPACE
+          if (mode === MODE_SPACE) {
+            if (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].altKey) {
+              if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
+              if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
+              mode = MODE_CENTER;
+            } else {
+              if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
+              if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
+              mode = MODE_HANDLE;
+            }
+            overlay.attr("cursor", cursors[type]);
+            move();
+          }
+          break;
+        }
+        default: return;
+      }
+      Object(_noevent_js__WEBPACK_IMPORTED_MODULE_7__["default"])();
+    }
+  }
+
+  function touchmoved() {
+    emitter(this, arguments).moved();
+  }
+
+  function touchended() {
+    emitter(this, arguments).ended();
+  }
+
+  function initialize() {
+    var state = this.__brush || {selection: null};
+    state.extent = number2(extent.apply(this, arguments));
+    state.dim = dim;
+    return state;
+  }
+
+  brush.extent = function(_) {
+    return arguments.length ? (extent = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_5__["default"])(number2(_)), brush) : extent;
+  };
+
+  brush.filter = function(_) {
+    return arguments.length ? (filter = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_5__["default"])(!!_), brush) : filter;
+  };
+
+  brush.touchable = function(_) {
+    return arguments.length ? (touchable = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_5__["default"])(!!_), brush) : touchable;
+  };
+
+  brush.handleSize = function(_) {
+    return arguments.length ? (handleSize = +_, brush) : handleSize;
+  };
+
+  brush.keyModifiers = function(_) {
+    return arguments.length ? (keys = !!_, brush) : keys;
+  };
+
+  brush.on = function() {
+    var value = listeners.on.apply(listeners, arguments);
+    return value === listeners ? brush : value;
+  };
+
+  return brush;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-brush/src/constant.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-brush/src/constant.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-brush/src/event.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-brush/src/event.js ***!
+  \********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(target, type, selection) {
+  this.target = target;
+  this.type = type;
+  this.selection = selection;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-brush/src/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-brush/src/index.js ***!
+  \********************************************/
+/*! exports provided: brush, brushX, brushY, brushSelection */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _brush_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./brush.js */ "./node_modules/d3-brush/src/brush.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "brush", function() { return _brush_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "brushX", function() { return _brush_js__WEBPACK_IMPORTED_MODULE_0__["brushX"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "brushY", function() { return _brush_js__WEBPACK_IMPORTED_MODULE_0__["brushY"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "brushSelection", function() { return _brush_js__WEBPACK_IMPORTED_MODULE_0__["brushSelection"]; });
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-brush/src/noevent.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-brush/src/noevent.js ***!
+  \**********************************************/
+/*! exports provided: nopropagation, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nopropagation", function() { return nopropagation; });
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+
+
+function nopropagation() {
+  d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].preventDefault();
+  d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-chord/src/array.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-chord/src/array.js ***!
+  \********************************************/
+/*! exports provided: slice */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
+var slice = Array.prototype.slice;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-chord/src/chord.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-chord/src/chord.js ***!
+  \********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math */ "./node_modules/d3-chord/src/math.js");
+
+
+
+function compareValue(compare) {
+  return function(a, b) {
+    return compare(
+      a.source.value + a.target.value,
+      b.source.value + b.target.value
+    );
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var padAngle = 0,
+      sortGroups = null,
+      sortSubgroups = null,
+      sortChords = null;
+
+  function chord(matrix) {
+    var n = matrix.length,
+        groupSums = [],
+        groupIndex = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(n),
+        subgroupIndex = [],
+        chords = [],
+        groups = chords.groups = new Array(n),
+        subgroups = new Array(n * n),
+        k,
+        x,
+        x0,
+        dx,
+        i,
+        j;
+
+    // Compute the sum.
+    k = 0, i = -1; while (++i < n) {
+      x = 0, j = -1; while (++j < n) {
+        x += matrix[i][j];
+      }
+      groupSums.push(x);
+      subgroupIndex.push(Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(n));
+      k += x;
+    }
+
+    // Sort groups…
+    if (sortGroups) groupIndex.sort(function(a, b) {
+      return sortGroups(groupSums[a], groupSums[b]);
+    });
+
+    // Sort subgroups…
+    if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
+      d.sort(function(a, b) {
+        return sortSubgroups(matrix[i][a], matrix[i][b]);
+      });
+    });
+
+    // Convert the sum to scaling factor for [0, 2pi].
+    // TODO Allow start and end angle to be specified?
+    // TODO Allow padding to be specified as percentage?
+    k = Object(_math__WEBPACK_IMPORTED_MODULE_1__["max"])(0, _math__WEBPACK_IMPORTED_MODULE_1__["tau"] - padAngle * n) / k;
+    dx = k ? padAngle : _math__WEBPACK_IMPORTED_MODULE_1__["tau"] / n;
+
+    // Compute the start and end angle for each group and subgroup.
+    // Note: Opera has a bug reordering object literal properties!
+    x = 0, i = -1; while (++i < n) {
+      x0 = x, j = -1; while (++j < n) {
+        var di = groupIndex[i],
+            dj = subgroupIndex[di][j],
+            v = matrix[di][dj],
+            a0 = x,
+            a1 = x += v * k;
+        subgroups[dj * n + di] = {
+          index: di,
+          subindex: dj,
+          startAngle: a0,
+          endAngle: a1,
+          value: v
+        };
+      }
+      groups[di] = {
+        index: di,
+        startAngle: x0,
+        endAngle: x,
+        value: groupSums[di]
+      };
+      x += dx;
+    }
+
+    // Generate chords for each (non-empty) subgroup-subgroup link.
+    i = -1; while (++i < n) {
+      j = i - 1; while (++j < n) {
+        var source = subgroups[j * n + i],
+            target = subgroups[i * n + j];
+        if (source.value || target.value) {
+          chords.push(source.value < target.value
+              ? {source: target, target: source}
+              : {source: source, target: target});
+        }
+      }
+    }
+
+    return sortChords ? chords.sort(sortChords) : chords;
+  }
+
+  chord.padAngle = function(_) {
+    return arguments.length ? (padAngle = Object(_math__WEBPACK_IMPORTED_MODULE_1__["max"])(0, _), chord) : padAngle;
+  };
+
+  chord.sortGroups = function(_) {
+    return arguments.length ? (sortGroups = _, chord) : sortGroups;
+  };
+
+  chord.sortSubgroups = function(_) {
+    return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
+  };
+
+  chord.sortChords = function(_) {
+    return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
+  };
+
+  return chord;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-chord/src/constant.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-chord/src/constant.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-chord/src/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-chord/src/index.js ***!
+  \********************************************/
+/*! exports provided: chord, ribbon */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _chord__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./chord */ "./node_modules/d3-chord/src/chord.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "chord", function() { return _chord__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _ribbon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ribbon */ "./node_modules/d3-chord/src/ribbon.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ribbon", function() { return _ribbon__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-chord/src/math.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-chord/src/math.js ***!
+  \*******************************************/
+/*! exports provided: cos, sin, pi, halfPi, tau, max */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cos", function() { return cos; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sin", function() { return sin; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pi", function() { return pi; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "halfPi", function() { return halfPi; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tau", function() { return tau; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; });
+var cos = Math.cos;
+var sin = Math.sin;
+var pi = Math.PI;
+var halfPi = pi / 2;
+var tau = pi * 2;
+var max = Math.max;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-chord/src/ribbon.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-chord/src/ribbon.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./array */ "./node_modules/d3-chord/src/array.js");
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-chord/src/constant.js");
+/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math */ "./node_modules/d3-chord/src/math.js");
+/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
+
+
+
+
+
+function defaultSource(d) {
+  return d.source;
+}
+
+function defaultTarget(d) {
+  return d.target;
+}
+
+function defaultRadius(d) {
+  return d.radius;
+}
+
+function defaultStartAngle(d) {
+  return d.startAngle;
+}
+
+function defaultEndAngle(d) {
+  return d.endAngle;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var source = defaultSource,
+      target = defaultTarget,
+      radius = defaultRadius,
+      startAngle = defaultStartAngle,
+      endAngle = defaultEndAngle,
+      context = null;
+
+  function ribbon() {
+    var buffer,
+        argv = _array__WEBPACK_IMPORTED_MODULE_0__["slice"].call(arguments),
+        s = source.apply(this, argv),
+        t = target.apply(this, argv),
+        sr = +radius.apply(this, (argv[0] = s, argv)),
+        sa0 = startAngle.apply(this, argv) - _math__WEBPACK_IMPORTED_MODULE_2__["halfPi"],
+        sa1 = endAngle.apply(this, argv) - _math__WEBPACK_IMPORTED_MODULE_2__["halfPi"],
+        sx0 = sr * Object(_math__WEBPACK_IMPORTED_MODULE_2__["cos"])(sa0),
+        sy0 = sr * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(sa0),
+        tr = +radius.apply(this, (argv[0] = t, argv)),
+        ta0 = startAngle.apply(this, argv) - _math__WEBPACK_IMPORTED_MODULE_2__["halfPi"],
+        ta1 = endAngle.apply(this, argv) - _math__WEBPACK_IMPORTED_MODULE_2__["halfPi"];
+
+    if (!context) context = buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_3__["path"])();
+
+    context.moveTo(sx0, sy0);
+    context.arc(0, 0, sr, sa0, sa1);
+    if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
+      context.quadraticCurveTo(0, 0, tr * Object(_math__WEBPACK_IMPORTED_MODULE_2__["cos"])(ta0), tr * Object(_math__WEBPACK_IMPORTED_MODULE_2__["sin"])(ta0));
+      context.arc(0, 0, tr, ta0, ta1);
+    }
+    context.quadraticCurveTo(0, 0, sx0, sy0);
+    context.closePath();
+
+    if (buffer) return context = null, buffer + "" || null;
+  }
+
+  ribbon.radius = function(_) {
+    return arguments.length ? (radius = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), ribbon) : radius;
+  };
+
+  ribbon.startAngle = function(_) {
+    return arguments.length ? (startAngle = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), ribbon) : startAngle;
+  };
+
+  ribbon.endAngle = function(_) {
+    return arguments.length ? (endAngle = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), ribbon) : endAngle;
+  };
+
+  ribbon.source = function(_) {
+    return arguments.length ? (source = _, ribbon) : source;
+  };
+
+  ribbon.target = function(_) {
+    return arguments.length ? (target = _, ribbon) : target;
+  };
+
+  ribbon.context = function(_) {
+    return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
+  };
+
+  return ribbon;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-collection/src/entries.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-collection/src/entries.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(map) {
+  var entries = [];
+  for (var key in map) entries.push({key: key, value: map[key]});
+  return entries;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-collection/src/index.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-collection/src/index.js ***!
+  \*************************************************/
+/*! exports provided: nest, set, map, keys, values, entries */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _nest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./nest */ "./node_modules/d3-collection/src/nest.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nest", function() { return _nest__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _set__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./set */ "./node_modules/d3-collection/src/set.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "set", function() { return _set__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./map */ "./node_modules/d3-collection/src/map.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _map__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./keys */ "./node_modules/d3-collection/src/keys.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "keys", function() { return _keys__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _values__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./values */ "./node_modules/d3-collection/src/values.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "values", function() { return _values__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _entries__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./entries */ "./node_modules/d3-collection/src/entries.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "entries", function() { return _entries__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-collection/src/keys.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-collection/src/keys.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(map) {
+  var keys = [];
+  for (var key in map) keys.push(key);
+  return keys;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-collection/src/map.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-collection/src/map.js ***!
+  \***********************************************/
+/*! exports provided: prefix, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prefix", function() { return prefix; });
+var prefix = "$";
+
+function Map() {}
+
+Map.prototype = map.prototype = {
+  constructor: Map,
+  has: function(key) {
+    return (prefix + key) in this;
+  },
+  get: function(key) {
+    return this[prefix + key];
+  },
+  set: function(key, value) {
+    this[prefix + key] = value;
+    return this;
+  },
+  remove: function(key) {
+    var property = prefix + key;
+    return property in this && delete this[property];
+  },
+  clear: function() {
+    for (var property in this) if (property[0] === prefix) delete this[property];
+  },
+  keys: function() {
+    var keys = [];
+    for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
+    return keys;
+  },
+  values: function() {
+    var values = [];
+    for (var property in this) if (property[0] === prefix) values.push(this[property]);
+    return values;
+  },
+  entries: function() {
+    var entries = [];
+    for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
+    return entries;
+  },
+  size: function() {
+    var size = 0;
+    for (var property in this) if (property[0] === prefix) ++size;
+    return size;
+  },
+  empty: function() {
+    for (var property in this) if (property[0] === prefix) return false;
+    return true;
+  },
+  each: function(f) {
+    for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
+  }
+};
+
+function map(object, f) {
+  var map = new Map;
+
+  // Copy constructor.
+  if (object instanceof Map) object.each(function(value, key) { map.set(key, value); });
+
+  // Index array by numeric index or specified key function.
+  else if (Array.isArray(object)) {
+    var i = -1,
+        n = object.length,
+        o;
+
+    if (f == null) while (++i < n) map.set(i, object[i]);
+    else while (++i < n) map.set(f(o = object[i], i, object), o);
+  }
+
+  // Convert object to map.
+  else if (object) for (var key in object) map.set(key, object[key]);
+
+  return map;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (map);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-collection/src/nest.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-collection/src/nest.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./node_modules/d3-collection/src/map.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var keys = [],
+      sortKeys = [],
+      sortValues,
+      rollup,
+      nest;
+
+  function apply(array, depth, createResult, setResult) {
+    if (depth >= keys.length) {
+      if (sortValues != null) array.sort(sortValues);
+      return rollup != null ? rollup(array) : array;
+    }
+
+    var i = -1,
+        n = array.length,
+        key = keys[depth++],
+        keyValue,
+        value,
+        valuesByKey = Object(_map__WEBPACK_IMPORTED_MODULE_0__["default"])(),
+        values,
+        result = createResult();
+
+    while (++i < n) {
+      if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
+        values.push(value);
+      } else {
+        valuesByKey.set(keyValue, [value]);
+      }
+    }
+
+    valuesByKey.each(function(values, key) {
+      setResult(result, key, apply(values, depth, createResult, setResult));
+    });
+
+    return result;
+  }
+
+  function entries(map, depth) {
+    if (++depth > keys.length) return map;
+    var array, sortKey = sortKeys[depth - 1];
+    if (rollup != null && depth >= keys.length) array = map.entries();
+    else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
+    return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
+  }
+
+  return nest = {
+    object: function(array) { return apply(array, 0, createObject, setObject); },
+    map: function(array) { return apply(array, 0, createMap, setMap); },
+    entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
+    key: function(d) { keys.push(d); return nest; },
+    sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
+    sortValues: function(order) { sortValues = order; return nest; },
+    rollup: function(f) { rollup = f; return nest; }
+  };
+});
+
+function createObject() {
+  return {};
+}
+
+function setObject(object, key, value) {
+  object[key] = value;
+}
+
+function createMap() {
+  return Object(_map__WEBPACK_IMPORTED_MODULE_0__["default"])();
+}
+
+function setMap(map, key, value) {
+  map.set(key, value);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-collection/src/set.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-collection/src/set.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./map */ "./node_modules/d3-collection/src/map.js");
+
+
+function Set() {}
+
+var proto = _map__WEBPACK_IMPORTED_MODULE_0__["default"].prototype;
+
+Set.prototype = set.prototype = {
+  constructor: Set,
+  has: proto.has,
+  add: function(value) {
+    value += "";
+    this[_map__WEBPACK_IMPORTED_MODULE_0__["prefix"] + value] = value;
+    return this;
+  },
+  remove: proto.remove,
+  clear: proto.clear,
+  values: proto.keys,
+  size: proto.size,
+  empty: proto.empty,
+  each: proto.each
+};
+
+function set(object, f) {
+  var set = new Set;
+
+  // Copy constructor.
+  if (object instanceof Set) object.each(function(value) { set.add(value); });
+
+  // Otherwise, assume it’s an array.
+  else if (object) {
+    var i = -1, n = object.length;
+    if (f == null) while (++i < n) set.add(object[i]);
+    else while (++i < n) set.add(f(object[i], i, object));
+  }
+
+  return set;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (set);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-collection/src/values.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-collection/src/values.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(map) {
+  var values = [];
+  for (var key in map) values.push(map[key]);
+  return values;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-color/src/color.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-color/src/color.js ***!
+  \********************************************/
+/*! exports provided: Color, darker, brighter, default, rgbConvert, rgb, Rgb, hslConvert, hsl */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Color", function() { return Color; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "darker", function() { return darker; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "brighter", function() { return brighter; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return color; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbConvert", function() { return rgbConvert; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgb", function() { return rgb; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Rgb", function() { return Rgb; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hslConvert", function() { return hslConvert; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hsl", function() { return hsl; });
+/* harmony import */ var _define_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./define.js */ "./node_modules/d3-color/src/define.js");
+
+
+function Color() {}
+
+var darker = 0.7;
+var brighter = 1 / darker;
+
+var reI = "\\s*([+-]?\\d+)\\s*",
+    reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
+    reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
+    reHex = /^#([0-9a-f]{3,8})$/,
+    reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
+    reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
+    reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
+    reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
+    reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
+    reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
+
+var named = {
+  aliceblue: 0xf0f8ff,
+  antiquewhite: 0xfaebd7,
+  aqua: 0x00ffff,
+  aquamarine: 0x7fffd4,
+  azure: 0xf0ffff,
+  beige: 0xf5f5dc,
+  bisque: 0xffe4c4,
+  black: 0x000000,
+  blanchedalmond: 0xffebcd,
+  blue: 0x0000ff,
+  blueviolet: 0x8a2be2,
+  brown: 0xa52a2a,
+  burlywood: 0xdeb887,
+  cadetblue: 0x5f9ea0,
+  chartreuse: 0x7fff00,
+  chocolate: 0xd2691e,
+  coral: 0xff7f50,
+  cornflowerblue: 0x6495ed,
+  cornsilk: 0xfff8dc,
+  crimson: 0xdc143c,
+  cyan: 0x00ffff,
+  darkblue: 0x00008b,
+  darkcyan: 0x008b8b,
+  darkgoldenrod: 0xb8860b,
+  darkgray: 0xa9a9a9,
+  darkgreen: 0x006400,
+  darkgrey: 0xa9a9a9,
+  darkkhaki: 0xbdb76b,
+  darkmagenta: 0x8b008b,
+  darkolivegreen: 0x556b2f,
+  darkorange: 0xff8c00,
+  darkorchid: 0x9932cc,
+  darkred: 0x8b0000,
+  darksalmon: 0xe9967a,
+  darkseagreen: 0x8fbc8f,
+  darkslateblue: 0x483d8b,
+  darkslategray: 0x2f4f4f,
+  darkslategrey: 0x2f4f4f,
+  darkturquoise: 0x00ced1,
+  darkviolet: 0x9400d3,
+  deeppink: 0xff1493,
+  deepskyblue: 0x00bfff,
+  dimgray: 0x696969,
+  dimgrey: 0x696969,
+  dodgerblue: 0x1e90ff,
+  firebrick: 0xb22222,
+  floralwhite: 0xfffaf0,
+  forestgreen: 0x228b22,
+  fuchsia: 0xff00ff,
+  gainsboro: 0xdcdcdc,
+  ghostwhite: 0xf8f8ff,
+  gold: 0xffd700,
+  goldenrod: 0xdaa520,
+  gray: 0x808080,
+  green: 0x008000,
+  greenyellow: 0xadff2f,
+  grey: 0x808080,
+  honeydew: 0xf0fff0,
+  hotpink: 0xff69b4,
+  indianred: 0xcd5c5c,
+  indigo: 0x4b0082,
+  ivory: 0xfffff0,
+  khaki: 0xf0e68c,
+  lavender: 0xe6e6fa,
+  lavenderblush: 0xfff0f5,
+  lawngreen: 0x7cfc00,
+  lemonchiffon: 0xfffacd,
+  lightblue: 0xadd8e6,
+  lightcoral: 0xf08080,
+  lightcyan: 0xe0ffff,
+  lightgoldenrodyellow: 0xfafad2,
+  lightgray: 0xd3d3d3,
+  lightgreen: 0x90ee90,
+  lightgrey: 0xd3d3d3,
+  lightpink: 0xffb6c1,
+  lightsalmon: 0xffa07a,
+  lightseagreen: 0x20b2aa,
+  lightskyblue: 0x87cefa,
+  lightslategray: 0x778899,
+  lightslategrey: 0x778899,
+  lightsteelblue: 0xb0c4de,
+  lightyellow: 0xffffe0,
+  lime: 0x00ff00,
+  limegreen: 0x32cd32,
+  linen: 0xfaf0e6,
+  magenta: 0xff00ff,
+  maroon: 0x800000,
+  mediumaquamarine: 0x66cdaa,
+  mediumblue: 0x0000cd,
+  mediumorchid: 0xba55d3,
+  mediumpurple: 0x9370db,
+  mediumseagreen: 0x3cb371,
+  mediumslateblue: 0x7b68ee,
+  mediumspringgreen: 0x00fa9a,
+  mediumturquoise: 0x48d1cc,
+  mediumvioletred: 0xc71585,
+  midnightblue: 0x191970,
+  mintcream: 0xf5fffa,
+  mistyrose: 0xffe4e1,
+  moccasin: 0xffe4b5,
+  navajowhite: 0xffdead,
+  navy: 0x000080,
+  oldlace: 0xfdf5e6,
+  olive: 0x808000,
+  olivedrab: 0x6b8e23,
+  orange: 0xffa500,
+  orangered: 0xff4500,
+  orchid: 0xda70d6,
+  palegoldenrod: 0xeee8aa,
+  palegreen: 0x98fb98,
+  paleturquoise: 0xafeeee,
+  palevioletred: 0xdb7093,
+  papayawhip: 0xffefd5,
+  peachpuff: 0xffdab9,
+  peru: 0xcd853f,
+  pink: 0xffc0cb,
+  plum: 0xdda0dd,
+  powderblue: 0xb0e0e6,
+  purple: 0x800080,
+  rebeccapurple: 0x663399,
+  red: 0xff0000,
+  rosybrown: 0xbc8f8f,
+  royalblue: 0x4169e1,
+  saddlebrown: 0x8b4513,
+  salmon: 0xfa8072,
+  sandybrown: 0xf4a460,
+  seagreen: 0x2e8b57,
+  seashell: 0xfff5ee,
+  sienna: 0xa0522d,
+  silver: 0xc0c0c0,
+  skyblue: 0x87ceeb,
+  slateblue: 0x6a5acd,
+  slategray: 0x708090,
+  slategrey: 0x708090,
+  snow: 0xfffafa,
+  springgreen: 0x00ff7f,
+  steelblue: 0x4682b4,
+  tan: 0xd2b48c,
+  teal: 0x008080,
+  thistle: 0xd8bfd8,
+  tomato: 0xff6347,
+  turquoise: 0x40e0d0,
+  violet: 0xee82ee,
+  wheat: 0xf5deb3,
+  white: 0xffffff,
+  whitesmoke: 0xf5f5f5,
+  yellow: 0xffff00,
+  yellowgreen: 0x9acd32
+};
+
+Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Color, color, {
+  copy: function(channels) {
+    return Object.assign(new this.constructor, this, channels);
+  },
+  displayable: function() {
+    return this.rgb().displayable();
+  },
+  hex: color_formatHex, // Deprecated! Use color.formatHex.
+  formatHex: color_formatHex,
+  formatHsl: color_formatHsl,
+  formatRgb: color_formatRgb,
+  toString: color_formatRgb
+});
+
+function color_formatHex() {
+  return this.rgb().formatHex();
+}
+
+function color_formatHsl() {
+  return hslConvert(this).formatHsl();
+}
+
+function color_formatRgb() {
+  return this.rgb().formatRgb();
+}
+
+function color(format) {
+  var m, l;
+  format = (format + "").trim().toLowerCase();
+  return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000
+      : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00
+      : l === 8 ? new Rgb(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000
+      : l === 4 ? new Rgb((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000
+      : null) // invalid hex
+      : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
+      : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
+      : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
+      : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
+      : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
+      : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
+      : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins
+      : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
+      : null;
+}
+
+function rgbn(n) {
+  return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
+}
+
+function rgba(r, g, b, a) {
+  if (a <= 0) r = g = b = NaN;
+  return new Rgb(r, g, b, a);
+}
+
+function rgbConvert(o) {
+  if (!(o instanceof Color)) o = color(o);
+  if (!o) return new Rgb;
+  o = o.rgb();
+  return new Rgb(o.r, o.g, o.b, o.opacity);
+}
+
+function rgb(r, g, b, opacity) {
+  return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
+}
+
+function Rgb(r, g, b, opacity) {
+  this.r = +r;
+  this.g = +g;
+  this.b = +b;
+  this.opacity = +opacity;
+}
+
+Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Rgb, rgb, Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["extend"])(Color, {
+  brighter: function(k) {
+    k = k == null ? brighter : Math.pow(brighter, k);
+    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+  },
+  darker: function(k) {
+    k = k == null ? darker : Math.pow(darker, k);
+    return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
+  },
+  rgb: function() {
+    return this;
+  },
+  displayable: function() {
+    return (-0.5 <= this.r && this.r < 255.5)
+        && (-0.5 <= this.g && this.g < 255.5)
+        && (-0.5 <= this.b && this.b < 255.5)
+        && (0 <= this.opacity && this.opacity <= 1);
+  },
+  hex: rgb_formatHex, // Deprecated! Use color.formatHex.
+  formatHex: rgb_formatHex,
+  formatRgb: rgb_formatRgb,
+  toString: rgb_formatRgb
+}));
+
+function rgb_formatHex() {
+  return "#" + hex(this.r) + hex(this.g) + hex(this.b);
+}
+
+function rgb_formatRgb() {
+  var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
+  return (a === 1 ? "rgb(" : "rgba(")
+      + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
+      + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
+      + Math.max(0, Math.min(255, Math.round(this.b) || 0))
+      + (a === 1 ? ")" : ", " + a + ")");
+}
+
+function hex(value) {
+  value = Math.max(0, Math.min(255, Math.round(value) || 0));
+  return (value < 16 ? "0" : "") + value.toString(16);
+}
+
+function hsla(h, s, l, a) {
+  if (a <= 0) h = s = l = NaN;
+  else if (l <= 0 || l >= 1) h = s = NaN;
+  else if (s <= 0) h = NaN;
+  return new Hsl(h, s, l, a);
+}
+
+function hslConvert(o) {
+  if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
+  if (!(o instanceof Color)) o = color(o);
+  if (!o) return new Hsl;
+  if (o instanceof Hsl) return o;
+  o = o.rgb();
+  var r = o.r / 255,
+      g = o.g / 255,
+      b = o.b / 255,
+      min = Math.min(r, g, b),
+      max = Math.max(r, g, b),
+      h = NaN,
+      s = max - min,
+      l = (max + min) / 2;
+  if (s) {
+    if (r === max) h = (g - b) / s + (g < b) * 6;
+    else if (g === max) h = (b - r) / s + 2;
+    else h = (r - g) / s + 4;
+    s /= l < 0.5 ? max + min : 2 - max - min;
+    h *= 60;
+  } else {
+    s = l > 0 && l < 1 ? 0 : h;
+  }
+  return new Hsl(h, s, l, o.opacity);
+}
+
+function hsl(h, s, l, opacity) {
+  return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
+}
+
+function Hsl(h, s, l, opacity) {
+  this.h = +h;
+  this.s = +s;
+  this.l = +l;
+  this.opacity = +opacity;
+}
+
+Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Hsl, hsl, Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["extend"])(Color, {
+  brighter: function(k) {
+    k = k == null ? brighter : Math.pow(brighter, k);
+    return new Hsl(this.h, this.s, this.l * k, this.opacity);
+  },
+  darker: function(k) {
+    k = k == null ? darker : Math.pow(darker, k);
+    return new Hsl(this.h, this.s, this.l * k, this.opacity);
+  },
+  rgb: function() {
+    var h = this.h % 360 + (this.h < 0) * 360,
+        s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
+        l = this.l,
+        m2 = l + (l < 0.5 ? l : 1 - l) * s,
+        m1 = 2 * l - m2;
+    return new Rgb(
+      hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
+      hsl2rgb(h, m1, m2),
+      hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
+      this.opacity
+    );
+  },
+  displayable: function() {
+    return (0 <= this.s && this.s <= 1 || isNaN(this.s))
+        && (0 <= this.l && this.l <= 1)
+        && (0 <= this.opacity && this.opacity <= 1);
+  },
+  formatHsl: function() {
+    var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
+    return (a === 1 ? "hsl(" : "hsla(")
+        + (this.h || 0) + ", "
+        + (this.s || 0) * 100 + "%, "
+        + (this.l || 0) * 100 + "%"
+        + (a === 1 ? ")" : ", " + a + ")");
+  }
+}));
+
+/* From FvD 13.37, CSS Color Module Level 3 */
+function hsl2rgb(h, m1, m2) {
+  return (h < 60 ? m1 + (m2 - m1) * h / 60
+      : h < 180 ? m2
+      : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
+      : m1) * 255;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-color/src/cubehelix.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-color/src/cubehelix.js ***!
+  \************************************************/
+/*! exports provided: default, Cubehelix */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return cubehelix; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cubehelix", function() { return Cubehelix; });
+/* harmony import */ var _define_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./define.js */ "./node_modules/d3-color/src/define.js");
+/* harmony import */ var _color_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color.js */ "./node_modules/d3-color/src/color.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-color/src/math.js");
+
+
+
+
+var A = -0.14861,
+    B = +1.78277,
+    C = -0.29227,
+    D = -0.90649,
+    E = +1.97294,
+    ED = E * D,
+    EB = E * B,
+    BC_DA = B * C - D * A;
+
+function cubehelixConvert(o) {
+  if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
+  if (!(o instanceof _color_js__WEBPACK_IMPORTED_MODULE_1__["Rgb"])) o = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["rgbConvert"])(o);
+  var r = o.r / 255,
+      g = o.g / 255,
+      b = o.b / 255,
+      l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
+      bl = b - l,
+      k = (E * (g - l) - C * bl) / D,
+      s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
+      h = s ? Math.atan2(k, bl) * _math_js__WEBPACK_IMPORTED_MODULE_2__["rad2deg"] - 120 : NaN;
+  return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
+}
+
+function cubehelix(h, s, l, opacity) {
+  return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
+}
+
+function Cubehelix(h, s, l, opacity) {
+  this.h = +h;
+  this.s = +s;
+  this.l = +l;
+  this.opacity = +opacity;
+}
+
+Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Cubehelix, cubehelix, Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["extend"])(_color_js__WEBPACK_IMPORTED_MODULE_1__["Color"], {
+  brighter: function(k) {
+    k = k == null ? _color_js__WEBPACK_IMPORTED_MODULE_1__["brighter"] : Math.pow(_color_js__WEBPACK_IMPORTED_MODULE_1__["brighter"], k);
+    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
+  },
+  darker: function(k) {
+    k = k == null ? _color_js__WEBPACK_IMPORTED_MODULE_1__["darker"] : Math.pow(_color_js__WEBPACK_IMPORTED_MODULE_1__["darker"], k);
+    return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
+  },
+  rgb: function() {
+    var h = isNaN(this.h) ? 0 : (this.h + 120) * _math_js__WEBPACK_IMPORTED_MODULE_2__["deg2rad"],
+        l = +this.l,
+        a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
+        cosh = Math.cos(h),
+        sinh = Math.sin(h);
+    return new _color_js__WEBPACK_IMPORTED_MODULE_1__["Rgb"](
+      255 * (l + a * (A * cosh + B * sinh)),
+      255 * (l + a * (C * cosh + D * sinh)),
+      255 * (l + a * (E * cosh)),
+      this.opacity
+    );
+  }
+}));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-color/src/define.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-color/src/define.js ***!
+  \*********************************************/
+/*! exports provided: default, extend */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extend", function() { return extend; });
+/* harmony default export */ __webpack_exports__["default"] = (function(constructor, factory, prototype) {
+  constructor.prototype = factory.prototype = prototype;
+  prototype.constructor = constructor;
+});
+
+function extend(parent, definition) {
+  var prototype = Object.create(parent.prototype);
+  for (var key in definition) prototype[key] = definition[key];
+  return prototype;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-color/src/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-color/src/index.js ***!
+  \********************************************/
+/*! exports provided: color, rgb, hsl, lab, hcl, lch, gray, cubehelix */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _color_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./color.js */ "./node_modules/d3-color/src/color.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "color", function() { return _color_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rgb", function() { return _color_js__WEBPACK_IMPORTED_MODULE_0__["rgb"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hsl", function() { return _color_js__WEBPACK_IMPORTED_MODULE_0__["hsl"]; });
+
+/* harmony import */ var _lab_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lab.js */ "./node_modules/d3-color/src/lab.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lab", function() { return _lab_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hcl", function() { return _lab_js__WEBPACK_IMPORTED_MODULE_1__["hcl"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lch", function() { return _lab_js__WEBPACK_IMPORTED_MODULE_1__["lch"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gray", function() { return _lab_js__WEBPACK_IMPORTED_MODULE_1__["gray"]; });
+
+/* harmony import */ var _cubehelix_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cubehelix.js */ "./node_modules/d3-color/src/cubehelix.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cubehelix", function() { return _cubehelix_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-color/src/lab.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-color/src/lab.js ***!
+  \******************************************/
+/*! exports provided: gray, default, Lab, lch, hcl, Hcl */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gray", function() { return gray; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return lab; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Lab", function() { return Lab; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lch", function() { return lch; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hcl", function() { return hcl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Hcl", function() { return Hcl; });
+/* harmony import */ var _define_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./define.js */ "./node_modules/d3-color/src/define.js");
+/* harmony import */ var _color_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color.js */ "./node_modules/d3-color/src/color.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-color/src/math.js");
+
+
+
+
+// https://observablehq.com/@mbostock/lab-and-rgb
+var K = 18,
+    Xn = 0.96422,
+    Yn = 1,
+    Zn = 0.82521,
+    t0 = 4 / 29,
+    t1 = 6 / 29,
+    t2 = 3 * t1 * t1,
+    t3 = t1 * t1 * t1;
+
+function labConvert(o) {
+  if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
+  if (o instanceof Hcl) return hcl2lab(o);
+  if (!(o instanceof _color_js__WEBPACK_IMPORTED_MODULE_1__["Rgb"])) o = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["rgbConvert"])(o);
+  var r = rgb2lrgb(o.r),
+      g = rgb2lrgb(o.g),
+      b = rgb2lrgb(o.b),
+      y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;
+  if (r === g && g === b) x = z = y; else {
+    x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);
+    z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);
+  }
+  return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
+}
+
+function gray(l, opacity) {
+  return new Lab(l, 0, 0, opacity == null ? 1 : opacity);
+}
+
+function lab(l, a, b, opacity) {
+  return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
+}
+
+function Lab(l, a, b, opacity) {
+  this.l = +l;
+  this.a = +a;
+  this.b = +b;
+  this.opacity = +opacity;
+}
+
+Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Lab, lab, Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["extend"])(_color_js__WEBPACK_IMPORTED_MODULE_1__["Color"], {
+  brighter: function(k) {
+    return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);
+  },
+  darker: function(k) {
+    return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);
+  },
+  rgb: function() {
+    var y = (this.l + 16) / 116,
+        x = isNaN(this.a) ? y : y + this.a / 500,
+        z = isNaN(this.b) ? y : y - this.b / 200;
+    x = Xn * lab2xyz(x);
+    y = Yn * lab2xyz(y);
+    z = Zn * lab2xyz(z);
+    return new _color_js__WEBPACK_IMPORTED_MODULE_1__["Rgb"](
+      lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),
+      lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),
+      lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),
+      this.opacity
+    );
+  }
+}));
+
+function xyz2lab(t) {
+  return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
+}
+
+function lab2xyz(t) {
+  return t > t1 ? t * t * t : t2 * (t - t0);
+}
+
+function lrgb2rgb(x) {
+  return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
+}
+
+function rgb2lrgb(x) {
+  return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
+}
+
+function hclConvert(o) {
+  if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
+  if (!(o instanceof Lab)) o = labConvert(o);
+  if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity);
+  var h = Math.atan2(o.b, o.a) * _math_js__WEBPACK_IMPORTED_MODULE_2__["rad2deg"];
+  return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
+}
+
+function lch(l, c, h, opacity) {
+  return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
+}
+
+function hcl(h, c, l, opacity) {
+  return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
+}
+
+function Hcl(h, c, l, opacity) {
+  this.h = +h;
+  this.c = +c;
+  this.l = +l;
+  this.opacity = +opacity;
+}
+
+function hcl2lab(o) {
+  if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);
+  var h = o.h * _math_js__WEBPACK_IMPORTED_MODULE_2__["deg2rad"];
+  return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
+}
+
+Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Hcl, hcl, Object(_define_js__WEBPACK_IMPORTED_MODULE_0__["extend"])(_color_js__WEBPACK_IMPORTED_MODULE_1__["Color"], {
+  brighter: function(k) {
+    return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);
+  },
+  darker: function(k) {
+    return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);
+  },
+  rgb: function() {
+    return hcl2lab(this).rgb();
+  }
+}));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-color/src/math.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-color/src/math.js ***!
+  \*******************************************/
+/*! exports provided: deg2rad, rad2deg */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deg2rad", function() { return deg2rad; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rad2deg", function() { return rad2deg; });
+var deg2rad = Math.PI / 180;
+var rad2deg = 180 / Math.PI;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/area.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-contour/src/area.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(ring) {
+  var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];
+  while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];
+  return area;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/array.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-contour/src/array.js ***!
+  \**********************************************/
+/*! exports provided: slice */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
+var array = Array.prototype;
+
+var slice = array.slice;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/ascending.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-contour/src/ascending.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  return a - b;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/blur.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-contour/src/blur.js ***!
+  \*********************************************/
+/*! exports provided: blurX, blurY */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "blurX", function() { return blurX; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "blurY", function() { return blurY; });
+// TODO Optimize edge cases.
+// TODO Optimize index calculation.
+// TODO Optimize arguments.
+function blurX(source, target, r) {
+  var n = source.width,
+      m = source.height,
+      w = (r << 1) + 1;
+  for (var j = 0; j < m; ++j) {
+    for (var i = 0, sr = 0; i < n + r; ++i) {
+      if (i < n) {
+        sr += source.data[i + j * n];
+      }
+      if (i >= r) {
+        if (i >= w) {
+          sr -= source.data[i - w + j * n];
+        }
+        target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);
+      }
+    }
+  }
+}
+
+// TODO Optimize edge cases.
+// TODO Optimize index calculation.
+// TODO Optimize arguments.
+function blurY(source, target, r) {
+  var n = source.width,
+      m = source.height,
+      w = (r << 1) + 1;
+  for (var i = 0; i < n; ++i) {
+    for (var j = 0, sr = 0; j < m + r; ++j) {
+      if (j < m) {
+        sr += source.data[i + j * n];
+      }
+      if (j >= r) {
+        if (j >= w) {
+          sr -= source.data[i + (j - w) * n];
+        }
+        target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);
+      }
+    }
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/constant.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-contour/src/constant.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/contains.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-contour/src/contains.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(ring, hole) {
+  var i = -1, n = hole.length, c;
+  while (++i < n) if (c = ringContains(ring, hole[i])) return c;
+  return 0;
+});
+
+function ringContains(ring, point) {
+  var x = point[0], y = point[1], contains = -1;
+  for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {
+    var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];
+    if (segmentContains(pi, pj, point)) return 0;
+    if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;
+  }
+  return contains;
+}
+
+function segmentContains(a, b, c) {
+  var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);
+}
+
+function collinear(a, b, c) {
+  return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);
+}
+
+function within(p, q, r) {
+  return p <= q && q <= r || r <= q && q <= p;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/contours.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-contour/src/contours.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array */ "./node_modules/d3-contour/src/array.js");
+/* harmony import */ var _ascending__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ascending */ "./node_modules/d3-contour/src/ascending.js");
+/* harmony import */ var _area__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./area */ "./node_modules/d3-contour/src/area.js");
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-contour/src/constant.js");
+/* harmony import */ var _contains__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contains */ "./node_modules/d3-contour/src/contains.js");
+/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./noop */ "./node_modules/d3-contour/src/noop.js");
+
+
+
+
+
+
+
+
+var cases = [
+  [],
+  [[[1.0, 1.5], [0.5, 1.0]]],
+  [[[1.5, 1.0], [1.0, 1.5]]],
+  [[[1.5, 1.0], [0.5, 1.0]]],
+  [[[1.0, 0.5], [1.5, 1.0]]],
+  [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],
+  [[[1.0, 0.5], [1.0, 1.5]]],
+  [[[1.0, 0.5], [0.5, 1.0]]],
+  [[[0.5, 1.0], [1.0, 0.5]]],
+  [[[1.0, 1.5], [1.0, 0.5]]],
+  [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],
+  [[[1.5, 1.0], [1.0, 0.5]]],
+  [[[0.5, 1.0], [1.5, 1.0]]],
+  [[[1.0, 1.5], [1.5, 1.0]]],
+  [[[0.5, 1.0], [1.0, 1.5]]],
+  []
+];
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var dx = 1,
+      dy = 1,
+      threshold = d3_array__WEBPACK_IMPORTED_MODULE_0__["thresholdSturges"],
+      smooth = smoothLinear;
+
+  function contours(values) {
+    var tz = threshold(values);
+
+    // Convert number of thresholds into uniform thresholds.
+    if (!Array.isArray(tz)) {
+      var domain = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["extent"])(values), start = domain[0], stop = domain[1];
+      tz = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["tickStep"])(start, stop, tz);
+      tz = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);
+    } else {
+      tz = tz.slice().sort(_ascending__WEBPACK_IMPORTED_MODULE_2__["default"]);
+    }
+
+    return tz.map(function(value) {
+      return contour(values, value);
+    });
+  }
+
+  // Accumulate, smooth contour rings, assign holes to exterior rings.
+  // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js
+  function contour(values, value) {
+    var polygons = [],
+        holes = [];
+
+    isorings(values, value, function(ring) {
+      smooth(ring, values, value);
+      if (Object(_area__WEBPACK_IMPORTED_MODULE_3__["default"])(ring) > 0) polygons.push([ring]);
+      else holes.push(ring);
+    });
+
+    holes.forEach(function(hole) {
+      for (var i = 0, n = polygons.length, polygon; i < n; ++i) {
+        if (Object(_contains__WEBPACK_IMPORTED_MODULE_5__["default"])((polygon = polygons[i])[0], hole) !== -1) {
+          polygon.push(hole);
+          return;
+        }
+      }
+    });
+
+    return {
+      type: "MultiPolygon",
+      value: value,
+      coordinates: polygons
+    };
+  }
+
+  // Marching squares with isolines stitched into rings.
+  // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js
+  function isorings(values, value, callback) {
+    var fragmentByStart = new Array,
+        fragmentByEnd = new Array,
+        x, y, t0, t1, t2, t3;
+
+    // Special case for the first row (y = -1, t2 = t3 = 0).
+    x = y = -1;
+    t1 = values[0] >= value;
+    cases[t1 << 1].forEach(stitch);
+    while (++x < dx - 1) {
+      t0 = t1, t1 = values[x + 1] >= value;
+      cases[t0 | t1 << 1].forEach(stitch);
+    }
+    cases[t1 << 0].forEach(stitch);
+
+    // General case for the intermediate rows.
+    while (++y < dy - 1) {
+      x = -1;
+      t1 = values[y * dx + dx] >= value;
+      t2 = values[y * dx] >= value;
+      cases[t1 << 1 | t2 << 2].forEach(stitch);
+      while (++x < dx - 1) {
+        t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;
+        t3 = t2, t2 = values[y * dx + x + 1] >= value;
+        cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);
+      }
+      cases[t1 | t2 << 3].forEach(stitch);
+    }
+
+    // Special case for the last row (y = dy - 1, t0 = t1 = 0).
+    x = -1;
+    t2 = values[y * dx] >= value;
+    cases[t2 << 2].forEach(stitch);
+    while (++x < dx - 1) {
+      t3 = t2, t2 = values[y * dx + x + 1] >= value;
+      cases[t2 << 2 | t3 << 3].forEach(stitch);
+    }
+    cases[t2 << 3].forEach(stitch);
+
+    function stitch(line) {
+      var start = [line[0][0] + x, line[0][1] + y],
+          end = [line[1][0] + x, line[1][1] + y],
+          startIndex = index(start),
+          endIndex = index(end),
+          f, g;
+      if (f = fragmentByEnd[startIndex]) {
+        if (g = fragmentByStart[endIndex]) {
+          delete fragmentByEnd[f.end];
+          delete fragmentByStart[g.start];
+          if (f === g) {
+            f.ring.push(end);
+            callback(f.ring);
+          } else {
+            fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};
+          }
+        } else {
+          delete fragmentByEnd[f.end];
+          f.ring.push(end);
+          fragmentByEnd[f.end = endIndex] = f;
+        }
+      } else if (f = fragmentByStart[endIndex]) {
+        if (g = fragmentByEnd[startIndex]) {
+          delete fragmentByStart[f.start];
+          delete fragmentByEnd[g.end];
+          if (f === g) {
+            f.ring.push(end);
+            callback(f.ring);
+          } else {
+            fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};
+          }
+        } else {
+          delete fragmentByStart[f.start];
+          f.ring.unshift(start);
+          fragmentByStart[f.start = startIndex] = f;
+        }
+      } else {
+        fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};
+      }
+    }
+  }
+
+  function index(point) {
+    return point[0] * 2 + point[1] * (dx + 1) * 4;
+  }
+
+  function smoothLinear(ring, values, value) {
+    ring.forEach(function(point) {
+      var x = point[0],
+          y = point[1],
+          xt = x | 0,
+          yt = y | 0,
+          v0,
+          v1 = values[yt * dx + xt];
+      if (x > 0 && x < dx && xt === x) {
+        v0 = values[yt * dx + xt - 1];
+        point[0] = x + (value - v0) / (v1 - v0) - 0.5;
+      }
+      if (y > 0 && y < dy && yt === y) {
+        v0 = values[(yt - 1) * dx + xt];
+        point[1] = y + (value - v0) / (v1 - v0) - 0.5;
+      }
+    });
+  }
+
+  contours.contour = contour;
+
+  contours.size = function(_) {
+    if (!arguments.length) return [dx, dy];
+    var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
+    if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size");
+    return dx = _0, dy = _1, contours;
+  };
+
+  contours.thresholds = function(_) {
+    return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? Object(_constant__WEBPACK_IMPORTED_MODULE_4__["default"])(_array__WEBPACK_IMPORTED_MODULE_1__["slice"].call(_)) : Object(_constant__WEBPACK_IMPORTED_MODULE_4__["default"])(_), contours) : threshold;
+  };
+
+  contours.smooth = function(_) {
+    return arguments.length ? (smooth = _ ? smoothLinear : _noop__WEBPACK_IMPORTED_MODULE_6__["default"], contours) : smooth === smoothLinear;
+  };
+
+  return contours;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/density.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-contour/src/density.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array */ "./node_modules/d3-contour/src/array.js");
+/* harmony import */ var _blur__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./blur */ "./node_modules/d3-contour/src/blur.js");
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-contour/src/constant.js");
+/* harmony import */ var _contours__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./contours */ "./node_modules/d3-contour/src/contours.js");
+
+
+
+
+
+
+function defaultX(d) {
+  return d[0];
+}
+
+function defaultY(d) {
+  return d[1];
+}
+
+function defaultWeight() {
+  return 1;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var x = defaultX,
+      y = defaultY,
+      weight = defaultWeight,
+      dx = 960,
+      dy = 500,
+      r = 20, // blur radius
+      k = 2, // log2(grid cell size)
+      o = r * 3, // grid offset, to pad for blur
+      n = (dx + o * 2) >> k, // grid width
+      m = (dy + o * 2) >> k, // grid height
+      threshold = Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(20);
+
+  function density(data) {
+    var values0 = new Float32Array(n * m),
+        values1 = new Float32Array(n * m);
+
+    data.forEach(function(d, i, data) {
+      var xi = (+x(d, i, data) + o) >> k,
+          yi = (+y(d, i, data) + o) >> k,
+          wi = +weight(d, i, data);
+      if (xi >= 0 && xi < n && yi >= 0 && yi < m) {
+        values0[xi + yi * n] += wi;
+      }
+    });
+
+    // TODO Optimize.
+    Object(_blur__WEBPACK_IMPORTED_MODULE_2__["blurX"])({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
+    Object(_blur__WEBPACK_IMPORTED_MODULE_2__["blurY"])({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
+    Object(_blur__WEBPACK_IMPORTED_MODULE_2__["blurX"])({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
+    Object(_blur__WEBPACK_IMPORTED_MODULE_2__["blurY"])({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
+    Object(_blur__WEBPACK_IMPORTED_MODULE_2__["blurX"])({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
+    Object(_blur__WEBPACK_IMPORTED_MODULE_2__["blurY"])({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
+
+    var tz = threshold(values0);
+
+    // Convert number of thresholds into uniform thresholds.
+    if (!Array.isArray(tz)) {
+      var stop = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["max"])(values0);
+      tz = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["tickStep"])(0, stop, tz);
+      tz = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(0, Math.floor(stop / tz) * tz, tz);
+      tz.shift();
+    }
+
+    return Object(_contours__WEBPACK_IMPORTED_MODULE_4__["default"])()
+        .thresholds(tz)
+        .size([n, m])
+      (values0)
+        .map(transform);
+  }
+
+  function transform(geometry) {
+    geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.
+    geometry.coordinates.forEach(transformPolygon);
+    return geometry;
+  }
+
+  function transformPolygon(coordinates) {
+    coordinates.forEach(transformRing);
+  }
+
+  function transformRing(coordinates) {
+    coordinates.forEach(transformPoint);
+  }
+
+  // TODO Optimize.
+  function transformPoint(coordinates) {
+    coordinates[0] = coordinates[0] * Math.pow(2, k) - o;
+    coordinates[1] = coordinates[1] * Math.pow(2, k) - o;
+  }
+
+  function resize() {
+    o = r * 3;
+    n = (dx + o * 2) >> k;
+    m = (dy + o * 2) >> k;
+    return density;
+  }
+
+  density.x = function(_) {
+    return arguments.length ? (x = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(+_), density) : x;
+  };
+
+  density.y = function(_) {
+    return arguments.length ? (y = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(+_), density) : y;
+  };
+
+  density.weight = function(_) {
+    return arguments.length ? (weight = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(+_), density) : weight;
+  };
+
+  density.size = function(_) {
+    if (!arguments.length) return [dx, dy];
+    var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
+    if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size");
+    return dx = _0, dy = _1, resize();
+  };
+
+  density.cellSize = function(_) {
+    if (!arguments.length) return 1 << k;
+    if (!((_ = +_) >= 1)) throw new Error("invalid cell size");
+    return k = Math.floor(Math.log(_) / Math.LN2), resize();
+  };
+
+  density.thresholds = function(_) {
+    return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(_array__WEBPACK_IMPORTED_MODULE_1__["slice"].call(_)) : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(_), density) : threshold;
+  };
+
+  density.bandwidth = function(_) {
+    if (!arguments.length) return Math.sqrt(r * (r + 1));
+    if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth");
+    return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();
+  };
+
+  return density;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/index.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-contour/src/index.js ***!
+  \**********************************************/
+/*! exports provided: contours, contourDensity */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _contours__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./contours */ "./node_modules/d3-contour/src/contours.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "contours", function() { return _contours__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _density__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./density */ "./node_modules/d3-contour/src/density.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "contourDensity", function() { return _density__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-contour/src/noop.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-contour/src/noop.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-dispatch/src/dispatch.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-dispatch/src/dispatch.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var noop = {value: function() {}};
+
+function dispatch() {
+  for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
+    if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t);
+    _[t] = [];
+  }
+  return new Dispatch(_);
+}
+
+function Dispatch(_) {
+  this._ = _;
+}
+
+function parseTypenames(typenames, types) {
+  return typenames.trim().split(/^|\s+/).map(function(t) {
+    var name = "", i = t.indexOf(".");
+    if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+    if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
+    return {type: t, name: name};
+  });
+}
+
+Dispatch.prototype = dispatch.prototype = {
+  constructor: Dispatch,
+  on: function(typename, callback) {
+    var _ = this._,
+        T = parseTypenames(typename + "", _),
+        t,
+        i = -1,
+        n = T.length;
+
+    // If no callback was specified, return the callback of the given type and name.
+    if (arguments.length < 2) {
+      while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t;
+      return;
+    }
+
+    // If a type was specified, set the callback for the given type and name.
+    // Otherwise, if a null callback was specified, remove callbacks of the given name.
+    if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
+    while (++i < n) {
+      if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
+      else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
+    }
+
+    return this;
+  },
+  copy: function() {
+    var copy = {}, _ = this._;
+    for (var t in _) copy[t] = _[t].slice();
+    return new Dispatch(copy);
+  },
+  call: function(type, that) {
+    if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
+    if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
+    for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
+  },
+  apply: function(type, that, args) {
+    if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
+    for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
+  }
+};
+
+function get(type, name) {
+  for (var i = 0, n = type.length, c; i < n; ++i) {
+    if ((c = type[i]).name === name) {
+      return c.value;
+    }
+  }
+}
+
+function set(type, name, callback) {
+  for (var i = 0, n = type.length; i < n; ++i) {
+    if (type[i].name === name) {
+      type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1));
+      break;
+    }
+  }
+  if (callback != null) type.push({name: name, value: callback});
+  return type;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (dispatch);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-dispatch/src/index.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-dispatch/src/index.js ***!
+  \***********************************************/
+/*! exports provided: dispatch */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _dispatch_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dispatch.js */ "./node_modules/d3-dispatch/src/dispatch.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return _dispatch_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-drag/src/constant.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-drag/src/constant.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-drag/src/drag.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-drag/src/drag.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_dispatch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-dispatch */ "./node_modules/d3-dispatch/src/index.js");
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var _nodrag_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nodrag.js */ "./node_modules/d3-drag/src/nodrag.js");
+/* harmony import */ var _noevent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./noevent.js */ "./node_modules/d3-drag/src/noevent.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-drag/src/constant.js");
+/* harmony import */ var _event_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./event.js */ "./node_modules/d3-drag/src/event.js");
+
+
+
+
+
+
+
+// Ignore right-click, since that should open the context menu.
+function defaultFilter() {
+  return !d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].ctrlKey && !d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].button;
+}
+
+function defaultContainer() {
+  return this.parentNode;
+}
+
+function defaultSubject(d) {
+  return d == null ? {x: d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].x, y: d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].y} : d;
+}
+
+function defaultTouchable() {
+  return navigator.maxTouchPoints || ("ontouchstart" in this);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var filter = defaultFilter,
+      container = defaultContainer,
+      subject = defaultSubject,
+      touchable = defaultTouchable,
+      gestures = {},
+      listeners = Object(d3_dispatch__WEBPACK_IMPORTED_MODULE_0__["dispatch"])("start", "drag", "end"),
+      active = 0,
+      mousedownx,
+      mousedowny,
+      mousemoving,
+      touchending,
+      clickDistance2 = 0;
+
+  function drag(selection) {
+    selection
+        .on("mousedown.drag", mousedowned)
+      .filter(touchable)
+        .on("touchstart.drag", touchstarted)
+        .on("touchmove.drag", touchmoved)
+        .on("touchend.drag touchcancel.drag", touchended)
+        .style("touch-action", "none")
+        .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+  }
+
+  function mousedowned() {
+    if (touchending || !filter.apply(this, arguments)) return;
+    var gesture = beforestart("mouse", container.apply(this, arguments), d3_selection__WEBPACK_IMPORTED_MODULE_1__["mouse"], this, arguments);
+    if (!gesture) return;
+    Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["select"])(d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
+    Object(_nodrag_js__WEBPACK_IMPORTED_MODULE_2__["default"])(d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].view);
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_3__["nopropagation"])();
+    mousemoving = false;
+    mousedownx = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].clientX;
+    mousedowny = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].clientY;
+    gesture("start");
+  }
+
+  function mousemoved() {
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_3__["default"])();
+    if (!mousemoving) {
+      var dx = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].clientX - mousedownx, dy = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].clientY - mousedowny;
+      mousemoving = dx * dx + dy * dy > clickDistance2;
+    }
+    gestures.mouse("drag");
+  }
+
+  function mouseupped() {
+    Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["select"])(d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].view).on("mousemove.drag mouseup.drag", null);
+    Object(_nodrag_js__WEBPACK_IMPORTED_MODULE_2__["yesdrag"])(d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].view, mousemoving);
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_3__["default"])();
+    gestures.mouse("end");
+  }
+
+  function touchstarted() {
+    if (!filter.apply(this, arguments)) return;
+    var touches = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].changedTouches,
+        c = container.apply(this, arguments),
+        n = touches.length, i, gesture;
+
+    for (i = 0; i < n; ++i) {
+      if (gesture = beforestart(touches[i].identifier, c, d3_selection__WEBPACK_IMPORTED_MODULE_1__["touch"], this, arguments)) {
+        Object(_noevent_js__WEBPACK_IMPORTED_MODULE_3__["nopropagation"])();
+        gesture("start");
+      }
+    }
+  }
+
+  function touchmoved() {
+    var touches = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].changedTouches,
+        n = touches.length, i, gesture;
+
+    for (i = 0; i < n; ++i) {
+      if (gesture = gestures[touches[i].identifier]) {
+        Object(_noevent_js__WEBPACK_IMPORTED_MODULE_3__["default"])();
+        gesture("drag");
+      }
+    }
+  }
+
+  function touchended() {
+    var touches = d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].changedTouches,
+        n = touches.length, i, gesture;
+
+    if (touchending) clearTimeout(touchending);
+    touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
+    for (i = 0; i < n; ++i) {
+      if (gesture = gestures[touches[i].identifier]) {
+        Object(_noevent_js__WEBPACK_IMPORTED_MODULE_3__["nopropagation"])();
+        gesture("end");
+      }
+    }
+  }
+
+  function beforestart(id, container, point, that, args) {
+    var p = point(container, id), s, dx, dy,
+        sublisteners = listeners.copy();
+
+    if (!Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["customEvent"])(new _event_js__WEBPACK_IMPORTED_MODULE_5__["default"](drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
+      if ((d3_selection__WEBPACK_IMPORTED_MODULE_1__["event"].subject = s = subject.apply(that, args)) == null) return false;
+      dx = s.x - p[0] || 0;
+      dy = s.y - p[1] || 0;
+      return true;
+    })) return;
+
+    return function gesture(type) {
+      var p0 = p, n;
+      switch (type) {
+        case "start": gestures[id] = gesture, n = active++; break;
+        case "end": delete gestures[id], --active; // nobreak
+        case "drag": p = point(container, id), n = active; break;
+      }
+      Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["customEvent"])(new _event_js__WEBPACK_IMPORTED_MODULE_5__["default"](drag, type, s, id, n, p[0] + dx, p[1] + dy, p[0] - p0[0], p[1] - p0[1], sublisteners), sublisteners.apply, sublisteners, [type, that, args]);
+    };
+  }
+
+  drag.filter = function(_) {
+    return arguments.length ? (filter = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_4__["default"])(!!_), drag) : filter;
+  };
+
+  drag.container = function(_) {
+    return arguments.length ? (container = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_), drag) : container;
+  };
+
+  drag.subject = function(_) {
+    return arguments.length ? (subject = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_), drag) : subject;
+  };
+
+  drag.touchable = function(_) {
+    return arguments.length ? (touchable = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_4__["default"])(!!_), drag) : touchable;
+  };
+
+  drag.on = function() {
+    var value = listeners.on.apply(listeners, arguments);
+    return value === listeners ? drag : value;
+  };
+
+  drag.clickDistance = function(_) {
+    return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
+  };
+
+  return drag;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-drag/src/event.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-drag/src/event.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DragEvent; });
+function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
+  this.target = target;
+  this.type = type;
+  this.subject = subject;
+  this.identifier = id;
+  this.active = active;
+  this.x = x;
+  this.y = y;
+  this.dx = dx;
+  this.dy = dy;
+  this._ = dispatch;
+}
+
+DragEvent.prototype.on = function() {
+  var value = this._.on.apply(this._, arguments);
+  return value === this._ ? this : value;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-drag/src/index.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-drag/src/index.js ***!
+  \*******************************************/
+/*! exports provided: drag, dragDisable, dragEnable */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _drag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./drag.js */ "./node_modules/d3-drag/src/drag.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drag", function() { return _drag_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _nodrag_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./nodrag.js */ "./node_modules/d3-drag/src/nodrag.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragDisable", function() { return _nodrag_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragEnable", function() { return _nodrag_js__WEBPACK_IMPORTED_MODULE_1__["yesdrag"]; });
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-drag/src/nodrag.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-drag/src/nodrag.js ***!
+  \********************************************/
+/*! exports provided: default, yesdrag */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "yesdrag", function() { return yesdrag; });
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var _noevent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./noevent.js */ "./node_modules/d3-drag/src/noevent.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(view) {
+  var root = view.document.documentElement,
+      selection = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])(view).on("dragstart.drag", _noevent_js__WEBPACK_IMPORTED_MODULE_1__["default"], true);
+  if ("onselectstart" in root) {
+    selection.on("selectstart.drag", _noevent_js__WEBPACK_IMPORTED_MODULE_1__["default"], true);
+  } else {
+    root.__noselect = root.style.MozUserSelect;
+    root.style.MozUserSelect = "none";
+  }
+});
+
+function yesdrag(view, noclick) {
+  var root = view.document.documentElement,
+      selection = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["select"])(view).on("dragstart.drag", null);
+  if (noclick) {
+    selection.on("click.drag", _noevent_js__WEBPACK_IMPORTED_MODULE_1__["default"], true);
+    setTimeout(function() { selection.on("click.drag", null); }, 0);
+  }
+  if ("onselectstart" in root) {
+    selection.on("selectstart.drag", null);
+  } else {
+    root.style.MozUserSelect = root.__noselect;
+    delete root.__noselect;
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-drag/src/noevent.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-drag/src/noevent.js ***!
+  \*********************************************/
+/*! exports provided: nopropagation, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nopropagation", function() { return nopropagation; });
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+
+
+function nopropagation() {
+  d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].preventDefault();
+  d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-dsv/src/autoType.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-dsv/src/autoType.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return autoType; });
+function autoType(object) {
+  for (var key in object) {
+    var value = object[key].trim(), number, m;
+    if (!value) value = null;
+    else if (value === "true") value = true;
+    else if (value === "false") value = false;
+    else if (value === "NaN") value = NaN;
+    else if (!isNaN(number = +value)) value = number;
+    else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) {
+      if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " ");
+      value = new Date(value);
+    }
+    else continue;
+    object[key] = value;
+  }
+  return object;
+}
+
+// https://github.com/d3/d3-dsv/issues/45
+var fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours();
+
+/***/ }),
+
+/***/ "./node_modules/d3-dsv/src/csv.js":
+/*!****************************************!*\
+  !*** ./node_modules/d3-dsv/src/csv.js ***!
+  \****************************************/
+/*! exports provided: csvParse, csvParseRows, csvFormat, csvFormatBody, csvFormatRows, csvFormatRow, csvFormatValue */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "csvParse", function() { return csvParse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "csvParseRows", function() { return csvParseRows; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "csvFormat", function() { return csvFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "csvFormatBody", function() { return csvFormatBody; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "csvFormatRows", function() { return csvFormatRows; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "csvFormatRow", function() { return csvFormatRow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "csvFormatValue", function() { return csvFormatValue; });
+/* harmony import */ var _dsv_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dsv.js */ "./node_modules/d3-dsv/src/dsv.js");
+
+
+var csv = Object(_dsv_js__WEBPACK_IMPORTED_MODULE_0__["default"])(",");
+
+var csvParse = csv.parse;
+var csvParseRows = csv.parseRows;
+var csvFormat = csv.format;
+var csvFormatBody = csv.formatBody;
+var csvFormatRows = csv.formatRows;
+var csvFormatRow = csv.formatRow;
+var csvFormatValue = csv.formatValue;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-dsv/src/dsv.js":
+/*!****************************************!*\
+  !*** ./node_modules/d3-dsv/src/dsv.js ***!
+  \****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var EOL = {},
+    EOF = {},
+    QUOTE = 34,
+    NEWLINE = 10,
+    RETURN = 13;
+
+function objectConverter(columns) {
+  return new Function("d", "return {" + columns.map(function(name, i) {
+    return JSON.stringify(name) + ": d[" + i + "] || \"\"";
+  }).join(",") + "}");
+}
+
+function customConverter(columns, f) {
+  var object = objectConverter(columns);
+  return function(row, i) {
+    return f(object(row), i, columns);
+  };
+}
+
+// Compute unique columns in order of discovery.
+function inferColumns(rows) {
+  var columnSet = Object.create(null),
+      columns = [];
+
+  rows.forEach(function(row) {
+    for (var column in row) {
+      if (!(column in columnSet)) {
+        columns.push(columnSet[column] = column);
+      }
+    }
+  });
+
+  return columns;
+}
+
+function pad(value, width) {
+  var s = value + "", length = s.length;
+  return length < width ? new Array(width - length + 1).join(0) + s : s;
+}
+
+function formatYear(year) {
+  return year < 0 ? "-" + pad(-year, 6)
+    : year > 9999 ? "+" + pad(year, 6)
+    : pad(year, 4);
+}
+
+function formatDate(date) {
+  var hours = date.getUTCHours(),
+      minutes = date.getUTCMinutes(),
+      seconds = date.getUTCSeconds(),
+      milliseconds = date.getUTCMilliseconds();
+  return isNaN(date) ? "Invalid Date"
+      : formatYear(date.getUTCFullYear(), 4) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2)
+      + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z"
+      : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z"
+      : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z"
+      : "");
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(delimiter) {
+  var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
+      DELIMITER = delimiter.charCodeAt(0);
+
+  function parse(text, f) {
+    var convert, columns, rows = parseRows(text, function(row, i) {
+      if (convert) return convert(row, i - 1);
+      columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
+    });
+    rows.columns = columns || [];
+    return rows;
+  }
+
+  function parseRows(text, f) {
+    var rows = [], // output rows
+        N = text.length,
+        I = 0, // current character index
+        n = 0, // current line number
+        t, // current token
+        eof = N <= 0, // current token followed by EOF?
+        eol = false; // current token followed by EOL?
+
+    // Strip the trailing newline.
+    if (text.charCodeAt(N - 1) === NEWLINE) --N;
+    if (text.charCodeAt(N - 1) === RETURN) --N;
+
+    function token() {
+      if (eof) return EOF;
+      if (eol) return eol = false, EOL;
+
+      // Unescape quotes.
+      var i, j = I, c;
+      if (text.charCodeAt(j) === QUOTE) {
+        while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
+        if ((i = I) >= N) eof = true;
+        else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
+        else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
+        return text.slice(j + 1, i - 1).replace(/""/g, "\"");
+      }
+
+      // Find next delimiter or newline.
+      while (I < N) {
+        if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
+        else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
+        else if (c !== DELIMITER) continue;
+        return text.slice(j, i);
+      }
+
+      // Return last token before EOF.
+      return eof = true, text.slice(j, N);
+    }
+
+    while ((t = token()) !== EOF) {
+      var row = [];
+      while (t !== EOL && t !== EOF) row.push(t), t = token();
+      if (f && (row = f(row, n++)) == null) continue;
+      rows.push(row);
+    }
+
+    return rows;
+  }
+
+  function preformatBody(rows, columns) {
+    return rows.map(function(row) {
+      return columns.map(function(column) {
+        return formatValue(row[column]);
+      }).join(delimiter);
+    });
+  }
+
+  function format(rows, columns) {
+    if (columns == null) columns = inferColumns(rows);
+    return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n");
+  }
+
+  function formatBody(rows, columns) {
+    if (columns == null) columns = inferColumns(rows);
+    return preformatBody(rows, columns).join("\n");
+  }
+
+  function formatRows(rows) {
+    return rows.map(formatRow).join("\n");
+  }
+
+  function formatRow(row) {
+    return row.map(formatValue).join(delimiter);
+  }
+
+  function formatValue(value) {
+    return value == null ? ""
+        : value instanceof Date ? formatDate(value)
+        : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\""
+        : value;
+  }
+
+  return {
+    parse: parse,
+    parseRows: parseRows,
+    format: format,
+    formatBody: formatBody,
+    formatRows: formatRows,
+    formatRow: formatRow,
+    formatValue: formatValue
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-dsv/src/index.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-dsv/src/index.js ***!
+  \******************************************/
+/*! exports provided: dsvFormat, csvParse, csvParseRows, csvFormat, csvFormatBody, csvFormatRows, csvFormatRow, csvFormatValue, tsvParse, tsvParseRows, tsvFormat, tsvFormatBody, tsvFormatRows, tsvFormatRow, tsvFormatValue, autoType */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _dsv_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dsv.js */ "./node_modules/d3-dsv/src/dsv.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dsvFormat", function() { return _dsv_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _csv_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./csv.js */ "./node_modules/d3-dsv/src/csv.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvParse", function() { return _csv_js__WEBPACK_IMPORTED_MODULE_1__["csvParse"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvParseRows", function() { return _csv_js__WEBPACK_IMPORTED_MODULE_1__["csvParseRows"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormat", function() { return _csv_js__WEBPACK_IMPORTED_MODULE_1__["csvFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormatBody", function() { return _csv_js__WEBPACK_IMPORTED_MODULE_1__["csvFormatBody"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormatRows", function() { return _csv_js__WEBPACK_IMPORTED_MODULE_1__["csvFormatRows"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormatRow", function() { return _csv_js__WEBPACK_IMPORTED_MODULE_1__["csvFormatRow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormatValue", function() { return _csv_js__WEBPACK_IMPORTED_MODULE_1__["csvFormatValue"]; });
+
+/* harmony import */ var _tsv_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tsv.js */ "./node_modules/d3-dsv/src/tsv.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvParse", function() { return _tsv_js__WEBPACK_IMPORTED_MODULE_2__["tsvParse"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvParseRows", function() { return _tsv_js__WEBPACK_IMPORTED_MODULE_2__["tsvParseRows"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormat", function() { return _tsv_js__WEBPACK_IMPORTED_MODULE_2__["tsvFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormatBody", function() { return _tsv_js__WEBPACK_IMPORTED_MODULE_2__["tsvFormatBody"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormatRows", function() { return _tsv_js__WEBPACK_IMPORTED_MODULE_2__["tsvFormatRows"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormatRow", function() { return _tsv_js__WEBPACK_IMPORTED_MODULE_2__["tsvFormatRow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormatValue", function() { return _tsv_js__WEBPACK_IMPORTED_MODULE_2__["tsvFormatValue"]; });
+
+/* harmony import */ var _autoType_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./autoType.js */ "./node_modules/d3-dsv/src/autoType.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "autoType", function() { return _autoType_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-dsv/src/tsv.js":
+/*!****************************************!*\
+  !*** ./node_modules/d3-dsv/src/tsv.js ***!
+  \****************************************/
+/*! exports provided: tsvParse, tsvParseRows, tsvFormat, tsvFormatBody, tsvFormatRows, tsvFormatRow, tsvFormatValue */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tsvParse", function() { return tsvParse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tsvParseRows", function() { return tsvParseRows; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tsvFormat", function() { return tsvFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tsvFormatBody", function() { return tsvFormatBody; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tsvFormatRows", function() { return tsvFormatRows; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tsvFormatRow", function() { return tsvFormatRow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tsvFormatValue", function() { return tsvFormatValue; });
+/* harmony import */ var _dsv_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dsv.js */ "./node_modules/d3-dsv/src/dsv.js");
+
+
+var tsv = Object(_dsv_js__WEBPACK_IMPORTED_MODULE_0__["default"])("\t");
+
+var tsvParse = tsv.parse;
+var tsvParseRows = tsv.parseRows;
+var tsvFormat = tsv.format;
+var tsvFormatBody = tsv.formatBody;
+var tsvFormatRows = tsv.formatRows;
+var tsvFormatRow = tsv.formatRow;
+var tsvFormatValue = tsv.formatValue;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/back.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-ease/src/back.js ***!
+  \******************************************/
+/*! exports provided: backIn, backOut, backInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "backIn", function() { return backIn; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "backOut", function() { return backOut; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "backInOut", function() { return backInOut; });
+var overshoot = 1.70158;
+
+var backIn = (function custom(s) {
+  s = +s;
+
+  function backIn(t) {
+    return t * t * ((s + 1) * t - s);
+  }
+
+  backIn.overshoot = custom;
+
+  return backIn;
+})(overshoot);
+
+var backOut = (function custom(s) {
+  s = +s;
+
+  function backOut(t) {
+    return --t * t * ((s + 1) * t + s) + 1;
+  }
+
+  backOut.overshoot = custom;
+
+  return backOut;
+})(overshoot);
+
+var backInOut = (function custom(s) {
+  s = +s;
+
+  function backInOut(t) {
+    return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
+  }
+
+  backInOut.overshoot = custom;
+
+  return backInOut;
+})(overshoot);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/bounce.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-ease/src/bounce.js ***!
+  \********************************************/
+/*! exports provided: bounceIn, bounceOut, bounceInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounceIn", function() { return bounceIn; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounceOut", function() { return bounceOut; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounceInOut", function() { return bounceInOut; });
+var b1 = 4 / 11,
+    b2 = 6 / 11,
+    b3 = 8 / 11,
+    b4 = 3 / 4,
+    b5 = 9 / 11,
+    b6 = 10 / 11,
+    b7 = 15 / 16,
+    b8 = 21 / 22,
+    b9 = 63 / 64,
+    b0 = 1 / b1 / b1;
+
+function bounceIn(t) {
+  return 1 - bounceOut(1 - t);
+}
+
+function bounceOut(t) {
+  return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9;
+}
+
+function bounceInOut(t) {
+  return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/circle.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-ease/src/circle.js ***!
+  \********************************************/
+/*! exports provided: circleIn, circleOut, circleInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleIn", function() { return circleIn; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleOut", function() { return circleOut; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleInOut", function() { return circleInOut; });
+function circleIn(t) {
+  return 1 - Math.sqrt(1 - t * t);
+}
+
+function circleOut(t) {
+  return Math.sqrt(1 - --t * t);
+}
+
+function circleInOut(t) {
+  return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/cubic.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-ease/src/cubic.js ***!
+  \*******************************************/
+/*! exports provided: cubicIn, cubicOut, cubicInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cubicIn", function() { return cubicIn; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cubicOut", function() { return cubicOut; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cubicInOut", function() { return cubicInOut; });
+function cubicIn(t) {
+  return t * t * t;
+}
+
+function cubicOut(t) {
+  return --t * t * t + 1;
+}
+
+function cubicInOut(t) {
+  return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/elastic.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-ease/src/elastic.js ***!
+  \*********************************************/
+/*! exports provided: elasticIn, elasticOut, elasticInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elasticIn", function() { return elasticIn; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elasticOut", function() { return elasticOut; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elasticInOut", function() { return elasticInOut; });
+var tau = 2 * Math.PI,
+    amplitude = 1,
+    period = 0.3;
+
+var elasticIn = (function custom(a, p) {
+  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
+
+  function elasticIn(t) {
+    return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
+  }
+
+  elasticIn.amplitude = function(a) { return custom(a, p * tau); };
+  elasticIn.period = function(p) { return custom(a, p); };
+
+  return elasticIn;
+})(amplitude, period);
+
+var elasticOut = (function custom(a, p) {
+  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
+
+  function elasticOut(t) {
+    return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
+  }
+
+  elasticOut.amplitude = function(a) { return custom(a, p * tau); };
+  elasticOut.period = function(p) { return custom(a, p); };
+
+  return elasticOut;
+})(amplitude, period);
+
+var elasticInOut = (function custom(a, p) {
+  var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
+
+  function elasticInOut(t) {
+    return ((t = t * 2 - 1) < 0
+        ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
+        : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
+  }
+
+  elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
+  elasticInOut.period = function(p) { return custom(a, p); };
+
+  return elasticInOut;
+})(amplitude, period);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/exp.js":
+/*!*****************************************!*\
+  !*** ./node_modules/d3-ease/src/exp.js ***!
+  \*****************************************/
+/*! exports provided: expIn, expOut, expInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expIn", function() { return expIn; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expOut", function() { return expOut; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expInOut", function() { return expInOut; });
+function expIn(t) {
+  return Math.pow(2, 10 * t - 10);
+}
+
+function expOut(t) {
+  return 1 - Math.pow(2, -10 * t);
+}
+
+function expInOut(t) {
+  return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/index.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-ease/src/index.js ***!
+  \*******************************************/
+/*! exports provided: easeLinear, easeQuad, easeQuadIn, easeQuadOut, easeQuadInOut, easeCubic, easeCubicIn, easeCubicOut, easeCubicInOut, easePoly, easePolyIn, easePolyOut, easePolyInOut, easeSin, easeSinIn, easeSinOut, easeSinInOut, easeExp, easeExpIn, easeExpOut, easeExpInOut, easeCircle, easeCircleIn, easeCircleOut, easeCircleInOut, easeBounce, easeBounceIn, easeBounceOut, easeBounceInOut, easeBack, easeBackIn, easeBackOut, easeBackInOut, easeElastic, easeElasticIn, easeElasticOut, easeElasticInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _linear_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./linear.js */ "./node_modules/d3-ease/src/linear.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeLinear", function() { return _linear_js__WEBPACK_IMPORTED_MODULE_0__["linear"]; });
+
+/* harmony import */ var _quad_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./quad.js */ "./node_modules/d3-ease/src/quad.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuad", function() { return _quad_js__WEBPACK_IMPORTED_MODULE_1__["quadInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuadIn", function() { return _quad_js__WEBPACK_IMPORTED_MODULE_1__["quadIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuadOut", function() { return _quad_js__WEBPACK_IMPORTED_MODULE_1__["quadOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuadInOut", function() { return _quad_js__WEBPACK_IMPORTED_MODULE_1__["quadInOut"]; });
+
+/* harmony import */ var _cubic_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cubic.js */ "./node_modules/d3-ease/src/cubic.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubic", function() { return _cubic_js__WEBPACK_IMPORTED_MODULE_2__["cubicInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubicIn", function() { return _cubic_js__WEBPACK_IMPORTED_MODULE_2__["cubicIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubicOut", function() { return _cubic_js__WEBPACK_IMPORTED_MODULE_2__["cubicOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubicInOut", function() { return _cubic_js__WEBPACK_IMPORTED_MODULE_2__["cubicInOut"]; });
+
+/* harmony import */ var _poly_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./poly.js */ "./node_modules/d3-ease/src/poly.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePoly", function() { return _poly_js__WEBPACK_IMPORTED_MODULE_3__["polyInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePolyIn", function() { return _poly_js__WEBPACK_IMPORTED_MODULE_3__["polyIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePolyOut", function() { return _poly_js__WEBPACK_IMPORTED_MODULE_3__["polyOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePolyInOut", function() { return _poly_js__WEBPACK_IMPORTED_MODULE_3__["polyInOut"]; });
+
+/* harmony import */ var _sin_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sin.js */ "./node_modules/d3-ease/src/sin.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSin", function() { return _sin_js__WEBPACK_IMPORTED_MODULE_4__["sinInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSinIn", function() { return _sin_js__WEBPACK_IMPORTED_MODULE_4__["sinIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSinOut", function() { return _sin_js__WEBPACK_IMPORTED_MODULE_4__["sinOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSinInOut", function() { return _sin_js__WEBPACK_IMPORTED_MODULE_4__["sinInOut"]; });
+
+/* harmony import */ var _exp_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./exp.js */ "./node_modules/d3-ease/src/exp.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExp", function() { return _exp_js__WEBPACK_IMPORTED_MODULE_5__["expInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExpIn", function() { return _exp_js__WEBPACK_IMPORTED_MODULE_5__["expIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExpOut", function() { return _exp_js__WEBPACK_IMPORTED_MODULE_5__["expOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExpInOut", function() { return _exp_js__WEBPACK_IMPORTED_MODULE_5__["expInOut"]; });
+
+/* harmony import */ var _circle_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./circle.js */ "./node_modules/d3-ease/src/circle.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircle", function() { return _circle_js__WEBPACK_IMPORTED_MODULE_6__["circleInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircleIn", function() { return _circle_js__WEBPACK_IMPORTED_MODULE_6__["circleIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircleOut", function() { return _circle_js__WEBPACK_IMPORTED_MODULE_6__["circleOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircleInOut", function() { return _circle_js__WEBPACK_IMPORTED_MODULE_6__["circleInOut"]; });
+
+/* harmony import */ var _bounce_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bounce.js */ "./node_modules/d3-ease/src/bounce.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounce", function() { return _bounce_js__WEBPACK_IMPORTED_MODULE_7__["bounceOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounceIn", function() { return _bounce_js__WEBPACK_IMPORTED_MODULE_7__["bounceIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounceOut", function() { return _bounce_js__WEBPACK_IMPORTED_MODULE_7__["bounceOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounceInOut", function() { return _bounce_js__WEBPACK_IMPORTED_MODULE_7__["bounceInOut"]; });
+
+/* harmony import */ var _back_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./back.js */ "./node_modules/d3-ease/src/back.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBack", function() { return _back_js__WEBPACK_IMPORTED_MODULE_8__["backInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBackIn", function() { return _back_js__WEBPACK_IMPORTED_MODULE_8__["backIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBackOut", function() { return _back_js__WEBPACK_IMPORTED_MODULE_8__["backOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBackInOut", function() { return _back_js__WEBPACK_IMPORTED_MODULE_8__["backInOut"]; });
+
+/* harmony import */ var _elastic_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./elastic.js */ "./node_modules/d3-ease/src/elastic.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElastic", function() { return _elastic_js__WEBPACK_IMPORTED_MODULE_9__["elasticOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElasticIn", function() { return _elastic_js__WEBPACK_IMPORTED_MODULE_9__["elasticIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElasticOut", function() { return _elastic_js__WEBPACK_IMPORTED_MODULE_9__["elasticOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElasticInOut", function() { return _elastic_js__WEBPACK_IMPORTED_MODULE_9__["elasticInOut"]; });
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/linear.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-ease/src/linear.js ***!
+  \********************************************/
+/*! exports provided: linear */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linear", function() { return linear; });
+function linear(t) {
+  return +t;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/poly.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-ease/src/poly.js ***!
+  \******************************************/
+/*! exports provided: polyIn, polyOut, polyInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "polyIn", function() { return polyIn; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "polyOut", function() { return polyOut; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "polyInOut", function() { return polyInOut; });
+var exponent = 3;
+
+var polyIn = (function custom(e) {
+  e = +e;
+
+  function polyIn(t) {
+    return Math.pow(t, e);
+  }
+
+  polyIn.exponent = custom;
+
+  return polyIn;
+})(exponent);
+
+var polyOut = (function custom(e) {
+  e = +e;
+
+  function polyOut(t) {
+    return 1 - Math.pow(1 - t, e);
+  }
+
+  polyOut.exponent = custom;
+
+  return polyOut;
+})(exponent);
+
+var polyInOut = (function custom(e) {
+  e = +e;
+
+  function polyInOut(t) {
+    return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
+  }
+
+  polyInOut.exponent = custom;
+
+  return polyInOut;
+})(exponent);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/quad.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-ease/src/quad.js ***!
+  \******************************************/
+/*! exports provided: quadIn, quadOut, quadInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "quadIn", function() { return quadIn; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "quadOut", function() { return quadOut; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "quadInOut", function() { return quadInOut; });
+function quadIn(t) {
+  return t * t;
+}
+
+function quadOut(t) {
+  return t * (2 - t);
+}
+
+function quadInOut(t) {
+  return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-ease/src/sin.js":
+/*!*****************************************!*\
+  !*** ./node_modules/d3-ease/src/sin.js ***!
+  \*****************************************/
+/*! exports provided: sinIn, sinOut, sinInOut */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinIn", function() { return sinIn; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinOut", function() { return sinOut; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sinInOut", function() { return sinInOut; });
+var pi = Math.PI,
+    halfPi = pi / 2;
+
+function sinIn(t) {
+  return 1 - Math.cos(t * halfPi);
+}
+
+function sinOut(t) {
+  return Math.sin(t * halfPi);
+}
+
+function sinInOut(t) {
+  return (1 - Math.cos(pi * t)) / 2;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-fetch/src/blob.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-fetch/src/blob.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function responseBlob(response) {
+  if (!response.ok) throw new Error(response.status + " " + response.statusText);
+  return response.blob();
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(input, init) {
+  return fetch(input, init).then(responseBlob);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-fetch/src/buffer.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-fetch/src/buffer.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function responseArrayBuffer(response) {
+  if (!response.ok) throw new Error(response.status + " " + response.statusText);
+  return response.arrayBuffer();
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(input, init) {
+  return fetch(input, init).then(responseArrayBuffer);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-fetch/src/dsv.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-fetch/src/dsv.js ***!
+  \******************************************/
+/*! exports provided: default, csv, tsv */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return dsv; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "csv", function() { return csv; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tsv", function() { return tsv; });
+/* harmony import */ var d3_dsv__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-dsv */ "./node_modules/d3-dsv/src/index.js");
+/* harmony import */ var _text__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./text */ "./node_modules/d3-fetch/src/text.js");
+
+
+
+function dsvParse(parse) {
+  return function(input, init, row) {
+    if (arguments.length === 2 && typeof init === "function") row = init, init = undefined;
+    return Object(_text__WEBPACK_IMPORTED_MODULE_1__["default"])(input, init).then(function(response) {
+      return parse(response, row);
+    });
+  };
+}
+
+function dsv(delimiter, input, init, row) {
+  if (arguments.length === 3 && typeof init === "function") row = init, init = undefined;
+  var format = Object(d3_dsv__WEBPACK_IMPORTED_MODULE_0__["dsvFormat"])(delimiter);
+  return Object(_text__WEBPACK_IMPORTED_MODULE_1__["default"])(input, init).then(function(response) {
+    return format.parse(response, row);
+  });
+}
+
+var csv = dsvParse(d3_dsv__WEBPACK_IMPORTED_MODULE_0__["csvParse"]);
+var tsv = dsvParse(d3_dsv__WEBPACK_IMPORTED_MODULE_0__["tsvParse"]);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-fetch/src/image.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-fetch/src/image.js ***!
+  \********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(input, init) {
+  return new Promise(function(resolve, reject) {
+    var image = new Image;
+    for (var key in init) image[key] = init[key];
+    image.onerror = reject;
+    image.onload = function() { resolve(image); };
+    image.src = input;
+  });
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-fetch/src/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-fetch/src/index.js ***!
+  \********************************************/
+/*! exports provided: blob, buffer, dsv, csv, tsv, image, json, text, xml, html, svg */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _blob__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./blob */ "./node_modules/d3-fetch/src/blob.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "blob", function() { return _blob__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _buffer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./buffer */ "./node_modules/d3-fetch/src/buffer.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _buffer__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _dsv__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dsv */ "./node_modules/d3-fetch/src/dsv.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dsv", function() { return _dsv__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csv", function() { return _dsv__WEBPACK_IMPORTED_MODULE_2__["csv"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsv", function() { return _dsv__WEBPACK_IMPORTED_MODULE_2__["tsv"]; });
+
+/* harmony import */ var _image__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./image */ "./node_modules/d3-fetch/src/image.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "image", function() { return _image__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _json__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./json */ "./node_modules/d3-fetch/src/json.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "json", function() { return _json__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _text__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./text */ "./node_modules/d3-fetch/src/text.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "text", function() { return _text__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _xml__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./xml */ "./node_modules/d3-fetch/src/xml.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "xml", function() { return _xml__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "html", function() { return _xml__WEBPACK_IMPORTED_MODULE_6__["html"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "svg", function() { return _xml__WEBPACK_IMPORTED_MODULE_6__["svg"]; });
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-fetch/src/json.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-fetch/src/json.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function responseJson(response) {
+  if (!response.ok) throw new Error(response.status + " " + response.statusText);
+  return response.json();
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(input, init) {
+  return fetch(input, init).then(responseJson);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-fetch/src/text.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-fetch/src/text.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function responseText(response) {
+  if (!response.ok) throw new Error(response.status + " " + response.statusText);
+  return response.text();
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(input, init) {
+  return fetch(input, init).then(responseText);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-fetch/src/xml.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-fetch/src/xml.js ***!
+  \******************************************/
+/*! exports provided: default, html, svg */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "html", function() { return html; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "svg", function() { return svg; });
+/* harmony import */ var _text__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./text */ "./node_modules/d3-fetch/src/text.js");
+
+
+function parser(type) {
+  return function(input, init)  {
+    return Object(_text__WEBPACK_IMPORTED_MODULE_0__["default"])(input, init).then(function(text) {
+      return (new DOMParser).parseFromString(text, type);
+    });
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (parser("application/xml"));
+
+var html = parser("text/html");
+
+var svg = parser("image/svg+xml");
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/center.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-force/src/center.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x, y) {
+  var nodes;
+
+  if (x == null) x = 0;
+  if (y == null) y = 0;
+
+  function force() {
+    var i,
+        n = nodes.length,
+        node,
+        sx = 0,
+        sy = 0;
+
+    for (i = 0; i < n; ++i) {
+      node = nodes[i], sx += node.x, sy += node.y;
+    }
+
+    for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
+      node = nodes[i], node.x -= sx, node.y -= sy;
+    }
+  }
+
+  force.initialize = function(_) {
+    nodes = _;
+  };
+
+  force.x = function(_) {
+    return arguments.length ? (x = +_, force) : x;
+  };
+
+  force.y = function(_) {
+    return arguments.length ? (y = +_, force) : y;
+  };
+
+  return force;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/collide.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-force/src/collide.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-force/src/constant.js");
+/* harmony import */ var _jiggle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jiggle */ "./node_modules/d3-force/src/jiggle.js");
+/* harmony import */ var d3_quadtree__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-quadtree */ "./node_modules/d3-quadtree/src/index.js");
+
+
+
+
+function x(d) {
+  return d.x + d.vx;
+}
+
+function y(d) {
+  return d.y + d.vy;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(radius) {
+  var nodes,
+      radii,
+      strength = 1,
+      iterations = 1;
+
+  if (typeof radius !== "function") radius = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(radius == null ? 1 : +radius);
+
+  function force() {
+    var i, n = nodes.length,
+        tree,
+        node,
+        xi,
+        yi,
+        ri,
+        ri2;
+
+    for (var k = 0; k < iterations; ++k) {
+      tree = Object(d3_quadtree__WEBPACK_IMPORTED_MODULE_2__["quadtree"])(nodes, x, y).visitAfter(prepare);
+      for (i = 0; i < n; ++i) {
+        node = nodes[i];
+        ri = radii[node.index], ri2 = ri * ri;
+        xi = node.x + node.vx;
+        yi = node.y + node.vy;
+        tree.visit(apply);
+      }
+    }
+
+    function apply(quad, x0, y0, x1, y1) {
+      var data = quad.data, rj = quad.r, r = ri + rj;
+      if (data) {
+        if (data.index > node.index) {
+          var x = xi - data.x - data.vx,
+              y = yi - data.y - data.vy,
+              l = x * x + y * y;
+          if (l < r * r) {
+            if (x === 0) x = Object(_jiggle__WEBPACK_IMPORTED_MODULE_1__["default"])(), l += x * x;
+            if (y === 0) y = Object(_jiggle__WEBPACK_IMPORTED_MODULE_1__["default"])(), l += y * y;
+            l = (r - (l = Math.sqrt(l))) / l * strength;
+            node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
+            node.vy += (y *= l) * r;
+            data.vx -= x * (r = 1 - r);
+            data.vy -= y * r;
+          }
+        }
+        return;
+      }
+      return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
+    }
+  }
+
+  function prepare(quad) {
+    if (quad.data) return quad.r = radii[quad.data.index];
+    for (var i = quad.r = 0; i < 4; ++i) {
+      if (quad[i] && quad[i].r > quad.r) {
+        quad.r = quad[i].r;
+      }
+    }
+  }
+
+  function initialize() {
+    if (!nodes) return;
+    var i, n = nodes.length, node;
+    radii = new Array(n);
+    for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
+  }
+
+  force.initialize = function(_) {
+    nodes = _;
+    initialize();
+  };
+
+  force.iterations = function(_) {
+    return arguments.length ? (iterations = +_, force) : iterations;
+  };
+
+  force.strength = function(_) {
+    return arguments.length ? (strength = +_, force) : strength;
+  };
+
+  force.radius = function(_) {
+    return arguments.length ? (radius = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initialize(), force) : radius;
+  };
+
+  return force;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/constant.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-force/src/constant.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-force/src/index.js ***!
+  \********************************************/
+/*! exports provided: forceCenter, forceCollide, forceLink, forceManyBody, forceRadial, forceSimulation, forceX, forceY */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _center__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./center */ "./node_modules/d3-force/src/center.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceCenter", function() { return _center__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _collide__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./collide */ "./node_modules/d3-force/src/collide.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceCollide", function() { return _collide__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./link */ "./node_modules/d3-force/src/link.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceLink", function() { return _link__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _manyBody__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./manyBody */ "./node_modules/d3-force/src/manyBody.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceManyBody", function() { return _manyBody__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _radial__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./radial */ "./node_modules/d3-force/src/radial.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceRadial", function() { return _radial__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _simulation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./simulation */ "./node_modules/d3-force/src/simulation.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceSimulation", function() { return _simulation__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _x__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./x */ "./node_modules/d3-force/src/x.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceX", function() { return _x__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony import */ var _y__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./y */ "./node_modules/d3-force/src/y.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceY", function() { return _y__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/jiggle.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-force/src/jiggle.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return (Math.random() - 0.5) * 1e-6;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/link.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-force/src/link.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-force/src/constant.js");
+/* harmony import */ var _jiggle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jiggle */ "./node_modules/d3-force/src/jiggle.js");
+/* harmony import */ var d3_collection__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-collection */ "./node_modules/d3-collection/src/index.js");
+
+
+
+
+function index(d) {
+  return d.index;
+}
+
+function find(nodeById, nodeId) {
+  var node = nodeById.get(nodeId);
+  if (!node) throw new Error("missing: " + nodeId);
+  return node;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(links) {
+  var id = index,
+      strength = defaultStrength,
+      strengths,
+      distance = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(30),
+      distances,
+      nodes,
+      count,
+      bias,
+      iterations = 1;
+
+  if (links == null) links = [];
+
+  function defaultStrength(link) {
+    return 1 / Math.min(count[link.source.index], count[link.target.index]);
+  }
+
+  function force(alpha) {
+    for (var k = 0, n = links.length; k < iterations; ++k) {
+      for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
+        link = links[i], source = link.source, target = link.target;
+        x = target.x + target.vx - source.x - source.vx || Object(_jiggle__WEBPACK_IMPORTED_MODULE_1__["default"])();
+        y = target.y + target.vy - source.y - source.vy || Object(_jiggle__WEBPACK_IMPORTED_MODULE_1__["default"])();
+        l = Math.sqrt(x * x + y * y);
+        l = (l - distances[i]) / l * alpha * strengths[i];
+        x *= l, y *= l;
+        target.vx -= x * (b = bias[i]);
+        target.vy -= y * b;
+        source.vx += x * (b = 1 - b);
+        source.vy += y * b;
+      }
+    }
+  }
+
+  function initialize() {
+    if (!nodes) return;
+
+    var i,
+        n = nodes.length,
+        m = links.length,
+        nodeById = Object(d3_collection__WEBPACK_IMPORTED_MODULE_2__["map"])(nodes, id),
+        link;
+
+    for (i = 0, count = new Array(n); i < m; ++i) {
+      link = links[i], link.index = i;
+      if (typeof link.source !== "object") link.source = find(nodeById, link.source);
+      if (typeof link.target !== "object") link.target = find(nodeById, link.target);
+      count[link.source.index] = (count[link.source.index] || 0) + 1;
+      count[link.target.index] = (count[link.target.index] || 0) + 1;
+    }
+
+    for (i = 0, bias = new Array(m); i < m; ++i) {
+      link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
+    }
+
+    strengths = new Array(m), initializeStrength();
+    distances = new Array(m), initializeDistance();
+  }
+
+  function initializeStrength() {
+    if (!nodes) return;
+
+    for (var i = 0, n = links.length; i < n; ++i) {
+      strengths[i] = +strength(links[i], i, links);
+    }
+  }
+
+  function initializeDistance() {
+    if (!nodes) return;
+
+    for (var i = 0, n = links.length; i < n; ++i) {
+      distances[i] = +distance(links[i], i, links);
+    }
+  }
+
+  force.initialize = function(_) {
+    nodes = _;
+    initialize();
+  };
+
+  force.links = function(_) {
+    return arguments.length ? (links = _, initialize(), force) : links;
+  };
+
+  force.id = function(_) {
+    return arguments.length ? (id = _, force) : id;
+  };
+
+  force.iterations = function(_) {
+    return arguments.length ? (iterations = +_, force) : iterations;
+  };
+
+  force.strength = function(_) {
+    return arguments.length ? (strength = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initializeStrength(), force) : strength;
+  };
+
+  force.distance = function(_) {
+    return arguments.length ? (distance = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initializeDistance(), force) : distance;
+  };
+
+  return force;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/manyBody.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-force/src/manyBody.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-force/src/constant.js");
+/* harmony import */ var _jiggle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./jiggle */ "./node_modules/d3-force/src/jiggle.js");
+/* harmony import */ var d3_quadtree__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-quadtree */ "./node_modules/d3-quadtree/src/index.js");
+/* harmony import */ var _simulation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./simulation */ "./node_modules/d3-force/src/simulation.js");
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var nodes,
+      node,
+      alpha,
+      strength = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(-30),
+      strengths,
+      distanceMin2 = 1,
+      distanceMax2 = Infinity,
+      theta2 = 0.81;
+
+  function force(_) {
+    var i, n = nodes.length, tree = Object(d3_quadtree__WEBPACK_IMPORTED_MODULE_2__["quadtree"])(nodes, _simulation__WEBPACK_IMPORTED_MODULE_3__["x"], _simulation__WEBPACK_IMPORTED_MODULE_3__["y"]).visitAfter(accumulate);
+    for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
+  }
+
+  function initialize() {
+    if (!nodes) return;
+    var i, n = nodes.length, node;
+    strengths = new Array(n);
+    for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
+  }
+
+  function accumulate(quad) {
+    var strength = 0, q, c, weight = 0, x, y, i;
+
+    // For internal nodes, accumulate forces from child quadrants.
+    if (quad.length) {
+      for (x = y = i = 0; i < 4; ++i) {
+        if ((q = quad[i]) && (c = Math.abs(q.value))) {
+          strength += q.value, weight += c, x += c * q.x, y += c * q.y;
+        }
+      }
+      quad.x = x / weight;
+      quad.y = y / weight;
+    }
+
+    // For leaf nodes, accumulate forces from coincident quadrants.
+    else {
+      q = quad;
+      q.x = q.data.x;
+      q.y = q.data.y;
+      do strength += strengths[q.data.index];
+      while (q = q.next);
+    }
+
+    quad.value = strength;
+  }
+
+  function apply(quad, x1, _, x2) {
+    if (!quad.value) return true;
+
+    var x = quad.x - node.x,
+        y = quad.y - node.y,
+        w = x2 - x1,
+        l = x * x + y * y;
+
+    // Apply the Barnes-Hut approximation if possible.
+    // Limit forces for very close nodes; randomize direction if coincident.
+    if (w * w / theta2 < l) {
+      if (l < distanceMax2) {
+        if (x === 0) x = Object(_jiggle__WEBPACK_IMPORTED_MODULE_1__["default"])(), l += x * x;
+        if (y === 0) y = Object(_jiggle__WEBPACK_IMPORTED_MODULE_1__["default"])(), l += y * y;
+        if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
+        node.vx += x * quad.value * alpha / l;
+        node.vy += y * quad.value * alpha / l;
+      }
+      return true;
+    }
+
+    // Otherwise, process points directly.
+    else if (quad.length || l >= distanceMax2) return;
+
+    // Limit forces for very close nodes; randomize direction if coincident.
+    if (quad.data !== node || quad.next) {
+      if (x === 0) x = Object(_jiggle__WEBPACK_IMPORTED_MODULE_1__["default"])(), l += x * x;
+      if (y === 0) y = Object(_jiggle__WEBPACK_IMPORTED_MODULE_1__["default"])(), l += y * y;
+      if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
+    }
+
+    do if (quad.data !== node) {
+      w = strengths[quad.data.index] * alpha / l;
+      node.vx += x * w;
+      node.vy += y * w;
+    } while (quad = quad.next);
+  }
+
+  force.initialize = function(_) {
+    nodes = _;
+    initialize();
+  };
+
+  force.strength = function(_) {
+    return arguments.length ? (strength = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initialize(), force) : strength;
+  };
+
+  force.distanceMin = function(_) {
+    return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
+  };
+
+  force.distanceMax = function(_) {
+    return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
+  };
+
+  force.theta = function(_) {
+    return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
+  };
+
+  return force;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/radial.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-force/src/radial.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-force/src/constant.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(radius, x, y) {
+  var nodes,
+      strength = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(0.1),
+      strengths,
+      radiuses;
+
+  if (typeof radius !== "function") radius = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+radius);
+  if (x == null) x = 0;
+  if (y == null) y = 0;
+
+  function force(alpha) {
+    for (var i = 0, n = nodes.length; i < n; ++i) {
+      var node = nodes[i],
+          dx = node.x - x || 1e-6,
+          dy = node.y - y || 1e-6,
+          r = Math.sqrt(dx * dx + dy * dy),
+          k = (radiuses[i] - r) * strengths[i] * alpha / r;
+      node.vx += dx * k;
+      node.vy += dy * k;
+    }
+  }
+
+  function initialize() {
+    if (!nodes) return;
+    var i, n = nodes.length;
+    strengths = new Array(n);
+    radiuses = new Array(n);
+    for (i = 0; i < n; ++i) {
+      radiuses[i] = +radius(nodes[i], i, nodes);
+      strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
+    }
+  }
+
+  force.initialize = function(_) {
+    nodes = _, initialize();
+  };
+
+  force.strength = function(_) {
+    return arguments.length ? (strength = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initialize(), force) : strength;
+  };
+
+  force.radius = function(_) {
+    return arguments.length ? (radius = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initialize(), force) : radius;
+  };
+
+  force.x = function(_) {
+    return arguments.length ? (x = +_, force) : x;
+  };
+
+  force.y = function(_) {
+    return arguments.length ? (y = +_, force) : y;
+  };
+
+  return force;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/simulation.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-force/src/simulation.js ***!
+  \*************************************************/
+/*! exports provided: x, y, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return x; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return y; });
+/* harmony import */ var d3_dispatch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-dispatch */ "./node_modules/d3-dispatch/src/index.js");
+/* harmony import */ var d3_collection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-collection */ "./node_modules/d3-collection/src/index.js");
+/* harmony import */ var d3_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-timer */ "./node_modules/d3-timer/src/index.js");
+
+
+
+
+function x(d) {
+  return d.x;
+}
+
+function y(d) {
+  return d.y;
+}
+
+var initialRadius = 10,
+    initialAngle = Math.PI * (3 - Math.sqrt(5));
+
+/* harmony default export */ __webpack_exports__["default"] = (function(nodes) {
+  var simulation,
+      alpha = 1,
+      alphaMin = 0.001,
+      alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
+      alphaTarget = 0,
+      velocityDecay = 0.6,
+      forces = Object(d3_collection__WEBPACK_IMPORTED_MODULE_1__["map"])(),
+      stepper = Object(d3_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(step),
+      event = Object(d3_dispatch__WEBPACK_IMPORTED_MODULE_0__["dispatch"])("tick", "end");
+
+  if (nodes == null) nodes = [];
+
+  function step() {
+    tick();
+    event.call("tick", simulation);
+    if (alpha < alphaMin) {
+      stepper.stop();
+      event.call("end", simulation);
+    }
+  }
+
+  function tick(iterations) {
+    var i, n = nodes.length, node;
+
+    if (iterations === undefined) iterations = 1;
+
+    for (var k = 0; k < iterations; ++k) {
+      alpha += (alphaTarget - alpha) * alphaDecay;
+
+      forces.each(function (force) {
+        force(alpha);
+      });
+
+      for (i = 0; i < n; ++i) {
+        node = nodes[i];
+        if (node.fx == null) node.x += node.vx *= velocityDecay;
+        else node.x = node.fx, node.vx = 0;
+        if (node.fy == null) node.y += node.vy *= velocityDecay;
+        else node.y = node.fy, node.vy = 0;
+      }
+    }
+
+    return simulation;
+  }
+
+  function initializeNodes() {
+    for (var i = 0, n = nodes.length, node; i < n; ++i) {
+      node = nodes[i], node.index = i;
+      if (node.fx != null) node.x = node.fx;
+      if (node.fy != null) node.y = node.fy;
+      if (isNaN(node.x) || isNaN(node.y)) {
+        var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
+        node.x = radius * Math.cos(angle);
+        node.y = radius * Math.sin(angle);
+      }
+      if (isNaN(node.vx) || isNaN(node.vy)) {
+        node.vx = node.vy = 0;
+      }
+    }
+  }
+
+  function initializeForce(force) {
+    if (force.initialize) force.initialize(nodes);
+    return force;
+  }
+
+  initializeNodes();
+
+  return simulation = {
+    tick: tick,
+
+    restart: function() {
+      return stepper.restart(step), simulation;
+    },
+
+    stop: function() {
+      return stepper.stop(), simulation;
+    },
+
+    nodes: function(_) {
+      return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
+    },
+
+    alpha: function(_) {
+      return arguments.length ? (alpha = +_, simulation) : alpha;
+    },
+
+    alphaMin: function(_) {
+      return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
+    },
+
+    alphaDecay: function(_) {
+      return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
+    },
+
+    alphaTarget: function(_) {
+      return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
+    },
+
+    velocityDecay: function(_) {
+      return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
+    },
+
+    force: function(name, _) {
+      return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
+    },
+
+    find: function(x, y, radius) {
+      var i = 0,
+          n = nodes.length,
+          dx,
+          dy,
+          d2,
+          node,
+          closest;
+
+      if (radius == null) radius = Infinity;
+      else radius *= radius;
+
+      for (i = 0; i < n; ++i) {
+        node = nodes[i];
+        dx = x - node.x;
+        dy = y - node.y;
+        d2 = dx * dx + dy * dy;
+        if (d2 < radius) closest = node, radius = d2;
+      }
+
+      return closest;
+    },
+
+    on: function(name, _) {
+      return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
+    }
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/x.js":
+/*!****************************************!*\
+  !*** ./node_modules/d3-force/src/x.js ***!
+  \****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-force/src/constant.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  var strength = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(0.1),
+      nodes,
+      strengths,
+      xz;
+
+  if (typeof x !== "function") x = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(x == null ? 0 : +x);
+
+  function force(alpha) {
+    for (var i = 0, n = nodes.length, node; i < n; ++i) {
+      node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
+    }
+  }
+
+  function initialize() {
+    if (!nodes) return;
+    var i, n = nodes.length;
+    strengths = new Array(n);
+    xz = new Array(n);
+    for (i = 0; i < n; ++i) {
+      strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
+    }
+  }
+
+  force.initialize = function(_) {
+    nodes = _;
+    initialize();
+  };
+
+  force.strength = function(_) {
+    return arguments.length ? (strength = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initialize(), force) : strength;
+  };
+
+  force.x = function(_) {
+    return arguments.length ? (x = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initialize(), force) : x;
+  };
+
+  return force;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-force/src/y.js":
+/*!****************************************!*\
+  !*** ./node_modules/d3-force/src/y.js ***!
+  \****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-force/src/constant.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(y) {
+  var strength = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(0.1),
+      nodes,
+      strengths,
+      yz;
+
+  if (typeof y !== "function") y = Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(y == null ? 0 : +y);
+
+  function force(alpha) {
+    for (var i = 0, n = nodes.length, node; i < n; ++i) {
+      node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
+    }
+  }
+
+  function initialize() {
+    if (!nodes) return;
+    var i, n = nodes.length;
+    strengths = new Array(n);
+    yz = new Array(n);
+    for (i = 0; i < n; ++i) {
+      strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
+    }
+  }
+
+  force.initialize = function(_) {
+    nodes = _;
+    initialize();
+  };
+
+  force.strength = function(_) {
+    return arguments.length ? (strength = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initialize(), force) : strength;
+  };
+
+  force.y = function(_) {
+    return arguments.length ? (y = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), initialize(), force) : y;
+  };
+
+  return force;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/defaultLocale.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-format/src/defaultLocale.js ***!
+  \*****************************************************/
+/*! exports provided: format, formatPrefix, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "format", function() { return format; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatPrefix", function() { return formatPrefix; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return defaultLocale; });
+/* harmony import */ var _locale_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./locale.js */ "./node_modules/d3-format/src/locale.js");
+
+
+var locale;
+var format;
+var formatPrefix;
+
+defaultLocale({
+  decimal: ".",
+  thousands: ",",
+  grouping: [3],
+  currency: ["$", ""],
+  minus: "-"
+});
+
+function defaultLocale(definition) {
+  locale = Object(_locale_js__WEBPACK_IMPORTED_MODULE_0__["default"])(definition);
+  format = locale.format;
+  formatPrefix = locale.formatPrefix;
+  return locale;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/exponent.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-format/src/exponent.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _formatDecimal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./formatDecimal.js */ "./node_modules/d3-format/src/formatDecimal.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return x = Object(_formatDecimal_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Math.abs(x)), x ? x[1] : NaN;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/formatDecimal.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-format/src/formatDecimal.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+// Computes the decimal coefficient and exponent of the specified number x with
+// significant digits p, where x is positive and p is in [1, 21] or undefined.
+// For example, formatDecimal(1.23) returns ["123", 0].
+/* harmony default export */ __webpack_exports__["default"] = (function(x, p) {
+  if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
+  var i, coefficient = x.slice(0, i);
+
+  // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
+  // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
+  return [
+    coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
+    +x.slice(i + 1)
+  ];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/formatGroup.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-format/src/formatGroup.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(grouping, thousands) {
+  return function(value, width) {
+    var i = value.length,
+        t = [],
+        j = 0,
+        g = grouping[0],
+        length = 0;
+
+    while (i > 0 && g > 0) {
+      if (length + g + 1 > width) g = Math.max(1, width - length);
+      t.push(value.substring(i -= g, i + g));
+      if ((length += g + 1) > width) break;
+      g = grouping[j = (j + 1) % grouping.length];
+    }
+
+    return t.reverse().join(thousands);
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/formatNumerals.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-format/src/formatNumerals.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(numerals) {
+  return function(value) {
+    return value.replace(/[0-9]/g, function(i) {
+      return numerals[+i];
+    });
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/formatPrefixAuto.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-format/src/formatPrefixAuto.js ***!
+  \********************************************************/
+/*! exports provided: prefixExponent, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prefixExponent", function() { return prefixExponent; });
+/* harmony import */ var _formatDecimal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./formatDecimal.js */ "./node_modules/d3-format/src/formatDecimal.js");
+
+
+var prefixExponent;
+
+/* harmony default export */ __webpack_exports__["default"] = (function(x, p) {
+  var d = Object(_formatDecimal_js__WEBPACK_IMPORTED_MODULE_0__["default"])(x, p);
+  if (!d) return x + "";
+  var coefficient = d[0],
+      exponent = d[1],
+      i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
+      n = coefficient.length;
+  return i === n ? coefficient
+      : i > n ? coefficient + new Array(i - n + 1).join("0")
+      : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
+      : "0." + new Array(1 - i).join("0") + Object(_formatDecimal_js__WEBPACK_IMPORTED_MODULE_0__["default"])(x, Math.max(0, p + i - 1))[0]; // less than 1y!
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/formatRounded.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-format/src/formatRounded.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _formatDecimal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./formatDecimal.js */ "./node_modules/d3-format/src/formatDecimal.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(x, p) {
+  var d = Object(_formatDecimal_js__WEBPACK_IMPORTED_MODULE_0__["default"])(x, p);
+  if (!d) return x + "";
+  var coefficient = d[0],
+      exponent = d[1];
+  return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
+      : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
+      : coefficient + new Array(exponent - coefficient.length + 2).join("0");
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/formatSpecifier.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-format/src/formatSpecifier.js ***!
+  \*******************************************************/
+/*! exports provided: default, FormatSpecifier */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return formatSpecifier; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FormatSpecifier", function() { return FormatSpecifier; });
+// [[fill]align][sign][symbol][0][width][,][.precision][~][type]
+var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
+
+function formatSpecifier(specifier) {
+  if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
+  var match;
+  return new FormatSpecifier({
+    fill: match[1],
+    align: match[2],
+    sign: match[3],
+    symbol: match[4],
+    zero: match[5],
+    width: match[6],
+    comma: match[7],
+    precision: match[8] && match[8].slice(1),
+    trim: match[9],
+    type: match[10]
+  });
+}
+
+formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
+
+function FormatSpecifier(specifier) {
+  this.fill = specifier.fill === undefined ? " " : specifier.fill + "";
+  this.align = specifier.align === undefined ? ">" : specifier.align + "";
+  this.sign = specifier.sign === undefined ? "-" : specifier.sign + "";
+  this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + "";
+  this.zero = !!specifier.zero;
+  this.width = specifier.width === undefined ? undefined : +specifier.width;
+  this.comma = !!specifier.comma;
+  this.precision = specifier.precision === undefined ? undefined : +specifier.precision;
+  this.trim = !!specifier.trim;
+  this.type = specifier.type === undefined ? "" : specifier.type + "";
+}
+
+FormatSpecifier.prototype.toString = function() {
+  return this.fill
+      + this.align
+      + this.sign
+      + this.symbol
+      + (this.zero ? "0" : "")
+      + (this.width === undefined ? "" : Math.max(1, this.width | 0))
+      + (this.comma ? "," : "")
+      + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0))
+      + (this.trim ? "~" : "")
+      + this.type;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/formatTrim.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-format/src/formatTrim.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.
+/* harmony default export */ __webpack_exports__["default"] = (function(s) {
+  out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
+    switch (s[i]) {
+      case ".": i0 = i1 = i; break;
+      case "0": if (i0 === 0) i0 = i; i1 = i; break;
+      default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;
+    }
+  }
+  return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/formatTypes.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-format/src/formatTypes.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _formatPrefixAuto_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./formatPrefixAuto.js */ "./node_modules/d3-format/src/formatPrefixAuto.js");
+/* harmony import */ var _formatRounded_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./formatRounded.js */ "./node_modules/d3-format/src/formatRounded.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  "%": function(x, p) { return (x * 100).toFixed(p); },
+  "b": function(x) { return Math.round(x).toString(2); },
+  "c": function(x) { return x + ""; },
+  "d": function(x) { return Math.round(x).toString(10); },
+  "e": function(x, p) { return x.toExponential(p); },
+  "f": function(x, p) { return x.toFixed(p); },
+  "g": function(x, p) { return x.toPrecision(p); },
+  "o": function(x) { return Math.round(x).toString(8); },
+  "p": function(x, p) { return Object(_formatRounded_js__WEBPACK_IMPORTED_MODULE_1__["default"])(x * 100, p); },
+  "r": _formatRounded_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+  "s": _formatPrefixAuto_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
+  "x": function(x) { return Math.round(x).toString(16); }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/identity.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-format/src/identity.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return x;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/index.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-format/src/index.js ***!
+  \*********************************************/
+/*! exports provided: formatDefaultLocale, format, formatPrefix, formatLocale, formatSpecifier, FormatSpecifier, precisionFixed, precisionPrefix, precisionRound */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultLocale.js */ "./node_modules/d3-format/src/defaultLocale.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatDefaultLocale", function() { return _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "format", function() { return _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__["format"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatPrefix", function() { return _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__["formatPrefix"]; });
+
+/* harmony import */ var _locale_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./locale.js */ "./node_modules/d3-format/src/locale.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatLocale", function() { return _locale_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _formatSpecifier_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./formatSpecifier.js */ "./node_modules/d3-format/src/formatSpecifier.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatSpecifier", function() { return _formatSpecifier_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormatSpecifier", function() { return _formatSpecifier_js__WEBPACK_IMPORTED_MODULE_2__["FormatSpecifier"]; });
+
+/* harmony import */ var _precisionFixed_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./precisionFixed.js */ "./node_modules/d3-format/src/precisionFixed.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "precisionFixed", function() { return _precisionFixed_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _precisionPrefix_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./precisionPrefix.js */ "./node_modules/d3-format/src/precisionPrefix.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "precisionPrefix", function() { return _precisionPrefix_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _precisionRound_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./precisionRound.js */ "./node_modules/d3-format/src/precisionRound.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "precisionRound", function() { return _precisionRound_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/locale.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-format/src/locale.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _exponent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./exponent.js */ "./node_modules/d3-format/src/exponent.js");
+/* harmony import */ var _formatGroup_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./formatGroup.js */ "./node_modules/d3-format/src/formatGroup.js");
+/* harmony import */ var _formatNumerals_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./formatNumerals.js */ "./node_modules/d3-format/src/formatNumerals.js");
+/* harmony import */ var _formatSpecifier_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./formatSpecifier.js */ "./node_modules/d3-format/src/formatSpecifier.js");
+/* harmony import */ var _formatTrim_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./formatTrim.js */ "./node_modules/d3-format/src/formatTrim.js");
+/* harmony import */ var _formatTypes_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./formatTypes.js */ "./node_modules/d3-format/src/formatTypes.js");
+/* harmony import */ var _formatPrefixAuto_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./formatPrefixAuto.js */ "./node_modules/d3-format/src/formatPrefixAuto.js");
+/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./identity.js */ "./node_modules/d3-format/src/identity.js");
+
+
+
+
+
+
+
+
+
+var map = Array.prototype.map,
+    prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
+
+/* harmony default export */ __webpack_exports__["default"] = (function(locale) {
+  var group = locale.grouping === undefined || locale.thousands === undefined ? _identity_js__WEBPACK_IMPORTED_MODULE_7__["default"] : Object(_formatGroup_js__WEBPACK_IMPORTED_MODULE_1__["default"])(map.call(locale.grouping, Number), locale.thousands + ""),
+      currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "",
+      currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "",
+      decimal = locale.decimal === undefined ? "." : locale.decimal + "",
+      numerals = locale.numerals === undefined ? _identity_js__WEBPACK_IMPORTED_MODULE_7__["default"] : Object(_formatNumerals_js__WEBPACK_IMPORTED_MODULE_2__["default"])(map.call(locale.numerals, String)),
+      percent = locale.percent === undefined ? "%" : locale.percent + "",
+      minus = locale.minus === undefined ? "-" : locale.minus + "",
+      nan = locale.nan === undefined ? "NaN" : locale.nan + "";
+
+  function newFormat(specifier) {
+    specifier = Object(_formatSpecifier_js__WEBPACK_IMPORTED_MODULE_3__["default"])(specifier);
+
+    var fill = specifier.fill,
+        align = specifier.align,
+        sign = specifier.sign,
+        symbol = specifier.symbol,
+        zero = specifier.zero,
+        width = specifier.width,
+        comma = specifier.comma,
+        precision = specifier.precision,
+        trim = specifier.trim,
+        type = specifier.type;
+
+    // The "n" type is an alias for ",g".
+    if (type === "n") comma = true, type = "g";
+
+    // The "" type, and any invalid type, is an alias for ".12~g".
+    else if (!_formatTypes_js__WEBPACK_IMPORTED_MODULE_5__["default"][type]) precision === undefined && (precision = 12), trim = true, type = "g";
+
+    // If zero fill is specified, padding goes after sign and before digits.
+    if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
+
+    // Compute the prefix and suffix.
+    // For SI-prefix, the suffix is lazily computed.
+    var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
+        suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : "";
+
+    // What format function should we use?
+    // Is this an integer type?
+    // Can this type generate exponential notation?
+    var formatType = _formatTypes_js__WEBPACK_IMPORTED_MODULE_5__["default"][type],
+        maybeSuffix = /[defgprs%]/.test(type);
+
+    // Set the default precision if not specified,
+    // or clamp the specified precision to the supported range.
+    // For significant precision, it must be in [1, 21].
+    // For fixed precision, it must be in [0, 20].
+    precision = precision === undefined ? 6
+        : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
+        : Math.max(0, Math.min(20, precision));
+
+    function format(value) {
+      var valuePrefix = prefix,
+          valueSuffix = suffix,
+          i, n, c;
+
+      if (type === "c") {
+        valueSuffix = formatType(value) + valueSuffix;
+        value = "";
+      } else {
+        value = +value;
+
+        // Perform the initial formatting.
+        var valueNegative = value < 0;
+        value = isNaN(value) ? nan : formatType(Math.abs(value), precision);
+
+        // Trim insignificant zeros.
+        if (trim) value = Object(_formatTrim_js__WEBPACK_IMPORTED_MODULE_4__["default"])(value);
+
+        // If a negative value rounds to zero during formatting, treat as positive.
+        if (valueNegative && +value === 0) valueNegative = false;
+
+        // Compute the prefix and suffix.
+        valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
+
+        valueSuffix = (type === "s" ? prefixes[8 + _formatPrefixAuto_js__WEBPACK_IMPORTED_MODULE_6__["prefixExponent"] / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
+
+        // Break the formatted value into the integer “value” part that can be
+        // grouped, and fractional or exponential “suffix” part that is not.
+        if (maybeSuffix) {
+          i = -1, n = value.length;
+          while (++i < n) {
+            if (c = value.charCodeAt(i), 48 > c || c > 57) {
+              valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
+              value = value.slice(0, i);
+              break;
+            }
+          }
+        }
+      }
+
+      // If the fill character is not "0", grouping is applied before padding.
+      if (comma && !zero) value = group(value, Infinity);
+
+      // Compute the padding.
+      var length = valuePrefix.length + value.length + valueSuffix.length,
+          padding = length < width ? new Array(width - length + 1).join(fill) : "";
+
+      // If the fill character is "0", grouping is applied after padding.
+      if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
+
+      // Reconstruct the final output based on the desired alignment.
+      switch (align) {
+        case "<": value = valuePrefix + value + valueSuffix + padding; break;
+        case "=": value = valuePrefix + padding + value + valueSuffix; break;
+        case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
+        default: value = padding + valuePrefix + value + valueSuffix; break;
+      }
+
+      return numerals(value);
+    }
+
+    format.toString = function() {
+      return specifier + "";
+    };
+
+    return format;
+  }
+
+  function formatPrefix(specifier, value) {
+    var f = newFormat((specifier = Object(_formatSpecifier_js__WEBPACK_IMPORTED_MODULE_3__["default"])(specifier), specifier.type = "f", specifier)),
+        e = Math.max(-8, Math.min(8, Math.floor(Object(_exponent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) / 3))) * 3,
+        k = Math.pow(10, -e),
+        prefix = prefixes[8 + e / 3];
+    return function(value) {
+      return f(k * value) + prefix;
+    };
+  }
+
+  return {
+    format: newFormat,
+    formatPrefix: formatPrefix
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/precisionFixed.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-format/src/precisionFixed.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _exponent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./exponent.js */ "./node_modules/d3-format/src/exponent.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(step) {
+  return Math.max(0, -Object(_exponent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Math.abs(step)));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/precisionPrefix.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-format/src/precisionPrefix.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _exponent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./exponent.js */ "./node_modules/d3-format/src/exponent.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(step, value) {
+  return Math.max(0, Math.max(-8, Math.min(8, Math.floor(Object(_exponent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value) / 3))) * 3 - Object(_exponent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(Math.abs(step)));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-format/src/precisionRound.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-format/src/precisionRound.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _exponent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./exponent.js */ "./node_modules/d3-format/src/exponent.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(step, max) {
+  step = Math.abs(step), max = Math.abs(max) - step;
+  return Math.max(0, Object(_exponent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(max) - Object(_exponent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(step)) + 1;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/adder.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-geo/src/adder.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+// Adds floating point numbers with twice the normal precision.
+// Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
+// Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
+// 305–363 (1997).
+// Code adapted from GeographicLib by Charles F. F. Karney,
+// http://geographiclib.sourceforge.net/
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return new Adder;
+});
+
+function Adder() {
+  this.reset();
+}
+
+Adder.prototype = {
+  constructor: Adder,
+  reset: function() {
+    this.s = // rounded value
+    this.t = 0; // exact error
+  },
+  add: function(y) {
+    add(temp, y, this.t);
+    add(this, temp.s, this.s);
+    if (this.s) this.t += temp.t;
+    else this.s = temp.t;
+  },
+  valueOf: function() {
+    return this.s;
+  }
+};
+
+var temp = new Adder;
+
+function add(adder, a, b) {
+  var x = adder.s = a + b,
+      bv = x - a,
+      av = x - bv;
+  adder.t = (a - av) + (b - bv);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/area.js":
+/*!*****************************************!*\
+  !*** ./node_modules/d3-geo/src/area.js ***!
+  \*****************************************/
+/*! exports provided: areaRingSum, areaStream, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "areaRingSum", function() { return areaRingSum; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "areaStream", function() { return areaStream; });
+/* harmony import */ var _adder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./adder.js */ "./node_modules/d3-geo/src/adder.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./noop.js */ "./node_modules/d3-geo/src/noop.js");
+/* harmony import */ var _stream_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stream.js */ "./node_modules/d3-geo/src/stream.js");
+
+
+
+
+
+var areaRingSum = Object(_adder_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+
+var areaSum = Object(_adder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(),
+    lambda00,
+    phi00,
+    lambda0,
+    cosPhi0,
+    sinPhi0;
+
+var areaStream = {
+  point: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  lineStart: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  lineEnd: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  polygonStart: function() {
+    areaRingSum.reset();
+    areaStream.lineStart = areaRingStart;
+    areaStream.lineEnd = areaRingEnd;
+  },
+  polygonEnd: function() {
+    var areaRing = +areaRingSum;
+    areaSum.add(areaRing < 0 ? _math_js__WEBPACK_IMPORTED_MODULE_1__["tau"] + areaRing : areaRing);
+    this.lineStart = this.lineEnd = this.point = _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"];
+  },
+  sphere: function() {
+    areaSum.add(_math_js__WEBPACK_IMPORTED_MODULE_1__["tau"]);
+  }
+};
+
+function areaRingStart() {
+  areaStream.point = areaPointFirst;
+}
+
+function areaRingEnd() {
+  areaPoint(lambda00, phi00);
+}
+
+function areaPointFirst(lambda, phi) {
+  areaStream.point = areaPoint;
+  lambda00 = lambda, phi00 = phi;
+  lambda *= _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"], phi *= _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"];
+  lambda0 = lambda, cosPhi0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(phi = phi / 2 + _math_js__WEBPACK_IMPORTED_MODULE_1__["quarterPi"]), sinPhi0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(phi);
+}
+
+function areaPoint(lambda, phi) {
+  lambda *= _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"], phi *= _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"];
+  phi = phi / 2 + _math_js__WEBPACK_IMPORTED_MODULE_1__["quarterPi"]; // half the angular distance from south pole
+
+  // Spherical excess E for a spherical triangle with vertices: south pole,
+  // previous point, current point.  Uses a formula derived from Cagnoli’s
+  // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
+  var dLambda = lambda - lambda0,
+      sdLambda = dLambda >= 0 ? 1 : -1,
+      adLambda = sdLambda * dLambda,
+      cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(phi),
+      sinPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(phi),
+      k = sinPhi0 * sinPhi,
+      u = cosPhi0 * cosPhi + k * Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(adLambda),
+      v = k * sdLambda * Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(adLambda);
+  areaRingSum.add(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["atan2"])(v, u));
+
+  // Advance the previous points.
+  lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(object) {
+  areaSum.reset();
+  Object(_stream_js__WEBPACK_IMPORTED_MODULE_3__["default"])(object, areaStream);
+  return areaSum * 2;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/bounds.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-geo/src/bounds.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _adder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./adder.js */ "./node_modules/d3-geo/src/adder.js");
+/* harmony import */ var _area_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./area.js */ "./node_modules/d3-geo/src/area.js");
+/* harmony import */ var _cartesian_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cartesian.js */ "./node_modules/d3-geo/src/cartesian.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _stream_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stream.js */ "./node_modules/d3-geo/src/stream.js");
+
+
+
+
+
+
+var lambda0, phi0, lambda1, phi1, // bounds
+    lambda2, // previous lambda-coordinate
+    lambda00, phi00, // first point
+    p0, // previous 3D point
+    deltaSum = Object(_adder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(),
+    ranges,
+    range;
+
+var boundsStream = {
+  point: boundsPoint,
+  lineStart: boundsLineStart,
+  lineEnd: boundsLineEnd,
+  polygonStart: function() {
+    boundsStream.point = boundsRingPoint;
+    boundsStream.lineStart = boundsRingStart;
+    boundsStream.lineEnd = boundsRingEnd;
+    deltaSum.reset();
+    _area_js__WEBPACK_IMPORTED_MODULE_1__["areaStream"].polygonStart();
+  },
+  polygonEnd: function() {
+    _area_js__WEBPACK_IMPORTED_MODULE_1__["areaStream"].polygonEnd();
+    boundsStream.point = boundsPoint;
+    boundsStream.lineStart = boundsLineStart;
+    boundsStream.lineEnd = boundsLineEnd;
+    if (_area_js__WEBPACK_IMPORTED_MODULE_1__["areaRingSum"] < 0) lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);
+    else if (deltaSum > _math_js__WEBPACK_IMPORTED_MODULE_3__["epsilon"]) phi1 = 90;
+    else if (deltaSum < -_math_js__WEBPACK_IMPORTED_MODULE_3__["epsilon"]) phi0 = -90;
+    range[0] = lambda0, range[1] = lambda1;
+  },
+  sphere: function() {
+    lambda0 = -(lambda1 = 180), phi0 = -(phi1 = 90);
+  }
+};
+
+function boundsPoint(lambda, phi) {
+  ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);
+  if (phi < phi0) phi0 = phi;
+  if (phi > phi1) phi1 = phi;
+}
+
+function linePoint(lambda, phi) {
+  var p = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_2__["cartesian"])([lambda * _math_js__WEBPACK_IMPORTED_MODULE_3__["radians"], phi * _math_js__WEBPACK_IMPORTED_MODULE_3__["radians"]]);
+  if (p0) {
+    var normal = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_2__["cartesianCross"])(p0, p),
+        equatorial = [normal[1], -normal[0], 0],
+        inflection = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_2__["cartesianCross"])(equatorial, normal);
+    Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_2__["cartesianNormalizeInPlace"])(inflection);
+    inflection = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_2__["spherical"])(inflection);
+    var delta = lambda - lambda2,
+        sign = delta > 0 ? 1 : -1,
+        lambdai = inflection[0] * _math_js__WEBPACK_IMPORTED_MODULE_3__["degrees"] * sign,
+        phii,
+        antimeridian = Object(_math_js__WEBPACK_IMPORTED_MODULE_3__["abs"])(delta) > 180;
+    if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
+      phii = inflection[1] * _math_js__WEBPACK_IMPORTED_MODULE_3__["degrees"];
+      if (phii > phi1) phi1 = phii;
+    } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
+      phii = -inflection[1] * _math_js__WEBPACK_IMPORTED_MODULE_3__["degrees"];
+      if (phii < phi0) phi0 = phii;
+    } else {
+      if (phi < phi0) phi0 = phi;
+      if (phi > phi1) phi1 = phi;
+    }
+    if (antimeridian) {
+      if (lambda < lambda2) {
+        if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;
+      } else {
+        if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;
+      }
+    } else {
+      if (lambda1 >= lambda0) {
+        if (lambda < lambda0) lambda0 = lambda;
+        if (lambda > lambda1) lambda1 = lambda;
+      } else {
+        if (lambda > lambda2) {
+          if (angle(lambda0, lambda) > angle(lambda0, lambda1)) lambda1 = lambda;
+        } else {
+          if (angle(lambda, lambda1) > angle(lambda0, lambda1)) lambda0 = lambda;
+        }
+      }
+    }
+  } else {
+    ranges.push(range = [lambda0 = lambda, lambda1 = lambda]);
+  }
+  if (phi < phi0) phi0 = phi;
+  if (phi > phi1) phi1 = phi;
+  p0 = p, lambda2 = lambda;
+}
+
+function boundsLineStart() {
+  boundsStream.point = linePoint;
+}
+
+function boundsLineEnd() {
+  range[0] = lambda0, range[1] = lambda1;
+  boundsStream.point = boundsPoint;
+  p0 = null;
+}
+
+function boundsRingPoint(lambda, phi) {
+  if (p0) {
+    var delta = lambda - lambda2;
+    deltaSum.add(Object(_math_js__WEBPACK_IMPORTED_MODULE_3__["abs"])(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
+  } else {
+    lambda00 = lambda, phi00 = phi;
+  }
+  _area_js__WEBPACK_IMPORTED_MODULE_1__["areaStream"].point(lambda, phi);
+  linePoint(lambda, phi);
+}
+
+function boundsRingStart() {
+  _area_js__WEBPACK_IMPORTED_MODULE_1__["areaStream"].lineStart();
+}
+
+function boundsRingEnd() {
+  boundsRingPoint(lambda00, phi00);
+  _area_js__WEBPACK_IMPORTED_MODULE_1__["areaStream"].lineEnd();
+  if (Object(_math_js__WEBPACK_IMPORTED_MODULE_3__["abs"])(deltaSum) > _math_js__WEBPACK_IMPORTED_MODULE_3__["epsilon"]) lambda0 = -(lambda1 = 180);
+  range[0] = lambda0, range[1] = lambda1;
+  p0 = null;
+}
+
+// Finds the left-right distance between two longitudes.
+// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
+// the distance between ±180° to be 360°.
+function angle(lambda0, lambda1) {
+  return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
+}
+
+function rangeCompare(a, b) {
+  return a[0] - b[0];
+}
+
+function rangeContains(range, x) {
+  return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(feature) {
+  var i, n, a, b, merged, deltaMax, delta;
+
+  phi1 = lambda1 = -(lambda0 = phi0 = Infinity);
+  ranges = [];
+  Object(_stream_js__WEBPACK_IMPORTED_MODULE_4__["default"])(feature, boundsStream);
+
+  // First, sort ranges by their minimum longitudes.
+  if (n = ranges.length) {
+    ranges.sort(rangeCompare);
+
+    // Then, merge any ranges that overlap.
+    for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
+      b = ranges[i];
+      if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
+        if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
+        if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
+      } else {
+        merged.push(a = b);
+      }
+    }
+
+    // Finally, find the largest gap between the merged ranges.
+    // The final bounding box will be the inverse of this gap.
+    for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
+      b = merged[i];
+      if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0 = b[0], lambda1 = a[1];
+    }
+  }
+
+  ranges = range = null;
+
+  return lambda0 === Infinity || phi0 === Infinity
+      ? [[NaN, NaN], [NaN, NaN]]
+      : [[lambda0, phi0], [lambda1, phi1]];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/cartesian.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-geo/src/cartesian.js ***!
+  \**********************************************/
+/*! exports provided: spherical, cartesian, cartesianDot, cartesianCross, cartesianAddInPlace, cartesianScale, cartesianNormalizeInPlace */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spherical", function() { return spherical; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cartesian", function() { return cartesian; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cartesianDot", function() { return cartesianDot; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cartesianCross", function() { return cartesianCross; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cartesianAddInPlace", function() { return cartesianAddInPlace; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cartesianScale", function() { return cartesianScale; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cartesianNormalizeInPlace", function() { return cartesianNormalizeInPlace; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+function spherical(cartesian) {
+  return [Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan2"])(cartesian[1], cartesian[0]), Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["asin"])(cartesian[2])];
+}
+
+function cartesian(spherical) {
+  var lambda = spherical[0], phi = spherical[1], cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(phi);
+  return [cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(lambda), cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(lambda), Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(phi)];
+}
+
+function cartesianDot(a, b) {
+  return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+}
+
+function cartesianCross(a, b) {
+  return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
+}
+
+// TODO return a
+function cartesianAddInPlace(a, b) {
+  a[0] += b[0], a[1] += b[1], a[2] += b[2];
+}
+
+function cartesianScale(vector, k) {
+  return [vector[0] * k, vector[1] * k, vector[2] * k];
+}
+
+// TODO return d
+function cartesianNormalizeInPlace(d) {
+  var l = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+  d[0] /= l, d[1] /= l, d[2] /= l;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/centroid.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-geo/src/centroid.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./noop.js */ "./node_modules/d3-geo/src/noop.js");
+/* harmony import */ var _stream_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stream.js */ "./node_modules/d3-geo/src/stream.js");
+
+
+
+
+var W0, W1,
+    X0, Y0, Z0,
+    X1, Y1, Z1,
+    X2, Y2, Z2,
+    lambda00, phi00, // first point
+    x0, y0, z0; // previous point
+
+var centroidStream = {
+  sphere: _noop_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+  point: centroidPoint,
+  lineStart: centroidLineStart,
+  lineEnd: centroidLineEnd,
+  polygonStart: function() {
+    centroidStream.lineStart = centroidRingStart;
+    centroidStream.lineEnd = centroidRingEnd;
+  },
+  polygonEnd: function() {
+    centroidStream.lineStart = centroidLineStart;
+    centroidStream.lineEnd = centroidLineEnd;
+  }
+};
+
+// Arithmetic mean of Cartesian vectors.
+function centroidPoint(lambda, phi) {
+  lambda *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"], phi *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"];
+  var cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(phi);
+  centroidPointCartesian(cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(lambda), cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(lambda), Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(phi));
+}
+
+function centroidPointCartesian(x, y, z) {
+  ++W0;
+  X0 += (x - X0) / W0;
+  Y0 += (y - Y0) / W0;
+  Z0 += (z - Z0) / W0;
+}
+
+function centroidLineStart() {
+  centroidStream.point = centroidLinePointFirst;
+}
+
+function centroidLinePointFirst(lambda, phi) {
+  lambda *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"], phi *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"];
+  var cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(phi);
+  x0 = cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(lambda);
+  y0 = cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(lambda);
+  z0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(phi);
+  centroidStream.point = centroidLinePoint;
+  centroidPointCartesian(x0, y0, z0);
+}
+
+function centroidLinePoint(lambda, phi) {
+  lambda *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"], phi *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"];
+  var cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(phi),
+      x = cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(lambda),
+      y = cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(lambda),
+      z = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(phi),
+      w = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan2"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
+  W1 += w;
+  X1 += w * (x0 + (x0 = x));
+  Y1 += w * (y0 + (y0 = y));
+  Z1 += w * (z0 + (z0 = z));
+  centroidPointCartesian(x0, y0, z0);
+}
+
+function centroidLineEnd() {
+  centroidStream.point = centroidPoint;
+}
+
+// See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
+// J. Applied Mechanics 42, 239 (1975).
+function centroidRingStart() {
+  centroidStream.point = centroidRingPointFirst;
+}
+
+function centroidRingEnd() {
+  centroidRingPoint(lambda00, phi00);
+  centroidStream.point = centroidPoint;
+}
+
+function centroidRingPointFirst(lambda, phi) {
+  lambda00 = lambda, phi00 = phi;
+  lambda *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"], phi *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"];
+  centroidStream.point = centroidRingPoint;
+  var cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(phi);
+  x0 = cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(lambda);
+  y0 = cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(lambda);
+  z0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(phi);
+  centroidPointCartesian(x0, y0, z0);
+}
+
+function centroidRingPoint(lambda, phi) {
+  lambda *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"], phi *= _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"];
+  var cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(phi),
+      x = cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(lambda),
+      y = cosPhi * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(lambda),
+      z = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(phi),
+      cx = y0 * z - z0 * y,
+      cy = z0 * x - x0 * z,
+      cz = x0 * y - y0 * x,
+      m = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(cx * cx + cy * cy + cz * cz),
+      w = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["asin"])(m), // line weight = angle
+      v = m && -w / m; // area weight multiplier
+  X2 += v * cx;
+  Y2 += v * cy;
+  Z2 += v * cz;
+  W1 += w;
+  X1 += w * (x0 + (x0 = x));
+  Y1 += w * (y0 + (y0 = y));
+  Z1 += w * (z0 + (z0 = z));
+  centroidPointCartesian(x0, y0, z0);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(object) {
+  W0 = W1 =
+  X0 = Y0 = Z0 =
+  X1 = Y1 = Z1 =
+  X2 = Y2 = Z2 = 0;
+  Object(_stream_js__WEBPACK_IMPORTED_MODULE_2__["default"])(object, centroidStream);
+
+  var x = X2,
+      y = Y2,
+      z = Z2,
+      m = x * x + y * y + z * z;
+
+  // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
+  if (m < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon2"]) {
+    x = X1, y = Y1, z = Z1;
+    // If the feature has zero length, fall back to arithmetic mean of point vectors.
+    if (W1 < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]) x = X0, y = Y0, z = Z0;
+    m = x * x + y * y + z * z;
+    // If the feature still has an undefined ccentroid, then return.
+    if (m < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon2"]) return [NaN, NaN];
+  }
+
+  return [Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan2"])(y, x) * _math_js__WEBPACK_IMPORTED_MODULE_0__["degrees"], Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["asin"])(z / Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(m)) * _math_js__WEBPACK_IMPORTED_MODULE_0__["degrees"]];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/circle.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-geo/src/circle.js ***!
+  \*******************************************/
+/*! exports provided: circleStream, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleStream", function() { return circleStream; });
+/* harmony import */ var _cartesian_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cartesian.js */ "./node_modules/d3-geo/src/cartesian.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-geo/src/constant.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _rotation_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rotation.js */ "./node_modules/d3-geo/src/rotation.js");
+
+
+
+
+
+// Generates a circle centered at [0°, 0°], with a given radius and precision.
+function circleStream(stream, radius, delta, direction, t0, t1) {
+  if (!delta) return;
+  var cosRadius = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(radius),
+      sinRadius = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(radius),
+      step = direction * delta;
+  if (t0 == null) {
+    t0 = radius + direction * _math_js__WEBPACK_IMPORTED_MODULE_2__["tau"];
+    t1 = radius - step / 2;
+  } else {
+    t0 = circleRadius(cosRadius, t0);
+    t1 = circleRadius(cosRadius, t1);
+    if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * _math_js__WEBPACK_IMPORTED_MODULE_2__["tau"];
+  }
+  for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
+    point = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["spherical"])([cosRadius, -sinRadius * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(t), -sinRadius * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(t)]);
+    stream.point(point[0], point[1]);
+  }
+}
+
+// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
+function circleRadius(cosRadius, point) {
+  point = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesian"])(point), point[0] -= cosRadius;
+  Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianNormalizeInPlace"])(point);
+  var radius = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["acos"])(-point[1]);
+  return ((-point[2] < 0 ? -radius : radius) + _math_js__WEBPACK_IMPORTED_MODULE_2__["tau"] - _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) % _math_js__WEBPACK_IMPORTED_MODULE_2__["tau"];
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var center = Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])([0, 0]),
+      radius = Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(90),
+      precision = Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(6),
+      ring,
+      rotate,
+      stream = {point: point};
+
+  function point(x, y) {
+    ring.push(x = rotate(x, y));
+    x[0] *= _math_js__WEBPACK_IMPORTED_MODULE_2__["degrees"], x[1] *= _math_js__WEBPACK_IMPORTED_MODULE_2__["degrees"];
+  }
+
+  function circle() {
+    var c = center.apply(this, arguments),
+        r = radius.apply(this, arguments) * _math_js__WEBPACK_IMPORTED_MODULE_2__["radians"],
+        p = precision.apply(this, arguments) * _math_js__WEBPACK_IMPORTED_MODULE_2__["radians"];
+    ring = [];
+    rotate = Object(_rotation_js__WEBPACK_IMPORTED_MODULE_3__["rotateRadians"])(-c[0] * _math_js__WEBPACK_IMPORTED_MODULE_2__["radians"], -c[1] * _math_js__WEBPACK_IMPORTED_MODULE_2__["radians"], 0).invert;
+    circleStream(stream, r, p, 1);
+    c = {type: "Polygon", coordinates: [ring]};
+    ring = rotate = null;
+    return c;
+  }
+
+  circle.center = function(_) {
+    return arguments.length ? (center = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])([+_[0], +_[1]]), circle) : center;
+  };
+
+  circle.radius = function(_) {
+    return arguments.length ? (radius = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), circle) : radius;
+  };
+
+  circle.precision = function(_) {
+    return arguments.length ? (precision = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), circle) : precision;
+  };
+
+  return circle;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/clip/antimeridian.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-geo/src/clip/antimeridian.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/clip/index.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_index_js__WEBPACK_IMPORTED_MODULE_0__["default"])(
+  function() { return true; },
+  clipAntimeridianLine,
+  clipAntimeridianInterpolate,
+  [-_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"], -_math_js__WEBPACK_IMPORTED_MODULE_1__["halfPi"]]
+));
+
+// Takes a line and cuts into visible segments. Return values: 0 - there were
+// intersections or the line was empty; 1 - no intersections; 2 - there were
+// intersections, and the first and last segments should be rejoined.
+function clipAntimeridianLine(stream) {
+  var lambda0 = NaN,
+      phi0 = NaN,
+      sign0 = NaN,
+      clean; // no intersections
+
+  return {
+    lineStart: function() {
+      stream.lineStart();
+      clean = 1;
+    },
+    point: function(lambda1, phi1) {
+      var sign1 = lambda1 > 0 ? _math_js__WEBPACK_IMPORTED_MODULE_1__["pi"] : -_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"],
+          delta = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(lambda1 - lambda0);
+      if (Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(delta - _math_js__WEBPACK_IMPORTED_MODULE_1__["pi"]) < _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]) { // line crosses a pole
+        stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? _math_js__WEBPACK_IMPORTED_MODULE_1__["halfPi"] : -_math_js__WEBPACK_IMPORTED_MODULE_1__["halfPi"]);
+        stream.point(sign0, phi0);
+        stream.lineEnd();
+        stream.lineStart();
+        stream.point(sign1, phi0);
+        stream.point(lambda1, phi0);
+        clean = 0;
+      } else if (sign0 !== sign1 && delta >= _math_js__WEBPACK_IMPORTED_MODULE_1__["pi"]) { // line crosses antimeridian
+        if (Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(lambda0 - sign0) < _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]) lambda0 -= sign0 * _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]; // handle degeneracies
+        if (Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(lambda1 - sign1) < _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]) lambda1 -= sign1 * _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"];
+        phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
+        stream.point(sign0, phi0);
+        stream.lineEnd();
+        stream.lineStart();
+        stream.point(sign1, phi0);
+        clean = 0;
+      }
+      stream.point(lambda0 = lambda1, phi0 = phi1);
+      sign0 = sign1;
+    },
+    lineEnd: function() {
+      stream.lineEnd();
+      lambda0 = phi0 = NaN;
+    },
+    clean: function() {
+      return 2 - clean; // if intersections, rejoin first and last segments
+    }
+  };
+}
+
+function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
+  var cosPhi0,
+      cosPhi1,
+      sinLambda0Lambda1 = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(lambda0 - lambda1);
+  return Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(sinLambda0Lambda1) > _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]
+      ? Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["atan"])((Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(phi0) * (cosPhi1 = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(phi1)) * Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(lambda1)
+          - Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(phi1) * (cosPhi0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(phi0)) * Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(lambda0))
+          / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
+      : (phi0 + phi1) / 2;
+}
+
+function clipAntimeridianInterpolate(from, to, direction, stream) {
+  var phi;
+  if (from == null) {
+    phi = direction * _math_js__WEBPACK_IMPORTED_MODULE_1__["halfPi"];
+    stream.point(-_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"], phi);
+    stream.point(0, phi);
+    stream.point(_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"], phi);
+    stream.point(_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"], 0);
+    stream.point(_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"], -phi);
+    stream.point(0, -phi);
+    stream.point(-_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"], -phi);
+    stream.point(-_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"], 0);
+    stream.point(-_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"], phi);
+  } else if (Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(from[0] - to[0]) > _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]) {
+    var lambda = from[0] < to[0] ? _math_js__WEBPACK_IMPORTED_MODULE_1__["pi"] : -_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"];
+    phi = direction * lambda / 2;
+    stream.point(-lambda, phi);
+    stream.point(0, phi);
+    stream.point(lambda, phi);
+  } else {
+    stream.point(to[0], to[1]);
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/clip/buffer.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-geo/src/clip/buffer.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../noop.js */ "./node_modules/d3-geo/src/noop.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var lines = [],
+      line;
+  return {
+    point: function(x, y) {
+      line.push([x, y]);
+    },
+    lineStart: function() {
+      lines.push(line = []);
+    },
+    lineEnd: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+    rejoin: function() {
+      if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
+    },
+    result: function() {
+      var result = lines;
+      lines = [];
+      line = null;
+      return result;
+    }
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/clip/circle.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-geo/src/clip/circle.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _cartesian_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../cartesian.js */ "./node_modules/d3-geo/src/cartesian.js");
+/* harmony import */ var _circle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../circle.js */ "./node_modules/d3-geo/src/circle.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _pointEqual_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../pointEqual.js */ "./node_modules/d3-geo/src/pointEqual.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/clip/index.js");
+
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(radius) {
+  var cr = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(radius),
+      delta = 6 * _math_js__WEBPACK_IMPORTED_MODULE_2__["radians"],
+      smallRadius = cr > 0,
+      notHemisphere = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["abs"])(cr) > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]; // TODO optimise for this common case
+
+  function interpolate(from, to, direction, stream) {
+    Object(_circle_js__WEBPACK_IMPORTED_MODULE_1__["circleStream"])(stream, radius, delta, direction, from, to);
+  }
+
+  function visible(lambda, phi) {
+    return Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(lambda) * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(phi) > cr;
+  }
+
+  // Takes a line and cuts into visible segments. Return values used for polygon
+  // clipping: 0 - there were intersections or the line was empty; 1 - no
+  // intersections 2 - there were intersections, and the first and last segments
+  // should be rejoined.
+  function clipLine(stream) {
+    var point0, // previous point
+        c0, // code for previous point
+        v0, // visibility of previous point
+        v00, // visibility of first point
+        clean; // no intersections
+    return {
+      lineStart: function() {
+        v00 = v0 = false;
+        clean = 1;
+      },
+      point: function(lambda, phi) {
+        var point1 = [lambda, phi],
+            point2,
+            v = visible(lambda, phi),
+            c = smallRadius
+              ? v ? 0 : code(lambda, phi)
+              : v ? code(lambda + (lambda < 0 ? _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"] : -_math_js__WEBPACK_IMPORTED_MODULE_2__["pi"]), phi) : 0;
+        if (!point0 && (v00 = v0 = v)) stream.lineStart();
+        // Handle degeneracies.
+        // TODO ignore if not clipping polygons.
+        if (v !== v0) {
+          point2 = intersect(point0, point1);
+          if (!point2 || Object(_pointEqual_js__WEBPACK_IMPORTED_MODULE_3__["default"])(point0, point2) || Object(_pointEqual_js__WEBPACK_IMPORTED_MODULE_3__["default"])(point1, point2)) {
+            point1[0] += _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"];
+            point1[1] += _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"];
+            v = visible(point1[0], point1[1]);
+          }
+        }
+        if (v !== v0) {
+          clean = 0;
+          if (v) {
+            // outside going in
+            stream.lineStart();
+            point2 = intersect(point1, point0);
+            stream.point(point2[0], point2[1]);
+          } else {
+            // inside going out
+            point2 = intersect(point0, point1);
+            stream.point(point2[0], point2[1]);
+            stream.lineEnd();
+          }
+          point0 = point2;
+        } else if (notHemisphere && point0 && smallRadius ^ v) {
+          var t;
+          // If the codes for two points are different, or are both zero,
+          // and there this segment intersects with the small circle.
+          if (!(c & c0) && (t = intersect(point1, point0, true))) {
+            clean = 0;
+            if (smallRadius) {
+              stream.lineStart();
+              stream.point(t[0][0], t[0][1]);
+              stream.point(t[1][0], t[1][1]);
+              stream.lineEnd();
+            } else {
+              stream.point(t[1][0], t[1][1]);
+              stream.lineEnd();
+              stream.lineStart();
+              stream.point(t[0][0], t[0][1]);
+            }
+          }
+        }
+        if (v && (!point0 || !Object(_pointEqual_js__WEBPACK_IMPORTED_MODULE_3__["default"])(point0, point1))) {
+          stream.point(point1[0], point1[1]);
+        }
+        point0 = point1, v0 = v, c0 = c;
+      },
+      lineEnd: function() {
+        if (v0) stream.lineEnd();
+        point0 = null;
+      },
+      // Rejoin first and last segments if there were intersections and the first
+      // and last points were visible.
+      clean: function() {
+        return clean | ((v00 && v0) << 1);
+      }
+    };
+  }
+
+  // Intersects the great circle between a and b with the clip circle.
+  function intersect(a, b, two) {
+    var pa = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesian"])(a),
+        pb = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesian"])(b);
+
+    // We have two planes, n1.p = d1 and n2.p = d2.
+    // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
+    var n1 = [1, 0, 0], // normal
+        n2 = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianCross"])(pa, pb),
+        n2n2 = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianDot"])(n2, n2),
+        n1n2 = n2[0], // cartesianDot(n1, n2),
+        determinant = n2n2 - n1n2 * n1n2;
+
+    // Two polar points.
+    if (!determinant) return !two && a;
+
+    var c1 =  cr * n2n2 / determinant,
+        c2 = -cr * n1n2 / determinant,
+        n1xn2 = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianCross"])(n1, n2),
+        A = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianScale"])(n1, c1),
+        B = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianScale"])(n2, c2);
+    Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianAddInPlace"])(A, B);
+
+    // Solve |p(t)|^2 = 1.
+    var u = n1xn2,
+        w = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianDot"])(A, u),
+        uu = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianDot"])(u, u),
+        t2 = w * w - uu * (Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianDot"])(A, A) - 1);
+
+    if (t2 < 0) return;
+
+    var t = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(t2),
+        q = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianScale"])(u, (-w - t) / uu);
+    Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianAddInPlace"])(q, A);
+    q = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["spherical"])(q);
+
+    if (!two) return q;
+
+    // Two intersection points.
+    var lambda0 = a[0],
+        lambda1 = b[0],
+        phi0 = a[1],
+        phi1 = b[1],
+        z;
+
+    if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
+
+    var delta = lambda1 - lambda0,
+        polar = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["abs"])(delta - _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"]) < _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"],
+        meridian = polar || delta < _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"];
+
+    if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
+
+    // Check that the first point is between a and b.
+    if (meridian
+        ? polar
+          ? phi0 + phi1 > 0 ^ q[1] < (Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["abs"])(q[0] - lambda0) < _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"] ? phi0 : phi1)
+          : phi0 <= q[1] && q[1] <= phi1
+        : delta > _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"] ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
+      var q1 = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianScale"])(u, (-w + t) / uu);
+      Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesianAddInPlace"])(q1, A);
+      return [q, Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["spherical"])(q1)];
+    }
+  }
+
+  // Generates a 4-bit vector representing the location of a point relative to
+  // the small circle's bounding box.
+  function code(lambda, phi) {
+    var r = smallRadius ? radius : _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"] - radius,
+        code = 0;
+    if (lambda < -r) code |= 1; // left
+    else if (lambda > r) code |= 2; // right
+    if (phi < -r) code |= 4; // below
+    else if (phi > r) code |= 8; // above
+    return code;
+  }
+
+  return Object(_index_js__WEBPACK_IMPORTED_MODULE_4__["default"])(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-_math_js__WEBPACK_IMPORTED_MODULE_2__["pi"], radius - _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"]]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/clip/extent.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-geo/src/clip/extent.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _rectangle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rectangle.js */ "./node_modules/d3-geo/src/clip/rectangle.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var x0 = 0,
+      y0 = 0,
+      x1 = 960,
+      y1 = 500,
+      cache,
+      cacheStream,
+      clip;
+
+  return clip = {
+    stream: function(stream) {
+      return cache && cacheStream === stream ? cache : cache = Object(_rectangle_js__WEBPACK_IMPORTED_MODULE_0__["default"])(x0, y0, x1, y1)(cacheStream = stream);
+    },
+    extent: function(_) {
+      return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
+    }
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/clip/index.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-geo/src/clip/index.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _buffer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./buffer.js */ "./node_modules/d3-geo/src/clip/buffer.js");
+/* harmony import */ var _rejoin_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rejoin.js */ "./node_modules/d3-geo/src/clip/rejoin.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _polygonContains_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../polygonContains.js */ "./node_modules/d3-geo/src/polygonContains.js");
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(pointVisible, clipLine, interpolate, start) {
+  return function(sink) {
+    var line = clipLine(sink),
+        ringBuffer = Object(_buffer_js__WEBPACK_IMPORTED_MODULE_0__["default"])(),
+        ringSink = clipLine(ringBuffer),
+        polygonStarted = false,
+        polygon,
+        segments,
+        ring;
+
+    var clip = {
+      point: point,
+      lineStart: lineStart,
+      lineEnd: lineEnd,
+      polygonStart: function() {
+        clip.point = pointRing;
+        clip.lineStart = ringStart;
+        clip.lineEnd = ringEnd;
+        segments = [];
+        polygon = [];
+      },
+      polygonEnd: function() {
+        clip.point = point;
+        clip.lineStart = lineStart;
+        clip.lineEnd = lineEnd;
+        segments = Object(d3_array__WEBPACK_IMPORTED_MODULE_4__["merge"])(segments);
+        var startInside = Object(_polygonContains_js__WEBPACK_IMPORTED_MODULE_3__["default"])(polygon, start);
+        if (segments.length) {
+          if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
+          Object(_rejoin_js__WEBPACK_IMPORTED_MODULE_1__["default"])(segments, compareIntersection, startInside, interpolate, sink);
+        } else if (startInside) {
+          if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
+          sink.lineStart();
+          interpolate(null, null, 1, sink);
+          sink.lineEnd();
+        }
+        if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
+        segments = polygon = null;
+      },
+      sphere: function() {
+        sink.polygonStart();
+        sink.lineStart();
+        interpolate(null, null, 1, sink);
+        sink.lineEnd();
+        sink.polygonEnd();
+      }
+    };
+
+    function point(lambda, phi) {
+      if (pointVisible(lambda, phi)) sink.point(lambda, phi);
+    }
+
+    function pointLine(lambda, phi) {
+      line.point(lambda, phi);
+    }
+
+    function lineStart() {
+      clip.point = pointLine;
+      line.lineStart();
+    }
+
+    function lineEnd() {
+      clip.point = point;
+      line.lineEnd();
+    }
+
+    function pointRing(lambda, phi) {
+      ring.push([lambda, phi]);
+      ringSink.point(lambda, phi);
+    }
+
+    function ringStart() {
+      ringSink.lineStart();
+      ring = [];
+    }
+
+    function ringEnd() {
+      pointRing(ring[0][0], ring[0][1]);
+      ringSink.lineEnd();
+
+      var clean = ringSink.clean(),
+          ringSegments = ringBuffer.result(),
+          i, n = ringSegments.length, m,
+          segment,
+          point;
+
+      ring.pop();
+      polygon.push(ring);
+      ring = null;
+
+      if (!n) return;
+
+      // No intersections.
+      if (clean & 1) {
+        segment = ringSegments[0];
+        if ((m = segment.length - 1) > 0) {
+          if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
+          sink.lineStart();
+          for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
+          sink.lineEnd();
+        }
+        return;
+      }
+
+      // Rejoin connected segments.
+      // TODO reuse ringBuffer.rejoin()?
+      if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
+
+      segments.push(ringSegments.filter(validSegment));
+    }
+
+    return clip;
+  };
+});
+
+function validSegment(segment) {
+  return segment.length > 1;
+}
+
+// Intersections are sorted along the clip edge. For both antimeridian cutting
+// and circle clipping, the same comparison is used.
+function compareIntersection(a, b) {
+  return ((a = a.x)[0] < 0 ? a[1] - _math_js__WEBPACK_IMPORTED_MODULE_2__["halfPi"] - _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"] : _math_js__WEBPACK_IMPORTED_MODULE_2__["halfPi"] - a[1])
+       - ((b = b.x)[0] < 0 ? b[1] - _math_js__WEBPACK_IMPORTED_MODULE_2__["halfPi"] - _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"] : _math_js__WEBPACK_IMPORTED_MODULE_2__["halfPi"] - b[1]);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/clip/line.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-geo/src/clip/line.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b, x0, y0, x1, y1) {
+  var ax = a[0],
+      ay = a[1],
+      bx = b[0],
+      by = b[1],
+      t0 = 0,
+      t1 = 1,
+      dx = bx - ax,
+      dy = by - ay,
+      r;
+
+  r = x0 - ax;
+  if (!dx && r > 0) return;
+  r /= dx;
+  if (dx < 0) {
+    if (r < t0) return;
+    if (r < t1) t1 = r;
+  } else if (dx > 0) {
+    if (r > t1) return;
+    if (r > t0) t0 = r;
+  }
+
+  r = x1 - ax;
+  if (!dx && r < 0) return;
+  r /= dx;
+  if (dx < 0) {
+    if (r > t1) return;
+    if (r > t0) t0 = r;
+  } else if (dx > 0) {
+    if (r < t0) return;
+    if (r < t1) t1 = r;
+  }
+
+  r = y0 - ay;
+  if (!dy && r > 0) return;
+  r /= dy;
+  if (dy < 0) {
+    if (r < t0) return;
+    if (r < t1) t1 = r;
+  } else if (dy > 0) {
+    if (r > t1) return;
+    if (r > t0) t0 = r;
+  }
+
+  r = y1 - ay;
+  if (!dy && r < 0) return;
+  r /= dy;
+  if (dy < 0) {
+    if (r > t1) return;
+    if (r > t0) t0 = r;
+  } else if (dy > 0) {
+    if (r < t0) return;
+    if (r < t1) t1 = r;
+  }
+
+  if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
+  if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
+  return true;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/clip/rectangle.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-geo/src/clip/rectangle.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return clipRectangle; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _buffer_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./buffer.js */ "./node_modules/d3-geo/src/clip/buffer.js");
+/* harmony import */ var _line_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./line.js */ "./node_modules/d3-geo/src/clip/line.js");
+/* harmony import */ var _rejoin_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./rejoin.js */ "./node_modules/d3-geo/src/clip/rejoin.js");
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+
+
+
+
+
+
+var clipMax = 1e9, clipMin = -clipMax;
+
+// TODO Use d3-polygon’s polygonContains here for the ring check?
+// TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
+
+function clipRectangle(x0, y0, x1, y1) {
+
+  function visible(x, y) {
+    return x0 <= x && x <= x1 && y0 <= y && y <= y1;
+  }
+
+  function interpolate(from, to, direction, stream) {
+    var a = 0, a1 = 0;
+    if (from == null
+        || (a = corner(from, direction)) !== (a1 = corner(to, direction))
+        || comparePoint(from, to) < 0 ^ direction > 0) {
+      do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
+      while ((a = (a + direction + 4) % 4) !== a1);
+    } else {
+      stream.point(to[0], to[1]);
+    }
+  }
+
+  function corner(p, direction) {
+    return Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(p[0] - x0) < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"] ? direction > 0 ? 0 : 3
+        : Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(p[0] - x1) < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"] ? direction > 0 ? 2 : 1
+        : Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(p[1] - y0) < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"] ? direction > 0 ? 1 : 0
+        : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
+  }
+
+  function compareIntersection(a, b) {
+    return comparePoint(a.x, b.x);
+  }
+
+  function comparePoint(a, b) {
+    var ca = corner(a, 1),
+        cb = corner(b, 1);
+    return ca !== cb ? ca - cb
+        : ca === 0 ? b[1] - a[1]
+        : ca === 1 ? a[0] - b[0]
+        : ca === 2 ? a[1] - b[1]
+        : b[0] - a[0];
+  }
+
+  return function(stream) {
+    var activeStream = stream,
+        bufferStream = Object(_buffer_js__WEBPACK_IMPORTED_MODULE_1__["default"])(),
+        segments,
+        polygon,
+        ring,
+        x__, y__, v__, // first point
+        x_, y_, v_, // previous point
+        first,
+        clean;
+
+    var clipStream = {
+      point: point,
+      lineStart: lineStart,
+      lineEnd: lineEnd,
+      polygonStart: polygonStart,
+      polygonEnd: polygonEnd
+    };
+
+    function point(x, y) {
+      if (visible(x, y)) activeStream.point(x, y);
+    }
+
+    function polygonInside() {
+      var winding = 0;
+
+      for (var i = 0, n = polygon.length; i < n; ++i) {
+        for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
+          a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
+          if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
+          else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
+        }
+      }
+
+      return winding;
+    }
+
+    // Buffer geometry within a polygon and then clip it en masse.
+    function polygonStart() {
+      activeStream = bufferStream, segments = [], polygon = [], clean = true;
+    }
+
+    function polygonEnd() {
+      var startInside = polygonInside(),
+          cleanInside = clean && startInside,
+          visible = (segments = Object(d3_array__WEBPACK_IMPORTED_MODULE_4__["merge"])(segments)).length;
+      if (cleanInside || visible) {
+        stream.polygonStart();
+        if (cleanInside) {
+          stream.lineStart();
+          interpolate(null, null, 1, stream);
+          stream.lineEnd();
+        }
+        if (visible) {
+          Object(_rejoin_js__WEBPACK_IMPORTED_MODULE_3__["default"])(segments, compareIntersection, startInside, interpolate, stream);
+        }
+        stream.polygonEnd();
+      }
+      activeStream = stream, segments = polygon = ring = null;
+    }
+
+    function lineStart() {
+      clipStream.point = linePoint;
+      if (polygon) polygon.push(ring = []);
+      first = true;
+      v_ = false;
+      x_ = y_ = NaN;
+    }
+
+    // TODO rather than special-case polygons, simply handle them separately.
+    // Ideally, coincident intersection points should be jittered to avoid
+    // clipping issues.
+    function lineEnd() {
+      if (segments) {
+        linePoint(x__, y__);
+        if (v__ && v_) bufferStream.rejoin();
+        segments.push(bufferStream.result());
+      }
+      clipStream.point = point;
+      if (v_) activeStream.lineEnd();
+    }
+
+    function linePoint(x, y) {
+      var v = visible(x, y);
+      if (polygon) ring.push([x, y]);
+      if (first) {
+        x__ = x, y__ = y, v__ = v;
+        first = false;
+        if (v) {
+          activeStream.lineStart();
+          activeStream.point(x, y);
+        }
+      } else {
+        if (v && v_) activeStream.point(x, y);
+        else {
+          var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
+              b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
+          if (Object(_line_js__WEBPACK_IMPORTED_MODULE_2__["default"])(a, b, x0, y0, x1, y1)) {
+            if (!v_) {
+              activeStream.lineStart();
+              activeStream.point(a[0], a[1]);
+            }
+            activeStream.point(b[0], b[1]);
+            if (!v) activeStream.lineEnd();
+            clean = false;
+          } else if (v) {
+            activeStream.lineStart();
+            activeStream.point(x, y);
+            clean = false;
+          }
+        }
+      }
+      x_ = x, y_ = y, v_ = v;
+    }
+
+    return clipStream;
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/clip/rejoin.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-geo/src/clip/rejoin.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _pointEqual_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../pointEqual.js */ "./node_modules/d3-geo/src/pointEqual.js");
+
+
+function Intersection(point, points, other, entry) {
+  this.x = point;
+  this.z = points;
+  this.o = other; // another intersection
+  this.e = entry; // is an entry?
+  this.v = false; // visited
+  this.n = this.p = null; // next & previous
+}
+
+// A generalized polygon clipping algorithm: given a polygon that has been cut
+// into its visible line segments, and rejoins the segments by interpolating
+// along the clip edge.
+/* harmony default export */ __webpack_exports__["default"] = (function(segments, compareIntersection, startInside, interpolate, stream) {
+  var subject = [],
+      clip = [],
+      i,
+      n;
+
+  segments.forEach(function(segment) {
+    if ((n = segment.length - 1) <= 0) return;
+    var n, p0 = segment[0], p1 = segment[n], x;
+
+    // If the first and last points of a segment are coincident, then treat as a
+    // closed ring. TODO if all rings are closed, then the winding order of the
+    // exterior ring should be checked.
+    if (Object(_pointEqual_js__WEBPACK_IMPORTED_MODULE_0__["default"])(p0, p1)) {
+      stream.lineStart();
+      for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
+      stream.lineEnd();
+      return;
+    }
+
+    subject.push(x = new Intersection(p0, segment, null, true));
+    clip.push(x.o = new Intersection(p0, null, x, false));
+    subject.push(x = new Intersection(p1, segment, null, false));
+    clip.push(x.o = new Intersection(p1, null, x, true));
+  });
+
+  if (!subject.length) return;
+
+  clip.sort(compareIntersection);
+  link(subject);
+  link(clip);
+
+  for (i = 0, n = clip.length; i < n; ++i) {
+    clip[i].e = startInside = !startInside;
+  }
+
+  var start = subject[0],
+      points,
+      point;
+
+  while (1) {
+    // Find first unvisited intersection.
+    var current = start,
+        isSubject = true;
+    while (current.v) if ((current = current.n) === start) return;
+    points = current.z;
+    stream.lineStart();
+    do {
+      current.v = current.o.v = true;
+      if (current.e) {
+        if (isSubject) {
+          for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
+        } else {
+          interpolate(current.x, current.n.x, 1, stream);
+        }
+        current = current.n;
+      } else {
+        if (isSubject) {
+          points = current.p.z;
+          for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
+        } else {
+          interpolate(current.x, current.p.x, -1, stream);
+        }
+        current = current.p;
+      }
+      current = current.o;
+      points = current.z;
+      isSubject = !isSubject;
+    } while (!current.v);
+    stream.lineEnd();
+  }
+});
+
+function link(array) {
+  if (!(n = array.length)) return;
+  var n,
+      i = 0,
+      a = array[0],
+      b;
+  while (++i < n) {
+    a.n = b = array[i];
+    b.p = a;
+    a = b;
+  }
+  a.n = b = array[0];
+  b.p = a;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/compose.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-geo/src/compose.js ***!
+  \********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+
+  function compose(x, y) {
+    return x = a(x, y), b(x[0], x[1]);
+  }
+
+  if (a.invert && b.invert) compose.invert = function(x, y) {
+    return x = b.invert(x, y), x && a.invert(x[0], x[1]);
+  };
+
+  return compose;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/constant.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-geo/src/constant.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/contains.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-geo/src/contains.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _polygonContains_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./polygonContains.js */ "./node_modules/d3-geo/src/polygonContains.js");
+/* harmony import */ var _distance_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./distance.js */ "./node_modules/d3-geo/src/distance.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+
+
+var containsObjectType = {
+  Feature: function(object, point) {
+    return containsGeometry(object.geometry, point);
+  },
+  FeatureCollection: function(object, point) {
+    var features = object.features, i = -1, n = features.length;
+    while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
+    return false;
+  }
+};
+
+var containsGeometryType = {
+  Sphere: function() {
+    return true;
+  },
+  Point: function(object, point) {
+    return containsPoint(object.coordinates, point);
+  },
+  MultiPoint: function(object, point) {
+    var coordinates = object.coordinates, i = -1, n = coordinates.length;
+    while (++i < n) if (containsPoint(coordinates[i], point)) return true;
+    return false;
+  },
+  LineString: function(object, point) {
+    return containsLine(object.coordinates, point);
+  },
+  MultiLineString: function(object, point) {
+    var coordinates = object.coordinates, i = -1, n = coordinates.length;
+    while (++i < n) if (containsLine(coordinates[i], point)) return true;
+    return false;
+  },
+  Polygon: function(object, point) {
+    return containsPolygon(object.coordinates, point);
+  },
+  MultiPolygon: function(object, point) {
+    var coordinates = object.coordinates, i = -1, n = coordinates.length;
+    while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
+    return false;
+  },
+  GeometryCollection: function(object, point) {
+    var geometries = object.geometries, i = -1, n = geometries.length;
+    while (++i < n) if (containsGeometry(geometries[i], point)) return true;
+    return false;
+  }
+};
+
+function containsGeometry(geometry, point) {
+  return geometry && containsGeometryType.hasOwnProperty(geometry.type)
+      ? containsGeometryType[geometry.type](geometry, point)
+      : false;
+}
+
+function containsPoint(coordinates, point) {
+  return Object(_distance_js__WEBPACK_IMPORTED_MODULE_1__["default"])(coordinates, point) === 0;
+}
+
+function containsLine(coordinates, point) {
+  var ao, bo, ab;
+  for (var i = 0, n = coordinates.length; i < n; i++) {
+    bo = Object(_distance_js__WEBPACK_IMPORTED_MODULE_1__["default"])(coordinates[i], point);
+    if (bo === 0) return true;
+    if (i > 0) {
+      ab = Object(_distance_js__WEBPACK_IMPORTED_MODULE_1__["default"])(coordinates[i], coordinates[i - 1]);
+      if (
+        ab > 0 &&
+        ao <= ab &&
+        bo <= ab &&
+        (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon2"] * ab
+      )
+        return true;
+    }
+    ao = bo;
+  }
+  return false;
+}
+
+function containsPolygon(coordinates, point) {
+  return !!Object(_polygonContains_js__WEBPACK_IMPORTED_MODULE_0__["default"])(coordinates.map(ringRadians), pointRadians(point));
+}
+
+function ringRadians(ring) {
+  return ring = ring.map(pointRadians), ring.pop(), ring;
+}
+
+function pointRadians(point) {
+  return [point[0] * _math_js__WEBPACK_IMPORTED_MODULE_2__["radians"], point[1] * _math_js__WEBPACK_IMPORTED_MODULE_2__["radians"]];
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(object, point) {
+  return (object && containsObjectType.hasOwnProperty(object.type)
+      ? containsObjectType[object.type]
+      : containsGeometry)(object, point);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/distance.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-geo/src/distance.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _length_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./length.js */ "./node_modules/d3-geo/src/length.js");
+
+
+var coordinates = [null, null],
+    object = {type: "LineString", coordinates: coordinates};
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  coordinates[0] = a;
+  coordinates[1] = b;
+  return Object(_length_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/graticule.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-geo/src/graticule.js ***!
+  \**********************************************/
+/*! exports provided: default, graticule10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return graticule; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "graticule10", function() { return graticule10; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+
+function graticuleX(y0, y1, dy) {
+  var y = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(y0, y1 - _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"], dy).concat(y1);
+  return function(x) { return y.map(function(y) { return [x, y]; }); };
+}
+
+function graticuleY(x0, x1, dx) {
+  var x = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(x0, x1 - _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"], dx).concat(x1);
+  return function(y) { return x.map(function(x) { return [x, y]; }); };
+}
+
+function graticule() {
+  var x1, x0, X1, X0,
+      y1, y0, Y1, Y0,
+      dx = 10, dy = dx, DX = 90, DY = 360,
+      x, y, X, Y,
+      precision = 2.5;
+
+  function graticule() {
+    return {type: "MultiLineString", coordinates: lines()};
+  }
+
+  function lines() {
+    return Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["ceil"])(X0 / DX) * DX, X1, DX).map(X)
+        .concat(Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["ceil"])(Y0 / DY) * DY, Y1, DY).map(Y))
+        .concat(Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["ceil"])(x0 / dx) * dx, x1, dx).filter(function(x) { return Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(x % DX) > _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]; }).map(x))
+        .concat(Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["ceil"])(y0 / dy) * dy, y1, dy).filter(function(y) { return Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(y % DY) > _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]; }).map(y));
+  }
+
+  graticule.lines = function() {
+    return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
+  };
+
+  graticule.outline = function() {
+    return {
+      type: "Polygon",
+      coordinates: [
+        X(X0).concat(
+        Y(Y1).slice(1),
+        X(X1).reverse().slice(1),
+        Y(Y0).reverse().slice(1))
+      ]
+    };
+  };
+
+  graticule.extent = function(_) {
+    if (!arguments.length) return graticule.extentMinor();
+    return graticule.extentMajor(_).extentMinor(_);
+  };
+
+  graticule.extentMajor = function(_) {
+    if (!arguments.length) return [[X0, Y0], [X1, Y1]];
+    X0 = +_[0][0], X1 = +_[1][0];
+    Y0 = +_[0][1], Y1 = +_[1][1];
+    if (X0 > X1) _ = X0, X0 = X1, X1 = _;
+    if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
+    return graticule.precision(precision);
+  };
+
+  graticule.extentMinor = function(_) {
+    if (!arguments.length) return [[x0, y0], [x1, y1]];
+    x0 = +_[0][0], x1 = +_[1][0];
+    y0 = +_[0][1], y1 = +_[1][1];
+    if (x0 > x1) _ = x0, x0 = x1, x1 = _;
+    if (y0 > y1) _ = y0, y0 = y1, y1 = _;
+    return graticule.precision(precision);
+  };
+
+  graticule.step = function(_) {
+    if (!arguments.length) return graticule.stepMinor();
+    return graticule.stepMajor(_).stepMinor(_);
+  };
+
+  graticule.stepMajor = function(_) {
+    if (!arguments.length) return [DX, DY];
+    DX = +_[0], DY = +_[1];
+    return graticule;
+  };
+
+  graticule.stepMinor = function(_) {
+    if (!arguments.length) return [dx, dy];
+    dx = +_[0], dy = +_[1];
+    return graticule;
+  };
+
+  graticule.precision = function(_) {
+    if (!arguments.length) return precision;
+    precision = +_;
+    x = graticuleX(y0, y1, 90);
+    y = graticuleY(x0, x1, precision);
+    X = graticuleX(Y0, Y1, 90);
+    Y = graticuleY(X0, X1, precision);
+    return graticule;
+  };
+
+  return graticule
+      .extentMajor([[-180, -90 + _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]], [180, 90 - _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]]])
+      .extentMinor([[-180, -80 - _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]], [180, 80 + _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"]]]);
+}
+
+function graticule10() {
+  return graticule()();
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/identity.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-geo/src/identity.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return x;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/index.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-geo/src/index.js ***!
+  \******************************************/
+/*! exports provided: geoArea, geoBounds, geoCentroid, geoCircle, geoClipAntimeridian, geoClipCircle, geoClipExtent, geoClipRectangle, geoContains, geoDistance, geoGraticule, geoGraticule10, geoInterpolate, geoLength, geoPath, geoAlbers, geoAlbersUsa, geoAzimuthalEqualArea, geoAzimuthalEqualAreaRaw, geoAzimuthalEquidistant, geoAzimuthalEquidistantRaw, geoConicConformal, geoConicConformalRaw, geoConicEqualArea, geoConicEqualAreaRaw, geoConicEquidistant, geoConicEquidistantRaw, geoEqualEarth, geoEqualEarthRaw, geoEquirectangular, geoEquirectangularRaw, geoGnomonic, geoGnomonicRaw, geoIdentity, geoProjection, geoProjectionMutator, geoMercator, geoMercatorRaw, geoNaturalEarth1, geoNaturalEarth1Raw, geoOrthographic, geoOrthographicRaw, geoStereographic, geoStereographicRaw, geoTransverseMercator, geoTransverseMercatorRaw, geoRotation, geoStream, geoTransform */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _area_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./area.js */ "./node_modules/d3-geo/src/area.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoArea", function() { return _area_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _bounds_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bounds.js */ "./node_modules/d3-geo/src/bounds.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoBounds", function() { return _bounds_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _centroid_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./centroid.js */ "./node_modules/d3-geo/src/centroid.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoCentroid", function() { return _centroid_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _circle_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./circle.js */ "./node_modules/d3-geo/src/circle.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoCircle", function() { return _circle_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _clip_antimeridian_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./clip/antimeridian.js */ "./node_modules/d3-geo/src/clip/antimeridian.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoClipAntimeridian", function() { return _clip_antimeridian_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _clip_circle_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./clip/circle.js */ "./node_modules/d3-geo/src/clip/circle.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoClipCircle", function() { return _clip_circle_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _clip_extent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./clip/extent.js */ "./node_modules/d3-geo/src/clip/extent.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoClipExtent", function() { return _clip_extent_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony import */ var _clip_rectangle_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./clip/rectangle.js */ "./node_modules/d3-geo/src/clip/rectangle.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoClipRectangle", function() { return _clip_rectangle_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+/* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contains.js */ "./node_modules/d3-geo/src/contains.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoContains", function() { return _contains_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony import */ var _distance_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./distance.js */ "./node_modules/d3-geo/src/distance.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoDistance", function() { return _distance_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
+
+/* harmony import */ var _graticule_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./graticule.js */ "./node_modules/d3-geo/src/graticule.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoGraticule", function() { return _graticule_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoGraticule10", function() { return _graticule_js__WEBPACK_IMPORTED_MODULE_10__["graticule10"]; });
+
+/* harmony import */ var _interpolate_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./interpolate.js */ "./node_modules/d3-geo/src/interpolate.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoInterpolate", function() { return _interpolate_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony import */ var _length_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./length.js */ "./node_modules/d3-geo/src/length.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoLength", function() { return _length_js__WEBPACK_IMPORTED_MODULE_12__["default"]; });
+
+/* harmony import */ var _path_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./path/index.js */ "./node_modules/d3-geo/src/path/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoPath", function() { return _path_index_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
+
+/* harmony import */ var _projection_albers_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./projection/albers.js */ "./node_modules/d3-geo/src/projection/albers.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAlbers", function() { return _projection_albers_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+/* harmony import */ var _projection_albersUsa_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./projection/albersUsa.js */ "./node_modules/d3-geo/src/projection/albersUsa.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAlbersUsa", function() { return _projection_albersUsa_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
+
+/* harmony import */ var _projection_azimuthalEqualArea_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./projection/azimuthalEqualArea.js */ "./node_modules/d3-geo/src/projection/azimuthalEqualArea.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAzimuthalEqualArea", function() { return _projection_azimuthalEqualArea_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAzimuthalEqualAreaRaw", function() { return _projection_azimuthalEqualArea_js__WEBPACK_IMPORTED_MODULE_16__["azimuthalEqualAreaRaw"]; });
+
+/* harmony import */ var _projection_azimuthalEquidistant_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./projection/azimuthalEquidistant.js */ "./node_modules/d3-geo/src/projection/azimuthalEquidistant.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAzimuthalEquidistant", function() { return _projection_azimuthalEquidistant_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAzimuthalEquidistantRaw", function() { return _projection_azimuthalEquidistant_js__WEBPACK_IMPORTED_MODULE_17__["azimuthalEquidistantRaw"]; });
+
+/* harmony import */ var _projection_conicConformal_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./projection/conicConformal.js */ "./node_modules/d3-geo/src/projection/conicConformal.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicConformal", function() { return _projection_conicConformal_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicConformalRaw", function() { return _projection_conicConformal_js__WEBPACK_IMPORTED_MODULE_18__["conicConformalRaw"]; });
+
+/* harmony import */ var _projection_conicEqualArea_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./projection/conicEqualArea.js */ "./node_modules/d3-geo/src/projection/conicEqualArea.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicEqualArea", function() { return _projection_conicEqualArea_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicEqualAreaRaw", function() { return _projection_conicEqualArea_js__WEBPACK_IMPORTED_MODULE_19__["conicEqualAreaRaw"]; });
+
+/* harmony import */ var _projection_conicEquidistant_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./projection/conicEquidistant.js */ "./node_modules/d3-geo/src/projection/conicEquidistant.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicEquidistant", function() { return _projection_conicEquidistant_js__WEBPACK_IMPORTED_MODULE_20__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicEquidistantRaw", function() { return _projection_conicEquidistant_js__WEBPACK_IMPORTED_MODULE_20__["conicEquidistantRaw"]; });
+
+/* harmony import */ var _projection_equalEarth_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./projection/equalEarth.js */ "./node_modules/d3-geo/src/projection/equalEarth.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoEqualEarth", function() { return _projection_equalEarth_js__WEBPACK_IMPORTED_MODULE_21__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoEqualEarthRaw", function() { return _projection_equalEarth_js__WEBPACK_IMPORTED_MODULE_21__["equalEarthRaw"]; });
+
+/* harmony import */ var _projection_equirectangular_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./projection/equirectangular.js */ "./node_modules/d3-geo/src/projection/equirectangular.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoEquirectangular", function() { return _projection_equirectangular_js__WEBPACK_IMPORTED_MODULE_22__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoEquirectangularRaw", function() { return _projection_equirectangular_js__WEBPACK_IMPORTED_MODULE_22__["equirectangularRaw"]; });
+
+/* harmony import */ var _projection_gnomonic_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./projection/gnomonic.js */ "./node_modules/d3-geo/src/projection/gnomonic.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoGnomonic", function() { return _projection_gnomonic_js__WEBPACK_IMPORTED_MODULE_23__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoGnomonicRaw", function() { return _projection_gnomonic_js__WEBPACK_IMPORTED_MODULE_23__["gnomonicRaw"]; });
+
+/* harmony import */ var _projection_identity_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./projection/identity.js */ "./node_modules/d3-geo/src/projection/identity.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoIdentity", function() { return _projection_identity_js__WEBPACK_IMPORTED_MODULE_24__["default"]; });
+
+/* harmony import */ var _projection_index_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./projection/index.js */ "./node_modules/d3-geo/src/projection/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoProjection", function() { return _projection_index_js__WEBPACK_IMPORTED_MODULE_25__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoProjectionMutator", function() { return _projection_index_js__WEBPACK_IMPORTED_MODULE_25__["projectionMutator"]; });
+
+/* harmony import */ var _projection_mercator_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./projection/mercator.js */ "./node_modules/d3-geo/src/projection/mercator.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoMercator", function() { return _projection_mercator_js__WEBPACK_IMPORTED_MODULE_26__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoMercatorRaw", function() { return _projection_mercator_js__WEBPACK_IMPORTED_MODULE_26__["mercatorRaw"]; });
+
+/* harmony import */ var _projection_naturalEarth1_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./projection/naturalEarth1.js */ "./node_modules/d3-geo/src/projection/naturalEarth1.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoNaturalEarth1", function() { return _projection_naturalEarth1_js__WEBPACK_IMPORTED_MODULE_27__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoNaturalEarth1Raw", function() { return _projection_naturalEarth1_js__WEBPACK_IMPORTED_MODULE_27__["naturalEarth1Raw"]; });
+
+/* harmony import */ var _projection_orthographic_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./projection/orthographic.js */ "./node_modules/d3-geo/src/projection/orthographic.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoOrthographic", function() { return _projection_orthographic_js__WEBPACK_IMPORTED_MODULE_28__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoOrthographicRaw", function() { return _projection_orthographic_js__WEBPACK_IMPORTED_MODULE_28__["orthographicRaw"]; });
+
+/* harmony import */ var _projection_stereographic_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./projection/stereographic.js */ "./node_modules/d3-geo/src/projection/stereographic.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoStereographic", function() { return _projection_stereographic_js__WEBPACK_IMPORTED_MODULE_29__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoStereographicRaw", function() { return _projection_stereographic_js__WEBPACK_IMPORTED_MODULE_29__["stereographicRaw"]; });
+
+/* harmony import */ var _projection_transverseMercator_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./projection/transverseMercator.js */ "./node_modules/d3-geo/src/projection/transverseMercator.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoTransverseMercator", function() { return _projection_transverseMercator_js__WEBPACK_IMPORTED_MODULE_30__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoTransverseMercatorRaw", function() { return _projection_transverseMercator_js__WEBPACK_IMPORTED_MODULE_30__["transverseMercatorRaw"]; });
+
+/* harmony import */ var _rotation_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./rotation.js */ "./node_modules/d3-geo/src/rotation.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoRotation", function() { return _rotation_js__WEBPACK_IMPORTED_MODULE_31__["default"]; });
+
+/* harmony import */ var _stream_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./stream.js */ "./node_modules/d3-geo/src/stream.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoStream", function() { return _stream_js__WEBPACK_IMPORTED_MODULE_32__["default"]; });
+
+/* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./transform.js */ "./node_modules/d3-geo/src/transform.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoTransform", function() { return _transform_js__WEBPACK_IMPORTED_MODULE_33__["default"]; });
+
+
+
+
+
+
+
+ // DEPRECATED! Use d3.geoIdentity().clipExtent(…).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/interpolate.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-geo/src/interpolate.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  var x0 = a[0] * _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"],
+      y0 = a[1] * _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"],
+      x1 = b[0] * _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"],
+      y1 = b[1] * _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"],
+      cy0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y0),
+      sy0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y0),
+      cy1 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y1),
+      sy1 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y1),
+      kx0 = cy0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(x0),
+      ky0 = cy0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(x0),
+      kx1 = cy1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(x1),
+      ky1 = cy1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(x1),
+      d = 2 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["asin"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["haversin"])(y1 - y0) + cy0 * cy1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["haversin"])(x1 - x0))),
+      k = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(d);
+
+  var interpolate = d ? function(t) {
+    var B = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(t *= d) / k,
+        A = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(d - t) / k,
+        x = A * kx0 + B * kx1,
+        y = A * ky0 + B * ky1,
+        z = A * sy0 + B * sy1;
+    return [
+      Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan2"])(y, x) * _math_js__WEBPACK_IMPORTED_MODULE_0__["degrees"],
+      Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan2"])(z, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(x * x + y * y)) * _math_js__WEBPACK_IMPORTED_MODULE_0__["degrees"]
+    ];
+  } : function() {
+    return [x0 * _math_js__WEBPACK_IMPORTED_MODULE_0__["degrees"], y0 * _math_js__WEBPACK_IMPORTED_MODULE_0__["degrees"]];
+  };
+
+  interpolate.distance = d;
+
+  return interpolate;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/length.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-geo/src/length.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _adder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./adder.js */ "./node_modules/d3-geo/src/adder.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./noop.js */ "./node_modules/d3-geo/src/noop.js");
+/* harmony import */ var _stream_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./stream.js */ "./node_modules/d3-geo/src/stream.js");
+
+
+
+
+
+var lengthSum = Object(_adder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(),
+    lambda0,
+    sinPhi0,
+    cosPhi0;
+
+var lengthStream = {
+  sphere: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  point: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  lineStart: lengthLineStart,
+  lineEnd: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  polygonStart: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  polygonEnd: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"]
+};
+
+function lengthLineStart() {
+  lengthStream.point = lengthPointFirst;
+  lengthStream.lineEnd = lengthLineEnd;
+}
+
+function lengthLineEnd() {
+  lengthStream.point = lengthStream.lineEnd = _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"];
+}
+
+function lengthPointFirst(lambda, phi) {
+  lambda *= _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"], phi *= _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"];
+  lambda0 = lambda, sinPhi0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(phi), cosPhi0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(phi);
+  lengthStream.point = lengthPoint;
+}
+
+function lengthPoint(lambda, phi) {
+  lambda *= _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"], phi *= _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"];
+  var sinPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(phi),
+      cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(phi),
+      delta = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(lambda - lambda0),
+      cosDelta = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(delta),
+      sinDelta = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(delta),
+      x = cosPhi * sinDelta,
+      y = cosPhi0 * sinPhi - sinPhi0 * cosPhi * cosDelta,
+      z = sinPhi0 * sinPhi + cosPhi0 * cosPhi * cosDelta;
+  lengthSum.add(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["atan2"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sqrt"])(x * x + y * y), z));
+  lambda0 = lambda, sinPhi0 = sinPhi, cosPhi0 = cosPhi;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(object) {
+  lengthSum.reset();
+  Object(_stream_js__WEBPACK_IMPORTED_MODULE_3__["default"])(object, lengthStream);
+  return +lengthSum;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/math.js":
+/*!*****************************************!*\
+  !*** ./node_modules/d3-geo/src/math.js ***!
+  \*****************************************/
+/*! exports provided: epsilon, epsilon2, pi, halfPi, quarterPi, tau, degrees, radians, abs, atan, atan2, cos, ceil, exp, floor, log, pow, sin, sign, sqrt, tan, acos, asin, haversin */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epsilon", function() { return epsilon; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epsilon2", function() { return epsilon2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pi", function() { return pi; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "halfPi", function() { return halfPi; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "quarterPi", function() { return quarterPi; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tau", function() { return tau; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "degrees", function() { return degrees; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "radians", function() { return radians; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "abs", function() { return abs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan", function() { return atan; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan2", function() { return atan2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cos", function() { return cos; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ceil", function() { return ceil; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exp", function() { return exp; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "floor", function() { return floor; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "log", function() { return log; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pow", function() { return pow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sin", function() { return sin; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sign", function() { return sign; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrt", function() { return sqrt; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tan", function() { return tan; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acos", function() { return acos; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asin", function() { return asin; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "haversin", function() { return haversin; });
+var epsilon = 1e-6;
+var epsilon2 = 1e-12;
+var pi = Math.PI;
+var halfPi = pi / 2;
+var quarterPi = pi / 4;
+var tau = pi * 2;
+
+var degrees = 180 / pi;
+var radians = pi / 180;
+
+var abs = Math.abs;
+var atan = Math.atan;
+var atan2 = Math.atan2;
+var cos = Math.cos;
+var ceil = Math.ceil;
+var exp = Math.exp;
+var floor = Math.floor;
+var log = Math.log;
+var pow = Math.pow;
+var sin = Math.sin;
+var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
+var sqrt = Math.sqrt;
+var tan = Math.tan;
+
+function acos(x) {
+  return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
+}
+
+function asin(x) {
+  return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x);
+}
+
+function haversin(x) {
+  return (x = sin(x / 2)) * x;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/noop.js":
+/*!*****************************************!*\
+  !*** ./node_modules/d3-geo/src/noop.js ***!
+  \*****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return noop; });
+function noop() {}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/path/area.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-geo/src/path/area.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _adder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../adder.js */ "./node_modules/d3-geo/src/adder.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../noop.js */ "./node_modules/d3-geo/src/noop.js");
+
+
+
+
+var areaSum = Object(_adder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(),
+    areaRingSum = Object(_adder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(),
+    x00,
+    y00,
+    x0,
+    y0;
+
+var areaStream = {
+  point: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  lineStart: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  lineEnd: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  polygonStart: function() {
+    areaStream.lineStart = areaRingStart;
+    areaStream.lineEnd = areaRingEnd;
+  },
+  polygonEnd: function() {
+    areaStream.lineStart = areaStream.lineEnd = areaStream.point = _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"];
+    areaSum.add(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(areaRingSum));
+    areaRingSum.reset();
+  },
+  result: function() {
+    var area = areaSum / 2;
+    areaSum.reset();
+    return area;
+  }
+};
+
+function areaRingStart() {
+  areaStream.point = areaPointFirst;
+}
+
+function areaPointFirst(x, y) {
+  areaStream.point = areaPoint;
+  x00 = x0 = x, y00 = y0 = y;
+}
+
+function areaPoint(x, y) {
+  areaRingSum.add(y0 * x - x0 * y);
+  x0 = x, y0 = y;
+}
+
+function areaRingEnd() {
+  areaPoint(x00, y00);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (areaStream);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/path/bounds.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-geo/src/path/bounds.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../noop.js */ "./node_modules/d3-geo/src/noop.js");
+
+
+var x0 = Infinity,
+    y0 = x0,
+    x1 = -x0,
+    y1 = x1;
+
+var boundsStream = {
+  point: boundsPoint,
+  lineStart: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  lineEnd: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  polygonStart: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  polygonEnd: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  result: function() {
+    var bounds = [[x0, y0], [x1, y1]];
+    x1 = y1 = -(y0 = x0 = Infinity);
+    return bounds;
+  }
+};
+
+function boundsPoint(x, y) {
+  if (x < x0) x0 = x;
+  if (x > x1) x1 = x;
+  if (y < y0) y0 = y;
+  if (y > y1) y1 = y;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (boundsStream);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/path/centroid.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-geo/src/path/centroid.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+// TODO Enforce positive area for exterior, negative area for interior?
+
+var X0 = 0,
+    Y0 = 0,
+    Z0 = 0,
+    X1 = 0,
+    Y1 = 0,
+    Z1 = 0,
+    X2 = 0,
+    Y2 = 0,
+    Z2 = 0,
+    x00,
+    y00,
+    x0,
+    y0;
+
+var centroidStream = {
+  point: centroidPoint,
+  lineStart: centroidLineStart,
+  lineEnd: centroidLineEnd,
+  polygonStart: function() {
+    centroidStream.lineStart = centroidRingStart;
+    centroidStream.lineEnd = centroidRingEnd;
+  },
+  polygonEnd: function() {
+    centroidStream.point = centroidPoint;
+    centroidStream.lineStart = centroidLineStart;
+    centroidStream.lineEnd = centroidLineEnd;
+  },
+  result: function() {
+    var centroid = Z2 ? [X2 / Z2, Y2 / Z2]
+        : Z1 ? [X1 / Z1, Y1 / Z1]
+        : Z0 ? [X0 / Z0, Y0 / Z0]
+        : [NaN, NaN];
+    X0 = Y0 = Z0 =
+    X1 = Y1 = Z1 =
+    X2 = Y2 = Z2 = 0;
+    return centroid;
+  }
+};
+
+function centroidPoint(x, y) {
+  X0 += x;
+  Y0 += y;
+  ++Z0;
+}
+
+function centroidLineStart() {
+  centroidStream.point = centroidPointFirstLine;
+}
+
+function centroidPointFirstLine(x, y) {
+  centroidStream.point = centroidPointLine;
+  centroidPoint(x0 = x, y0 = y);
+}
+
+function centroidPointLine(x, y) {
+  var dx = x - x0, dy = y - y0, z = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(dx * dx + dy * dy);
+  X1 += z * (x0 + x) / 2;
+  Y1 += z * (y0 + y) / 2;
+  Z1 += z;
+  centroidPoint(x0 = x, y0 = y);
+}
+
+function centroidLineEnd() {
+  centroidStream.point = centroidPoint;
+}
+
+function centroidRingStart() {
+  centroidStream.point = centroidPointFirstRing;
+}
+
+function centroidRingEnd() {
+  centroidPointRing(x00, y00);
+}
+
+function centroidPointFirstRing(x, y) {
+  centroidStream.point = centroidPointRing;
+  centroidPoint(x00 = x0 = x, y00 = y0 = y);
+}
+
+function centroidPointRing(x, y) {
+  var dx = x - x0,
+      dy = y - y0,
+      z = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(dx * dx + dy * dy);
+
+  X1 += z * (x0 + x) / 2;
+  Y1 += z * (y0 + y) / 2;
+  Z1 += z;
+
+  z = y0 * x - x0 * y;
+  X2 += z * (x0 + x);
+  Y2 += z * (y0 + y);
+  Z2 += z * 3;
+  centroidPoint(x0 = x, y0 = y);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (centroidStream);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/path/context.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-geo/src/path/context.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PathContext; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../noop.js */ "./node_modules/d3-geo/src/noop.js");
+
+
+
+function PathContext(context) {
+  this._context = context;
+}
+
+PathContext.prototype = {
+  _radius: 4.5,
+  pointRadius: function(_) {
+    return this._radius = _, this;
+  },
+  polygonStart: function() {
+    this._line = 0;
+  },
+  polygonEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._point = 0;
+  },
+  lineEnd: function() {
+    if (this._line === 0) this._context.closePath();
+    this._point = NaN;
+  },
+  point: function(x, y) {
+    switch (this._point) {
+      case 0: {
+        this._context.moveTo(x, y);
+        this._point = 1;
+        break;
+      }
+      case 1: {
+        this._context.lineTo(x, y);
+        break;
+      }
+      default: {
+        this._context.moveTo(x + this._radius, y);
+        this._context.arc(x, y, this._radius, 0, _math_js__WEBPACK_IMPORTED_MODULE_0__["tau"]);
+        break;
+      }
+    }
+  },
+  result: _noop_js__WEBPACK_IMPORTED_MODULE_1__["default"]
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/path/index.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-geo/src/path/index.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../identity.js */ "./node_modules/d3-geo/src/identity.js");
+/* harmony import */ var _stream_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stream.js */ "./node_modules/d3-geo/src/stream.js");
+/* harmony import */ var _area_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./area.js */ "./node_modules/d3-geo/src/path/area.js");
+/* harmony import */ var _bounds_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bounds.js */ "./node_modules/d3-geo/src/path/bounds.js");
+/* harmony import */ var _centroid_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./centroid.js */ "./node_modules/d3-geo/src/path/centroid.js");
+/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./context.js */ "./node_modules/d3-geo/src/path/context.js");
+/* harmony import */ var _measure_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./measure.js */ "./node_modules/d3-geo/src/path/measure.js");
+/* harmony import */ var _string_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./string.js */ "./node_modules/d3-geo/src/path/string.js");
+
+
+
+
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(projection, context) {
+  var pointRadius = 4.5,
+      projectionStream,
+      contextStream;
+
+  function path(object) {
+    if (object) {
+      if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
+      Object(_stream_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, projectionStream(contextStream));
+    }
+    return contextStream.result();
+  }
+
+  path.area = function(object) {
+    Object(_stream_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, projectionStream(_area_js__WEBPACK_IMPORTED_MODULE_2__["default"]));
+    return _area_js__WEBPACK_IMPORTED_MODULE_2__["default"].result();
+  };
+
+  path.measure = function(object) {
+    Object(_stream_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, projectionStream(_measure_js__WEBPACK_IMPORTED_MODULE_6__["default"]));
+    return _measure_js__WEBPACK_IMPORTED_MODULE_6__["default"].result();
+  };
+
+  path.bounds = function(object) {
+    Object(_stream_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, projectionStream(_bounds_js__WEBPACK_IMPORTED_MODULE_3__["default"]));
+    return _bounds_js__WEBPACK_IMPORTED_MODULE_3__["default"].result();
+  };
+
+  path.centroid = function(object) {
+    Object(_stream_js__WEBPACK_IMPORTED_MODULE_1__["default"])(object, projectionStream(_centroid_js__WEBPACK_IMPORTED_MODULE_4__["default"]));
+    return _centroid_js__WEBPACK_IMPORTED_MODULE_4__["default"].result();
+  };
+
+  path.projection = function(_) {
+    return arguments.length ? (projectionStream = _ == null ? (projection = null, _identity_js__WEBPACK_IMPORTED_MODULE_0__["default"]) : (projection = _).stream, path) : projection;
+  };
+
+  path.context = function(_) {
+    if (!arguments.length) return context;
+    contextStream = _ == null ? (context = null, new _string_js__WEBPACK_IMPORTED_MODULE_7__["default"]) : new _context_js__WEBPACK_IMPORTED_MODULE_5__["default"](context = _);
+    if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
+    return path;
+  };
+
+  path.pointRadius = function(_) {
+    if (!arguments.length) return pointRadius;
+    pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
+    return path;
+  };
+
+  return path.projection(projection).context(context);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/path/measure.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-geo/src/path/measure.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _adder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../adder.js */ "./node_modules/d3-geo/src/adder.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../noop.js */ "./node_modules/d3-geo/src/noop.js");
+
+
+
+
+var lengthSum = Object(_adder_js__WEBPACK_IMPORTED_MODULE_0__["default"])(),
+    lengthRing,
+    x00,
+    y00,
+    x0,
+    y0;
+
+var lengthStream = {
+  point: _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  lineStart: function() {
+    lengthStream.point = lengthPointFirst;
+  },
+  lineEnd: function() {
+    if (lengthRing) lengthPoint(x00, y00);
+    lengthStream.point = _noop_js__WEBPACK_IMPORTED_MODULE_2__["default"];
+  },
+  polygonStart: function() {
+    lengthRing = true;
+  },
+  polygonEnd: function() {
+    lengthRing = null;
+  },
+  result: function() {
+    var length = +lengthSum;
+    lengthSum.reset();
+    return length;
+  }
+};
+
+function lengthPointFirst(x, y) {
+  lengthStream.point = lengthPoint;
+  x00 = x0 = x, y00 = y0 = y;
+}
+
+function lengthPoint(x, y) {
+  x0 -= x, y0 -= y;
+  lengthSum.add(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sqrt"])(x0 * x0 + y0 * y0));
+  x0 = x, y0 = y;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (lengthStream);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/path/string.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-geo/src/path/string.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PathString; });
+function PathString() {
+  this._string = [];
+}
+
+PathString.prototype = {
+  _radius: 4.5,
+  _circle: circle(4.5),
+  pointRadius: function(_) {
+    if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
+    return this;
+  },
+  polygonStart: function() {
+    this._line = 0;
+  },
+  polygonEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._point = 0;
+  },
+  lineEnd: function() {
+    if (this._line === 0) this._string.push("Z");
+    this._point = NaN;
+  },
+  point: function(x, y) {
+    switch (this._point) {
+      case 0: {
+        this._string.push("M", x, ",", y);
+        this._point = 1;
+        break;
+      }
+      case 1: {
+        this._string.push("L", x, ",", y);
+        break;
+      }
+      default: {
+        if (this._circle == null) this._circle = circle(this._radius);
+        this._string.push("M", x, ",", y, this._circle);
+        break;
+      }
+    }
+  },
+  result: function() {
+    if (this._string.length) {
+      var result = this._string.join("");
+      this._string = [];
+      return result;
+    } else {
+      return null;
+    }
+  }
+};
+
+function circle(radius) {
+  return "m0," + radius
+      + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
+      + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
+      + "z";
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/pointEqual.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-geo/src/pointEqual.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  return Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(a[0] - b[0]) < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"] && Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(a[1] - b[1]) < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/polygonContains.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-geo/src/polygonContains.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _adder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./adder.js */ "./node_modules/d3-geo/src/adder.js");
+/* harmony import */ var _cartesian_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cartesian.js */ "./node_modules/d3-geo/src/cartesian.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+
+
+var sum = Object(_adder_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
+
+function longitude(point) {
+  if (Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["abs"])(point[0]) <= _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"])
+    return point[0];
+  else
+    return Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sign"])(point[0]) * ((Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["abs"])(point[0]) + _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"]) % _math_js__WEBPACK_IMPORTED_MODULE_2__["tau"] - _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"]);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(polygon, point) {
+  var lambda = longitude(point),
+      phi = point[1],
+      sinPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(phi),
+      normal = [Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(lambda), -Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(lambda), 0],
+      angle = 0,
+      winding = 0;
+
+  sum.reset();
+
+  if (sinPhi === 1) phi = _math_js__WEBPACK_IMPORTED_MODULE_2__["halfPi"] + _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"];
+  else if (sinPhi === -1) phi = -_math_js__WEBPACK_IMPORTED_MODULE_2__["halfPi"] - _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"];
+
+  for (var i = 0, n = polygon.length; i < n; ++i) {
+    if (!(m = (ring = polygon[i]).length)) continue;
+    var ring,
+        m,
+        point0 = ring[m - 1],
+        lambda0 = longitude(point0),
+        phi0 = point0[1] / 2 + _math_js__WEBPACK_IMPORTED_MODULE_2__["quarterPi"],
+        sinPhi0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(phi0),
+        cosPhi0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(phi0);
+
+    for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
+      var point1 = ring[j],
+          lambda1 = longitude(point1),
+          phi1 = point1[1] / 2 + _math_js__WEBPACK_IMPORTED_MODULE_2__["quarterPi"],
+          sinPhi1 = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(phi1),
+          cosPhi1 = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(phi1),
+          delta = lambda1 - lambda0,
+          sign = delta >= 0 ? 1 : -1,
+          absDelta = sign * delta,
+          antimeridian = absDelta > _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"],
+          k = sinPhi0 * sinPhi1;
+
+      sum.add(Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(k * sign * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(absDelta), cosPhi0 * cosPhi1 + k * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(absDelta)));
+      angle += antimeridian ? delta + sign * _math_js__WEBPACK_IMPORTED_MODULE_2__["tau"] : delta;
+
+      // Are the longitudes either side of the point’s meridian (lambda),
+      // and are the latitudes smaller than the parallel (phi)?
+      if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
+        var arc = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_1__["cartesianCross"])(Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_1__["cartesian"])(point0), Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_1__["cartesian"])(point1));
+        Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_1__["cartesianNormalizeInPlace"])(arc);
+        var intersection = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_1__["cartesianCross"])(normal, arc);
+        Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_1__["cartesianNormalizeInPlace"])(intersection);
+        var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["asin"])(intersection[2]);
+        if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
+          winding += antimeridian ^ delta >= 0 ? 1 : -1;
+        }
+      }
+    }
+  }
+
+  // First, determine whether the South pole is inside or outside:
+  //
+  // It is inside if:
+  // * the polygon winds around it in a clockwise direction.
+  // * the polygon does not (cumulatively) wind around it, but has a negative
+  //   (counter-clockwise) area.
+  //
+  // Second, count the (signed) number of times a segment crosses a lambda
+  // from the point to the South pole.  If it is zero, then the point is the
+  // same side as the South pole.
+
+  return (angle < -_math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"] || angle < _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"] && sum < -_math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) ^ (winding & 1);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/albers.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/albers.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _conicEqualArea_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./conicEqualArea.js */ "./node_modules/d3-geo/src/projection/conicEqualArea.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_conicEqualArea_js__WEBPACK_IMPORTED_MODULE_0__["default"])()
+      .parallels([29.5, 45.5])
+      .scale(1070)
+      .translate([480, 250])
+      .rotate([96, 0])
+      .center([-0.6, 38.7]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/albersUsa.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/albersUsa.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _albers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./albers.js */ "./node_modules/d3-geo/src/projection/albers.js");
+/* harmony import */ var _conicEqualArea_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./conicEqualArea.js */ "./node_modules/d3-geo/src/projection/conicEqualArea.js");
+/* harmony import */ var _fit_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fit.js */ "./node_modules/d3-geo/src/projection/fit.js");
+
+
+
+
+
+// The projections must have mutually exclusive clip regions on the sphere,
+// as this will avoid emitting interleaving lines and polygons.
+function multiplex(streams) {
+  var n = streams.length;
+  return {
+    point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
+    sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
+    lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
+    lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
+    polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
+    polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
+  };
+}
+
+// A composite projection for the United States, configured by default for
+// 960×500. The projection also works quite well at 960×600 if you change the
+// scale to 1285 and adjust the translate accordingly. The set of standard
+// parallels for each region comes from USGS, which is published here:
+// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var cache,
+      cacheStream,
+      lower48 = Object(_albers_js__WEBPACK_IMPORTED_MODULE_1__["default"])(), lower48Point,
+      alaska = Object(_conicEqualArea_js__WEBPACK_IMPORTED_MODULE_2__["default"])().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
+      hawaii = Object(_conicEqualArea_js__WEBPACK_IMPORTED_MODULE_2__["default"])().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
+      point, pointStream = {point: function(x, y) { point = [x, y]; }};
+
+  function albersUsa(coordinates) {
+    var x = coordinates[0], y = coordinates[1];
+    return point = null,
+        (lower48Point.point(x, y), point)
+        || (alaskaPoint.point(x, y), point)
+        || (hawaiiPoint.point(x, y), point);
+  }
+
+  albersUsa.invert = function(coordinates) {
+    var k = lower48.scale(),
+        t = lower48.translate(),
+        x = (coordinates[0] - t[0]) / k,
+        y = (coordinates[1] - t[1]) / k;
+    return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
+        : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
+        : lower48).invert(coordinates);
+  };
+
+  albersUsa.stream = function(stream) {
+    return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
+  };
+
+  albersUsa.precision = function(_) {
+    if (!arguments.length) return lower48.precision();
+    lower48.precision(_), alaska.precision(_), hawaii.precision(_);
+    return reset();
+  };
+
+  albersUsa.scale = function(_) {
+    if (!arguments.length) return lower48.scale();
+    lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
+    return albersUsa.translate(lower48.translate());
+  };
+
+  albersUsa.translate = function(_) {
+    if (!arguments.length) return lower48.translate();
+    var k = lower48.scale(), x = +_[0], y = +_[1];
+
+    lower48Point = lower48
+        .translate(_)
+        .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
+        .stream(pointStream);
+
+    alaskaPoint = alaska
+        .translate([x - 0.307 * k, y + 0.201 * k])
+        .clipExtent([[x - 0.425 * k + _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"], y + 0.120 * k + _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]], [x - 0.214 * k - _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"], y + 0.234 * k - _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]]])
+        .stream(pointStream);
+
+    hawaiiPoint = hawaii
+        .translate([x - 0.205 * k, y + 0.212 * k])
+        .clipExtent([[x - 0.214 * k + _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"], y + 0.166 * k + _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]], [x - 0.115 * k - _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"], y + 0.234 * k - _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]]])
+        .stream(pointStream);
+
+    return reset();
+  };
+
+  albersUsa.fitExtent = function(extent, object) {
+    return Object(_fit_js__WEBPACK_IMPORTED_MODULE_3__["fitExtent"])(albersUsa, extent, object);
+  };
+
+  albersUsa.fitSize = function(size, object) {
+    return Object(_fit_js__WEBPACK_IMPORTED_MODULE_3__["fitSize"])(albersUsa, size, object);
+  };
+
+  albersUsa.fitWidth = function(width, object) {
+    return Object(_fit_js__WEBPACK_IMPORTED_MODULE_3__["fitWidth"])(albersUsa, width, object);
+  };
+
+  albersUsa.fitHeight = function(height, object) {
+    return Object(_fit_js__WEBPACK_IMPORTED_MODULE_3__["fitHeight"])(albersUsa, height, object);
+  };
+
+  function reset() {
+    cache = cacheStream = null;
+    return albersUsa;
+  }
+
+  return albersUsa.scale(1070);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/azimuthal.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/azimuthal.js ***!
+  \*********************************************************/
+/*! exports provided: azimuthalRaw, azimuthalInvert */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "azimuthalRaw", function() { return azimuthalRaw; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "azimuthalInvert", function() { return azimuthalInvert; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+function azimuthalRaw(scale) {
+  return function(x, y) {
+    var cx = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(x),
+        cy = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y),
+        k = scale(cx * cy);
+    return [
+      k * cy * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(x),
+      k * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y)
+    ];
+  }
+}
+
+function azimuthalInvert(angle) {
+  return function(x, y) {
+    var z = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(x * x + y * y),
+        c = angle(z),
+        sc = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(c),
+        cc = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(c);
+    return [
+      Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan2"])(x * sc, z * cc),
+      Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["asin"])(z && y * sc / z)
+    ];
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/azimuthalEqualArea.js":
+/*!******************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/azimuthalEqualArea.js ***!
+  \******************************************************************/
+/*! exports provided: azimuthalEqualAreaRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "azimuthalEqualAreaRaw", function() { return azimuthalEqualAreaRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _azimuthal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./azimuthal.js */ "./node_modules/d3-geo/src/projection/azimuthal.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+
+
+
+
+var azimuthalEqualAreaRaw = Object(_azimuthal_js__WEBPACK_IMPORTED_MODULE_1__["azimuthalRaw"])(function(cxcy) {
+  return Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(2 / (1 + cxcy));
+});
+
+azimuthalEqualAreaRaw.invert = Object(_azimuthal_js__WEBPACK_IMPORTED_MODULE_1__["azimuthalInvert"])(function(z) {
+  return 2 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["asin"])(z / 2);
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_index_js__WEBPACK_IMPORTED_MODULE_2__["default"])(azimuthalEqualAreaRaw)
+      .scale(124.75)
+      .clipAngle(180 - 1e-3);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/azimuthalEquidistant.js":
+/*!********************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/azimuthalEquidistant.js ***!
+  \********************************************************************/
+/*! exports provided: azimuthalEquidistantRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "azimuthalEquidistantRaw", function() { return azimuthalEquidistantRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _azimuthal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./azimuthal.js */ "./node_modules/d3-geo/src/projection/azimuthal.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+
+
+
+
+var azimuthalEquidistantRaw = Object(_azimuthal_js__WEBPACK_IMPORTED_MODULE_1__["azimuthalRaw"])(function(c) {
+  return (c = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["acos"])(c)) && c / Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(c);
+});
+
+azimuthalEquidistantRaw.invert = Object(_azimuthal_js__WEBPACK_IMPORTED_MODULE_1__["azimuthalInvert"])(function(z) {
+  return z;
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_index_js__WEBPACK_IMPORTED_MODULE_2__["default"])(azimuthalEquidistantRaw)
+      .scale(79.4188)
+      .clipAngle(180 - 1e-3);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/conic.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/conic.js ***!
+  \*****************************************************/
+/*! exports provided: conicProjection */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conicProjection", function() { return conicProjection; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+
+
+
+function conicProjection(projectAt) {
+  var phi0 = 0,
+      phi1 = _math_js__WEBPACK_IMPORTED_MODULE_0__["pi"] / 3,
+      m = Object(_index_js__WEBPACK_IMPORTED_MODULE_1__["projectionMutator"])(projectAt),
+      p = m(phi0, phi1);
+
+  p.parallels = function(_) {
+    return arguments.length ? m(phi0 = _[0] * _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"], phi1 = _[1] * _math_js__WEBPACK_IMPORTED_MODULE_0__["radians"]) : [phi0 * _math_js__WEBPACK_IMPORTED_MODULE_0__["degrees"], phi1 * _math_js__WEBPACK_IMPORTED_MODULE_0__["degrees"]];
+  };
+
+  return p;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/conicConformal.js":
+/*!**************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/conicConformal.js ***!
+  \**************************************************************/
+/*! exports provided: conicConformalRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conicConformalRaw", function() { return conicConformalRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _conic_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./conic.js */ "./node_modules/d3-geo/src/projection/conic.js");
+/* harmony import */ var _mercator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mercator.js */ "./node_modules/d3-geo/src/projection/mercator.js");
+
+
+
+
+function tany(y) {
+  return Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["tan"])((_math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"] + y) / 2);
+}
+
+function conicConformalRaw(y0, y1) {
+  var cy0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y0),
+      n = y0 === y1 ? Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y0) : Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["log"])(cy0 / Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y1)) / Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["log"])(tany(y1) / tany(y0)),
+      f = cy0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["pow"])(tany(y0), n) / n;
+
+  if (!n) return _mercator_js__WEBPACK_IMPORTED_MODULE_2__["mercatorRaw"];
+
+  function project(x, y) {
+    if (f > 0) { if (y < -_math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"] + _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]) y = -_math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"] + _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]; }
+    else { if (y > _math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"] - _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]) y = _math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"] - _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]; }
+    var r = f / Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["pow"])(tany(y), n);
+    return [r * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(n * x), f - r * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(n * x)];
+  }
+
+  project.invert = function(x, y) {
+    var fy = f - y, r = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sign"])(n) * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(x * x + fy * fy);
+    return [Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan2"])(x, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(fy)) / n * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sign"])(fy), 2 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["pow"])(f / r, 1 / n)) - _math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"]];
+  };
+
+  return project;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_conic_js__WEBPACK_IMPORTED_MODULE_1__["conicProjection"])(conicConformalRaw)
+      .scale(109.5)
+      .parallels([30, 30]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/conicEqualArea.js":
+/*!**************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/conicEqualArea.js ***!
+  \**************************************************************/
+/*! exports provided: conicEqualAreaRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conicEqualAreaRaw", function() { return conicEqualAreaRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _conic_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./conic.js */ "./node_modules/d3-geo/src/projection/conic.js");
+/* harmony import */ var _cylindricalEqualArea_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cylindricalEqualArea.js */ "./node_modules/d3-geo/src/projection/cylindricalEqualArea.js");
+
+
+
+
+function conicEqualAreaRaw(y0, y1) {
+  var sy0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y0), n = (sy0 + Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y1)) / 2;
+
+  // Are the parallels symmetrical around the Equator?
+  if (Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(n) < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]) return Object(_cylindricalEqualArea_js__WEBPACK_IMPORTED_MODULE_2__["cylindricalEqualAreaRaw"])(y0);
+
+  var c = 1 + sy0 * (2 * n - sy0), r0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(c) / n;
+
+  function project(x, y) {
+    var r = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(c - 2 * n * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y)) / n;
+    return [r * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(x *= n), r0 - r * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(x)];
+  }
+
+  project.invert = function(x, y) {
+    var r0y = r0 - y;
+    return [Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan2"])(x, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(r0y)) / n * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sign"])(r0y), Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["asin"])((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
+  };
+
+  return project;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_conic_js__WEBPACK_IMPORTED_MODULE_1__["conicProjection"])(conicEqualAreaRaw)
+      .scale(155.424)
+      .center([0, 33.6442]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/conicEquidistant.js":
+/*!****************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/conicEquidistant.js ***!
+  \****************************************************************/
+/*! exports provided: conicEquidistantRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "conicEquidistantRaw", function() { return conicEquidistantRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _conic_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./conic.js */ "./node_modules/d3-geo/src/projection/conic.js");
+/* harmony import */ var _equirectangular_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./equirectangular.js */ "./node_modules/d3-geo/src/projection/equirectangular.js");
+
+
+
+
+function conicEquidistantRaw(y0, y1) {
+  var cy0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y0),
+      n = y0 === y1 ? Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y0) : (cy0 - Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y1)) / (y1 - y0),
+      g = cy0 / n + y0;
+
+  if (Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(n) < _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]) return _equirectangular_js__WEBPACK_IMPORTED_MODULE_2__["equirectangularRaw"];
+
+  function project(x, y) {
+    var gy = g - y, nx = n * x;
+    return [gy * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(nx), g - gy * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(nx)];
+  }
+
+  project.invert = function(x, y) {
+    var gy = g - y;
+    return [Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan2"])(x, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["abs"])(gy)) / n * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sign"])(gy), g - Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sign"])(n) * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sqrt"])(x * x + gy * gy)];
+  };
+
+  return project;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_conic_js__WEBPACK_IMPORTED_MODULE_1__["conicProjection"])(conicEquidistantRaw)
+      .scale(131.154)
+      .center([0, 13.9389]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/cylindricalEqualArea.js":
+/*!********************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/cylindricalEqualArea.js ***!
+  \********************************************************************/
+/*! exports provided: cylindricalEqualAreaRaw */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cylindricalEqualAreaRaw", function() { return cylindricalEqualAreaRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+function cylindricalEqualAreaRaw(phi0) {
+  var cosPhi0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(phi0);
+
+  function forward(lambda, phi) {
+    return [lambda * cosPhi0, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(phi) / cosPhi0];
+  }
+
+  forward.invert = function(x, y) {
+    return [x / cosPhi0, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["asin"])(y * cosPhi0)];
+  };
+
+  return forward;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/equalEarth.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/equalEarth.js ***!
+  \**********************************************************/
+/*! exports provided: equalEarthRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "equalEarthRaw", function() { return equalEarthRaw; });
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+
+var A1 = 1.340264,
+    A2 = -0.081106,
+    A3 = 0.000893,
+    A4 = 0.003796,
+    M = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sqrt"])(3) / 2,
+    iterations = 12;
+
+function equalEarthRaw(lambda, phi) {
+  var l = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["asin"])(M * Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(phi)), l2 = l * l, l6 = l2 * l2 * l2;
+  return [
+    lambda * Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),
+    l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))
+  ];
+}
+
+equalEarthRaw.invert = function(x, y) {
+  var l = y, l2 = l * l, l6 = l2 * l2 * l2;
+  for (var i = 0, delta, fy, fpy; i < iterations; ++i) {
+    fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;
+    fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);
+    l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;
+    if (Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(delta) < _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon2"]) break;
+  }
+  return [
+    M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(l),
+    Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["asin"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(l) / M)
+  ];
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_index_js__WEBPACK_IMPORTED_MODULE_0__["default"])(equalEarthRaw)
+      .scale(177.158);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/equirectangular.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/equirectangular.js ***!
+  \***************************************************************/
+/*! exports provided: equirectangularRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "equirectangularRaw", function() { return equirectangularRaw; });
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+
+
+function equirectangularRaw(lambda, phi) {
+  return [lambda, phi];
+}
+
+equirectangularRaw.invert = equirectangularRaw;
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_index_js__WEBPACK_IMPORTED_MODULE_0__["default"])(equirectangularRaw)
+      .scale(152.63);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/fit.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/fit.js ***!
+  \***************************************************/
+/*! exports provided: fitExtent, fitSize, fitWidth, fitHeight */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fitExtent", function() { return fitExtent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fitSize", function() { return fitSize; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fitWidth", function() { return fitWidth; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fitHeight", function() { return fitHeight; });
+/* harmony import */ var _stream_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../stream.js */ "./node_modules/d3-geo/src/stream.js");
+/* harmony import */ var _path_bounds_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../path/bounds.js */ "./node_modules/d3-geo/src/path/bounds.js");
+
+
+
+function fit(projection, fitBounds, object) {
+  var clip = projection.clipExtent && projection.clipExtent();
+  projection.scale(150).translate([0, 0]);
+  if (clip != null) projection.clipExtent(null);
+  Object(_stream_js__WEBPACK_IMPORTED_MODULE_0__["default"])(object, projection.stream(_path_bounds_js__WEBPACK_IMPORTED_MODULE_1__["default"]));
+  fitBounds(_path_bounds_js__WEBPACK_IMPORTED_MODULE_1__["default"].result());
+  if (clip != null) projection.clipExtent(clip);
+  return projection;
+}
+
+function fitExtent(projection, extent, object) {
+  return fit(projection, function(b) {
+    var w = extent[1][0] - extent[0][0],
+        h = extent[1][1] - extent[0][1],
+        k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
+        x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
+        y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
+    projection.scale(150 * k).translate([x, y]);
+  }, object);
+}
+
+function fitSize(projection, size, object) {
+  return fitExtent(projection, [[0, 0], size], object);
+}
+
+function fitWidth(projection, width, object) {
+  return fit(projection, function(b) {
+    var w = +width,
+        k = w / (b[1][0] - b[0][0]),
+        x = (w - k * (b[1][0] + b[0][0])) / 2,
+        y = -k * b[0][1];
+    projection.scale(150 * k).translate([x, y]);
+  }, object);
+}
+
+function fitHeight(projection, height, object) {
+  return fit(projection, function(b) {
+    var h = +height,
+        k = h / (b[1][1] - b[0][1]),
+        x = -k * b[0][0],
+        y = (h - k * (b[1][1] + b[0][1])) / 2;
+    projection.scale(150 * k).translate([x, y]);
+  }, object);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/gnomonic.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/gnomonic.js ***!
+  \********************************************************/
+/*! exports provided: gnomonicRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gnomonicRaw", function() { return gnomonicRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _azimuthal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./azimuthal.js */ "./node_modules/d3-geo/src/projection/azimuthal.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+
+
+
+
+function gnomonicRaw(x, y) {
+  var cy = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y), k = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(x) * cy;
+  return [cy * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(x) / k, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y) / k];
+}
+
+gnomonicRaw.invert = Object(_azimuthal_js__WEBPACK_IMPORTED_MODULE_1__["azimuthalInvert"])(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_index_js__WEBPACK_IMPORTED_MODULE_2__["default"])(gnomonicRaw)
+      .scale(144.049)
+      .clipAngle(60);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/identity.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/identity.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _clip_rectangle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../clip/rectangle.js */ "./node_modules/d3-geo/src/clip/rectangle.js");
+/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../identity.js */ "./node_modules/d3-geo/src/identity.js");
+/* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../transform.js */ "./node_modules/d3-geo/src/transform.js");
+/* harmony import */ var _fit_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fit.js */ "./node_modules/d3-geo/src/projection/fit.js");
+
+
+
+
+
+function scaleTranslate(kx, ky, tx, ty) {
+  return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? _identity_js__WEBPACK_IMPORTED_MODULE_1__["default"] : Object(_transform_js__WEBPACK_IMPORTED_MODULE_2__["transformer"])({
+    point: function(x, y) {
+      this.stream.point(x * kx + tx, y * ky + ty);
+    }
+  });
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = _identity_js__WEBPACK_IMPORTED_MODULE_1__["default"], // scale, translate and reflect
+      x0 = null, y0, x1, y1, // clip extent
+      postclip = _identity_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+      cache,
+      cacheStream,
+      projection;
+
+  function reset() {
+    cache = cacheStream = null;
+    return projection;
+  }
+
+  return projection = {
+    stream: function(stream) {
+      return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
+    },
+    postclip: function(_) {
+      return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
+    },
+    clipExtent: function(_) {
+      return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, _identity_js__WEBPACK_IMPORTED_MODULE_1__["default"]) : Object(_clip_rectangle_js__WEBPACK_IMPORTED_MODULE_0__["default"])(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
+    },
+    scale: function(_) {
+      return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
+    },
+    translate: function(_) {
+      return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
+    },
+    reflectX: function(_) {
+      return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
+    },
+    reflectY: function(_) {
+      return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
+    },
+    fitExtent: function(extent, object) {
+      return Object(_fit_js__WEBPACK_IMPORTED_MODULE_3__["fitExtent"])(projection, extent, object);
+    },
+    fitSize: function(size, object) {
+      return Object(_fit_js__WEBPACK_IMPORTED_MODULE_3__["fitSize"])(projection, size, object);
+    },
+    fitWidth: function(width, object) {
+      return Object(_fit_js__WEBPACK_IMPORTED_MODULE_3__["fitWidth"])(projection, width, object);
+    },
+    fitHeight: function(height, object) {
+      return Object(_fit_js__WEBPACK_IMPORTED_MODULE_3__["fitHeight"])(projection, height, object);
+    }
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/index.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/index.js ***!
+  \*****************************************************/
+/*! exports provided: default, projectionMutator */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return projection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "projectionMutator", function() { return projectionMutator; });
+/* harmony import */ var _clip_antimeridian_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../clip/antimeridian.js */ "./node_modules/d3-geo/src/clip/antimeridian.js");
+/* harmony import */ var _clip_circle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../clip/circle.js */ "./node_modules/d3-geo/src/clip/circle.js");
+/* harmony import */ var _clip_rectangle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../clip/rectangle.js */ "./node_modules/d3-geo/src/clip/rectangle.js");
+/* harmony import */ var _compose_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../compose.js */ "./node_modules/d3-geo/src/compose.js");
+/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../identity.js */ "./node_modules/d3-geo/src/identity.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _rotation_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../rotation.js */ "./node_modules/d3-geo/src/rotation.js");
+/* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../transform.js */ "./node_modules/d3-geo/src/transform.js");
+/* harmony import */ var _fit_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./fit.js */ "./node_modules/d3-geo/src/projection/fit.js");
+/* harmony import */ var _resample_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./resample.js */ "./node_modules/d3-geo/src/projection/resample.js");
+
+
+
+
+
+
+
+
+
+
+
+var transformRadians = Object(_transform_js__WEBPACK_IMPORTED_MODULE_7__["transformer"])({
+  point: function(x, y) {
+    this.stream.point(x * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"], y * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"]);
+  }
+});
+
+function transformRotate(rotate) {
+  return Object(_transform_js__WEBPACK_IMPORTED_MODULE_7__["transformer"])({
+    point: function(x, y) {
+      var r = rotate(x, y);
+      return this.stream.point(r[0], r[1]);
+    }
+  });
+}
+
+function scaleTranslate(k, dx, dy) {
+  function transform(x, y) {
+    return [dx + k * x, dy - k * y];
+  }
+  transform.invert = function(x, y) {
+    return [(x - dx) / k, (dy - y) / k];
+  };
+  return transform;
+}
+
+function scaleTranslateRotate(k, dx, dy, alpha) {
+  var cosAlpha = Object(_math_js__WEBPACK_IMPORTED_MODULE_5__["cos"])(alpha),
+      sinAlpha = Object(_math_js__WEBPACK_IMPORTED_MODULE_5__["sin"])(alpha),
+      a = cosAlpha * k,
+      b = sinAlpha * k,
+      ai = cosAlpha / k,
+      bi = sinAlpha / k,
+      ci = (sinAlpha * dy - cosAlpha * dx) / k,
+      fi = (sinAlpha * dx + cosAlpha * dy) / k;
+  function transform(x, y) {
+    return [a * x - b * y + dx, dy - b * x - a * y];
+  }
+  transform.invert = function(x, y) {
+    return [ai * x - bi * y + ci, fi - bi * x - ai * y];
+  };
+  return transform;
+}
+
+function projection(project) {
+  return projectionMutator(function() { return project; })();
+}
+
+function projectionMutator(projectAt) {
+  var project,
+      k = 150, // scale
+      x = 480, y = 250, // translate
+      lambda = 0, phi = 0, // center
+      deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate
+      alpha = 0, // post-rotate
+      theta = null, preclip = _clip_antimeridian_js__WEBPACK_IMPORTED_MODULE_0__["default"], // pre-clip angle
+      x0 = null, y0, x1, y1, postclip = _identity_js__WEBPACK_IMPORTED_MODULE_4__["default"], // post-clip extent
+      delta2 = 0.5, // precision
+      projectResample,
+      projectTransform,
+      projectRotateTransform,
+      cache,
+      cacheStream;
+
+  function projection(point) {
+    return projectRotateTransform(point[0] * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"], point[1] * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"]);
+  }
+
+  function invert(point) {
+    point = projectRotateTransform.invert(point[0], point[1]);
+    return point && [point[0] * _math_js__WEBPACK_IMPORTED_MODULE_5__["degrees"], point[1] * _math_js__WEBPACK_IMPORTED_MODULE_5__["degrees"]];
+  }
+
+  projection.stream = function(stream) {
+    return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
+  };
+
+  projection.preclip = function(_) {
+    return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
+  };
+
+  projection.postclip = function(_) {
+    return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
+  };
+
+  projection.clipAngle = function(_) {
+    return arguments.length ? (preclip = +_ ? Object(_clip_circle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(theta = _ * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"]) : (theta = null, _clip_antimeridian_js__WEBPACK_IMPORTED_MODULE_0__["default"]), reset()) : theta * _math_js__WEBPACK_IMPORTED_MODULE_5__["degrees"];
+  };
+
+  projection.clipExtent = function(_) {
+    return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, _identity_js__WEBPACK_IMPORTED_MODULE_4__["default"]) : Object(_clip_rectangle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]];
+  };
+
+  projection.scale = function(_) {
+    return arguments.length ? (k = +_, recenter()) : k;
+  };
+
+  projection.translate = function(_) {
+    return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
+  };
+
+  projection.center = function(_) {
+    return arguments.length ? (lambda = _[0] % 360 * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"], phi = _[1] % 360 * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"], recenter()) : [lambda * _math_js__WEBPACK_IMPORTED_MODULE_5__["degrees"], phi * _math_js__WEBPACK_IMPORTED_MODULE_5__["degrees"]];
+  };
+
+  projection.rotate = function(_) {
+    return arguments.length ? (deltaLambda = _[0] % 360 * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"], deltaPhi = _[1] % 360 * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"], deltaGamma = _.length > 2 ? _[2] % 360 * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"] : 0, recenter()) : [deltaLambda * _math_js__WEBPACK_IMPORTED_MODULE_5__["degrees"], deltaPhi * _math_js__WEBPACK_IMPORTED_MODULE_5__["degrees"], deltaGamma * _math_js__WEBPACK_IMPORTED_MODULE_5__["degrees"]];
+  };
+
+  projection.angle = function(_) {
+    return arguments.length ? (alpha = _ % 360 * _math_js__WEBPACK_IMPORTED_MODULE_5__["radians"], recenter()) : alpha * _math_js__WEBPACK_IMPORTED_MODULE_5__["degrees"];
+  };
+
+  projection.precision = function(_) {
+    return arguments.length ? (projectResample = Object(_resample_js__WEBPACK_IMPORTED_MODULE_9__["default"])(projectTransform, delta2 = _ * _), reset()) : Object(_math_js__WEBPACK_IMPORTED_MODULE_5__["sqrt"])(delta2);
+  };
+
+  projection.fitExtent = function(extent, object) {
+    return Object(_fit_js__WEBPACK_IMPORTED_MODULE_8__["fitExtent"])(projection, extent, object);
+  };
+
+  projection.fitSize = function(size, object) {
+    return Object(_fit_js__WEBPACK_IMPORTED_MODULE_8__["fitSize"])(projection, size, object);
+  };
+
+  projection.fitWidth = function(width, object) {
+    return Object(_fit_js__WEBPACK_IMPORTED_MODULE_8__["fitWidth"])(projection, width, object);
+  };
+
+  projection.fitHeight = function(height, object) {
+    return Object(_fit_js__WEBPACK_IMPORTED_MODULE_8__["fitHeight"])(projection, height, object);
+  };
+
+  function recenter() {
+    var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),
+        transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);
+    rotate = Object(_rotation_js__WEBPACK_IMPORTED_MODULE_6__["rotateRadians"])(deltaLambda, deltaPhi, deltaGamma);
+    projectTransform = Object(_compose_js__WEBPACK_IMPORTED_MODULE_3__["default"])(project, transform);
+    projectRotateTransform = Object(_compose_js__WEBPACK_IMPORTED_MODULE_3__["default"])(rotate, projectTransform);
+    projectResample = Object(_resample_js__WEBPACK_IMPORTED_MODULE_9__["default"])(projectTransform, delta2);
+    return reset();
+  }
+
+  function reset() {
+    cache = cacheStream = null;
+    return projection;
+  }
+
+  return function() {
+    project = projectAt.apply(this, arguments);
+    projection.invert = project.invert && invert;
+    return recenter();
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/mercator.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/mercator.js ***!
+  \********************************************************/
+/*! exports provided: mercatorRaw, default, mercatorProjection */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mercatorRaw", function() { return mercatorRaw; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mercatorProjection", function() { return mercatorProjection; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _rotation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../rotation.js */ "./node_modules/d3-geo/src/rotation.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+
+
+
+
+function mercatorRaw(lambda, phi) {
+  return [lambda, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["log"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["tan"])((_math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"] + phi) / 2))];
+}
+
+mercatorRaw.invert = function(x, y) {
+  return [x, 2 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["exp"])(y)) - _math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"]];
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return mercatorProjection(mercatorRaw)
+      .scale(961 / _math_js__WEBPACK_IMPORTED_MODULE_0__["tau"]);
+});
+
+function mercatorProjection(project) {
+  var m = Object(_index_js__WEBPACK_IMPORTED_MODULE_2__["default"])(project),
+      center = m.center,
+      scale = m.scale,
+      translate = m.translate,
+      clipExtent = m.clipExtent,
+      x0 = null, y0, x1, y1; // clip extent
+
+  m.scale = function(_) {
+    return arguments.length ? (scale(_), reclip()) : scale();
+  };
+
+  m.translate = function(_) {
+    return arguments.length ? (translate(_), reclip()) : translate();
+  };
+
+  m.center = function(_) {
+    return arguments.length ? (center(_), reclip()) : center();
+  };
+
+  m.clipExtent = function(_) {
+    return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]];
+  };
+
+  function reclip() {
+    var k = _math_js__WEBPACK_IMPORTED_MODULE_0__["pi"] * scale(),
+        t = m(Object(_rotation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(m.rotate()).invert([0, 0]));
+    return clipExtent(x0 == null
+        ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
+        ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
+        : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
+  }
+
+  return reclip();
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/naturalEarth1.js":
+/*!*************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/naturalEarth1.js ***!
+  \*************************************************************/
+/*! exports provided: naturalEarth1Raw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "naturalEarth1Raw", function() { return naturalEarth1Raw; });
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+
+function naturalEarth1Raw(lambda, phi) {
+  var phi2 = phi * phi, phi4 = phi2 * phi2;
+  return [
+    lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
+    phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
+  ];
+}
+
+naturalEarth1Raw.invert = function(x, y) {
+  var phi = y, i = 25, delta;
+  do {
+    var phi2 = phi * phi, phi4 = phi2 * phi2;
+    phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
+        (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
+  } while (Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(delta) > _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"] && --i > 0);
+  return [
+    x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
+    phi
+  ];
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_index_js__WEBPACK_IMPORTED_MODULE_0__["default"])(naturalEarth1Raw)
+      .scale(175.295);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/orthographic.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/orthographic.js ***!
+  \************************************************************/
+/*! exports provided: orthographicRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "orthographicRaw", function() { return orthographicRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _azimuthal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./azimuthal.js */ "./node_modules/d3-geo/src/projection/azimuthal.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+
+
+
+
+function orthographicRaw(x, y) {
+  return [Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y) * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(x), Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y)];
+}
+
+orthographicRaw.invert = Object(_azimuthal_js__WEBPACK_IMPORTED_MODULE_1__["azimuthalInvert"])(_math_js__WEBPACK_IMPORTED_MODULE_0__["asin"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_index_js__WEBPACK_IMPORTED_MODULE_2__["default"])(orthographicRaw)
+      .scale(249.5)
+      .clipAngle(90 + _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/resample.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/resample.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _cartesian_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../cartesian.js */ "./node_modules/d3-geo/src/cartesian.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../transform.js */ "./node_modules/d3-geo/src/transform.js");
+
+
+
+
+var maxDepth = 16, // maximum depth of subdivision
+    cosMinDistance = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(30 * _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"]); // cos(minimum angular distance)
+
+/* harmony default export */ __webpack_exports__["default"] = (function(project, delta2) {
+  return +delta2 ? resample(project, delta2) : resampleNone(project);
+});
+
+function resampleNone(project) {
+  return Object(_transform_js__WEBPACK_IMPORTED_MODULE_2__["transformer"])({
+    point: function(x, y) {
+      x = project(x, y);
+      this.stream.point(x[0], x[1]);
+    }
+  });
+}
+
+function resample(project, delta2) {
+
+  function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
+    var dx = x1 - x0,
+        dy = y1 - y0,
+        d2 = dx * dx + dy * dy;
+    if (d2 > 4 * delta2 && depth--) {
+      var a = a0 + a1,
+          b = b0 + b1,
+          c = c0 + c1,
+          m = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sqrt"])(a * a + b * b + c * c),
+          phi2 = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["asin"])(c /= m),
+          lambda2 = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(c) - 1) < _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"] || Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(lambda0 - lambda1) < _math_js__WEBPACK_IMPORTED_MODULE_1__["epsilon"] ? (lambda0 + lambda1) / 2 : Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["atan2"])(b, a),
+          p = project(lambda2, phi2),
+          x2 = p[0],
+          y2 = p[1],
+          dx2 = x2 - x0,
+          dy2 = y2 - y0,
+          dz = dy * dx2 - dx * dy2;
+      if (dz * dz / d2 > delta2 // perpendicular projected distance
+          || Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
+          || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
+        resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
+        stream.point(x2, y2);
+        resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
+      }
+    }
+  }
+  return function(stream) {
+    var lambda00, x00, y00, a00, b00, c00, // first point
+        lambda0, x0, y0, a0, b0, c0; // previous point
+
+    var resampleStream = {
+      point: point,
+      lineStart: lineStart,
+      lineEnd: lineEnd,
+      polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
+      polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
+    };
+
+    function point(x, y) {
+      x = project(x, y);
+      stream.point(x[0], x[1]);
+    }
+
+    function lineStart() {
+      x0 = NaN;
+      resampleStream.point = linePoint;
+      stream.lineStart();
+    }
+
+    function linePoint(lambda, phi) {
+      var c = Object(_cartesian_js__WEBPACK_IMPORTED_MODULE_0__["cartesian"])([lambda, phi]), p = project(lambda, phi);
+      resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
+      stream.point(x0, y0);
+    }
+
+    function lineEnd() {
+      resampleStream.point = point;
+      stream.lineEnd();
+    }
+
+    function ringStart() {
+      lineStart();
+      resampleStream.point = ringPoint;
+      resampleStream.lineEnd = ringEnd;
+    }
+
+    function ringPoint(lambda, phi) {
+      linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
+      resampleStream.point = linePoint;
+    }
+
+    function ringEnd() {
+      resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
+      resampleStream.lineEnd = lineEnd;
+      lineEnd();
+    }
+
+    return resampleStream;
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/stereographic.js":
+/*!*************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/stereographic.js ***!
+  \*************************************************************/
+/*! exports provided: stereographicRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stereographicRaw", function() { return stereographicRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _azimuthal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./azimuthal.js */ "./node_modules/d3-geo/src/projection/azimuthal.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-geo/src/projection/index.js");
+
+
+
+
+function stereographicRaw(x, y) {
+  var cy = Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(y), k = 1 + Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["cos"])(x) * cy;
+  return [cy * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(x) / k, Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["sin"])(y) / k];
+}
+
+stereographicRaw.invert = Object(_azimuthal_js__WEBPACK_IMPORTED_MODULE_1__["azimuthalInvert"])(function(z) {
+  return 2 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan"])(z);
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Object(_index_js__WEBPACK_IMPORTED_MODULE_2__["default"])(stereographicRaw)
+      .scale(250)
+      .clipAngle(142);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/projection/transverseMercator.js":
+/*!******************************************************************!*\
+  !*** ./node_modules/d3-geo/src/projection/transverseMercator.js ***!
+  \******************************************************************/
+/*! exports provided: transverseMercatorRaw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transverseMercatorRaw", function() { return transverseMercatorRaw; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-geo/src/math.js");
+/* harmony import */ var _mercator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mercator.js */ "./node_modules/d3-geo/src/projection/mercator.js");
+
+
+
+function transverseMercatorRaw(lambda, phi) {
+  return [Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["log"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["tan"])((_math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"] + phi) / 2)), -lambda];
+}
+
+transverseMercatorRaw.invert = function(x, y) {
+  return [-y, 2 * Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["atan"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_0__["exp"])(x)) - _math_js__WEBPACK_IMPORTED_MODULE_0__["halfPi"]];
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var m = Object(_mercator_js__WEBPACK_IMPORTED_MODULE_1__["mercatorProjection"])(transverseMercatorRaw),
+      center = m.center,
+      rotate = m.rotate;
+
+  m.center = function(_) {
+    return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
+  };
+
+  m.rotate = function(_) {
+    return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
+  };
+
+  return rotate([0, 0, 90])
+      .scale(159.155);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/rotation.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-geo/src/rotation.js ***!
+  \*********************************************/
+/*! exports provided: rotateRadians, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotateRadians", function() { return rotateRadians; });
+/* harmony import */ var _compose_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./compose.js */ "./node_modules/d3-geo/src/compose.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-geo/src/math.js");
+
+
+
+function rotationIdentity(lambda, phi) {
+  return [Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["abs"])(lambda) > _math_js__WEBPACK_IMPORTED_MODULE_1__["pi"] ? lambda + Math.round(-lambda / _math_js__WEBPACK_IMPORTED_MODULE_1__["tau"]) * _math_js__WEBPACK_IMPORTED_MODULE_1__["tau"] : lambda, phi];
+}
+
+rotationIdentity.invert = rotationIdentity;
+
+function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
+  return (deltaLambda %= _math_js__WEBPACK_IMPORTED_MODULE_1__["tau"]) ? (deltaPhi || deltaGamma ? Object(_compose_js__WEBPACK_IMPORTED_MODULE_0__["default"])(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
+    : rotationLambda(deltaLambda))
+    : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
+    : rotationIdentity);
+}
+
+function forwardRotationLambda(deltaLambda) {
+  return function(lambda, phi) {
+    return lambda += deltaLambda, [lambda > _math_js__WEBPACK_IMPORTED_MODULE_1__["pi"] ? lambda - _math_js__WEBPACK_IMPORTED_MODULE_1__["tau"] : lambda < -_math_js__WEBPACK_IMPORTED_MODULE_1__["pi"] ? lambda + _math_js__WEBPACK_IMPORTED_MODULE_1__["tau"] : lambda, phi];
+  };
+}
+
+function rotationLambda(deltaLambda) {
+  var rotation = forwardRotationLambda(deltaLambda);
+  rotation.invert = forwardRotationLambda(-deltaLambda);
+  return rotation;
+}
+
+function rotationPhiGamma(deltaPhi, deltaGamma) {
+  var cosDeltaPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(deltaPhi),
+      sinDeltaPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(deltaPhi),
+      cosDeltaGamma = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(deltaGamma),
+      sinDeltaGamma = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(deltaGamma);
+
+  function rotation(lambda, phi) {
+    var cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(phi),
+        x = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(lambda) * cosPhi,
+        y = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(lambda) * cosPhi,
+        z = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(phi),
+        k = z * cosDeltaPhi + x * sinDeltaPhi;
+    return [
+      Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["atan2"])(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
+      Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["asin"])(k * cosDeltaGamma + y * sinDeltaGamma)
+    ];
+  }
+
+  rotation.invert = function(lambda, phi) {
+    var cosPhi = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(phi),
+        x = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["cos"])(lambda) * cosPhi,
+        y = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(lambda) * cosPhi,
+        z = Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["sin"])(phi),
+        k = z * cosDeltaGamma - y * sinDeltaGamma;
+    return [
+      Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["atan2"])(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
+      Object(_math_js__WEBPACK_IMPORTED_MODULE_1__["asin"])(k * cosDeltaPhi - x * sinDeltaPhi)
+    ];
+  };
+
+  return rotation;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(rotate) {
+  rotate = rotateRadians(rotate[0] * _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"], rotate[1] * _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"], rotate.length > 2 ? rotate[2] * _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"] : 0);
+
+  function forward(coordinates) {
+    coordinates = rotate(coordinates[0] * _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"], coordinates[1] * _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"]);
+    return coordinates[0] *= _math_js__WEBPACK_IMPORTED_MODULE_1__["degrees"], coordinates[1] *= _math_js__WEBPACK_IMPORTED_MODULE_1__["degrees"], coordinates;
+  }
+
+  forward.invert = function(coordinates) {
+    coordinates = rotate.invert(coordinates[0] * _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"], coordinates[1] * _math_js__WEBPACK_IMPORTED_MODULE_1__["radians"]);
+    return coordinates[0] *= _math_js__WEBPACK_IMPORTED_MODULE_1__["degrees"], coordinates[1] *= _math_js__WEBPACK_IMPORTED_MODULE_1__["degrees"], coordinates;
+  };
+
+  return forward;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/stream.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-geo/src/stream.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function streamGeometry(geometry, stream) {
+  if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
+    streamGeometryType[geometry.type](geometry, stream);
+  }
+}
+
+var streamObjectType = {
+  Feature: function(object, stream) {
+    streamGeometry(object.geometry, stream);
+  },
+  FeatureCollection: function(object, stream) {
+    var features = object.features, i = -1, n = features.length;
+    while (++i < n) streamGeometry(features[i].geometry, stream);
+  }
+};
+
+var streamGeometryType = {
+  Sphere: function(object, stream) {
+    stream.sphere();
+  },
+  Point: function(object, stream) {
+    object = object.coordinates;
+    stream.point(object[0], object[1], object[2]);
+  },
+  MultiPoint: function(object, stream) {
+    var coordinates = object.coordinates, i = -1, n = coordinates.length;
+    while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
+  },
+  LineString: function(object, stream) {
+    streamLine(object.coordinates, stream, 0);
+  },
+  MultiLineString: function(object, stream) {
+    var coordinates = object.coordinates, i = -1, n = coordinates.length;
+    while (++i < n) streamLine(coordinates[i], stream, 0);
+  },
+  Polygon: function(object, stream) {
+    streamPolygon(object.coordinates, stream);
+  },
+  MultiPolygon: function(object, stream) {
+    var coordinates = object.coordinates, i = -1, n = coordinates.length;
+    while (++i < n) streamPolygon(coordinates[i], stream);
+  },
+  GeometryCollection: function(object, stream) {
+    var geometries = object.geometries, i = -1, n = geometries.length;
+    while (++i < n) streamGeometry(geometries[i], stream);
+  }
+};
+
+function streamLine(coordinates, stream, closed) {
+  var i = -1, n = coordinates.length - closed, coordinate;
+  stream.lineStart();
+  while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
+  stream.lineEnd();
+}
+
+function streamPolygon(coordinates, stream) {
+  var i = -1, n = coordinates.length;
+  stream.polygonStart();
+  while (++i < n) streamLine(coordinates[i], stream, 1);
+  stream.polygonEnd();
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(object, stream) {
+  if (object && streamObjectType.hasOwnProperty(object.type)) {
+    streamObjectType[object.type](object, stream);
+  } else {
+    streamGeometry(object, stream);
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-geo/src/transform.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-geo/src/transform.js ***!
+  \**********************************************/
+/*! exports provided: default, transformer */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformer", function() { return transformer; });
+/* harmony default export */ __webpack_exports__["default"] = (function(methods) {
+  return {
+    stream: transformer(methods)
+  };
+});
+
+function transformer(methods) {
+  return function(stream) {
+    var s = new TransformStream;
+    for (var key in methods) s[key] = methods[key];
+    s.stream = stream;
+    return s;
+  };
+}
+
+function TransformStream() {}
+
+TransformStream.prototype = {
+  constructor: TransformStream,
+  point: function(x, y) { this.stream.point(x, y); },
+  sphere: function() { this.stream.sphere(); },
+  lineStart: function() { this.stream.lineStart(); },
+  lineEnd: function() { this.stream.lineEnd(); },
+  polygonStart: function() { this.stream.polygonStart(); },
+  polygonEnd: function() { this.stream.polygonEnd(); }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/accessors.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/accessors.js ***!
+  \****************************************************/
+/*! exports provided: optional, required */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "optional", function() { return optional; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "required", function() { return required; });
+function optional(f) {
+  return f == null ? null : required(f);
+}
+
+function required(f) {
+  if (typeof f !== "function") throw new Error;
+  return f;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/array.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/array.js ***!
+  \************************************************/
+/*! exports provided: slice, shuffle */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shuffle", function() { return shuffle; });
+var slice = Array.prototype.slice;
+
+function shuffle(array) {
+  var m = array.length,
+      t,
+      i;
+
+  while (m) {
+    i = Math.random() * m-- | 0;
+    t = array[m];
+    array[m] = array[i];
+    array[i] = t;
+  }
+
+  return array;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/cluster.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/cluster.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function defaultSeparation(a, b) {
+  return a.parent === b.parent ? 1 : 2;
+}
+
+function meanX(children) {
+  return children.reduce(meanXReduce, 0) / children.length;
+}
+
+function meanXReduce(x, c) {
+  return x + c.x;
+}
+
+function maxY(children) {
+  return 1 + children.reduce(maxYReduce, 0);
+}
+
+function maxYReduce(y, c) {
+  return Math.max(y, c.y);
+}
+
+function leafLeft(node) {
+  var children;
+  while (children = node.children) node = children[0];
+  return node;
+}
+
+function leafRight(node) {
+  var children;
+  while (children = node.children) node = children[children.length - 1];
+  return node;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var separation = defaultSeparation,
+      dx = 1,
+      dy = 1,
+      nodeSize = false;
+
+  function cluster(root) {
+    var previousNode,
+        x = 0;
+
+    // First walk, computing the initial x & y values.
+    root.eachAfter(function(node) {
+      var children = node.children;
+      if (children) {
+        node.x = meanX(children);
+        node.y = maxY(children);
+      } else {
+        node.x = previousNode ? x += separation(node, previousNode) : 0;
+        node.y = 0;
+        previousNode = node;
+      }
+    });
+
+    var left = leafLeft(root),
+        right = leafRight(root),
+        x0 = left.x - separation(left, right) / 2,
+        x1 = right.x + separation(right, left) / 2;
+
+    // Second walk, normalizing x & y to the desired size.
+    return root.eachAfter(nodeSize ? function(node) {
+      node.x = (node.x - root.x) * dx;
+      node.y = (root.y - node.y) * dy;
+    } : function(node) {
+      node.x = (node.x - x0) / (x1 - x0) * dx;
+      node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
+    });
+  }
+
+  cluster.separation = function(x) {
+    return arguments.length ? (separation = x, cluster) : separation;
+  };
+
+  cluster.size = function(x) {
+    return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
+  };
+
+  cluster.nodeSize = function(x) {
+    return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
+  };
+
+  return cluster;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/constant.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/constant.js ***!
+  \***************************************************/
+/*! exports provided: constantZero, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "constantZero", function() { return constantZero; });
+function constantZero() {
+  return 0;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/ancestors.js":
+/*!**************************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/ancestors.js ***!
+  \**************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var node = this, nodes = [node];
+  while (node = node.parent) {
+    nodes.push(node);
+  }
+  return nodes;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/count.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/count.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function count(node) {
+  var sum = 0,
+      children = node.children,
+      i = children && children.length;
+  if (!i) sum = 1;
+  else while (--i >= 0) sum += children[i].value;
+  node.value = sum;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return this.eachAfter(count);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/descendants.js":
+/*!****************************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/descendants.js ***!
+  \****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var nodes = [];
+  this.each(function(node) {
+    nodes.push(node);
+  });
+  return nodes;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/each.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/each.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
+  var node = this, current, next = [node], children, i, n;
+  do {
+    current = next.reverse(), next = [];
+    while (node = current.pop()) {
+      callback(node), children = node.children;
+      if (children) for (i = 0, n = children.length; i < n; ++i) {
+        next.push(children[i]);
+      }
+    }
+  } while (next.length);
+  return this;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js":
+/*!**************************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js ***!
+  \**************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
+  var node = this, nodes = [node], next = [], children, i, n;
+  while (node = nodes.pop()) {
+    next.push(node), children = node.children;
+    if (children) for (i = 0, n = children.length; i < n; ++i) {
+      nodes.push(children[i]);
+    }
+  }
+  while (node = next.pop()) {
+    callback(node);
+  }
+  return this;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js ***!
+  \***************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
+  var node = this, nodes = [node], children, i;
+  while (node = nodes.pop()) {
+    callback(node), children = node.children;
+    if (children) for (i = children.length - 1; i >= 0; --i) {
+      nodes.push(children[i]);
+    }
+  }
+  return this;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/index.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/index.js ***!
+  \**********************************************************/
+/*! exports provided: default, computeHeight, Node */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return hierarchy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "computeHeight", function() { return computeHeight; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Node", function() { return Node; });
+/* harmony import */ var _count_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./count.js */ "./node_modules/d3-hierarchy/src/hierarchy/count.js");
+/* harmony import */ var _each_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./each.js */ "./node_modules/d3-hierarchy/src/hierarchy/each.js");
+/* harmony import */ var _eachBefore_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./eachBefore.js */ "./node_modules/d3-hierarchy/src/hierarchy/eachBefore.js");
+/* harmony import */ var _eachAfter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./eachAfter.js */ "./node_modules/d3-hierarchy/src/hierarchy/eachAfter.js");
+/* harmony import */ var _sum_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sum.js */ "./node_modules/d3-hierarchy/src/hierarchy/sum.js");
+/* harmony import */ var _sort_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sort.js */ "./node_modules/d3-hierarchy/src/hierarchy/sort.js");
+/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./path.js */ "./node_modules/d3-hierarchy/src/hierarchy/path.js");
+/* harmony import */ var _ancestors_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ancestors.js */ "./node_modules/d3-hierarchy/src/hierarchy/ancestors.js");
+/* harmony import */ var _descendants_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./descendants.js */ "./node_modules/d3-hierarchy/src/hierarchy/descendants.js");
+/* harmony import */ var _leaves_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./leaves.js */ "./node_modules/d3-hierarchy/src/hierarchy/leaves.js");
+/* harmony import */ var _links_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./links.js */ "./node_modules/d3-hierarchy/src/hierarchy/links.js");
+
+
+
+
+
+
+
+
+
+
+
+
+function hierarchy(data, children) {
+  var root = new Node(data),
+      valued = +data.value && (root.value = data.value),
+      node,
+      nodes = [root],
+      child,
+      childs,
+      i,
+      n;
+
+  if (children == null) children = defaultChildren;
+
+  while (node = nodes.pop()) {
+    if (valued) node.value = +node.data.value;
+    if ((childs = children(node.data)) && (n = childs.length)) {
+      node.children = new Array(n);
+      for (i = n - 1; i >= 0; --i) {
+        nodes.push(child = node.children[i] = new Node(childs[i]));
+        child.parent = node;
+        child.depth = node.depth + 1;
+      }
+    }
+  }
+
+  return root.eachBefore(computeHeight);
+}
+
+function node_copy() {
+  return hierarchy(this).eachBefore(copyData);
+}
+
+function defaultChildren(d) {
+  return d.children;
+}
+
+function copyData(node) {
+  node.data = node.data.data;
+}
+
+function computeHeight(node) {
+  var height = 0;
+  do node.height = height;
+  while ((node = node.parent) && (node.height < ++height));
+}
+
+function Node(data) {
+  this.data = data;
+  this.depth =
+  this.height = 0;
+  this.parent = null;
+}
+
+Node.prototype = hierarchy.prototype = {
+  constructor: Node,
+  count: _count_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  each: _each_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+  eachAfter: _eachAfter_js__WEBPACK_IMPORTED_MODULE_3__["default"],
+  eachBefore: _eachBefore_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  sum: _sum_js__WEBPACK_IMPORTED_MODULE_4__["default"],
+  sort: _sort_js__WEBPACK_IMPORTED_MODULE_5__["default"],
+  path: _path_js__WEBPACK_IMPORTED_MODULE_6__["default"],
+  ancestors: _ancestors_js__WEBPACK_IMPORTED_MODULE_7__["default"],
+  descendants: _descendants_js__WEBPACK_IMPORTED_MODULE_8__["default"],
+  leaves: _leaves_js__WEBPACK_IMPORTED_MODULE_9__["default"],
+  links: _links_js__WEBPACK_IMPORTED_MODULE_10__["default"],
+  copy: node_copy
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/leaves.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/leaves.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var leaves = [];
+  this.eachBefore(function(node) {
+    if (!node.children) {
+      leaves.push(node);
+    }
+  });
+  return leaves;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/links.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/links.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var root = this, links = [];
+  root.each(function(node) {
+    if (node !== root) { // Don’t include the root’s parent, if any.
+      links.push({source: node.parent, target: node});
+    }
+  });
+  return links;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/path.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/path.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(end) {
+  var start = this,
+      ancestor = leastCommonAncestor(start, end),
+      nodes = [start];
+  while (start !== ancestor) {
+    start = start.parent;
+    nodes.push(start);
+  }
+  var k = nodes.length;
+  while (end !== ancestor) {
+    nodes.splice(k, 0, end);
+    end = end.parent;
+  }
+  return nodes;
+});
+
+function leastCommonAncestor(a, b) {
+  if (a === b) return a;
+  var aNodes = a.ancestors(),
+      bNodes = b.ancestors(),
+      c = null;
+  a = aNodes.pop();
+  b = bNodes.pop();
+  while (a === b) {
+    c = a;
+    a = aNodes.pop();
+    b = bNodes.pop();
+  }
+  return c;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/sort.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/sort.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(compare) {
+  return this.eachBefore(function(node) {
+    if (node.children) {
+      node.children.sort(compare);
+    }
+  });
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/hierarchy/sum.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/hierarchy/sum.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(value) {
+  return this.eachAfter(function(node) {
+    var sum = +value(node.data) || 0,
+        children = node.children,
+        i = children && children.length;
+    while (--i >= 0) sum += children[i].value;
+    node.value = sum;
+  });
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/index.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/index.js ***!
+  \************************************************/
+/*! exports provided: cluster, hierarchy, pack, packSiblings, packEnclose, partition, stratify, tree, treemap, treemapBinary, treemapDice, treemapSlice, treemapSliceDice, treemapSquarify, treemapResquarify */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _cluster_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cluster.js */ "./node_modules/d3-hierarchy/src/cluster.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cluster", function() { return _cluster_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _hierarchy_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hierarchy/index.js */ "./node_modules/d3-hierarchy/src/hierarchy/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hierarchy", function() { return _hierarchy_index_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _pack_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./pack/index.js */ "./node_modules/d3-hierarchy/src/pack/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pack", function() { return _pack_index_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _pack_siblings_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pack/siblings.js */ "./node_modules/d3-hierarchy/src/pack/siblings.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "packSiblings", function() { return _pack_siblings_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _pack_enclose_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pack/enclose.js */ "./node_modules/d3-hierarchy/src/pack/enclose.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "packEnclose", function() { return _pack_enclose_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _partition_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./partition.js */ "./node_modules/d3-hierarchy/src/partition.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _partition_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _stratify_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stratify.js */ "./node_modules/d3-hierarchy/src/stratify.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stratify", function() { return _stratify_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony import */ var _tree_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./tree.js */ "./node_modules/d3-hierarchy/src/tree.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tree", function() { return _tree_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+/* harmony import */ var _treemap_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./treemap/index.js */ "./node_modules/d3-hierarchy/src/treemap/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemap", function() { return _treemap_index_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony import */ var _treemap_binary_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./treemap/binary.js */ "./node_modules/d3-hierarchy/src/treemap/binary.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapBinary", function() { return _treemap_binary_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
+
+/* harmony import */ var _treemap_dice_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./treemap/dice.js */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapDice", function() { return _treemap_dice_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony import */ var _treemap_slice_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./treemap/slice.js */ "./node_modules/d3-hierarchy/src/treemap/slice.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapSlice", function() { return _treemap_slice_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony import */ var _treemap_sliceDice_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./treemap/sliceDice.js */ "./node_modules/d3-hierarchy/src/treemap/sliceDice.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapSliceDice", function() { return _treemap_sliceDice_js__WEBPACK_IMPORTED_MODULE_12__["default"]; });
+
+/* harmony import */ var _treemap_squarify_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./treemap/squarify.js */ "./node_modules/d3-hierarchy/src/treemap/squarify.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapSquarify", function() { return _treemap_squarify_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
+
+/* harmony import */ var _treemap_resquarify_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./treemap/resquarify.js */ "./node_modules/d3-hierarchy/src/treemap/resquarify.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapResquarify", function() { return _treemap_resquarify_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/pack/enclose.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/pack/enclose.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _array_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../array.js */ "./node_modules/d3-hierarchy/src/array.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(circles) {
+  var i = 0, n = (circles = Object(_array_js__WEBPACK_IMPORTED_MODULE_0__["shuffle"])(_array_js__WEBPACK_IMPORTED_MODULE_0__["slice"].call(circles))).length, B = [], p, e;
+
+  while (i < n) {
+    p = circles[i];
+    if (e && enclosesWeak(e, p)) ++i;
+    else e = encloseBasis(B = extendBasis(B, p)), i = 0;
+  }
+
+  return e;
+});
+
+function extendBasis(B, p) {
+  var i, j;
+
+  if (enclosesWeakAll(p, B)) return [p];
+
+  // If we get here then B must have at least one element.
+  for (i = 0; i < B.length; ++i) {
+    if (enclosesNot(p, B[i])
+        && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
+      return [B[i], p];
+    }
+  }
+
+  // If we get here then B must have at least two elements.
+  for (i = 0; i < B.length - 1; ++i) {
+    for (j = i + 1; j < B.length; ++j) {
+      if (enclosesNot(encloseBasis2(B[i], B[j]), p)
+          && enclosesNot(encloseBasis2(B[i], p), B[j])
+          && enclosesNot(encloseBasis2(B[j], p), B[i])
+          && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
+        return [B[i], B[j], p];
+      }
+    }
+  }
+
+  // If we get here then something is very wrong.
+  throw new Error;
+}
+
+function enclosesNot(a, b) {
+  var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
+  return dr < 0 || dr * dr < dx * dx + dy * dy;
+}
+
+function enclosesWeak(a, b) {
+  var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
+  return dr > 0 && dr * dr > dx * dx + dy * dy;
+}
+
+function enclosesWeakAll(a, B) {
+  for (var i = 0; i < B.length; ++i) {
+    if (!enclosesWeak(a, B[i])) {
+      return false;
+    }
+  }
+  return true;
+}
+
+function encloseBasis(B) {
+  switch (B.length) {
+    case 1: return encloseBasis1(B[0]);
+    case 2: return encloseBasis2(B[0], B[1]);
+    case 3: return encloseBasis3(B[0], B[1], B[2]);
+  }
+}
+
+function encloseBasis1(a) {
+  return {
+    x: a.x,
+    y: a.y,
+    r: a.r
+  };
+}
+
+function encloseBasis2(a, b) {
+  var x1 = a.x, y1 = a.y, r1 = a.r,
+      x2 = b.x, y2 = b.y, r2 = b.r,
+      x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
+      l = Math.sqrt(x21 * x21 + y21 * y21);
+  return {
+    x: (x1 + x2 + x21 / l * r21) / 2,
+    y: (y1 + y2 + y21 / l * r21) / 2,
+    r: (l + r1 + r2) / 2
+  };
+}
+
+function encloseBasis3(a, b, c) {
+  var x1 = a.x, y1 = a.y, r1 = a.r,
+      x2 = b.x, y2 = b.y, r2 = b.r,
+      x3 = c.x, y3 = c.y, r3 = c.r,
+      a2 = x1 - x2,
+      a3 = x1 - x3,
+      b2 = y1 - y2,
+      b3 = y1 - y3,
+      c2 = r2 - r1,
+      c3 = r3 - r1,
+      d1 = x1 * x1 + y1 * y1 - r1 * r1,
+      d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
+      d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
+      ab = a3 * b2 - a2 * b3,
+      xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
+      xb = (b3 * c2 - b2 * c3) / ab,
+      ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
+      yb = (a2 * c3 - a3 * c2) / ab,
+      A = xb * xb + yb * yb - 1,
+      B = 2 * (r1 + xa * xb + ya * yb),
+      C = xa * xa + ya * ya - r1 * r1,
+      r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
+  return {
+    x: x1 + xa + xb * r,
+    y: y1 + ya + yb * r,
+    r: r
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/pack/index.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/pack/index.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _siblings_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./siblings.js */ "./node_modules/d3-hierarchy/src/pack/siblings.js");
+/* harmony import */ var _accessors_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../accessors.js */ "./node_modules/d3-hierarchy/src/accessors.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constant.js */ "./node_modules/d3-hierarchy/src/constant.js");
+
+
+
+
+function defaultRadius(d) {
+  return Math.sqrt(d.value);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var radius = null,
+      dx = 1,
+      dy = 1,
+      padding = _constant_js__WEBPACK_IMPORTED_MODULE_2__["constantZero"];
+
+  function pack(root) {
+    root.x = dx / 2, root.y = dy / 2;
+    if (radius) {
+      root.eachBefore(radiusLeaf(radius))
+          .eachAfter(packChildren(padding, 0.5))
+          .eachBefore(translateChild(1));
+    } else {
+      root.eachBefore(radiusLeaf(defaultRadius))
+          .eachAfter(packChildren(_constant_js__WEBPACK_IMPORTED_MODULE_2__["constantZero"], 1))
+          .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
+          .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
+    }
+    return root;
+  }
+
+  pack.radius = function(x) {
+    return arguments.length ? (radius = Object(_accessors_js__WEBPACK_IMPORTED_MODULE_1__["optional"])(x), pack) : radius;
+  };
+
+  pack.size = function(x) {
+    return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
+  };
+
+  pack.padding = function(x) {
+    return arguments.length ? (padding = typeof x === "function" ? x : Object(_constant_js__WEBPACK_IMPORTED_MODULE_2__["default"])(+x), pack) : padding;
+  };
+
+  return pack;
+});
+
+function radiusLeaf(radius) {
+  return function(node) {
+    if (!node.children) {
+      node.r = Math.max(0, +radius(node) || 0);
+    }
+  };
+}
+
+function packChildren(padding, k) {
+  return function(node) {
+    if (children = node.children) {
+      var children,
+          i,
+          n = children.length,
+          r = padding(node) * k || 0,
+          e;
+
+      if (r) for (i = 0; i < n; ++i) children[i].r += r;
+      e = Object(_siblings_js__WEBPACK_IMPORTED_MODULE_0__["packEnclose"])(children);
+      if (r) for (i = 0; i < n; ++i) children[i].r -= r;
+      node.r = e + r;
+    }
+  };
+}
+
+function translateChild(k) {
+  return function(node) {
+    var parent = node.parent;
+    node.r *= k;
+    if (parent) {
+      node.x = parent.x + k * node.x;
+      node.y = parent.y + k * node.y;
+    }
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/pack/siblings.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/pack/siblings.js ***!
+  \********************************************************/
+/*! exports provided: packEnclose, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "packEnclose", function() { return packEnclose; });
+/* harmony import */ var _enclose_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enclose.js */ "./node_modules/d3-hierarchy/src/pack/enclose.js");
+
+
+function place(b, a, c) {
+  var dx = b.x - a.x, x, a2,
+      dy = b.y - a.y, y, b2,
+      d2 = dx * dx + dy * dy;
+  if (d2) {
+    a2 = a.r + c.r, a2 *= a2;
+    b2 = b.r + c.r, b2 *= b2;
+    if (a2 > b2) {
+      x = (d2 + b2 - a2) / (2 * d2);
+      y = Math.sqrt(Math.max(0, b2 / d2 - x * x));
+      c.x = b.x - x * dx - y * dy;
+      c.y = b.y - x * dy + y * dx;
+    } else {
+      x = (d2 + a2 - b2) / (2 * d2);
+      y = Math.sqrt(Math.max(0, a2 / d2 - x * x));
+      c.x = a.x + x * dx - y * dy;
+      c.y = a.y + x * dy + y * dx;
+    }
+  } else {
+    c.x = a.x + c.r;
+    c.y = a.y;
+  }
+}
+
+function intersects(a, b) {
+  var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;
+  return dr > 0 && dr * dr > dx * dx + dy * dy;
+}
+
+function score(node) {
+  var a = node._,
+      b = node.next._,
+      ab = a.r + b.r,
+      dx = (a.x * b.r + b.x * a.r) / ab,
+      dy = (a.y * b.r + b.y * a.r) / ab;
+  return dx * dx + dy * dy;
+}
+
+function Node(circle) {
+  this._ = circle;
+  this.next = null;
+  this.previous = null;
+}
+
+function packEnclose(circles) {
+  if (!(n = circles.length)) return 0;
+
+  var a, b, c, n, aa, ca, i, j, k, sj, sk;
+
+  // Place the first circle.
+  a = circles[0], a.x = 0, a.y = 0;
+  if (!(n > 1)) return a.r;
+
+  // Place the second circle.
+  b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
+  if (!(n > 2)) return a.r + b.r;
+
+  // Place the third circle.
+  place(b, a, c = circles[2]);
+
+  // Initialize the front-chain using the first three circles a, b and c.
+  a = new Node(a), b = new Node(b), c = new Node(c);
+  a.next = c.previous = b;
+  b.next = a.previous = c;
+  c.next = b.previous = a;
+
+  // Attempt to place each remaining circle…
+  pack: for (i = 3; i < n; ++i) {
+    place(a._, b._, c = circles[i]), c = new Node(c);
+
+    // Find the closest intersecting circle on the front-chain, if any.
+    // “Closeness” is determined by linear distance along the front-chain.
+    // “Ahead” or “behind” is likewise determined by linear distance.
+    j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
+    do {
+      if (sj <= sk) {
+        if (intersects(j._, c._)) {
+          b = j, a.next = b, b.previous = a, --i;
+          continue pack;
+        }
+        sj += j._.r, j = j.next;
+      } else {
+        if (intersects(k._, c._)) {
+          a = k, a.next = b, b.previous = a, --i;
+          continue pack;
+        }
+        sk += k._.r, k = k.previous;
+      }
+    } while (j !== k.next);
+
+    // Success! Insert the new circle c between a and b.
+    c.previous = a, c.next = b, a.next = b.previous = b = c;
+
+    // Compute the new closest circle pair to the centroid.
+    aa = score(a);
+    while ((c = c.next) !== b) {
+      if ((ca = score(c)) < aa) {
+        a = c, aa = ca;
+      }
+    }
+    b = a.next;
+  }
+
+  // Compute the enclosing circle of the front chain.
+  a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = Object(_enclose_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a);
+
+  // Translate the circles to put the enclosing circle around the origin.
+  for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
+
+  return c.r;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(circles) {
+  packEnclose(circles);
+  return circles;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/partition.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/partition.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _treemap_round_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./treemap/round.js */ "./node_modules/d3-hierarchy/src/treemap/round.js");
+/* harmony import */ var _treemap_dice_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./treemap/dice.js */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var dx = 1,
+      dy = 1,
+      padding = 0,
+      round = false;
+
+  function partition(root) {
+    var n = root.height + 1;
+    root.x0 =
+    root.y0 = padding;
+    root.x1 = dx;
+    root.y1 = dy / n;
+    root.eachBefore(positionNode(dy, n));
+    if (round) root.eachBefore(_treemap_round_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+    return root;
+  }
+
+  function positionNode(dy, n) {
+    return function(node) {
+      if (node.children) {
+        Object(_treemap_dice_js__WEBPACK_IMPORTED_MODULE_1__["default"])(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
+      }
+      var x0 = node.x0,
+          y0 = node.y0,
+          x1 = node.x1 - padding,
+          y1 = node.y1 - padding;
+      if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
+      if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
+      node.x0 = x0;
+      node.y0 = y0;
+      node.x1 = x1;
+      node.y1 = y1;
+    };
+  }
+
+  partition.round = function(x) {
+    return arguments.length ? (round = !!x, partition) : round;
+  };
+
+  partition.size = function(x) {
+    return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
+  };
+
+  partition.padding = function(x) {
+    return arguments.length ? (padding = +x, partition) : padding;
+  };
+
+  return partition;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/stratify.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/stratify.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _accessors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./accessors.js */ "./node_modules/d3-hierarchy/src/accessors.js");
+/* harmony import */ var _hierarchy_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./hierarchy/index.js */ "./node_modules/d3-hierarchy/src/hierarchy/index.js");
+
+
+
+var keyPrefix = "$", // Protect against keys like “__proto__”.
+    preroot = {depth: -1},
+    ambiguous = {};
+
+function defaultId(d) {
+  return d.id;
+}
+
+function defaultParentId(d) {
+  return d.parentId;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var id = defaultId,
+      parentId = defaultParentId;
+
+  function stratify(data) {
+    var d,
+        i,
+        n = data.length,
+        root,
+        parent,
+        node,
+        nodes = new Array(n),
+        nodeId,
+        nodeKey,
+        nodeByKey = {};
+
+    for (i = 0; i < n; ++i) {
+      d = data[i], node = nodes[i] = new _hierarchy_index_js__WEBPACK_IMPORTED_MODULE_1__["Node"](d);
+      if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
+        nodeKey = keyPrefix + (node.id = nodeId);
+        nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
+      }
+    }
+
+    for (i = 0; i < n; ++i) {
+      node = nodes[i], nodeId = parentId(data[i], i, data);
+      if (nodeId == null || !(nodeId += "")) {
+        if (root) throw new Error("multiple roots");
+        root = node;
+      } else {
+        parent = nodeByKey[keyPrefix + nodeId];
+        if (!parent) throw new Error("missing: " + nodeId);
+        if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
+        if (parent.children) parent.children.push(node);
+        else parent.children = [node];
+        node.parent = parent;
+      }
+    }
+
+    if (!root) throw new Error("no root");
+    root.parent = preroot;
+    root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(_hierarchy_index_js__WEBPACK_IMPORTED_MODULE_1__["computeHeight"]);
+    root.parent = null;
+    if (n > 0) throw new Error("cycle");
+
+    return root;
+  }
+
+  stratify.id = function(x) {
+    return arguments.length ? (id = Object(_accessors_js__WEBPACK_IMPORTED_MODULE_0__["required"])(x), stratify) : id;
+  };
+
+  stratify.parentId = function(x) {
+    return arguments.length ? (parentId = Object(_accessors_js__WEBPACK_IMPORTED_MODULE_0__["required"])(x), stratify) : parentId;
+  };
+
+  return stratify;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/tree.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/tree.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _hierarchy_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./hierarchy/index.js */ "./node_modules/d3-hierarchy/src/hierarchy/index.js");
+
+
+function defaultSeparation(a, b) {
+  return a.parent === b.parent ? 1 : 2;
+}
+
+// function radialSeparation(a, b) {
+//   return (a.parent === b.parent ? 1 : 2) / a.depth;
+// }
+
+// This function is used to traverse the left contour of a subtree (or
+// subforest). It returns the successor of v on this contour. This successor is
+// either given by the leftmost child of v or by the thread of v. The function
+// returns null if and only if v is on the highest level of its subtree.
+function nextLeft(v) {
+  var children = v.children;
+  return children ? children[0] : v.t;
+}
+
+// This function works analogously to nextLeft.
+function nextRight(v) {
+  var children = v.children;
+  return children ? children[children.length - 1] : v.t;
+}
+
+// Shifts the current subtree rooted at w+. This is done by increasing
+// prelim(w+) and mod(w+) by shift.
+function moveSubtree(wm, wp, shift) {
+  var change = shift / (wp.i - wm.i);
+  wp.c -= change;
+  wp.s += shift;
+  wm.c += change;
+  wp.z += shift;
+  wp.m += shift;
+}
+
+// All other shifts, applied to the smaller subtrees between w- and w+, are
+// performed by this function. To prepare the shifts, we have to adjust
+// change(w+), shift(w+), and change(w-).
+function executeShifts(v) {
+  var shift = 0,
+      change = 0,
+      children = v.children,
+      i = children.length,
+      w;
+  while (--i >= 0) {
+    w = children[i];
+    w.z += shift;
+    w.m += shift;
+    shift += w.s + (change += w.c);
+  }
+}
+
+// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
+// returns the specified (default) ancestor.
+function nextAncestor(vim, v, ancestor) {
+  return vim.a.parent === v.parent ? vim.a : ancestor;
+}
+
+function TreeNode(node, i) {
+  this._ = node;
+  this.parent = null;
+  this.children = null;
+  this.A = null; // default ancestor
+  this.a = this; // ancestor
+  this.z = 0; // prelim
+  this.m = 0; // mod
+  this.c = 0; // change
+  this.s = 0; // shift
+  this.t = null; // thread
+  this.i = i; // number
+}
+
+TreeNode.prototype = Object.create(_hierarchy_index_js__WEBPACK_IMPORTED_MODULE_0__["Node"].prototype);
+
+function treeRoot(root) {
+  var tree = new TreeNode(root, 0),
+      node,
+      nodes = [tree],
+      child,
+      children,
+      i,
+      n;
+
+  while (node = nodes.pop()) {
+    if (children = node._.children) {
+      node.children = new Array(n = children.length);
+      for (i = n - 1; i >= 0; --i) {
+        nodes.push(child = node.children[i] = new TreeNode(children[i], i));
+        child.parent = node;
+      }
+    }
+  }
+
+  (tree.parent = new TreeNode(null, 0)).children = [tree];
+  return tree;
+}
+
+// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var separation = defaultSeparation,
+      dx = 1,
+      dy = 1,
+      nodeSize = null;
+
+  function tree(root) {
+    var t = treeRoot(root);
+
+    // Compute the layout using Buchheim et al.’s algorithm.
+    t.eachAfter(firstWalk), t.parent.m = -t.z;
+    t.eachBefore(secondWalk);
+
+    // If a fixed node size is specified, scale x and y.
+    if (nodeSize) root.eachBefore(sizeNode);
+
+    // If a fixed tree size is specified, scale x and y based on the extent.
+    // Compute the left-most, right-most, and depth-most nodes for extents.
+    else {
+      var left = root,
+          right = root,
+          bottom = root;
+      root.eachBefore(function(node) {
+        if (node.x < left.x) left = node;
+        if (node.x > right.x) right = node;
+        if (node.depth > bottom.depth) bottom = node;
+      });
+      var s = left === right ? 1 : separation(left, right) / 2,
+          tx = s - left.x,
+          kx = dx / (right.x + s + tx),
+          ky = dy / (bottom.depth || 1);
+      root.eachBefore(function(node) {
+        node.x = (node.x + tx) * kx;
+        node.y = node.depth * ky;
+      });
+    }
+
+    return root;
+  }
+
+  // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
+  // applied recursively to the children of v, as well as the function
+  // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
+  // node v is placed to the midpoint of its outermost children.
+  function firstWalk(v) {
+    var children = v.children,
+        siblings = v.parent.children,
+        w = v.i ? siblings[v.i - 1] : null;
+    if (children) {
+      executeShifts(v);
+      var midpoint = (children[0].z + children[children.length - 1].z) / 2;
+      if (w) {
+        v.z = w.z + separation(v._, w._);
+        v.m = v.z - midpoint;
+      } else {
+        v.z = midpoint;
+      }
+    } else if (w) {
+      v.z = w.z + separation(v._, w._);
+    }
+    v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
+  }
+
+  // Computes all real x-coordinates by summing up the modifiers recursively.
+  function secondWalk(v) {
+    v._.x = v.z + v.parent.m;
+    v.m += v.parent.m;
+  }
+
+  // The core of the algorithm. Here, a new subtree is combined with the
+  // previous subtrees. Threads are used to traverse the inside and outside
+  // contours of the left and right subtree up to the highest common level. The
+  // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
+  // superscript o means outside and i means inside, the subscript - means left
+  // subtree and + means right subtree. For summing up the modifiers along the
+  // contour, we use respective variables si+, si-, so-, and so+. Whenever two
+  // nodes of the inside contours conflict, we compute the left one of the
+  // greatest uncommon ancestors using the function ANCESTOR and call MOVE
+  // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
+  // Finally, we add a new thread (if necessary).
+  function apportion(v, w, ancestor) {
+    if (w) {
+      var vip = v,
+          vop = v,
+          vim = w,
+          vom = vip.parent.children[0],
+          sip = vip.m,
+          sop = vop.m,
+          sim = vim.m,
+          som = vom.m,
+          shift;
+      while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
+        vom = nextLeft(vom);
+        vop = nextRight(vop);
+        vop.a = v;
+        shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
+        if (shift > 0) {
+          moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
+          sip += shift;
+          sop += shift;
+        }
+        sim += vim.m;
+        sip += vip.m;
+        som += vom.m;
+        sop += vop.m;
+      }
+      if (vim && !nextRight(vop)) {
+        vop.t = vim;
+        vop.m += sim - sop;
+      }
+      if (vip && !nextLeft(vom)) {
+        vom.t = vip;
+        vom.m += sip - som;
+        ancestor = v;
+      }
+    }
+    return ancestor;
+  }
+
+  function sizeNode(node) {
+    node.x *= dx;
+    node.y = node.depth * dy;
+  }
+
+  tree.separation = function(x) {
+    return arguments.length ? (separation = x, tree) : separation;
+  };
+
+  tree.size = function(x) {
+    return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
+  };
+
+  tree.nodeSize = function(x) {
+    return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
+  };
+
+  return tree;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/treemap/binary.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/treemap/binary.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(parent, x0, y0, x1, y1) {
+  var nodes = parent.children,
+      i, n = nodes.length,
+      sum, sums = new Array(n + 1);
+
+  for (sums[0] = sum = i = 0; i < n; ++i) {
+    sums[i + 1] = sum += nodes[i].value;
+  }
+
+  partition(0, n, parent.value, x0, y0, x1, y1);
+
+  function partition(i, j, value, x0, y0, x1, y1) {
+    if (i >= j - 1) {
+      var node = nodes[i];
+      node.x0 = x0, node.y0 = y0;
+      node.x1 = x1, node.y1 = y1;
+      return;
+    }
+
+    var valueOffset = sums[i],
+        valueTarget = (value / 2) + valueOffset,
+        k = i + 1,
+        hi = j - 1;
+
+    while (k < hi) {
+      var mid = k + hi >>> 1;
+      if (sums[mid] < valueTarget) k = mid + 1;
+      else hi = mid;
+    }
+
+    if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
+
+    var valueLeft = sums[k] - valueOffset,
+        valueRight = value - valueLeft;
+
+    if ((x1 - x0) > (y1 - y0)) {
+      var xk = (x0 * valueRight + x1 * valueLeft) / value;
+      partition(i, k, valueLeft, x0, y0, xk, y1);
+      partition(k, j, valueRight, xk, y0, x1, y1);
+    } else {
+      var yk = (y0 * valueRight + y1 * valueLeft) / value;
+      partition(i, k, valueLeft, x0, y0, x1, yk);
+      partition(k, j, valueRight, x0, yk, x1, y1);
+    }
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/treemap/dice.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/treemap/dice.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(parent, x0, y0, x1, y1) {
+  var nodes = parent.children,
+      node,
+      i = -1,
+      n = nodes.length,
+      k = parent.value && (x1 - x0) / parent.value;
+
+  while (++i < n) {
+    node = nodes[i], node.y0 = y0, node.y1 = y1;
+    node.x0 = x0, node.x1 = x0 += node.value * k;
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/treemap/index.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/treemap/index.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _round_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./round.js */ "./node_modules/d3-hierarchy/src/treemap/round.js");
+/* harmony import */ var _squarify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./squarify.js */ "./node_modules/d3-hierarchy/src/treemap/squarify.js");
+/* harmony import */ var _accessors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../accessors.js */ "./node_modules/d3-hierarchy/src/accessors.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constant.js */ "./node_modules/d3-hierarchy/src/constant.js");
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var tile = _squarify_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+      round = false,
+      dx = 1,
+      dy = 1,
+      paddingStack = [0],
+      paddingInner = _constant_js__WEBPACK_IMPORTED_MODULE_3__["constantZero"],
+      paddingTop = _constant_js__WEBPACK_IMPORTED_MODULE_3__["constantZero"],
+      paddingRight = _constant_js__WEBPACK_IMPORTED_MODULE_3__["constantZero"],
+      paddingBottom = _constant_js__WEBPACK_IMPORTED_MODULE_3__["constantZero"],
+      paddingLeft = _constant_js__WEBPACK_IMPORTED_MODULE_3__["constantZero"];
+
+  function treemap(root) {
+    root.x0 =
+    root.y0 = 0;
+    root.x1 = dx;
+    root.y1 = dy;
+    root.eachBefore(positionNode);
+    paddingStack = [0];
+    if (round) root.eachBefore(_round_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+    return root;
+  }
+
+  function positionNode(node) {
+    var p = paddingStack[node.depth],
+        x0 = node.x0 + p,
+        y0 = node.y0 + p,
+        x1 = node.x1 - p,
+        y1 = node.y1 - p;
+    if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
+    if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
+    node.x0 = x0;
+    node.y0 = y0;
+    node.x1 = x1;
+    node.y1 = y1;
+    if (node.children) {
+      p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
+      x0 += paddingLeft(node) - p;
+      y0 += paddingTop(node) - p;
+      x1 -= paddingRight(node) - p;
+      y1 -= paddingBottom(node) - p;
+      if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
+      if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
+      tile(node, x0, y0, x1, y1);
+    }
+  }
+
+  treemap.round = function(x) {
+    return arguments.length ? (round = !!x, treemap) : round;
+  };
+
+  treemap.size = function(x) {
+    return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
+  };
+
+  treemap.tile = function(x) {
+    return arguments.length ? (tile = Object(_accessors_js__WEBPACK_IMPORTED_MODULE_2__["required"])(x), treemap) : tile;
+  };
+
+  treemap.padding = function(x) {
+    return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
+  };
+
+  treemap.paddingInner = function(x) {
+    return arguments.length ? (paddingInner = typeof x === "function" ? x : Object(_constant_js__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingInner;
+  };
+
+  treemap.paddingOuter = function(x) {
+    return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
+  };
+
+  treemap.paddingTop = function(x) {
+    return arguments.length ? (paddingTop = typeof x === "function" ? x : Object(_constant_js__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingTop;
+  };
+
+  treemap.paddingRight = function(x) {
+    return arguments.length ? (paddingRight = typeof x === "function" ? x : Object(_constant_js__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingRight;
+  };
+
+  treemap.paddingBottom = function(x) {
+    return arguments.length ? (paddingBottom = typeof x === "function" ? x : Object(_constant_js__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingBottom;
+  };
+
+  treemap.paddingLeft = function(x) {
+    return arguments.length ? (paddingLeft = typeof x === "function" ? x : Object(_constant_js__WEBPACK_IMPORTED_MODULE_3__["default"])(+x), treemap) : paddingLeft;
+  };
+
+  return treemap;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/treemap/resquarify.js":
+/*!*************************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/treemap/resquarify.js ***!
+  \*************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _dice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dice.js */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
+/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./slice.js */ "./node_modules/d3-hierarchy/src/treemap/slice.js");
+/* harmony import */ var _squarify_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./squarify.js */ "./node_modules/d3-hierarchy/src/treemap/squarify.js");
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = ((function custom(ratio) {
+
+  function resquarify(parent, x0, y0, x1, y1) {
+    if ((rows = parent._squarify) && (rows.ratio === ratio)) {
+      var rows,
+          row,
+          nodes,
+          i,
+          j = -1,
+          n,
+          m = rows.length,
+          value = parent.value;
+
+      while (++j < m) {
+        row = rows[j], nodes = row.children;
+        for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
+        if (row.dice) Object(_dice_js__WEBPACK_IMPORTED_MODULE_0__["default"])(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
+        else Object(_slice_js__WEBPACK_IMPORTED_MODULE_1__["default"])(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
+        value -= row.value;
+      }
+    } else {
+      parent._squarify = rows = Object(_squarify_js__WEBPACK_IMPORTED_MODULE_2__["squarifyRatio"])(ratio, parent, x0, y0, x1, y1);
+      rows.ratio = ratio;
+    }
+  }
+
+  resquarify.ratio = function(x) {
+    return custom((x = +x) > 1 ? x : 1);
+  };
+
+  return resquarify;
+})(_squarify_js__WEBPACK_IMPORTED_MODULE_2__["phi"]));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/treemap/round.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/treemap/round.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(node) {
+  node.x0 = Math.round(node.x0);
+  node.y0 = Math.round(node.y0);
+  node.x1 = Math.round(node.x1);
+  node.y1 = Math.round(node.y1);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/treemap/slice.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/treemap/slice.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(parent, x0, y0, x1, y1) {
+  var nodes = parent.children,
+      node,
+      i = -1,
+      n = nodes.length,
+      k = parent.value && (y1 - y0) / parent.value;
+
+  while (++i < n) {
+    node = nodes[i], node.x0 = x0, node.x1 = x1;
+    node.y0 = y0, node.y1 = y0 += node.value * k;
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/treemap/sliceDice.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/treemap/sliceDice.js ***!
+  \************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _dice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dice.js */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
+/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./slice.js */ "./node_modules/d3-hierarchy/src/treemap/slice.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(parent, x0, y0, x1, y1) {
+  (parent.depth & 1 ? _slice_js__WEBPACK_IMPORTED_MODULE_1__["default"] : _dice_js__WEBPACK_IMPORTED_MODULE_0__["default"])(parent, x0, y0, x1, y1);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-hierarchy/src/treemap/squarify.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-hierarchy/src/treemap/squarify.js ***!
+  \***********************************************************/
+/*! exports provided: phi, squarifyRatio, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "phi", function() { return phi; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "squarifyRatio", function() { return squarifyRatio; });
+/* harmony import */ var _dice_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dice.js */ "./node_modules/d3-hierarchy/src/treemap/dice.js");
+/* harmony import */ var _slice_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./slice.js */ "./node_modules/d3-hierarchy/src/treemap/slice.js");
+
+
+
+var phi = (1 + Math.sqrt(5)) / 2;
+
+function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
+  var rows = [],
+      nodes = parent.children,
+      row,
+      nodeValue,
+      i0 = 0,
+      i1 = 0,
+      n = nodes.length,
+      dx, dy,
+      value = parent.value,
+      sumValue,
+      minValue,
+      maxValue,
+      newRatio,
+      minRatio,
+      alpha,
+      beta;
+
+  while (i0 < n) {
+    dx = x1 - x0, dy = y1 - y0;
+
+    // Find the next non-empty node.
+    do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
+    minValue = maxValue = sumValue;
+    alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
+    beta = sumValue * sumValue * alpha;
+    minRatio = Math.max(maxValue / beta, beta / minValue);
+
+    // Keep adding nodes while the aspect ratio maintains or improves.
+    for (; i1 < n; ++i1) {
+      sumValue += nodeValue = nodes[i1].value;
+      if (nodeValue < minValue) minValue = nodeValue;
+      if (nodeValue > maxValue) maxValue = nodeValue;
+      beta = sumValue * sumValue * alpha;
+      newRatio = Math.max(maxValue / beta, beta / minValue);
+      if (newRatio > minRatio) { sumValue -= nodeValue; break; }
+      minRatio = newRatio;
+    }
+
+    // Position and record the row orientation.
+    rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
+    if (row.dice) Object(_dice_js__WEBPACK_IMPORTED_MODULE_0__["default"])(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
+    else Object(_slice_js__WEBPACK_IMPORTED_MODULE_1__["default"])(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
+    value -= sumValue, i0 = i1;
+  }
+
+  return rows;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = ((function custom(ratio) {
+
+  function squarify(parent, x0, y0, x1, y1) {
+    squarifyRatio(ratio, parent, x0, y0, x1, y1);
+  }
+
+  squarify.ratio = function(x) {
+    return custom((x = +x) > 1 ? x : 1);
+  };
+
+  return squarify;
+})(phi));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/array.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/array.js ***!
+  \**************************************************/
+/*! exports provided: default, genericArray */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "genericArray", function() { return genericArray; });
+/* harmony import */ var _value_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./value.js */ "./node_modules/d3-interpolate/src/value.js");
+/* harmony import */ var _numberArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./numberArray.js */ "./node_modules/d3-interpolate/src/numberArray.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  return (Object(_numberArray_js__WEBPACK_IMPORTED_MODULE_1__["isNumberArray"])(b) ? _numberArray_js__WEBPACK_IMPORTED_MODULE_1__["default"] : genericArray)(a, b);
+});
+
+function genericArray(a, b) {
+  var nb = b ? b.length : 0,
+      na = a ? Math.min(nb, a.length) : 0,
+      x = new Array(na),
+      c = new Array(nb),
+      i;
+
+  for (i = 0; i < na; ++i) x[i] = Object(_value_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a[i], b[i]);
+  for (; i < nb; ++i) c[i] = b[i];
+
+  return function(t) {
+    for (i = 0; i < na; ++i) c[i] = x[i](t);
+    return c;
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/basis.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/basis.js ***!
+  \**************************************************/
+/*! exports provided: basis, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "basis", function() { return basis; });
+function basis(t1, v0, v1, v2, v3) {
+  var t2 = t1 * t1, t3 = t2 * t1;
+  return ((1 - 3 * t1 + 3 * t2 - t3) * v0
+      + (4 - 6 * t2 + 3 * t3) * v1
+      + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
+      + t3 * v3) / 6;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values) {
+  var n = values.length - 1;
+  return function(t) {
+    var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
+        v1 = values[i],
+        v2 = values[i + 1],
+        v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
+        v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
+    return basis((t - i / n) * n, v0, v1, v2, v3);
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/basisClosed.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/basisClosed.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _basis_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./basis.js */ "./node_modules/d3-interpolate/src/basis.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(values) {
+  var n = values.length;
+  return function(t) {
+    var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
+        v0 = values[(i + n - 1) % n],
+        v1 = values[i % n],
+        v2 = values[(i + 1) % n],
+        v3 = values[(i + 2) % n];
+    return Object(_basis_js__WEBPACK_IMPORTED_MODULE_0__["basis"])((t - i / n) * n, v0, v1, v2, v3);
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/color.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/color.js ***!
+  \**************************************************/
+/*! exports provided: hue, gamma, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hue", function() { return hue; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "gamma", function() { return gamma; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return nogamma; });
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-interpolate/src/constant.js");
+
+
+function linear(a, d) {
+  return function(t) {
+    return a + t * d;
+  };
+}
+
+function exponential(a, b, y) {
+  return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
+    return Math.pow(a + t * b, y);
+  };
+}
+
+function hue(a, b) {
+  var d = b - a;
+  return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(isNaN(a) ? b : a);
+}
+
+function gamma(y) {
+  return (y = +y) === 1 ? nogamma : function(a, b) {
+    return b - a ? exponential(a, b, y) : Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(isNaN(a) ? b : a);
+  };
+}
+
+function nogamma(a, b) {
+  var d = b - a;
+  return d ? linear(a, d) : Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(isNaN(a) ? b : a);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/constant.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/constant.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/cubehelix.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/cubehelix.js ***!
+  \******************************************************/
+/*! exports provided: default, cubehelixLong */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cubehelixLong", function() { return cubehelixLong; });
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony import */ var _color_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color.js */ "./node_modules/d3-interpolate/src/color.js");
+
+
+
+function cubehelix(hue) {
+  return (function cubehelixGamma(y) {
+    y = +y;
+
+    function cubehelix(start, end) {
+      var h = hue((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(start)).h, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(end)).h),
+          s = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.s, end.s),
+          l = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.l, end.l),
+          opacity = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.opacity, end.opacity);
+      return function(t) {
+        start.h = h(t);
+        start.s = s(t);
+        start.l = l(Math.pow(t, y));
+        start.opacity = opacity(t);
+        return start + "";
+      };
+    }
+
+    cubehelix.gamma = cubehelixGamma;
+
+    return cubehelix;
+  })(1);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (cubehelix(_color_js__WEBPACK_IMPORTED_MODULE_1__["hue"]));
+var cubehelixLong = cubehelix(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"]);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/date.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/date.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  var d = new Date;
+  return a = +a, b = +b, function(t) {
+    return d.setTime(a * (1 - t) + b * t), d;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/discrete.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/discrete.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(range) {
+  var n = range.length;
+  return function(t) {
+    return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/hcl.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/hcl.js ***!
+  \************************************************/
+/*! exports provided: default, hclLong */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hclLong", function() { return hclLong; });
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony import */ var _color_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color.js */ "./node_modules/d3-interpolate/src/color.js");
+
+
+
+function hcl(hue) {
+  return function(start, end) {
+    var h = hue((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["hcl"])(start)).h, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["hcl"])(end)).h),
+        c = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.c, end.c),
+        l = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.l, end.l),
+        opacity = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.opacity, end.opacity);
+    return function(t) {
+      start.h = h(t);
+      start.c = c(t);
+      start.l = l(t);
+      start.opacity = opacity(t);
+      return start + "";
+    };
+  }
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (hcl(_color_js__WEBPACK_IMPORTED_MODULE_1__["hue"]));
+var hclLong = hcl(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"]);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/hsl.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/hsl.js ***!
+  \************************************************/
+/*! exports provided: default, hslLong */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hslLong", function() { return hslLong; });
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony import */ var _color_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color.js */ "./node_modules/d3-interpolate/src/color.js");
+
+
+
+function hsl(hue) {
+  return function(start, end) {
+    var h = hue((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["hsl"])(start)).h, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["hsl"])(end)).h),
+        s = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.s, end.s),
+        l = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.l, end.l),
+        opacity = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.opacity, end.opacity);
+    return function(t) {
+      start.h = h(t);
+      start.s = s(t);
+      start.l = l(t);
+      start.opacity = opacity(t);
+      return start + "";
+    };
+  }
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (hsl(_color_js__WEBPACK_IMPORTED_MODULE_1__["hue"]));
+var hslLong = hsl(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"]);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/hue.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/hue.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _color_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./color.js */ "./node_modules/d3-interpolate/src/color.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  var i = Object(_color_js__WEBPACK_IMPORTED_MODULE_0__["hue"])(+a, +b);
+  return function(t) {
+    var x = i(t);
+    return x - 360 * Math.floor(x / 360);
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/index.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/index.js ***!
+  \**************************************************/
+/*! exports provided: interpolate, interpolateArray, interpolateBasis, interpolateBasisClosed, interpolateDate, interpolateDiscrete, interpolateHue, interpolateNumber, interpolateNumberArray, interpolateObject, interpolateRound, interpolateString, interpolateTransformCss, interpolateTransformSvg, interpolateZoom, interpolateRgb, interpolateRgbBasis, interpolateRgbBasisClosed, interpolateHsl, interpolateHslLong, interpolateLab, interpolateHcl, interpolateHclLong, interpolateCubehelix, interpolateCubehelixLong, piecewise, quantize */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _value_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./value.js */ "./node_modules/d3-interpolate/src/value.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolate", function() { return _value_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _array_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array.js */ "./node_modules/d3-interpolate/src/array.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateArray", function() { return _array_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _basis_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./basis.js */ "./node_modules/d3-interpolate/src/basis.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBasis", function() { return _basis_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _basisClosed_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./basisClosed.js */ "./node_modules/d3-interpolate/src/basisClosed.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBasisClosed", function() { return _basisClosed_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _date_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./date.js */ "./node_modules/d3-interpolate/src/date.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateDate", function() { return _date_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _discrete_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./discrete.js */ "./node_modules/d3-interpolate/src/discrete.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateDiscrete", function() { return _discrete_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _hue_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./hue.js */ "./node_modules/d3-interpolate/src/hue.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHue", function() { return _hue_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony import */ var _number_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./number.js */ "./node_modules/d3-interpolate/src/number.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateNumber", function() { return _number_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+/* harmony import */ var _numberArray_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./numberArray.js */ "./node_modules/d3-interpolate/src/numberArray.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateNumberArray", function() { return _numberArray_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony import */ var _object_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./object.js */ "./node_modules/d3-interpolate/src/object.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateObject", function() { return _object_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
+
+/* harmony import */ var _round_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./round.js */ "./node_modules/d3-interpolate/src/round.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRound", function() { return _round_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony import */ var _string_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./string.js */ "./node_modules/d3-interpolate/src/string.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateString", function() { return _string_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony import */ var _transform_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./transform/index.js */ "./node_modules/d3-interpolate/src/transform/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformCss", function() { return _transform_index_js__WEBPACK_IMPORTED_MODULE_12__["interpolateTransformCss"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformSvg", function() { return _transform_index_js__WEBPACK_IMPORTED_MODULE_12__["interpolateTransformSvg"]; });
+
+/* harmony import */ var _zoom_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./zoom.js */ "./node_modules/d3-interpolate/src/zoom.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateZoom", function() { return _zoom_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
+
+/* harmony import */ var _rgb_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./rgb.js */ "./node_modules/d3-interpolate/src/rgb.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRgb", function() { return _rgb_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRgbBasis", function() { return _rgb_js__WEBPACK_IMPORTED_MODULE_14__["rgbBasis"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRgbBasisClosed", function() { return _rgb_js__WEBPACK_IMPORTED_MODULE_14__["rgbBasisClosed"]; });
+
+/* harmony import */ var _hsl_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./hsl.js */ "./node_modules/d3-interpolate/src/hsl.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHsl", function() { return _hsl_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHslLong", function() { return _hsl_js__WEBPACK_IMPORTED_MODULE_15__["hslLong"]; });
+
+/* harmony import */ var _lab_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./lab.js */ "./node_modules/d3-interpolate/src/lab.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateLab", function() { return _lab_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
+
+/* harmony import */ var _hcl_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./hcl.js */ "./node_modules/d3-interpolate/src/hcl.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHcl", function() { return _hcl_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHclLong", function() { return _hcl_js__WEBPACK_IMPORTED_MODULE_17__["hclLong"]; });
+
+/* harmony import */ var _cubehelix_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./cubehelix.js */ "./node_modules/d3-interpolate/src/cubehelix.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelix", function() { return _cubehelix_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelixLong", function() { return _cubehelix_js__WEBPACK_IMPORTED_MODULE_18__["cubehelixLong"]; });
+
+/* harmony import */ var _piecewise_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./piecewise.js */ "./node_modules/d3-interpolate/src/piecewise.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "piecewise", function() { return _piecewise_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
+
+/* harmony import */ var _quantize_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./quantize.js */ "./node_modules/d3-interpolate/src/quantize.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "quantize", function() { return _quantize_js__WEBPACK_IMPORTED_MODULE_20__["default"]; });
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/lab.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/lab.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return lab; });
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony import */ var _color_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./color.js */ "./node_modules/d3-interpolate/src/color.js");
+
+
+
+function lab(start, end) {
+  var l = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["lab"])(start)).l, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["lab"])(end)).l),
+      a = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.a, end.a),
+      b = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.b, end.b),
+      opacity = Object(_color_js__WEBPACK_IMPORTED_MODULE_1__["default"])(start.opacity, end.opacity);
+  return function(t) {
+    start.l = l(t);
+    start.a = a(t);
+    start.b = b(t);
+    start.opacity = opacity(t);
+    return start + "";
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/number.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/number.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  return a = +a, b = +b, function(t) {
+    return a * (1 - t) + b * t;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/numberArray.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/numberArray.js ***!
+  \********************************************************/
+/*! exports provided: default, isNumberArray */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNumberArray", function() { return isNumberArray; });
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  if (!b) b = [];
+  var n = a ? Math.min(b.length, a.length) : 0,
+      c = b.slice(),
+      i;
+  return function(t) {
+    for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;
+    return c;
+  };
+});
+
+function isNumberArray(x) {
+  return ArrayBuffer.isView(x) && !(x instanceof DataView);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/object.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/object.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _value_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./value.js */ "./node_modules/d3-interpolate/src/value.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  var i = {},
+      c = {},
+      k;
+
+  if (a === null || typeof a !== "object") a = {};
+  if (b === null || typeof b !== "object") b = {};
+
+  for (k in b) {
+    if (k in a) {
+      i[k] = Object(_value_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a[k], b[k]);
+    } else {
+      c[k] = b[k];
+    }
+  }
+
+  return function(t) {
+    for (k in i) c[k] = i[k](t);
+    return c;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/piecewise.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/piecewise.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return piecewise; });
+function piecewise(interpolate, values) {
+  var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);
+  while (i < n) I[i] = interpolate(v, v = values[++i]);
+  return function(t) {
+    var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));
+    return I[i](t - i);
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/quantize.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/quantize.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(interpolator, n) {
+  var samples = new Array(n);
+  for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
+  return samples;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/rgb.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/rgb.js ***!
+  \************************************************/
+/*! exports provided: default, rgbBasis, rgbBasisClosed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbBasis", function() { return rgbBasis; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbBasisClosed", function() { return rgbBasisClosed; });
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony import */ var _basis_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./basis.js */ "./node_modules/d3-interpolate/src/basis.js");
+/* harmony import */ var _basisClosed_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./basisClosed.js */ "./node_modules/d3-interpolate/src/basisClosed.js");
+/* harmony import */ var _color_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./color.js */ "./node_modules/d3-interpolate/src/color.js");
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = ((function rgbGamma(y) {
+  var color = Object(_color_js__WEBPACK_IMPORTED_MODULE_3__["gamma"])(y);
+
+  function rgb(start, end) {
+    var r = color((start = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["rgb"])(start)).r, (end = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["rgb"])(end)).r),
+        g = color(start.g, end.g),
+        b = color(start.b, end.b),
+        opacity = Object(_color_js__WEBPACK_IMPORTED_MODULE_3__["default"])(start.opacity, end.opacity);
+    return function(t) {
+      start.r = r(t);
+      start.g = g(t);
+      start.b = b(t);
+      start.opacity = opacity(t);
+      return start + "";
+    };
+  }
+
+  rgb.gamma = rgbGamma;
+
+  return rgb;
+})(1));
+
+function rgbSpline(spline) {
+  return function(colors) {
+    var n = colors.length,
+        r = new Array(n),
+        g = new Array(n),
+        b = new Array(n),
+        i, color;
+    for (i = 0; i < n; ++i) {
+      color = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["rgb"])(colors[i]);
+      r[i] = color.r || 0;
+      g[i] = color.g || 0;
+      b[i] = color.b || 0;
+    }
+    r = spline(r);
+    g = spline(g);
+    b = spline(b);
+    color.opacity = 1;
+    return function(t) {
+      color.r = r(t);
+      color.g = g(t);
+      color.b = b(t);
+      return color + "";
+    };
+  };
+}
+
+var rgbBasis = rgbSpline(_basis_js__WEBPACK_IMPORTED_MODULE_1__["default"]);
+var rgbBasisClosed = rgbSpline(_basisClosed_js__WEBPACK_IMPORTED_MODULE_2__["default"]);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/round.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/round.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  return a = +a, b = +b, function(t) {
+    return Math.round(a * (1 - t) + b * t);
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/string.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/string.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _number_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./number.js */ "./node_modules/d3-interpolate/src/number.js");
+
+
+var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
+    reB = new RegExp(reA.source, "g");
+
+function zero(b) {
+  return function() {
+    return b;
+  };
+}
+
+function one(b) {
+  return function(t) {
+    return b(t) + "";
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
+      am, // current match in a
+      bm, // current match in b
+      bs, // string preceding current number in b, if any
+      i = -1, // index in s
+      s = [], // string constants and placeholders
+      q = []; // number interpolators
+
+  // Coerce inputs to strings.
+  a = a + "", b = b + "";
+
+  // Interpolate pairs of numbers in a & b.
+  while ((am = reA.exec(a))
+      && (bm = reB.exec(b))) {
+    if ((bs = bm.index) > bi) { // a string precedes the next number in b
+      bs = b.slice(bi, bs);
+      if (s[i]) s[i] += bs; // coalesce with previous string
+      else s[++i] = bs;
+    }
+    if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
+      if (s[i]) s[i] += bm; // coalesce with previous string
+      else s[++i] = bm;
+    } else { // interpolate non-matching numbers
+      s[++i] = null;
+      q.push({i: i, x: Object(_number_js__WEBPACK_IMPORTED_MODULE_0__["default"])(am, bm)});
+    }
+    bi = reB.lastIndex;
+  }
+
+  // Add remains of b.
+  if (bi < b.length) {
+    bs = b.slice(bi);
+    if (s[i]) s[i] += bs; // coalesce with previous string
+    else s[++i] = bs;
+  }
+
+  // Special optimization for only a single match.
+  // Otherwise, interpolate each of the numbers and rejoin the string.
+  return s.length < 2 ? (q[0]
+      ? one(q[0].x)
+      : zero(b))
+      : (b = q.length, function(t) {
+          for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
+          return s.join("");
+        });
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/transform/decompose.js":
+/*!****************************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/transform/decompose.js ***!
+  \****************************************************************/
+/*! exports provided: identity, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; });
+var degrees = 180 / Math.PI;
+
+var identity = {
+  translateX: 0,
+  translateY: 0,
+  rotate: 0,
+  skewX: 0,
+  scaleX: 1,
+  scaleY: 1
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b, c, d, e, f) {
+  var scaleX, scaleY, skewX;
+  if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
+  if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
+  if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
+  if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
+  return {
+    translateX: e,
+    translateY: f,
+    rotate: Math.atan2(b, a) * degrees,
+    skewX: Math.atan(skewX) * degrees,
+    scaleX: scaleX,
+    scaleY: scaleY
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/transform/index.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/transform/index.js ***!
+  \************************************************************/
+/*! exports provided: interpolateTransformCss, interpolateTransformSvg */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformCss", function() { return interpolateTransformCss; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformSvg", function() { return interpolateTransformSvg; });
+/* harmony import */ var _number_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../number.js */ "./node_modules/d3-interpolate/src/number.js");
+/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parse.js */ "./node_modules/d3-interpolate/src/transform/parse.js");
+
+
+
+function interpolateTransform(parse, pxComma, pxParen, degParen) {
+
+  function pop(s) {
+    return s.length ? s.pop() + " " : "";
+  }
+
+  function translate(xa, ya, xb, yb, s, q) {
+    if (xa !== xb || ya !== yb) {
+      var i = s.push("translate(", null, pxComma, null, pxParen);
+      q.push({i: i - 4, x: Object(_number_js__WEBPACK_IMPORTED_MODULE_0__["default"])(xa, xb)}, {i: i - 2, x: Object(_number_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ya, yb)});
+    } else if (xb || yb) {
+      s.push("translate(" + xb + pxComma + yb + pxParen);
+    }
+  }
+
+  function rotate(a, b, s, q) {
+    if (a !== b) {
+      if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
+      q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: Object(_number_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a, b)});
+    } else if (b) {
+      s.push(pop(s) + "rotate(" + b + degParen);
+    }
+  }
+
+  function skewX(a, b, s, q) {
+    if (a !== b) {
+      q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: Object(_number_js__WEBPACK_IMPORTED_MODULE_0__["default"])(a, b)});
+    } else if (b) {
+      s.push(pop(s) + "skewX(" + b + degParen);
+    }
+  }
+
+  function scale(xa, ya, xb, yb, s, q) {
+    if (xa !== xb || ya !== yb) {
+      var i = s.push(pop(s) + "scale(", null, ",", null, ")");
+      q.push({i: i - 4, x: Object(_number_js__WEBPACK_IMPORTED_MODULE_0__["default"])(xa, xb)}, {i: i - 2, x: Object(_number_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ya, yb)});
+    } else if (xb !== 1 || yb !== 1) {
+      s.push(pop(s) + "scale(" + xb + "," + yb + ")");
+    }
+  }
+
+  return function(a, b) {
+    var s = [], // string constants and placeholders
+        q = []; // number interpolators
+    a = parse(a), b = parse(b);
+    translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
+    rotate(a.rotate, b.rotate, s, q);
+    skewX(a.skewX, b.skewX, s, q);
+    scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
+    a = b = null; // gc
+    return function(t) {
+      var i = -1, n = q.length, o;
+      while (++i < n) s[(o = q[i]).i] = o.x(t);
+      return s.join("");
+    };
+  };
+}
+
+var interpolateTransformCss = interpolateTransform(_parse_js__WEBPACK_IMPORTED_MODULE_1__["parseCss"], "px, ", "px)", "deg)");
+var interpolateTransformSvg = interpolateTransform(_parse_js__WEBPACK_IMPORTED_MODULE_1__["parseSvg"], ", ", ")", ")");
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/transform/parse.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/transform/parse.js ***!
+  \************************************************************/
+/*! exports provided: parseCss, parseSvg */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseCss", function() { return parseCss; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseSvg", function() { return parseSvg; });
+/* harmony import */ var _decompose_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./decompose.js */ "./node_modules/d3-interpolate/src/transform/decompose.js");
+
+
+var cssNode,
+    cssRoot,
+    cssView,
+    svgNode;
+
+function parseCss(value) {
+  if (value === "none") return _decompose_js__WEBPACK_IMPORTED_MODULE_0__["identity"];
+  if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
+  cssNode.style.transform = value;
+  value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
+  cssRoot.removeChild(cssNode);
+  value = value.slice(7, -1).split(",");
+  return Object(_decompose_js__WEBPACK_IMPORTED_MODULE_0__["default"])(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
+}
+
+function parseSvg(value) {
+  if (value == null) return _decompose_js__WEBPACK_IMPORTED_MODULE_0__["identity"];
+  if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
+  svgNode.setAttribute("transform", value);
+  if (!(value = svgNode.transform.baseVal.consolidate())) return _decompose_js__WEBPACK_IMPORTED_MODULE_0__["identity"];
+  value = value.matrix;
+  return Object(_decompose_js__WEBPACK_IMPORTED_MODULE_0__["default"])(value.a, value.b, value.c, value.d, value.e, value.f);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/value.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/value.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony import */ var _rgb_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rgb.js */ "./node_modules/d3-interpolate/src/rgb.js");
+/* harmony import */ var _array_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./array.js */ "./node_modules/d3-interpolate/src/array.js");
+/* harmony import */ var _date_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./date.js */ "./node_modules/d3-interpolate/src/date.js");
+/* harmony import */ var _number_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./number.js */ "./node_modules/d3-interpolate/src/number.js");
+/* harmony import */ var _object_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./object.js */ "./node_modules/d3-interpolate/src/object.js");
+/* harmony import */ var _string_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./string.js */ "./node_modules/d3-interpolate/src/string.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-interpolate/src/constant.js");
+/* harmony import */ var _numberArray_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./numberArray.js */ "./node_modules/d3-interpolate/src/numberArray.js");
+
+
+
+
+
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  var t = typeof b, c;
+  return b == null || t === "boolean" ? Object(_constant_js__WEBPACK_IMPORTED_MODULE_7__["default"])(b)
+      : (t === "number" ? _number_js__WEBPACK_IMPORTED_MODULE_4__["default"]
+      : t === "string" ? ((c = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["color"])(b)) ? (b = c, _rgb_js__WEBPACK_IMPORTED_MODULE_1__["default"]) : _string_js__WEBPACK_IMPORTED_MODULE_6__["default"])
+      : b instanceof d3_color__WEBPACK_IMPORTED_MODULE_0__["color"] ? _rgb_js__WEBPACK_IMPORTED_MODULE_1__["default"]
+      : b instanceof Date ? _date_js__WEBPACK_IMPORTED_MODULE_3__["default"]
+      : Object(_numberArray_js__WEBPACK_IMPORTED_MODULE_8__["isNumberArray"])(b) ? _numberArray_js__WEBPACK_IMPORTED_MODULE_8__["default"]
+      : Array.isArray(b) ? _array_js__WEBPACK_IMPORTED_MODULE_2__["genericArray"]
+      : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? _object_js__WEBPACK_IMPORTED_MODULE_5__["default"]
+      : _number_js__WEBPACK_IMPORTED_MODULE_4__["default"])(a, b);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-interpolate/src/zoom.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-interpolate/src/zoom.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var rho = Math.SQRT2,
+    rho2 = 2,
+    rho4 = 4,
+    epsilon2 = 1e-12;
+
+function cosh(x) {
+  return ((x = Math.exp(x)) + 1 / x) / 2;
+}
+
+function sinh(x) {
+  return ((x = Math.exp(x)) - 1 / x) / 2;
+}
+
+function tanh(x) {
+  return ((x = Math.exp(2 * x)) - 1) / (x + 1);
+}
+
+// p0 = [ux0, uy0, w0]
+// p1 = [ux1, uy1, w1]
+/* harmony default export */ __webpack_exports__["default"] = (function(p0, p1) {
+  var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
+      ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
+      dx = ux1 - ux0,
+      dy = uy1 - uy0,
+      d2 = dx * dx + dy * dy,
+      i,
+      S;
+
+  // Special case for u0 ≅ u1.
+  if (d2 < epsilon2) {
+    S = Math.log(w1 / w0) / rho;
+    i = function(t) {
+      return [
+        ux0 + t * dx,
+        uy0 + t * dy,
+        w0 * Math.exp(rho * t * S)
+      ];
+    }
+  }
+
+  // General case.
+  else {
+    var d1 = Math.sqrt(d2),
+        b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
+        b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
+        r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
+        r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
+    S = (r1 - r0) / rho;
+    i = function(t) {
+      var s = t * S,
+          coshr0 = cosh(r0),
+          u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
+      return [
+        ux0 + u * dx,
+        uy0 + u * dy,
+        w0 * coshr0 / cosh(rho * s + r0)
+      ];
+    }
+  }
+
+  i.duration = S * 1000;
+
+  return i;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-path/src/index.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-path/src/index.js ***!
+  \*******************************************/
+/*! exports provided: path */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./path.js */ "./node_modules/d3-path/src/path.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "path", function() { return _path_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-path/src/path.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-path/src/path.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var pi = Math.PI,
+    tau = 2 * pi,
+    epsilon = 1e-6,
+    tauEpsilon = tau - epsilon;
+
+function Path() {
+  this._x0 = this._y0 = // start of current subpath
+  this._x1 = this._y1 = null; // end of current subpath
+  this._ = "";
+}
+
+function path() {
+  return new Path;
+}
+
+Path.prototype = path.prototype = {
+  constructor: Path,
+  moveTo: function(x, y) {
+    this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
+  },
+  closePath: function() {
+    if (this._x1 !== null) {
+      this._x1 = this._x0, this._y1 = this._y0;
+      this._ += "Z";
+    }
+  },
+  lineTo: function(x, y) {
+    this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
+  },
+  quadraticCurveTo: function(x1, y1, x, y) {
+    this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
+  },
+  bezierCurveTo: function(x1, y1, x2, y2, x, y) {
+    this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
+  },
+  arcTo: function(x1, y1, x2, y2, r) {
+    x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
+    var x0 = this._x1,
+        y0 = this._y1,
+        x21 = x2 - x1,
+        y21 = y2 - y1,
+        x01 = x0 - x1,
+        y01 = y0 - y1,
+        l01_2 = x01 * x01 + y01 * y01;
+
+    // Is the radius negative? Error.
+    if (r < 0) throw new Error("negative radius: " + r);
+
+    // Is this path empty? Move to (x1,y1).
+    if (this._x1 === null) {
+      this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
+    }
+
+    // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
+    else if (!(l01_2 > epsilon));
+
+    // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
+    // Equivalently, is (x1,y1) coincident with (x2,y2)?
+    // Or, is the radius zero? Line to (x1,y1).
+    else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {
+      this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
+    }
+
+    // Otherwise, draw an arc!
+    else {
+      var x20 = x2 - x0,
+          y20 = y2 - y0,
+          l21_2 = x21 * x21 + y21 * y21,
+          l20_2 = x20 * x20 + y20 * y20,
+          l21 = Math.sqrt(l21_2),
+          l01 = Math.sqrt(l01_2),
+          l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
+          t01 = l / l01,
+          t21 = l / l21;
+
+      // If the start tangent is not coincident with (x0,y0), line to.
+      if (Math.abs(t01 - 1) > epsilon) {
+        this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
+      }
+
+      this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
+    }
+  },
+  arc: function(x, y, r, a0, a1, ccw) {
+    x = +x, y = +y, r = +r, ccw = !!ccw;
+    var dx = r * Math.cos(a0),
+        dy = r * Math.sin(a0),
+        x0 = x + dx,
+        y0 = y + dy,
+        cw = 1 ^ ccw,
+        da = ccw ? a0 - a1 : a1 - a0;
+
+    // Is the radius negative? Error.
+    if (r < 0) throw new Error("negative radius: " + r);
+
+    // Is this path empty? Move to (x0,y0).
+    if (this._x1 === null) {
+      this._ += "M" + x0 + "," + y0;
+    }
+
+    // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
+    else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {
+      this._ += "L" + x0 + "," + y0;
+    }
+
+    // Is this arc empty? We’re done.
+    if (!r) return;
+
+    // Does the angle go the wrong way? Flip the direction.
+    if (da < 0) da = da % tau + tau;
+
+    // Is this a complete circle? Draw two arcs to complete the circle.
+    if (da > tauEpsilon) {
+      this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
+    }
+
+    // Is this arc non-empty? Draw an arc!
+    else if (da > epsilon) {
+      this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
+    }
+  },
+  rect: function(x, y, w, h) {
+    this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
+  },
+  toString: function() {
+    return this._;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (path);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-polygon/src/area.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-polygon/src/area.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(polygon) {
+  var i = -1,
+      n = polygon.length,
+      a,
+      b = polygon[n - 1],
+      area = 0;
+
+  while (++i < n) {
+    a = b;
+    b = polygon[i];
+    area += a[1] * b[0] - a[0] * b[1];
+  }
+
+  return area / 2;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-polygon/src/centroid.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-polygon/src/centroid.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(polygon) {
+  var i = -1,
+      n = polygon.length,
+      x = 0,
+      y = 0,
+      a,
+      b = polygon[n - 1],
+      c,
+      k = 0;
+
+  while (++i < n) {
+    a = b;
+    b = polygon[i];
+    k += c = a[0] * b[1] - b[0] * a[1];
+    x += (a[0] + b[0]) * c;
+    y += (a[1] + b[1]) * c;
+  }
+
+  return k *= 3, [x / k, y / k];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-polygon/src/contains.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-polygon/src/contains.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(polygon, point) {
+  var n = polygon.length,
+      p = polygon[n - 1],
+      x = point[0], y = point[1],
+      x0 = p[0], y0 = p[1],
+      x1, y1,
+      inside = false;
+
+  for (var i = 0; i < n; ++i) {
+    p = polygon[i], x1 = p[0], y1 = p[1];
+    if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
+    x0 = x1, y0 = y1;
+  }
+
+  return inside;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-polygon/src/cross.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-polygon/src/cross.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
+// the 3D cross product in a quadrant I Cartesian coordinate system (+x is
+// right, +y is up). Returns a positive value if ABC is counter-clockwise,
+// negative if clockwise, and zero if the points are collinear.
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b, c) {
+  return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-polygon/src/hull.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-polygon/src/hull.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _cross_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cross.js */ "./node_modules/d3-polygon/src/cross.js");
+
+
+function lexicographicOrder(a, b) {
+  return a[0] - b[0] || a[1] - b[1];
+}
+
+// Computes the upper convex hull per the monotone chain algorithm.
+// Assumes points.length >= 3, is sorted by x, unique in y.
+// Returns an array of indices into points in left-to-right order.
+function computeUpperHullIndexes(points) {
+  var n = points.length,
+      indexes = [0, 1],
+      size = 2;
+
+  for (var i = 2; i < n; ++i) {
+    while (size > 1 && Object(_cross_js__WEBPACK_IMPORTED_MODULE_0__["default"])(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
+    indexes[size++] = i;
+  }
+
+  return indexes.slice(0, size); // remove popped points
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(points) {
+  if ((n = points.length) < 3) return null;
+
+  var i,
+      n,
+      sortedPoints = new Array(n),
+      flippedPoints = new Array(n);
+
+  for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
+  sortedPoints.sort(lexicographicOrder);
+  for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
+
+  var upperIndexes = computeUpperHullIndexes(sortedPoints),
+      lowerIndexes = computeUpperHullIndexes(flippedPoints);
+
+  // Construct the hull polygon, removing possible duplicate endpoints.
+  var skipLeft = lowerIndexes[0] === upperIndexes[0],
+      skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
+      hull = [];
+
+  // Add upper hull in right-to-l order.
+  // Then add lower hull in left-to-right order.
+  for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
+  for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
+
+  return hull;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-polygon/src/index.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-polygon/src/index.js ***!
+  \**********************************************/
+/*! exports provided: polygonArea, polygonCentroid, polygonHull, polygonContains, polygonLength */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _area_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./area.js */ "./node_modules/d3-polygon/src/area.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonArea", function() { return _area_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _centroid_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./centroid.js */ "./node_modules/d3-polygon/src/centroid.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonCentroid", function() { return _centroid_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _hull_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./hull.js */ "./node_modules/d3-polygon/src/hull.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonHull", function() { return _hull_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _contains_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./contains.js */ "./node_modules/d3-polygon/src/contains.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonContains", function() { return _contains_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _length_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./length.js */ "./node_modules/d3-polygon/src/length.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonLength", function() { return _length_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-polygon/src/length.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-polygon/src/length.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(polygon) {
+  var i = -1,
+      n = polygon.length,
+      b = polygon[n - 1],
+      xa,
+      ya,
+      xb = b[0],
+      yb = b[1],
+      perimeter = 0;
+
+  while (++i < n) {
+    xa = xb;
+    ya = yb;
+    b = polygon[i];
+    xb = b[0];
+    yb = b[1];
+    xa -= xb;
+    ya -= yb;
+    perimeter += Math.sqrt(xa * xa + ya * ya);
+  }
+
+  return perimeter;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/add.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-quadtree/src/add.js ***!
+  \*********************************************/
+/*! exports provided: default, addAll */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addAll", function() { return addAll; });
+/* harmony default export */ __webpack_exports__["default"] = (function(d) {
+  var x = +this._x.call(null, d),
+      y = +this._y.call(null, d);
+  return add(this.cover(x, y), x, y, d);
+});
+
+function add(tree, x, y, d) {
+  if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
+
+  var parent,
+      node = tree._root,
+      leaf = {data: d},
+      x0 = tree._x0,
+      y0 = tree._y0,
+      x1 = tree._x1,
+      y1 = tree._y1,
+      xm,
+      ym,
+      xp,
+      yp,
+      right,
+      bottom,
+      i,
+      j;
+
+  // If the tree is empty, initialize the root as a leaf.
+  if (!node) return tree._root = leaf, tree;
+
+  // Find the existing leaf for the new point, or add it.
+  while (node.length) {
+    if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
+    if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
+    if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
+  }
+
+  // Is the new point is exactly coincident with the existing point?
+  xp = +tree._x.call(null, node.data);
+  yp = +tree._y.call(null, node.data);
+  if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
+
+  // Otherwise, split the leaf node until the old and new point are separated.
+  do {
+    parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
+    if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
+    if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
+  } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
+  return parent[j] = node, parent[i] = leaf, tree;
+}
+
+function addAll(data) {
+  var d, i, n = data.length,
+      x,
+      y,
+      xz = new Array(n),
+      yz = new Array(n),
+      x0 = Infinity,
+      y0 = Infinity,
+      x1 = -Infinity,
+      y1 = -Infinity;
+
+  // Compute the points and their extent.
+  for (i = 0; i < n; ++i) {
+    if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
+    xz[i] = x;
+    yz[i] = y;
+    if (x < x0) x0 = x;
+    if (x > x1) x1 = x;
+    if (y < y0) y0 = y;
+    if (y > y1) y1 = y;
+  }
+
+  // If there were no (valid) points, abort.
+  if (x0 > x1 || y0 > y1) return this;
+
+  // Expand the tree to cover the new points.
+  this.cover(x0, y0).cover(x1, y1);
+
+  // Add the new points.
+  for (i = 0; i < n; ++i) {
+    add(this, xz[i], yz[i], data[i]);
+  }
+
+  return this;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/cover.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-quadtree/src/cover.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x, y) {
+  if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
+
+  var x0 = this._x0,
+      y0 = this._y0,
+      x1 = this._x1,
+      y1 = this._y1;
+
+  // If the quadtree has no extent, initialize them.
+  // Integer extent are necessary so that if we later double the extent,
+  // the existing quadrant boundaries don’t change due to floating point error!
+  if (isNaN(x0)) {
+    x1 = (x0 = Math.floor(x)) + 1;
+    y1 = (y0 = Math.floor(y)) + 1;
+  }
+
+  // Otherwise, double repeatedly to cover.
+  else {
+    var z = x1 - x0,
+        node = this._root,
+        parent,
+        i;
+
+    while (x0 > x || x >= x1 || y0 > y || y >= y1) {
+      i = (y < y0) << 1 | (x < x0);
+      parent = new Array(4), parent[i] = node, node = parent, z *= 2;
+      switch (i) {
+        case 0: x1 = x0 + z, y1 = y0 + z; break;
+        case 1: x0 = x1 - z, y1 = y0 + z; break;
+        case 2: x1 = x0 + z, y0 = y1 - z; break;
+        case 3: x0 = x1 - z, y0 = y1 - z; break;
+      }
+    }
+
+    if (this._root && this._root.length) this._root = node;
+  }
+
+  this._x0 = x0;
+  this._y0 = y0;
+  this._x1 = x1;
+  this._y1 = y1;
+  return this;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/data.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-quadtree/src/data.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var data = [];
+  this.visit(function(node) {
+    if (!node.length) do data.push(node.data); while (node = node.next)
+  });
+  return data;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/extent.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-quadtree/src/extent.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(_) {
+  return arguments.length
+      ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
+      : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/find.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-quadtree/src/find.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _quad_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./quad.js */ "./node_modules/d3-quadtree/src/quad.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(x, y, radius) {
+  var data,
+      x0 = this._x0,
+      y0 = this._y0,
+      x1,
+      y1,
+      x2,
+      y2,
+      x3 = this._x1,
+      y3 = this._y1,
+      quads = [],
+      node = this._root,
+      q,
+      i;
+
+  if (node) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](node, x0, y0, x3, y3));
+  if (radius == null) radius = Infinity;
+  else {
+    x0 = x - radius, y0 = y - radius;
+    x3 = x + radius, y3 = y + radius;
+    radius *= radius;
+  }
+
+  while (q = quads.pop()) {
+
+    // Stop searching if this quadrant can’t contain a closer node.
+    if (!(node = q.node)
+        || (x1 = q.x0) > x3
+        || (y1 = q.y0) > y3
+        || (x2 = q.x1) < x0
+        || (y2 = q.y1) < y0) continue;
+
+    // Bisect the current quadrant.
+    if (node.length) {
+      var xm = (x1 + x2) / 2,
+          ym = (y1 + y2) / 2;
+
+      quads.push(
+        new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](node[3], xm, ym, x2, y2),
+        new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](node[2], x1, ym, xm, y2),
+        new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](node[1], xm, y1, x2, ym),
+        new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](node[0], x1, y1, xm, ym)
+      );
+
+      // Visit the closest quadrant first.
+      if (i = (y >= ym) << 1 | (x >= xm)) {
+        q = quads[quads.length - 1];
+        quads[quads.length - 1] = quads[quads.length - 1 - i];
+        quads[quads.length - 1 - i] = q;
+      }
+    }
+
+    // Visit this point. (Visiting coincident points isn’t necessary!)
+    else {
+      var dx = x - +this._x.call(null, node.data),
+          dy = y - +this._y.call(null, node.data),
+          d2 = dx * dx + dy * dy;
+      if (d2 < radius) {
+        var d = Math.sqrt(radius = d2);
+        x0 = x - d, y0 = y - d;
+        x3 = x + d, y3 = y + d;
+        data = node.data;
+      }
+    }
+  }
+
+  return data;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/index.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-quadtree/src/index.js ***!
+  \***********************************************/
+/*! exports provided: quadtree */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _quadtree_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./quadtree.js */ "./node_modules/d3-quadtree/src/quadtree.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "quadtree", function() { return _quadtree_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/quad.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-quadtree/src/quad.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(node, x0, y0, x1, y1) {
+  this.node = node;
+  this.x0 = x0;
+  this.y0 = y0;
+  this.x1 = x1;
+  this.y1 = y1;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/quadtree.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-quadtree/src/quadtree.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return quadtree; });
+/* harmony import */ var _add_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./add.js */ "./node_modules/d3-quadtree/src/add.js");
+/* harmony import */ var _cover_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cover.js */ "./node_modules/d3-quadtree/src/cover.js");
+/* harmony import */ var _data_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./data.js */ "./node_modules/d3-quadtree/src/data.js");
+/* harmony import */ var _extent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./extent.js */ "./node_modules/d3-quadtree/src/extent.js");
+/* harmony import */ var _find_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./find.js */ "./node_modules/d3-quadtree/src/find.js");
+/* harmony import */ var _remove_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./remove.js */ "./node_modules/d3-quadtree/src/remove.js");
+/* harmony import */ var _root_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./root.js */ "./node_modules/d3-quadtree/src/root.js");
+/* harmony import */ var _size_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./size.js */ "./node_modules/d3-quadtree/src/size.js");
+/* harmony import */ var _visit_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./visit.js */ "./node_modules/d3-quadtree/src/visit.js");
+/* harmony import */ var _visitAfter_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./visitAfter.js */ "./node_modules/d3-quadtree/src/visitAfter.js");
+/* harmony import */ var _x_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./x.js */ "./node_modules/d3-quadtree/src/x.js");
+/* harmony import */ var _y_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./y.js */ "./node_modules/d3-quadtree/src/y.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+function quadtree(nodes, x, y) {
+  var tree = new Quadtree(x == null ? _x_js__WEBPACK_IMPORTED_MODULE_10__["defaultX"] : x, y == null ? _y_js__WEBPACK_IMPORTED_MODULE_11__["defaultY"] : y, NaN, NaN, NaN, NaN);
+  return nodes == null ? tree : tree.addAll(nodes);
+}
+
+function Quadtree(x, y, x0, y0, x1, y1) {
+  this._x = x;
+  this._y = y;
+  this._x0 = x0;
+  this._y0 = y0;
+  this._x1 = x1;
+  this._y1 = y1;
+  this._root = undefined;
+}
+
+function leaf_copy(leaf) {
+  var copy = {data: leaf.data}, next = copy;
+  while (leaf = leaf.next) next = next.next = {data: leaf.data};
+  return copy;
+}
+
+var treeProto = quadtree.prototype = Quadtree.prototype;
+
+treeProto.copy = function() {
+  var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
+      node = this._root,
+      nodes,
+      child;
+
+  if (!node) return copy;
+
+  if (!node.length) return copy._root = leaf_copy(node), copy;
+
+  nodes = [{source: node, target: copy._root = new Array(4)}];
+  while (node = nodes.pop()) {
+    for (var i = 0; i < 4; ++i) {
+      if (child = node.source[i]) {
+        if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
+        else node.target[i] = leaf_copy(child);
+      }
+    }
+  }
+
+  return copy;
+};
+
+treeProto.add = _add_js__WEBPACK_IMPORTED_MODULE_0__["default"];
+treeProto.addAll = _add_js__WEBPACK_IMPORTED_MODULE_0__["addAll"];
+treeProto.cover = _cover_js__WEBPACK_IMPORTED_MODULE_1__["default"];
+treeProto.data = _data_js__WEBPACK_IMPORTED_MODULE_2__["default"];
+treeProto.extent = _extent_js__WEBPACK_IMPORTED_MODULE_3__["default"];
+treeProto.find = _find_js__WEBPACK_IMPORTED_MODULE_4__["default"];
+treeProto.remove = _remove_js__WEBPACK_IMPORTED_MODULE_5__["default"];
+treeProto.removeAll = _remove_js__WEBPACK_IMPORTED_MODULE_5__["removeAll"];
+treeProto.root = _root_js__WEBPACK_IMPORTED_MODULE_6__["default"];
+treeProto.size = _size_js__WEBPACK_IMPORTED_MODULE_7__["default"];
+treeProto.visit = _visit_js__WEBPACK_IMPORTED_MODULE_8__["default"];
+treeProto.visitAfter = _visitAfter_js__WEBPACK_IMPORTED_MODULE_9__["default"];
+treeProto.x = _x_js__WEBPACK_IMPORTED_MODULE_10__["default"];
+treeProto.y = _y_js__WEBPACK_IMPORTED_MODULE_11__["default"];
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/remove.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-quadtree/src/remove.js ***!
+  \************************************************/
+/*! exports provided: default, removeAll */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeAll", function() { return removeAll; });
+/* harmony default export */ __webpack_exports__["default"] = (function(d) {
+  if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
+
+  var parent,
+      node = this._root,
+      retainer,
+      previous,
+      next,
+      x0 = this._x0,
+      y0 = this._y0,
+      x1 = this._x1,
+      y1 = this._y1,
+      x,
+      y,
+      xm,
+      ym,
+      right,
+      bottom,
+      i,
+      j;
+
+  // If the tree is empty, initialize the root as a leaf.
+  if (!node) return this;
+
+  // Find the leaf node for the point.
+  // While descending, also retain the deepest parent with a non-removed sibling.
+  if (node.length) while (true) {
+    if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
+    if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
+    if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
+    if (!node.length) break;
+    if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
+  }
+
+  // Find the point to remove.
+  while (node.data !== d) if (!(previous = node, node = node.next)) return this;
+  if (next = node.next) delete node.next;
+
+  // If there are multiple coincident points, remove just the point.
+  if (previous) return (next ? previous.next = next : delete previous.next), this;
+
+  // If this is the root point, remove it.
+  if (!parent) return this._root = next, this;
+
+  // Remove this leaf.
+  next ? parent[i] = next : delete parent[i];
+
+  // If the parent now contains exactly one leaf, collapse superfluous parents.
+  if ((node = parent[0] || parent[1] || parent[2] || parent[3])
+      && node === (parent[3] || parent[2] || parent[1] || parent[0])
+      && !node.length) {
+    if (retainer) retainer[j] = node;
+    else this._root = node;
+  }
+
+  return this;
+});
+
+function removeAll(data) {
+  for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
+  return this;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/root.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-quadtree/src/root.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return this._root;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/size.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-quadtree/src/size.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var size = 0;
+  this.visit(function(node) {
+    if (!node.length) do ++size; while (node = node.next)
+  });
+  return size;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/visit.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-quadtree/src/visit.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _quad_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./quad.js */ "./node_modules/d3-quadtree/src/quad.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
+  var quads = [], q, node = this._root, child, x0, y0, x1, y1;
+  if (node) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](node, this._x0, this._y0, this._x1, this._y1));
+  while (q = quads.pop()) {
+    if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
+      var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
+      if (child = node[3]) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](child, xm, ym, x1, y1));
+      if (child = node[2]) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](child, x0, ym, xm, y1));
+      if (child = node[1]) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](child, xm, y0, x1, ym));
+      if (child = node[0]) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](child, x0, y0, xm, ym));
+    }
+  }
+  return this;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/visitAfter.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-quadtree/src/visitAfter.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _quad_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./quad.js */ "./node_modules/d3-quadtree/src/quad.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
+  var quads = [], next = [], q;
+  if (this._root) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](this._root, this._x0, this._y0, this._x1, this._y1));
+  while (q = quads.pop()) {
+    var node = q.node;
+    if (node.length) {
+      var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
+      if (child = node[0]) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](child, x0, y0, xm, ym));
+      if (child = node[1]) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](child, xm, y0, x1, ym));
+      if (child = node[2]) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](child, x0, ym, xm, y1));
+      if (child = node[3]) quads.push(new _quad_js__WEBPACK_IMPORTED_MODULE_0__["default"](child, xm, ym, x1, y1));
+    }
+    next.push(q);
+  }
+  while (q = next.pop()) {
+    callback(q.node, q.x0, q.y0, q.x1, q.y1);
+  }
+  return this;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/x.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-quadtree/src/x.js ***!
+  \*******************************************/
+/*! exports provided: defaultX, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultX", function() { return defaultX; });
+function defaultX(d) {
+  return d[0];
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(_) {
+  return arguments.length ? (this._x = _, this) : this._x;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-quadtree/src/y.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-quadtree/src/y.js ***!
+  \*******************************************/
+/*! exports provided: defaultY, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultY", function() { return defaultY; });
+function defaultY(d) {
+  return d[1];
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(_) {
+  return arguments.length ? (this._y = _, this) : this._y;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-random/src/bates.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-random/src/bates.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _defaultSource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultSource */ "./node_modules/d3-random/src/defaultSource.js");
+/* harmony import */ var _irwinHall__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./irwinHall */ "./node_modules/d3-random/src/irwinHall.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = ((function sourceRandomBates(source) {
+  function randomBates(n) {
+    var randomIrwinHall = _irwinHall__WEBPACK_IMPORTED_MODULE_1__["default"].source(source)(n);
+    return function() {
+      return randomIrwinHall() / n;
+    };
+  }
+
+  randomBates.source = sourceRandomBates;
+
+  return randomBates;
+})(_defaultSource__WEBPACK_IMPORTED_MODULE_0__["default"]));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-random/src/defaultSource.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-random/src/defaultSource.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return Math.random();
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-random/src/exponential.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-random/src/exponential.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _defaultSource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultSource */ "./node_modules/d3-random/src/defaultSource.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = ((function sourceRandomExponential(source) {
+  function randomExponential(lambda) {
+    return function() {
+      return -Math.log(1 - source()) / lambda;
+    };
+  }
+
+  randomExponential.source = sourceRandomExponential;
+
+  return randomExponential;
+})(_defaultSource__WEBPACK_IMPORTED_MODULE_0__["default"]));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-random/src/index.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-random/src/index.js ***!
+  \*********************************************/
+/*! exports provided: randomUniform, randomNormal, randomLogNormal, randomBates, randomIrwinHall, randomExponential */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _uniform__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./uniform */ "./node_modules/d3-random/src/uniform.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomUniform", function() { return _uniform__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _normal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./normal */ "./node_modules/d3-random/src/normal.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomNormal", function() { return _normal__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _logNormal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./logNormal */ "./node_modules/d3-random/src/logNormal.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomLogNormal", function() { return _logNormal__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _bates__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bates */ "./node_modules/d3-random/src/bates.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomBates", function() { return _bates__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _irwinHall__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./irwinHall */ "./node_modules/d3-random/src/irwinHall.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomIrwinHall", function() { return _irwinHall__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _exponential__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./exponential */ "./node_modules/d3-random/src/exponential.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomExponential", function() { return _exponential__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-random/src/irwinHall.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-random/src/irwinHall.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _defaultSource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultSource */ "./node_modules/d3-random/src/defaultSource.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = ((function sourceRandomIrwinHall(source) {
+  function randomIrwinHall(n) {
+    return function() {
+      for (var sum = 0, i = 0; i < n; ++i) sum += source();
+      return sum;
+    };
+  }
+
+  randomIrwinHall.source = sourceRandomIrwinHall;
+
+  return randomIrwinHall;
+})(_defaultSource__WEBPACK_IMPORTED_MODULE_0__["default"]));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-random/src/logNormal.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-random/src/logNormal.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _defaultSource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultSource */ "./node_modules/d3-random/src/defaultSource.js");
+/* harmony import */ var _normal__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./normal */ "./node_modules/d3-random/src/normal.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = ((function sourceRandomLogNormal(source) {
+  function randomLogNormal() {
+    var randomNormal = _normal__WEBPACK_IMPORTED_MODULE_1__["default"].source(source).apply(this, arguments);
+    return function() {
+      return Math.exp(randomNormal());
+    };
+  }
+
+  randomLogNormal.source = sourceRandomLogNormal;
+
+  return randomLogNormal;
+})(_defaultSource__WEBPACK_IMPORTED_MODULE_0__["default"]));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-random/src/normal.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-random/src/normal.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _defaultSource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultSource */ "./node_modules/d3-random/src/defaultSource.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = ((function sourceRandomNormal(source) {
+  function randomNormal(mu, sigma) {
+    var x, r;
+    mu = mu == null ? 0 : +mu;
+    sigma = sigma == null ? 1 : +sigma;
+    return function() {
+      var y;
+
+      // If available, use the second previously-generated uniform random.
+      if (x != null) y = x, x = null;
+
+      // Otherwise, generate a new x and y.
+      else do {
+        x = source() * 2 - 1;
+        y = source() * 2 - 1;
+        r = x * x + y * y;
+      } while (!r || r > 1);
+
+      return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
+    };
+  }
+
+  randomNormal.source = sourceRandomNormal;
+
+  return randomNormal;
+})(_defaultSource__WEBPACK_IMPORTED_MODULE_0__["default"]));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-random/src/uniform.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-random/src/uniform.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _defaultSource__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultSource */ "./node_modules/d3-random/src/defaultSource.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = ((function sourceRandomUniform(source) {
+  function randomUniform(min, max) {
+    min = min == null ? 0 : +min;
+    max = max == null ? 1 : +max;
+    if (arguments.length === 1) max = min, min = 0;
+    else max -= min;
+    return function() {
+      return source() * max + min;
+    };
+  }
+
+  randomUniform.source = sourceRandomUniform;
+
+  return randomUniform;
+})(_defaultSource__WEBPACK_IMPORTED_MODULE_0__["default"]));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/Accent.js":
+/*!*******************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/Accent.js ***!
+  \*******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/Dark2.js":
+/*!******************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/Dark2.js ***!
+  \******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/Paired.js":
+/*!*******************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/Paired.js ***!
+  \*******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/Pastel1.js":
+/*!********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/Pastel1.js ***!
+  \********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/Pastel2.js":
+/*!********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/Pastel2.js ***!
+  \********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/Set1.js":
+/*!*****************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/Set1.js ***!
+  \*****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/Set2.js":
+/*!*****************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/Set2.js ***!
+  \*****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/Set3.js":
+/*!*****************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/Set3.js ***!
+  \*****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/Tableau10.js":
+/*!**********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/Tableau10.js ***!
+  \**********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/categorical/category10.js":
+/*!***********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/categorical/category10.js ***!
+  \***********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/colors.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/colors.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(specifier) {
+  var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;
+  while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6);
+  return colors;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/diverging/BrBG.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/diverging/BrBG.js ***!
+  \***************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "d8b365f5f5f55ab4ac",
+  "a6611adfc27d80cdc1018571",
+  "a6611adfc27df5f5f580cdc1018571",
+  "8c510ad8b365f6e8c3c7eae55ab4ac01665e",
+  "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e",
+  "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e",
+  "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e",
+  "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30",
+  "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/diverging/PRGn.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/diverging/PRGn.js ***!
+  \***************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "af8dc3f7f7f77fbf7b",
+  "7b3294c2a5cfa6dba0008837",
+  "7b3294c2a5cff7f7f7a6dba0008837",
+  "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837",
+  "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837",
+  "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837",
+  "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837",
+  "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b",
+  "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/diverging/PiYG.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/diverging/PiYG.js ***!
+  \***************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "e9a3c9f7f7f7a1d76a",
+  "d01c8bf1b6dab8e1864dac26",
+  "d01c8bf1b6daf7f7f7b8e1864dac26",
+  "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221",
+  "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221",
+  "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221",
+  "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221",
+  "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419",
+  "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/diverging/PuOr.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/diverging/PuOr.js ***!
+  \***************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "998ec3f7f7f7f1a340",
+  "5e3c99b2abd2fdb863e66101",
+  "5e3c99b2abd2f7f7f7fdb863e66101",
+  "542788998ec3d8daebfee0b6f1a340b35806",
+  "542788998ec3d8daebf7f7f7fee0b6f1a340b35806",
+  "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806",
+  "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806",
+  "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08",
+  "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/diverging/RdBu.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/diverging/RdBu.js ***!
+  \***************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "ef8a62f7f7f767a9cf",
+  "ca0020f4a58292c5de0571b0",
+  "ca0020f4a582f7f7f792c5de0571b0",
+  "b2182bef8a62fddbc7d1e5f067a9cf2166ac",
+  "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac",
+  "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac",
+  "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac",
+  "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061",
+  "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/diverging/RdGy.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/diverging/RdGy.js ***!
+  \***************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "ef8a62ffffff999999",
+  "ca0020f4a582bababa404040",
+  "ca0020f4a582ffffffbababa404040",
+  "b2182bef8a62fddbc7e0e0e09999994d4d4d",
+  "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d",
+  "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d",
+  "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d",
+  "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a",
+  "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js":
+/*!*****************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js ***!
+  \*****************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "fc8d59ffffbf91bfdb",
+  "d7191cfdae61abd9e92c7bb6",
+  "d7191cfdae61ffffbfabd9e92c7bb6",
+  "d73027fc8d59fee090e0f3f891bfdb4575b4",
+  "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4",
+  "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4",
+  "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4",
+  "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695",
+  "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js":
+/*!*****************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js ***!
+  \*****************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "fc8d59ffffbf91cf60",
+  "d7191cfdae61a6d96a1a9641",
+  "d7191cfdae61ffffbfa6d96a1a9641",
+  "d73027fc8d59fee08bd9ef8b91cf601a9850",
+  "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850",
+  "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850",
+  "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850",
+  "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837",
+  "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/diverging/Spectral.js":
+/*!*******************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/diverging/Spectral.js ***!
+  \*******************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "fc8d59ffffbf99d594",
+  "d7191cfdae61abdda42b83ba",
+  "d7191cfdae61ffffbfabdda42b83ba",
+  "d53e4ffc8d59fee08be6f59899d5943288bd",
+  "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd",
+  "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd",
+  "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd",
+  "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2",
+  "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/index.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/index.js ***!
+  \******************************************************/
+/*! exports provided: schemeCategory10, schemeAccent, schemeDark2, schemePaired, schemePastel1, schemePastel2, schemeSet1, schemeSet2, schemeSet3, schemeTableau10, interpolateBrBG, schemeBrBG, interpolatePRGn, schemePRGn, interpolatePiYG, schemePiYG, interpolatePuOr, schemePuOr, interpolateRdBu, schemeRdBu, interpolateRdGy, schemeRdGy, interpolateRdYlBu, schemeRdYlBu, interpolateRdYlGn, schemeRdYlGn, interpolateSpectral, schemeSpectral, interpolateBuGn, schemeBuGn, interpolateBuPu, schemeBuPu, interpolateGnBu, schemeGnBu, interpolateOrRd, schemeOrRd, interpolatePuBuGn, schemePuBuGn, interpolatePuBu, schemePuBu, interpolatePuRd, schemePuRd, interpolateRdPu, schemeRdPu, interpolateYlGnBu, schemeYlGnBu, interpolateYlGn, schemeYlGn, interpolateYlOrBr, schemeYlOrBr, interpolateYlOrRd, schemeYlOrRd, interpolateBlues, schemeBlues, interpolateGreens, schemeGreens, interpolateGreys, schemeGreys, interpolatePurples, schemePurples, interpolateReds, schemeReds, interpolateOranges, schemeOranges, interpolateCividis, interpolateCubehelixDefault, interpolateRainbow, interpolateWarm, interpolateCool, interpolateSinebow, interpolateTurbo, interpolateViridis, interpolateMagma, interpolateInferno, interpolatePlasma */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _categorical_category10_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./categorical/category10.js */ "./node_modules/d3-scale-chromatic/src/categorical/category10.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeCategory10", function() { return _categorical_category10_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _categorical_Accent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./categorical/Accent.js */ "./node_modules/d3-scale-chromatic/src/categorical/Accent.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeAccent", function() { return _categorical_Accent_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _categorical_Dark2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./categorical/Dark2.js */ "./node_modules/d3-scale-chromatic/src/categorical/Dark2.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeDark2", function() { return _categorical_Dark2_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _categorical_Paired_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./categorical/Paired.js */ "./node_modules/d3-scale-chromatic/src/categorical/Paired.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePaired", function() { return _categorical_Paired_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _categorical_Pastel1_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./categorical/Pastel1.js */ "./node_modules/d3-scale-chromatic/src/categorical/Pastel1.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePastel1", function() { return _categorical_Pastel1_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _categorical_Pastel2_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./categorical/Pastel2.js */ "./node_modules/d3-scale-chromatic/src/categorical/Pastel2.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePastel2", function() { return _categorical_Pastel2_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _categorical_Set1_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./categorical/Set1.js */ "./node_modules/d3-scale-chromatic/src/categorical/Set1.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeSet1", function() { return _categorical_Set1_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony import */ var _categorical_Set2_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./categorical/Set2.js */ "./node_modules/d3-scale-chromatic/src/categorical/Set2.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeSet2", function() { return _categorical_Set2_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+/* harmony import */ var _categorical_Set3_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./categorical/Set3.js */ "./node_modules/d3-scale-chromatic/src/categorical/Set3.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeSet3", function() { return _categorical_Set3_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony import */ var _categorical_Tableau10_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./categorical/Tableau10.js */ "./node_modules/d3-scale-chromatic/src/categorical/Tableau10.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeTableau10", function() { return _categorical_Tableau10_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
+
+/* harmony import */ var _diverging_BrBG_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./diverging/BrBG.js */ "./node_modules/d3-scale-chromatic/src/diverging/BrBG.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBrBG", function() { return _diverging_BrBG_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeBrBG", function() { return _diverging_BrBG_js__WEBPACK_IMPORTED_MODULE_10__["scheme"]; });
+
+/* harmony import */ var _diverging_PRGn_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./diverging/PRGn.js */ "./node_modules/d3-scale-chromatic/src/diverging/PRGn.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePRGn", function() { return _diverging_PRGn_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePRGn", function() { return _diverging_PRGn_js__WEBPACK_IMPORTED_MODULE_11__["scheme"]; });
+
+/* harmony import */ var _diverging_PiYG_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./diverging/PiYG.js */ "./node_modules/d3-scale-chromatic/src/diverging/PiYG.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePiYG", function() { return _diverging_PiYG_js__WEBPACK_IMPORTED_MODULE_12__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePiYG", function() { return _diverging_PiYG_js__WEBPACK_IMPORTED_MODULE_12__["scheme"]; });
+
+/* harmony import */ var _diverging_PuOr_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./diverging/PuOr.js */ "./node_modules/d3-scale-chromatic/src/diverging/PuOr.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePuOr", function() { return _diverging_PuOr_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePuOr", function() { return _diverging_PuOr_js__WEBPACK_IMPORTED_MODULE_13__["scheme"]; });
+
+/* harmony import */ var _diverging_RdBu_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./diverging/RdBu.js */ "./node_modules/d3-scale-chromatic/src/diverging/RdBu.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdBu", function() { return _diverging_RdBu_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdBu", function() { return _diverging_RdBu_js__WEBPACK_IMPORTED_MODULE_14__["scheme"]; });
+
+/* harmony import */ var _diverging_RdGy_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./diverging/RdGy.js */ "./node_modules/d3-scale-chromatic/src/diverging/RdGy.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdGy", function() { return _diverging_RdGy_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdGy", function() { return _diverging_RdGy_js__WEBPACK_IMPORTED_MODULE_15__["scheme"]; });
+
+/* harmony import */ var _diverging_RdYlBu_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./diverging/RdYlBu.js */ "./node_modules/d3-scale-chromatic/src/diverging/RdYlBu.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdYlBu", function() { return _diverging_RdYlBu_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdYlBu", function() { return _diverging_RdYlBu_js__WEBPACK_IMPORTED_MODULE_16__["scheme"]; });
+
+/* harmony import */ var _diverging_RdYlGn_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./diverging/RdYlGn.js */ "./node_modules/d3-scale-chromatic/src/diverging/RdYlGn.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdYlGn", function() { return _diverging_RdYlGn_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdYlGn", function() { return _diverging_RdYlGn_js__WEBPACK_IMPORTED_MODULE_17__["scheme"]; });
+
+/* harmony import */ var _diverging_Spectral_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./diverging/Spectral.js */ "./node_modules/d3-scale-chromatic/src/diverging/Spectral.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateSpectral", function() { return _diverging_Spectral_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeSpectral", function() { return _diverging_Spectral_js__WEBPACK_IMPORTED_MODULE_18__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_BuGn_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./sequential-multi/BuGn.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBuGn", function() { return _sequential_multi_BuGn_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeBuGn", function() { return _sequential_multi_BuGn_js__WEBPACK_IMPORTED_MODULE_19__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_BuPu_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./sequential-multi/BuPu.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBuPu", function() { return _sequential_multi_BuPu_js__WEBPACK_IMPORTED_MODULE_20__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeBuPu", function() { return _sequential_multi_BuPu_js__WEBPACK_IMPORTED_MODULE_20__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_GnBu_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./sequential-multi/GnBu.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateGnBu", function() { return _sequential_multi_GnBu_js__WEBPACK_IMPORTED_MODULE_21__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeGnBu", function() { return _sequential_multi_GnBu_js__WEBPACK_IMPORTED_MODULE_21__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_OrRd_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./sequential-multi/OrRd.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateOrRd", function() { return _sequential_multi_OrRd_js__WEBPACK_IMPORTED_MODULE_22__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeOrRd", function() { return _sequential_multi_OrRd_js__WEBPACK_IMPORTED_MODULE_22__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_PuBuGn_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./sequential-multi/PuBuGn.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePuBuGn", function() { return _sequential_multi_PuBuGn_js__WEBPACK_IMPORTED_MODULE_23__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePuBuGn", function() { return _sequential_multi_PuBuGn_js__WEBPACK_IMPORTED_MODULE_23__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_PuBu_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./sequential-multi/PuBu.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePuBu", function() { return _sequential_multi_PuBu_js__WEBPACK_IMPORTED_MODULE_24__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePuBu", function() { return _sequential_multi_PuBu_js__WEBPACK_IMPORTED_MODULE_24__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_PuRd_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./sequential-multi/PuRd.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePuRd", function() { return _sequential_multi_PuRd_js__WEBPACK_IMPORTED_MODULE_25__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePuRd", function() { return _sequential_multi_PuRd_js__WEBPACK_IMPORTED_MODULE_25__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_RdPu_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./sequential-multi/RdPu.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdPu", function() { return _sequential_multi_RdPu_js__WEBPACK_IMPORTED_MODULE_26__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdPu", function() { return _sequential_multi_RdPu_js__WEBPACK_IMPORTED_MODULE_26__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_YlGnBu_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./sequential-multi/YlGnBu.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateYlGnBu", function() { return _sequential_multi_YlGnBu_js__WEBPACK_IMPORTED_MODULE_27__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeYlGnBu", function() { return _sequential_multi_YlGnBu_js__WEBPACK_IMPORTED_MODULE_27__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_YlGn_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./sequential-multi/YlGn.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateYlGn", function() { return _sequential_multi_YlGn_js__WEBPACK_IMPORTED_MODULE_28__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeYlGn", function() { return _sequential_multi_YlGn_js__WEBPACK_IMPORTED_MODULE_28__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_YlOrBr_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./sequential-multi/YlOrBr.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateYlOrBr", function() { return _sequential_multi_YlOrBr_js__WEBPACK_IMPORTED_MODULE_29__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeYlOrBr", function() { return _sequential_multi_YlOrBr_js__WEBPACK_IMPORTED_MODULE_29__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_YlOrRd_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./sequential-multi/YlOrRd.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateYlOrRd", function() { return _sequential_multi_YlOrRd_js__WEBPACK_IMPORTED_MODULE_30__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeYlOrRd", function() { return _sequential_multi_YlOrRd_js__WEBPACK_IMPORTED_MODULE_30__["scheme"]; });
+
+/* harmony import */ var _sequential_single_Blues_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./sequential-single/Blues.js */ "./node_modules/d3-scale-chromatic/src/sequential-single/Blues.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBlues", function() { return _sequential_single_Blues_js__WEBPACK_IMPORTED_MODULE_31__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeBlues", function() { return _sequential_single_Blues_js__WEBPACK_IMPORTED_MODULE_31__["scheme"]; });
+
+/* harmony import */ var _sequential_single_Greens_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./sequential-single/Greens.js */ "./node_modules/d3-scale-chromatic/src/sequential-single/Greens.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateGreens", function() { return _sequential_single_Greens_js__WEBPACK_IMPORTED_MODULE_32__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeGreens", function() { return _sequential_single_Greens_js__WEBPACK_IMPORTED_MODULE_32__["scheme"]; });
+
+/* harmony import */ var _sequential_single_Greys_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./sequential-single/Greys.js */ "./node_modules/d3-scale-chromatic/src/sequential-single/Greys.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateGreys", function() { return _sequential_single_Greys_js__WEBPACK_IMPORTED_MODULE_33__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeGreys", function() { return _sequential_single_Greys_js__WEBPACK_IMPORTED_MODULE_33__["scheme"]; });
+
+/* harmony import */ var _sequential_single_Purples_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./sequential-single/Purples.js */ "./node_modules/d3-scale-chromatic/src/sequential-single/Purples.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePurples", function() { return _sequential_single_Purples_js__WEBPACK_IMPORTED_MODULE_34__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePurples", function() { return _sequential_single_Purples_js__WEBPACK_IMPORTED_MODULE_34__["scheme"]; });
+
+/* harmony import */ var _sequential_single_Reds_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./sequential-single/Reds.js */ "./node_modules/d3-scale-chromatic/src/sequential-single/Reds.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateReds", function() { return _sequential_single_Reds_js__WEBPACK_IMPORTED_MODULE_35__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeReds", function() { return _sequential_single_Reds_js__WEBPACK_IMPORTED_MODULE_35__["scheme"]; });
+
+/* harmony import */ var _sequential_single_Oranges_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./sequential-single/Oranges.js */ "./node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateOranges", function() { return _sequential_single_Oranges_js__WEBPACK_IMPORTED_MODULE_36__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeOranges", function() { return _sequential_single_Oranges_js__WEBPACK_IMPORTED_MODULE_36__["scheme"]; });
+
+/* harmony import */ var _sequential_multi_cividis_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./sequential-multi/cividis.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/cividis.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCividis", function() { return _sequential_multi_cividis_js__WEBPACK_IMPORTED_MODULE_37__["default"]; });
+
+/* harmony import */ var _sequential_multi_cubehelix_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./sequential-multi/cubehelix.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelixDefault", function() { return _sequential_multi_cubehelix_js__WEBPACK_IMPORTED_MODULE_38__["default"]; });
+
+/* harmony import */ var _sequential_multi_rainbow_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./sequential-multi/rainbow.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRainbow", function() { return _sequential_multi_rainbow_js__WEBPACK_IMPORTED_MODULE_39__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateWarm", function() { return _sequential_multi_rainbow_js__WEBPACK_IMPORTED_MODULE_39__["warm"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCool", function() { return _sequential_multi_rainbow_js__WEBPACK_IMPORTED_MODULE_39__["cool"]; });
+
+/* harmony import */ var _sequential_multi_sinebow_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./sequential-multi/sinebow.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateSinebow", function() { return _sequential_multi_sinebow_js__WEBPACK_IMPORTED_MODULE_40__["default"]; });
+
+/* harmony import */ var _sequential_multi_turbo_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./sequential-multi/turbo.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/turbo.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateTurbo", function() { return _sequential_multi_turbo_js__WEBPACK_IMPORTED_MODULE_41__["default"]; });
+
+/* harmony import */ var _sequential_multi_viridis_js__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./sequential-multi/viridis.js */ "./node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateViridis", function() { return _sequential_multi_viridis_js__WEBPACK_IMPORTED_MODULE_42__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateMagma", function() { return _sequential_multi_viridis_js__WEBPACK_IMPORTED_MODULE_42__["magma"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateInferno", function() { return _sequential_multi_viridis_js__WEBPACK_IMPORTED_MODULE_42__["inferno"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePlasma", function() { return _sequential_multi_viridis_js__WEBPACK_IMPORTED_MODULE_42__["plasma"]; });
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/ramp.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/ramp.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(scheme) {
+  return Object(d3_interpolate__WEBPACK_IMPORTED_MODULE_0__["interpolateRgbBasis"])(scheme[scheme.length - 1]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js":
+/*!**********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/BuGn.js ***!
+  \**********************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "e5f5f999d8c92ca25f",
+  "edf8fbb2e2e266c2a4238b45",
+  "edf8fbb2e2e266c2a42ca25f006d2c",
+  "edf8fbccece699d8c966c2a42ca25f006d2c",
+  "edf8fbccece699d8c966c2a441ae76238b45005824",
+  "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824",
+  "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js":
+/*!**********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/BuPu.js ***!
+  \**********************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "e0ecf49ebcda8856a7",
+  "edf8fbb3cde38c96c688419d",
+  "edf8fbb3cde38c96c68856a7810f7c",
+  "edf8fbbfd3e69ebcda8c96c68856a7810f7c",
+  "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b",
+  "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b",
+  "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js":
+/*!**********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/GnBu.js ***!
+  \**********************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "e0f3dba8ddb543a2ca",
+  "f0f9e8bae4bc7bccc42b8cbe",
+  "f0f9e8bae4bc7bccc443a2ca0868ac",
+  "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac",
+  "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e",
+  "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e",
+  "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js":
+/*!**********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/OrRd.js ***!
+  \**********************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "fee8c8fdbb84e34a33",
+  "fef0d9fdcc8afc8d59d7301f",
+  "fef0d9fdcc8afc8d59e34a33b30000",
+  "fef0d9fdd49efdbb84fc8d59e34a33b30000",
+  "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000",
+  "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000",
+  "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js":
+/*!**********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/PuBu.js ***!
+  \**********************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "ece7f2a6bddb2b8cbe",
+  "f1eef6bdc9e174a9cf0570b0",
+  "f1eef6bdc9e174a9cf2b8cbe045a8d",
+  "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d",
+  "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b",
+  "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b",
+  "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js":
+/*!************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/PuBuGn.js ***!
+  \************************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "ece2f0a6bddb1c9099",
+  "f6eff7bdc9e167a9cf02818a",
+  "f6eff7bdc9e167a9cf1c9099016c59",
+  "f6eff7d0d1e6a6bddb67a9cf1c9099016c59",
+  "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450",
+  "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450",
+  "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js":
+/*!**********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/PuRd.js ***!
+  \**********************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "e7e1efc994c7dd1c77",
+  "f1eef6d7b5d8df65b0ce1256",
+  "f1eef6d7b5d8df65b0dd1c77980043",
+  "f1eef6d4b9dac994c7df65b0dd1c77980043",
+  "f1eef6d4b9dac994c7df65b0e7298ace125691003f",
+  "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f",
+  "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js":
+/*!**********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/RdPu.js ***!
+  \**********************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "fde0ddfa9fb5c51b8a",
+  "feebe2fbb4b9f768a1ae017e",
+  "feebe2fbb4b9f768a1c51b8a7a0177",
+  "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177",
+  "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177",
+  "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177",
+  "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js":
+/*!**********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/YlGn.js ***!
+  \**********************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "f7fcb9addd8e31a354",
+  "ffffccc2e69978c679238443",
+  "ffffccc2e69978c67931a354006837",
+  "ffffccd9f0a3addd8e78c67931a354006837",
+  "ffffccd9f0a3addd8e78c67941ab5d238443005a32",
+  "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32",
+  "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js":
+/*!************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/YlGnBu.js ***!
+  \************************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "edf8b17fcdbb2c7fb8",
+  "ffffcca1dab441b6c4225ea8",
+  "ffffcca1dab441b6c42c7fb8253494",
+  "ffffccc7e9b47fcdbb41b6c42c7fb8253494",
+  "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84",
+  "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84",
+  "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js":
+/*!************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrBr.js ***!
+  \************************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "fff7bcfec44fd95f0e",
+  "ffffd4fed98efe9929cc4c02",
+  "ffffd4fed98efe9929d95f0e993404",
+  "ffffd4fee391fec44ffe9929d95f0e993404",
+  "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04",
+  "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04",
+  "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js":
+/*!************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/YlOrRd.js ***!
+  \************************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "ffeda0feb24cf03b20",
+  "ffffb2fecc5cfd8d3ce31a1c",
+  "ffffb2fecc5cfd8d3cf03b20bd0026",
+  "ffffb2fed976feb24cfd8d3cf03b20bd0026",
+  "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026",
+  "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026",
+  "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/cividis.js":
+/*!*************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/cividis.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(t) {
+  t = Math.max(0, Math.min(1, t));
+  return "rgb("
+      + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", "
+      + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", "
+      + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67)))))))
+      + ")";
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js":
+/*!***************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/cubehelix.js ***!
+  \***************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateCubehelixLong"])(Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(300, 0.5, 0.0), Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(-240, 0.5, 1.0)));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js":
+/*!*************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/rainbow.js ***!
+  \*************************************************************************/
+/*! exports provided: warm, cool, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "warm", function() { return warm; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cool", function() { return cool; });
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+
+
+
+var warm = Object(d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateCubehelixLong"])(Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(-100, 0.75, 0.35), Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(80, 1.50, 0.8));
+
+var cool = Object(d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateCubehelixLong"])(Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(260, 0.75, 0.35), Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])(80, 1.50, 0.8));
+
+var c = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["cubehelix"])();
+
+/* harmony default export */ __webpack_exports__["default"] = (function(t) {
+  if (t < 0 || t > 1) t -= Math.floor(t);
+  var ts = Math.abs(t - 0.5);
+  c.h = 360 * t - 100;
+  c.s = 1.5 - 1.5 * ts;
+  c.l = 0.8 - 0.9 * ts;
+  return c + "";
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js":
+/*!*************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/sinebow.js ***!
+  \*************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+
+
+var c = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["rgb"])(),
+    pi_1_3 = Math.PI / 3,
+    pi_2_3 = Math.PI * 2 / 3;
+
+/* harmony default export */ __webpack_exports__["default"] = (function(t) {
+  var x;
+  t = (0.5 - t) * Math.PI;
+  c.r = 255 * (x = Math.sin(t)) * x;
+  c.g = 255 * (x = Math.sin(t + pi_1_3)) * x;
+  c.b = 255 * (x = Math.sin(t + pi_2_3)) * x;
+  return c + "";
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/turbo.js":
+/*!***********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/turbo.js ***!
+  \***********************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(t) {
+  t = Math.max(0, Math.min(1, t));
+  return "rgb("
+      + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", "
+      + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", "
+      + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66)))))))
+      + ")";
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js":
+/*!*************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-multi/viridis.js ***!
+  \*************************************************************************/
+/*! exports provided: default, magma, inferno, plasma */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "magma", function() { return magma; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "inferno", function() { return inferno; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "plasma", function() { return plasma; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+
+
+function ramp(range) {
+  var n = range.length;
+  return function(t) {
+    return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (ramp(Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")));
+
+var magma = ramp(Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
+
+var inferno = ramp(Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
+
+var plasma = ramp(Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-single/Blues.js":
+/*!************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-single/Blues.js ***!
+  \************************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "deebf79ecae13182bd",
+  "eff3ffbdd7e76baed62171b5",
+  "eff3ffbdd7e76baed63182bd08519c",
+  "eff3ffc6dbef9ecae16baed63182bd08519c",
+  "eff3ffc6dbef9ecae16baed64292c62171b5084594",
+  "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594",
+  "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-single/Greens.js":
+/*!*************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-single/Greens.js ***!
+  \*************************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "e5f5e0a1d99b31a354",
+  "edf8e9bae4b374c476238b45",
+  "edf8e9bae4b374c47631a354006d2c",
+  "edf8e9c7e9c0a1d99b74c47631a354006d2c",
+  "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32",
+  "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32",
+  "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-single/Greys.js":
+/*!************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-single/Greys.js ***!
+  \************************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "f0f0f0bdbdbd636363",
+  "f7f7f7cccccc969696525252",
+  "f7f7f7cccccc969696636363252525",
+  "f7f7f7d9d9d9bdbdbd969696636363252525",
+  "f7f7f7d9d9d9bdbdbd969696737373525252252525",
+  "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525",
+  "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js":
+/*!**************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-single/Oranges.js ***!
+  \**************************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "fee6cefdae6be6550d",
+  "feeddefdbe85fd8d3cd94701",
+  "feeddefdbe85fd8d3ce6550da63603",
+  "feeddefdd0a2fdae6bfd8d3ce6550da63603",
+  "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04",
+  "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04",
+  "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-single/Purples.js":
+/*!**************************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-single/Purples.js ***!
+  \**************************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "efedf5bcbddc756bb1",
+  "f2f0f7cbc9e29e9ac86a51a3",
+  "f2f0f7cbc9e29e9ac8756bb154278f",
+  "f2f0f7dadaebbcbddc9e9ac8756bb154278f",
+  "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486",
+  "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486",
+  "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale-chromatic/src/sequential-single/Reds.js":
+/*!***********************************************************************!*\
+  !*** ./node_modules/d3-scale-chromatic/src/sequential-single/Reds.js ***!
+  \***********************************************************************/
+/*! exports provided: scheme, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheme", function() { return scheme; });
+/* harmony import */ var _colors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors.js */ "./node_modules/d3-scale-chromatic/src/colors.js");
+/* harmony import */ var _ramp_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../ramp.js */ "./node_modules/d3-scale-chromatic/src/ramp.js");
+
+
+
+var scheme = new Array(3).concat(
+  "fee0d2fc9272de2d26",
+  "fee5d9fcae91fb6a4acb181d",
+  "fee5d9fcae91fb6a4ade2d26a50f15",
+  "fee5d9fcbba1fc9272fb6a4ade2d26a50f15",
+  "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d",
+  "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d",
+  "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d"
+).map(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (Object(_ramp_js__WEBPACK_IMPORTED_MODULE_1__["default"])(scheme));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/array.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-scale/src/array.js ***!
+  \********************************************/
+/*! exports provided: map, slice */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
+var array = Array.prototype;
+
+var map = array.map;
+var slice = array.slice;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/band.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-scale/src/band.js ***!
+  \*******************************************/
+/*! exports provided: default, point */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return band; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "point", function() { return point; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+/* harmony import */ var _ordinal__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ordinal */ "./node_modules/d3-scale/src/ordinal.js");
+
+
+
+
+function band() {
+  var scale = Object(_ordinal__WEBPACK_IMPORTED_MODULE_2__["default"])().unknown(undefined),
+      domain = scale.domain,
+      ordinalRange = scale.range,
+      range = [0, 1],
+      step,
+      bandwidth,
+      round = false,
+      paddingInner = 0,
+      paddingOuter = 0,
+      align = 0.5;
+
+  delete scale.unknown;
+
+  function rescale() {
+    var n = domain().length,
+        reverse = range[1] < range[0],
+        start = range[reverse - 0],
+        stop = range[1 - reverse];
+    step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
+    if (round) step = Math.floor(step);
+    start += (stop - start - step * (n - paddingInner)) * align;
+    bandwidth = step * (1 - paddingInner);
+    if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
+    var values = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["range"])(n).map(function(i) { return start + step * i; });
+    return ordinalRange(reverse ? values.reverse() : values);
+  }
+
+  scale.domain = function(_) {
+    return arguments.length ? (domain(_), rescale()) : domain();
+  };
+
+  scale.range = function(_) {
+    return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
+  };
+
+  scale.rangeRound = function(_) {
+    return range = [+_[0], +_[1]], round = true, rescale();
+  };
+
+  scale.bandwidth = function() {
+    return bandwidth;
+  };
+
+  scale.step = function() {
+    return step;
+  };
+
+  scale.round = function(_) {
+    return arguments.length ? (round = !!_, rescale()) : round;
+  };
+
+  scale.padding = function(_) {
+    return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
+  };
+
+  scale.paddingInner = function(_) {
+    return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
+  };
+
+  scale.paddingOuter = function(_) {
+    return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
+  };
+
+  scale.align = function(_) {
+    return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
+  };
+
+  scale.copy = function() {
+    return band(domain(), range)
+        .round(round)
+        .paddingInner(paddingInner)
+        .paddingOuter(paddingOuter)
+        .align(align);
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_1__["initRange"].apply(rescale(), arguments);
+}
+
+function pointish(scale) {
+  var copy = scale.copy;
+
+  scale.padding = scale.paddingOuter;
+  delete scale.paddingInner;
+  delete scale.paddingOuter;
+
+  scale.copy = function() {
+    return pointish(copy());
+  };
+
+  return scale;
+}
+
+function point() {
+  return pointish(band.apply(null, arguments).paddingInner(1));
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/constant.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-scale/src/constant.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/continuous.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-scale/src/continuous.js ***!
+  \*************************************************/
+/*! exports provided: identity, copy, transformer, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copy", function() { return copy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformer", function() { return transformer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return continuous; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./array */ "./node_modules/d3-scale/src/array.js");
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-scale/src/constant.js");
+/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./number */ "./node_modules/d3-scale/src/number.js");
+
+
+
+
+
+
+var unit = [0, 1];
+
+function identity(x) {
+  return x;
+}
+
+function normalize(a, b) {
+  return (b -= (a = +a))
+      ? function(x) { return (x - a) / b; }
+      : Object(_constant__WEBPACK_IMPORTED_MODULE_3__["default"])(isNaN(b) ? NaN : 0.5);
+}
+
+function clamper(domain) {
+  var a = domain[0], b = domain[domain.length - 1], t;
+  if (a > b) t = a, a = b, b = t;
+  return function(x) { return Math.max(a, Math.min(b, x)); };
+}
+
+// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
+// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
+function bimap(domain, range, interpolate) {
+  var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
+  if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
+  else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
+  return function(x) { return r0(d0(x)); };
+}
+
+function polymap(domain, range, interpolate) {
+  var j = Math.min(domain.length, range.length) - 1,
+      d = new Array(j),
+      r = new Array(j),
+      i = -1;
+
+  // Reverse descending domains.
+  if (domain[j] < domain[0]) {
+    domain = domain.slice().reverse();
+    range = range.slice().reverse();
+  }
+
+  while (++i < j) {
+    d[i] = normalize(domain[i], domain[i + 1]);
+    r[i] = interpolate(range[i], range[i + 1]);
+  }
+
+  return function(x) {
+    var i = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["bisect"])(domain, x, 1, j) - 1;
+    return r[i](d[i](x));
+  };
+}
+
+function copy(source, target) {
+  return target
+      .domain(source.domain())
+      .range(source.range())
+      .interpolate(source.interpolate())
+      .clamp(source.clamp())
+      .unknown(source.unknown());
+}
+
+function transformer() {
+  var domain = unit,
+      range = unit,
+      interpolate = d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolate"],
+      transform,
+      untransform,
+      unknown,
+      clamp = identity,
+      piecewise,
+      output,
+      input;
+
+  function rescale() {
+    piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
+    output = input = null;
+    return scale;
+  }
+
+  function scale(x) {
+    return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));
+  }
+
+  scale.invert = function(y) {
+    return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateNumber"])))(y)));
+  };
+
+  scale.domain = function(_) {
+    return arguments.length ? (domain = _array__WEBPACK_IMPORTED_MODULE_2__["map"].call(_, _number__WEBPACK_IMPORTED_MODULE_4__["default"]), clamp === identity || (clamp = clamper(domain)), rescale()) : domain.slice();
+  };
+
+  scale.range = function(_) {
+    return arguments.length ? (range = _array__WEBPACK_IMPORTED_MODULE_2__["slice"].call(_), rescale()) : range.slice();
+  };
+
+  scale.rangeRound = function(_) {
+    return range = _array__WEBPACK_IMPORTED_MODULE_2__["slice"].call(_), interpolate = d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateRound"], rescale();
+  };
+
+  scale.clamp = function(_) {
+    return arguments.length ? (clamp = _ ? clamper(domain) : identity, scale) : clamp !== identity;
+  };
+
+  scale.interpolate = function(_) {
+    return arguments.length ? (interpolate = _, rescale()) : interpolate;
+  };
+
+  scale.unknown = function(_) {
+    return arguments.length ? (unknown = _, scale) : unknown;
+  };
+
+  return function(t, u) {
+    transform = t, untransform = u;
+    return rescale();
+  };
+}
+
+function continuous(transform, untransform) {
+  return transformer()(transform, untransform);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/diverging.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-scale/src/diverging.js ***!
+  \************************************************/
+/*! exports provided: default, divergingLog, divergingSymlog, divergingPow, divergingSqrt */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return diverging; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divergingLog", function() { return divergingLog; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divergingSymlog", function() { return divergingSymlog; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divergingPow", function() { return divergingPow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "divergingSqrt", function() { return divergingSqrt; });
+/* harmony import */ var _continuous__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./continuous */ "./node_modules/d3-scale/src/continuous.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+/* harmony import */ var _linear__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./linear */ "./node_modules/d3-scale/src/linear.js");
+/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./log */ "./node_modules/d3-scale/src/log.js");
+/* harmony import */ var _sequential__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sequential */ "./node_modules/d3-scale/src/sequential.js");
+/* harmony import */ var _symlog__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./symlog */ "./node_modules/d3-scale/src/symlog.js");
+/* harmony import */ var _pow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pow */ "./node_modules/d3-scale/src/pow.js");
+
+
+
+
+
+
+
+
+function transformer() {
+  var x0 = 0,
+      x1 = 0.5,
+      x2 = 1,
+      t0,
+      t1,
+      t2,
+      k10,
+      k21,
+      interpolator = _continuous__WEBPACK_IMPORTED_MODULE_0__["identity"],
+      transform,
+      clamp = false,
+      unknown;
+
+  function scale(x) {
+    return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (x < t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x));
+  }
+
+  scale.domain = function(_) {
+    return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), t2 = transform(x2 = +_[2]), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), scale) : [x0, x1, x2];
+  };
+
+  scale.clamp = function(_) {
+    return arguments.length ? (clamp = !!_, scale) : clamp;
+  };
+
+  scale.interpolator = function(_) {
+    return arguments.length ? (interpolator = _, scale) : interpolator;
+  };
+
+  scale.unknown = function(_) {
+    return arguments.length ? (unknown = _, scale) : unknown;
+  };
+
+  return function(t) {
+    transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1);
+    return scale;
+  };
+}
+
+function diverging() {
+  var scale = Object(_linear__WEBPACK_IMPORTED_MODULE_2__["linearish"])(transformer()(_continuous__WEBPACK_IMPORTED_MODULE_0__["identity"]));
+
+  scale.copy = function() {
+    return Object(_sequential__WEBPACK_IMPORTED_MODULE_4__["copy"])(scale, diverging());
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_1__["initInterpolator"].apply(scale, arguments);
+}
+
+function divergingLog() {
+  var scale = Object(_log__WEBPACK_IMPORTED_MODULE_3__["loggish"])(transformer()).domain([0.1, 1, 10]);
+
+  scale.copy = function() {
+    return Object(_sequential__WEBPACK_IMPORTED_MODULE_4__["copy"])(scale, divergingLog()).base(scale.base());
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_1__["initInterpolator"].apply(scale, arguments);
+}
+
+function divergingSymlog() {
+  var scale = Object(_symlog__WEBPACK_IMPORTED_MODULE_5__["symlogish"])(transformer());
+
+  scale.copy = function() {
+    return Object(_sequential__WEBPACK_IMPORTED_MODULE_4__["copy"])(scale, divergingSymlog()).constant(scale.constant());
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_1__["initInterpolator"].apply(scale, arguments);
+}
+
+function divergingPow() {
+  var scale = Object(_pow__WEBPACK_IMPORTED_MODULE_6__["powish"])(transformer());
+
+  scale.copy = function() {
+    return Object(_sequential__WEBPACK_IMPORTED_MODULE_4__["copy"])(scale, divergingPow()).exponent(scale.exponent());
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_1__["initInterpolator"].apply(scale, arguments);
+}
+
+function divergingSqrt() {
+  return divergingPow.apply(null, arguments).exponent(0.5);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/identity.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-scale/src/identity.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return identity; });
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./array */ "./node_modules/d3-scale/src/array.js");
+/* harmony import */ var _linear__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./linear */ "./node_modules/d3-scale/src/linear.js");
+/* harmony import */ var _number__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./number */ "./node_modules/d3-scale/src/number.js");
+
+
+
+
+function identity(domain) {
+  var unknown;
+
+  function scale(x) {
+    return isNaN(x = +x) ? unknown : x;
+  }
+
+  scale.invert = scale;
+
+  scale.domain = scale.range = function(_) {
+    return arguments.length ? (domain = _array__WEBPACK_IMPORTED_MODULE_0__["map"].call(_, _number__WEBPACK_IMPORTED_MODULE_2__["default"]), scale) : domain.slice();
+  };
+
+  scale.unknown = function(_) {
+    return arguments.length ? (unknown = _, scale) : unknown;
+  };
+
+  scale.copy = function() {
+    return identity(domain).unknown(unknown);
+  };
+
+  domain = arguments.length ? _array__WEBPACK_IMPORTED_MODULE_0__["map"].call(domain, _number__WEBPACK_IMPORTED_MODULE_2__["default"]) : [0, 1];
+
+  return Object(_linear__WEBPACK_IMPORTED_MODULE_1__["linearish"])(scale);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-scale/src/index.js ***!
+  \********************************************/
+/*! exports provided: scaleBand, scalePoint, scaleIdentity, scaleLinear, scaleLog, scaleSymlog, scaleOrdinal, scaleImplicit, scalePow, scaleSqrt, scaleQuantile, scaleQuantize, scaleThreshold, scaleTime, scaleUtc, scaleSequential, scaleSequentialLog, scaleSequentialPow, scaleSequentialSqrt, scaleSequentialSymlog, scaleSequentialQuantile, scaleDiverging, scaleDivergingLog, scaleDivergingPow, scaleDivergingSqrt, scaleDivergingSymlog, tickFormat */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _band__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./band */ "./node_modules/d3-scale/src/band.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleBand", function() { return _band__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scalePoint", function() { return _band__WEBPACK_IMPORTED_MODULE_0__["point"]; });
+
+/* harmony import */ var _identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./identity */ "./node_modules/d3-scale/src/identity.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleIdentity", function() { return _identity__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _linear__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./linear */ "./node_modules/d3-scale/src/linear.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleLinear", function() { return _linear__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./log */ "./node_modules/d3-scale/src/log.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleLog", function() { return _log__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _symlog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./symlog */ "./node_modules/d3-scale/src/symlog.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSymlog", function() { return _symlog__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _ordinal__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ordinal */ "./node_modules/d3-scale/src/ordinal.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleOrdinal", function() { return _ordinal__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleImplicit", function() { return _ordinal__WEBPACK_IMPORTED_MODULE_5__["implicit"]; });
+
+/* harmony import */ var _pow__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pow */ "./node_modules/d3-scale/src/pow.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scalePow", function() { return _pow__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSqrt", function() { return _pow__WEBPACK_IMPORTED_MODULE_6__["sqrt"]; });
+
+/* harmony import */ var _quantile__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./quantile */ "./node_modules/d3-scale/src/quantile.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleQuantile", function() { return _quantile__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+/* harmony import */ var _quantize__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./quantize */ "./node_modules/d3-scale/src/quantize.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleQuantize", function() { return _quantize__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony import */ var _threshold__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./threshold */ "./node_modules/d3-scale/src/threshold.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleThreshold", function() { return _threshold__WEBPACK_IMPORTED_MODULE_9__["default"]; });
+
+/* harmony import */ var _time__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./time */ "./node_modules/d3-scale/src/time.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleTime", function() { return _time__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony import */ var _utcTime__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utcTime */ "./node_modules/d3-scale/src/utcTime.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleUtc", function() { return _utcTime__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony import */ var _sequential__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./sequential */ "./node_modules/d3-scale/src/sequential.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequential", function() { return _sequential__WEBPACK_IMPORTED_MODULE_12__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialLog", function() { return _sequential__WEBPACK_IMPORTED_MODULE_12__["sequentialLog"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialPow", function() { return _sequential__WEBPACK_IMPORTED_MODULE_12__["sequentialPow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialSqrt", function() { return _sequential__WEBPACK_IMPORTED_MODULE_12__["sequentialSqrt"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialSymlog", function() { return _sequential__WEBPACK_IMPORTED_MODULE_12__["sequentialSymlog"]; });
+
+/* harmony import */ var _sequentialQuantile__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./sequentialQuantile */ "./node_modules/d3-scale/src/sequentialQuantile.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialQuantile", function() { return _sequentialQuantile__WEBPACK_IMPORTED_MODULE_13__["default"]; });
+
+/* harmony import */ var _diverging__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./diverging */ "./node_modules/d3-scale/src/diverging.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDiverging", function() { return _diverging__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDivergingLog", function() { return _diverging__WEBPACK_IMPORTED_MODULE_14__["divergingLog"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDivergingPow", function() { return _diverging__WEBPACK_IMPORTED_MODULE_14__["divergingPow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDivergingSqrt", function() { return _diverging__WEBPACK_IMPORTED_MODULE_14__["divergingSqrt"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDivergingSymlog", function() { return _diverging__WEBPACK_IMPORTED_MODULE_14__["divergingSymlog"]; });
+
+/* harmony import */ var _tickFormat__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./tickFormat */ "./node_modules/d3-scale/src/tickFormat.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tickFormat", function() { return _tickFormat__WEBPACK_IMPORTED_MODULE_15__["default"]; });
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/init.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-scale/src/init.js ***!
+  \*******************************************/
+/*! exports provided: initRange, initInterpolator */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initRange", function() { return initRange; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initInterpolator", function() { return initInterpolator; });
+function initRange(domain, range) {
+  switch (arguments.length) {
+    case 0: break;
+    case 1: this.range(domain); break;
+    default: this.range(range).domain(domain); break;
+  }
+  return this;
+}
+
+function initInterpolator(domain, interpolator) {
+  switch (arguments.length) {
+    case 0: break;
+    case 1: this.interpolator(domain); break;
+    default: this.interpolator(interpolator).domain(domain); break;
+  }
+  return this;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/linear.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-scale/src/linear.js ***!
+  \*********************************************/
+/*! exports provided: linearish, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linearish", function() { return linearish; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return linear; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _continuous__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./continuous */ "./node_modules/d3-scale/src/continuous.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+/* harmony import */ var _tickFormat__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tickFormat */ "./node_modules/d3-scale/src/tickFormat.js");
+
+
+
+
+
+function linearish(scale) {
+  var domain = scale.domain;
+
+  scale.ticks = function(count) {
+    var d = domain();
+    return Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["ticks"])(d[0], d[d.length - 1], count == null ? 10 : count);
+  };
+
+  scale.tickFormat = function(count, specifier) {
+    var d = domain();
+    return Object(_tickFormat__WEBPACK_IMPORTED_MODULE_3__["default"])(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
+  };
+
+  scale.nice = function(count) {
+    if (count == null) count = 10;
+
+    var d = domain(),
+        i0 = 0,
+        i1 = d.length - 1,
+        start = d[i0],
+        stop = d[i1],
+        step;
+
+    if (stop < start) {
+      step = start, start = stop, stop = step;
+      step = i0, i0 = i1, i1 = step;
+    }
+
+    step = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["tickIncrement"])(start, stop, count);
+
+    if (step > 0) {
+      start = Math.floor(start / step) * step;
+      stop = Math.ceil(stop / step) * step;
+      step = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["tickIncrement"])(start, stop, count);
+    } else if (step < 0) {
+      start = Math.ceil(start * step) / step;
+      stop = Math.floor(stop * step) / step;
+      step = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["tickIncrement"])(start, stop, count);
+    }
+
+    if (step > 0) {
+      d[i0] = Math.floor(start / step) * step;
+      d[i1] = Math.ceil(stop / step) * step;
+      domain(d);
+    } else if (step < 0) {
+      d[i0] = Math.ceil(start * step) / step;
+      d[i1] = Math.floor(stop * step) / step;
+      domain(d);
+    }
+
+    return scale;
+  };
+
+  return scale;
+}
+
+function linear() {
+  var scale = Object(_continuous__WEBPACK_IMPORTED_MODULE_1__["default"])(_continuous__WEBPACK_IMPORTED_MODULE_1__["identity"], _continuous__WEBPACK_IMPORTED_MODULE_1__["identity"]);
+
+  scale.copy = function() {
+    return Object(_continuous__WEBPACK_IMPORTED_MODULE_1__["copy"])(scale, linear());
+  };
+
+  _init__WEBPACK_IMPORTED_MODULE_2__["initRange"].apply(scale, arguments);
+
+  return linearish(scale);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/log.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-scale/src/log.js ***!
+  \******************************************/
+/*! exports provided: loggish, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loggish", function() { return loggish; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return log; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var d3_format__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-format */ "./node_modules/d3-format/src/index.js");
+/* harmony import */ var _nice__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./nice */ "./node_modules/d3-scale/src/nice.js");
+/* harmony import */ var _continuous__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./continuous */ "./node_modules/d3-scale/src/continuous.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+
+
+
+
+
+
+function transformLog(x) {
+  return Math.log(x);
+}
+
+function transformExp(x) {
+  return Math.exp(x);
+}
+
+function transformLogn(x) {
+  return -Math.log(-x);
+}
+
+function transformExpn(x) {
+  return -Math.exp(-x);
+}
+
+function pow10(x) {
+  return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
+}
+
+function powp(base) {
+  return base === 10 ? pow10
+      : base === Math.E ? Math.exp
+      : function(x) { return Math.pow(base, x); };
+}
+
+function logp(base) {
+  return base === Math.E ? Math.log
+      : base === 10 && Math.log10
+      || base === 2 && Math.log2
+      || (base = Math.log(base), function(x) { return Math.log(x) / base; });
+}
+
+function reflect(f) {
+  return function(x) {
+    return -f(-x);
+  };
+}
+
+function loggish(transform) {
+  var scale = transform(transformLog, transformExp),
+      domain = scale.domain,
+      base = 10,
+      logs,
+      pows;
+
+  function rescale() {
+    logs = logp(base), pows = powp(base);
+    if (domain()[0] < 0) {
+      logs = reflect(logs), pows = reflect(pows);
+      transform(transformLogn, transformExpn);
+    } else {
+      transform(transformLog, transformExp);
+    }
+    return scale;
+  }
+
+  scale.base = function(_) {
+    return arguments.length ? (base = +_, rescale()) : base;
+  };
+
+  scale.domain = function(_) {
+    return arguments.length ? (domain(_), rescale()) : domain();
+  };
+
+  scale.ticks = function(count) {
+    var d = domain(),
+        u = d[0],
+        v = d[d.length - 1],
+        r;
+
+    if (r = v < u) i = u, u = v, v = i;
+
+    var i = logs(u),
+        j = logs(v),
+        p,
+        k,
+        t,
+        n = count == null ? 10 : +count,
+        z = [];
+
+    if (!(base % 1) && j - i < n) {
+      i = Math.round(i) - 1, j = Math.round(j) + 1;
+      if (u > 0) for (; i < j; ++i) {
+        for (k = 1, p = pows(i); k < base; ++k) {
+          t = p * k;
+          if (t < u) continue;
+          if (t > v) break;
+          z.push(t);
+        }
+      } else for (; i < j; ++i) {
+        for (k = base - 1, p = pows(i); k >= 1; --k) {
+          t = p * k;
+          if (t < u) continue;
+          if (t > v) break;
+          z.push(t);
+        }
+      }
+    } else {
+      z = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["ticks"])(i, j, Math.min(j - i, n)).map(pows);
+    }
+
+    return r ? z.reverse() : z;
+  };
+
+  scale.tickFormat = function(count, specifier) {
+    if (specifier == null) specifier = base === 10 ? ".0e" : ",";
+    if (typeof specifier !== "function") specifier = Object(d3_format__WEBPACK_IMPORTED_MODULE_1__["format"])(specifier);
+    if (count === Infinity) return specifier;
+    if (count == null) count = 10;
+    var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
+    return function(d) {
+      var i = d / pows(Math.round(logs(d)));
+      if (i * base < base - 0.5) i *= base;
+      return i <= k ? specifier(d) : "";
+    };
+  };
+
+  scale.nice = function() {
+    return domain(Object(_nice__WEBPACK_IMPORTED_MODULE_2__["default"])(domain(), {
+      floor: function(x) { return pows(Math.floor(logs(x))); },
+      ceil: function(x) { return pows(Math.ceil(logs(x))); }
+    }));
+  };
+
+  return scale;
+}
+
+function log() {
+  var scale = loggish(Object(_continuous__WEBPACK_IMPORTED_MODULE_3__["transformer"])()).domain([1, 10]);
+
+  scale.copy = function() {
+    return Object(_continuous__WEBPACK_IMPORTED_MODULE_3__["copy"])(scale, log()).base(scale.base());
+  };
+
+  _init__WEBPACK_IMPORTED_MODULE_4__["initRange"].apply(scale, arguments);
+
+  return scale;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/nice.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-scale/src/nice.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(domain, interval) {
+  domain = domain.slice();
+
+  var i0 = 0,
+      i1 = domain.length - 1,
+      x0 = domain[i0],
+      x1 = domain[i1],
+      t;
+
+  if (x1 < x0) {
+    t = i0, i0 = i1, i1 = t;
+    t = x0, x0 = x1, x1 = t;
+  }
+
+  domain[i0] = interval.floor(x0);
+  domain[i1] = interval.ceil(x1);
+  return domain;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/number.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-scale/src/number.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return +x;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/ordinal.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-scale/src/ordinal.js ***!
+  \**********************************************/
+/*! exports provided: implicit, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "implicit", function() { return implicit; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ordinal; });
+/* harmony import */ var d3_collection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-collection */ "./node_modules/d3-collection/src/index.js");
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array */ "./node_modules/d3-scale/src/array.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+
+
+
+
+var implicit = {name: "implicit"};
+
+function ordinal() {
+  var index = Object(d3_collection__WEBPACK_IMPORTED_MODULE_0__["map"])(),
+      domain = [],
+      range = [],
+      unknown = implicit;
+
+  function scale(d) {
+    var key = d + "", i = index.get(key);
+    if (!i) {
+      if (unknown !== implicit) return unknown;
+      index.set(key, i = domain.push(d));
+    }
+    return range[(i - 1) % range.length];
+  }
+
+  scale.domain = function(_) {
+    if (!arguments.length) return domain.slice();
+    domain = [], index = Object(d3_collection__WEBPACK_IMPORTED_MODULE_0__["map"])();
+    var i = -1, n = _.length, d, key;
+    while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
+    return scale;
+  };
+
+  scale.range = function(_) {
+    return arguments.length ? (range = _array__WEBPACK_IMPORTED_MODULE_1__["slice"].call(_), scale) : range.slice();
+  };
+
+  scale.unknown = function(_) {
+    return arguments.length ? (unknown = _, scale) : unknown;
+  };
+
+  scale.copy = function() {
+    return ordinal(domain, range).unknown(unknown);
+  };
+
+  _init__WEBPACK_IMPORTED_MODULE_2__["initRange"].apply(scale, arguments);
+
+  return scale;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/pow.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-scale/src/pow.js ***!
+  \******************************************/
+/*! exports provided: powish, default, sqrt */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "powish", function() { return powish; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return pow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrt", function() { return sqrt; });
+/* harmony import */ var _linear__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./linear */ "./node_modules/d3-scale/src/linear.js");
+/* harmony import */ var _continuous__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./continuous */ "./node_modules/d3-scale/src/continuous.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+
+
+
+
+function transformPow(exponent) {
+  return function(x) {
+    return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
+  };
+}
+
+function transformSqrt(x) {
+  return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);
+}
+
+function transformSquare(x) {
+  return x < 0 ? -x * x : x * x;
+}
+
+function powish(transform) {
+  var scale = transform(_continuous__WEBPACK_IMPORTED_MODULE_1__["identity"], _continuous__WEBPACK_IMPORTED_MODULE_1__["identity"]),
+      exponent = 1;
+
+  function rescale() {
+    return exponent === 1 ? transform(_continuous__WEBPACK_IMPORTED_MODULE_1__["identity"], _continuous__WEBPACK_IMPORTED_MODULE_1__["identity"])
+        : exponent === 0.5 ? transform(transformSqrt, transformSquare)
+        : transform(transformPow(exponent), transformPow(1 / exponent));
+  }
+
+  scale.exponent = function(_) {
+    return arguments.length ? (exponent = +_, rescale()) : exponent;
+  };
+
+  return Object(_linear__WEBPACK_IMPORTED_MODULE_0__["linearish"])(scale);
+}
+
+function pow() {
+  var scale = powish(Object(_continuous__WEBPACK_IMPORTED_MODULE_1__["transformer"])());
+
+  scale.copy = function() {
+    return Object(_continuous__WEBPACK_IMPORTED_MODULE_1__["copy"])(scale, pow()).exponent(scale.exponent());
+  };
+
+  _init__WEBPACK_IMPORTED_MODULE_2__["initRange"].apply(scale, arguments);
+
+  return scale;
+}
+
+function sqrt() {
+  return pow.apply(null, arguments).exponent(0.5);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/quantile.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-scale/src/quantile.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return quantile; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array */ "./node_modules/d3-scale/src/array.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+
+
+
+
+function quantile() {
+  var domain = [],
+      range = [],
+      thresholds = [],
+      unknown;
+
+  function rescale() {
+    var i = 0, n = Math.max(1, range.length);
+    thresholds = new Array(n - 1);
+    while (++i < n) thresholds[i - 1] = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["quantile"])(domain, i / n);
+    return scale;
+  }
+
+  function scale(x) {
+    return isNaN(x = +x) ? unknown : range[Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["bisect"])(thresholds, x)];
+  }
+
+  scale.invertExtent = function(y) {
+    var i = range.indexOf(y);
+    return i < 0 ? [NaN, NaN] : [
+      i > 0 ? thresholds[i - 1] : domain[0],
+      i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
+    ];
+  };
+
+  scale.domain = function(_) {
+    if (!arguments.length) return domain.slice();
+    domain = [];
+    for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
+    domain.sort(d3_array__WEBPACK_IMPORTED_MODULE_0__["ascending"]);
+    return rescale();
+  };
+
+  scale.range = function(_) {
+    return arguments.length ? (range = _array__WEBPACK_IMPORTED_MODULE_1__["slice"].call(_), rescale()) : range.slice();
+  };
+
+  scale.unknown = function(_) {
+    return arguments.length ? (unknown = _, scale) : unknown;
+  };
+
+  scale.quantiles = function() {
+    return thresholds.slice();
+  };
+
+  scale.copy = function() {
+    return quantile()
+        .domain(domain)
+        .range(range)
+        .unknown(unknown);
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_2__["initRange"].apply(scale, arguments);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/quantize.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-scale/src/quantize.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return quantize; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array */ "./node_modules/d3-scale/src/array.js");
+/* harmony import */ var _linear__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./linear */ "./node_modules/d3-scale/src/linear.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+
+
+
+
+
+function quantize() {
+  var x0 = 0,
+      x1 = 1,
+      n = 1,
+      domain = [0.5],
+      range = [0, 1],
+      unknown;
+
+  function scale(x) {
+    return x <= x ? range[Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["bisect"])(domain, x, 0, n)] : unknown;
+  }
+
+  function rescale() {
+    var i = -1;
+    domain = new Array(n);
+    while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
+    return scale;
+  }
+
+  scale.domain = function(_) {
+    return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
+  };
+
+  scale.range = function(_) {
+    return arguments.length ? (n = (range = _array__WEBPACK_IMPORTED_MODULE_1__["slice"].call(_)).length - 1, rescale()) : range.slice();
+  };
+
+  scale.invertExtent = function(y) {
+    var i = range.indexOf(y);
+    return i < 0 ? [NaN, NaN]
+        : i < 1 ? [x0, domain[0]]
+        : i >= n ? [domain[n - 1], x1]
+        : [domain[i - 1], domain[i]];
+  };
+
+  scale.unknown = function(_) {
+    return arguments.length ? (unknown = _, scale) : scale;
+  };
+
+  scale.thresholds = function() {
+    return domain.slice();
+  };
+
+  scale.copy = function() {
+    return quantize()
+        .domain([x0, x1])
+        .range(range)
+        .unknown(unknown);
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_3__["initRange"].apply(Object(_linear__WEBPACK_IMPORTED_MODULE_2__["linearish"])(scale), arguments);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/sequential.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-scale/src/sequential.js ***!
+  \*************************************************/
+/*! exports provided: copy, default, sequentialLog, sequentialSymlog, sequentialPow, sequentialSqrt */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copy", function() { return copy; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return sequential; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequentialLog", function() { return sequentialLog; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequentialSymlog", function() { return sequentialSymlog; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequentialPow", function() { return sequentialPow; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequentialSqrt", function() { return sequentialSqrt; });
+/* harmony import */ var _continuous__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./continuous */ "./node_modules/d3-scale/src/continuous.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+/* harmony import */ var _linear__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./linear */ "./node_modules/d3-scale/src/linear.js");
+/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./log */ "./node_modules/d3-scale/src/log.js");
+/* harmony import */ var _symlog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./symlog */ "./node_modules/d3-scale/src/symlog.js");
+/* harmony import */ var _pow__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pow */ "./node_modules/d3-scale/src/pow.js");
+
+
+
+
+
+
+
+function transformer() {
+  var x0 = 0,
+      x1 = 1,
+      t0,
+      t1,
+      k10,
+      transform,
+      interpolator = _continuous__WEBPACK_IMPORTED_MODULE_0__["identity"],
+      clamp = false,
+      unknown;
+
+  function scale(x) {
+    return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));
+  }
+
+  scale.domain = function(_) {
+    return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];
+  };
+
+  scale.clamp = function(_) {
+    return arguments.length ? (clamp = !!_, scale) : clamp;
+  };
+
+  scale.interpolator = function(_) {
+    return arguments.length ? (interpolator = _, scale) : interpolator;
+  };
+
+  scale.unknown = function(_) {
+    return arguments.length ? (unknown = _, scale) : unknown;
+  };
+
+  return function(t) {
+    transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);
+    return scale;
+  };
+}
+
+function copy(source, target) {
+  return target
+      .domain(source.domain())
+      .interpolator(source.interpolator())
+      .clamp(source.clamp())
+      .unknown(source.unknown());
+}
+
+function sequential() {
+  var scale = Object(_linear__WEBPACK_IMPORTED_MODULE_2__["linearish"])(transformer()(_continuous__WEBPACK_IMPORTED_MODULE_0__["identity"]));
+
+  scale.copy = function() {
+    return copy(scale, sequential());
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_1__["initInterpolator"].apply(scale, arguments);
+}
+
+function sequentialLog() {
+  var scale = Object(_log__WEBPACK_IMPORTED_MODULE_3__["loggish"])(transformer()).domain([1, 10]);
+
+  scale.copy = function() {
+    return copy(scale, sequentialLog()).base(scale.base());
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_1__["initInterpolator"].apply(scale, arguments);
+}
+
+function sequentialSymlog() {
+  var scale = Object(_symlog__WEBPACK_IMPORTED_MODULE_4__["symlogish"])(transformer());
+
+  scale.copy = function() {
+    return copy(scale, sequentialSymlog()).constant(scale.constant());
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_1__["initInterpolator"].apply(scale, arguments);
+}
+
+function sequentialPow() {
+  var scale = Object(_pow__WEBPACK_IMPORTED_MODULE_5__["powish"])(transformer());
+
+  scale.copy = function() {
+    return copy(scale, sequentialPow()).exponent(scale.exponent());
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_1__["initInterpolator"].apply(scale, arguments);
+}
+
+function sequentialSqrt() {
+  return sequentialPow.apply(null, arguments).exponent(0.5);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/sequentialQuantile.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-scale/src/sequentialQuantile.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return sequentialQuantile; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _continuous__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./continuous */ "./node_modules/d3-scale/src/continuous.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+
+
+
+
+function sequentialQuantile() {
+  var domain = [],
+      interpolator = _continuous__WEBPACK_IMPORTED_MODULE_1__["identity"];
+
+  function scale(x) {
+    if (!isNaN(x = +x)) return interpolator((Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["bisect"])(domain, x) - 1) / (domain.length - 1));
+  }
+
+  scale.domain = function(_) {
+    if (!arguments.length) return domain.slice();
+    domain = [];
+    for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
+    domain.sort(d3_array__WEBPACK_IMPORTED_MODULE_0__["ascending"]);
+    return scale;
+  };
+
+  scale.interpolator = function(_) {
+    return arguments.length ? (interpolator = _, scale) : interpolator;
+  };
+
+  scale.copy = function() {
+    return sequentialQuantile(interpolator).domain(domain);
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_2__["initInterpolator"].apply(scale, arguments);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/symlog.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-scale/src/symlog.js ***!
+  \*********************************************/
+/*! exports provided: symlogish, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "symlogish", function() { return symlogish; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return symlog; });
+/* harmony import */ var _linear__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./linear */ "./node_modules/d3-scale/src/linear.js");
+/* harmony import */ var _continuous__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./continuous */ "./node_modules/d3-scale/src/continuous.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+
+
+
+
+function transformSymlog(c) {
+  return function(x) {
+    return Math.sign(x) * Math.log1p(Math.abs(x / c));
+  };
+}
+
+function transformSymexp(c) {
+  return function(x) {
+    return Math.sign(x) * Math.expm1(Math.abs(x)) * c;
+  };
+}
+
+function symlogish(transform) {
+  var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));
+
+  scale.constant = function(_) {
+    return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;
+  };
+
+  return Object(_linear__WEBPACK_IMPORTED_MODULE_0__["linearish"])(scale);
+}
+
+function symlog() {
+  var scale = symlogish(Object(_continuous__WEBPACK_IMPORTED_MODULE_1__["transformer"])());
+
+  scale.copy = function() {
+    return Object(_continuous__WEBPACK_IMPORTED_MODULE_1__["copy"])(scale, symlog()).constant(scale.constant());
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_2__["initRange"].apply(scale, arguments);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/threshold.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-scale/src/threshold.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return threshold; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./array */ "./node_modules/d3-scale/src/array.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+
+
+
+
+function threshold() {
+  var domain = [0.5],
+      range = [0, 1],
+      unknown,
+      n = 1;
+
+  function scale(x) {
+    return x <= x ? range[Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["bisect"])(domain, x, 0, n)] : unknown;
+  }
+
+  scale.domain = function(_) {
+    return arguments.length ? (domain = _array__WEBPACK_IMPORTED_MODULE_1__["slice"].call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
+  };
+
+  scale.range = function(_) {
+    return arguments.length ? (range = _array__WEBPACK_IMPORTED_MODULE_1__["slice"].call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
+  };
+
+  scale.invertExtent = function(y) {
+    var i = range.indexOf(y);
+    return [domain[i - 1], domain[i]];
+  };
+
+  scale.unknown = function(_) {
+    return arguments.length ? (unknown = _, scale) : unknown;
+  };
+
+  scale.copy = function() {
+    return threshold()
+        .domain(domain)
+        .range(range)
+        .unknown(unknown);
+  };
+
+  return _init__WEBPACK_IMPORTED_MODULE_2__["initRange"].apply(scale, arguments);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/tickFormat.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-scale/src/tickFormat.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var d3_format__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-format */ "./node_modules/d3-format/src/index.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(start, stop, count, specifier) {
+  var step = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["tickStep"])(start, stop, count),
+      precision;
+  specifier = Object(d3_format__WEBPACK_IMPORTED_MODULE_1__["formatSpecifier"])(specifier == null ? ",f" : specifier);
+  switch (specifier.type) {
+    case "s": {
+      var value = Math.max(Math.abs(start), Math.abs(stop));
+      if (specifier.precision == null && !isNaN(precision = Object(d3_format__WEBPACK_IMPORTED_MODULE_1__["precisionPrefix"])(step, value))) specifier.precision = precision;
+      return Object(d3_format__WEBPACK_IMPORTED_MODULE_1__["formatPrefix"])(specifier, value);
+    }
+    case "":
+    case "e":
+    case "g":
+    case "p":
+    case "r": {
+      if (specifier.precision == null && !isNaN(precision = Object(d3_format__WEBPACK_IMPORTED_MODULE_1__["precisionRound"])(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
+      break;
+    }
+    case "f":
+    case "%": {
+      if (specifier.precision == null && !isNaN(precision = Object(d3_format__WEBPACK_IMPORTED_MODULE_1__["precisionFixed"])(step))) specifier.precision = precision - (specifier.type === "%") * 2;
+      break;
+    }
+  }
+  return Object(d3_format__WEBPACK_IMPORTED_MODULE_1__["format"])(specifier);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/time.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-scale/src/time.js ***!
+  \*******************************************/
+/*! exports provided: calendar, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "calendar", function() { return calendar; });
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony import */ var d3_time__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-time */ "./node_modules/d3-time/src/index.js");
+/* harmony import */ var d3_time_format__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-time-format */ "./node_modules/d3-time-format/src/index.js");
+/* harmony import */ var _array__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./array */ "./node_modules/d3-scale/src/array.js");
+/* harmony import */ var _continuous__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./continuous */ "./node_modules/d3-scale/src/continuous.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+/* harmony import */ var _nice__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./nice */ "./node_modules/d3-scale/src/nice.js");
+
+
+
+
+
+
+
+
+var durationSecond = 1000,
+    durationMinute = durationSecond * 60,
+    durationHour = durationMinute * 60,
+    durationDay = durationHour * 24,
+    durationWeek = durationDay * 7,
+    durationMonth = durationDay * 30,
+    durationYear = durationDay * 365;
+
+function date(t) {
+  return new Date(t);
+}
+
+function number(t) {
+  return t instanceof Date ? +t : +new Date(+t);
+}
+
+function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
+  var scale = Object(_continuous__WEBPACK_IMPORTED_MODULE_4__["default"])(_continuous__WEBPACK_IMPORTED_MODULE_4__["identity"], _continuous__WEBPACK_IMPORTED_MODULE_4__["identity"]),
+      invert = scale.invert,
+      domain = scale.domain;
+
+  var formatMillisecond = format(".%L"),
+      formatSecond = format(":%S"),
+      formatMinute = format("%I:%M"),
+      formatHour = format("%I %p"),
+      formatDay = format("%a %d"),
+      formatWeek = format("%b %d"),
+      formatMonth = format("%B"),
+      formatYear = format("%Y");
+
+  var tickIntervals = [
+    [second,  1,      durationSecond],
+    [second,  5,  5 * durationSecond],
+    [second, 15, 15 * durationSecond],
+    [second, 30, 30 * durationSecond],
+    [minute,  1,      durationMinute],
+    [minute,  5,  5 * durationMinute],
+    [minute, 15, 15 * durationMinute],
+    [minute, 30, 30 * durationMinute],
+    [  hour,  1,      durationHour  ],
+    [  hour,  3,  3 * durationHour  ],
+    [  hour,  6,  6 * durationHour  ],
+    [  hour, 12, 12 * durationHour  ],
+    [   day,  1,      durationDay   ],
+    [   day,  2,  2 * durationDay   ],
+    [  week,  1,      durationWeek  ],
+    [ month,  1,      durationMonth ],
+    [ month,  3,  3 * durationMonth ],
+    [  year,  1,      durationYear  ]
+  ];
+
+  function tickFormat(date) {
+    return (second(date) < date ? formatMillisecond
+        : minute(date) < date ? formatSecond
+        : hour(date) < date ? formatMinute
+        : day(date) < date ? formatHour
+        : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
+        : year(date) < date ? formatMonth
+        : formatYear)(date);
+  }
+
+  function tickInterval(interval, start, stop, step) {
+    if (interval == null) interval = 10;
+
+    // If a desired tick count is specified, pick a reasonable tick interval
+    // based on the extent of the domain and a rough estimate of tick size.
+    // Otherwise, assume interval is already a time interval and use it.
+    if (typeof interval === "number") {
+      var target = Math.abs(stop - start) / interval,
+          i = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["bisector"])(function(i) { return i[2]; }).right(tickIntervals, target);
+      if (i === tickIntervals.length) {
+        step = Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["tickStep"])(start / durationYear, stop / durationYear, interval);
+        interval = year;
+      } else if (i) {
+        i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
+        step = i[1];
+        interval = i[0];
+      } else {
+        step = Math.max(Object(d3_array__WEBPACK_IMPORTED_MODULE_0__["tickStep"])(start, stop, interval), 1);
+        interval = millisecond;
+      }
+    }
+
+    return step == null ? interval : interval.every(step);
+  }
+
+  scale.invert = function(y) {
+    return new Date(invert(y));
+  };
+
+  scale.domain = function(_) {
+    return arguments.length ? domain(_array__WEBPACK_IMPORTED_MODULE_3__["map"].call(_, number)) : domain().map(date);
+  };
+
+  scale.ticks = function(interval, step) {
+    var d = domain(),
+        t0 = d[0],
+        t1 = d[d.length - 1],
+        r = t1 < t0,
+        t;
+    if (r) t = t0, t0 = t1, t1 = t;
+    t = tickInterval(interval, t0, t1, step);
+    t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
+    return r ? t.reverse() : t;
+  };
+
+  scale.tickFormat = function(count, specifier) {
+    return specifier == null ? tickFormat : format(specifier);
+  };
+
+  scale.nice = function(interval, step) {
+    var d = domain();
+    return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
+        ? domain(Object(_nice__WEBPACK_IMPORTED_MODULE_6__["default"])(d, interval))
+        : scale;
+  };
+
+  scale.copy = function() {
+    return Object(_continuous__WEBPACK_IMPORTED_MODULE_4__["copy"])(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
+  };
+
+  return scale;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return _init__WEBPACK_IMPORTED_MODULE_5__["initRange"].apply(calendar(d3_time__WEBPACK_IMPORTED_MODULE_1__["timeYear"], d3_time__WEBPACK_IMPORTED_MODULE_1__["timeMonth"], d3_time__WEBPACK_IMPORTED_MODULE_1__["timeWeek"], d3_time__WEBPACK_IMPORTED_MODULE_1__["timeDay"], d3_time__WEBPACK_IMPORTED_MODULE_1__["timeHour"], d3_time__WEBPACK_IMPORTED_MODULE_1__["timeMinute"], d3_time__WEBPACK_IMPORTED_MODULE_1__["timeSecond"], d3_time__WEBPACK_IMPORTED_MODULE_1__["timeMillisecond"], d3_time_format__WEBPACK_IMPORTED_MODULE_2__["timeFormat"]).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-scale/src/utcTime.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-scale/src/utcTime.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _time__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./time */ "./node_modules/d3-scale/src/time.js");
+/* harmony import */ var d3_time_format__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-time-format */ "./node_modules/d3-time-format/src/index.js");
+/* harmony import */ var d3_time__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-time */ "./node_modules/d3-time/src/index.js");
+/* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./init */ "./node_modules/d3-scale/src/init.js");
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return _init__WEBPACK_IMPORTED_MODULE_3__["initRange"].apply(Object(_time__WEBPACK_IMPORTED_MODULE_0__["calendar"])(d3_time__WEBPACK_IMPORTED_MODULE_2__["utcYear"], d3_time__WEBPACK_IMPORTED_MODULE_2__["utcMonth"], d3_time__WEBPACK_IMPORTED_MODULE_2__["utcWeek"], d3_time__WEBPACK_IMPORTED_MODULE_2__["utcDay"], d3_time__WEBPACK_IMPORTED_MODULE_2__["utcHour"], d3_time__WEBPACK_IMPORTED_MODULE_2__["utcMinute"], d3_time__WEBPACK_IMPORTED_MODULE_2__["utcSecond"], d3_time__WEBPACK_IMPORTED_MODULE_2__["utcMillisecond"], d3_time_format__WEBPACK_IMPORTED_MODULE_1__["utcFormat"]).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/constant.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-selection/src/constant.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/create.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-selection/src/create.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _creator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./creator */ "./node_modules/d3-selection/src/creator.js");
+/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./select */ "./node_modules/d3-selection/src/select.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name) {
+  return Object(_select__WEBPACK_IMPORTED_MODULE_1__["default"])(Object(_creator__WEBPACK_IMPORTED_MODULE_0__["default"])(name).call(document.documentElement));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/creator.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-selection/src/creator.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./namespace */ "./node_modules/d3-selection/src/namespace.js");
+/* harmony import */ var _namespaces__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./namespaces */ "./node_modules/d3-selection/src/namespaces.js");
+
+
+
+function creatorInherit(name) {
+  return function() {
+    var document = this.ownerDocument,
+        uri = this.namespaceURI;
+    return uri === _namespaces__WEBPACK_IMPORTED_MODULE_1__["xhtml"] && document.documentElement.namespaceURI === _namespaces__WEBPACK_IMPORTED_MODULE_1__["xhtml"]
+        ? document.createElement(name)
+        : document.createElementNS(uri, name);
+  };
+}
+
+function creatorFixed(fullname) {
+  return function() {
+    return this.ownerDocument.createElementNS(fullname.space, fullname.local);
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name) {
+  var fullname = Object(_namespace__WEBPACK_IMPORTED_MODULE_0__["default"])(name);
+  return (fullname.local
+      ? creatorFixed
+      : creatorInherit)(fullname);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/index.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-selection/src/index.js ***!
+  \************************************************/
+/*! exports provided: create, creator, local, matcher, mouse, namespace, namespaces, clientPoint, select, selectAll, selection, selector, selectorAll, style, touch, touches, window, event, customEvent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _create__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./create */ "./node_modules/d3-selection/src/create.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "create", function() { return _create__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _creator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./creator */ "./node_modules/d3-selection/src/creator.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "creator", function() { return _creator__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _local__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./local */ "./node_modules/d3-selection/src/local.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "local", function() { return _local__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _matcher__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./matcher */ "./node_modules/d3-selection/src/matcher.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "matcher", function() { return _matcher__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _mouse__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mouse */ "./node_modules/d3-selection/src/mouse.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouse", function() { return _mouse__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./namespace */ "./node_modules/d3-selection/src/namespace.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "namespace", function() { return _namespace__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _namespaces__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./namespaces */ "./node_modules/d3-selection/src/namespaces.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "namespaces", function() { return _namespaces__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./point */ "./node_modules/d3-selection/src/point.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clientPoint", function() { return _point__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./select */ "./node_modules/d3-selection/src/select.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "select", function() { return _select__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony import */ var _selectAll__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./selectAll */ "./node_modules/d3-selection/src/selectAll.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selectAll", function() { return _selectAll__WEBPACK_IMPORTED_MODULE_9__["default"]; });
+
+/* harmony import */ var _selection_index__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./selection/index */ "./node_modules/d3-selection/src/selection/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selection", function() { return _selection_index__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony import */ var _selector__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./selector */ "./node_modules/d3-selection/src/selector.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selector", function() { return _selector__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony import */ var _selectorAll__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./selectorAll */ "./node_modules/d3-selection/src/selectorAll.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selectorAll", function() { return _selectorAll__WEBPACK_IMPORTED_MODULE_12__["default"]; });
+
+/* harmony import */ var _selection_style__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./selection/style */ "./node_modules/d3-selection/src/selection/style.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "style", function() { return _selection_style__WEBPACK_IMPORTED_MODULE_13__["styleValue"]; });
+
+/* harmony import */ var _touch__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./touch */ "./node_modules/d3-selection/src/touch.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touch", function() { return _touch__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+/* harmony import */ var _touches__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./touches */ "./node_modules/d3-selection/src/touches.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touches", function() { return _touches__WEBPACK_IMPORTED_MODULE_15__["default"]; });
+
+/* harmony import */ var _window__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./window */ "./node_modules/d3-selection/src/window.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _window__WEBPACK_IMPORTED_MODULE_16__["default"]; });
+
+/* harmony import */ var _selection_on__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./selection/on */ "./node_modules/d3-selection/src/selection/on.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "event", function() { return _selection_on__WEBPACK_IMPORTED_MODULE_17__["event"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "customEvent", function() { return _selection_on__WEBPACK_IMPORTED_MODULE_17__["customEvent"]; });
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/local.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-selection/src/local.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return local; });
+var nextId = 0;
+
+function local() {
+  return new Local;
+}
+
+function Local() {
+  this._ = "@" + (++nextId).toString(36);
+}
+
+Local.prototype = local.prototype = {
+  constructor: Local,
+  get: function(node) {
+    var id = this._;
+    while (!(id in node)) if (!(node = node.parentNode)) return;
+    return node[id];
+  },
+  set: function(node, value) {
+    return node[this._] = value;
+  },
+  remove: function(node) {
+    return this._ in node && delete node[this._];
+  },
+  toString: function() {
+    return this._;
+  }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/matcher.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-selection/src/matcher.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
+  return function() {
+    return this.matches(selector);
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/mouse.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-selection/src/mouse.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _sourceEvent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sourceEvent */ "./node_modules/d3-selection/src/sourceEvent.js");
+/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point */ "./node_modules/d3-selection/src/point.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(node) {
+  var event = Object(_sourceEvent__WEBPACK_IMPORTED_MODULE_0__["default"])();
+  if (event.changedTouches) event = event.changedTouches[0];
+  return Object(_point__WEBPACK_IMPORTED_MODULE_1__["default"])(node, event);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/namespace.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-selection/src/namespace.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _namespaces__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./namespaces */ "./node_modules/d3-selection/src/namespaces.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name) {
+  var prefix = name += "", i = prefix.indexOf(":");
+  if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
+  return _namespaces__WEBPACK_IMPORTED_MODULE_0__["default"].hasOwnProperty(prefix) ? {space: _namespaces__WEBPACK_IMPORTED_MODULE_0__["default"][prefix], local: name} : name;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/namespaces.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-selection/src/namespaces.js ***!
+  \*****************************************************/
+/*! exports provided: xhtml, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "xhtml", function() { return xhtml; });
+var xhtml = "http://www.w3.org/1999/xhtml";
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  svg: "http://www.w3.org/2000/svg",
+  xhtml: xhtml,
+  xlink: "http://www.w3.org/1999/xlink",
+  xml: "http://www.w3.org/XML/1998/namespace",
+  xmlns: "http://www.w3.org/2000/xmlns/"
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/point.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-selection/src/point.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(node, event) {
+  var svg = node.ownerSVGElement || node;
+
+  if (svg.createSVGPoint) {
+    var point = svg.createSVGPoint();
+    point.x = event.clientX, point.y = event.clientY;
+    point = point.matrixTransform(node.getScreenCTM().inverse());
+    return [point.x, point.y];
+  }
+
+  var rect = node.getBoundingClientRect();
+  return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/select.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-selection/src/select.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _selection_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./selection/index */ "./node_modules/d3-selection/src/selection/index.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
+  return typeof selector === "string"
+      ? new _selection_index__WEBPACK_IMPORTED_MODULE_0__["Selection"]([[document.querySelector(selector)]], [document.documentElement])
+      : new _selection_index__WEBPACK_IMPORTED_MODULE_0__["Selection"]([[selector]], _selection_index__WEBPACK_IMPORTED_MODULE_0__["root"]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selectAll.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-selection/src/selectAll.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _selection_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./selection/index */ "./node_modules/d3-selection/src/selection/index.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
+  return typeof selector === "string"
+      ? new _selection_index__WEBPACK_IMPORTED_MODULE_0__["Selection"]([document.querySelectorAll(selector)], [document.documentElement])
+      : new _selection_index__WEBPACK_IMPORTED_MODULE_0__["Selection"]([selector == null ? [] : selector], _selection_index__WEBPACK_IMPORTED_MODULE_0__["root"]);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/append.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/append.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _creator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../creator */ "./node_modules/d3-selection/src/creator.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name) {
+  var create = typeof name === "function" ? name : Object(_creator__WEBPACK_IMPORTED_MODULE_0__["default"])(name);
+  return this.select(function() {
+    return this.appendChild(create.apply(this, arguments));
+  });
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/attr.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/attr.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _namespace__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../namespace */ "./node_modules/d3-selection/src/namespace.js");
+
+
+function attrRemove(name) {
+  return function() {
+    this.removeAttribute(name);
+  };
+}
+
+function attrRemoveNS(fullname) {
+  return function() {
+    this.removeAttributeNS(fullname.space, fullname.local);
+  };
+}
+
+function attrConstant(name, value) {
+  return function() {
+    this.setAttribute(name, value);
+  };
+}
+
+function attrConstantNS(fullname, value) {
+  return function() {
+    this.setAttributeNS(fullname.space, fullname.local, value);
+  };
+}
+
+function attrFunction(name, value) {
+  return function() {
+    var v = value.apply(this, arguments);
+    if (v == null) this.removeAttribute(name);
+    else this.setAttribute(name, v);
+  };
+}
+
+function attrFunctionNS(fullname, value) {
+  return function() {
+    var v = value.apply(this, arguments);
+    if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
+    else this.setAttributeNS(fullname.space, fullname.local, v);
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
+  var fullname = Object(_namespace__WEBPACK_IMPORTED_MODULE_0__["default"])(name);
+
+  if (arguments.length < 2) {
+    var node = this.node();
+    return fullname.local
+        ? node.getAttributeNS(fullname.space, fullname.local)
+        : node.getAttribute(fullname);
+  }
+
+  return this.each((value == null
+      ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
+      ? (fullname.local ? attrFunctionNS : attrFunction)
+      : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/call.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/call.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var callback = arguments[0];
+  arguments[0] = this;
+  callback.apply(null, arguments);
+  return this;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/classed.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/classed.js ***!
+  \************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function classArray(string) {
+  return string.trim().split(/^|\s+/);
+}
+
+function classList(node) {
+  return node.classList || new ClassList(node);
+}
+
+function ClassList(node) {
+  this._node = node;
+  this._names = classArray(node.getAttribute("class") || "");
+}
+
+ClassList.prototype = {
+  add: function(name) {
+    var i = this._names.indexOf(name);
+    if (i < 0) {
+      this._names.push(name);
+      this._node.setAttribute("class", this._names.join(" "));
+    }
+  },
+  remove: function(name) {
+    var i = this._names.indexOf(name);
+    if (i >= 0) {
+      this._names.splice(i, 1);
+      this._node.setAttribute("class", this._names.join(" "));
+    }
+  },
+  contains: function(name) {
+    return this._names.indexOf(name) >= 0;
+  }
+};
+
+function classedAdd(node, names) {
+  var list = classList(node), i = -1, n = names.length;
+  while (++i < n) list.add(names[i]);
+}
+
+function classedRemove(node, names) {
+  var list = classList(node), i = -1, n = names.length;
+  while (++i < n) list.remove(names[i]);
+}
+
+function classedTrue(names) {
+  return function() {
+    classedAdd(this, names);
+  };
+}
+
+function classedFalse(names) {
+  return function() {
+    classedRemove(this, names);
+  };
+}
+
+function classedFunction(names, value) {
+  return function() {
+    (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
+  var names = classArray(name + "");
+
+  if (arguments.length < 2) {
+    var list = classList(this.node()), i = -1, n = names.length;
+    while (++i < n) if (!list.contains(names[i])) return false;
+    return true;
+  }
+
+  return this.each((typeof value === "function"
+      ? classedFunction : value
+      ? classedTrue
+      : classedFalse)(names, value));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/clone.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/clone.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function selection_cloneShallow() {
+  var clone = this.cloneNode(false), parent = this.parentNode;
+  return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
+}
+
+function selection_cloneDeep() {
+  var clone = this.cloneNode(true), parent = this.parentNode;
+  return parent ? parent.insertBefore(clone, this.nextSibling) : clone;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(deep) {
+  return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/data.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/data.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
+/* harmony import */ var _enter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enter */ "./node_modules/d3-selection/src/selection/enter.js");
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constant */ "./node_modules/d3-selection/src/constant.js");
+
+
+
+
+var keyPrefix = "$"; // Protect against keys like “__proto__”.
+
+function bindIndex(parent, group, enter, update, exit, data) {
+  var i = 0,
+      node,
+      groupLength = group.length,
+      dataLength = data.length;
+
+  // Put any non-null nodes that fit into update.
+  // Put any null nodes into enter.
+  // Put any remaining data into enter.
+  for (; i < dataLength; ++i) {
+    if (node = group[i]) {
+      node.__data__ = data[i];
+      update[i] = node;
+    } else {
+      enter[i] = new _enter__WEBPACK_IMPORTED_MODULE_1__["EnterNode"](parent, data[i]);
+    }
+  }
+
+  // Put any non-null nodes that don’t fit into exit.
+  for (; i < groupLength; ++i) {
+    if (node = group[i]) {
+      exit[i] = node;
+    }
+  }
+}
+
+function bindKey(parent, group, enter, update, exit, data, key) {
+  var i,
+      node,
+      nodeByKeyValue = {},
+      groupLength = group.length,
+      dataLength = data.length,
+      keyValues = new Array(groupLength),
+      keyValue;
+
+  // Compute the key for each node.
+  // If multiple nodes have the same key, the duplicates are added to exit.
+  for (i = 0; i < groupLength; ++i) {
+    if (node = group[i]) {
+      keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
+      if (keyValue in nodeByKeyValue) {
+        exit[i] = node;
+      } else {
+        nodeByKeyValue[keyValue] = node;
+      }
+    }
+  }
+
+  // Compute the key for each datum.
+  // If there a node associated with this key, join and add it to update.
+  // If there is not (or the key is a duplicate), add it to enter.
+  for (i = 0; i < dataLength; ++i) {
+    keyValue = keyPrefix + key.call(parent, data[i], i, data);
+    if (node = nodeByKeyValue[keyValue]) {
+      update[i] = node;
+      node.__data__ = data[i];
+      nodeByKeyValue[keyValue] = null;
+    } else {
+      enter[i] = new _enter__WEBPACK_IMPORTED_MODULE_1__["EnterNode"](parent, data[i]);
+    }
+  }
+
+  // Add any remaining nodes that were not bound to data to exit.
+  for (i = 0; i < groupLength; ++i) {
+    if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
+      exit[i] = node;
+    }
+  }
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(value, key) {
+  if (!value) {
+    data = new Array(this.size()), j = -1;
+    this.each(function(d) { data[++j] = d; });
+    return data;
+  }
+
+  var bind = key ? bindKey : bindIndex,
+      parents = this._parents,
+      groups = this._groups;
+
+  if (typeof value !== "function") value = Object(_constant__WEBPACK_IMPORTED_MODULE_2__["default"])(value);
+
+  for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
+    var parent = parents[j],
+        group = groups[j],
+        groupLength = group.length,
+        data = value.call(parent, parent && parent.__data__, j, parents),
+        dataLength = data.length,
+        enterGroup = enter[j] = new Array(dataLength),
+        updateGroup = update[j] = new Array(dataLength),
+        exitGroup = exit[j] = new Array(groupLength);
+
+    bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
+
+    // Now connect the enter nodes to their following update node, such that
+    // appendChild can insert the materialized enter node before this node,
+    // rather than at the end of the parent node.
+    for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
+      if (previous = enterGroup[i0]) {
+        if (i0 >= i1) i1 = i0 + 1;
+        while (!(next = updateGroup[i1]) && ++i1 < dataLength);
+        previous._next = next || null;
+      }
+    }
+  }
+
+  update = new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](update, parents);
+  update._enter = enter;
+  update._exit = exit;
+  return update;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/datum.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/datum.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(value) {
+  return arguments.length
+      ? this.property("__data__", value)
+      : this.node().__data__;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/dispatch.js":
+/*!*************************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/dispatch.js ***!
+  \*************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../window */ "./node_modules/d3-selection/src/window.js");
+
+
+function dispatchEvent(node, type, params) {
+  var window = Object(_window__WEBPACK_IMPORTED_MODULE_0__["default"])(node),
+      event = window.CustomEvent;
+
+  if (typeof event === "function") {
+    event = new event(type, params);
+  } else {
+    event = window.document.createEvent("Event");
+    if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
+    else event.initEvent(type, false, false);
+  }
+
+  node.dispatchEvent(event);
+}
+
+function dispatchConstant(type, params) {
+  return function() {
+    return dispatchEvent(this, type, params);
+  };
+}
+
+function dispatchFunction(type, params) {
+  return function() {
+    return dispatchEvent(this, type, params.apply(this, arguments));
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(type, params) {
+  return this.each((typeof params === "function"
+      ? dispatchFunction
+      : dispatchConstant)(type, params));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/each.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/each.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(callback) {
+
+  for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+    for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
+      if (node = group[i]) callback.call(node, node.__data__, i, group);
+    }
+  }
+
+  return this;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/empty.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/empty.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return !this.node();
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/enter.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/enter.js ***!
+  \**********************************************************/
+/*! exports provided: default, EnterNode */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EnterNode", function() { return EnterNode; });
+/* harmony import */ var _sparse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sparse */ "./node_modules/d3-selection/src/selection/sparse.js");
+/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return new _index__WEBPACK_IMPORTED_MODULE_1__["Selection"](this._enter || this._groups.map(_sparse__WEBPACK_IMPORTED_MODULE_0__["default"]), this._parents);
+});
+
+function EnterNode(parent, datum) {
+  this.ownerDocument = parent.ownerDocument;
+  this.namespaceURI = parent.namespaceURI;
+  this._next = null;
+  this._parent = parent;
+  this.__data__ = datum;
+}
+
+EnterNode.prototype = {
+  constructor: EnterNode,
+  appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
+  insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
+  querySelector: function(selector) { return this._parent.querySelector(selector); },
+  querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/exit.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/exit.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _sparse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sparse */ "./node_modules/d3-selection/src/selection/sparse.js");
+/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return new _index__WEBPACK_IMPORTED_MODULE_1__["Selection"](this._exit || this._groups.map(_sparse__WEBPACK_IMPORTED_MODULE_0__["default"]), this._parents);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/filter.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/filter.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
+/* harmony import */ var _matcher__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../matcher */ "./node_modules/d3-selection/src/matcher.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(match) {
+  if (typeof match !== "function") match = Object(_matcher__WEBPACK_IMPORTED_MODULE_1__["default"])(match);
+
+  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
+      if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
+        subgroup.push(node);
+      }
+    }
+  }
+
+  return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](subgroups, this._parents);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/html.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/html.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function htmlRemove() {
+  this.innerHTML = "";
+}
+
+function htmlConstant(value) {
+  return function() {
+    this.innerHTML = value;
+  };
+}
+
+function htmlFunction(value) {
+  return function() {
+    var v = value.apply(this, arguments);
+    this.innerHTML = v == null ? "" : v;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(value) {
+  return arguments.length
+      ? this.each(value == null
+          ? htmlRemove : (typeof value === "function"
+          ? htmlFunction
+          : htmlConstant)(value))
+      : this.node().innerHTML;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/index.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/index.js ***!
+  \**********************************************************/
+/*! exports provided: root, Selection, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "root", function() { return root; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Selection", function() { return Selection; });
+/* harmony import */ var _select__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./select */ "./node_modules/d3-selection/src/selection/select.js");
+/* harmony import */ var _selectAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./selectAll */ "./node_modules/d3-selection/src/selection/selectAll.js");
+/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./filter */ "./node_modules/d3-selection/src/selection/filter.js");
+/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./data */ "./node_modules/d3-selection/src/selection/data.js");
+/* harmony import */ var _enter__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./enter */ "./node_modules/d3-selection/src/selection/enter.js");
+/* harmony import */ var _exit__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./exit */ "./node_modules/d3-selection/src/selection/exit.js");
+/* harmony import */ var _join__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./join */ "./node_modules/d3-selection/src/selection/join.js");
+/* harmony import */ var _merge__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./merge */ "./node_modules/d3-selection/src/selection/merge.js");
+/* harmony import */ var _order__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./order */ "./node_modules/d3-selection/src/selection/order.js");
+/* harmony import */ var _sort__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./sort */ "./node_modules/d3-selection/src/selection/sort.js");
+/* harmony import */ var _call__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./call */ "./node_modules/d3-selection/src/selection/call.js");
+/* harmony import */ var _nodes__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./nodes */ "./node_modules/d3-selection/src/selection/nodes.js");
+/* harmony import */ var _node__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./node */ "./node_modules/d3-selection/src/selection/node.js");
+/* harmony import */ var _size__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./size */ "./node_modules/d3-selection/src/selection/size.js");
+/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./empty */ "./node_modules/d3-selection/src/selection/empty.js");
+/* harmony import */ var _each__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./each */ "./node_modules/d3-selection/src/selection/each.js");
+/* harmony import */ var _attr__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./attr */ "./node_modules/d3-selection/src/selection/attr.js");
+/* harmony import */ var _style__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./style */ "./node_modules/d3-selection/src/selection/style.js");
+/* harmony import */ var _property__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./property */ "./node_modules/d3-selection/src/selection/property.js");
+/* harmony import */ var _classed__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./classed */ "./node_modules/d3-selection/src/selection/classed.js");
+/* harmony import */ var _text__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./text */ "./node_modules/d3-selection/src/selection/text.js");
+/* harmony import */ var _html__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./html */ "./node_modules/d3-selection/src/selection/html.js");
+/* harmony import */ var _raise__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./raise */ "./node_modules/d3-selection/src/selection/raise.js");
+/* harmony import */ var _lower__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./lower */ "./node_modules/d3-selection/src/selection/lower.js");
+/* harmony import */ var _append__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./append */ "./node_modules/d3-selection/src/selection/append.js");
+/* harmony import */ var _insert__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./insert */ "./node_modules/d3-selection/src/selection/insert.js");
+/* harmony import */ var _remove__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./remove */ "./node_modules/d3-selection/src/selection/remove.js");
+/* harmony import */ var _clone__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./clone */ "./node_modules/d3-selection/src/selection/clone.js");
+/* harmony import */ var _datum__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./datum */ "./node_modules/d3-selection/src/selection/datum.js");
+/* harmony import */ var _on__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./on */ "./node_modules/d3-selection/src/selection/on.js");
+/* harmony import */ var _dispatch__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./dispatch */ "./node_modules/d3-selection/src/selection/dispatch.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var root = [null];
+
+function Selection(groups, parents) {
+  this._groups = groups;
+  this._parents = parents;
+}
+
+function selection() {
+  return new Selection([[document.documentElement]], root);
+}
+
+Selection.prototype = selection.prototype = {
+  constructor: Selection,
+  select: _select__WEBPACK_IMPORTED_MODULE_0__["default"],
+  selectAll: _selectAll__WEBPACK_IMPORTED_MODULE_1__["default"],
+  filter: _filter__WEBPACK_IMPORTED_MODULE_2__["default"],
+  data: _data__WEBPACK_IMPORTED_MODULE_3__["default"],
+  enter: _enter__WEBPACK_IMPORTED_MODULE_4__["default"],
+  exit: _exit__WEBPACK_IMPORTED_MODULE_5__["default"],
+  join: _join__WEBPACK_IMPORTED_MODULE_6__["default"],
+  merge: _merge__WEBPACK_IMPORTED_MODULE_7__["default"],
+  order: _order__WEBPACK_IMPORTED_MODULE_8__["default"],
+  sort: _sort__WEBPACK_IMPORTED_MODULE_9__["default"],
+  call: _call__WEBPACK_IMPORTED_MODULE_10__["default"],
+  nodes: _nodes__WEBPACK_IMPORTED_MODULE_11__["default"],
+  node: _node__WEBPACK_IMPORTED_MODULE_12__["default"],
+  size: _size__WEBPACK_IMPORTED_MODULE_13__["default"],
+  empty: _empty__WEBPACK_IMPORTED_MODULE_14__["default"],
+  each: _each__WEBPACK_IMPORTED_MODULE_15__["default"],
+  attr: _attr__WEBPACK_IMPORTED_MODULE_16__["default"],
+  style: _style__WEBPACK_IMPORTED_MODULE_17__["default"],
+  property: _property__WEBPACK_IMPORTED_MODULE_18__["default"],
+  classed: _classed__WEBPACK_IMPORTED_MODULE_19__["default"],
+  text: _text__WEBPACK_IMPORTED_MODULE_20__["default"],
+  html: _html__WEBPACK_IMPORTED_MODULE_21__["default"],
+  raise: _raise__WEBPACK_IMPORTED_MODULE_22__["default"],
+  lower: _lower__WEBPACK_IMPORTED_MODULE_23__["default"],
+  append: _append__WEBPACK_IMPORTED_MODULE_24__["default"],
+  insert: _insert__WEBPACK_IMPORTED_MODULE_25__["default"],
+  remove: _remove__WEBPACK_IMPORTED_MODULE_26__["default"],
+  clone: _clone__WEBPACK_IMPORTED_MODULE_27__["default"],
+  datum: _datum__WEBPACK_IMPORTED_MODULE_28__["default"],
+  on: _on__WEBPACK_IMPORTED_MODULE_29__["default"],
+  dispatch: _dispatch__WEBPACK_IMPORTED_MODULE_30__["default"]
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (selection);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/insert.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/insert.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _creator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../creator */ "./node_modules/d3-selection/src/creator.js");
+/* harmony import */ var _selector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../selector */ "./node_modules/d3-selection/src/selector.js");
+
+
+
+function constantNull() {
+  return null;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, before) {
+  var create = typeof name === "function" ? name : Object(_creator__WEBPACK_IMPORTED_MODULE_0__["default"])(name),
+      select = before == null ? constantNull : typeof before === "function" ? before : Object(_selector__WEBPACK_IMPORTED_MODULE_1__["default"])(before);
+  return this.select(function() {
+    return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
+  });
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/join.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/join.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(onenter, onupdate, onexit) {
+  var enter = this.enter(), update = this, exit = this.exit();
+  enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
+  if (onupdate != null) update = onupdate(update);
+  if (onexit == null) exit.remove(); else onexit(exit);
+  return enter && update ? enter.merge(update).order() : update;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/lower.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/lower.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function lower() {
+  if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return this.each(lower);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/merge.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/merge.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(selection) {
+
+  for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
+    for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
+      if (node = group0[i] || group1[i]) {
+        merge[i] = node;
+      }
+    }
+  }
+
+  for (; j < m0; ++j) {
+    merges[j] = groups0[j];
+  }
+
+  return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](merges, this._parents);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/node.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/node.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+
+  for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
+    for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
+      var node = group[i];
+      if (node) return node;
+    }
+  }
+
+  return null;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/nodes.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/nodes.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var nodes = new Array(this.size()), i = -1;
+  this.each(function() { nodes[++i] = this; });
+  return nodes;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/on.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/on.js ***!
+  \*******************************************************/
+/*! exports provided: event, default, customEvent */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "event", function() { return event; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "customEvent", function() { return customEvent; });
+var filterEvents = {};
+
+var event = null;
+
+if (typeof document !== "undefined") {
+  var element = document.documentElement;
+  if (!("onmouseenter" in element)) {
+    filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
+  }
+}
+
+function filterContextListener(listener, index, group) {
+  listener = contextListener(listener, index, group);
+  return function(event) {
+    var related = event.relatedTarget;
+    if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
+      listener.call(this, event);
+    }
+  };
+}
+
+function contextListener(listener, index, group) {
+  return function(event1) {
+    var event0 = event; // Events can be reentrant (e.g., focus).
+    event = event1;
+    try {
+      listener.call(this, this.__data__, index, group);
+    } finally {
+      event = event0;
+    }
+  };
+}
+
+function parseTypenames(typenames) {
+  return typenames.trim().split(/^|\s+/).map(function(t) {
+    var name = "", i = t.indexOf(".");
+    if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
+    return {type: t, name: name};
+  });
+}
+
+function onRemove(typename) {
+  return function() {
+    var on = this.__on;
+    if (!on) return;
+    for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
+      if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
+        this.removeEventListener(o.type, o.listener, o.capture);
+      } else {
+        on[++i] = o;
+      }
+    }
+    if (++i) on.length = i;
+    else delete this.__on;
+  };
+}
+
+function onAdd(typename, value, capture) {
+  var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
+  return function(d, i, group) {
+    var on = this.__on, o, listener = wrap(value, i, group);
+    if (on) for (var j = 0, m = on.length; j < m; ++j) {
+      if ((o = on[j]).type === typename.type && o.name === typename.name) {
+        this.removeEventListener(o.type, o.listener, o.capture);
+        this.addEventListener(o.type, o.listener = listener, o.capture = capture);
+        o.value = value;
+        return;
+      }
+    }
+    this.addEventListener(typename.type, listener, capture);
+    o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
+    if (!on) this.__on = [o];
+    else on.push(o);
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(typename, value, capture) {
+  var typenames = parseTypenames(typename + ""), i, n = typenames.length, t;
+
+  if (arguments.length < 2) {
+    var on = this.node().__on;
+    if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
+      for (i = 0, o = on[j]; i < n; ++i) {
+        if ((t = typenames[i]).type === o.type && t.name === o.name) {
+          return o.value;
+        }
+      }
+    }
+    return;
+  }
+
+  on = value ? onAdd : onRemove;
+  if (capture == null) capture = false;
+  for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
+  return this;
+});
+
+function customEvent(event1, listener, that, args) {
+  var event0 = event;
+  event1.sourceEvent = event;
+  event = event1;
+  try {
+    return listener.apply(that, args);
+  } finally {
+    event = event0;
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/order.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/order.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+
+  for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
+    for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
+      if (node = group[i]) {
+        if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
+        next = node;
+      }
+    }
+  }
+
+  return this;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/property.js":
+/*!*************************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/property.js ***!
+  \*************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function propertyRemove(name) {
+  return function() {
+    delete this[name];
+  };
+}
+
+function propertyConstant(name, value) {
+  return function() {
+    this[name] = value;
+  };
+}
+
+function propertyFunction(name, value) {
+  return function() {
+    var v = value.apply(this, arguments);
+    if (v == null) delete this[name];
+    else this[name] = v;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
+  return arguments.length > 1
+      ? this.each((value == null
+          ? propertyRemove : typeof value === "function"
+          ? propertyFunction
+          : propertyConstant)(name, value))
+      : this.node()[name];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/raise.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/raise.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function raise() {
+  if (this.nextSibling) this.parentNode.appendChild(this);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return this.each(raise);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/remove.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/remove.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function remove() {
+  var parent = this.parentNode;
+  if (parent) parent.removeChild(this);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return this.each(remove);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/select.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/select.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
+/* harmony import */ var _selector__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../selector */ "./node_modules/d3-selection/src/selector.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(select) {
+  if (typeof select !== "function") select = Object(_selector__WEBPACK_IMPORTED_MODULE_1__["default"])(select);
+
+  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
+      if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
+        if ("__data__" in node) subnode.__data__ = node.__data__;
+        subgroup[i] = subnode;
+      }
+    }
+  }
+
+  return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](subgroups, this._parents);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/selectAll.js":
+/*!**************************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/selectAll.js ***!
+  \**************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
+/* harmony import */ var _selectorAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../selectorAll */ "./node_modules/d3-selection/src/selectorAll.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(select) {
+  if (typeof select !== "function") select = Object(_selectorAll__WEBPACK_IMPORTED_MODULE_1__["default"])(select);
+
+  for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
+    for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+      if (node = group[i]) {
+        subgroups.push(select.call(node, node.__data__, i, group));
+        parents.push(node);
+      }
+    }
+  }
+
+  return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](subgroups, parents);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/size.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/size.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var size = 0;
+  this.each(function() { ++size; });
+  return size;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/sort.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/sort.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index */ "./node_modules/d3-selection/src/selection/index.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(compare) {
+  if (!compare) compare = ascending;
+
+  function compareNode(a, b) {
+    return a && b ? compare(a.__data__, b.__data__) : !a - !b;
+  }
+
+  for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
+    for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
+      if (node = group[i]) {
+        sortgroup[i] = node;
+      }
+    }
+    sortgroup.sort(compareNode);
+  }
+
+  return new _index__WEBPACK_IMPORTED_MODULE_0__["Selection"](sortgroups, this._parents).order();
+});
+
+function ascending(a, b) {
+  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/sparse.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/sparse.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(update) {
+  return new Array(update.length);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/style.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/style.js ***!
+  \**********************************************************/
+/*! exports provided: default, styleValue */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "styleValue", function() { return styleValue; });
+/* harmony import */ var _window__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../window */ "./node_modules/d3-selection/src/window.js");
+
+
+function styleRemove(name) {
+  return function() {
+    this.style.removeProperty(name);
+  };
+}
+
+function styleConstant(name, value, priority) {
+  return function() {
+    this.style.setProperty(name, value, priority);
+  };
+}
+
+function styleFunction(name, value, priority) {
+  return function() {
+    var v = value.apply(this, arguments);
+    if (v == null) this.style.removeProperty(name);
+    else this.style.setProperty(name, v, priority);
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, value, priority) {
+  return arguments.length > 1
+      ? this.each((value == null
+            ? styleRemove : typeof value === "function"
+            ? styleFunction
+            : styleConstant)(name, value, priority == null ? "" : priority))
+      : styleValue(this.node(), name);
+});
+
+function styleValue(node, name) {
+  return node.style.getPropertyValue(name)
+      || Object(_window__WEBPACK_IMPORTED_MODULE_0__["default"])(node).getComputedStyle(node, null).getPropertyValue(name);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selection/text.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-selection/src/selection/text.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function textRemove() {
+  this.textContent = "";
+}
+
+function textConstant(value) {
+  return function() {
+    this.textContent = value;
+  };
+}
+
+function textFunction(value) {
+  return function() {
+    var v = value.apply(this, arguments);
+    this.textContent = v == null ? "" : v;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(value) {
+  return arguments.length
+      ? this.each(value == null
+          ? textRemove : (typeof value === "function"
+          ? textFunction
+          : textConstant)(value))
+      : this.node().textContent;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selector.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-selection/src/selector.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function none() {}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
+  return selector == null ? none : function() {
+    return this.querySelector(selector);
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/selectorAll.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-selection/src/selectorAll.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function empty() {
+  return [];
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(selector) {
+  return selector == null ? empty : function() {
+    return this.querySelectorAll(selector);
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/sourceEvent.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-selection/src/sourceEvent.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _selection_on__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./selection/on */ "./node_modules/d3-selection/src/selection/on.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var current = _selection_on__WEBPACK_IMPORTED_MODULE_0__["event"], source;
+  while (source = current.sourceEvent) current = source;
+  return current;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/touch.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-selection/src/touch.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _sourceEvent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sourceEvent */ "./node_modules/d3-selection/src/sourceEvent.js");
+/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point */ "./node_modules/d3-selection/src/point.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(node, touches, identifier) {
+  if (arguments.length < 3) identifier = touches, touches = Object(_sourceEvent__WEBPACK_IMPORTED_MODULE_0__["default"])().changedTouches;
+
+  for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
+    if ((touch = touches[i]).identifier === identifier) {
+      return Object(_point__WEBPACK_IMPORTED_MODULE_1__["default"])(node, touch);
+    }
+  }
+
+  return null;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/touches.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-selection/src/touches.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _sourceEvent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sourceEvent */ "./node_modules/d3-selection/src/sourceEvent.js");
+/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point */ "./node_modules/d3-selection/src/point.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(node, touches) {
+  if (touches == null) touches = Object(_sourceEvent__WEBPACK_IMPORTED_MODULE_0__["default"])().touches;
+
+  for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
+    points[i] = Object(_point__WEBPACK_IMPORTED_MODULE_1__["default"])(node, touches[i]);
+  }
+
+  return points;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-selection/src/window.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-selection/src/window.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(node) {
+  return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
+      || (node.document && node) // node is a Window
+      || node.defaultView; // node is a Document
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/arc.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-shape/src/arc.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-shape/src/constant.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-shape/src/math.js");
+
+
+
+
+function arcInnerRadius(d) {
+  return d.innerRadius;
+}
+
+function arcOuterRadius(d) {
+  return d.outerRadius;
+}
+
+function arcStartAngle(d) {
+  return d.startAngle;
+}
+
+function arcEndAngle(d) {
+  return d.endAngle;
+}
+
+function arcPadAngle(d) {
+  return d && d.padAngle; // Note: optional!
+}
+
+function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
+  var x10 = x1 - x0, y10 = y1 - y0,
+      x32 = x3 - x2, y32 = y3 - y2,
+      t = y32 * x10 - x32 * y10;
+  if (t * t < _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) return;
+  t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;
+  return [x0 + t * x10, y0 + t * y10];
+}
+
+// Compute perpendicular offset line of length rc.
+// http://mathworld.wolfram.com/Circle-LineIntersection.html
+function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
+  var x01 = x0 - x1,
+      y01 = y0 - y1,
+      lo = (cw ? rc : -rc) / Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(x01 * x01 + y01 * y01),
+      ox = lo * y01,
+      oy = -lo * x01,
+      x11 = x0 + ox,
+      y11 = y0 + oy,
+      x10 = x1 + ox,
+      y10 = y1 + oy,
+      x00 = (x11 + x10) / 2,
+      y00 = (y11 + y10) / 2,
+      dx = x10 - x11,
+      dy = y10 - y11,
+      d2 = dx * dx + dy * dy,
+      r = r1 - rc,
+      D = x11 * y10 - x10 * y11,
+      d = (dy < 0 ? -1 : 1) * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["max"])(0, r * r * d2 - D * D)),
+      cx0 = (D * dy - dx * d) / d2,
+      cy0 = (-D * dx - dy * d) / d2,
+      cx1 = (D * dy + dx * d) / d2,
+      cy1 = (-D * dx + dy * d) / d2,
+      dx0 = cx0 - x00,
+      dy0 = cy0 - y00,
+      dx1 = cx1 - x00,
+      dy1 = cy1 - y00;
+
+  // Pick the closer of the two intersection points.
+  // TODO Is there a faster way to determine which intersection to use?
+  if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
+
+  return {
+    cx: cx0,
+    cy: cy0,
+    x01: -ox,
+    y01: -oy,
+    x11: cx0 * (r1 / r - 1),
+    y11: cy0 * (r1 / r - 1)
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var innerRadius = arcInnerRadius,
+      outerRadius = arcOuterRadius,
+      cornerRadius = Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(0),
+      padRadius = null,
+      startAngle = arcStartAngle,
+      endAngle = arcEndAngle,
+      padAngle = arcPadAngle,
+      context = null;
+
+  function arc() {
+    var buffer,
+        r,
+        r0 = +innerRadius.apply(this, arguments),
+        r1 = +outerRadius.apply(this, arguments),
+        a0 = startAngle.apply(this, arguments) - _math_js__WEBPACK_IMPORTED_MODULE_2__["halfPi"],
+        a1 = endAngle.apply(this, arguments) - _math_js__WEBPACK_IMPORTED_MODULE_2__["halfPi"],
+        da = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["abs"])(a1 - a0),
+        cw = a1 > a0;
+
+    if (!context) context = buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])();
+
+    // Ensure that the outer radius is always larger than the inner radius.
+    if (r1 < r0) r = r1, r1 = r0, r0 = r;
+
+    // Is it a point?
+    if (!(r1 > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"])) context.moveTo(0, 0);
+
+    // Or is it a circle or annulus?
+    else if (da > _math_js__WEBPACK_IMPORTED_MODULE_2__["tau"] - _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
+      context.moveTo(r1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(a0), r1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(a0));
+      context.arc(0, 0, r1, a0, a1, !cw);
+      if (r0 > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
+        context.moveTo(r0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(a1), r0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(a1));
+        context.arc(0, 0, r0, a1, a0, cw);
+      }
+    }
+
+    // Or is it a circular or annular sector?
+    else {
+      var a01 = a0,
+          a11 = a1,
+          a00 = a0,
+          a10 = a1,
+          da0 = da,
+          da1 = da,
+          ap = padAngle.apply(this, arguments) / 2,
+          rp = (ap > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) && (padRadius ? +padRadius.apply(this, arguments) : Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(r0 * r0 + r1 * r1)),
+          rc = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["min"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["abs"])(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
+          rc0 = rc,
+          rc1 = rc,
+          t0,
+          t1;
+
+      // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
+      if (rp > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
+        var p0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["asin"])(rp / r0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(ap)),
+            p1 = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["asin"])(rp / r1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(ap));
+        if ((da0 -= p0 * 2) > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
+        else da0 = 0, a00 = a10 = (a0 + a1) / 2;
+        if ((da1 -= p1 * 2) > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
+        else da1 = 0, a01 = a11 = (a0 + a1) / 2;
+      }
+
+      var x01 = r1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(a01),
+          y01 = r1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(a01),
+          x10 = r0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(a10),
+          y10 = r0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(a10);
+
+      // Apply rounded corners?
+      if (rc > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
+        var x11 = r1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(a11),
+            y11 = r1 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(a11),
+            x00 = r0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(a00),
+            y00 = r0 * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(a00),
+            oc;
+
+        // Restrict the corner radius according to the sector angle.
+        if (da < _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"] && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {
+          var ax = x01 - oc[0],
+              ay = y01 - oc[1],
+              bx = x11 - oc[0],
+              by = y11 - oc[1],
+              kc = 1 / Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["acos"])((ax * bx + ay * by) / (Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(ax * ax + ay * ay) * Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(bx * bx + by * by))) / 2),
+              lc = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sqrt"])(oc[0] * oc[0] + oc[1] * oc[1]);
+          rc0 = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["min"])(rc, (r0 - lc) / (kc - 1));
+          rc1 = Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["min"])(rc, (r1 - lc) / (kc + 1));
+        }
+      }
+
+      // Is the sector collapsed to a line?
+      if (!(da1 > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"])) context.moveTo(x01, y01);
+
+      // Does the sector’s outer ring have rounded corners?
+      else if (rc1 > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
+        t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
+        t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
+
+        context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
+
+        // Have the corners merged?
+        if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y01, t0.x01), Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y01, t1.x01), !cw);
+
+        // Otherwise, draw the two corners and the ring.
+        else {
+          context.arc(t0.cx, t0.cy, rc1, Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y01, t0.x01), Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y11, t0.x11), !cw);
+          context.arc(0, 0, r1, Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.cy + t0.y11, t0.cx + t0.x11), Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.cy + t1.y11, t1.cx + t1.x11), !cw);
+          context.arc(t1.cx, t1.cy, rc1, Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y11, t1.x11), Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y01, t1.x01), !cw);
+        }
+      }
+
+      // Or is the outer ring just a circular arc?
+      else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
+
+      // Is there no inner ring, and it’s a circular sector?
+      // Or perhaps it’s an annular sector collapsed due to padding?
+      if (!(r0 > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) || !(da0 > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"])) context.lineTo(x10, y10);
+
+      // Does the sector’s inner ring (or point) have rounded corners?
+      else if (rc0 > _math_js__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) {
+        t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
+        t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
+
+        context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
+
+        // Have the corners merged?
+        if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y01, t0.x01), Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y01, t1.x01), !cw);
+
+        // Otherwise, draw the two corners and the ring.
+        else {
+          context.arc(t0.cx, t0.cy, rc0, Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y01, t0.x01), Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.y11, t0.x11), !cw);
+          context.arc(0, 0, r0, Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t0.cy + t0.y11, t0.cx + t0.x11), Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.cy + t1.y11, t1.cx + t1.x11), cw);
+          context.arc(t1.cx, t1.cy, rc0, Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y11, t1.x11), Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["atan2"])(t1.y01, t1.x01), !cw);
+        }
+      }
+
+      // Or is the inner ring just a circular arc?
+      else context.arc(0, 0, r0, a10, a00, cw);
+    }
+
+    context.closePath();
+
+    if (buffer) return context = null, buffer + "" || null;
+  }
+
+  arc.centroid = function() {
+    var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
+        a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - _math_js__WEBPACK_IMPORTED_MODULE_2__["pi"] / 2;
+    return [Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["cos"])(a) * r, Object(_math_js__WEBPACK_IMPORTED_MODULE_2__["sin"])(a) * r];
+  };
+
+  arc.innerRadius = function(_) {
+    return arguments.length ? (innerRadius = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : innerRadius;
+  };
+
+  arc.outerRadius = function(_) {
+    return arguments.length ? (outerRadius = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : outerRadius;
+  };
+
+  arc.cornerRadius = function(_) {
+    return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : cornerRadius;
+  };
+
+  arc.padRadius = function(_) {
+    return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : padRadius;
+  };
+
+  arc.startAngle = function(_) {
+    return arguments.length ? (startAngle = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : startAngle;
+  };
+
+  arc.endAngle = function(_) {
+    return arguments.length ? (endAngle = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : endAngle;
+  };
+
+  arc.padAngle = function(_) {
+    return arguments.length ? (padAngle = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), arc) : padAngle;
+  };
+
+  arc.context = function(_) {
+    return arguments.length ? ((context = _ == null ? null : _), arc) : context;
+  };
+
+  return arc;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/area.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-shape/src/area.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-shape/src/constant.js");
+/* harmony import */ var _curve_linear_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./curve/linear.js */ "./node_modules/d3-shape/src/curve/linear.js");
+/* harmony import */ var _line_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./line.js */ "./node_modules/d3-shape/src/line.js");
+/* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./point.js */ "./node_modules/d3-shape/src/point.js");
+
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var x0 = _point_js__WEBPACK_IMPORTED_MODULE_4__["x"],
+      x1 = null,
+      y0 = Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(0),
+      y1 = _point_js__WEBPACK_IMPORTED_MODULE_4__["y"],
+      defined = Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(true),
+      context = null,
+      curve = _curve_linear_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+      output = null;
+
+  function area(data) {
+    var i,
+        j,
+        k,
+        n = data.length,
+        d,
+        defined0 = false,
+        buffer,
+        x0z = new Array(n),
+        y0z = new Array(n);
+
+    if (context == null) output = curve(buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])());
+
+    for (i = 0; i <= n; ++i) {
+      if (!(i < n && defined(d = data[i], i, data)) === defined0) {
+        if (defined0 = !defined0) {
+          j = i;
+          output.areaStart();
+          output.lineStart();
+        } else {
+          output.lineEnd();
+          output.lineStart();
+          for (k = i - 1; k >= j; --k) {
+            output.point(x0z[k], y0z[k]);
+          }
+          output.lineEnd();
+          output.areaEnd();
+        }
+      }
+      if (defined0) {
+        x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
+        output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
+      }
+    }
+
+    if (buffer) return output = null, buffer + "" || null;
+  }
+
+  function arealine() {
+    return Object(_line_js__WEBPACK_IMPORTED_MODULE_3__["default"])().defined(defined).curve(curve).context(context);
+  }
+
+  area.x = function(_) {
+    return arguments.length ? (x0 = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), x1 = null, area) : x0;
+  };
+
+  area.x0 = function(_) {
+    return arguments.length ? (x0 = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), area) : x0;
+  };
+
+  area.x1 = function(_) {
+    return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), area) : x1;
+  };
+
+  area.y = function(_) {
+    return arguments.length ? (y0 = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), y1 = null, area) : y0;
+  };
+
+  area.y0 = function(_) {
+    return arguments.length ? (y0 = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), area) : y0;
+  };
+
+  area.y1 = function(_) {
+    return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), area) : y1;
+  };
+
+  area.lineX0 =
+  area.lineY0 = function() {
+    return arealine().x(x0).y(y0);
+  };
+
+  area.lineY1 = function() {
+    return arealine().x(x0).y(y1);
+  };
+
+  area.lineX1 = function() {
+    return arealine().x(x1).y(y0);
+  };
+
+  area.defined = function(_) {
+    return arguments.length ? (defined = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(!!_), area) : defined;
+  };
+
+  area.curve = function(_) {
+    return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
+  };
+
+  area.context = function(_) {
+    return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
+  };
+
+  return area;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/areaRadial.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-shape/src/areaRadial.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _curve_radial_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curve/radial.js */ "./node_modules/d3-shape/src/curve/radial.js");
+/* harmony import */ var _area_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./area.js */ "./node_modules/d3-shape/src/area.js");
+/* harmony import */ var _lineRadial_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lineRadial.js */ "./node_modules/d3-shape/src/lineRadial.js");
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var a = Object(_area_js__WEBPACK_IMPORTED_MODULE_1__["default"])().curve(_curve_radial_js__WEBPACK_IMPORTED_MODULE_0__["curveRadialLinear"]),
+      c = a.curve,
+      x0 = a.lineX0,
+      x1 = a.lineX1,
+      y0 = a.lineY0,
+      y1 = a.lineY1;
+
+  a.angle = a.x, delete a.x;
+  a.startAngle = a.x0, delete a.x0;
+  a.endAngle = a.x1, delete a.x1;
+  a.radius = a.y, delete a.y;
+  a.innerRadius = a.y0, delete a.y0;
+  a.outerRadius = a.y1, delete a.y1;
+  a.lineStartAngle = function() { return Object(_lineRadial_js__WEBPACK_IMPORTED_MODULE_2__["lineRadial"])(x0()); }, delete a.lineX0;
+  a.lineEndAngle = function() { return Object(_lineRadial_js__WEBPACK_IMPORTED_MODULE_2__["lineRadial"])(x1()); }, delete a.lineX1;
+  a.lineInnerRadius = function() { return Object(_lineRadial_js__WEBPACK_IMPORTED_MODULE_2__["lineRadial"])(y0()); }, delete a.lineY0;
+  a.lineOuterRadius = function() { return Object(_lineRadial_js__WEBPACK_IMPORTED_MODULE_2__["lineRadial"])(y1()); }, delete a.lineY1;
+
+  a.curve = function(_) {
+    return arguments.length ? c(Object(_curve_radial_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_)) : c()._curve;
+  };
+
+  return a;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/array.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-shape/src/array.js ***!
+  \********************************************/
+/*! exports provided: slice */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "slice", function() { return slice; });
+var slice = Array.prototype.slice;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/constant.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-shape/src/constant.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function constant() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/basis.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/basis.js ***!
+  \**************************************************/
+/*! exports provided: point, Basis, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "point", function() { return point; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Basis", function() { return Basis; });
+function point(that, x, y) {
+  that._context.bezierCurveTo(
+    (2 * that._x0 + that._x1) / 3,
+    (2 * that._y0 + that._y1) / 3,
+    (that._x0 + 2 * that._x1) / 3,
+    (that._y0 + 2 * that._y1) / 3,
+    (that._x0 + 4 * that._x1 + x) / 6,
+    (that._y0 + 4 * that._y1 + y) / 6
+  );
+}
+
+function Basis(context) {
+  this._context = context;
+}
+
+Basis.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._x0 = this._x1 =
+    this._y0 = this._y1 = NaN;
+    this._point = 0;
+  },
+  lineEnd: function() {
+    switch (this._point) {
+      case 3: point(this, this._x1, this._y1); // proceed
+      case 2: this._context.lineTo(this._x1, this._y1); break;
+    }
+    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
+    this._line = 1 - this._line;
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+    switch (this._point) {
+      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
+      case 1: this._point = 2; break;
+      case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
+      default: point(this, x, y); break;
+    }
+    this._x0 = this._x1, this._x1 = x;
+    this._y0 = this._y1, this._y1 = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function(context) {
+  return new Basis(context);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/basisClosed.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/basisClosed.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../noop.js */ "./node_modules/d3-shape/src/noop.js");
+/* harmony import */ var _basis_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./basis.js */ "./node_modules/d3-shape/src/curve/basis.js");
+
+
+
+function BasisClosed(context) {
+  this._context = context;
+}
+
+BasisClosed.prototype = {
+  areaStart: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  areaEnd: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  lineStart: function() {
+    this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
+    this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
+    this._point = 0;
+  },
+  lineEnd: function() {
+    switch (this._point) {
+      case 1: {
+        this._context.moveTo(this._x2, this._y2);
+        this._context.closePath();
+        break;
+      }
+      case 2: {
+        this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
+        this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
+        this._context.closePath();
+        break;
+      }
+      case 3: {
+        this.point(this._x2, this._y2);
+        this.point(this._x3, this._y3);
+        this.point(this._x4, this._y4);
+        break;
+      }
+    }
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+    switch (this._point) {
+      case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
+      case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
+      case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;
+      default: Object(_basis_js__WEBPACK_IMPORTED_MODULE_1__["point"])(this, x, y); break;
+    }
+    this._x0 = this._x1, this._x1 = x;
+    this._y0 = this._y1, this._y1 = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function(context) {
+  return new BasisClosed(context);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/basisOpen.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/basisOpen.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _basis_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./basis.js */ "./node_modules/d3-shape/src/curve/basis.js");
+
+
+function BasisOpen(context) {
+  this._context = context;
+}
+
+BasisOpen.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._x0 = this._x1 =
+    this._y0 = this._y1 = NaN;
+    this._point = 0;
+  },
+  lineEnd: function() {
+    if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
+    this._line = 1 - this._line;
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+    switch (this._point) {
+      case 0: this._point = 1; break;
+      case 1: this._point = 2; break;
+      case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;
+      case 3: this._point = 4; // proceed
+      default: Object(_basis_js__WEBPACK_IMPORTED_MODULE_0__["point"])(this, x, y); break;
+    }
+    this._x0 = this._x1, this._x1 = x;
+    this._y0 = this._y1, this._y1 = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function(context) {
+  return new BasisOpen(context);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/bundle.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/bundle.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _basis_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./basis.js */ "./node_modules/d3-shape/src/curve/basis.js");
+
+
+function Bundle(context, beta) {
+  this._basis = new _basis_js__WEBPACK_IMPORTED_MODULE_0__["Basis"](context);
+  this._beta = beta;
+}
+
+Bundle.prototype = {
+  lineStart: function() {
+    this._x = [];
+    this._y = [];
+    this._basis.lineStart();
+  },
+  lineEnd: function() {
+    var x = this._x,
+        y = this._y,
+        j = x.length - 1;
+
+    if (j > 0) {
+      var x0 = x[0],
+          y0 = y[0],
+          dx = x[j] - x0,
+          dy = y[j] - y0,
+          i = -1,
+          t;
+
+      while (++i <= j) {
+        t = i / j;
+        this._basis.point(
+          this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
+          this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
+        );
+      }
+    }
+
+    this._x = this._y = null;
+    this._basis.lineEnd();
+  },
+  point: function(x, y) {
+    this._x.push(+x);
+    this._y.push(+y);
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ((function custom(beta) {
+
+  function bundle(context) {
+    return beta === 1 ? new _basis_js__WEBPACK_IMPORTED_MODULE_0__["Basis"](context) : new Bundle(context, beta);
+  }
+
+  bundle.beta = function(beta) {
+    return custom(+beta);
+  };
+
+  return bundle;
+})(0.85));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/cardinal.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/cardinal.js ***!
+  \*****************************************************/
+/*! exports provided: point, Cardinal, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "point", function() { return point; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Cardinal", function() { return Cardinal; });
+function point(that, x, y) {
+  that._context.bezierCurveTo(
+    that._x1 + that._k * (that._x2 - that._x0),
+    that._y1 + that._k * (that._y2 - that._y0),
+    that._x2 + that._k * (that._x1 - x),
+    that._y2 + that._k * (that._y1 - y),
+    that._x2,
+    that._y2
+  );
+}
+
+function Cardinal(context, tension) {
+  this._context = context;
+  this._k = (1 - tension) / 6;
+}
+
+Cardinal.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._x0 = this._x1 = this._x2 =
+    this._y0 = this._y1 = this._y2 = NaN;
+    this._point = 0;
+  },
+  lineEnd: function() {
+    switch (this._point) {
+      case 2: this._context.lineTo(this._x2, this._y2); break;
+      case 3: point(this, this._x1, this._y1); break;
+    }
+    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
+    this._line = 1 - this._line;
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+    switch (this._point) {
+      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
+      case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
+      case 2: this._point = 3; // proceed
+      default: point(this, x, y); break;
+    }
+    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
+    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ((function custom(tension) {
+
+  function cardinal(context) {
+    return new Cardinal(context, tension);
+  }
+
+  cardinal.tension = function(tension) {
+    return custom(+tension);
+  };
+
+  return cardinal;
+})(0));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/cardinalClosed.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/cardinalClosed.js ***!
+  \***********************************************************/
+/*! exports provided: CardinalClosed, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardinalClosed", function() { return CardinalClosed; });
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../noop.js */ "./node_modules/d3-shape/src/noop.js");
+/* harmony import */ var _cardinal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cardinal.js */ "./node_modules/d3-shape/src/curve/cardinal.js");
+
+
+
+function CardinalClosed(context, tension) {
+  this._context = context;
+  this._k = (1 - tension) / 6;
+}
+
+CardinalClosed.prototype = {
+  areaStart: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  areaEnd: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  lineStart: function() {
+    this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
+    this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
+    this._point = 0;
+  },
+  lineEnd: function() {
+    switch (this._point) {
+      case 1: {
+        this._context.moveTo(this._x3, this._y3);
+        this._context.closePath();
+        break;
+      }
+      case 2: {
+        this._context.lineTo(this._x3, this._y3);
+        this._context.closePath();
+        break;
+      }
+      case 3: {
+        this.point(this._x3, this._y3);
+        this.point(this._x4, this._y4);
+        this.point(this._x5, this._y5);
+        break;
+      }
+    }
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+    switch (this._point) {
+      case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
+      case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
+      case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
+      default: Object(_cardinal_js__WEBPACK_IMPORTED_MODULE_1__["point"])(this, x, y); break;
+    }
+    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
+    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ((function custom(tension) {
+
+  function cardinal(context) {
+    return new CardinalClosed(context, tension);
+  }
+
+  cardinal.tension = function(tension) {
+    return custom(+tension);
+  };
+
+  return cardinal;
+})(0));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/cardinalOpen.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/cardinalOpen.js ***!
+  \*********************************************************/
+/*! exports provided: CardinalOpen, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CardinalOpen", function() { return CardinalOpen; });
+/* harmony import */ var _cardinal_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cardinal.js */ "./node_modules/d3-shape/src/curve/cardinal.js");
+
+
+function CardinalOpen(context, tension) {
+  this._context = context;
+  this._k = (1 - tension) / 6;
+}
+
+CardinalOpen.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._x0 = this._x1 = this._x2 =
+    this._y0 = this._y1 = this._y2 = NaN;
+    this._point = 0;
+  },
+  lineEnd: function() {
+    if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
+    this._line = 1 - this._line;
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+    switch (this._point) {
+      case 0: this._point = 1; break;
+      case 1: this._point = 2; break;
+      case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
+      case 3: this._point = 4; // proceed
+      default: Object(_cardinal_js__WEBPACK_IMPORTED_MODULE_0__["point"])(this, x, y); break;
+    }
+    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
+    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ((function custom(tension) {
+
+  function cardinal(context) {
+    return new CardinalOpen(context, tension);
+  }
+
+  cardinal.tension = function(tension) {
+    return custom(+tension);
+  };
+
+  return cardinal;
+})(0));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/catmullRom.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/catmullRom.js ***!
+  \*******************************************************/
+/*! exports provided: point, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "point", function() { return point; });
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-shape/src/math.js");
+/* harmony import */ var _cardinal_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cardinal.js */ "./node_modules/d3-shape/src/curve/cardinal.js");
+
+
+
+function point(that, x, y) {
+  var x1 = that._x1,
+      y1 = that._y1,
+      x2 = that._x2,
+      y2 = that._y2;
+
+  if (that._l01_a > _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]) {
+    var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
+        n = 3 * that._l01_a * (that._l01_a + that._l12_a);
+    x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
+    y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
+  }
+
+  if (that._l23_a > _math_js__WEBPACK_IMPORTED_MODULE_0__["epsilon"]) {
+    var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
+        m = 3 * that._l23_a * (that._l23_a + that._l12_a);
+    x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
+    y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
+  }
+
+  that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
+}
+
+function CatmullRom(context, alpha) {
+  this._context = context;
+  this._alpha = alpha;
+}
+
+CatmullRom.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._x0 = this._x1 = this._x2 =
+    this._y0 = this._y1 = this._y2 = NaN;
+    this._l01_a = this._l12_a = this._l23_a =
+    this._l01_2a = this._l12_2a = this._l23_2a =
+    this._point = 0;
+  },
+  lineEnd: function() {
+    switch (this._point) {
+      case 2: this._context.lineTo(this._x2, this._y2); break;
+      case 3: this.point(this._x2, this._y2); break;
+    }
+    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
+    this._line = 1 - this._line;
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+
+    if (this._point) {
+      var x23 = this._x2 - x,
+          y23 = this._y2 - y;
+      this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
+    }
+
+    switch (this._point) {
+      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
+      case 1: this._point = 2; break;
+      case 2: this._point = 3; // proceed
+      default: point(this, x, y); break;
+    }
+
+    this._l01_a = this._l12_a, this._l12_a = this._l23_a;
+    this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
+    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
+    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ((function custom(alpha) {
+
+  function catmullRom(context) {
+    return alpha ? new CatmullRom(context, alpha) : new _cardinal_js__WEBPACK_IMPORTED_MODULE_1__["Cardinal"](context, 0);
+  }
+
+  catmullRom.alpha = function(alpha) {
+    return custom(+alpha);
+  };
+
+  return catmullRom;
+})(0.5));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/catmullRomClosed.js":
+/*!*************************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/catmullRomClosed.js ***!
+  \*************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _cardinalClosed_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cardinalClosed.js */ "./node_modules/d3-shape/src/curve/cardinalClosed.js");
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../noop.js */ "./node_modules/d3-shape/src/noop.js");
+/* harmony import */ var _catmullRom_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./catmullRom.js */ "./node_modules/d3-shape/src/curve/catmullRom.js");
+
+
+
+
+function CatmullRomClosed(context, alpha) {
+  this._context = context;
+  this._alpha = alpha;
+}
+
+CatmullRomClosed.prototype = {
+  areaStart: _noop_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+  areaEnd: _noop_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+  lineStart: function() {
+    this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
+    this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
+    this._l01_a = this._l12_a = this._l23_a =
+    this._l01_2a = this._l12_2a = this._l23_2a =
+    this._point = 0;
+  },
+  lineEnd: function() {
+    switch (this._point) {
+      case 1: {
+        this._context.moveTo(this._x3, this._y3);
+        this._context.closePath();
+        break;
+      }
+      case 2: {
+        this._context.lineTo(this._x3, this._y3);
+        this._context.closePath();
+        break;
+      }
+      case 3: {
+        this.point(this._x3, this._y3);
+        this.point(this._x4, this._y4);
+        this.point(this._x5, this._y5);
+        break;
+      }
+    }
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+
+    if (this._point) {
+      var x23 = this._x2 - x,
+          y23 = this._y2 - y;
+      this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
+    }
+
+    switch (this._point) {
+      case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
+      case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
+      case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
+      default: Object(_catmullRom_js__WEBPACK_IMPORTED_MODULE_2__["point"])(this, x, y); break;
+    }
+
+    this._l01_a = this._l12_a, this._l12_a = this._l23_a;
+    this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
+    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
+    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ((function custom(alpha) {
+
+  function catmullRom(context) {
+    return alpha ? new CatmullRomClosed(context, alpha) : new _cardinalClosed_js__WEBPACK_IMPORTED_MODULE_0__["CardinalClosed"](context, 0);
+  }
+
+  catmullRom.alpha = function(alpha) {
+    return custom(+alpha);
+  };
+
+  return catmullRom;
+})(0.5));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/catmullRomOpen.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/catmullRomOpen.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _cardinalOpen_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cardinalOpen.js */ "./node_modules/d3-shape/src/curve/cardinalOpen.js");
+/* harmony import */ var _catmullRom_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./catmullRom.js */ "./node_modules/d3-shape/src/curve/catmullRom.js");
+
+
+
+function CatmullRomOpen(context, alpha) {
+  this._context = context;
+  this._alpha = alpha;
+}
+
+CatmullRomOpen.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._x0 = this._x1 = this._x2 =
+    this._y0 = this._y1 = this._y2 = NaN;
+    this._l01_a = this._l12_a = this._l23_a =
+    this._l01_2a = this._l12_2a = this._l23_2a =
+    this._point = 0;
+  },
+  lineEnd: function() {
+    if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
+    this._line = 1 - this._line;
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+
+    if (this._point) {
+      var x23 = this._x2 - x,
+          y23 = this._y2 - y;
+      this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
+    }
+
+    switch (this._point) {
+      case 0: this._point = 1; break;
+      case 1: this._point = 2; break;
+      case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
+      case 3: this._point = 4; // proceed
+      default: Object(_catmullRom_js__WEBPACK_IMPORTED_MODULE_1__["point"])(this, x, y); break;
+    }
+
+    this._l01_a = this._l12_a, this._l12_a = this._l23_a;
+    this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
+    this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
+    this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ((function custom(alpha) {
+
+  function catmullRom(context) {
+    return alpha ? new CatmullRomOpen(context, alpha) : new _cardinalOpen_js__WEBPACK_IMPORTED_MODULE_0__["CardinalOpen"](context, 0);
+  }
+
+  catmullRom.alpha = function(alpha) {
+    return custom(+alpha);
+  };
+
+  return catmullRom;
+})(0.5));
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/linear.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/linear.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function Linear(context) {
+  this._context = context;
+}
+
+Linear.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._point = 0;
+  },
+  lineEnd: function() {
+    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
+    this._line = 1 - this._line;
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+    switch (this._point) {
+      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
+      case 1: this._point = 2; // proceed
+      default: this._context.lineTo(x, y); break;
+    }
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function(context) {
+  return new Linear(context);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/linearClosed.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/linearClosed.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _noop_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../noop.js */ "./node_modules/d3-shape/src/noop.js");
+
+
+function LinearClosed(context) {
+  this._context = context;
+}
+
+LinearClosed.prototype = {
+  areaStart: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  areaEnd: _noop_js__WEBPACK_IMPORTED_MODULE_0__["default"],
+  lineStart: function() {
+    this._point = 0;
+  },
+  lineEnd: function() {
+    if (this._point) this._context.closePath();
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+    if (this._point) this._context.lineTo(x, y);
+    else this._point = 1, this._context.moveTo(x, y);
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function(context) {
+  return new LinearClosed(context);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/monotone.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/monotone.js ***!
+  \*****************************************************/
+/*! exports provided: monotoneX, monotoneY */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "monotoneX", function() { return monotoneX; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "monotoneY", function() { return monotoneY; });
+function sign(x) {
+  return x < 0 ? -1 : 1;
+}
+
+// Calculate the slopes of the tangents (Hermite-type interpolation) based on
+// the following paper: Steffen, M. 1990. A Simple Method for Monotonic
+// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
+// NOV(II), P. 443, 1990.
+function slope3(that, x2, y2) {
+  var h0 = that._x1 - that._x0,
+      h1 = x2 - that._x1,
+      s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
+      s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
+      p = (s0 * h1 + s1 * h0) / (h0 + h1);
+  return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
+}
+
+// Calculate a one-sided slope.
+function slope2(that, t) {
+  var h = that._x1 - that._x0;
+  return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
+}
+
+// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
+// "you can express cubic Hermite interpolation in terms of cubic Bézier curves
+// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
+function point(that, t0, t1) {
+  var x0 = that._x0,
+      y0 = that._y0,
+      x1 = that._x1,
+      y1 = that._y1,
+      dx = (x1 - x0) / 3;
+  that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
+}
+
+function MonotoneX(context) {
+  this._context = context;
+}
+
+MonotoneX.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._x0 = this._x1 =
+    this._y0 = this._y1 =
+    this._t0 = NaN;
+    this._point = 0;
+  },
+  lineEnd: function() {
+    switch (this._point) {
+      case 2: this._context.lineTo(this._x1, this._y1); break;
+      case 3: point(this, this._t0, slope2(this, this._t0)); break;
+    }
+    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
+    this._line = 1 - this._line;
+  },
+  point: function(x, y) {
+    var t1 = NaN;
+
+    x = +x, y = +y;
+    if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
+    switch (this._point) {
+      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
+      case 1: this._point = 2; break;
+      case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
+      default: point(this, this._t0, t1 = slope3(this, x, y)); break;
+    }
+
+    this._x0 = this._x1, this._x1 = x;
+    this._y0 = this._y1, this._y1 = y;
+    this._t0 = t1;
+  }
+}
+
+function MonotoneY(context) {
+  this._context = new ReflectContext(context);
+}
+
+(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
+  MonotoneX.prototype.point.call(this, y, x);
+};
+
+function ReflectContext(context) {
+  this._context = context;
+}
+
+ReflectContext.prototype = {
+  moveTo: function(x, y) { this._context.moveTo(y, x); },
+  closePath: function() { this._context.closePath(); },
+  lineTo: function(x, y) { this._context.lineTo(y, x); },
+  bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
+};
+
+function monotoneX(context) {
+  return new MonotoneX(context);
+}
+
+function monotoneY(context) {
+  return new MonotoneY(context);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/natural.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/natural.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function Natural(context) {
+  this._context = context;
+}
+
+Natural.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._x = [];
+    this._y = [];
+  },
+  lineEnd: function() {
+    var x = this._x,
+        y = this._y,
+        n = x.length;
+
+    if (n) {
+      this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
+      if (n === 2) {
+        this._context.lineTo(x[1], y[1]);
+      } else {
+        var px = controlPoints(x),
+            py = controlPoints(y);
+        for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
+          this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
+        }
+      }
+    }
+
+    if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
+    this._line = 1 - this._line;
+    this._x = this._y = null;
+  },
+  point: function(x, y) {
+    this._x.push(+x);
+    this._y.push(+y);
+  }
+};
+
+// See https://www.particleincell.com/2012/bezier-splines/ for derivation.
+function controlPoints(x) {
+  var i,
+      n = x.length - 1,
+      m,
+      a = new Array(n),
+      b = new Array(n),
+      r = new Array(n);
+  a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
+  for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
+  a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
+  for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
+  a[n - 1] = r[n - 1] / b[n - 1];
+  for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
+  b[n - 1] = (x[n] + a[n - 1]) / 2;
+  for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
+  return [a, b];
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(context) {
+  return new Natural(context);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/radial.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/radial.js ***!
+  \***************************************************/
+/*! exports provided: curveRadialLinear, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "curveRadialLinear", function() { return curveRadialLinear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return curveRadial; });
+/* harmony import */ var _linear_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./linear.js */ "./node_modules/d3-shape/src/curve/linear.js");
+
+
+var curveRadialLinear = curveRadial(_linear_js__WEBPACK_IMPORTED_MODULE_0__["default"]);
+
+function Radial(curve) {
+  this._curve = curve;
+}
+
+Radial.prototype = {
+  areaStart: function() {
+    this._curve.areaStart();
+  },
+  areaEnd: function() {
+    this._curve.areaEnd();
+  },
+  lineStart: function() {
+    this._curve.lineStart();
+  },
+  lineEnd: function() {
+    this._curve.lineEnd();
+  },
+  point: function(a, r) {
+    this._curve.point(r * Math.sin(a), r * -Math.cos(a));
+  }
+};
+
+function curveRadial(curve) {
+
+  function radial(context) {
+    return new Radial(curve(context));
+  }
+
+  radial._curve = curve;
+
+  return radial;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/curve/step.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-shape/src/curve/step.js ***!
+  \*************************************************/
+/*! exports provided: default, stepBefore, stepAfter */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stepBefore", function() { return stepBefore; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stepAfter", function() { return stepAfter; });
+function Step(context, t) {
+  this._context = context;
+  this._t = t;
+}
+
+Step.prototype = {
+  areaStart: function() {
+    this._line = 0;
+  },
+  areaEnd: function() {
+    this._line = NaN;
+  },
+  lineStart: function() {
+    this._x = this._y = NaN;
+    this._point = 0;
+  },
+  lineEnd: function() {
+    if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
+    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
+    if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
+  },
+  point: function(x, y) {
+    x = +x, y = +y;
+    switch (this._point) {
+      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
+      case 1: this._point = 2; // proceed
+      default: {
+        if (this._t <= 0) {
+          this._context.lineTo(this._x, y);
+          this._context.lineTo(x, y);
+        } else {
+          var x1 = this._x * (1 - this._t) + x * this._t;
+          this._context.lineTo(x1, this._y);
+          this._context.lineTo(x1, y);
+        }
+        break;
+      }
+    }
+    this._x = x, this._y = y;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (function(context) {
+  return new Step(context, 0.5);
+});
+
+function stepBefore(context) {
+  return new Step(context, 0);
+}
+
+function stepAfter(context) {
+  return new Step(context, 1);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/descending.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-shape/src/descending.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/identity.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-shape/src/identity.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(d) {
+  return d;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-shape/src/index.js ***!
+  \********************************************/
+/*! exports provided: arc, area, line, pie, areaRadial, radialArea, lineRadial, radialLine, pointRadial, linkHorizontal, linkVertical, linkRadial, symbol, symbols, symbolCircle, symbolCross, symbolDiamond, symbolSquare, symbolStar, symbolTriangle, symbolWye, curveBasisClosed, curveBasisOpen, curveBasis, curveBundle, curveCardinalClosed, curveCardinalOpen, curveCardinal, curveCatmullRomClosed, curveCatmullRomOpen, curveCatmullRom, curveLinearClosed, curveLinear, curveMonotoneX, curveMonotoneY, curveNatural, curveStep, curveStepAfter, curveStepBefore, stack, stackOffsetExpand, stackOffsetDiverging, stackOffsetNone, stackOffsetSilhouette, stackOffsetWiggle, stackOrderAppearance, stackOrderAscending, stackOrderDescending, stackOrderInsideOut, stackOrderNone, stackOrderReverse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _arc_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arc.js */ "./node_modules/d3-shape/src/arc.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "arc", function() { return _arc_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _area_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./area.js */ "./node_modules/d3-shape/src/area.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "area", function() { return _area_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _line_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./line.js */ "./node_modules/d3-shape/src/line.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "line", function() { return _line_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _pie_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./pie.js */ "./node_modules/d3-shape/src/pie.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pie", function() { return _pie_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony import */ var _areaRadial_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./areaRadial.js */ "./node_modules/d3-shape/src/areaRadial.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "areaRadial", function() { return _areaRadial_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "radialArea", function() { return _areaRadial_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony import */ var _lineRadial_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lineRadial.js */ "./node_modules/d3-shape/src/lineRadial.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lineRadial", function() { return _lineRadial_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "radialLine", function() { return _lineRadial_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony import */ var _pointRadial_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pointRadial.js */ "./node_modules/d3-shape/src/pointRadial.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pointRadial", function() { return _pointRadial_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
+
+/* harmony import */ var _link_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./link/index.js */ "./node_modules/d3-shape/src/link/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linkHorizontal", function() { return _link_index_js__WEBPACK_IMPORTED_MODULE_7__["linkHorizontal"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linkVertical", function() { return _link_index_js__WEBPACK_IMPORTED_MODULE_7__["linkVertical"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linkRadial", function() { return _link_index_js__WEBPACK_IMPORTED_MODULE_7__["linkRadial"]; });
+
+/* harmony import */ var _symbol_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./symbol.js */ "./node_modules/d3-shape/src/symbol.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbol", function() { return _symbol_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbols", function() { return _symbol_js__WEBPACK_IMPORTED_MODULE_8__["symbols"]; });
+
+/* harmony import */ var _symbol_circle_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./symbol/circle.js */ "./node_modules/d3-shape/src/symbol/circle.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolCircle", function() { return _symbol_circle_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
+
+/* harmony import */ var _symbol_cross_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./symbol/cross.js */ "./node_modules/d3-shape/src/symbol/cross.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolCross", function() { return _symbol_cross_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony import */ var _symbol_diamond_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./symbol/diamond.js */ "./node_modules/d3-shape/src/symbol/diamond.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolDiamond", function() { return _symbol_diamond_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony import */ var _symbol_square_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./symbol/square.js */ "./node_modules/d3-shape/src/symbol/square.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolSquare", function() { return _symbol_square_js__WEBPACK_IMPORTED_MODULE_12__["default"]; });
+
+/* harmony import */ var _symbol_star_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./symbol/star.js */ "./node_modules/d3-shape/src/symbol/star.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolStar", function() { return _symbol_star_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
+
+/* harmony import */ var _symbol_triangle_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./symbol/triangle.js */ "./node_modules/d3-shape/src/symbol/triangle.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolTriangle", function() { return _symbol_triangle_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+/* harmony import */ var _symbol_wye_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./symbol/wye.js */ "./node_modules/d3-shape/src/symbol/wye.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolWye", function() { return _symbol_wye_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
+
+/* harmony import */ var _curve_basisClosed_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./curve/basisClosed.js */ "./node_modules/d3-shape/src/curve/basisClosed.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBasisClosed", function() { return _curve_basisClosed_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
+
+/* harmony import */ var _curve_basisOpen_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./curve/basisOpen.js */ "./node_modules/d3-shape/src/curve/basisOpen.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBasisOpen", function() { return _curve_basisOpen_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
+
+/* harmony import */ var _curve_basis_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./curve/basis.js */ "./node_modules/d3-shape/src/curve/basis.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBasis", function() { return _curve_basis_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
+
+/* harmony import */ var _curve_bundle_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./curve/bundle.js */ "./node_modules/d3-shape/src/curve/bundle.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBundle", function() { return _curve_bundle_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
+
+/* harmony import */ var _curve_cardinalClosed_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./curve/cardinalClosed.js */ "./node_modules/d3-shape/src/curve/cardinalClosed.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCardinalClosed", function() { return _curve_cardinalClosed_js__WEBPACK_IMPORTED_MODULE_20__["default"]; });
+
+/* harmony import */ var _curve_cardinalOpen_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./curve/cardinalOpen.js */ "./node_modules/d3-shape/src/curve/cardinalOpen.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCardinalOpen", function() { return _curve_cardinalOpen_js__WEBPACK_IMPORTED_MODULE_21__["default"]; });
+
+/* harmony import */ var _curve_cardinal_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./curve/cardinal.js */ "./node_modules/d3-shape/src/curve/cardinal.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCardinal", function() { return _curve_cardinal_js__WEBPACK_IMPORTED_MODULE_22__["default"]; });
+
+/* harmony import */ var _curve_catmullRomClosed_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./curve/catmullRomClosed.js */ "./node_modules/d3-shape/src/curve/catmullRomClosed.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCatmullRomClosed", function() { return _curve_catmullRomClosed_js__WEBPACK_IMPORTED_MODULE_23__["default"]; });
+
+/* harmony import */ var _curve_catmullRomOpen_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./curve/catmullRomOpen.js */ "./node_modules/d3-shape/src/curve/catmullRomOpen.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCatmullRomOpen", function() { return _curve_catmullRomOpen_js__WEBPACK_IMPORTED_MODULE_24__["default"]; });
+
+/* harmony import */ var _curve_catmullRom_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./curve/catmullRom.js */ "./node_modules/d3-shape/src/curve/catmullRom.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCatmullRom", function() { return _curve_catmullRom_js__WEBPACK_IMPORTED_MODULE_25__["default"]; });
+
+/* harmony import */ var _curve_linearClosed_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./curve/linearClosed.js */ "./node_modules/d3-shape/src/curve/linearClosed.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveLinearClosed", function() { return _curve_linearClosed_js__WEBPACK_IMPORTED_MODULE_26__["default"]; });
+
+/* harmony import */ var _curve_linear_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./curve/linear.js */ "./node_modules/d3-shape/src/curve/linear.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveLinear", function() { return _curve_linear_js__WEBPACK_IMPORTED_MODULE_27__["default"]; });
+
+/* harmony import */ var _curve_monotone_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./curve/monotone.js */ "./node_modules/d3-shape/src/curve/monotone.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveMonotoneX", function() { return _curve_monotone_js__WEBPACK_IMPORTED_MODULE_28__["monotoneX"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveMonotoneY", function() { return _curve_monotone_js__WEBPACK_IMPORTED_MODULE_28__["monotoneY"]; });
+
+/* harmony import */ var _curve_natural_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./curve/natural.js */ "./node_modules/d3-shape/src/curve/natural.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveNatural", function() { return _curve_natural_js__WEBPACK_IMPORTED_MODULE_29__["default"]; });
+
+/* harmony import */ var _curve_step_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./curve/step.js */ "./node_modules/d3-shape/src/curve/step.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveStep", function() { return _curve_step_js__WEBPACK_IMPORTED_MODULE_30__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveStepAfter", function() { return _curve_step_js__WEBPACK_IMPORTED_MODULE_30__["stepAfter"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveStepBefore", function() { return _curve_step_js__WEBPACK_IMPORTED_MODULE_30__["stepBefore"]; });
+
+/* harmony import */ var _stack_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./stack.js */ "./node_modules/d3-shape/src/stack.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stack", function() { return _stack_js__WEBPACK_IMPORTED_MODULE_31__["default"]; });
+
+/* harmony import */ var _offset_expand_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./offset/expand.js */ "./node_modules/d3-shape/src/offset/expand.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetExpand", function() { return _offset_expand_js__WEBPACK_IMPORTED_MODULE_32__["default"]; });
+
+/* harmony import */ var _offset_diverging_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./offset/diverging.js */ "./node_modules/d3-shape/src/offset/diverging.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetDiverging", function() { return _offset_diverging_js__WEBPACK_IMPORTED_MODULE_33__["default"]; });
+
+/* harmony import */ var _offset_none_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./offset/none.js */ "./node_modules/d3-shape/src/offset/none.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetNone", function() { return _offset_none_js__WEBPACK_IMPORTED_MODULE_34__["default"]; });
+
+/* harmony import */ var _offset_silhouette_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./offset/silhouette.js */ "./node_modules/d3-shape/src/offset/silhouette.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetSilhouette", function() { return _offset_silhouette_js__WEBPACK_IMPORTED_MODULE_35__["default"]; });
+
+/* harmony import */ var _offset_wiggle_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./offset/wiggle.js */ "./node_modules/d3-shape/src/offset/wiggle.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetWiggle", function() { return _offset_wiggle_js__WEBPACK_IMPORTED_MODULE_36__["default"]; });
+
+/* harmony import */ var _order_appearance_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./order/appearance.js */ "./node_modules/d3-shape/src/order/appearance.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderAppearance", function() { return _order_appearance_js__WEBPACK_IMPORTED_MODULE_37__["default"]; });
+
+/* harmony import */ var _order_ascending_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./order/ascending.js */ "./node_modules/d3-shape/src/order/ascending.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderAscending", function() { return _order_ascending_js__WEBPACK_IMPORTED_MODULE_38__["default"]; });
+
+/* harmony import */ var _order_descending_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./order/descending.js */ "./node_modules/d3-shape/src/order/descending.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderDescending", function() { return _order_descending_js__WEBPACK_IMPORTED_MODULE_39__["default"]; });
+
+/* harmony import */ var _order_insideOut_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./order/insideOut.js */ "./node_modules/d3-shape/src/order/insideOut.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderInsideOut", function() { return _order_insideOut_js__WEBPACK_IMPORTED_MODULE_40__["default"]; });
+
+/* harmony import */ var _order_none_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./order/none.js */ "./node_modules/d3-shape/src/order/none.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderNone", function() { return _order_none_js__WEBPACK_IMPORTED_MODULE_41__["default"]; });
+
+/* harmony import */ var _order_reverse_js__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./order/reverse.js */ "./node_modules/d3-shape/src/order/reverse.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderReverse", function() { return _order_reverse_js__WEBPACK_IMPORTED_MODULE_42__["default"]; });
+
+
+
+
+
+ // Note: radialArea is deprecated!
+ // Note: radialLine is deprecated!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/line.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-shape/src/line.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-shape/src/constant.js");
+/* harmony import */ var _curve_linear_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./curve/linear.js */ "./node_modules/d3-shape/src/curve/linear.js");
+/* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./point.js */ "./node_modules/d3-shape/src/point.js");
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var x = _point_js__WEBPACK_IMPORTED_MODULE_3__["x"],
+      y = _point_js__WEBPACK_IMPORTED_MODULE_3__["y"],
+      defined = Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(true),
+      context = null,
+      curve = _curve_linear_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+      output = null;
+
+  function line(data) {
+    var i,
+        n = data.length,
+        d,
+        defined0 = false,
+        buffer;
+
+    if (context == null) output = curve(buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])());
+
+    for (i = 0; i <= n; ++i) {
+      if (!(i < n && defined(d = data[i], i, data)) === defined0) {
+        if (defined0 = !defined0) output.lineStart();
+        else output.lineEnd();
+      }
+      if (defined0) output.point(+x(d, i, data), +y(d, i, data));
+    }
+
+    if (buffer) return output = null, buffer + "" || null;
+  }
+
+  line.x = function(_) {
+    return arguments.length ? (x = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), line) : x;
+  };
+
+  line.y = function(_) {
+    return arguments.length ? (y = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), line) : y;
+  };
+
+  line.defined = function(_) {
+    return arguments.length ? (defined = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(!!_), line) : defined;
+  };
+
+  line.curve = function(_) {
+    return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
+  };
+
+  line.context = function(_) {
+    return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
+  };
+
+  return line;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/lineRadial.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-shape/src/lineRadial.js ***!
+  \*************************************************/
+/*! exports provided: lineRadial, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineRadial", function() { return lineRadial; });
+/* harmony import */ var _curve_radial_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curve/radial.js */ "./node_modules/d3-shape/src/curve/radial.js");
+/* harmony import */ var _line_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./line.js */ "./node_modules/d3-shape/src/line.js");
+
+
+
+function lineRadial(l) {
+  var c = l.curve;
+
+  l.angle = l.x, delete l.x;
+  l.radius = l.y, delete l.y;
+
+  l.curve = function(_) {
+    return arguments.length ? c(Object(_curve_radial_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_)) : c()._curve;
+  };
+
+  return l;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return lineRadial(Object(_line_js__WEBPACK_IMPORTED_MODULE_1__["default"])().curve(_curve_radial_js__WEBPACK_IMPORTED_MODULE_0__["curveRadialLinear"]));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/link/index.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-shape/src/link/index.js ***!
+  \*************************************************/
+/*! exports provided: linkHorizontal, linkVertical, linkRadial */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkHorizontal", function() { return linkHorizontal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkVertical", function() { return linkVertical; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "linkRadial", function() { return linkRadial; });
+/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
+/* harmony import */ var _array_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../array.js */ "./node_modules/d3-shape/src/array.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constant.js */ "./node_modules/d3-shape/src/constant.js");
+/* harmony import */ var _point_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../point.js */ "./node_modules/d3-shape/src/point.js");
+/* harmony import */ var _pointRadial_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../pointRadial.js */ "./node_modules/d3-shape/src/pointRadial.js");
+
+
+
+
+
+
+function linkSource(d) {
+  return d.source;
+}
+
+function linkTarget(d) {
+  return d.target;
+}
+
+function link(curve) {
+  var source = linkSource,
+      target = linkTarget,
+      x = _point_js__WEBPACK_IMPORTED_MODULE_3__["x"],
+      y = _point_js__WEBPACK_IMPORTED_MODULE_3__["y"],
+      context = null;
+
+  function link() {
+    var buffer, argv = _array_js__WEBPACK_IMPORTED_MODULE_1__["slice"].call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
+    if (!context) context = buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])();
+    curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
+    if (buffer) return context = null, buffer + "" || null;
+  }
+
+  link.source = function(_) {
+    return arguments.length ? (source = _, link) : source;
+  };
+
+  link.target = function(_) {
+    return arguments.length ? (target = _, link) : target;
+  };
+
+  link.x = function(_) {
+    return arguments.length ? (x = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_2__["default"])(+_), link) : x;
+  };
+
+  link.y = function(_) {
+    return arguments.length ? (y = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_2__["default"])(+_), link) : y;
+  };
+
+  link.context = function(_) {
+    return arguments.length ? ((context = _ == null ? null : _), link) : context;
+  };
+
+  return link;
+}
+
+function curveHorizontal(context, x0, y0, x1, y1) {
+  context.moveTo(x0, y0);
+  context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
+}
+
+function curveVertical(context, x0, y0, x1, y1) {
+  context.moveTo(x0, y0);
+  context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
+}
+
+function curveRadial(context, x0, y0, x1, y1) {
+  var p0 = Object(_pointRadial_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x0, y0),
+      p1 = Object(_pointRadial_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x0, y0 = (y0 + y1) / 2),
+      p2 = Object(_pointRadial_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x1, y0),
+      p3 = Object(_pointRadial_js__WEBPACK_IMPORTED_MODULE_4__["default"])(x1, y1);
+  context.moveTo(p0[0], p0[1]);
+  context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
+}
+
+function linkHorizontal() {
+  return link(curveHorizontal);
+}
+
+function linkVertical() {
+  return link(curveVertical);
+}
+
+function linkRadial() {
+  var l = link(curveRadial);
+  l.angle = l.x, delete l.x;
+  l.radius = l.y, delete l.y;
+  return l;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/math.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-shape/src/math.js ***!
+  \*******************************************/
+/*! exports provided: abs, atan2, cos, max, min, sin, sqrt, epsilon, pi, halfPi, tau, acos, asin */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "abs", function() { return abs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "atan2", function() { return atan2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cos", function() { return cos; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sin", function() { return sin; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sqrt", function() { return sqrt; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epsilon", function() { return epsilon; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pi", function() { return pi; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "halfPi", function() { return halfPi; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tau", function() { return tau; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "acos", function() { return acos; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asin", function() { return asin; });
+var abs = Math.abs;
+var atan2 = Math.atan2;
+var cos = Math.cos;
+var max = Math.max;
+var min = Math.min;
+var sin = Math.sin;
+var sqrt = Math.sqrt;
+
+var epsilon = 1e-12;
+var pi = Math.PI;
+var halfPi = pi / 2;
+var tau = 2 * pi;
+
+function acos(x) {
+  return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);
+}
+
+function asin(x) {
+  return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/noop.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-shape/src/noop.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/offset/diverging.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-shape/src/offset/diverging.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
+  if (!((n = series.length) > 0)) return;
+  for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
+    for (yp = yn = 0, i = 0; i < n; ++i) {
+      if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) {
+        d[0] = yp, d[1] = yp += dy;
+      } else if (dy < 0) {
+        d[1] = yn, d[0] = yn += dy;
+      } else {
+        d[0] = 0, d[1] = dy;
+      }
+    }
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/offset/expand.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-shape/src/offset/expand.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _none_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none.js */ "./node_modules/d3-shape/src/offset/none.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
+  if (!((n = series.length) > 0)) return;
+  for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
+    for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
+    if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
+  }
+  Object(_none_js__WEBPACK_IMPORTED_MODULE_0__["default"])(series, order);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/offset/none.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-shape/src/offset/none.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
+  if (!((n = series.length) > 1)) return;
+  for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
+    s0 = s1, s1 = series[order[i]];
+    for (j = 0; j < m; ++j) {
+      s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
+    }
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/offset/silhouette.js":
+/*!********************************************************!*\
+  !*** ./node_modules/d3-shape/src/offset/silhouette.js ***!
+  \********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _none_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none.js */ "./node_modules/d3-shape/src/offset/none.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
+  if (!((n = series.length) > 0)) return;
+  for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
+    for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
+    s0[j][1] += s0[j][0] = -y / 2;
+  }
+  Object(_none_js__WEBPACK_IMPORTED_MODULE_0__["default"])(series, order);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/offset/wiggle.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-shape/src/offset/wiggle.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _none_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none.js */ "./node_modules/d3-shape/src/offset/none.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(series, order) {
+  if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
+  for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
+    for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
+      var si = series[order[i]],
+          sij0 = si[j][1] || 0,
+          sij1 = si[j - 1][1] || 0,
+          s3 = (sij0 - sij1) / 2;
+      for (var k = 0; k < i; ++k) {
+        var sk = series[order[k]],
+            skj0 = sk[j][1] || 0,
+            skj1 = sk[j - 1][1] || 0;
+        s3 += skj0 - skj1;
+      }
+      s1 += sij0, s2 += s3 * sij0;
+    }
+    s0[j - 1][1] += s0[j - 1][0] = y;
+    if (s1) y -= s2 / s1;
+  }
+  s0[j - 1][1] += s0[j - 1][0] = y;
+  Object(_none_js__WEBPACK_IMPORTED_MODULE_0__["default"])(series, order);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/order/appearance.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-shape/src/order/appearance.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _none_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none.js */ "./node_modules/d3-shape/src/order/none.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(series) {
+  var peaks = series.map(peak);
+  return Object(_none_js__WEBPACK_IMPORTED_MODULE_0__["default"])(series).sort(function(a, b) { return peaks[a] - peaks[b]; });
+});
+
+function peak(series) {
+  var i = -1, j = 0, n = series.length, vi, vj = -Infinity;
+  while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;
+  return j;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/order/ascending.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-shape/src/order/ascending.js ***!
+  \******************************************************/
+/*! exports provided: default, sum */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sum", function() { return sum; });
+/* harmony import */ var _none_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none.js */ "./node_modules/d3-shape/src/order/none.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(series) {
+  var sums = series.map(sum);
+  return Object(_none_js__WEBPACK_IMPORTED_MODULE_0__["default"])(series).sort(function(a, b) { return sums[a] - sums[b]; });
+});
+
+function sum(series) {
+  var s = 0, i = -1, n = series.length, v;
+  while (++i < n) if (v = +series[i][1]) s += v;
+  return s;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/order/descending.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/d3-shape/src/order/descending.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _ascending_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ascending.js */ "./node_modules/d3-shape/src/order/ascending.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(series) {
+  return Object(_ascending_js__WEBPACK_IMPORTED_MODULE_0__["default"])(series).reverse();
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/order/insideOut.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-shape/src/order/insideOut.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _appearance_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./appearance.js */ "./node_modules/d3-shape/src/order/appearance.js");
+/* harmony import */ var _ascending_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ascending.js */ "./node_modules/d3-shape/src/order/ascending.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(series) {
+  var n = series.length,
+      i,
+      j,
+      sums = series.map(_ascending_js__WEBPACK_IMPORTED_MODULE_1__["sum"]),
+      order = Object(_appearance_js__WEBPACK_IMPORTED_MODULE_0__["default"])(series),
+      top = 0,
+      bottom = 0,
+      tops = [],
+      bottoms = [];
+
+  for (i = 0; i < n; ++i) {
+    j = order[i];
+    if (top < bottom) {
+      top += sums[j];
+      tops.push(j);
+    } else {
+      bottom += sums[j];
+      bottoms.push(j);
+    }
+  }
+
+  return bottoms.reverse().concat(tops);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/order/none.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-shape/src/order/none.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(series) {
+  var n = series.length, o = new Array(n);
+  while (--n >= 0) o[n] = n;
+  return o;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/order/reverse.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-shape/src/order/reverse.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _none_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./none.js */ "./node_modules/d3-shape/src/order/none.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(series) {
+  return Object(_none_js__WEBPACK_IMPORTED_MODULE_0__["default"])(series).reverse();
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/pie.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-shape/src/pie.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-shape/src/constant.js");
+/* harmony import */ var _descending_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./descending.js */ "./node_modules/d3-shape/src/descending.js");
+/* harmony import */ var _identity_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./identity.js */ "./node_modules/d3-shape/src/identity.js");
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./math.js */ "./node_modules/d3-shape/src/math.js");
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var value = _identity_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+      sortValues = _descending_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+      sort = null,
+      startAngle = Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(0),
+      endAngle = Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(_math_js__WEBPACK_IMPORTED_MODULE_3__["tau"]),
+      padAngle = Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(0);
+
+  function pie(data) {
+    var i,
+        n = data.length,
+        j,
+        k,
+        sum = 0,
+        index = new Array(n),
+        arcs = new Array(n),
+        a0 = +startAngle.apply(this, arguments),
+        da = Math.min(_math_js__WEBPACK_IMPORTED_MODULE_3__["tau"], Math.max(-_math_js__WEBPACK_IMPORTED_MODULE_3__["tau"], endAngle.apply(this, arguments) - a0)),
+        a1,
+        p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
+        pa = p * (da < 0 ? -1 : 1),
+        v;
+
+    for (i = 0; i < n; ++i) {
+      if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
+        sum += v;
+      }
+    }
+
+    // Optionally sort the arcs by previously-computed values or by data.
+    if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
+    else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
+
+    // Compute the arcs! They are stored in the original data's order.
+    for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
+      j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
+        data: data[j],
+        index: i,
+        value: v,
+        startAngle: a0,
+        endAngle: a1,
+        padAngle: p
+      };
+    }
+
+    return arcs;
+  }
+
+  pie.value = function(_) {
+    return arguments.length ? (value = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), pie) : value;
+  };
+
+  pie.sortValues = function(_) {
+    return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
+  };
+
+  pie.sort = function(_) {
+    return arguments.length ? (sort = _, sortValues = null, pie) : sort;
+  };
+
+  pie.startAngle = function(_) {
+    return arguments.length ? (startAngle = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), pie) : startAngle;
+  };
+
+  pie.endAngle = function(_) {
+    return arguments.length ? (endAngle = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), pie) : endAngle;
+  };
+
+  pie.padAngle = function(_) {
+    return arguments.length ? (padAngle = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), pie) : padAngle;
+  };
+
+  return pie;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/point.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-shape/src/point.js ***!
+  \********************************************/
+/*! exports provided: x, y */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return x; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return y; });
+function x(p) {
+  return p[0];
+}
+
+function y(p) {
+  return p[1];
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/pointRadial.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-shape/src/pointRadial.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x, y) {
+  return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/stack.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-shape/src/stack.js ***!
+  \********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _array_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./array.js */ "./node_modules/d3-shape/src/array.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-shape/src/constant.js");
+/* harmony import */ var _offset_none_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./offset/none.js */ "./node_modules/d3-shape/src/offset/none.js");
+/* harmony import */ var _order_none_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./order/none.js */ "./node_modules/d3-shape/src/order/none.js");
+
+
+
+
+
+function stackValue(d, key) {
+  return d[key];
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var keys = Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])([]),
+      order = _order_none_js__WEBPACK_IMPORTED_MODULE_3__["default"],
+      offset = _offset_none_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+      value = stackValue;
+
+  function stack(data) {
+    var kz = keys.apply(this, arguments),
+        i,
+        m = data.length,
+        n = kz.length,
+        sz = new Array(n),
+        oz;
+
+    for (i = 0; i < n; ++i) {
+      for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
+        si[j] = sij = [0, +value(data[j], ki, j, data)];
+        sij.data = data[j];
+      }
+      si.key = ki;
+    }
+
+    for (i = 0, oz = order(sz); i < n; ++i) {
+      sz[oz[i]].index = i;
+    }
+
+    offset(sz, oz);
+    return sz;
+  }
+
+  stack.keys = function(_) {
+    return arguments.length ? (keys = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_array_js__WEBPACK_IMPORTED_MODULE_0__["slice"].call(_)), stack) : keys;
+  };
+
+  stack.value = function(_) {
+    return arguments.length ? (value = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(+_), stack) : value;
+  };
+
+  stack.order = function(_) {
+    return arguments.length ? (order = _ == null ? _order_none_js__WEBPACK_IMPORTED_MODULE_3__["default"] : typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_array_js__WEBPACK_IMPORTED_MODULE_0__["slice"].call(_)), stack) : order;
+  };
+
+  stack.offset = function(_) {
+    return arguments.length ? (offset = _ == null ? _offset_none_js__WEBPACK_IMPORTED_MODULE_2__["default"] : _, stack) : offset;
+  };
+
+  return stack;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/symbol.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-shape/src/symbol.js ***!
+  \*********************************************/
+/*! exports provided: symbols, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "symbols", function() { return symbols; });
+/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
+/* harmony import */ var _symbol_circle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./symbol/circle.js */ "./node_modules/d3-shape/src/symbol/circle.js");
+/* harmony import */ var _symbol_cross_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./symbol/cross.js */ "./node_modules/d3-shape/src/symbol/cross.js");
+/* harmony import */ var _symbol_diamond_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./symbol/diamond.js */ "./node_modules/d3-shape/src/symbol/diamond.js");
+/* harmony import */ var _symbol_star_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./symbol/star.js */ "./node_modules/d3-shape/src/symbol/star.js");
+/* harmony import */ var _symbol_square_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./symbol/square.js */ "./node_modules/d3-shape/src/symbol/square.js");
+/* harmony import */ var _symbol_triangle_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./symbol/triangle.js */ "./node_modules/d3-shape/src/symbol/triangle.js");
+/* harmony import */ var _symbol_wye_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./symbol/wye.js */ "./node_modules/d3-shape/src/symbol/wye.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-shape/src/constant.js");
+
+
+
+
+
+
+
+
+
+
+var symbols = [
+  _symbol_circle_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+  _symbol_cross_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  _symbol_diamond_js__WEBPACK_IMPORTED_MODULE_3__["default"],
+  _symbol_square_js__WEBPACK_IMPORTED_MODULE_5__["default"],
+  _symbol_star_js__WEBPACK_IMPORTED_MODULE_4__["default"],
+  _symbol_triangle_js__WEBPACK_IMPORTED_MODULE_6__["default"],
+  _symbol_wye_js__WEBPACK_IMPORTED_MODULE_7__["default"]
+];
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var type = Object(_constant_js__WEBPACK_IMPORTED_MODULE_8__["default"])(_symbol_circle_js__WEBPACK_IMPORTED_MODULE_1__["default"]),
+      size = Object(_constant_js__WEBPACK_IMPORTED_MODULE_8__["default"])(64),
+      context = null;
+
+  function symbol() {
+    var buffer;
+    if (!context) context = buffer = Object(d3_path__WEBPACK_IMPORTED_MODULE_0__["path"])();
+    type.apply(this, arguments).draw(context, +size.apply(this, arguments));
+    if (buffer) return context = null, buffer + "" || null;
+  }
+
+  symbol.type = function(_) {
+    return arguments.length ? (type = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_8__["default"])(_), symbol) : type;
+  };
+
+  symbol.size = function(_) {
+    return arguments.length ? (size = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_8__["default"])(+_), symbol) : size;
+  };
+
+  symbol.context = function(_) {
+    return arguments.length ? (context = _ == null ? null : _, symbol) : context;
+  };
+
+  return symbol;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/symbol/circle.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-shape/src/symbol/circle.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-shape/src/math.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  draw: function(context, size) {
+    var r = Math.sqrt(size / _math_js__WEBPACK_IMPORTED_MODULE_0__["pi"]);
+    context.moveTo(r, 0);
+    context.arc(0, 0, r, 0, _math_js__WEBPACK_IMPORTED_MODULE_0__["tau"]);
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/symbol/cross.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-shape/src/symbol/cross.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ({
+  draw: function(context, size) {
+    var r = Math.sqrt(size / 5) / 2;
+    context.moveTo(-3 * r, -r);
+    context.lineTo(-r, -r);
+    context.lineTo(-r, -3 * r);
+    context.lineTo(r, -3 * r);
+    context.lineTo(r, -r);
+    context.lineTo(3 * r, -r);
+    context.lineTo(3 * r, r);
+    context.lineTo(r, r);
+    context.lineTo(r, 3 * r);
+    context.lineTo(-r, 3 * r);
+    context.lineTo(-r, r);
+    context.lineTo(-3 * r, r);
+    context.closePath();
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/symbol/diamond.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-shape/src/symbol/diamond.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var tan30 = Math.sqrt(1 / 3),
+    tan30_2 = tan30 * 2;
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  draw: function(context, size) {
+    var y = Math.sqrt(size / tan30_2),
+        x = y * tan30;
+    context.moveTo(0, -y);
+    context.lineTo(x, 0);
+    context.lineTo(0, y);
+    context.lineTo(-x, 0);
+    context.closePath();
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/symbol/square.js":
+/*!****************************************************!*\
+  !*** ./node_modules/d3-shape/src/symbol/square.js ***!
+  \****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ({
+  draw: function(context, size) {
+    var w = Math.sqrt(size),
+        x = -w / 2;
+    context.rect(x, x, w, w);
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/symbol/star.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-shape/src/symbol/star.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _math_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math.js */ "./node_modules/d3-shape/src/math.js");
+
+
+var ka = 0.89081309152928522810,
+    kr = Math.sin(_math_js__WEBPACK_IMPORTED_MODULE_0__["pi"] / 10) / Math.sin(7 * _math_js__WEBPACK_IMPORTED_MODULE_0__["pi"] / 10),
+    kx = Math.sin(_math_js__WEBPACK_IMPORTED_MODULE_0__["tau"] / 10) * kr,
+    ky = -Math.cos(_math_js__WEBPACK_IMPORTED_MODULE_0__["tau"] / 10) * kr;
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  draw: function(context, size) {
+    var r = Math.sqrt(size * ka),
+        x = kx * r,
+        y = ky * r;
+    context.moveTo(0, -r);
+    context.lineTo(x, y);
+    for (var i = 1; i < 5; ++i) {
+      var a = _math_js__WEBPACK_IMPORTED_MODULE_0__["tau"] * i / 5,
+          c = Math.cos(a),
+          s = Math.sin(a);
+      context.lineTo(s * r, -c * r);
+      context.lineTo(c * x - s * y, s * x + c * y);
+    }
+    context.closePath();
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/symbol/triangle.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-shape/src/symbol/triangle.js ***!
+  \******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var sqrt3 = Math.sqrt(3);
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  draw: function(context, size) {
+    var y = -Math.sqrt(size / (sqrt3 * 3));
+    context.moveTo(0, y * 2);
+    context.lineTo(-sqrt3 * y, -y);
+    context.lineTo(sqrt3 * y, -y);
+    context.closePath();
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-shape/src/symbol/wye.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-shape/src/symbol/wye.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var c = -0.5,
+    s = Math.sqrt(3) / 2,
+    k = 1 / Math.sqrt(12),
+    a = (k / 2 + 1) * 3;
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  draw: function(context, size) {
+    var r = Math.sqrt(size / a),
+        x0 = r / 2,
+        y0 = r * k,
+        x1 = x0,
+        y1 = r * k + r,
+        x2 = -x1,
+        y2 = y1;
+    context.moveTo(x0, y0);
+    context.lineTo(x1, y1);
+    context.lineTo(x2, y2);
+    context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
+    context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
+    context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
+    context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
+    context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
+    context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
+    context.closePath();
+  }
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time-format/src/defaultLocale.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-time-format/src/defaultLocale.js ***!
+  \**********************************************************/
+/*! exports provided: timeFormat, timeParse, utcFormat, utcParse, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeFormat", function() { return timeFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeParse", function() { return timeParse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcFormat", function() { return utcFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcParse", function() { return utcParse; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return defaultLocale; });
+/* harmony import */ var _locale_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./locale.js */ "./node_modules/d3-time-format/src/locale.js");
+
+
+var locale;
+var timeFormat;
+var timeParse;
+var utcFormat;
+var utcParse;
+
+defaultLocale({
+  dateTime: "%x, %X",
+  date: "%-m/%-d/%Y",
+  time: "%-I:%M:%S %p",
+  periods: ["AM", "PM"],
+  days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
+  shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
+  months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
+  shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
+});
+
+function defaultLocale(definition) {
+  locale = Object(_locale_js__WEBPACK_IMPORTED_MODULE_0__["default"])(definition);
+  timeFormat = locale.format;
+  timeParse = locale.parse;
+  utcFormat = locale.utcFormat;
+  utcParse = locale.utcParse;
+  return locale;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time-format/src/index.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-time-format/src/index.js ***!
+  \**************************************************/
+/*! exports provided: timeFormatDefaultLocale, timeFormat, timeParse, utcFormat, utcParse, timeFormatLocale, isoFormat, isoParse */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultLocale.js */ "./node_modules/d3-time-format/src/defaultLocale.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFormatDefaultLocale", function() { return _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFormat", function() { return _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__["timeFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeParse", function() { return _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__["timeParse"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcFormat", function() { return _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__["utcFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcParse", function() { return _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__["utcParse"]; });
+
+/* harmony import */ var _locale_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./locale.js */ "./node_modules/d3-time-format/src/locale.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFormatLocale", function() { return _locale_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _isoFormat_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isoFormat.js */ "./node_modules/d3-time-format/src/isoFormat.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isoFormat", function() { return _isoFormat_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _isoParse_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./isoParse.js */ "./node_modules/d3-time-format/src/isoParse.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isoParse", function() { return _isoParse_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time-format/src/isoFormat.js":
+/*!******************************************************!*\
+  !*** ./node_modules/d3-time-format/src/isoFormat.js ***!
+  \******************************************************/
+/*! exports provided: isoSpecifier, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isoSpecifier", function() { return isoSpecifier; });
+/* harmony import */ var _defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./defaultLocale.js */ "./node_modules/d3-time-format/src/defaultLocale.js");
+
+
+var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
+
+function formatIsoNative(date) {
+  return date.toISOString();
+}
+
+var formatIso = Date.prototype.toISOString
+    ? formatIsoNative
+    : Object(_defaultLocale_js__WEBPACK_IMPORTED_MODULE_0__["utcFormat"])(isoSpecifier);
+
+/* harmony default export */ __webpack_exports__["default"] = (formatIso);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time-format/src/isoParse.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-time-format/src/isoParse.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _isoFormat_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isoFormat.js */ "./node_modules/d3-time-format/src/isoFormat.js");
+/* harmony import */ var _defaultLocale_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./defaultLocale.js */ "./node_modules/d3-time-format/src/defaultLocale.js");
+
+
+
+function parseIsoNative(string) {
+  var date = new Date(string);
+  return isNaN(date) ? null : date;
+}
+
+var parseIso = +new Date("2000-01-01T00:00:00.000Z")
+    ? parseIsoNative
+    : Object(_defaultLocale_js__WEBPACK_IMPORTED_MODULE_1__["utcParse"])(_isoFormat_js__WEBPACK_IMPORTED_MODULE_0__["isoSpecifier"]);
+
+/* harmony default export */ __webpack_exports__["default"] = (parseIso);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time-format/src/locale.js":
+/*!***************************************************!*\
+  !*** ./node_modules/d3-time-format/src/locale.js ***!
+  \***************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return formatLocale; });
+/* harmony import */ var d3_time__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-time */ "./node_modules/d3-time/src/index.js");
+
+
+function localDate(d) {
+  if (0 <= d.y && d.y < 100) {
+    var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
+    date.setFullYear(d.y);
+    return date;
+  }
+  return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
+}
+
+function utcDate(d) {
+  if (0 <= d.y && d.y < 100) {
+    var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
+    date.setUTCFullYear(d.y);
+    return date;
+  }
+  return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
+}
+
+function newDate(y, m, d) {
+  return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0};
+}
+
+function formatLocale(locale) {
+  var locale_dateTime = locale.dateTime,
+      locale_date = locale.date,
+      locale_time = locale.time,
+      locale_periods = locale.periods,
+      locale_weekdays = locale.days,
+      locale_shortWeekdays = locale.shortDays,
+      locale_months = locale.months,
+      locale_shortMonths = locale.shortMonths;
+
+  var periodRe = formatRe(locale_periods),
+      periodLookup = formatLookup(locale_periods),
+      weekdayRe = formatRe(locale_weekdays),
+      weekdayLookup = formatLookup(locale_weekdays),
+      shortWeekdayRe = formatRe(locale_shortWeekdays),
+      shortWeekdayLookup = formatLookup(locale_shortWeekdays),
+      monthRe = formatRe(locale_months),
+      monthLookup = formatLookup(locale_months),
+      shortMonthRe = formatRe(locale_shortMonths),
+      shortMonthLookup = formatLookup(locale_shortMonths);
+
+  var formats = {
+    "a": formatShortWeekday,
+    "A": formatWeekday,
+    "b": formatShortMonth,
+    "B": formatMonth,
+    "c": null,
+    "d": formatDayOfMonth,
+    "e": formatDayOfMonth,
+    "f": formatMicroseconds,
+    "H": formatHour24,
+    "I": formatHour12,
+    "j": formatDayOfYear,
+    "L": formatMilliseconds,
+    "m": formatMonthNumber,
+    "M": formatMinutes,
+    "p": formatPeriod,
+    "q": formatQuarter,
+    "Q": formatUnixTimestamp,
+    "s": formatUnixTimestampSeconds,
+    "S": formatSeconds,
+    "u": formatWeekdayNumberMonday,
+    "U": formatWeekNumberSunday,
+    "V": formatWeekNumberISO,
+    "w": formatWeekdayNumberSunday,
+    "W": formatWeekNumberMonday,
+    "x": null,
+    "X": null,
+    "y": formatYear,
+    "Y": formatFullYear,
+    "Z": formatZone,
+    "%": formatLiteralPercent
+  };
+
+  var utcFormats = {
+    "a": formatUTCShortWeekday,
+    "A": formatUTCWeekday,
+    "b": formatUTCShortMonth,
+    "B": formatUTCMonth,
+    "c": null,
+    "d": formatUTCDayOfMonth,
+    "e": formatUTCDayOfMonth,
+    "f": formatUTCMicroseconds,
+    "H": formatUTCHour24,
+    "I": formatUTCHour12,
+    "j": formatUTCDayOfYear,
+    "L": formatUTCMilliseconds,
+    "m": formatUTCMonthNumber,
+    "M": formatUTCMinutes,
+    "p": formatUTCPeriod,
+    "q": formatUTCQuarter,
+    "Q": formatUnixTimestamp,
+    "s": formatUnixTimestampSeconds,
+    "S": formatUTCSeconds,
+    "u": formatUTCWeekdayNumberMonday,
+    "U": formatUTCWeekNumberSunday,
+    "V": formatUTCWeekNumberISO,
+    "w": formatUTCWeekdayNumberSunday,
+    "W": formatUTCWeekNumberMonday,
+    "x": null,
+    "X": null,
+    "y": formatUTCYear,
+    "Y": formatUTCFullYear,
+    "Z": formatUTCZone,
+    "%": formatLiteralPercent
+  };
+
+  var parses = {
+    "a": parseShortWeekday,
+    "A": parseWeekday,
+    "b": parseShortMonth,
+    "B": parseMonth,
+    "c": parseLocaleDateTime,
+    "d": parseDayOfMonth,
+    "e": parseDayOfMonth,
+    "f": parseMicroseconds,
+    "H": parseHour24,
+    "I": parseHour24,
+    "j": parseDayOfYear,
+    "L": parseMilliseconds,
+    "m": parseMonthNumber,
+    "M": parseMinutes,
+    "p": parsePeriod,
+    "q": parseQuarter,
+    "Q": parseUnixTimestamp,
+    "s": parseUnixTimestampSeconds,
+    "S": parseSeconds,
+    "u": parseWeekdayNumberMonday,
+    "U": parseWeekNumberSunday,
+    "V": parseWeekNumberISO,
+    "w": parseWeekdayNumberSunday,
+    "W": parseWeekNumberMonday,
+    "x": parseLocaleDate,
+    "X": parseLocaleTime,
+    "y": parseYear,
+    "Y": parseFullYear,
+    "Z": parseZone,
+    "%": parseLiteralPercent
+  };
+
+  // These recursive directive definitions must be deferred.
+  formats.x = newFormat(locale_date, formats);
+  formats.X = newFormat(locale_time, formats);
+  formats.c = newFormat(locale_dateTime, formats);
+  utcFormats.x = newFormat(locale_date, utcFormats);
+  utcFormats.X = newFormat(locale_time, utcFormats);
+  utcFormats.c = newFormat(locale_dateTime, utcFormats);
+
+  function newFormat(specifier, formats) {
+    return function(date) {
+      var string = [],
+          i = -1,
+          j = 0,
+          n = specifier.length,
+          c,
+          pad,
+          format;
+
+      if (!(date instanceof Date)) date = new Date(+date);
+
+      while (++i < n) {
+        if (specifier.charCodeAt(i) === 37) {
+          string.push(specifier.slice(j, i));
+          if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
+          else pad = c === "e" ? " " : "0";
+          if (format = formats[c]) c = format(date, pad);
+          string.push(c);
+          j = i + 1;
+        }
+      }
+
+      string.push(specifier.slice(j, i));
+      return string.join("");
+    };
+  }
+
+  function newParse(specifier, Z) {
+    return function(string) {
+      var d = newDate(1900, undefined, 1),
+          i = parseSpecifier(d, specifier, string += "", 0),
+          week, day;
+      if (i != string.length) return null;
+
+      // If a UNIX timestamp is specified, return it.
+      if ("Q" in d) return new Date(d.Q);
+      if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0));
+
+      // If this is utcParse, never use the local timezone.
+      if (Z && !("Z" in d)) d.Z = 0;
+
+      // The am-pm flag is 0 for AM, and 1 for PM.
+      if ("p" in d) d.H = d.H % 12 + d.p * 12;
+
+      // If the month was not specified, inherit from the quarter.
+      if (d.m === undefined) d.m = "q" in d ? d.q : 0;
+
+      // Convert day-of-week and week-of-year to day-of-year.
+      if ("V" in d) {
+        if (d.V < 1 || d.V > 53) return null;
+        if (!("w" in d)) d.w = 1;
+        if ("Z" in d) {
+          week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay();
+          week = day > 4 || day === 0 ? d3_time__WEBPACK_IMPORTED_MODULE_0__["utcMonday"].ceil(week) : Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcMonday"])(week);
+          week = d3_time__WEBPACK_IMPORTED_MODULE_0__["utcDay"].offset(week, (d.V - 1) * 7);
+          d.y = week.getUTCFullYear();
+          d.m = week.getUTCMonth();
+          d.d = week.getUTCDate() + (d.w + 6) % 7;
+        } else {
+          week = localDate(newDate(d.y, 0, 1)), day = week.getDay();
+          week = day > 4 || day === 0 ? d3_time__WEBPACK_IMPORTED_MODULE_0__["timeMonday"].ceil(week) : Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeMonday"])(week);
+          week = d3_time__WEBPACK_IMPORTED_MODULE_0__["timeDay"].offset(week, (d.V - 1) * 7);
+          d.y = week.getFullYear();
+          d.m = week.getMonth();
+          d.d = week.getDate() + (d.w + 6) % 7;
+        }
+      } else if ("W" in d || "U" in d) {
+        if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
+        day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay();
+        d.m = 0;
+        d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7;
+      }
+
+      // If a time zone is specified, all fields are interpreted as UTC and then
+      // offset according to the specified time zone.
+      if ("Z" in d) {
+        d.H += d.Z / 100 | 0;
+        d.M += d.Z % 100;
+        return utcDate(d);
+      }
+
+      // Otherwise, all fields are in local time.
+      return localDate(d);
+    };
+  }
+
+  function parseSpecifier(d, specifier, string, j) {
+    var i = 0,
+        n = specifier.length,
+        m = string.length,
+        c,
+        parse;
+
+    while (i < n) {
+      if (j >= m) return -1;
+      c = specifier.charCodeAt(i++);
+      if (c === 37) {
+        c = specifier.charAt(i++);
+        parse = parses[c in pads ? specifier.charAt(i++) : c];
+        if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
+      } else if (c != string.charCodeAt(j++)) {
+        return -1;
+      }
+    }
+
+    return j;
+  }
+
+  function parsePeriod(d, string, i) {
+    var n = periodRe.exec(string.slice(i));
+    return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+  }
+
+  function parseShortWeekday(d, string, i) {
+    var n = shortWeekdayRe.exec(string.slice(i));
+    return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+  }
+
+  function parseWeekday(d, string, i) {
+    var n = weekdayRe.exec(string.slice(i));
+    return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+  }
+
+  function parseShortMonth(d, string, i) {
+    var n = shortMonthRe.exec(string.slice(i));
+    return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+  }
+
+  function parseMonth(d, string, i) {
+    var n = monthRe.exec(string.slice(i));
+    return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
+  }
+
+  function parseLocaleDateTime(d, string, i) {
+    return parseSpecifier(d, locale_dateTime, string, i);
+  }
+
+  function parseLocaleDate(d, string, i) {
+    return parseSpecifier(d, locale_date, string, i);
+  }
+
+  function parseLocaleTime(d, string, i) {
+    return parseSpecifier(d, locale_time, string, i);
+  }
+
+  function formatShortWeekday(d) {
+    return locale_shortWeekdays[d.getDay()];
+  }
+
+  function formatWeekday(d) {
+    return locale_weekdays[d.getDay()];
+  }
+
+  function formatShortMonth(d) {
+    return locale_shortMonths[d.getMonth()];
+  }
+
+  function formatMonth(d) {
+    return locale_months[d.getMonth()];
+  }
+
+  function formatPeriod(d) {
+    return locale_periods[+(d.getHours() >= 12)];
+  }
+
+  function formatQuarter(d) {
+    return 1 + ~~(d.getMonth() / 3);
+  }
+
+  function formatUTCShortWeekday(d) {
+    return locale_shortWeekdays[d.getUTCDay()];
+  }
+
+  function formatUTCWeekday(d) {
+    return locale_weekdays[d.getUTCDay()];
+  }
+
+  function formatUTCShortMonth(d) {
+    return locale_shortMonths[d.getUTCMonth()];
+  }
+
+  function formatUTCMonth(d) {
+    return locale_months[d.getUTCMonth()];
+  }
+
+  function formatUTCPeriod(d) {
+    return locale_periods[+(d.getUTCHours() >= 12)];
+  }
+
+  function formatUTCQuarter(d) {
+    return 1 + ~~(d.getUTCMonth() / 3);
+  }
+
+  return {
+    format: function(specifier) {
+      var f = newFormat(specifier += "", formats);
+      f.toString = function() { return specifier; };
+      return f;
+    },
+    parse: function(specifier) {
+      var p = newParse(specifier += "", false);
+      p.toString = function() { return specifier; };
+      return p;
+    },
+    utcFormat: function(specifier) {
+      var f = newFormat(specifier += "", utcFormats);
+      f.toString = function() { return specifier; };
+      return f;
+    },
+    utcParse: function(specifier) {
+      var p = newParse(specifier += "", true);
+      p.toString = function() { return specifier; };
+      return p;
+    }
+  };
+}
+
+var pads = {"-": "", "_": " ", "0": "0"},
+    numberRe = /^\s*\d+/, // note: ignores next directive
+    percentRe = /^%/,
+    requoteRe = /[\\^$*+?|[\]().{}]/g;
+
+function pad(value, fill, width) {
+  var sign = value < 0 ? "-" : "",
+      string = (sign ? -value : value) + "",
+      length = string.length;
+  return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
+}
+
+function requote(s) {
+  return s.replace(requoteRe, "\\$&");
+}
+
+function formatRe(names) {
+  return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
+}
+
+function formatLookup(names) {
+  var map = {}, i = -1, n = names.length;
+  while (++i < n) map[names[i].toLowerCase()] = i;
+  return map;
+}
+
+function parseWeekdayNumberSunday(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 1));
+  return n ? (d.w = +n[0], i + n[0].length) : -1;
+}
+
+function parseWeekdayNumberMonday(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 1));
+  return n ? (d.u = +n[0], i + n[0].length) : -1;
+}
+
+function parseWeekNumberSunday(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.U = +n[0], i + n[0].length) : -1;
+}
+
+function parseWeekNumberISO(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.V = +n[0], i + n[0].length) : -1;
+}
+
+function parseWeekNumberMonday(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.W = +n[0], i + n[0].length) : -1;
+}
+
+function parseFullYear(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 4));
+  return n ? (d.y = +n[0], i + n[0].length) : -1;
+}
+
+function parseYear(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
+}
+
+function parseZone(d, string, i) {
+  var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
+  return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
+}
+
+function parseQuarter(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 1));
+  return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1;
+}
+
+function parseMonthNumber(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
+}
+
+function parseDayOfMonth(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.d = +n[0], i + n[0].length) : -1;
+}
+
+function parseDayOfYear(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 3));
+  return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
+}
+
+function parseHour24(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.H = +n[0], i + n[0].length) : -1;
+}
+
+function parseMinutes(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.M = +n[0], i + n[0].length) : -1;
+}
+
+function parseSeconds(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 2));
+  return n ? (d.S = +n[0], i + n[0].length) : -1;
+}
+
+function parseMilliseconds(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 3));
+  return n ? (d.L = +n[0], i + n[0].length) : -1;
+}
+
+function parseMicroseconds(d, string, i) {
+  var n = numberRe.exec(string.slice(i, i + 6));
+  return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
+}
+
+function parseLiteralPercent(d, string, i) {
+  var n = percentRe.exec(string.slice(i, i + 1));
+  return n ? i + n[0].length : -1;
+}
+
+function parseUnixTimestamp(d, string, i) {
+  var n = numberRe.exec(string.slice(i));
+  return n ? (d.Q = +n[0], i + n[0].length) : -1;
+}
+
+function parseUnixTimestampSeconds(d, string, i) {
+  var n = numberRe.exec(string.slice(i));
+  return n ? (d.s = +n[0], i + n[0].length) : -1;
+}
+
+function formatDayOfMonth(d, p) {
+  return pad(d.getDate(), p, 2);
+}
+
+function formatHour24(d, p) {
+  return pad(d.getHours(), p, 2);
+}
+
+function formatHour12(d, p) {
+  return pad(d.getHours() % 12 || 12, p, 2);
+}
+
+function formatDayOfYear(d, p) {
+  return pad(1 + d3_time__WEBPACK_IMPORTED_MODULE_0__["timeDay"].count(Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeYear"])(d), d), p, 3);
+}
+
+function formatMilliseconds(d, p) {
+  return pad(d.getMilliseconds(), p, 3);
+}
+
+function formatMicroseconds(d, p) {
+  return formatMilliseconds(d, p) + "000";
+}
+
+function formatMonthNumber(d, p) {
+  return pad(d.getMonth() + 1, p, 2);
+}
+
+function formatMinutes(d, p) {
+  return pad(d.getMinutes(), p, 2);
+}
+
+function formatSeconds(d, p) {
+  return pad(d.getSeconds(), p, 2);
+}
+
+function formatWeekdayNumberMonday(d) {
+  var day = d.getDay();
+  return day === 0 ? 7 : day;
+}
+
+function formatWeekNumberSunday(d, p) {
+  return pad(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeSunday"].count(Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeYear"])(d) - 1, d), p, 2);
+}
+
+function formatWeekNumberISO(d, p) {
+  var day = d.getDay();
+  d = (day >= 4 || day === 0) ? Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeThursday"])(d) : d3_time__WEBPACK_IMPORTED_MODULE_0__["timeThursday"].ceil(d);
+  return pad(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeThursday"].count(Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeYear"])(d), d) + (Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeYear"])(d).getDay() === 4), p, 2);
+}
+
+function formatWeekdayNumberSunday(d) {
+  return d.getDay();
+}
+
+function formatWeekNumberMonday(d, p) {
+  return pad(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeMonday"].count(Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["timeYear"])(d) - 1, d), p, 2);
+}
+
+function formatYear(d, p) {
+  return pad(d.getFullYear() % 100, p, 2);
+}
+
+function formatFullYear(d, p) {
+  return pad(d.getFullYear() % 10000, p, 4);
+}
+
+function formatZone(d) {
+  var z = d.getTimezoneOffset();
+  return (z > 0 ? "-" : (z *= -1, "+"))
+      + pad(z / 60 | 0, "0", 2)
+      + pad(z % 60, "0", 2);
+}
+
+function formatUTCDayOfMonth(d, p) {
+  return pad(d.getUTCDate(), p, 2);
+}
+
+function formatUTCHour24(d, p) {
+  return pad(d.getUTCHours(), p, 2);
+}
+
+function formatUTCHour12(d, p) {
+  return pad(d.getUTCHours() % 12 || 12, p, 2);
+}
+
+function formatUTCDayOfYear(d, p) {
+  return pad(1 + d3_time__WEBPACK_IMPORTED_MODULE_0__["utcDay"].count(Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcYear"])(d), d), p, 3);
+}
+
+function formatUTCMilliseconds(d, p) {
+  return pad(d.getUTCMilliseconds(), p, 3);
+}
+
+function formatUTCMicroseconds(d, p) {
+  return formatUTCMilliseconds(d, p) + "000";
+}
+
+function formatUTCMonthNumber(d, p) {
+  return pad(d.getUTCMonth() + 1, p, 2);
+}
+
+function formatUTCMinutes(d, p) {
+  return pad(d.getUTCMinutes(), p, 2);
+}
+
+function formatUTCSeconds(d, p) {
+  return pad(d.getUTCSeconds(), p, 2);
+}
+
+function formatUTCWeekdayNumberMonday(d) {
+  var dow = d.getUTCDay();
+  return dow === 0 ? 7 : dow;
+}
+
+function formatUTCWeekNumberSunday(d, p) {
+  return pad(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcSunday"].count(Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcYear"])(d) - 1, d), p, 2);
+}
+
+function formatUTCWeekNumberISO(d, p) {
+  var day = d.getUTCDay();
+  d = (day >= 4 || day === 0) ? Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcThursday"])(d) : d3_time__WEBPACK_IMPORTED_MODULE_0__["utcThursday"].ceil(d);
+  return pad(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcThursday"].count(Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcYear"])(d), d) + (Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcYear"])(d).getUTCDay() === 4), p, 2);
+}
+
+function formatUTCWeekdayNumberSunday(d) {
+  return d.getUTCDay();
+}
+
+function formatUTCWeekNumberMonday(d, p) {
+  return pad(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcMonday"].count(Object(d3_time__WEBPACK_IMPORTED_MODULE_0__["utcYear"])(d) - 1, d), p, 2);
+}
+
+function formatUTCYear(d, p) {
+  return pad(d.getUTCFullYear() % 100, p, 2);
+}
+
+function formatUTCFullYear(d, p) {
+  return pad(d.getUTCFullYear() % 10000, p, 4);
+}
+
+function formatUTCZone() {
+  return "+0000";
+}
+
+function formatLiteralPercent() {
+  return "%";
+}
+
+function formatUnixTimestamp(d) {
+  return +d;
+}
+
+function formatUnixTimestampSeconds(d) {
+  return Math.floor(+d / 1000);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/day.js":
+/*!*****************************************!*\
+  !*** ./node_modules/d3-time/src/day.js ***!
+  \*****************************************/
+/*! exports provided: default, days */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "days", function() { return days; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-time/src/duration.js");
+
+
+
+var day = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setHours(0, 0, 0, 0);
+}, function(date, step) {
+  date.setDate(date.getDate() + step);
+}, function(start, end) {
+  return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationMinute"]) / _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationDay"];
+}, function(date) {
+  return date.getDate() - 1;
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (day);
+var days = day.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/duration.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-time/src/duration.js ***!
+  \**********************************************/
+/*! exports provided: durationSecond, durationMinute, durationHour, durationDay, durationWeek */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "durationSecond", function() { return durationSecond; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "durationMinute", function() { return durationMinute; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "durationHour", function() { return durationHour; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "durationDay", function() { return durationDay; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "durationWeek", function() { return durationWeek; });
+var durationSecond = 1e3;
+var durationMinute = 6e4;
+var durationHour = 36e5;
+var durationDay = 864e5;
+var durationWeek = 6048e5;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/hour.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-time/src/hour.js ***!
+  \******************************************/
+/*! exports provided: default, hours */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hours", function() { return hours; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-time/src/duration.js");
+
+
+
+var hour = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setTime(date - date.getMilliseconds() - date.getSeconds() * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationSecond"] - date.getMinutes() * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationMinute"]);
+}, function(date, step) {
+  date.setTime(+date + step * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationHour"]);
+}, function(start, end) {
+  return (end - start) / _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationHour"];
+}, function(date) {
+  return date.getHours();
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (hour);
+var hours = hour.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/index.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-time/src/index.js ***!
+  \*******************************************/
+/*! exports provided: timeInterval, timeMillisecond, timeMilliseconds, utcMillisecond, utcMilliseconds, timeSecond, timeSeconds, utcSecond, utcSeconds, timeMinute, timeMinutes, timeHour, timeHours, timeDay, timeDays, timeWeek, timeWeeks, timeSunday, timeSundays, timeMonday, timeMondays, timeTuesday, timeTuesdays, timeWednesday, timeWednesdays, timeThursday, timeThursdays, timeFriday, timeFridays, timeSaturday, timeSaturdays, timeMonth, timeMonths, timeYear, timeYears, utcMinute, utcMinutes, utcHour, utcHours, utcDay, utcDays, utcWeek, utcWeeks, utcSunday, utcSundays, utcMonday, utcMondays, utcTuesday, utcTuesdays, utcWednesday, utcWednesdays, utcThursday, utcThursdays, utcFriday, utcFridays, utcSaturday, utcSaturdays, utcMonth, utcMonths, utcYear, utcYears */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _interval_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _millisecond_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./millisecond.js */ "./node_modules/d3-time/src/millisecond.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMillisecond", function() { return _millisecond_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMilliseconds", function() { return _millisecond_js__WEBPACK_IMPORTED_MODULE_1__["milliseconds"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMillisecond", function() { return _millisecond_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMilliseconds", function() { return _millisecond_js__WEBPACK_IMPORTED_MODULE_1__["milliseconds"]; });
+
+/* harmony import */ var _second_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./second.js */ "./node_modules/d3-time/src/second.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSecond", function() { return _second_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSeconds", function() { return _second_js__WEBPACK_IMPORTED_MODULE_2__["seconds"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSecond", function() { return _second_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSeconds", function() { return _second_js__WEBPACK_IMPORTED_MODULE_2__["seconds"]; });
+
+/* harmony import */ var _minute_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./minute.js */ "./node_modules/d3-time/src/minute.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMinute", function() { return _minute_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMinutes", function() { return _minute_js__WEBPACK_IMPORTED_MODULE_3__["minutes"]; });
+
+/* harmony import */ var _hour_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./hour.js */ "./node_modules/d3-time/src/hour.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeHour", function() { return _hour_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeHours", function() { return _hour_js__WEBPACK_IMPORTED_MODULE_4__["hours"]; });
+
+/* harmony import */ var _day_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./day.js */ "./node_modules/d3-time/src/day.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeDay", function() { return _day_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeDays", function() { return _day_js__WEBPACK_IMPORTED_MODULE_5__["days"]; });
+
+/* harmony import */ var _week_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./week.js */ "./node_modules/d3-time/src/week.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeWeek", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["sunday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeWeeks", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["sundays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSunday", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["sunday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSundays", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["sundays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMonday", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["monday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMondays", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["mondays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeTuesday", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["tuesday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeTuesdays", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["tuesdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeWednesday", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["wednesday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeWednesdays", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["wednesdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeThursday", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["thursday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeThursdays", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["thursdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFriday", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["friday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFridays", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["fridays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSaturday", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["saturday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSaturdays", function() { return _week_js__WEBPACK_IMPORTED_MODULE_6__["saturdays"]; });
+
+/* harmony import */ var _month_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./month.js */ "./node_modules/d3-time/src/month.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMonth", function() { return _month_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMonths", function() { return _month_js__WEBPACK_IMPORTED_MODULE_7__["months"]; });
+
+/* harmony import */ var _year_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./year.js */ "./node_modules/d3-time/src/year.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeYear", function() { return _year_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeYears", function() { return _year_js__WEBPACK_IMPORTED_MODULE_8__["years"]; });
+
+/* harmony import */ var _utcMinute_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./utcMinute.js */ "./node_modules/d3-time/src/utcMinute.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMinute", function() { return _utcMinute_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMinutes", function() { return _utcMinute_js__WEBPACK_IMPORTED_MODULE_9__["utcMinutes"]; });
+
+/* harmony import */ var _utcHour_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./utcHour.js */ "./node_modules/d3-time/src/utcHour.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcHour", function() { return _utcHour_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcHours", function() { return _utcHour_js__WEBPACK_IMPORTED_MODULE_10__["utcHours"]; });
+
+/* harmony import */ var _utcDay_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./utcDay.js */ "./node_modules/d3-time/src/utcDay.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcDay", function() { return _utcDay_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcDays", function() { return _utcDay_js__WEBPACK_IMPORTED_MODULE_11__["utcDays"]; });
+
+/* harmony import */ var _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./utcWeek.js */ "./node_modules/d3-time/src/utcWeek.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcWeek", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcSunday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcWeeks", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcSundays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSunday", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcSunday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSundays", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcSundays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMonday", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcMonday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMondays", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcMondays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcTuesday", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcTuesday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcTuesdays", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcTuesdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcWednesday", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcWednesday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcWednesdays", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcWednesdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcThursday", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcThursday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcThursdays", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcThursdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcFriday", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcFriday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcFridays", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcFridays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSaturday", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcSaturday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSaturdays", function() { return _utcWeek_js__WEBPACK_IMPORTED_MODULE_12__["utcSaturdays"]; });
+
+/* harmony import */ var _utcMonth_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./utcMonth.js */ "./node_modules/d3-time/src/utcMonth.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMonth", function() { return _utcMonth_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMonths", function() { return _utcMonth_js__WEBPACK_IMPORTED_MODULE_13__["utcMonths"]; });
+
+/* harmony import */ var _utcYear_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./utcYear.js */ "./node_modules/d3-time/src/utcYear.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcYear", function() { return _utcYear_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcYears", function() { return _utcYear_js__WEBPACK_IMPORTED_MODULE_14__["utcYears"]; });
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/interval.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-time/src/interval.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return newInterval; });
+var t0 = new Date,
+    t1 = new Date;
+
+function newInterval(floori, offseti, count, field) {
+
+  function interval(date) {
+    return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date;
+  }
+
+  interval.floor = function(date) {
+    return floori(date = new Date(+date)), date;
+  };
+
+  interval.ceil = function(date) {
+    return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
+  };
+
+  interval.round = function(date) {
+    var d0 = interval(date),
+        d1 = interval.ceil(date);
+    return date - d0 < d1 - date ? d0 : d1;
+  };
+
+  interval.offset = function(date, step) {
+    return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
+  };
+
+  interval.range = function(start, stop, step) {
+    var range = [], previous;
+    start = interval.ceil(start);
+    step = step == null ? 1 : Math.floor(step);
+    if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
+    do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
+    while (previous < start && start < stop);
+    return range;
+  };
+
+  interval.filter = function(test) {
+    return newInterval(function(date) {
+      if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
+    }, function(date, step) {
+      if (date >= date) {
+        if (step < 0) while (++step <= 0) {
+          while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
+        } else while (--step >= 0) {
+          while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
+        }
+      }
+    });
+  };
+
+  if (count) {
+    interval.count = function(start, end) {
+      t0.setTime(+start), t1.setTime(+end);
+      floori(t0), floori(t1);
+      return Math.floor(count(t0, t1));
+    };
+
+    interval.every = function(step) {
+      step = Math.floor(step);
+      return !isFinite(step) || !(step > 0) ? null
+          : !(step > 1) ? interval
+          : interval.filter(field
+              ? function(d) { return field(d) % step === 0; }
+              : function(d) { return interval.count(0, d) % step === 0; });
+    };
+  }
+
+  return interval;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/millisecond.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-time/src/millisecond.js ***!
+  \*************************************************/
+/*! exports provided: default, milliseconds */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "milliseconds", function() { return milliseconds; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+
+
+var millisecond = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function() {
+  // noop
+}, function(date, step) {
+  date.setTime(+date + step);
+}, function(start, end) {
+  return end - start;
+});
+
+// An optimized implementation for this simple case.
+millisecond.every = function(k) {
+  k = Math.floor(k);
+  if (!isFinite(k) || !(k > 0)) return null;
+  if (!(k > 1)) return millisecond;
+  return Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+    date.setTime(Math.floor(date / k) * k);
+  }, function(date, step) {
+    date.setTime(+date + step * k);
+  }, function(start, end) {
+    return (end - start) / k;
+  });
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (millisecond);
+var milliseconds = millisecond.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/minute.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-time/src/minute.js ***!
+  \********************************************/
+/*! exports provided: default, minutes */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "minutes", function() { return minutes; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-time/src/duration.js");
+
+
+
+var minute = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setTime(date - date.getMilliseconds() - date.getSeconds() * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationSecond"]);
+}, function(date, step) {
+  date.setTime(+date + step * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationMinute"]);
+}, function(start, end) {
+  return (end - start) / _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationMinute"];
+}, function(date) {
+  return date.getMinutes();
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (minute);
+var minutes = minute.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/month.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-time/src/month.js ***!
+  \*******************************************/
+/*! exports provided: default, months */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "months", function() { return months; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+
+
+var month = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setDate(1);
+  date.setHours(0, 0, 0, 0);
+}, function(date, step) {
+  date.setMonth(date.getMonth() + step);
+}, function(start, end) {
+  return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
+}, function(date) {
+  return date.getMonth();
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (month);
+var months = month.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/second.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-time/src/second.js ***!
+  \********************************************/
+/*! exports provided: default, seconds */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "seconds", function() { return seconds; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-time/src/duration.js");
+
+
+
+var second = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setTime(date - date.getMilliseconds());
+}, function(date, step) {
+  date.setTime(+date + step * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationSecond"]);
+}, function(start, end) {
+  return (end - start) / _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationSecond"];
+}, function(date) {
+  return date.getUTCSeconds();
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (second);
+var seconds = second.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/utcDay.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-time/src/utcDay.js ***!
+  \********************************************/
+/*! exports provided: default, utcDays */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcDays", function() { return utcDays; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-time/src/duration.js");
+
+
+
+var utcDay = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setUTCHours(0, 0, 0, 0);
+}, function(date, step) {
+  date.setUTCDate(date.getUTCDate() + step);
+}, function(start, end) {
+  return (end - start) / _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationDay"];
+}, function(date) {
+  return date.getUTCDate() - 1;
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (utcDay);
+var utcDays = utcDay.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/utcHour.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-time/src/utcHour.js ***!
+  \*********************************************/
+/*! exports provided: default, utcHours */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcHours", function() { return utcHours; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-time/src/duration.js");
+
+
+
+var utcHour = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setUTCMinutes(0, 0, 0);
+}, function(date, step) {
+  date.setTime(+date + step * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationHour"]);
+}, function(start, end) {
+  return (end - start) / _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationHour"];
+}, function(date) {
+  return date.getUTCHours();
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (utcHour);
+var utcHours = utcHour.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/utcMinute.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-time/src/utcMinute.js ***!
+  \***********************************************/
+/*! exports provided: default, utcMinutes */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcMinutes", function() { return utcMinutes; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-time/src/duration.js");
+
+
+
+var utcMinute = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setUTCSeconds(0, 0);
+}, function(date, step) {
+  date.setTime(+date + step * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationMinute"]);
+}, function(start, end) {
+  return (end - start) / _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationMinute"];
+}, function(date) {
+  return date.getUTCMinutes();
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (utcMinute);
+var utcMinutes = utcMinute.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/utcMonth.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-time/src/utcMonth.js ***!
+  \**********************************************/
+/*! exports provided: default, utcMonths */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcMonths", function() { return utcMonths; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+
+
+var utcMonth = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setUTCDate(1);
+  date.setUTCHours(0, 0, 0, 0);
+}, function(date, step) {
+  date.setUTCMonth(date.getUTCMonth() + step);
+}, function(start, end) {
+  return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
+}, function(date) {
+  return date.getUTCMonth();
+});
+
+/* harmony default export */ __webpack_exports__["default"] = (utcMonth);
+var utcMonths = utcMonth.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/utcWeek.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-time/src/utcWeek.js ***!
+  \*********************************************/
+/*! exports provided: utcSunday, utcMonday, utcTuesday, utcWednesday, utcThursday, utcFriday, utcSaturday, utcSundays, utcMondays, utcTuesdays, utcWednesdays, utcThursdays, utcFridays, utcSaturdays */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcSunday", function() { return utcSunday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcMonday", function() { return utcMonday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcTuesday", function() { return utcTuesday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcWednesday", function() { return utcWednesday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcThursday", function() { return utcThursday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcFriday", function() { return utcFriday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcSaturday", function() { return utcSaturday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcSundays", function() { return utcSundays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcMondays", function() { return utcMondays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcTuesdays", function() { return utcTuesdays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcWednesdays", function() { return utcWednesdays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcThursdays", function() { return utcThursdays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcFridays", function() { return utcFridays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcSaturdays", function() { return utcSaturdays; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-time/src/duration.js");
+
+
+
+function utcWeekday(i) {
+  return Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+    date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
+    date.setUTCHours(0, 0, 0, 0);
+  }, function(date, step) {
+    date.setUTCDate(date.getUTCDate() + step * 7);
+  }, function(start, end) {
+    return (end - start) / _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationWeek"];
+  });
+}
+
+var utcSunday = utcWeekday(0);
+var utcMonday = utcWeekday(1);
+var utcTuesday = utcWeekday(2);
+var utcWednesday = utcWeekday(3);
+var utcThursday = utcWeekday(4);
+var utcFriday = utcWeekday(5);
+var utcSaturday = utcWeekday(6);
+
+var utcSundays = utcSunday.range;
+var utcMondays = utcMonday.range;
+var utcTuesdays = utcTuesday.range;
+var utcWednesdays = utcWednesday.range;
+var utcThursdays = utcThursday.range;
+var utcFridays = utcFriday.range;
+var utcSaturdays = utcSaturday.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/utcYear.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-time/src/utcYear.js ***!
+  \*********************************************/
+/*! exports provided: default, utcYears */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "utcYears", function() { return utcYears; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+
+
+var utcYear = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setUTCMonth(0, 1);
+  date.setUTCHours(0, 0, 0, 0);
+}, function(date, step) {
+  date.setUTCFullYear(date.getUTCFullYear() + step);
+}, function(start, end) {
+  return end.getUTCFullYear() - start.getUTCFullYear();
+}, function(date) {
+  return date.getUTCFullYear();
+});
+
+// An optimized implementation for this simple case.
+utcYear.every = function(k) {
+  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+    date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
+    date.setUTCMonth(0, 1);
+    date.setUTCHours(0, 0, 0, 0);
+  }, function(date, step) {
+    date.setUTCFullYear(date.getUTCFullYear() + step * k);
+  });
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (utcYear);
+var utcYears = utcYear.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/week.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-time/src/week.js ***!
+  \******************************************/
+/*! exports provided: sunday, monday, tuesday, wednesday, thursday, friday, saturday, sundays, mondays, tuesdays, wednesdays, thursdays, fridays, saturdays */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sunday", function() { return sunday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "monday", function() { return monday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tuesday", function() { return tuesday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wednesday", function() { return wednesday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "thursday", function() { return thursday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "friday", function() { return friday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saturday", function() { return saturday; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sundays", function() { return sundays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mondays", function() { return mondays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tuesdays", function() { return tuesdays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wednesdays", function() { return wednesdays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "thursdays", function() { return thursdays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fridays", function() { return fridays; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saturdays", function() { return saturdays; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-time/src/duration.js");
+
+
+
+function weekday(i) {
+  return Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+    date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
+    date.setHours(0, 0, 0, 0);
+  }, function(date, step) {
+    date.setDate(date.getDate() + step * 7);
+  }, function(start, end) {
+    return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationMinute"]) / _duration_js__WEBPACK_IMPORTED_MODULE_1__["durationWeek"];
+  });
+}
+
+var sunday = weekday(0);
+var monday = weekday(1);
+var tuesday = weekday(2);
+var wednesday = weekday(3);
+var thursday = weekday(4);
+var friday = weekday(5);
+var saturday = weekday(6);
+
+var sundays = sunday.range;
+var mondays = monday.range;
+var tuesdays = tuesday.range;
+var wednesdays = wednesday.range;
+var thursdays = thursday.range;
+var fridays = friday.range;
+var saturdays = saturday.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-time/src/year.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-time/src/year.js ***!
+  \******************************************/
+/*! exports provided: default, years */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "years", function() { return years; });
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-time/src/interval.js");
+
+
+var year = Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+  date.setMonth(0, 1);
+  date.setHours(0, 0, 0, 0);
+}, function(date, step) {
+  date.setFullYear(date.getFullYear() + step);
+}, function(start, end) {
+  return end.getFullYear() - start.getFullYear();
+}, function(date) {
+  return date.getFullYear();
+});
+
+// An optimized implementation for this simple case.
+year.every = function(k) {
+  return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : Object(_interval_js__WEBPACK_IMPORTED_MODULE_0__["default"])(function(date) {
+    date.setFullYear(Math.floor(date.getFullYear() / k) * k);
+    date.setMonth(0, 1);
+    date.setHours(0, 0, 0, 0);
+  }, function(date, step) {
+    date.setFullYear(date.getFullYear() + step * k);
+  });
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (year);
+var years = year.range;
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-timer/src/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-timer/src/index.js ***!
+  \********************************************/
+/*! exports provided: now, timer, timerFlush, timeout, interval */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _timer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./timer.js */ "./node_modules/d3-timer/src/timer.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "now", function() { return _timer_js__WEBPACK_IMPORTED_MODULE_0__["now"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return _timer_js__WEBPACK_IMPORTED_MODULE_0__["timer"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timerFlush", function() { return _timer_js__WEBPACK_IMPORTED_MODULE_0__["timerFlush"]; });
+
+/* harmony import */ var _timeout_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./timeout.js */ "./node_modules/d3-timer/src/timeout.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _timeout_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _interval_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./interval.js */ "./node_modules/d3-timer/src/interval.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return _interval_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-timer/src/interval.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-timer/src/interval.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _timer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./timer.js */ "./node_modules/d3-timer/src/timer.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(callback, delay, time) {
+  var t = new _timer_js__WEBPACK_IMPORTED_MODULE_0__["Timer"], total = delay;
+  if (delay == null) return t.restart(callback, delay, time), t;
+  delay = +delay, time = time == null ? Object(_timer_js__WEBPACK_IMPORTED_MODULE_0__["now"])() : +time;
+  t.restart(function tick(elapsed) {
+    elapsed += total;
+    t.restart(tick, total += delay, time);
+    callback(elapsed);
+  }, delay, time);
+  return t;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-timer/src/timeout.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-timer/src/timeout.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _timer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./timer.js */ "./node_modules/d3-timer/src/timer.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(callback, delay, time) {
+  var t = new _timer_js__WEBPACK_IMPORTED_MODULE_0__["Timer"];
+  delay = delay == null ? 0 : +delay;
+  t.restart(function(elapsed) {
+    t.stop();
+    callback(elapsed + delay);
+  }, delay, time);
+  return t;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-timer/src/timer.js":
+/*!********************************************!*\
+  !*** ./node_modules/d3-timer/src/timer.js ***!
+  \********************************************/
+/*! exports provided: now, Timer, timer, timerFlush */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "now", function() { return now; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timer", function() { return Timer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return timer; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timerFlush", function() { return timerFlush; });
+var frame = 0, // is an animation frame pending?
+    timeout = 0, // is a timeout pending?
+    interval = 0, // are any timers active?
+    pokeDelay = 1000, // how frequently we check for clock skew
+    taskHead,
+    taskTail,
+    clockLast = 0,
+    clockNow = 0,
+    clockSkew = 0,
+    clock = typeof performance === "object" && performance.now ? performance : Date,
+    setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
+
+function now() {
+  return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
+}
+
+function clearNow() {
+  clockNow = 0;
+}
+
+function Timer() {
+  this._call =
+  this._time =
+  this._next = null;
+}
+
+Timer.prototype = timer.prototype = {
+  constructor: Timer,
+  restart: function(callback, delay, time) {
+    if (typeof callback !== "function") throw new TypeError("callback is not a function");
+    time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
+    if (!this._next && taskTail !== this) {
+      if (taskTail) taskTail._next = this;
+      else taskHead = this;
+      taskTail = this;
+    }
+    this._call = callback;
+    this._time = time;
+    sleep();
+  },
+  stop: function() {
+    if (this._call) {
+      this._call = null;
+      this._time = Infinity;
+      sleep();
+    }
+  }
+};
+
+function timer(callback, delay, time) {
+  var t = new Timer;
+  t.restart(callback, delay, time);
+  return t;
+}
+
+function timerFlush() {
+  now(); // Get the current time, if not already set.
+  ++frame; // Pretend we’ve set an alarm, if we haven’t already.
+  var t = taskHead, e;
+  while (t) {
+    if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
+    t = t._next;
+  }
+  --frame;
+}
+
+function wake() {
+  clockNow = (clockLast = clock.now()) + clockSkew;
+  frame = timeout = 0;
+  try {
+    timerFlush();
+  } finally {
+    frame = 0;
+    nap();
+    clockNow = 0;
+  }
+}
+
+function poke() {
+  var now = clock.now(), delay = now - clockLast;
+  if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
+}
+
+function nap() {
+  var t0, t1 = taskHead, t2, time = Infinity;
+  while (t1) {
+    if (t1._call) {
+      if (time > t1._time) time = t1._time;
+      t0 = t1, t1 = t1._next;
+    } else {
+      t2 = t1._next, t1._next = null;
+      t1 = t0 ? t0._next = t2 : taskHead = t2;
+    }
+  }
+  taskTail = t0;
+  sleep(time);
+}
+
+function sleep(time) {
+  if (frame) return; // Soonest alarm already set, or will be.
+  if (timeout) timeout = clearTimeout(timeout);
+  var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
+  if (delay > 24) {
+    if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
+    if (interval) interval = clearInterval(interval);
+  } else {
+    if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
+    frame = 1, setFrame(wake);
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/active.js":
+/*!**************************************************!*\
+  !*** ./node_modules/d3-transition/src/active.js ***!
+  \**************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _transition_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transition/index.js */ "./node_modules/d3-transition/src/transition/index.js");
+/* harmony import */ var _transition_schedule_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transition/schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+
+var root = [null];
+
+/* harmony default export */ __webpack_exports__["default"] = (function(node, name) {
+  var schedules = node.__transition,
+      schedule,
+      i;
+
+  if (schedules) {
+    name = name == null ? null : name + "";
+    for (i in schedules) {
+      if ((schedule = schedules[i]).state > _transition_schedule_js__WEBPACK_IMPORTED_MODULE_1__["SCHEDULED"] && schedule.name === name) {
+        return new _transition_index_js__WEBPACK_IMPORTED_MODULE_0__["Transition"]([[node]], root, name, +i);
+      }
+    }
+  }
+
+  return null;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/index.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-transition/src/index.js ***!
+  \*************************************************/
+/*! exports provided: transition, active, interrupt */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _selection_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./selection/index.js */ "./node_modules/d3-transition/src/selection/index.js");
+/* harmony import */ var _transition_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transition/index.js */ "./node_modules/d3-transition/src/transition/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transition", function() { return _transition_index_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony import */ var _active_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./active.js */ "./node_modules/d3-transition/src/active.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "active", function() { return _active_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
+
+/* harmony import */ var _interrupt_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./interrupt.js */ "./node_modules/d3-transition/src/interrupt.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interrupt", function() { return _interrupt_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/interrupt.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-transition/src/interrupt.js ***!
+  \*****************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _transition_schedule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transition/schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(node, name) {
+  var schedules = node.__transition,
+      schedule,
+      active,
+      empty = true,
+      i;
+
+  if (!schedules) return;
+
+  name = name == null ? null : name + "";
+
+  for (i in schedules) {
+    if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
+    active = schedule.state > _transition_schedule_js__WEBPACK_IMPORTED_MODULE_0__["STARTING"] && schedule.state < _transition_schedule_js__WEBPACK_IMPORTED_MODULE_0__["ENDING"];
+    schedule.state = _transition_schedule_js__WEBPACK_IMPORTED_MODULE_0__["ENDED"];
+    schedule.timer.stop();
+    schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
+    delete schedules[i];
+  }
+
+  if (empty) delete node.__transition;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/selection/index.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-transition/src/selection/index.js ***!
+  \***********************************************************/
+/*! no exports provided */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var _interrupt_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./interrupt.js */ "./node_modules/d3-transition/src/selection/interrupt.js");
+/* harmony import */ var _transition_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./transition.js */ "./node_modules/d3-transition/src/selection/transition.js");
+
+
+
+
+d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"].prototype.interrupt = _interrupt_js__WEBPACK_IMPORTED_MODULE_1__["default"];
+d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"].prototype.transition = _transition_js__WEBPACK_IMPORTED_MODULE_2__["default"];
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/selection/interrupt.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-transition/src/selection/interrupt.js ***!
+  \***************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _interrupt_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../interrupt.js */ "./node_modules/d3-transition/src/interrupt.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name) {
+  return this.each(function() {
+    Object(_interrupt_js__WEBPACK_IMPORTED_MODULE_0__["default"])(this, name);
+  });
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/selection/transition.js":
+/*!****************************************************************!*\
+  !*** ./node_modules/d3-transition/src/selection/transition.js ***!
+  \****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _transition_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../transition/index.js */ "./node_modules/d3-transition/src/transition/index.js");
+/* harmony import */ var _transition_schedule_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../transition/schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+/* harmony import */ var d3_ease__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-ease */ "./node_modules/d3-ease/src/index.js");
+/* harmony import */ var d3_timer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-timer */ "./node_modules/d3-timer/src/index.js");
+
+
+
+
+
+var defaultTiming = {
+  time: null, // Set on use.
+  delay: 0,
+  duration: 250,
+  ease: d3_ease__WEBPACK_IMPORTED_MODULE_2__["easeCubicInOut"]
+};
+
+function inherit(node, id) {
+  var timing;
+  while (!(timing = node.__transition) || !(timing = timing[id])) {
+    if (!(node = node.parentNode)) {
+      return defaultTiming.time = Object(d3_timer__WEBPACK_IMPORTED_MODULE_3__["now"])(), defaultTiming;
+    }
+  }
+  return timing;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name) {
+  var id,
+      timing;
+
+  if (name instanceof _transition_index_js__WEBPACK_IMPORTED_MODULE_0__["Transition"]) {
+    id = name._id, name = name._name;
+  } else {
+    id = Object(_transition_index_js__WEBPACK_IMPORTED_MODULE_0__["newId"])(), (timing = defaultTiming).time = Object(d3_timer__WEBPACK_IMPORTED_MODULE_3__["now"])(), name = name == null ? null : name + "";
+  }
+
+  for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
+    for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+      if (node = group[i]) {
+        Object(_transition_schedule_js__WEBPACK_IMPORTED_MODULE_1__["default"])(node, name, id, i, group, timing || inherit(node, id));
+      }
+    }
+  }
+
+  return new _transition_index_js__WEBPACK_IMPORTED_MODULE_0__["Transition"](groups, this._parents, name, id);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/attr.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/attr.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var _tween_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tween.js */ "./node_modules/d3-transition/src/transition/tween.js");
+/* harmony import */ var _interpolate_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./interpolate.js */ "./node_modules/d3-transition/src/transition/interpolate.js");
+
+
+
+
+
+function attrRemove(name) {
+  return function() {
+    this.removeAttribute(name);
+  };
+}
+
+function attrRemoveNS(fullname) {
+  return function() {
+    this.removeAttributeNS(fullname.space, fullname.local);
+  };
+}
+
+function attrConstant(name, interpolate, value1) {
+  var string00,
+      string1 = value1 + "",
+      interpolate0;
+  return function() {
+    var string0 = this.getAttribute(name);
+    return string0 === string1 ? null
+        : string0 === string00 ? interpolate0
+        : interpolate0 = interpolate(string00 = string0, value1);
+  };
+}
+
+function attrConstantNS(fullname, interpolate, value1) {
+  var string00,
+      string1 = value1 + "",
+      interpolate0;
+  return function() {
+    var string0 = this.getAttributeNS(fullname.space, fullname.local);
+    return string0 === string1 ? null
+        : string0 === string00 ? interpolate0
+        : interpolate0 = interpolate(string00 = string0, value1);
+  };
+}
+
+function attrFunction(name, interpolate, value) {
+  var string00,
+      string10,
+      interpolate0;
+  return function() {
+    var string0, value1 = value(this), string1;
+    if (value1 == null) return void this.removeAttribute(name);
+    string0 = this.getAttribute(name);
+    string1 = value1 + "";
+    return string0 === string1 ? null
+        : string0 === string00 && string1 === string10 ? interpolate0
+        : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+  };
+}
+
+function attrFunctionNS(fullname, interpolate, value) {
+  var string00,
+      string10,
+      interpolate0;
+  return function() {
+    var string0, value1 = value(this), string1;
+    if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
+    string0 = this.getAttributeNS(fullname.space, fullname.local);
+    string1 = value1 + "";
+    return string0 === string1 ? null
+        : string0 === string00 && string1 === string10 ? interpolate0
+        : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
+  var fullname = Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["namespace"])(name), i = fullname === "transform" ? d3_interpolate__WEBPACK_IMPORTED_MODULE_0__["interpolateTransformSvg"] : _interpolate_js__WEBPACK_IMPORTED_MODULE_3__["default"];
+  return this.attrTween(name, typeof value === "function"
+      ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, Object(_tween_js__WEBPACK_IMPORTED_MODULE_2__["tweenValue"])(this, "attr." + name, value))
+      : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname)
+      : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/attrTween.js":
+/*!****************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/attrTween.js ***!
+  \****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+
+
+function attrInterpolate(name, i) {
+  return function(t) {
+    this.setAttribute(name, i.call(this, t));
+  };
+}
+
+function attrInterpolateNS(fullname, i) {
+  return function(t) {
+    this.setAttributeNS(fullname.space, fullname.local, i.call(this, t));
+  };
+}
+
+function attrTweenNS(fullname, value) {
+  var t0, i0;
+  function tween() {
+    var i = value.apply(this, arguments);
+    if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
+    return t0;
+  }
+  tween._value = value;
+  return tween;
+}
+
+function attrTween(name, value) {
+  var t0, i0;
+  function tween() {
+    var i = value.apply(this, arguments);
+    if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
+    return t0;
+  }
+  tween._value = value;
+  return tween;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
+  var key = "attr." + name;
+  if (arguments.length < 2) return (key = this.tween(key)) && key._value;
+  if (value == null) return this.tween(key, null);
+  if (typeof value !== "function") throw new Error;
+  var fullname = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["namespace"])(name);
+  return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/delay.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/delay.js ***!
+  \************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+function delayFunction(id, value) {
+  return function() {
+    Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["init"])(this, id).delay = +value.apply(this, arguments);
+  };
+}
+
+function delayConstant(id, value) {
+  return value = +value, function() {
+    Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["init"])(this, id).delay = value;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(value) {
+  var id = this._id;
+
+  return arguments.length
+      ? this.each((typeof value === "function"
+          ? delayFunction
+          : delayConstant)(id, value))
+      : Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).delay;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/duration.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/duration.js ***!
+  \***************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+function durationFunction(id, value) {
+  return function() {
+    Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id).duration = +value.apply(this, arguments);
+  };
+}
+
+function durationConstant(id, value) {
+  return value = +value, function() {
+    Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id).duration = value;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(value) {
+  var id = this._id;
+
+  return arguments.length
+      ? this.each((typeof value === "function"
+          ? durationFunction
+          : durationConstant)(id, value))
+      : Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).duration;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/ease.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/ease.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+function easeConstant(id, value) {
+  if (typeof value !== "function") throw new Error;
+  return function() {
+    Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id).ease = value;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(value) {
+  var id = this._id;
+
+  return arguments.length
+      ? this.each(easeConstant(id, value))
+      : Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).ease;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/end.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/end.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var on0, on1, that = this, id = that._id, size = that.size();
+  return new Promise(function(resolve, reject) {
+    var cancel = {value: reject},
+        end = {value: function() { if (--size === 0) resolve(); }};
+
+    that.each(function() {
+      var schedule = Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id),
+          on = schedule.on;
+
+      // If this node shared a dispatch with the previous node,
+      // just assign the updated shared dispatch and we’re done!
+      // Otherwise, copy-on-write.
+      if (on !== on0) {
+        on1 = (on0 = on).copy();
+        on1._.cancel.push(cancel);
+        on1._.interrupt.push(cancel);
+        on1._.end.push(end);
+      }
+
+      schedule.on = on1;
+    });
+  });
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/filter.js":
+/*!*************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/filter.js ***!
+  \*************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-transition/src/transition/index.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(match) {
+  if (typeof match !== "function") match = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["matcher"])(match);
+
+  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
+      if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
+        subgroup.push(node);
+      }
+    }
+  }
+
+  return new _index_js__WEBPACK_IMPORTED_MODULE_1__["Transition"](subgroups, this._parents, this._name, this._id);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/index.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/index.js ***!
+  \************************************************************/
+/*! exports provided: Transition, default, newId */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Transition", function() { return Transition; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return transition; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newId", function() { return newId; });
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var _attr_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./attr.js */ "./node_modules/d3-transition/src/transition/attr.js");
+/* harmony import */ var _attrTween_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./attrTween.js */ "./node_modules/d3-transition/src/transition/attrTween.js");
+/* harmony import */ var _delay_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./delay.js */ "./node_modules/d3-transition/src/transition/delay.js");
+/* harmony import */ var _duration_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./duration.js */ "./node_modules/d3-transition/src/transition/duration.js");
+/* harmony import */ var _ease_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./ease.js */ "./node_modules/d3-transition/src/transition/ease.js");
+/* harmony import */ var _filter_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./filter.js */ "./node_modules/d3-transition/src/transition/filter.js");
+/* harmony import */ var _merge_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./merge.js */ "./node_modules/d3-transition/src/transition/merge.js");
+/* harmony import */ var _on_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./on.js */ "./node_modules/d3-transition/src/transition/on.js");
+/* harmony import */ var _remove_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./remove.js */ "./node_modules/d3-transition/src/transition/remove.js");
+/* harmony import */ var _select_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./select.js */ "./node_modules/d3-transition/src/transition/select.js");
+/* harmony import */ var _selectAll_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./selectAll.js */ "./node_modules/d3-transition/src/transition/selectAll.js");
+/* harmony import */ var _selection_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./selection.js */ "./node_modules/d3-transition/src/transition/selection.js");
+/* harmony import */ var _style_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./style.js */ "./node_modules/d3-transition/src/transition/style.js");
+/* harmony import */ var _styleTween_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./styleTween.js */ "./node_modules/d3-transition/src/transition/styleTween.js");
+/* harmony import */ var _text_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./text.js */ "./node_modules/d3-transition/src/transition/text.js");
+/* harmony import */ var _textTween_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./textTween.js */ "./node_modules/d3-transition/src/transition/textTween.js");
+/* harmony import */ var _transition_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./transition.js */ "./node_modules/d3-transition/src/transition/transition.js");
+/* harmony import */ var _tween_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./tween.js */ "./node_modules/d3-transition/src/transition/tween.js");
+/* harmony import */ var _end_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./end.js */ "./node_modules/d3-transition/src/transition/end.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var id = 0;
+
+function Transition(groups, parents, name, id) {
+  this._groups = groups;
+  this._parents = parents;
+  this._name = name;
+  this._id = id;
+}
+
+function transition(name) {
+  return Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"])().transition(name);
+}
+
+function newId() {
+  return ++id;
+}
+
+var selection_prototype = d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"].prototype;
+
+Transition.prototype = transition.prototype = {
+  constructor: Transition,
+  select: _select_js__WEBPACK_IMPORTED_MODULE_10__["default"],
+  selectAll: _selectAll_js__WEBPACK_IMPORTED_MODULE_11__["default"],
+  filter: _filter_js__WEBPACK_IMPORTED_MODULE_6__["default"],
+  merge: _merge_js__WEBPACK_IMPORTED_MODULE_7__["default"],
+  selection: _selection_js__WEBPACK_IMPORTED_MODULE_12__["default"],
+  transition: _transition_js__WEBPACK_IMPORTED_MODULE_17__["default"],
+  call: selection_prototype.call,
+  nodes: selection_prototype.nodes,
+  node: selection_prototype.node,
+  size: selection_prototype.size,
+  empty: selection_prototype.empty,
+  each: selection_prototype.each,
+  on: _on_js__WEBPACK_IMPORTED_MODULE_8__["default"],
+  attr: _attr_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+  attrTween: _attrTween_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  style: _style_js__WEBPACK_IMPORTED_MODULE_13__["default"],
+  styleTween: _styleTween_js__WEBPACK_IMPORTED_MODULE_14__["default"],
+  text: _text_js__WEBPACK_IMPORTED_MODULE_15__["default"],
+  textTween: _textTween_js__WEBPACK_IMPORTED_MODULE_16__["default"],
+  remove: _remove_js__WEBPACK_IMPORTED_MODULE_9__["default"],
+  tween: _tween_js__WEBPACK_IMPORTED_MODULE_18__["default"],
+  delay: _delay_js__WEBPACK_IMPORTED_MODULE_3__["default"],
+  duration: _duration_js__WEBPACK_IMPORTED_MODULE_4__["default"],
+  ease: _ease_js__WEBPACK_IMPORTED_MODULE_5__["default"],
+  end: _end_js__WEBPACK_IMPORTED_MODULE_19__["default"]
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/interpolate.js":
+/*!******************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/interpolate.js ***!
+  \******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(a, b) {
+  var c;
+  return (typeof b === "number" ? d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateNumber"]
+      : b instanceof d3_color__WEBPACK_IMPORTED_MODULE_0__["color"] ? d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateRgb"]
+      : (c = Object(d3_color__WEBPACK_IMPORTED_MODULE_0__["color"])(b)) ? (b = c, d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateRgb"])
+      : d3_interpolate__WEBPACK_IMPORTED_MODULE_1__["interpolateString"])(a, b);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/merge.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/merge.js ***!
+  \************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-transition/src/transition/index.js");
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(transition) {
+  if (transition._id !== this._id) throw new Error;
+
+  for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {
+    for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
+      if (node = group0[i] || group1[i]) {
+        merge[i] = node;
+      }
+    }
+  }
+
+  for (; j < m0; ++j) {
+    merges[j] = groups0[j];
+  }
+
+  return new _index_js__WEBPACK_IMPORTED_MODULE_0__["Transition"](merges, this._parents, this._name, this._id);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/on.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/on.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+function start(name) {
+  return (name + "").trim().split(/^|\s+/).every(function(t) {
+    var i = t.indexOf(".");
+    if (i >= 0) t = t.slice(0, i);
+    return !t || t === "start";
+  });
+}
+
+function onFunction(id, name, listener) {
+  var on0, on1, sit = start(name) ? _schedule_js__WEBPACK_IMPORTED_MODULE_0__["init"] : _schedule_js__WEBPACK_IMPORTED_MODULE_0__["set"];
+  return function() {
+    var schedule = sit(this, id),
+        on = schedule.on;
+
+    // If this node shared a dispatch with the previous node,
+    // just assign the updated shared dispatch and we’re done!
+    // Otherwise, copy-on-write.
+    if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
+
+    schedule.on = on1;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, listener) {
+  var id = this._id;
+
+  return arguments.length < 2
+      ? Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).on.on(name)
+      : this.each(onFunction(id, name, listener));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/remove.js":
+/*!*************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/remove.js ***!
+  \*************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function removeFunction(id) {
+  return function() {
+    var parent = this.parentNode;
+    for (var i in this.__transition) if (+i !== id) return;
+    if (parent) parent.removeChild(this);
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return this.on("end.remove", removeFunction(this._id));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/schedule.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/schedule.js ***!
+  \***************************************************************/
+/*! exports provided: CREATED, SCHEDULED, STARTING, STARTED, RUNNING, ENDING, ENDED, default, init, set, get */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CREATED", function() { return CREATED; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SCHEDULED", function() { return SCHEDULED; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STARTING", function() { return STARTING; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "STARTED", function() { return STARTED; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RUNNING", function() { return RUNNING; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENDING", function() { return ENDING; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ENDED", function() { return ENDED; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "init", function() { return init; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "set", function() { return set; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get", function() { return get; });
+/* harmony import */ var d3_dispatch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-dispatch */ "./node_modules/d3-dispatch/src/index.js");
+/* harmony import */ var d3_timer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-timer */ "./node_modules/d3-timer/src/index.js");
+
+
+
+var emptyOn = Object(d3_dispatch__WEBPACK_IMPORTED_MODULE_0__["dispatch"])("start", "end", "cancel", "interrupt");
+var emptyTween = [];
+
+var CREATED = 0;
+var SCHEDULED = 1;
+var STARTING = 2;
+var STARTED = 3;
+var RUNNING = 4;
+var ENDING = 5;
+var ENDED = 6;
+
+/* harmony default export */ __webpack_exports__["default"] = (function(node, name, id, index, group, timing) {
+  var schedules = node.__transition;
+  if (!schedules) node.__transition = {};
+  else if (id in schedules) return;
+  create(node, id, {
+    name: name,
+    index: index, // For context during callback.
+    group: group, // For context during callback.
+    on: emptyOn,
+    tween: emptyTween,
+    time: timing.time,
+    delay: timing.delay,
+    duration: timing.duration,
+    ease: timing.ease,
+    timer: null,
+    state: CREATED
+  });
+});
+
+function init(node, id) {
+  var schedule = get(node, id);
+  if (schedule.state > CREATED) throw new Error("too late; already scheduled");
+  return schedule;
+}
+
+function set(node, id) {
+  var schedule = get(node, id);
+  if (schedule.state > STARTED) throw new Error("too late; already running");
+  return schedule;
+}
+
+function get(node, id) {
+  var schedule = node.__transition;
+  if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
+  return schedule;
+}
+
+function create(node, id, self) {
+  var schedules = node.__transition,
+      tween;
+
+  // Initialize the self timer when the transition is created.
+  // Note the actual delay is not known until the first callback!
+  schedules[id] = self;
+  self.timer = Object(d3_timer__WEBPACK_IMPORTED_MODULE_1__["timer"])(schedule, 0, self.time);
+
+  function schedule(elapsed) {
+    self.state = SCHEDULED;
+    self.timer.restart(start, self.delay, self.time);
+
+    // If the elapsed delay is less than our first sleep, start immediately.
+    if (self.delay <= elapsed) start(elapsed - self.delay);
+  }
+
+  function start(elapsed) {
+    var i, j, n, o;
+
+    // If the state is not SCHEDULED, then we previously errored on start.
+    if (self.state !== SCHEDULED) return stop();
+
+    for (i in schedules) {
+      o = schedules[i];
+      if (o.name !== self.name) continue;
+
+      // While this element already has a starting transition during this frame,
+      // defer starting an interrupting transition until that transition has a
+      // chance to tick (and possibly end); see d3/d3-transition#54!
+      if (o.state === STARTED) return Object(d3_timer__WEBPACK_IMPORTED_MODULE_1__["timeout"])(start);
+
+      // Interrupt the active transition, if any.
+      if (o.state === RUNNING) {
+        o.state = ENDED;
+        o.timer.stop();
+        o.on.call("interrupt", node, node.__data__, o.index, o.group);
+        delete schedules[i];
+      }
+
+      // Cancel any pre-empted transitions.
+      else if (+i < id) {
+        o.state = ENDED;
+        o.timer.stop();
+        o.on.call("cancel", node, node.__data__, o.index, o.group);
+        delete schedules[i];
+      }
+    }
+
+    // Defer the first tick to end of the current frame; see d3/d3#1576.
+    // Note the transition may be canceled after start and before the first tick!
+    // Note this must be scheduled before the start event; see d3/d3-transition#16!
+    // Assuming this is successful, subsequent callbacks go straight to tick.
+    Object(d3_timer__WEBPACK_IMPORTED_MODULE_1__["timeout"])(function() {
+      if (self.state === STARTED) {
+        self.state = RUNNING;
+        self.timer.restart(tick, self.delay, self.time);
+        tick(elapsed);
+      }
+    });
+
+    // Dispatch the start event.
+    // Note this must be done before the tween are initialized.
+    self.state = STARTING;
+    self.on.call("start", node, node.__data__, self.index, self.group);
+    if (self.state !== STARTING) return; // interrupted
+    self.state = STARTED;
+
+    // Initialize the tween, deleting null tween.
+    tween = new Array(n = self.tween.length);
+    for (i = 0, j = -1; i < n; ++i) {
+      if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
+        tween[++j] = o;
+      }
+    }
+    tween.length = j + 1;
+  }
+
+  function tick(elapsed) {
+    var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
+        i = -1,
+        n = tween.length;
+
+    while (++i < n) {
+      tween[i].call(node, t);
+    }
+
+    // Dispatch the end event.
+    if (self.state === ENDING) {
+      self.on.call("end", node, node.__data__, self.index, self.group);
+      stop();
+    }
+  }
+
+  function stop() {
+    self.state = ENDED;
+    self.timer.stop();
+    delete schedules[id];
+    for (var i in schedules) return; // eslint-disable-line no-unused-vars
+    delete node.__transition;
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/select.js":
+/*!*************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/select.js ***!
+  \*************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-transition/src/transition/index.js");
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(select) {
+  var name = this._name,
+      id = this._id;
+
+  if (typeof select !== "function") select = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["selector"])(select);
+
+  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
+    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
+      if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
+        if ("__data__" in node) subnode.__data__ = node.__data__;
+        subgroup[i] = subnode;
+        Object(_schedule_js__WEBPACK_IMPORTED_MODULE_2__["default"])(subgroup[i], name, id, i, subgroup, Object(_schedule_js__WEBPACK_IMPORTED_MODULE_2__["get"])(node, id));
+      }
+    }
+  }
+
+  return new _index_js__WEBPACK_IMPORTED_MODULE_1__["Transition"](subgroups, this._parents, name, id);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/selectAll.js":
+/*!****************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/selectAll.js ***!
+  \****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-transition/src/transition/index.js");
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function(select) {
+  var name = this._name,
+      id = this._id;
+
+  if (typeof select !== "function") select = Object(d3_selection__WEBPACK_IMPORTED_MODULE_0__["selectorAll"])(select);
+
+  for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
+    for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+      if (node = group[i]) {
+        for (var children = select.call(node, node.__data__, i, group), child, inherit = Object(_schedule_js__WEBPACK_IMPORTED_MODULE_2__["get"])(node, id), k = 0, l = children.length; k < l; ++k) {
+          if (child = children[k]) {
+            Object(_schedule_js__WEBPACK_IMPORTED_MODULE_2__["default"])(child, name, id, k, children, inherit);
+          }
+        }
+        subgroups.push(children);
+        parents.push(node);
+      }
+    }
+  }
+
+  return new _index_js__WEBPACK_IMPORTED_MODULE_1__["Transition"](subgroups, parents, name, id);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/selection.js":
+/*!****************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/selection.js ***!
+  \****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+
+
+var Selection = d3_selection__WEBPACK_IMPORTED_MODULE_0__["selection"].prototype.constructor;
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  return new Selection(this._groups, this._parents);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/style.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/style.js ***!
+  \************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+/* harmony import */ var _tween_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tween.js */ "./node_modules/d3-transition/src/transition/tween.js");
+/* harmony import */ var _interpolate_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./interpolate.js */ "./node_modules/d3-transition/src/transition/interpolate.js");
+
+
+
+
+
+
+function styleNull(name, interpolate) {
+  var string00,
+      string10,
+      interpolate0;
+  return function() {
+    var string0 = Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name),
+        string1 = (this.style.removeProperty(name), Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name));
+    return string0 === string1 ? null
+        : string0 === string00 && string1 === string10 ? interpolate0
+        : interpolate0 = interpolate(string00 = string0, string10 = string1);
+  };
+}
+
+function styleRemove(name) {
+  return function() {
+    this.style.removeProperty(name);
+  };
+}
+
+function styleConstant(name, interpolate, value1) {
+  var string00,
+      string1 = value1 + "",
+      interpolate0;
+  return function() {
+    var string0 = Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name);
+    return string0 === string1 ? null
+        : string0 === string00 ? interpolate0
+        : interpolate0 = interpolate(string00 = string0, value1);
+  };
+}
+
+function styleFunction(name, interpolate, value) {
+  var string00,
+      string10,
+      interpolate0;
+  return function() {
+    var string0 = Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name),
+        value1 = value(this),
+        string1 = value1 + "";
+    if (value1 == null) string1 = value1 = (this.style.removeProperty(name), Object(d3_selection__WEBPACK_IMPORTED_MODULE_1__["style"])(this, name));
+    return string0 === string1 ? null
+        : string0 === string00 && string1 === string10 ? interpolate0
+        : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
+  };
+}
+
+function styleMaybeRemove(id, name) {
+  var on0, on1, listener0, key = "style." + name, event = "end." + key, remove;
+  return function() {
+    var schedule = Object(_schedule_js__WEBPACK_IMPORTED_MODULE_2__["set"])(this, id),
+        on = schedule.on,
+        listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined;
+
+    // If this node shared a dispatch with the previous node,
+    // just assign the updated shared dispatch and we’re done!
+    // Otherwise, copy-on-write.
+    if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);
+
+    schedule.on = on1;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, value, priority) {
+  var i = (name += "") === "transform" ? d3_interpolate__WEBPACK_IMPORTED_MODULE_0__["interpolateTransformCss"] : _interpolate_js__WEBPACK_IMPORTED_MODULE_4__["default"];
+  return value == null ? this
+      .styleTween(name, styleNull(name, i))
+      .on("end.style." + name, styleRemove(name))
+    : typeof value === "function" ? this
+      .styleTween(name, styleFunction(name, i, Object(_tween_js__WEBPACK_IMPORTED_MODULE_3__["tweenValue"])(this, "style." + name, value)))
+      .each(styleMaybeRemove(this._id, name))
+    : this
+      .styleTween(name, styleConstant(name, i, value), priority)
+      .on("end.style." + name, null);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/styleTween.js":
+/*!*****************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/styleTween.js ***!
+  \*****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function styleInterpolate(name, i, priority) {
+  return function(t) {
+    this.style.setProperty(name, i.call(this, t), priority);
+  };
+}
+
+function styleTween(name, value, priority) {
+  var t, i0;
+  function tween() {
+    var i = value.apply(this, arguments);
+    if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
+    return t;
+  }
+  tween._value = value;
+  return tween;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, value, priority) {
+  var key = "style." + (name += "");
+  if (arguments.length < 2) return (key = this.tween(key)) && key._value;
+  if (value == null) return this.tween(key, null);
+  if (typeof value !== "function") throw new Error;
+  return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/text.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/text.js ***!
+  \***********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _tween_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tween.js */ "./node_modules/d3-transition/src/transition/tween.js");
+
+
+function textConstant(value) {
+  return function() {
+    this.textContent = value;
+  };
+}
+
+function textFunction(value) {
+  return function() {
+    var value1 = value(this);
+    this.textContent = value1 == null ? "" : value1;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(value) {
+  return this.tween("text", typeof value === "function"
+      ? textFunction(Object(_tween_js__WEBPACK_IMPORTED_MODULE_0__["tweenValue"])(this, "text", value))
+      : textConstant(value == null ? "" : value + ""));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/textTween.js":
+/*!****************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/textTween.js ***!
+  \****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function textInterpolate(i) {
+  return function(t) {
+    this.textContent = i.call(this, t);
+  };
+}
+
+function textTween(value) {
+  var t0, i0;
+  function tween() {
+    var i = value.apply(this, arguments);
+    if (i !== i0) t0 = (i0 = i) && textInterpolate(i);
+    return t0;
+  }
+  tween._value = value;
+  return tween;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(value) {
+  var key = "text";
+  if (arguments.length < 1) return (key = this.tween(key)) && key._value;
+  if (value == null) return this.tween(key, null);
+  if (typeof value !== "function") throw new Error;
+  return this.tween(key, textTween(value));
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/transition.js":
+/*!*****************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/transition.js ***!
+  \*****************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./node_modules/d3-transition/src/transition/index.js");
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var name = this._name,
+      id0 = this._id,
+      id1 = Object(_index_js__WEBPACK_IMPORTED_MODULE_0__["newId"])();
+
+  for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
+    for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
+      if (node = group[i]) {
+        var inherit = Object(_schedule_js__WEBPACK_IMPORTED_MODULE_1__["get"])(node, id0);
+        Object(_schedule_js__WEBPACK_IMPORTED_MODULE_1__["default"])(node, name, id1, i, group, {
+          time: inherit.time + inherit.delay + inherit.duration,
+          delay: 0,
+          duration: inherit.duration,
+          ease: inherit.ease
+        });
+      }
+    }
+  }
+
+  return new _index_js__WEBPACK_IMPORTED_MODULE_0__["Transition"](groups, this._parents, name, id1);
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-transition/src/transition/tween.js":
+/*!************************************************************!*\
+  !*** ./node_modules/d3-transition/src/transition/tween.js ***!
+  \************************************************************/
+/*! exports provided: default, tweenValue */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tweenValue", function() { return tweenValue; });
+/* harmony import */ var _schedule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./schedule.js */ "./node_modules/d3-transition/src/transition/schedule.js");
+
+
+function tweenRemove(id, name) {
+  var tween0, tween1;
+  return function() {
+    var schedule = Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id),
+        tween = schedule.tween;
+
+    // If this node shared tween with the previous node,
+    // just assign the updated shared tween and we’re done!
+    // Otherwise, copy-on-write.
+    if (tween !== tween0) {
+      tween1 = tween0 = tween;
+      for (var i = 0, n = tween1.length; i < n; ++i) {
+        if (tween1[i].name === name) {
+          tween1 = tween1.slice();
+          tween1.splice(i, 1);
+          break;
+        }
+      }
+    }
+
+    schedule.tween = tween1;
+  };
+}
+
+function tweenFunction(id, name, value) {
+  var tween0, tween1;
+  if (typeof value !== "function") throw new Error;
+  return function() {
+    var schedule = Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id),
+        tween = schedule.tween;
+
+    // If this node shared tween with the previous node,
+    // just assign the updated shared tween and we’re done!
+    // Otherwise, copy-on-write.
+    if (tween !== tween0) {
+      tween1 = (tween0 = tween).slice();
+      for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
+        if (tween1[i].name === name) {
+          tween1[i] = t;
+          break;
+        }
+      }
+      if (i === n) tween1.push(t);
+    }
+
+    schedule.tween = tween1;
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function(name, value) {
+  var id = this._id;
+
+  name += "";
+
+  if (arguments.length < 2) {
+    var tween = Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["get"])(this.node(), id).tween;
+    for (var i = 0, n = tween.length, t; i < n; ++i) {
+      if ((t = tween[i]).name === name) {
+        return t.value;
+      }
+    }
+    return null;
+  }
+
+  return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
+});
+
+function tweenValue(transition, name, value) {
+  var id = transition._id;
+
+  transition.each(function() {
+    var schedule = Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["set"])(this, id);
+    (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
+  });
+
+  return function(node) {
+    return Object(_schedule_js__WEBPACK_IMPORTED_MODULE_0__["get"])(node, id).value[name];
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/Beach.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-voronoi/src/Beach.js ***!
+  \**********************************************/
+/*! exports provided: removeBeach, addBeach */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeBeach", function() { return removeBeach; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addBeach", function() { return addBeach; });
+/* harmony import */ var _RedBlackTree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./RedBlackTree */ "./node_modules/d3-voronoi/src/RedBlackTree.js");
+/* harmony import */ var _Cell__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Cell */ "./node_modules/d3-voronoi/src/Cell.js");
+/* harmony import */ var _Circle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Circle */ "./node_modules/d3-voronoi/src/Circle.js");
+/* harmony import */ var _Edge__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Edge */ "./node_modules/d3-voronoi/src/Edge.js");
+/* harmony import */ var _Diagram__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Diagram */ "./node_modules/d3-voronoi/src/Diagram.js");
+
+
+
+
+
+
+var beachPool = [];
+
+function Beach() {
+  Object(_RedBlackTree__WEBPACK_IMPORTED_MODULE_0__["RedBlackNode"])(this);
+  this.edge =
+  this.site =
+  this.circle = null;
+}
+
+function createBeach(site) {
+  var beach = beachPool.pop() || new Beach;
+  beach.site = site;
+  return beach;
+}
+
+function detachBeach(beach) {
+  Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["detachCircle"])(beach);
+  _Diagram__WEBPACK_IMPORTED_MODULE_4__["beaches"].remove(beach);
+  beachPool.push(beach);
+  Object(_RedBlackTree__WEBPACK_IMPORTED_MODULE_0__["RedBlackNode"])(beach);
+}
+
+function removeBeach(beach) {
+  var circle = beach.circle,
+      x = circle.x,
+      y = circle.cy,
+      vertex = [x, y],
+      previous = beach.P,
+      next = beach.N,
+      disappearing = [beach];
+
+  detachBeach(beach);
+
+  var lArc = previous;
+  while (lArc.circle
+      && Math.abs(x - lArc.circle.x) < _Diagram__WEBPACK_IMPORTED_MODULE_4__["epsilon"]
+      && Math.abs(y - lArc.circle.cy) < _Diagram__WEBPACK_IMPORTED_MODULE_4__["epsilon"]) {
+    previous = lArc.P;
+    disappearing.unshift(lArc);
+    detachBeach(lArc);
+    lArc = previous;
+  }
+
+  disappearing.unshift(lArc);
+  Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["detachCircle"])(lArc);
+
+  var rArc = next;
+  while (rArc.circle
+      && Math.abs(x - rArc.circle.x) < _Diagram__WEBPACK_IMPORTED_MODULE_4__["epsilon"]
+      && Math.abs(y - rArc.circle.cy) < _Diagram__WEBPACK_IMPORTED_MODULE_4__["epsilon"]) {
+    next = rArc.N;
+    disappearing.push(rArc);
+    detachBeach(rArc);
+    rArc = next;
+  }
+
+  disappearing.push(rArc);
+  Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["detachCircle"])(rArc);
+
+  var nArcs = disappearing.length,
+      iArc;
+  for (iArc = 1; iArc < nArcs; ++iArc) {
+    rArc = disappearing[iArc];
+    lArc = disappearing[iArc - 1];
+    Object(_Edge__WEBPACK_IMPORTED_MODULE_3__["setEdgeEnd"])(rArc.edge, lArc.site, rArc.site, vertex);
+  }
+
+  lArc = disappearing[0];
+  rArc = disappearing[nArcs - 1];
+  rArc.edge = Object(_Edge__WEBPACK_IMPORTED_MODULE_3__["createEdge"])(lArc.site, rArc.site, null, vertex);
+
+  Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["attachCircle"])(lArc);
+  Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["attachCircle"])(rArc);
+}
+
+function addBeach(site) {
+  var x = site[0],
+      directrix = site[1],
+      lArc,
+      rArc,
+      dxl,
+      dxr,
+      node = _Diagram__WEBPACK_IMPORTED_MODULE_4__["beaches"]._;
+
+  while (node) {
+    dxl = leftBreakPoint(node, directrix) - x;
+    if (dxl > _Diagram__WEBPACK_IMPORTED_MODULE_4__["epsilon"]) node = node.L; else {
+      dxr = x - rightBreakPoint(node, directrix);
+      if (dxr > _Diagram__WEBPACK_IMPORTED_MODULE_4__["epsilon"]) {
+        if (!node.R) {
+          lArc = node;
+          break;
+        }
+        node = node.R;
+      } else {
+        if (dxl > -_Diagram__WEBPACK_IMPORTED_MODULE_4__["epsilon"]) {
+          lArc = node.P;
+          rArc = node;
+        } else if (dxr > -_Diagram__WEBPACK_IMPORTED_MODULE_4__["epsilon"]) {
+          lArc = node;
+          rArc = node.N;
+        } else {
+          lArc = rArc = node;
+        }
+        break;
+      }
+    }
+  }
+
+  Object(_Cell__WEBPACK_IMPORTED_MODULE_1__["createCell"])(site);
+  var newArc = createBeach(site);
+  _Diagram__WEBPACK_IMPORTED_MODULE_4__["beaches"].insert(lArc, newArc);
+
+  if (!lArc && !rArc) return;
+
+  if (lArc === rArc) {
+    Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["detachCircle"])(lArc);
+    rArc = createBeach(lArc.site);
+    _Diagram__WEBPACK_IMPORTED_MODULE_4__["beaches"].insert(newArc, rArc);
+    newArc.edge = rArc.edge = Object(_Edge__WEBPACK_IMPORTED_MODULE_3__["createEdge"])(lArc.site, newArc.site);
+    Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["attachCircle"])(lArc);
+    Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["attachCircle"])(rArc);
+    return;
+  }
+
+  if (!rArc) { // && lArc
+    newArc.edge = Object(_Edge__WEBPACK_IMPORTED_MODULE_3__["createEdge"])(lArc.site, newArc.site);
+    return;
+  }
+
+  // else lArc !== rArc
+  Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["detachCircle"])(lArc);
+  Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["detachCircle"])(rArc);
+
+  var lSite = lArc.site,
+      ax = lSite[0],
+      ay = lSite[1],
+      bx = site[0] - ax,
+      by = site[1] - ay,
+      rSite = rArc.site,
+      cx = rSite[0] - ax,
+      cy = rSite[1] - ay,
+      d = 2 * (bx * cy - by * cx),
+      hb = bx * bx + by * by,
+      hc = cx * cx + cy * cy,
+      vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
+
+  Object(_Edge__WEBPACK_IMPORTED_MODULE_3__["setEdgeEnd"])(rArc.edge, lSite, rSite, vertex);
+  newArc.edge = Object(_Edge__WEBPACK_IMPORTED_MODULE_3__["createEdge"])(lSite, site, null, vertex);
+  rArc.edge = Object(_Edge__WEBPACK_IMPORTED_MODULE_3__["createEdge"])(site, rSite, null, vertex);
+  Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["attachCircle"])(lArc);
+  Object(_Circle__WEBPACK_IMPORTED_MODULE_2__["attachCircle"])(rArc);
+}
+
+function leftBreakPoint(arc, directrix) {
+  var site = arc.site,
+      rfocx = site[0],
+      rfocy = site[1],
+      pby2 = rfocy - directrix;
+
+  if (!pby2) return rfocx;
+
+  var lArc = arc.P;
+  if (!lArc) return -Infinity;
+
+  site = lArc.site;
+  var lfocx = site[0],
+      lfocy = site[1],
+      plby2 = lfocy - directrix;
+
+  if (!plby2) return lfocx;
+
+  var hl = lfocx - rfocx,
+      aby2 = 1 / pby2 - 1 / plby2,
+      b = hl / plby2;
+
+  if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
+
+  return (rfocx + lfocx) / 2;
+}
+
+function rightBreakPoint(arc, directrix) {
+  var rArc = arc.N;
+  if (rArc) return leftBreakPoint(rArc, directrix);
+  var site = arc.site;
+  return site[1] === directrix ? site[0] : Infinity;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/Cell.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-voronoi/src/Cell.js ***!
+  \*********************************************/
+/*! exports provided: createCell, cellHalfedgeStart, cellHalfedgeEnd, sortCellHalfedges, clipCells */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createCell", function() { return createCell; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cellHalfedgeStart", function() { return cellHalfedgeStart; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cellHalfedgeEnd", function() { return cellHalfedgeEnd; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sortCellHalfedges", function() { return sortCellHalfedges; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipCells", function() { return clipCells; });
+/* harmony import */ var _Edge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Edge */ "./node_modules/d3-voronoi/src/Edge.js");
+/* harmony import */ var _Diagram__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Diagram */ "./node_modules/d3-voronoi/src/Diagram.js");
+
+
+
+function createCell(site) {
+  return _Diagram__WEBPACK_IMPORTED_MODULE_1__["cells"][site.index] = {
+    site: site,
+    halfedges: []
+  };
+}
+
+function cellHalfedgeAngle(cell, edge) {
+  var site = cell.site,
+      va = edge.left,
+      vb = edge.right;
+  if (site === vb) vb = va, va = site;
+  if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
+  if (site === va) va = edge[1], vb = edge[0];
+  else va = edge[0], vb = edge[1];
+  return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
+}
+
+function cellHalfedgeStart(cell, edge) {
+  return edge[+(edge.left !== cell.site)];
+}
+
+function cellHalfedgeEnd(cell, edge) {
+  return edge[+(edge.left === cell.site)];
+}
+
+function sortCellHalfedges() {
+  for (var i = 0, n = _Diagram__WEBPACK_IMPORTED_MODULE_1__["cells"].length, cell, halfedges, j, m; i < n; ++i) {
+    if ((cell = _Diagram__WEBPACK_IMPORTED_MODULE_1__["cells"][i]) && (m = (halfedges = cell.halfedges).length)) {
+      var index = new Array(m),
+          array = new Array(m);
+      for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, _Diagram__WEBPACK_IMPORTED_MODULE_1__["edges"][halfedges[j]]);
+      index.sort(function(i, j) { return array[j] - array[i]; });
+      for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
+      for (j = 0; j < m; ++j) halfedges[j] = array[j];
+    }
+  }
+}
+
+function clipCells(x0, y0, x1, y1) {
+  var nCells = _Diagram__WEBPACK_IMPORTED_MODULE_1__["cells"].length,
+      iCell,
+      cell,
+      site,
+      iHalfedge,
+      halfedges,
+      nHalfedges,
+      start,
+      startX,
+      startY,
+      end,
+      endX,
+      endY,
+      cover = true;
+
+  for (iCell = 0; iCell < nCells; ++iCell) {
+    if (cell = _Diagram__WEBPACK_IMPORTED_MODULE_1__["cells"][iCell]) {
+      site = cell.site;
+      halfedges = cell.halfedges;
+      iHalfedge = halfedges.length;
+
+      // Remove any dangling clipped edges.
+      while (iHalfedge--) {
+        if (!_Diagram__WEBPACK_IMPORTED_MODULE_1__["edges"][halfedges[iHalfedge]]) {
+          halfedges.splice(iHalfedge, 1);
+        }
+      }
+
+      // Insert any border edges as necessary.
+      iHalfedge = 0, nHalfedges = halfedges.length;
+      while (iHalfedge < nHalfedges) {
+        end = cellHalfedgeEnd(cell, _Diagram__WEBPACK_IMPORTED_MODULE_1__["edges"][halfedges[iHalfedge]]), endX = end[0], endY = end[1];
+        start = cellHalfedgeStart(cell, _Diagram__WEBPACK_IMPORTED_MODULE_1__["edges"][halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
+        if (Math.abs(endX - startX) > _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] || Math.abs(endY - startY) > _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"]) {
+          halfedges.splice(iHalfedge, 0, _Diagram__WEBPACK_IMPORTED_MODULE_1__["edges"].push(Object(_Edge__WEBPACK_IMPORTED_MODULE_0__["createBorderEdge"])(site, end,
+              Math.abs(endX - x0) < _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] && y1 - endY > _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] ? [x0, Math.abs(startX - x0) < _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] ? startY : y1]
+              : Math.abs(endY - y1) < _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] && x1 - endX > _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] ? [Math.abs(startY - y1) < _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] ? startX : x1, y1]
+              : Math.abs(endX - x1) < _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] && endY - y0 > _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] ? [x1, Math.abs(startX - x1) < _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] ? startY : y0]
+              : Math.abs(endY - y0) < _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] && endX - x0 > _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] ? [Math.abs(startY - y0) < _Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon"] ? startX : x0, y0]
+              : null)) - 1);
+          ++nHalfedges;
+        }
+      }
+
+      if (nHalfedges) cover = false;
+    }
+  }
+
+  // If there weren’t any edges, have the closest site cover the extent.
+  // It doesn’t matter which corner of the extent we measure!
+  if (cover) {
+    var dx, dy, d2, dc = Infinity;
+
+    for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
+      if (cell = _Diagram__WEBPACK_IMPORTED_MODULE_1__["cells"][iCell]) {
+        site = cell.site;
+        dx = site[0] - x0;
+        dy = site[1] - y0;
+        d2 = dx * dx + dy * dy;
+        if (d2 < dc) dc = d2, cover = cell;
+      }
+    }
+
+    if (cover) {
+      var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
+      cover.halfedges.push(
+        _Diagram__WEBPACK_IMPORTED_MODULE_1__["edges"].push(Object(_Edge__WEBPACK_IMPORTED_MODULE_0__["createBorderEdge"])(site = cover.site, v00, v01)) - 1,
+        _Diagram__WEBPACK_IMPORTED_MODULE_1__["edges"].push(Object(_Edge__WEBPACK_IMPORTED_MODULE_0__["createBorderEdge"])(site, v01, v11)) - 1,
+        _Diagram__WEBPACK_IMPORTED_MODULE_1__["edges"].push(Object(_Edge__WEBPACK_IMPORTED_MODULE_0__["createBorderEdge"])(site, v11, v10)) - 1,
+        _Diagram__WEBPACK_IMPORTED_MODULE_1__["edges"].push(Object(_Edge__WEBPACK_IMPORTED_MODULE_0__["createBorderEdge"])(site, v10, v00)) - 1
+      );
+    }
+  }
+
+  // Lastly delete any cells with no edges; these were entirely clipped.
+  for (iCell = 0; iCell < nCells; ++iCell) {
+    if (cell = _Diagram__WEBPACK_IMPORTED_MODULE_1__["cells"][iCell]) {
+      if (!cell.halfedges.length) {
+        delete _Diagram__WEBPACK_IMPORTED_MODULE_1__["cells"][iCell];
+      }
+    }
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/Circle.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-voronoi/src/Circle.js ***!
+  \***********************************************/
+/*! exports provided: firstCircle, attachCircle, detachCircle */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "firstCircle", function() { return firstCircle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "attachCircle", function() { return attachCircle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "detachCircle", function() { return detachCircle; });
+/* harmony import */ var _RedBlackTree__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./RedBlackTree */ "./node_modules/d3-voronoi/src/RedBlackTree.js");
+/* harmony import */ var _Diagram__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Diagram */ "./node_modules/d3-voronoi/src/Diagram.js");
+
+
+
+var circlePool = [];
+
+var firstCircle;
+
+function Circle() {
+  Object(_RedBlackTree__WEBPACK_IMPORTED_MODULE_0__["RedBlackNode"])(this);
+  this.x =
+  this.y =
+  this.arc =
+  this.site =
+  this.cy = null;
+}
+
+function attachCircle(arc) {
+  var lArc = arc.P,
+      rArc = arc.N;
+
+  if (!lArc || !rArc) return;
+
+  var lSite = lArc.site,
+      cSite = arc.site,
+      rSite = rArc.site;
+
+  if (lSite === rSite) return;
+
+  var bx = cSite[0],
+      by = cSite[1],
+      ax = lSite[0] - bx,
+      ay = lSite[1] - by,
+      cx = rSite[0] - bx,
+      cy = rSite[1] - by;
+
+  var d = 2 * (ax * cy - ay * cx);
+  if (d >= -_Diagram__WEBPACK_IMPORTED_MODULE_1__["epsilon2"]) return;
+
+  var ha = ax * ax + ay * ay,
+      hc = cx * cx + cy * cy,
+      x = (cy * ha - ay * hc) / d,
+      y = (ax * hc - cx * ha) / d;
+
+  var circle = circlePool.pop() || new Circle;
+  circle.arc = arc;
+  circle.site = cSite;
+  circle.x = x + bx;
+  circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
+
+  arc.circle = circle;
+
+  var before = null,
+      node = _Diagram__WEBPACK_IMPORTED_MODULE_1__["circles"]._;
+
+  while (node) {
+    if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
+      if (node.L) node = node.L;
+      else { before = node.P; break; }
+    } else {
+      if (node.R) node = node.R;
+      else { before = node; break; }
+    }
+  }
+
+  _Diagram__WEBPACK_IMPORTED_MODULE_1__["circles"].insert(before, circle);
+  if (!before) firstCircle = circle;
+}
+
+function detachCircle(arc) {
+  var circle = arc.circle;
+  if (circle) {
+    if (!circle.P) firstCircle = circle.N;
+    _Diagram__WEBPACK_IMPORTED_MODULE_1__["circles"].remove(circle);
+    circlePool.push(circle);
+    Object(_RedBlackTree__WEBPACK_IMPORTED_MODULE_0__["RedBlackNode"])(circle);
+    arc.circle = null;
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/Diagram.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-voronoi/src/Diagram.js ***!
+  \************************************************/
+/*! exports provided: epsilon, epsilon2, beaches, cells, circles, edges, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epsilon", function() { return epsilon; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "epsilon2", function() { return epsilon2; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "beaches", function() { return beaches; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cells", function() { return cells; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circles", function() { return circles; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "edges", function() { return edges; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Diagram; });
+/* harmony import */ var _Beach__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Beach */ "./node_modules/d3-voronoi/src/Beach.js");
+/* harmony import */ var _Cell__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Cell */ "./node_modules/d3-voronoi/src/Cell.js");
+/* harmony import */ var _Circle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Circle */ "./node_modules/d3-voronoi/src/Circle.js");
+/* harmony import */ var _Edge__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Edge */ "./node_modules/d3-voronoi/src/Edge.js");
+/* harmony import */ var _RedBlackTree__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./RedBlackTree */ "./node_modules/d3-voronoi/src/RedBlackTree.js");
+
+
+
+
+
+
+var epsilon = 1e-6;
+var epsilon2 = 1e-12;
+var beaches;
+var cells;
+var circles;
+var edges;
+
+function triangleArea(a, b, c) {
+  return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
+}
+
+function lexicographic(a, b) {
+  return b[1] - a[1]
+      || b[0] - a[0];
+}
+
+function Diagram(sites, extent) {
+  var site = sites.sort(lexicographic).pop(),
+      x,
+      y,
+      circle;
+
+  edges = [];
+  cells = new Array(sites.length);
+  beaches = new _RedBlackTree__WEBPACK_IMPORTED_MODULE_4__["default"];
+  circles = new _RedBlackTree__WEBPACK_IMPORTED_MODULE_4__["default"];
+
+  while (true) {
+    circle = _Circle__WEBPACK_IMPORTED_MODULE_2__["firstCircle"];
+    if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
+      if (site[0] !== x || site[1] !== y) {
+        Object(_Beach__WEBPACK_IMPORTED_MODULE_0__["addBeach"])(site);
+        x = site[0], y = site[1];
+      }
+      site = sites.pop();
+    } else if (circle) {
+      Object(_Beach__WEBPACK_IMPORTED_MODULE_0__["removeBeach"])(circle.arc);
+    } else {
+      break;
+    }
+  }
+
+  Object(_Cell__WEBPACK_IMPORTED_MODULE_1__["sortCellHalfedges"])();
+
+  if (extent) {
+    var x0 = +extent[0][0],
+        y0 = +extent[0][1],
+        x1 = +extent[1][0],
+        y1 = +extent[1][1];
+    Object(_Edge__WEBPACK_IMPORTED_MODULE_3__["clipEdges"])(x0, y0, x1, y1);
+    Object(_Cell__WEBPACK_IMPORTED_MODULE_1__["clipCells"])(x0, y0, x1, y1);
+  }
+
+  this.edges = edges;
+  this.cells = cells;
+
+  beaches =
+  circles =
+  edges =
+  cells = null;
+}
+
+Diagram.prototype = {
+  constructor: Diagram,
+
+  polygons: function() {
+    var edges = this.edges;
+
+    return this.cells.map(function(cell) {
+      var polygon = cell.halfedges.map(function(i) { return Object(_Cell__WEBPACK_IMPORTED_MODULE_1__["cellHalfedgeStart"])(cell, edges[i]); });
+      polygon.data = cell.site.data;
+      return polygon;
+    });
+  },
+
+  triangles: function() {
+    var triangles = [],
+        edges = this.edges;
+
+    this.cells.forEach(function(cell, i) {
+      if (!(m = (halfedges = cell.halfedges).length)) return;
+      var site = cell.site,
+          halfedges,
+          j = -1,
+          m,
+          s0,
+          e1 = edges[halfedges[m - 1]],
+          s1 = e1.left === site ? e1.right : e1.left;
+
+      while (++j < m) {
+        s0 = s1;
+        e1 = edges[halfedges[j]];
+        s1 = e1.left === site ? e1.right : e1.left;
+        if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
+          triangles.push([site.data, s0.data, s1.data]);
+        }
+      }
+    });
+
+    return triangles;
+  },
+
+  links: function() {
+    return this.edges.filter(function(edge) {
+      return edge.right;
+    }).map(function(edge) {
+      return {
+        source: edge.left.data,
+        target: edge.right.data
+      };
+    });
+  },
+
+  find: function(x, y, radius) {
+    var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
+
+    // Use the previously-found cell, or start with an arbitrary one.
+    while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
+    var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
+
+    // Traverse the half-edges to find a closer cell, if any.
+    do {
+      cell = that.cells[i0 = i1], i1 = null;
+      cell.halfedges.forEach(function(e) {
+        var edge = that.edges[e], v = edge.left;
+        if ((v === cell.site || !v) && !(v = edge.right)) return;
+        var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
+        if (v2 < d2) d2 = v2, i1 = v.index;
+      });
+    } while (i1 !== null);
+
+    that._found = i0;
+
+    return radius == null || d2 <= radius * radius ? cell.site : null;
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/Edge.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-voronoi/src/Edge.js ***!
+  \*********************************************/
+/*! exports provided: createEdge, createBorderEdge, setEdgeEnd, clipEdges */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createEdge", function() { return createEdge; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createBorderEdge", function() { return createBorderEdge; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setEdgeEnd", function() { return setEdgeEnd; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipEdges", function() { return clipEdges; });
+/* harmony import */ var _Diagram__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Diagram */ "./node_modules/d3-voronoi/src/Diagram.js");
+
+
+function createEdge(left, right, v0, v1) {
+  var edge = [null, null],
+      index = _Diagram__WEBPACK_IMPORTED_MODULE_0__["edges"].push(edge) - 1;
+  edge.left = left;
+  edge.right = right;
+  if (v0) setEdgeEnd(edge, left, right, v0);
+  if (v1) setEdgeEnd(edge, right, left, v1);
+  _Diagram__WEBPACK_IMPORTED_MODULE_0__["cells"][left.index].halfedges.push(index);
+  _Diagram__WEBPACK_IMPORTED_MODULE_0__["cells"][right.index].halfedges.push(index);
+  return edge;
+}
+
+function createBorderEdge(left, v0, v1) {
+  var edge = [v0, v1];
+  edge.left = left;
+  return edge;
+}
+
+function setEdgeEnd(edge, left, right, vertex) {
+  if (!edge[0] && !edge[1]) {
+    edge[0] = vertex;
+    edge.left = left;
+    edge.right = right;
+  } else if (edge.left === right) {
+    edge[1] = vertex;
+  } else {
+    edge[0] = vertex;
+  }
+}
+
+// Liang–Barsky line clipping.
+function clipEdge(edge, x0, y0, x1, y1) {
+  var a = edge[0],
+      b = edge[1],
+      ax = a[0],
+      ay = a[1],
+      bx = b[0],
+      by = b[1],
+      t0 = 0,
+      t1 = 1,
+      dx = bx - ax,
+      dy = by - ay,
+      r;
+
+  r = x0 - ax;
+  if (!dx && r > 0) return;
+  r /= dx;
+  if (dx < 0) {
+    if (r < t0) return;
+    if (r < t1) t1 = r;
+  } else if (dx > 0) {
+    if (r > t1) return;
+    if (r > t0) t0 = r;
+  }
+
+  r = x1 - ax;
+  if (!dx && r < 0) return;
+  r /= dx;
+  if (dx < 0) {
+    if (r > t1) return;
+    if (r > t0) t0 = r;
+  } else if (dx > 0) {
+    if (r < t0) return;
+    if (r < t1) t1 = r;
+  }
+
+  r = y0 - ay;
+  if (!dy && r > 0) return;
+  r /= dy;
+  if (dy < 0) {
+    if (r < t0) return;
+    if (r < t1) t1 = r;
+  } else if (dy > 0) {
+    if (r > t1) return;
+    if (r > t0) t0 = r;
+  }
+
+  r = y1 - ay;
+  if (!dy && r < 0) return;
+  r /= dy;
+  if (dy < 0) {
+    if (r > t1) return;
+    if (r > t0) t0 = r;
+  } else if (dy > 0) {
+    if (r < t0) return;
+    if (r < t1) t1 = r;
+  }
+
+  if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
+
+  if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
+  if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
+  return true;
+}
+
+function connectEdge(edge, x0, y0, x1, y1) {
+  var v1 = edge[1];
+  if (v1) return true;
+
+  var v0 = edge[0],
+      left = edge.left,
+      right = edge.right,
+      lx = left[0],
+      ly = left[1],
+      rx = right[0],
+      ry = right[1],
+      fx = (lx + rx) / 2,
+      fy = (ly + ry) / 2,
+      fm,
+      fb;
+
+  if (ry === ly) {
+    if (fx < x0 || fx >= x1) return;
+    if (lx > rx) {
+      if (!v0) v0 = [fx, y0];
+      else if (v0[1] >= y1) return;
+      v1 = [fx, y1];
+    } else {
+      if (!v0) v0 = [fx, y1];
+      else if (v0[1] < y0) return;
+      v1 = [fx, y0];
+    }
+  } else {
+    fm = (lx - rx) / (ry - ly);
+    fb = fy - fm * fx;
+    if (fm < -1 || fm > 1) {
+      if (lx > rx) {
+        if (!v0) v0 = [(y0 - fb) / fm, y0];
+        else if (v0[1] >= y1) return;
+        v1 = [(y1 - fb) / fm, y1];
+      } else {
+        if (!v0) v0 = [(y1 - fb) / fm, y1];
+        else if (v0[1] < y0) return;
+        v1 = [(y0 - fb) / fm, y0];
+      }
+    } else {
+      if (ly < ry) {
+        if (!v0) v0 = [x0, fm * x0 + fb];
+        else if (v0[0] >= x1) return;
+        v1 = [x1, fm * x1 + fb];
+      } else {
+        if (!v0) v0 = [x1, fm * x1 + fb];
+        else if (v0[0] < x0) return;
+        v1 = [x0, fm * x0 + fb];
+      }
+    }
+  }
+
+  edge[0] = v0;
+  edge[1] = v1;
+  return true;
+}
+
+function clipEdges(x0, y0, x1, y1) {
+  var i = _Diagram__WEBPACK_IMPORTED_MODULE_0__["edges"].length,
+      edge;
+
+  while (i--) {
+    if (!connectEdge(edge = _Diagram__WEBPACK_IMPORTED_MODULE_0__["edges"][i], x0, y0, x1, y1)
+        || !clipEdge(edge, x0, y0, x1, y1)
+        || !(Math.abs(edge[0][0] - edge[1][0]) > _Diagram__WEBPACK_IMPORTED_MODULE_0__["epsilon"]
+            || Math.abs(edge[0][1] - edge[1][1]) > _Diagram__WEBPACK_IMPORTED_MODULE_0__["epsilon"])) {
+      delete _Diagram__WEBPACK_IMPORTED_MODULE_0__["edges"][i];
+    }
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/RedBlackTree.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/d3-voronoi/src/RedBlackTree.js ***!
+  \*****************************************************/
+/*! exports provided: RedBlackNode, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RedBlackNode", function() { return RedBlackNode; });
+function RedBlackTree() {
+  this._ = null; // root node
+}
+
+function RedBlackNode(node) {
+  node.U = // parent node
+  node.C = // color - true for red, false for black
+  node.L = // left node
+  node.R = // right node
+  node.P = // previous node
+  node.N = null; // next node
+}
+
+RedBlackTree.prototype = {
+  constructor: RedBlackTree,
+
+  insert: function(after, node) {
+    var parent, grandpa, uncle;
+
+    if (after) {
+      node.P = after;
+      node.N = after.N;
+      if (after.N) after.N.P = node;
+      after.N = node;
+      if (after.R) {
+        after = after.R;
+        while (after.L) after = after.L;
+        after.L = node;
+      } else {
+        after.R = node;
+      }
+      parent = after;
+    } else if (this._) {
+      after = RedBlackFirst(this._);
+      node.P = null;
+      node.N = after;
+      after.P = after.L = node;
+      parent = after;
+    } else {
+      node.P = node.N = null;
+      this._ = node;
+      parent = null;
+    }
+    node.L = node.R = null;
+    node.U = parent;
+    node.C = true;
+
+    after = node;
+    while (parent && parent.C) {
+      grandpa = parent.U;
+      if (parent === grandpa.L) {
+        uncle = grandpa.R;
+        if (uncle && uncle.C) {
+          parent.C = uncle.C = false;
+          grandpa.C = true;
+          after = grandpa;
+        } else {
+          if (after === parent.R) {
+            RedBlackRotateLeft(this, parent);
+            after = parent;
+            parent = after.U;
+          }
+          parent.C = false;
+          grandpa.C = true;
+          RedBlackRotateRight(this, grandpa);
+        }
+      } else {
+        uncle = grandpa.L;
+        if (uncle && uncle.C) {
+          parent.C = uncle.C = false;
+          grandpa.C = true;
+          after = grandpa;
+        } else {
+          if (after === parent.L) {
+            RedBlackRotateRight(this, parent);
+            after = parent;
+            parent = after.U;
+          }
+          parent.C = false;
+          grandpa.C = true;
+          RedBlackRotateLeft(this, grandpa);
+        }
+      }
+      parent = after.U;
+    }
+    this._.C = false;
+  },
+
+  remove: function(node) {
+    if (node.N) node.N.P = node.P;
+    if (node.P) node.P.N = node.N;
+    node.N = node.P = null;
+
+    var parent = node.U,
+        sibling,
+        left = node.L,
+        right = node.R,
+        next,
+        red;
+
+    if (!left) next = right;
+    else if (!right) next = left;
+    else next = RedBlackFirst(right);
+
+    if (parent) {
+      if (parent.L === node) parent.L = next;
+      else parent.R = next;
+    } else {
+      this._ = next;
+    }
+
+    if (left && right) {
+      red = next.C;
+      next.C = node.C;
+      next.L = left;
+      left.U = next;
+      if (next !== right) {
+        parent = next.U;
+        next.U = node.U;
+        node = next.R;
+        parent.L = node;
+        next.R = right;
+        right.U = next;
+      } else {
+        next.U = parent;
+        parent = next;
+        node = next.R;
+      }
+    } else {
+      red = node.C;
+      node = next;
+    }
+
+    if (node) node.U = parent;
+    if (red) return;
+    if (node && node.C) { node.C = false; return; }
+
+    do {
+      if (node === this._) break;
+      if (node === parent.L) {
+        sibling = parent.R;
+        if (sibling.C) {
+          sibling.C = false;
+          parent.C = true;
+          RedBlackRotateLeft(this, parent);
+          sibling = parent.R;
+        }
+        if ((sibling.L && sibling.L.C)
+            || (sibling.R && sibling.R.C)) {
+          if (!sibling.R || !sibling.R.C) {
+            sibling.L.C = false;
+            sibling.C = true;
+            RedBlackRotateRight(this, sibling);
+            sibling = parent.R;
+          }
+          sibling.C = parent.C;
+          parent.C = sibling.R.C = false;
+          RedBlackRotateLeft(this, parent);
+          node = this._;
+          break;
+        }
+      } else {
+        sibling = parent.L;
+        if (sibling.C) {
+          sibling.C = false;
+          parent.C = true;
+          RedBlackRotateRight(this, parent);
+          sibling = parent.L;
+        }
+        if ((sibling.L && sibling.L.C)
+          || (sibling.R && sibling.R.C)) {
+          if (!sibling.L || !sibling.L.C) {
+            sibling.R.C = false;
+            sibling.C = true;
+            RedBlackRotateLeft(this, sibling);
+            sibling = parent.L;
+          }
+          sibling.C = parent.C;
+          parent.C = sibling.L.C = false;
+          RedBlackRotateRight(this, parent);
+          node = this._;
+          break;
+        }
+      }
+      sibling.C = true;
+      node = parent;
+      parent = parent.U;
+    } while (!node.C);
+
+    if (node) node.C = false;
+  }
+};
+
+function RedBlackRotateLeft(tree, node) {
+  var p = node,
+      q = node.R,
+      parent = p.U;
+
+  if (parent) {
+    if (parent.L === p) parent.L = q;
+    else parent.R = q;
+  } else {
+    tree._ = q;
+  }
+
+  q.U = parent;
+  p.U = q;
+  p.R = q.L;
+  if (p.R) p.R.U = p;
+  q.L = p;
+}
+
+function RedBlackRotateRight(tree, node) {
+  var p = node,
+      q = node.L,
+      parent = p.U;
+
+  if (parent) {
+    if (parent.L === p) parent.L = q;
+    else parent.R = q;
+  } else {
+    tree._ = q;
+  }
+
+  q.U = parent;
+  p.U = q;
+  p.L = q.R;
+  if (p.L) p.L.U = p;
+  q.R = p;
+}
+
+function RedBlackFirst(node) {
+  while (node.L) node = node.L;
+  return node;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (RedBlackTree);
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/constant.js":
+/*!*************************************************!*\
+  !*** ./node_modules/d3-voronoi/src/constant.js ***!
+  \*************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/index.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-voronoi/src/index.js ***!
+  \**********************************************/
+/*! exports provided: voronoi */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _voronoi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./voronoi */ "./node_modules/d3-voronoi/src/voronoi.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "voronoi", function() { return _voronoi__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/point.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-voronoi/src/point.js ***!
+  \**********************************************/
+/*! exports provided: x, y */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "x", function() { return x; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "y", function() { return y; });
+function x(d) {
+  return d[0];
+}
+
+function y(d) {
+  return d[1];
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-voronoi/src/voronoi.js":
+/*!************************************************!*\
+  !*** ./node_modules/d3-voronoi/src/voronoi.js ***!
+  \************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _constant__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constant */ "./node_modules/d3-voronoi/src/constant.js");
+/* harmony import */ var _point__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./point */ "./node_modules/d3-voronoi/src/point.js");
+/* harmony import */ var _Diagram__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Diagram */ "./node_modules/d3-voronoi/src/Diagram.js");
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var x = _point__WEBPACK_IMPORTED_MODULE_1__["x"],
+      y = _point__WEBPACK_IMPORTED_MODULE_1__["y"],
+      extent = null;
+
+  function voronoi(data) {
+    return new _Diagram__WEBPACK_IMPORTED_MODULE_2__["default"](data.map(function(d, i) {
+      var s = [Math.round(x(d, i, data) / _Diagram__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) * _Diagram__WEBPACK_IMPORTED_MODULE_2__["epsilon"], Math.round(y(d, i, data) / _Diagram__WEBPACK_IMPORTED_MODULE_2__["epsilon"]) * _Diagram__WEBPACK_IMPORTED_MODULE_2__["epsilon"]];
+      s.index = i;
+      s.data = d;
+      return s;
+    }), extent);
+  }
+
+  voronoi.polygons = function(data) {
+    return voronoi(data).polygons();
+  };
+
+  voronoi.links = function(data) {
+    return voronoi(data).links();
+  };
+
+  voronoi.triangles = function(data) {
+    return voronoi(data).triangles();
+  };
+
+  voronoi.x = function(_) {
+    return arguments.length ? (x = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), voronoi) : x;
+  };
+
+  voronoi.y = function(_) {
+    return arguments.length ? (y = typeof _ === "function" ? _ : Object(_constant__WEBPACK_IMPORTED_MODULE_0__["default"])(+_), voronoi) : y;
+  };
+
+  voronoi.extent = function(_) {
+    return arguments.length ? (extent = _ == null ? null : [[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]], voronoi) : extent && [[extent[0][0], extent[0][1]], [extent[1][0], extent[1][1]]];
+  };
+
+  voronoi.size = function(_) {
+    return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
+  };
+
+  return voronoi;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-zoom/src/constant.js":
+/*!**********************************************!*\
+  !*** ./node_modules/d3-zoom/src/constant.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function(x) {
+  return function() {
+    return x;
+  };
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-zoom/src/event.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-zoom/src/event.js ***!
+  \*******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomEvent; });
+function ZoomEvent(target, type, transform) {
+  this.target = target;
+  this.type = type;
+  this.transform = transform;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-zoom/src/index.js":
+/*!*******************************************!*\
+  !*** ./node_modules/d3-zoom/src/index.js ***!
+  \*******************************************/
+/*! exports provided: zoom, zoomTransform, zoomIdentity */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _zoom_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./zoom.js */ "./node_modules/d3-zoom/src/zoom.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zoom", function() { return _zoom_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
+
+/* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./transform.js */ "./node_modules/d3-zoom/src/transform.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zoomTransform", function() { return _transform_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zoomIdentity", function() { return _transform_js__WEBPACK_IMPORTED_MODULE_1__["identity"]; });
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-zoom/src/noevent.js":
+/*!*********************************************!*\
+  !*** ./node_modules/d3-zoom/src/noevent.js ***!
+  \*********************************************/
+/*! exports provided: nopropagation, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "nopropagation", function() { return nopropagation; });
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+
+
+function nopropagation() {
+  d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].preventDefault();
+  d3_selection__WEBPACK_IMPORTED_MODULE_0__["event"].stopImmediatePropagation();
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-zoom/src/transform.js":
+/*!***********************************************!*\
+  !*** ./node_modules/d3-zoom/src/transform.js ***!
+  \***********************************************/
+/*! exports provided: Transform, identity, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Transform", function() { return Transform; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return transform; });
+function Transform(k, x, y) {
+  this.k = k;
+  this.x = x;
+  this.y = y;
+}
+
+Transform.prototype = {
+  constructor: Transform,
+  scale: function(k) {
+    return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
+  },
+  translate: function(x, y) {
+    return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
+  },
+  apply: function(point) {
+    return [point[0] * this.k + this.x, point[1] * this.k + this.y];
+  },
+  applyX: function(x) {
+    return x * this.k + this.x;
+  },
+  applyY: function(y) {
+    return y * this.k + this.y;
+  },
+  invert: function(location) {
+    return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
+  },
+  invertX: function(x) {
+    return (x - this.x) / this.k;
+  },
+  invertY: function(y) {
+    return (y - this.y) / this.k;
+  },
+  rescaleX: function(x) {
+    return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
+  },
+  rescaleY: function(y) {
+    return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
+  },
+  toString: function() {
+    return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
+  }
+};
+
+var identity = new Transform(1, 0, 0);
+
+transform.prototype = Transform.prototype;
+
+function transform(node) {
+  while (!node.__zoom) if (!(node = node.parentNode)) return identity;
+  return node.__zoom;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/d3-zoom/src/zoom.js":
+/*!******************************************!*\
+  !*** ./node_modules/d3-zoom/src/zoom.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3_dispatch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-dispatch */ "./node_modules/d3-dispatch/src/index.js");
+/* harmony import */ var d3_drag__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-drag */ "./node_modules/d3-drag/src/index.js");
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony import */ var d3_transition__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! d3-transition */ "./node_modules/d3-transition/src/index.js");
+/* harmony import */ var _constant_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constant.js */ "./node_modules/d3-zoom/src/constant.js");
+/* harmony import */ var _event_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./event.js */ "./node_modules/d3-zoom/src/event.js");
+/* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./transform.js */ "./node_modules/d3-zoom/src/transform.js");
+/* harmony import */ var _noevent_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./noevent.js */ "./node_modules/d3-zoom/src/noevent.js");
+
+
+
+
+
+
+
+
+
+
+// Ignore right-click, since that should open the context menu.
+function defaultFilter() {
+  return !d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].ctrlKey && !d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].button;
+}
+
+function defaultExtent() {
+  var e = this;
+  if (e instanceof SVGElement) {
+    e = e.ownerSVGElement || e;
+    if (e.hasAttribute("viewBox")) {
+      e = e.viewBox.baseVal;
+      return [[e.x, e.y], [e.x + e.width, e.y + e.height]];
+    }
+    return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]];
+  }
+  return [[0, 0], [e.clientWidth, e.clientHeight]];
+}
+
+function defaultTransform() {
+  return this.__zoom || _transform_js__WEBPACK_IMPORTED_MODULE_7__["identity"];
+}
+
+function defaultWheelDelta() {
+  return -d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].deltaY * (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].deltaMode === 1 ? 0.05 : d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].deltaMode ? 1 : 0.002);
+}
+
+function defaultTouchable() {
+  return navigator.maxTouchPoints || ("ontouchstart" in this);
+}
+
+function defaultConstrain(transform, extent, translateExtent) {
+  var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
+      dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
+      dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
+      dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
+  return transform.translate(
+    dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
+    dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
+  );
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+  var filter = defaultFilter,
+      extent = defaultExtent,
+      constrain = defaultConstrain,
+      wheelDelta = defaultWheelDelta,
+      touchable = defaultTouchable,
+      scaleExtent = [0, Infinity],
+      translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
+      duration = 250,
+      interpolate = d3_interpolate__WEBPACK_IMPORTED_MODULE_2__["interpolateZoom"],
+      listeners = Object(d3_dispatch__WEBPACK_IMPORTED_MODULE_0__["dispatch"])("start", "zoom", "end"),
+      touchstarting,
+      touchending,
+      touchDelay = 500,
+      wheelDelay = 150,
+      clickDistance2 = 0;
+
+  function zoom(selection) {
+    selection
+        .property("__zoom", defaultTransform)
+        .on("wheel.zoom", wheeled)
+        .on("mousedown.zoom", mousedowned)
+        .on("dblclick.zoom", dblclicked)
+      .filter(touchable)
+        .on("touchstart.zoom", touchstarted)
+        .on("touchmove.zoom", touchmoved)
+        .on("touchend.zoom touchcancel.zoom", touchended)
+        .style("touch-action", "none")
+        .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
+  }
+
+  zoom.transform = function(collection, transform, point) {
+    var selection = collection.selection ? collection.selection() : collection;
+    selection.property("__zoom", defaultTransform);
+    if (collection !== selection) {
+      schedule(collection, transform, point);
+    } else {
+      selection.interrupt().each(function() {
+        gesture(this, arguments)
+            .start()
+            .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
+            .end();
+      });
+    }
+  };
+
+  zoom.scaleBy = function(selection, k, p) {
+    zoom.scaleTo(selection, function() {
+      var k0 = this.__zoom.k,
+          k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+      return k0 * k1;
+    }, p);
+  };
+
+  zoom.scaleTo = function(selection, k, p) {
+    zoom.transform(selection, function() {
+      var e = extent.apply(this, arguments),
+          t0 = this.__zoom,
+          p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p,
+          p1 = t0.invert(p0),
+          k1 = typeof k === "function" ? k.apply(this, arguments) : k;
+      return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
+    }, p);
+  };
+
+  zoom.translateBy = function(selection, x, y) {
+    zoom.transform(selection, function() {
+      return constrain(this.__zoom.translate(
+        typeof x === "function" ? x.apply(this, arguments) : x,
+        typeof y === "function" ? y.apply(this, arguments) : y
+      ), extent.apply(this, arguments), translateExtent);
+    });
+  };
+
+  zoom.translateTo = function(selection, x, y, p) {
+    zoom.transform(selection, function() {
+      var e = extent.apply(this, arguments),
+          t = this.__zoom,
+          p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p;
+      return constrain(_transform_js__WEBPACK_IMPORTED_MODULE_7__["identity"].translate(p0[0], p0[1]).scale(t.k).translate(
+        typeof x === "function" ? -x.apply(this, arguments) : -x,
+        typeof y === "function" ? -y.apply(this, arguments) : -y
+      ), e, translateExtent);
+    }, p);
+  };
+
+  function scale(transform, k) {
+    k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
+    return k === transform.k ? transform : new _transform_js__WEBPACK_IMPORTED_MODULE_7__["Transform"](k, transform.x, transform.y);
+  }
+
+  function translate(transform, p0, p1) {
+    var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
+    return x === transform.x && y === transform.y ? transform : new _transform_js__WEBPACK_IMPORTED_MODULE_7__["Transform"](transform.k, x, y);
+  }
+
+  function centroid(extent) {
+    return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
+  }
+
+  function schedule(transition, transform, point) {
+    transition
+        .on("start.zoom", function() { gesture(this, arguments).start(); })
+        .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
+        .tween("zoom", function() {
+          var that = this,
+              args = arguments,
+              g = gesture(that, args),
+              e = extent.apply(that, args),
+              p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point,
+              w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
+              a = that.__zoom,
+              b = typeof transform === "function" ? transform.apply(that, args) : transform,
+              i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
+          return function(t) {
+            if (t === 1) t = b; // Avoid rounding error on end.
+            else { var l = i(t), k = w / l[2]; t = new _transform_js__WEBPACK_IMPORTED_MODULE_7__["Transform"](k, p[0] - l[0] * k, p[1] - l[1] * k); }
+            g.zoom(null, t);
+          };
+        });
+  }
+
+  function gesture(that, args, clean) {
+    return (!clean && that.__zooming) || new Gesture(that, args);
+  }
+
+  function Gesture(that, args) {
+    this.that = that;
+    this.args = args;
+    this.active = 0;
+    this.extent = extent.apply(that, args);
+    this.taps = 0;
+  }
+
+  Gesture.prototype = {
+    start: function() {
+      if (++this.active === 1) {
+        this.that.__zooming = this;
+        this.emit("start");
+      }
+      return this;
+    },
+    zoom: function(key, transform) {
+      if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
+      if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
+      if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
+      this.that.__zoom = transform;
+      this.emit("zoom");
+      return this;
+    },
+    end: function() {
+      if (--this.active === 0) {
+        delete this.that.__zooming;
+        this.emit("end");
+      }
+      return this;
+    },
+    emit: function(type) {
+      Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["customEvent"])(new _event_js__WEBPACK_IMPORTED_MODULE_6__["default"](zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
+    }
+  };
+
+  function wheeled() {
+    if (!filter.apply(this, arguments)) return;
+    var g = gesture(this, arguments),
+        t = this.__zoom,
+        k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
+        p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["mouse"])(this);
+
+    // If the mouse is in the same location as before, reuse it.
+    // If there were recent wheel events, reset the wheel idle timeout.
+    if (g.wheel) {
+      if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
+        g.mouse[1] = t.invert(g.mouse[0] = p);
+      }
+      clearTimeout(g.wheel);
+    }
+
+    // If this wheel event won’t trigger a transform change, ignore it.
+    else if (t.k === k) return;
+
+    // Otherwise, capture the mouse point and location at the start.
+    else {
+      g.mouse = [p, t.invert(p)];
+      Object(d3_transition__WEBPACK_IMPORTED_MODULE_4__["interrupt"])(this);
+      g.start();
+    }
+
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_8__["default"])();
+    g.wheel = setTimeout(wheelidled, wheelDelay);
+    g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
+
+    function wheelidled() {
+      g.wheel = null;
+      g.end();
+    }
+  }
+
+  function mousedowned() {
+    if (touchending || !filter.apply(this, arguments)) return;
+    var g = gesture(this, arguments, true),
+        v = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
+        p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["mouse"])(this),
+        x0 = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].clientX,
+        y0 = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].clientY;
+
+    Object(d3_drag__WEBPACK_IMPORTED_MODULE_1__["dragDisable"])(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].view);
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_8__["nopropagation"])();
+    g.mouse = [p, this.__zoom.invert(p)];
+    Object(d3_transition__WEBPACK_IMPORTED_MODULE_4__["interrupt"])(this);
+    g.start();
+
+    function mousemoved() {
+      Object(_noevent_js__WEBPACK_IMPORTED_MODULE_8__["default"])();
+      if (!g.moved) {
+        var dx = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].clientX - x0, dy = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].clientY - y0;
+        g.moved = dx * dx + dy * dy > clickDistance2;
+      }
+      g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["mouse"])(g.that), g.mouse[1]), g.extent, translateExtent));
+    }
+
+    function mouseupped() {
+      v.on("mousemove.zoom mouseup.zoom", null);
+      Object(d3_drag__WEBPACK_IMPORTED_MODULE_1__["dragEnable"])(d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].view, g.moved);
+      Object(_noevent_js__WEBPACK_IMPORTED_MODULE_8__["default"])();
+      g.end();
+    }
+  }
+
+  function dblclicked() {
+    if (!filter.apply(this, arguments)) return;
+    var t0 = this.__zoom,
+        p0 = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["mouse"])(this),
+        p1 = t0.invert(p0),
+        k1 = t0.k * (d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].shiftKey ? 0.5 : 2),
+        t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
+
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_8__["default"])();
+    if (duration > 0) Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(this).transition().duration(duration).call(schedule, t1, p0);
+    else Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(this).call(zoom.transform, t1);
+  }
+
+  function touchstarted() {
+    if (!filter.apply(this, arguments)) return;
+    var touches = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].touches,
+        n = touches.length,
+        g = gesture(this, arguments, d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].changedTouches.length === n),
+        started, i, t, p;
+
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_8__["nopropagation"])();
+    for (i = 0; i < n; ++i) {
+      t = touches[i], p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["touch"])(this, touches, t.identifier);
+      p = [p, this.__zoom.invert(p), t.identifier];
+      if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting;
+      else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0;
+    }
+
+    if (touchstarting) touchstarting = clearTimeout(touchstarting);
+
+    if (started) {
+      if (g.taps < 2) touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
+      Object(d3_transition__WEBPACK_IMPORTED_MODULE_4__["interrupt"])(this);
+      g.start();
+    }
+  }
+
+  function touchmoved() {
+    if (!this.__zooming) return;
+    var g = gesture(this, arguments),
+        touches = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].changedTouches,
+        n = touches.length, i, t, p, l;
+
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_8__["default"])();
+    if (touchstarting) touchstarting = clearTimeout(touchstarting);
+    g.taps = 0;
+    for (i = 0; i < n; ++i) {
+      t = touches[i], p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["touch"])(this, touches, t.identifier);
+      if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
+      else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
+    }
+    t = g.that.__zoom;
+    if (g.touch1) {
+      var p0 = g.touch0[0], l0 = g.touch0[1],
+          p1 = g.touch1[0], l1 = g.touch1[1],
+          dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
+          dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
+      t = scale(t, Math.sqrt(dp / dl));
+      p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
+      l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
+    }
+    else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
+    else return;
+    g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
+  }
+
+  function touchended() {
+    if (!this.__zooming) return;
+    var g = gesture(this, arguments),
+        touches = d3_selection__WEBPACK_IMPORTED_MODULE_3__["event"].changedTouches,
+        n = touches.length, i, t;
+
+    Object(_noevent_js__WEBPACK_IMPORTED_MODULE_8__["nopropagation"])();
+    if (touchending) clearTimeout(touchending);
+    touchending = setTimeout(function() { touchending = null; }, touchDelay);
+    for (i = 0; i < n; ++i) {
+      t = touches[i];
+      if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
+      else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
+    }
+    if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
+    if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
+    else {
+      g.end();
+      // If this was a dbltap, reroute to the (optional) dblclick.zoom handler.
+      if (g.taps === 2) {
+        var p = Object(d3_selection__WEBPACK_IMPORTED_MODULE_3__["select"])(this).on("dblclick.zoom");
+        if (p) p.apply(this, arguments);
+      }
+    }
+  }
+
+  zoom.wheelDelta = function(_) {
+    return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_5__["default"])(+_), zoom) : wheelDelta;
+  };
+
+  zoom.filter = function(_) {
+    return arguments.length ? (filter = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_5__["default"])(!!_), zoom) : filter;
+  };
+
+  zoom.touchable = function(_) {
+    return arguments.length ? (touchable = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_5__["default"])(!!_), zoom) : touchable;
+  };
+
+  zoom.extent = function(_) {
+    return arguments.length ? (extent = typeof _ === "function" ? _ : Object(_constant_js__WEBPACK_IMPORTED_MODULE_5__["default"])([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
+  };
+
+  zoom.scaleExtent = function(_) {
+    return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
+  };
+
+  zoom.translateExtent = function(_) {
+    return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]];
+  };
+
+  zoom.constrain = function(_) {
+    return arguments.length ? (constrain = _, zoom) : constrain;
+  };
+
+  zoom.duration = function(_) {
+    return arguments.length ? (duration = +_, zoom) : duration;
+  };
+
+  zoom.interpolate = function(_) {
+    return arguments.length ? (interpolate = _, zoom) : interpolate;
+  };
+
+  zoom.on = function() {
+    var value = listeners.on.apply(listeners, arguments);
+    return value === listeners ? zoom : value;
+  };
+
+  zoom.clickDistance = function(_) {
+    return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
+  };
+
+  return zoom;
+});
+
+
+/***/ }),
+
+/***/ "./node_modules/d3/dist/package.js":
+/*!*****************************************!*\
+  !*** ./node_modules/d3/dist/package.js ***!
+  \*****************************************/
+/*! exports provided: name, version, description, keywords, homepage, license, author, main, unpkg, jsdelivr, module, repository, files, scripts, devDependencies, dependencies */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "name", function() { return name; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "version", function() { return version; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "description", function() { return description; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keywords", function() { return keywords; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "homepage", function() { return homepage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "license", function() { return license; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "author", function() { return author; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "main", function() { return main; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "unpkg", function() { return unpkg; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "jsdelivr", function() { return jsdelivr; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "module", function() { return module; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repository", function() { return repository; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "files", function() { return files; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scripts", function() { return scripts; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "devDependencies", function() { return devDependencies; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dependencies", function() { return dependencies; });
+var name = "d3";
+var version = "5.15.0";
+var description = "Data-Driven Documents";
+var keywords = ["dom","visualization","svg","animation","canvas"];
+var homepage = "https://d3js.org";
+var license = "BSD-3-Clause";
+var author = {"name":"Mike Bostock","url":"https://bost.ocks.org/mike"};
+var main = "dist/d3.node.js";
+var unpkg = "dist/d3.min.js";
+var jsdelivr = "dist/d3.min.js";
+var module = "index.js";
+var repository = {"type":"git","url":"https://github.com/d3/d3.git"};
+var files = ["dist/**/*.js","index.js"];
+var scripts = {"pretest":"rimraf dist && mkdir dist && json2module package.json > dist/package.js && rollup -c","test":"tape 'test/**/*-test.js'","prepublishOnly":"yarn test","postpublish":"git push && git push --tags && cd ../d3.github.com && git pull && cp ../d3/dist/d3.js d3.v5.js && cp ../d3/dist/d3.min.js d3.v5.min.js && git add d3.v5.js d3.v5.min.js && git commit -m \"d3 ${npm_package_version}\" && git push && cd - && cd ../d3-bower && git pull && cp ../d3/LICENSE ../d3/README.md ../d3/dist/d3.js ../d3/dist/d3.min.js . && git add -- LICENSE README.md d3.js d3.min.js && git commit -m \"${npm_package_version}\" && git tag -am \"${npm_package_version}\" v${npm_package_version} && git push && git push --tags && cd - && zip -j dist/d3.zip -- LICENSE README.md API.md CHANGES.md dist/d3.js dist/d3.min.js"};
+var devDependencies = {"json2module":"0.0","rimraf":"2","rollup":"1","rollup-plugin-ascii":"0.0","rollup-plugin-node-resolve":"3","rollup-plugin-terser":"5","tape":"4"};
+var dependencies = {"d3-array":"1","d3-axis":"1","d3-brush":"1","d3-chord":"1","d3-collection":"1","d3-color":"1","d3-contour":"1","d3-dispatch":"1","d3-drag":"1","d3-dsv":"1","d3-ease":"1","d3-fetch":"1","d3-force":"1","d3-format":"1","d3-geo":"1","d3-hierarchy":"1","d3-interpolate":"1","d3-path":"1","d3-polygon":"1","d3-quadtree":"1","d3-random":"1","d3-scale":"2","d3-scale-chromatic":"1","d3-selection":"1","d3-shape":"1","d3-time":"1","d3-time-format":"2","d3-timer":"1","d3-transition":"1","d3-voronoi":"1","d3-zoom":"1"};
+
+
+/***/ }),
+
+/***/ "./node_modules/d3/index.js":
+/*!**********************************!*\
+  !*** ./node_modules/d3/index.js ***!
+  \**********************************/
+/*! exports provided: version, bisect, bisectRight, bisectLeft, ascending, bisector, cross, descending, deviation, extent, histogram, thresholdFreedmanDiaconis, thresholdScott, thresholdSturges, max, mean, median, merge, min, pairs, permute, quantile, range, scan, shuffle, sum, ticks, tickIncrement, tickStep, transpose, variance, zip, axisTop, axisRight, axisBottom, axisLeft, brush, brushX, brushY, brushSelection, chord, ribbon, nest, set, map, keys, values, entries, color, rgb, hsl, lab, hcl, lch, gray, cubehelix, contours, contourDensity, dispatch, drag, dragDisable, dragEnable, dsvFormat, csvParse, csvParseRows, csvFormat, csvFormatBody, csvFormatRows, csvFormatRow, csvFormatValue, tsvParse, tsvParseRows, tsvFormat, tsvFormatBody, tsvFormatRows, tsvFormatRow, tsvFormatValue, autoType, easeLinear, easeQuad, easeQuadIn, easeQuadOut, easeQuadInOut, easeCubic, easeCubicIn, easeCubicOut, easeCubicInOut, easePoly, easePolyIn, easePolyOut, easePolyInOut, easeSin, easeSinIn, easeSinOut, easeSinInOut, easeExp, easeExpIn, easeExpOut, easeExpInOut, easeCircle, easeCircleIn, easeCircleOut, easeCircleInOut, easeBounce, easeBounceIn, easeBounceOut, easeBounceInOut, easeBack, easeBackIn, easeBackOut, easeBackInOut, easeElastic, easeElasticIn, easeElasticOut, easeElasticInOut, blob, buffer, dsv, csv, tsv, image, json, text, xml, html, svg, forceCenter, forceCollide, forceLink, forceManyBody, forceRadial, forceSimulation, forceX, forceY, formatDefaultLocale, format, formatPrefix, formatLocale, formatSpecifier, FormatSpecifier, precisionFixed, precisionPrefix, precisionRound, geoArea, geoBounds, geoCentroid, geoCircle, geoClipAntimeridian, geoClipCircle, geoClipExtent, geoClipRectangle, geoContains, geoDistance, geoGraticule, geoGraticule10, geoInterpolate, geoLength, geoPath, geoAlbers, geoAlbersUsa, geoAzimuthalEqualArea, geoAzimuthalEqualAreaRaw, geoAzimuthalEquidistant, geoAzimuthalEquidistantRaw, geoConicConformal, geoConicConformalRaw, geoConicEqualArea, geoConicEqualAreaRaw, geoConicEquidistant, geoConicEquidistantRaw, geoEqualEarth, geoEqualEarthRaw, geoEquirectangular, geoEquirectangularRaw, geoGnomonic, geoGnomonicRaw, geoIdentity, geoProjection, geoProjectionMutator, geoMercator, geoMercatorRaw, geoNaturalEarth1, geoNaturalEarth1Raw, geoOrthographic, geoOrthographicRaw, geoStereographic, geoStereographicRaw, geoTransverseMercator, geoTransverseMercatorRaw, geoRotation, geoStream, geoTransform, cluster, hierarchy, pack, packSiblings, packEnclose, partition, stratify, tree, treemap, treemapBinary, treemapDice, treemapSlice, treemapSliceDice, treemapSquarify, treemapResquarify, interpolate, interpolateArray, interpolateBasis, interpolateBasisClosed, interpolateDate, interpolateDiscrete, interpolateHue, interpolateNumber, interpolateNumberArray, interpolateObject, interpolateRound, interpolateString, interpolateTransformCss, interpolateTransformSvg, interpolateZoom, interpolateRgb, interpolateRgbBasis, interpolateRgbBasisClosed, interpolateHsl, interpolateHslLong, interpolateLab, interpolateHcl, interpolateHclLong, interpolateCubehelix, interpolateCubehelixLong, piecewise, quantize, path, polygonArea, polygonCentroid, polygonHull, polygonContains, polygonLength, quadtree, randomUniform, randomNormal, randomLogNormal, randomBates, randomIrwinHall, randomExponential, scaleBand, scalePoint, scaleIdentity, scaleLinear, scaleLog, scaleSymlog, scaleOrdinal, scaleImplicit, scalePow, scaleSqrt, scaleQuantile, scaleQuantize, scaleThreshold, scaleTime, scaleUtc, scaleSequential, scaleSequentialLog, scaleSequentialPow, scaleSequentialSqrt, scaleSequentialSymlog, scaleSequentialQuantile, scaleDiverging, scaleDivergingLog, scaleDivergingPow, scaleDivergingSqrt, scaleDivergingSymlog, tickFormat, schemeCategory10, schemeAccent, schemeDark2, schemePaired, schemePastel1, schemePastel2, schemeSet1, schemeSet2, schemeSet3, schemeTableau10, interpolateBrBG, schemeBrBG, interpolatePRGn, schemePRGn, interpolatePiYG, schemePiYG, interpolatePuOr, schemePuOr, interpolateRdBu, schemeRdBu, interpolateRdGy, schemeRdGy, interpolateRdYlBu, schemeRdYlBu, interpolateRdYlGn, schemeRdYlGn, interpolateSpectral, schemeSpectral, interpolateBuGn, schemeBuGn, interpolateBuPu, schemeBuPu, interpolateGnBu, schemeGnBu, interpolateOrRd, schemeOrRd, interpolatePuBuGn, schemePuBuGn, interpolatePuBu, schemePuBu, interpolatePuRd, schemePuRd, interpolateRdPu, schemeRdPu, interpolateYlGnBu, schemeYlGnBu, interpolateYlGn, schemeYlGn, interpolateYlOrBr, schemeYlOrBr, interpolateYlOrRd, schemeYlOrRd, interpolateBlues, schemeBlues, interpolateGreens, schemeGreens, interpolateGreys, schemeGreys, interpolatePurples, schemePurples, interpolateReds, schemeReds, interpolateOranges, schemeOranges, interpolateCividis, interpolateCubehelixDefault, interpolateRainbow, interpolateWarm, interpolateCool, interpolateSinebow, interpolateTurbo, interpolateViridis, interpolateMagma, interpolateInferno, interpolatePlasma, create, creator, local, matcher, mouse, namespace, namespaces, clientPoint, select, selectAll, selection, selector, selectorAll, style, touch, touches, window, event, customEvent, arc, area, line, pie, areaRadial, radialArea, lineRadial, radialLine, pointRadial, linkHorizontal, linkVertical, linkRadial, symbol, symbols, symbolCircle, symbolCross, symbolDiamond, symbolSquare, symbolStar, symbolTriangle, symbolWye, curveBasisClosed, curveBasisOpen, curveBasis, curveBundle, curveCardinalClosed, curveCardinalOpen, curveCardinal, curveCatmullRomClosed, curveCatmullRomOpen, curveCatmullRom, curveLinearClosed, curveLinear, curveMonotoneX, curveMonotoneY, curveNatural, curveStep, curveStepAfter, curveStepBefore, stack, stackOffsetExpand, stackOffsetDiverging, stackOffsetNone, stackOffsetSilhouette, stackOffsetWiggle, stackOrderAppearance, stackOrderAscending, stackOrderDescending, stackOrderInsideOut, stackOrderNone, stackOrderReverse, timeInterval, timeMillisecond, timeMilliseconds, utcMillisecond, utcMilliseconds, timeSecond, timeSeconds, utcSecond, utcSeconds, timeMinute, timeMinutes, timeHour, timeHours, timeDay, timeDays, timeWeek, timeWeeks, timeSunday, timeSundays, timeMonday, timeMondays, timeTuesday, timeTuesdays, timeWednesday, timeWednesdays, timeThursday, timeThursdays, timeFriday, timeFridays, timeSaturday, timeSaturdays, timeMonth, timeMonths, timeYear, timeYears, utcMinute, utcMinutes, utcHour, utcHours, utcDay, utcDays, utcWeek, utcWeeks, utcSunday, utcSundays, utcMonday, utcMondays, utcTuesday, utcTuesdays, utcWednesday, utcWednesdays, utcThursday, utcThursdays, utcFriday, utcFridays, utcSaturday, utcSaturdays, utcMonth, utcMonths, utcYear, utcYears, timeFormatDefaultLocale, timeFormat, timeParse, utcFormat, utcParse, timeFormatLocale, isoFormat, isoParse, now, timer, timerFlush, timeout, interval, transition, active, interrupt, voronoi, zoom, zoomTransform, zoomIdentity */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _dist_package_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./dist/package.js */ "./node_modules/d3/dist/package.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version", function() { return _dist_package_js__WEBPACK_IMPORTED_MODULE_0__["version"]; });
+
+/* harmony import */ var d3_array__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-array */ "./node_modules/d3-array/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisect", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["bisect"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisectRight", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["bisectRight"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisectLeft", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["bisectLeft"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ascending", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["ascending"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bisector", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["bisector"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cross", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["cross"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "descending", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["descending"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "deviation", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["deviation"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "extent", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["extent"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "histogram", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["histogram"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "thresholdFreedmanDiaconis", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["thresholdFreedmanDiaconis"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "thresholdScott", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["thresholdScott"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "thresholdSturges", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["thresholdSturges"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["max"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mean", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["mean"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "median", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["median"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["merge"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["min"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["pairs"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "permute", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["permute"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "quantile", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["quantile"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["range"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["scan"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shuffle", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["shuffle"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sum", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["sum"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ticks", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["ticks"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tickIncrement", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["tickIncrement"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tickStep", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["tickStep"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transpose", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["transpose"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "variance", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["variance"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return d3_array__WEBPACK_IMPORTED_MODULE_1__["zip"]; });
+
+/* harmony import */ var d3_axis__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-axis */ "./node_modules/d3-axis/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "axisTop", function() { return d3_axis__WEBPACK_IMPORTED_MODULE_2__["axisTop"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "axisRight", function() { return d3_axis__WEBPACK_IMPORTED_MODULE_2__["axisRight"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "axisBottom", function() { return d3_axis__WEBPACK_IMPORTED_MODULE_2__["axisBottom"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "axisLeft", function() { return d3_axis__WEBPACK_IMPORTED_MODULE_2__["axisLeft"]; });
+
+/* harmony import */ var d3_brush__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-brush */ "./node_modules/d3-brush/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "brush", function() { return d3_brush__WEBPACK_IMPORTED_MODULE_3__["brush"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "brushX", function() { return d3_brush__WEBPACK_IMPORTED_MODULE_3__["brushX"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "brushY", function() { return d3_brush__WEBPACK_IMPORTED_MODULE_3__["brushY"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "brushSelection", function() { return d3_brush__WEBPACK_IMPORTED_MODULE_3__["brushSelection"]; });
+
+/* harmony import */ var d3_chord__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! d3-chord */ "./node_modules/d3-chord/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "chord", function() { return d3_chord__WEBPACK_IMPORTED_MODULE_4__["chord"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ribbon", function() { return d3_chord__WEBPACK_IMPORTED_MODULE_4__["ribbon"]; });
+
+/* harmony import */ var d3_collection__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! d3-collection */ "./node_modules/d3-collection/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "nest", function() { return d3_collection__WEBPACK_IMPORTED_MODULE_5__["nest"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "set", function() { return d3_collection__WEBPACK_IMPORTED_MODULE_5__["set"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return d3_collection__WEBPACK_IMPORTED_MODULE_5__["map"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "keys", function() { return d3_collection__WEBPACK_IMPORTED_MODULE_5__["keys"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "values", function() { return d3_collection__WEBPACK_IMPORTED_MODULE_5__["values"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "entries", function() { return d3_collection__WEBPACK_IMPORTED_MODULE_5__["entries"]; });
+
+/* harmony import */ var d3_color__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! d3-color */ "./node_modules/d3-color/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "color", function() { return d3_color__WEBPACK_IMPORTED_MODULE_6__["color"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rgb", function() { return d3_color__WEBPACK_IMPORTED_MODULE_6__["rgb"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hsl", function() { return d3_color__WEBPACK_IMPORTED_MODULE_6__["hsl"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lab", function() { return d3_color__WEBPACK_IMPORTED_MODULE_6__["lab"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hcl", function() { return d3_color__WEBPACK_IMPORTED_MODULE_6__["hcl"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lch", function() { return d3_color__WEBPACK_IMPORTED_MODULE_6__["lch"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "gray", function() { return d3_color__WEBPACK_IMPORTED_MODULE_6__["gray"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cubehelix", function() { return d3_color__WEBPACK_IMPORTED_MODULE_6__["cubehelix"]; });
+
+/* harmony import */ var d3_contour__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! d3-contour */ "./node_modules/d3-contour/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "contours", function() { return d3_contour__WEBPACK_IMPORTED_MODULE_7__["contours"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "contourDensity", function() { return d3_contour__WEBPACK_IMPORTED_MODULE_7__["contourDensity"]; });
+
+/* harmony import */ var d3_dispatch__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! d3-dispatch */ "./node_modules/d3-dispatch/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return d3_dispatch__WEBPACK_IMPORTED_MODULE_8__["dispatch"]; });
+
+/* harmony import */ var d3_drag__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! d3-drag */ "./node_modules/d3-drag/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drag", function() { return d3_drag__WEBPACK_IMPORTED_MODULE_9__["drag"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragDisable", function() { return d3_drag__WEBPACK_IMPORTED_MODULE_9__["dragDisable"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dragEnable", function() { return d3_drag__WEBPACK_IMPORTED_MODULE_9__["dragEnable"]; });
+
+/* harmony import */ var d3_dsv__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! d3-dsv */ "./node_modules/d3-dsv/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dsvFormat", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["dsvFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvParse", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["csvParse"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvParseRows", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["csvParseRows"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormat", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["csvFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormatBody", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["csvFormatBody"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormatRows", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["csvFormatRows"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormatRow", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["csvFormatRow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csvFormatValue", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["csvFormatValue"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvParse", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["tsvParse"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvParseRows", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["tsvParseRows"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormat", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["tsvFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormatBody", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["tsvFormatBody"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormatRows", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["tsvFormatRows"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormatRow", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["tsvFormatRow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsvFormatValue", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["tsvFormatValue"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "autoType", function() { return d3_dsv__WEBPACK_IMPORTED_MODULE_10__["autoType"]; });
+
+/* harmony import */ var d3_ease__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! d3-ease */ "./node_modules/d3-ease/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeLinear", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeLinear"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuad", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeQuad"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuadIn", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeQuadIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuadOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeQuadOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeQuadInOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeQuadInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubic", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeCubic"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubicIn", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeCubicIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubicOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeCubicOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCubicInOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeCubicInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePoly", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easePoly"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePolyIn", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easePolyIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePolyOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easePolyOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easePolyInOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easePolyInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSin", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeSin"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSinIn", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeSinIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSinOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeSinOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeSinInOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeSinInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExp", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeExp"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExpIn", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeExpIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExpOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeExpOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeExpInOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeExpInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircle", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeCircle"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircleIn", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeCircleIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircleOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeCircleOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeCircleInOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeCircleInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounce", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeBounce"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounceIn", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeBounceIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounceOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeBounceOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBounceInOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeBounceInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBack", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeBack"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBackIn", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeBackIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBackOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeBackOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeBackInOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeBackInOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElastic", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeElastic"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElasticIn", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeElasticIn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElasticOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeElasticOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "easeElasticInOut", function() { return d3_ease__WEBPACK_IMPORTED_MODULE_11__["easeElasticInOut"]; });
+
+/* harmony import */ var d3_fetch__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! d3-fetch */ "./node_modules/d3-fetch/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "blob", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["blob"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["buffer"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dsv", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["dsv"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "csv", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["csv"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tsv", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["tsv"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "image", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["image"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "json", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["json"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "text", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["text"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "xml", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["xml"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "html", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["html"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "svg", function() { return d3_fetch__WEBPACK_IMPORTED_MODULE_12__["svg"]; });
+
+/* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceCenter", function() { return d3_force__WEBPACK_IMPORTED_MODULE_13__["forceCenter"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceCollide", function() { return d3_force__WEBPACK_IMPORTED_MODULE_13__["forceCollide"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceLink", function() { return d3_force__WEBPACK_IMPORTED_MODULE_13__["forceLink"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceManyBody", function() { return d3_force__WEBPACK_IMPORTED_MODULE_13__["forceManyBody"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceRadial", function() { return d3_force__WEBPACK_IMPORTED_MODULE_13__["forceRadial"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceSimulation", function() { return d3_force__WEBPACK_IMPORTED_MODULE_13__["forceSimulation"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceX", function() { return d3_force__WEBPACK_IMPORTED_MODULE_13__["forceX"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceY", function() { return d3_force__WEBPACK_IMPORTED_MODULE_13__["forceY"]; });
+
+/* harmony import */ var d3_format__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! d3-format */ "./node_modules/d3-format/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatDefaultLocale", function() { return d3_format__WEBPACK_IMPORTED_MODULE_14__["formatDefaultLocale"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "format", function() { return d3_format__WEBPACK_IMPORTED_MODULE_14__["format"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatPrefix", function() { return d3_format__WEBPACK_IMPORTED_MODULE_14__["formatPrefix"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatLocale", function() { return d3_format__WEBPACK_IMPORTED_MODULE_14__["formatLocale"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "formatSpecifier", function() { return d3_format__WEBPACK_IMPORTED_MODULE_14__["formatSpecifier"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FormatSpecifier", function() { return d3_format__WEBPACK_IMPORTED_MODULE_14__["FormatSpecifier"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "precisionFixed", function() { return d3_format__WEBPACK_IMPORTED_MODULE_14__["precisionFixed"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "precisionPrefix", function() { return d3_format__WEBPACK_IMPORTED_MODULE_14__["precisionPrefix"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "precisionRound", function() { return d3_format__WEBPACK_IMPORTED_MODULE_14__["precisionRound"]; });
+
+/* harmony import */ var d3_geo__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! d3-geo */ "./node_modules/d3-geo/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoArea", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoArea"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoBounds", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoBounds"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoCentroid", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoCentroid"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoCircle", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoCircle"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoClipAntimeridian", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoClipAntimeridian"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoClipCircle", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoClipCircle"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoClipExtent", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoClipExtent"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoClipRectangle", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoClipRectangle"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoContains", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoContains"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoDistance", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoDistance"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoGraticule", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoGraticule"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoGraticule10", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoGraticule10"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoInterpolate", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoInterpolate"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoLength", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoLength"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoPath", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoPath"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAlbers", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoAlbers"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAlbersUsa", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoAlbersUsa"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAzimuthalEqualArea", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoAzimuthalEqualArea"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAzimuthalEqualAreaRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoAzimuthalEqualAreaRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAzimuthalEquidistant", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoAzimuthalEquidistant"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoAzimuthalEquidistantRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoAzimuthalEquidistantRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicConformal", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoConicConformal"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicConformalRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoConicConformalRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicEqualArea", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoConicEqualArea"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicEqualAreaRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoConicEqualAreaRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicEquidistant", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoConicEquidistant"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoConicEquidistantRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoConicEquidistantRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoEqualEarth", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoEqualEarth"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoEqualEarthRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoEqualEarthRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoEquirectangular", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoEquirectangular"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoEquirectangularRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoEquirectangularRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoGnomonic", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoGnomonic"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoGnomonicRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoGnomonicRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoIdentity", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoIdentity"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoProjection", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoProjection"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoProjectionMutator", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoProjectionMutator"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoMercator", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoMercator"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoMercatorRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoMercatorRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoNaturalEarth1", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoNaturalEarth1"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoNaturalEarth1Raw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoNaturalEarth1Raw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoOrthographic", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoOrthographic"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoOrthographicRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoOrthographicRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoStereographic", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoStereographic"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoStereographicRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoStereographicRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoTransverseMercator", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoTransverseMercator"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoTransverseMercatorRaw", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoTransverseMercatorRaw"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoRotation", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoRotation"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoStream", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoStream"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "geoTransform", function() { return d3_geo__WEBPACK_IMPORTED_MODULE_15__["geoTransform"]; });
+
+/* harmony import */ var d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! d3-hierarchy */ "./node_modules/d3-hierarchy/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "cluster", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["cluster"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "hierarchy", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["hierarchy"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pack", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["pack"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "packSiblings", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["packSiblings"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "packEnclose", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["packEnclose"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["partition"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stratify", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["stratify"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tree", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["tree"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemap", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["treemap"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapBinary", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["treemapBinary"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapDice", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["treemapDice"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapSlice", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["treemapSlice"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapSliceDice", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["treemapSliceDice"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapSquarify", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["treemapSquarify"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "treemapResquarify", function() { return d3_hierarchy__WEBPACK_IMPORTED_MODULE_16__["treemapResquarify"]; });
+
+/* harmony import */ var d3_interpolate__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! d3-interpolate */ "./node_modules/d3-interpolate/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolate", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolate"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateArray", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateArray"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBasis", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateBasis"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBasisClosed", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateBasisClosed"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateDate", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateDate"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateDiscrete", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateDiscrete"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHue", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateHue"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateNumber", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateNumber"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateNumberArray", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateNumberArray"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateObject", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateObject"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRound", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateRound"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateString", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateString"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformCss", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateTransformCss"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateTransformSvg", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateTransformSvg"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateZoom", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateZoom"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRgb", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateRgb"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRgbBasis", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateRgbBasis"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRgbBasisClosed", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateRgbBasisClosed"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHsl", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateHsl"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHslLong", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateHslLong"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateLab", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateLab"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHcl", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateHcl"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateHclLong", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateHclLong"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelix", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateCubehelix"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelixLong", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["interpolateCubehelixLong"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "piecewise", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["piecewise"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "quantize", function() { return d3_interpolate__WEBPACK_IMPORTED_MODULE_17__["quantize"]; });
+
+/* harmony import */ var d3_path__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! d3-path */ "./node_modules/d3-path/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "path", function() { return d3_path__WEBPACK_IMPORTED_MODULE_18__["path"]; });
+
+/* harmony import */ var d3_polygon__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! d3-polygon */ "./node_modules/d3-polygon/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonArea", function() { return d3_polygon__WEBPACK_IMPORTED_MODULE_19__["polygonArea"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonCentroid", function() { return d3_polygon__WEBPACK_IMPORTED_MODULE_19__["polygonCentroid"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonHull", function() { return d3_polygon__WEBPACK_IMPORTED_MODULE_19__["polygonHull"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonContains", function() { return d3_polygon__WEBPACK_IMPORTED_MODULE_19__["polygonContains"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "polygonLength", function() { return d3_polygon__WEBPACK_IMPORTED_MODULE_19__["polygonLength"]; });
+
+/* harmony import */ var d3_quadtree__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! d3-quadtree */ "./node_modules/d3-quadtree/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "quadtree", function() { return d3_quadtree__WEBPACK_IMPORTED_MODULE_20__["quadtree"]; });
+
+/* harmony import */ var d3_random__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! d3-random */ "./node_modules/d3-random/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomUniform", function() { return d3_random__WEBPACK_IMPORTED_MODULE_21__["randomUniform"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomNormal", function() { return d3_random__WEBPACK_IMPORTED_MODULE_21__["randomNormal"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomLogNormal", function() { return d3_random__WEBPACK_IMPORTED_MODULE_21__["randomLogNormal"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomBates", function() { return d3_random__WEBPACK_IMPORTED_MODULE_21__["randomBates"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomIrwinHall", function() { return d3_random__WEBPACK_IMPORTED_MODULE_21__["randomIrwinHall"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "randomExponential", function() { return d3_random__WEBPACK_IMPORTED_MODULE_21__["randomExponential"]; });
+
+/* harmony import */ var d3_scale__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! d3-scale */ "./node_modules/d3-scale/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleBand", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleBand"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scalePoint", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scalePoint"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleIdentity", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleIdentity"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleLinear", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleLinear"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleLog", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleLog"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSymlog", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleSymlog"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleOrdinal", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleOrdinal"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleImplicit", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleImplicit"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scalePow", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scalePow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSqrt", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleSqrt"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleQuantile", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleQuantile"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleQuantize", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleQuantize"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleThreshold", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleThreshold"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleTime", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleTime"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleUtc", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleUtc"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequential", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleSequential"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialLog", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleSequentialLog"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialPow", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleSequentialPow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialSqrt", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleSequentialSqrt"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialSymlog", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleSequentialSymlog"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleSequentialQuantile", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleSequentialQuantile"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDiverging", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleDiverging"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDivergingLog", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleDivergingLog"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDivergingPow", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleDivergingPow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDivergingSqrt", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleDivergingSqrt"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scaleDivergingSymlog", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["scaleDivergingSymlog"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tickFormat", function() { return d3_scale__WEBPACK_IMPORTED_MODULE_22__["tickFormat"]; });
+
+/* harmony import */ var d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! d3-scale-chromatic */ "./node_modules/d3-scale-chromatic/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeCategory10", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeCategory10"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeAccent", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeAccent"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeDark2", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeDark2"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePaired", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePaired"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePastel1", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePastel1"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePastel2", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePastel2"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeSet1", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeSet1"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeSet2", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeSet2"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeSet3", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeSet3"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeTableau10", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeTableau10"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBrBG", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateBrBG"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeBrBG", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeBrBG"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePRGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolatePRGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePRGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePRGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePiYG", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolatePiYG"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePiYG", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePiYG"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePuOr", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolatePuOr"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePuOr", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePuOr"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateRdBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeRdBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdGy", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateRdGy"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdGy", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeRdGy"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdYlBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateRdYlBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdYlBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeRdYlBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdYlGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateRdYlGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdYlGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeRdYlGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateSpectral", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateSpectral"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeSpectral", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeSpectral"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBuGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateBuGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeBuGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeBuGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBuPu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateBuPu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeBuPu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeBuPu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateGnBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateGnBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeGnBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeGnBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateOrRd", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateOrRd"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeOrRd", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeOrRd"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePuBuGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolatePuBuGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePuBuGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePuBuGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePuBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolatePuBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePuBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePuBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePuRd", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolatePuRd"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePuRd", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePuRd"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRdPu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateRdPu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeRdPu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeRdPu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateYlGnBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateYlGnBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeYlGnBu", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeYlGnBu"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateYlGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateYlGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeYlGn", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeYlGn"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateYlOrBr", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateYlOrBr"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeYlOrBr", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeYlOrBr"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateYlOrRd", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateYlOrRd"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeYlOrRd", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeYlOrRd"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateBlues", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateBlues"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeBlues", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeBlues"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateGreens", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateGreens"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeGreens", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeGreens"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateGreys", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateGreys"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeGreys", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeGreys"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePurples", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolatePurples"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemePurples", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemePurples"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateReds", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateReds"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeReds", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeReds"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateOranges", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateOranges"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "schemeOranges", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["schemeOranges"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCividis", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateCividis"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCubehelixDefault", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateCubehelixDefault"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateRainbow", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateRainbow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateWarm", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateWarm"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateCool", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateCool"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateSinebow", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateSinebow"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateTurbo", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateTurbo"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateViridis", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateViridis"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateMagma", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateMagma"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolateInferno", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolateInferno"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interpolatePlasma", function() { return d3_scale_chromatic__WEBPACK_IMPORTED_MODULE_23__["interpolatePlasma"]; });
+
+/* harmony import */ var d3_selection__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! d3-selection */ "./node_modules/d3-selection/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "create", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["create"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "creator", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["creator"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "local", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["local"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "matcher", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["matcher"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouse", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["mouse"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "namespace", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["namespace"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "namespaces", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["namespaces"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clientPoint", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["clientPoint"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "select", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["select"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selectAll", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["selectAll"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selection", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["selection"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selector", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["selector"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "selectorAll", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["selectorAll"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "style", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["style"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touch", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["touch"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touches", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["touches"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["window"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "event", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["event"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "customEvent", function() { return d3_selection__WEBPACK_IMPORTED_MODULE_24__["customEvent"]; });
+
+/* harmony import */ var d3_shape__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! d3-shape */ "./node_modules/d3-shape/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "arc", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["arc"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "area", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["area"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "line", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["line"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pie", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["pie"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "areaRadial", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["areaRadial"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "radialArea", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["radialArea"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lineRadial", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["lineRadial"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "radialLine", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["radialLine"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pointRadial", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["pointRadial"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linkHorizontal", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["linkHorizontal"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linkVertical", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["linkVertical"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "linkRadial", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["linkRadial"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbol", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["symbol"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbols", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["symbols"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolCircle", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["symbolCircle"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolCross", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["symbolCross"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolDiamond", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["symbolDiamond"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolSquare", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["symbolSquare"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolStar", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["symbolStar"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolTriangle", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["symbolTriangle"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "symbolWye", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["symbolWye"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBasisClosed", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveBasisClosed"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBasisOpen", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveBasisOpen"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBasis", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveBasis"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveBundle", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveBundle"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCardinalClosed", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveCardinalClosed"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCardinalOpen", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveCardinalOpen"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCardinal", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveCardinal"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCatmullRomClosed", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveCatmullRomClosed"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCatmullRomOpen", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveCatmullRomOpen"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveCatmullRom", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveCatmullRom"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveLinearClosed", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveLinearClosed"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveLinear", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveLinear"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveMonotoneX", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveMonotoneX"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveMonotoneY", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveMonotoneY"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveNatural", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveNatural"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveStep", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveStep"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveStepAfter", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveStepAfter"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "curveStepBefore", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["curveStepBefore"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stack", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stack"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetExpand", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOffsetExpand"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetDiverging", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOffsetDiverging"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetNone", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOffsetNone"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetSilhouette", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOffsetSilhouette"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOffsetWiggle", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOffsetWiggle"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderAppearance", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOrderAppearance"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderAscending", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOrderAscending"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderDescending", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOrderDescending"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderInsideOut", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOrderInsideOut"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderNone", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOrderNone"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackOrderReverse", function() { return d3_shape__WEBPACK_IMPORTED_MODULE_25__["stackOrderReverse"]; });
+
+/* harmony import */ var d3_time__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! d3-time */ "./node_modules/d3-time/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeInterval"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMillisecond", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeMillisecond"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMilliseconds", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeMilliseconds"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMillisecond", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcMillisecond"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMilliseconds", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcMilliseconds"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSecond", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeSecond"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSeconds", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeSeconds"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSecond", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcSecond"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSeconds", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcSeconds"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMinute", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeMinute"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMinutes", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeMinutes"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeHour", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeHour"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeHours", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeHours"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeDay", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeDay"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeDays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeDays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeWeek", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeWeek"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeWeeks", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeWeeks"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSunday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeSunday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSundays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeSundays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMonday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeMonday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMondays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeMondays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeTuesday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeTuesday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeTuesdays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeTuesdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeWednesday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeWednesday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeWednesdays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeWednesdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeThursday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeThursday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeThursdays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeThursdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFriday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeFriday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFridays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeFridays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSaturday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeSaturday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeSaturdays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeSaturdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMonth", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeMonth"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeMonths", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeMonths"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeYear", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeYear"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeYears", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["timeYears"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMinute", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcMinute"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMinutes", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcMinutes"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcHour", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcHour"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcHours", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcHours"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcDay", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcDay"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcDays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcDays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcWeek", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcWeek"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcWeeks", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcWeeks"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSunday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcSunday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSundays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcSundays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMonday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcMonday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMondays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcMondays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcTuesday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcTuesday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcTuesdays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcTuesdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcWednesday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcWednesday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcWednesdays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcWednesdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcThursday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcThursday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcThursdays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcThursdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcFriday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcFriday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcFridays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcFridays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSaturday", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcSaturday"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcSaturdays", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcSaturdays"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMonth", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcMonth"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcMonths", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcMonths"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcYear", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcYear"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcYears", function() { return d3_time__WEBPACK_IMPORTED_MODULE_26__["utcYears"]; });
+
+/* harmony import */ var d3_time_format__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! d3-time-format */ "./node_modules/d3-time-format/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFormatDefaultLocale", function() { return d3_time_format__WEBPACK_IMPORTED_MODULE_27__["timeFormatDefaultLocale"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFormat", function() { return d3_time_format__WEBPACK_IMPORTED_MODULE_27__["timeFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeParse", function() { return d3_time_format__WEBPACK_IMPORTED_MODULE_27__["timeParse"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcFormat", function() { return d3_time_format__WEBPACK_IMPORTED_MODULE_27__["utcFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "utcParse", function() { return d3_time_format__WEBPACK_IMPORTED_MODULE_27__["utcParse"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeFormatLocale", function() { return d3_time_format__WEBPACK_IMPORTED_MODULE_27__["timeFormatLocale"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isoFormat", function() { return d3_time_format__WEBPACK_IMPORTED_MODULE_27__["isoFormat"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isoParse", function() { return d3_time_format__WEBPACK_IMPORTED_MODULE_27__["isoParse"]; });
+
+/* harmony import */ var d3_timer__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! d3-timer */ "./node_modules/d3-timer/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "now", function() { return d3_timer__WEBPACK_IMPORTED_MODULE_28__["now"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return d3_timer__WEBPACK_IMPORTED_MODULE_28__["timer"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timerFlush", function() { return d3_timer__WEBPACK_IMPORTED_MODULE_28__["timerFlush"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return d3_timer__WEBPACK_IMPORTED_MODULE_28__["timeout"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return d3_timer__WEBPACK_IMPORTED_MODULE_28__["interval"]; });
+
+/* harmony import */ var d3_transition__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! d3-transition */ "./node_modules/d3-transition/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transition", function() { return d3_transition__WEBPACK_IMPORTED_MODULE_29__["transition"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "active", function() { return d3_transition__WEBPACK_IMPORTED_MODULE_29__["active"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interrupt", function() { return d3_transition__WEBPACK_IMPORTED_MODULE_29__["interrupt"]; });
+
+/* harmony import */ var d3_voronoi__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! d3-voronoi */ "./node_modules/d3-voronoi/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "voronoi", function() { return d3_voronoi__WEBPACK_IMPORTED_MODULE_30__["voronoi"]; });
+
+/* harmony import */ var d3_zoom__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! d3-zoom */ "./node_modules/d3-zoom/src/index.js");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zoom", function() { return d3_zoom__WEBPACK_IMPORTED_MODULE_31__["zoom"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zoomTransform", function() { return d3_zoom__WEBPACK_IMPORTED_MODULE_31__["zoomTransform"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zoomIdentity", function() { return d3_zoom__WEBPACK_IMPORTED_MODULE_31__["zoomIdentity"]; });
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/index.js":
+/*!****************************************!*\
+  !*** ./node_modules/dagre-d3/index.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/**
+ * @license
+ * Copyright (c) 2012-2013 Chris Pettitt
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+module.exports =  {
+  graphlib: __webpack_require__(/*! ./lib/graphlib */ "./node_modules/dagre-d3/lib/graphlib.js"),
+  dagre: __webpack_require__(/*! ./lib/dagre */ "./node_modules/dagre-d3/lib/dagre.js"),
+  intersect: __webpack_require__(/*! ./lib/intersect */ "./node_modules/dagre-d3/lib/intersect/index.js"),
+  render: __webpack_require__(/*! ./lib/render */ "./node_modules/dagre-d3/lib/render.js"),
+  util: __webpack_require__(/*! ./lib/util */ "./node_modules/dagre-d3/lib/util.js"),
+  version: __webpack_require__(/*! ./lib/version */ "./node_modules/dagre-d3/lib/version.js")
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/arrows.js":
+/*!*********************************************!*\
+  !*** ./node_modules/dagre-d3/lib/arrows.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre-d3/lib/util.js");
+
+module.exports = {
+  "default": normal,
+  "normal": normal,
+  "vee": vee,
+  "undirected": undirected
+};
+
+function normal(parent, id, edge, type) {
+  var marker = parent.append("marker")
+    .attr("id", id)
+    .attr("viewBox", "0 0 10 10")
+    .attr("refX", 9)
+    .attr("refY", 5)
+    .attr("markerUnits", "strokeWidth")
+    .attr("markerWidth", 8)
+    .attr("markerHeight", 6)
+    .attr("orient", "auto");
+
+  var path = marker.append("path")
+    .attr("d", "M 0 0 L 10 5 L 0 10 z")
+    .style("stroke-width", 1)
+    .style("stroke-dasharray", "1,0");
+  util.applyStyle(path, edge[type + "Style"]);
+  if (edge[type + "Class"]) {
+    path.attr("class", edge[type + "Class"]);
+  }
+}
+
+function vee(parent, id, edge, type) {
+  var marker = parent.append("marker")
+    .attr("id", id)
+    .attr("viewBox", "0 0 10 10")
+    .attr("refX", 9)
+    .attr("refY", 5)
+    .attr("markerUnits", "strokeWidth")
+    .attr("markerWidth", 8)
+    .attr("markerHeight", 6)
+    .attr("orient", "auto");
+
+  var path = marker.append("path")
+    .attr("d", "M 0 0 L 10 5 L 0 10 L 4 5 z")
+    .style("stroke-width", 1)
+    .style("stroke-dasharray", "1,0");
+  util.applyStyle(path, edge[type + "Style"]);
+  if (edge[type + "Class"]) {
+    path.attr("class", edge[type + "Class"]);
+  }
+}
+
+function undirected(parent, id, edge, type) {
+  var marker = parent.append("marker")
+    .attr("id", id)
+    .attr("viewBox", "0 0 10 10")
+    .attr("refX", 9)
+    .attr("refY", 5)
+    .attr("markerUnits", "strokeWidth")
+    .attr("markerWidth", 8)
+    .attr("markerHeight", 6)
+    .attr("orient", "auto");
+
+  var path = marker.append("path")
+    .attr("d", "M 0 5 L 10 5")
+    .style("stroke-width", 1)
+    .style("stroke-dasharray", "1,0");
+  util.applyStyle(path, edge[type + "Style"]);
+  if (edge[type + "Class"]) {
+    path.attr("class", edge[type + "Class"]);
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/create-clusters.js":
+/*!******************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/create-clusters.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre-d3/lib/util.js");
+var d3 = __webpack_require__(/*! ./d3 */ "./node_modules/dagre-d3/lib/d3.js");
+var addLabel = __webpack_require__(/*! ./label/add-label */ "./node_modules/dagre-d3/lib/label/add-label.js");
+
+module.exports = createClusters;
+
+function createClusters(selection, g) {
+  var clusters = g.nodes().filter(function(v) { return util.isSubgraph(g, v); });
+  var svgClusters = selection.selectAll("g.cluster")
+    .data(clusters, function(v) { return v; });
+
+  svgClusters.selectAll("*").remove();
+  svgClusters.enter().append("g")
+    .attr("class", "cluster")
+    .attr("id",function(v){
+      var node = g.node(v);
+      return node.id;
+    })
+    .style("opacity", 0);
+  
+  svgClusters = selection.selectAll("g.cluster");
+
+  util.applyTransition(svgClusters, g)
+    .style("opacity", 1);
+
+  svgClusters.each(function(v) {
+    var node = g.node(v);
+    var thisGroup = d3.select(this);
+    d3.select(this).append("rect");
+    var labelGroup = thisGroup.append("g").attr("class", "label");
+    addLabel(labelGroup, node, node.clusterLabelPos);
+  });
+
+  svgClusters.selectAll("rect").each(function(c) {
+    var node = g.node(c);
+    var domCluster = d3.select(this);
+    util.applyStyle(domCluster, node.style);
+  });
+
+  var exitSelection;
+
+  if (svgClusters.exit) {
+    exitSelection = svgClusters.exit();
+  } else {
+    exitSelection = svgClusters.selectAll(null); // empty selection
+  }
+
+  util.applyTransition(exitSelection, g)
+    .style("opacity", 0)
+    .remove();
+
+  return svgClusters;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/create-edge-labels.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/create-edge-labels.js ***!
+  \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre-d3/lib/lodash.js");
+var addLabel = __webpack_require__(/*! ./label/add-label */ "./node_modules/dagre-d3/lib/label/add-label.js");
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre-d3/lib/util.js");
+var d3 = __webpack_require__(/*! ./d3 */ "./node_modules/dagre-d3/lib/d3.js");
+
+module.exports = createEdgeLabels;
+
+function createEdgeLabels(selection, g) {
+  var svgEdgeLabels = selection.selectAll("g.edgeLabel")
+    .data(g.edges(), function(e) { return util.edgeToId(e); })
+    .classed("update", true);
+
+  svgEdgeLabels.exit().remove();
+  svgEdgeLabels.enter().append("g")
+    .classed("edgeLabel", true)
+    .style("opacity", 0);
+
+  svgEdgeLabels = selection.selectAll("g.edgeLabel");
+
+  svgEdgeLabels.each(function(e) {
+    var root = d3.select(this);
+    root.select(".label").remove();
+    var edge = g.edge(e);
+    var label = addLabel(root, g.edge(e), 0, 0).classed("label", true);
+    var bbox = label.node().getBBox();
+
+    if (edge.labelId) { label.attr("id", edge.labelId); }
+    if (!_.has(edge, "width")) { edge.width = bbox.width; }
+    if (!_.has(edge, "height")) { edge.height = bbox.height; }
+  });
+
+  var exitSelection;
+
+  if (svgEdgeLabels.exit) {
+    exitSelection = svgEdgeLabels.exit();
+  } else {
+    exitSelection = svgEdgeLabels.selectAll(null); // empty selection
+  }
+
+  util.applyTransition(exitSelection, g)
+    .style("opacity", 0)
+    .remove();
+
+  return svgEdgeLabels;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/create-edge-paths.js":
+/*!********************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/create-edge-paths.js ***!
+  \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre-d3/lib/lodash.js");
+var intersectNode = __webpack_require__(/*! ./intersect/intersect-node */ "./node_modules/dagre-d3/lib/intersect/intersect-node.js");
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre-d3/lib/util.js");
+var d3 = __webpack_require__(/*! ./d3 */ "./node_modules/dagre-d3/lib/d3.js");
+module.exports = createEdgePaths;
+
+function createEdgePaths(selection, g, arrows) {
+  var previousPaths = selection.selectAll("g.edgePath")
+    .data(g.edges(), function(e) { return util.edgeToId(e); })
+    .classed("update", true);
+
+  var newPaths = enter(previousPaths, g);
+  exit(previousPaths, g);
+
+  var svgPaths = previousPaths.merge !== undefined ? previousPaths.merge(newPaths) : previousPaths;
+  util.applyTransition(svgPaths, g)
+    .style("opacity", 1);
+
+  // Save DOM element in the path group, and set ID and class
+  svgPaths.each(function(e) {
+    var domEdge = d3.select(this);
+    var edge = g.edge(e);
+    edge.elem = this;
+
+    if (edge.id) {
+      domEdge.attr("id", edge.id);
+    }
+
+    util.applyClass(domEdge, edge["class"],
+      (domEdge.classed("update") ? "update " : "") + "edgePath");
+  });
+
+  svgPaths.selectAll("path.path")
+    .each(function(e) {
+      var edge = g.edge(e);
+      edge.arrowheadId = _.uniqueId("arrowhead");
+
+      var domEdge = d3.select(this)
+        .attr("marker-end", function() {
+          return "url(" + makeFragmentRef(location.href, edge.arrowheadId) + ")";
+        })
+        .style("fill", "none");
+
+      util.applyTransition(domEdge, g)
+        .attr("d", function(e) { return calcPoints(g, e); });
+
+      util.applyStyle(domEdge, edge.style);
+    });
+
+  svgPaths.selectAll("defs *").remove();
+  svgPaths.selectAll("defs")
+    .each(function(e) {
+      var edge = g.edge(e);
+      var arrowhead = arrows[edge.arrowhead];
+      arrowhead(d3.select(this), edge.arrowheadId, edge, "arrowhead");
+    });
+
+  return svgPaths;
+}
+
+function makeFragmentRef(url, fragmentId) {
+  var baseUrl = url.split("#")[0];
+  return baseUrl + "#" + fragmentId;
+}
+
+function calcPoints(g, e) {
+  var edge = g.edge(e);
+  var tail = g.node(e.v);
+  var head = g.node(e.w);
+  var points = edge.points.slice(1, edge.points.length - 1);
+  points.unshift(intersectNode(tail, points[0]));
+  points.push(intersectNode(head, points[points.length - 1]));
+
+  return createLine(edge, points);
+}
+
+function createLine(edge, points) {
+  var line = (d3.line || d3.svg.line)()
+    .x(function(d) { return d.x; })
+    .y(function(d) { return d.y; });
+  
+  (line.curve || line.interpolate)(edge.curve);
+
+  return line(points);
+}
+
+function getCoords(elem) {
+  var bbox = elem.getBBox();
+  var matrix = elem.ownerSVGElement.getScreenCTM()
+    .inverse()
+    .multiply(elem.getScreenCTM())
+    .translate(bbox.width / 2, bbox.height / 2);
+  return { x: matrix.e, y: matrix.f };
+}
+
+function enter(svgPaths, g) {
+  var svgPathsEnter = svgPaths.enter().append("g")
+    .attr("class", "edgePath")
+    .style("opacity", 0);
+  svgPathsEnter.append("path")
+    .attr("class", "path")
+    .attr("d", function(e) {
+      var edge = g.edge(e);
+      var sourceElem = g.node(e.v).elem;
+      var points = _.range(edge.points.length).map(function() { return getCoords(sourceElem); });
+      return createLine(edge, points);
+    });
+  svgPathsEnter.append("defs");
+  return svgPathsEnter;
+}
+
+function exit(svgPaths, g) {
+  var svgPathExit = svgPaths.exit();
+  util.applyTransition(svgPathExit, g)
+    .style("opacity", 0)
+    .remove();
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/create-nodes.js":
+/*!***************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/create-nodes.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre-d3/lib/lodash.js");
+var addLabel = __webpack_require__(/*! ./label/add-label */ "./node_modules/dagre-d3/lib/label/add-label.js");
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre-d3/lib/util.js");
+var d3 = __webpack_require__(/*! ./d3 */ "./node_modules/dagre-d3/lib/d3.js");
+
+module.exports = createNodes;
+
+function createNodes(selection, g, shapes) {
+  var simpleNodes = g.nodes().filter(function(v) { return !util.isSubgraph(g, v); });
+  var svgNodes = selection.selectAll("g.node")
+    .data(simpleNodes, function(v) { return v; })
+    .classed("update", true);
+
+  svgNodes.exit().remove();
+
+  svgNodes.enter().append("g")
+    .attr("class", "node")
+    .style("opacity", 0);
+
+  svgNodes = selection.selectAll("g.node"); 
+
+  svgNodes.each(function(v) {
+    var node = g.node(v);
+    var thisGroup = d3.select(this);
+    util.applyClass(thisGroup, node["class"],
+      (thisGroup.classed("update") ? "update " : "") + "node");
+
+    thisGroup.select("g.label").remove();
+    var labelGroup = thisGroup.append("g").attr("class", "label");
+    var labelDom = addLabel(labelGroup, node);
+    var shape = shapes[node.shape];
+    var bbox = _.pick(labelDom.node().getBBox(), "width", "height");
+
+    node.elem = this;
+
+    if (node.id) { thisGroup.attr("id", node.id); }
+    if (node.labelId) { labelGroup.attr("id", node.labelId); }
+
+    if (_.has(node, "width")) { bbox.width = node.width; }
+    if (_.has(node, "height")) { bbox.height = node.height; }
+
+    bbox.width += node.paddingLeft + node.paddingRight;
+    bbox.height += node.paddingTop + node.paddingBottom;
+    labelGroup.attr("transform", "translate(" +
+      ((node.paddingLeft - node.paddingRight) / 2) + "," +
+      ((node.paddingTop - node.paddingBottom) / 2) + ")");
+
+    var root = d3.select(this);
+    root.select(".label-container").remove();
+    var shapeSvg = shape(root, bbox, node).classed("label-container", true);
+    util.applyStyle(shapeSvg, node.style);
+
+    var shapeBBox = shapeSvg.node().getBBox();
+    node.width = shapeBBox.width;
+    node.height = shapeBBox.height;
+  });
+
+  var exitSelection;
+
+  if (svgNodes.exit) {
+    exitSelection = svgNodes.exit();
+  } else {
+    exitSelection = svgNodes.selectAll(null); // empty selection
+  }
+
+  util.applyTransition(exitSelection, g)
+    .style("opacity", 0)
+    .remove();
+
+  return svgNodes;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/d3.js":
+/*!*****************************************!*\
+  !*** ./node_modules/dagre-d3/lib/d3.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Stub to get D3 either via NPM or from the global object
+var d3;
+
+if (!d3) {
+  if (true) {
+    try {
+      d3 = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+    }
+    catch (e) {
+      // continue regardless of error
+    }
+  }
+}
+
+if (!d3) {
+  d3 = window.d3;
+}
+
+module.exports = d3;
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/dagre.js":
+/*!********************************************!*\
+  !*** ./node_modules/dagre-d3/lib/dagre.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* global window */
+
+var dagre;
+
+if (true) {
+  try {
+    dagre = __webpack_require__(/*! dagre */ "./node_modules/dagre/index.js");
+  } catch (e) {
+    // continue regardless of error
+  }
+}
+
+if (!dagre) {
+  dagre = window.dagre;
+}
+
+module.exports = dagre;
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/graphlib.js":
+/*!***********************************************!*\
+  !*** ./node_modules/dagre-d3/lib/graphlib.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* global window */
+
+var graphlib;
+
+if (true) {
+  try {
+    graphlib = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+  }
+  catch (e) {
+    // continue regardless of error
+  }
+}
+
+if (!graphlib) {
+  graphlib = window.graphlib;
+}
+
+module.exports = graphlib;
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/intersect/index.js":
+/*!******************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/intersect/index.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = {
+  node: __webpack_require__(/*! ./intersect-node */ "./node_modules/dagre-d3/lib/intersect/intersect-node.js"),
+  circle: __webpack_require__(/*! ./intersect-circle */ "./node_modules/dagre-d3/lib/intersect/intersect-circle.js"),
+  ellipse: __webpack_require__(/*! ./intersect-ellipse */ "./node_modules/dagre-d3/lib/intersect/intersect-ellipse.js"),
+  polygon: __webpack_require__(/*! ./intersect-polygon */ "./node_modules/dagre-d3/lib/intersect/intersect-polygon.js"),
+  rect: __webpack_require__(/*! ./intersect-rect */ "./node_modules/dagre-d3/lib/intersect/intersect-rect.js")
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/intersect/intersect-circle.js":
+/*!*****************************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/intersect/intersect-circle.js ***!
+  \*****************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var intersectEllipse = __webpack_require__(/*! ./intersect-ellipse */ "./node_modules/dagre-d3/lib/intersect/intersect-ellipse.js");
+
+module.exports = intersectCircle;
+
+function intersectCircle(node, rx, point) {
+  return intersectEllipse(node, rx, rx, point);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/intersect/intersect-ellipse.js":
+/*!******************************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/intersect/intersect-ellipse.js ***!
+  \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = intersectEllipse;
+
+function intersectEllipse(node, rx, ry, point) {
+  // Formulae from: http://mathworld.wolfram.com/Ellipse-LineIntersection.html
+
+  var cx = node.x;
+  var cy = node.y;
+
+  var px = cx - point.x;
+  var py = cy - point.y;
+
+  var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px);
+
+  var dx = Math.abs(rx * ry * px / det);
+  if (point.x < cx) {
+    dx = -dx;
+  }
+  var dy = Math.abs(rx * ry * py / det);
+  if (point.y < cy) {
+    dy = -dy;
+  }
+
+  return {x: cx + dx, y: cy + dy};
+}
+
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/intersect/intersect-line.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/intersect/intersect-line.js ***!
+  \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = intersectLine;
+
+/*
+ * Returns the point at which two lines, p and q, intersect or returns
+ * undefined if they do not intersect.
+ */
+function intersectLine(p1, p2, q1, q2) {
+  // Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,
+  // p7 and p473.
+
+  var a1, a2, b1, b2, c1, c2;
+  var r1, r2 , r3, r4;
+  var denom, offset, num;
+  var x, y;
+
+  // Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +
+  // b1 y + c1 = 0.
+  a1 = p2.y - p1.y;
+  b1 = p1.x - p2.x;
+  c1 = (p2.x * p1.y) - (p1.x * p2.y);
+
+  // Compute r3 and r4.
+  r3 = ((a1 * q1.x) + (b1 * q1.y) + c1);
+  r4 = ((a1 * q2.x) + (b1 * q2.y) + c1);
+
+  // Check signs of r3 and r4. If both point 3 and point 4 lie on
+  // same side of line 1, the line segments do not intersect.
+  if ((r3 !== 0) && (r4 !== 0) && sameSign(r3, r4)) {
+    return /*DONT_INTERSECT*/;
+  }
+
+  // Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0
+  a2 = q2.y - q1.y;
+  b2 = q1.x - q2.x;
+  c2 = (q2.x * q1.y) - (q1.x * q2.y);
+
+  // Compute r1 and r2
+  r1 = (a2 * p1.x) + (b2 * p1.y) + c2;
+  r2 = (a2 * p2.x) + (b2 * p2.y) + c2;
+
+  // Check signs of r1 and r2. If both point 1 and point 2 lie
+  // on same side of second line segment, the line segments do
+  // not intersect.
+  if ((r1 !== 0) && (r2 !== 0) && (sameSign(r1, r2))) {
+    return /*DONT_INTERSECT*/;
+  }
+
+  // Line segments intersect: compute intersection point.
+  denom = (a1 * b2) - (a2 * b1);
+  if (denom === 0) {
+    return /*COLLINEAR*/;
+  }
+
+  offset = Math.abs(denom / 2);
+
+  // The denom/2 is to get rounding instead of truncating. It
+  // is added or subtracted to the numerator, depending upon the
+  // sign of the numerator.
+  num = (b1 * c2) - (b2 * c1);
+  x = (num < 0) ? ((num - offset) / denom) : ((num + offset) / denom);
+
+  num = (a2 * c1) - (a1 * c2);
+  y = (num < 0) ? ((num - offset) / denom) : ((num + offset) / denom);
+
+  return { x: x, y: y };
+}
+
+function sameSign(r1, r2) {
+  return r1 * r2 > 0;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/intersect/intersect-node.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/intersect/intersect-node.js ***!
+  \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = intersectNode;
+
+function intersectNode(node, point) {
+  return node.intersect(point);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/intersect/intersect-polygon.js":
+/*!******************************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/intersect/intersect-polygon.js ***!
+  \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* eslint "no-console": off */
+
+var intersectLine = __webpack_require__(/*! ./intersect-line */ "./node_modules/dagre-d3/lib/intersect/intersect-line.js");
+
+module.exports = intersectPolygon;
+
+/*
+ * Returns the point ({x, y}) at which the point argument intersects with the
+ * node argument assuming that it has the shape specified by polygon.
+ */
+function intersectPolygon(node, polyPoints, point) {
+  var x1 = node.x;
+  var y1 = node.y;
+
+  var intersections = [];
+
+  var minX = Number.POSITIVE_INFINITY;
+  var minY = Number.POSITIVE_INFINITY;
+  polyPoints.forEach(function(entry) {
+    minX = Math.min(minX, entry.x);
+    minY = Math.min(minY, entry.y);
+  });
+
+  var left = x1 - node.width / 2 - minX;
+  var top =  y1 - node.height / 2 - minY;
+
+  for (var i = 0; i < polyPoints.length; i++) {
+    var p1 = polyPoints[i];
+    var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];
+    var intersect = intersectLine(node, point,
+      {x: left + p1.x, y: top + p1.y}, {x: left + p2.x, y: top + p2.y});
+    if (intersect) {
+      intersections.push(intersect);
+    }
+  }
+
+  if (!intersections.length) {
+    console.log("NO INTERSECTION FOUND, RETURN NODE CENTER", node);
+    return node;
+  }
+
+  if (intersections.length > 1) {
+    // More intersections, find the one nearest to edge end point
+    intersections.sort(function(p, q) {
+      var pdx = p.x - point.x;
+      var pdy = p.y - point.y;
+      var distp = Math.sqrt(pdx * pdx + pdy * pdy);
+
+      var qdx = q.x - point.x;
+      var qdy = q.y - point.y;
+      var distq = Math.sqrt(qdx * qdx + qdy * qdy);
+
+      return (distp < distq) ? -1 : (distp === distq ? 0 : 1);
+    });
+  }
+  return intersections[0];
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/intersect/intersect-rect.js":
+/*!***************************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/intersect/intersect-rect.js ***!
+  \***************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = intersectRect;
+
+function intersectRect(node, point) {
+  var x = node.x;
+  var y = node.y;
+
+  // Rectangle intersection algorithm from:
+  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes
+  var dx = point.x - x;
+  var dy = point.y - y;
+  var w = node.width / 2;
+  var h = node.height / 2;
+
+  var sx, sy;
+  if (Math.abs(dy) * w > Math.abs(dx) * h) {
+    // Intersection is top or bottom of rect.
+    if (dy < 0) {
+      h = -h;
+    }
+    sx = dy === 0 ? 0 : h * dx / dy;
+    sy = h;
+  } else {
+    // Intersection is left or right of rect.
+    if (dx < 0) {
+      w = -w;
+    }
+    sx = w;
+    sy = dx === 0 ? 0 : w * dy / dx;
+  }
+
+  return {x: x + sx, y: y + sy};
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/label/add-html-label.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/label/add-html-label.js ***!
+  \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var util = __webpack_require__(/*! ../util */ "./node_modules/dagre-d3/lib/util.js");
+
+module.exports = addHtmlLabel;
+
+function addHtmlLabel(root, node) {
+  var fo = root
+    .append("foreignObject")
+    .attr("width", "100000");
+
+  var div = fo
+    .append("xhtml:div");
+  div.attr("xmlns", "http://www.w3.org/1999/xhtml");
+
+  var label = node.label;
+  switch(typeof label) {
+  case "function":
+    div.insert(label);
+    break;
+  case "object":
+    // Currently we assume this is a DOM object.
+    div.insert(function() { return label; });
+    break;
+  default: div.html(label);
+  }
+
+  util.applyStyle(div, node.labelStyle);
+  div.style("display", "inline-block");
+  // Fix for firefox
+  div.style("white-space", "nowrap");
+  var fontsize = div.style.fontsize;    
+  div.style("font-size","x-large");
+  var client = div.node().getBoundingClientRect();
+  div.style("font-size",fontsize);
+  fo
+    .attr("width", client.width)
+    .attr("height", client.height);
+
+  return fo;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/label/add-label.js":
+/*!******************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/label/add-label.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var addTextLabel = __webpack_require__(/*! ./add-text-label */ "./node_modules/dagre-d3/lib/label/add-text-label.js");
+var addHtmlLabel = __webpack_require__(/*! ./add-html-label */ "./node_modules/dagre-d3/lib/label/add-html-label.js");
+var addSVGLabel  = __webpack_require__(/*! ./add-svg-label */ "./node_modules/dagre-d3/lib/label/add-svg-label.js");
+
+module.exports = addLabel;
+
+function addLabel(root, node, location) {
+  var label = node.label;
+  var labelSvg = root.append("g");
+
+  // Allow the label to be a string, a function that returns a DOM element, or
+  // a DOM element itself.
+  if (node.labelType === "svg") {
+    addSVGLabel(labelSvg, node);
+  } else if (typeof label !== "string" || node.labelType === "html") {
+    addHtmlLabel(labelSvg, node);
+  } else {
+    addTextLabel(labelSvg, node);
+  }
+
+  var labelBBox = labelSvg.node().getBBox();
+  var y;
+  switch(location) {
+  case "top":
+    y = (-node.height / 2);
+    break;
+  case "bottom":
+    y = (node.height / 2) - labelBBox.height;
+    break;
+  default:
+    y = (-labelBBox.height / 2);
+  }
+  labelSvg.attr(
+    "transform",
+    "translate(" + (-labelBBox.width / 2) + "," + y + ")");
+
+  return labelSvg;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/label/add-svg-label.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/label/add-svg-label.js ***!
+  \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var util = __webpack_require__(/*! ../util */ "./node_modules/dagre-d3/lib/util.js");
+
+module.exports = addSVGLabel;
+
+function addSVGLabel(root, node) {
+  var domNode = root;
+
+  domNode.node().appendChild(node.label);
+
+  util.applyStyle(domNode, node.labelStyle);
+
+  return domNode;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/label/add-text-label.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/label/add-text-label.js ***!
+  \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var util = __webpack_require__(/*! ../util */ "./node_modules/dagre-d3/lib/util.js");
+
+module.exports = addTextLabel;
+
+/*
+ * Attaches a text label to the specified root. Handles escape sequences.
+ */
+function addTextLabel(root, node) {
+  var domNode = root.append("text");
+
+  var lines = processEscapeSequences(node.label).split("\n");
+  for (var i = 0; i < lines.length; i++) {
+    domNode.append("tspan")
+      .attr("xml:space", "preserve")
+      .attr("dy", "1em")
+      .attr("x", "1")
+      .text(lines[i]);
+  }
+
+  util.applyStyle(domNode, node.labelStyle);
+
+  return domNode;
+}
+
+function processEscapeSequences(text) {
+  var newText = "";
+  var escaped = false;
+  var ch;
+  for (var i = 0; i < text.length; ++i) {
+    ch = text[i];
+    if (escaped) {
+      switch(ch) {
+      case "n": newText += "\n"; break;
+      default: newText += ch;
+      }
+      escaped = false;
+    } else if (ch === "\\") {
+      escaped = true;
+    } else {
+      newText += ch;
+    }
+  }
+  return newText;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/lodash.js":
+/*!*********************************************!*\
+  !*** ./node_modules/dagre-d3/lib/lodash.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* global window */
+
+var lodash;
+
+if (true) {
+  try {
+    lodash = {
+      defaults: __webpack_require__(/*! lodash/defaults */ "./node_modules/lodash/defaults.js"),
+      each: __webpack_require__(/*! lodash/each */ "./node_modules/lodash/each.js"),
+      isFunction: __webpack_require__(/*! lodash/isFunction */ "./node_modules/lodash/isFunction.js"),
+      isPlainObject: __webpack_require__(/*! lodash/isPlainObject */ "./node_modules/lodash/isPlainObject.js"),
+      pick: __webpack_require__(/*! lodash/pick */ "./node_modules/lodash/pick.js"),
+      has: __webpack_require__(/*! lodash/has */ "./node_modules/lodash/has.js"),
+      range: __webpack_require__(/*! lodash/range */ "./node_modules/lodash/range.js"),
+      uniqueId: __webpack_require__(/*! lodash/uniqueId */ "./node_modules/lodash/uniqueId.js")
+    };
+  }
+  catch (e) {
+    // continue regardless of error
+  }
+}
+
+if (!lodash) {
+  lodash = window._;
+}
+
+module.exports = lodash;
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/position-clusters.js":
+/*!********************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/position-clusters.js ***!
+  \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre-d3/lib/util.js");
+var d3 = __webpack_require__(/*! ./d3 */ "./node_modules/dagre-d3/lib/d3.js");
+
+module.exports = positionClusters;
+
+function positionClusters(selection, g) {
+  var created = selection.filter(function() { return !d3.select(this).classed("update"); });
+
+  function translate(v) {
+    var node = g.node(v);
+    return "translate(" + node.x + "," + node.y + ")";
+  }
+
+  created.attr("transform", translate);
+
+  util.applyTransition(selection, g)
+    .style("opacity", 1)
+    .attr("transform", translate);
+
+  util.applyTransition(created.selectAll("rect"), g)
+    .attr("width", function(v) { return g.node(v).width; })
+    .attr("height", function(v) { return g.node(v).height; })
+    .attr("x", function(v) {
+      var node = g.node(v);
+      return -node.width / 2;
+    })
+    .attr("y", function(v) {
+      var node = g.node(v);
+      return -node.height / 2;
+    });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/position-edge-labels.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/position-edge-labels.js ***!
+  \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre-d3/lib/util.js");
+var d3 = __webpack_require__(/*! ./d3 */ "./node_modules/dagre-d3/lib/d3.js");
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre-d3/lib/lodash.js");
+
+module.exports = positionEdgeLabels;
+
+function positionEdgeLabels(selection, g) {
+  var created = selection.filter(function() { return !d3.select(this).classed("update"); });
+
+  function translate(e) {
+    var edge = g.edge(e);
+    return _.has(edge, "x") ? "translate(" + edge.x + "," + edge.y + ")" : "";
+  }
+
+  created.attr("transform", translate);
+
+  util.applyTransition(selection, g)
+    .style("opacity", 1)
+    .attr("transform", translate);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/position-nodes.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/dagre-d3/lib/position-nodes.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre-d3/lib/util.js");
+var d3 = __webpack_require__(/*! ./d3 */ "./node_modules/dagre-d3/lib/d3.js");
+
+module.exports = positionNodes;
+
+function positionNodes(selection, g) {
+  var created = selection.filter(function() { return !d3.select(this).classed("update"); });
+
+  function translate(v) {
+    var node = g.node(v);
+    return "translate(" + node.x + "," + node.y + ")";
+  }
+
+  created.attr("transform", translate);
+
+  util.applyTransition(selection, g)
+    .style("opacity", 1)
+    .attr("transform", translate);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/render.js":
+/*!*********************************************!*\
+  !*** ./node_modules/dagre-d3/lib/render.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre-d3/lib/lodash.js");
+var d3 = __webpack_require__(/*! ./d3 */ "./node_modules/dagre-d3/lib/d3.js");
+var layout = __webpack_require__(/*! ./dagre */ "./node_modules/dagre-d3/lib/dagre.js").layout;
+
+module.exports = render;
+
+// This design is based on http://bost.ocks.org/mike/chart/.
+function render() {
+  var createNodes = __webpack_require__(/*! ./create-nodes */ "./node_modules/dagre-d3/lib/create-nodes.js");
+  var createClusters = __webpack_require__(/*! ./create-clusters */ "./node_modules/dagre-d3/lib/create-clusters.js");
+  var createEdgeLabels = __webpack_require__(/*! ./create-edge-labels */ "./node_modules/dagre-d3/lib/create-edge-labels.js");
+  var createEdgePaths = __webpack_require__(/*! ./create-edge-paths */ "./node_modules/dagre-d3/lib/create-edge-paths.js");
+  var positionNodes = __webpack_require__(/*! ./position-nodes */ "./node_modules/dagre-d3/lib/position-nodes.js");
+  var positionEdgeLabels = __webpack_require__(/*! ./position-edge-labels */ "./node_modules/dagre-d3/lib/position-edge-labels.js");
+  var positionClusters = __webpack_require__(/*! ./position-clusters */ "./node_modules/dagre-d3/lib/position-clusters.js");
+  var shapes = __webpack_require__(/*! ./shapes */ "./node_modules/dagre-d3/lib/shapes.js");
+  var arrows = __webpack_require__(/*! ./arrows */ "./node_modules/dagre-d3/lib/arrows.js");
+
+  var fn = function(svg, g) {
+    preProcessGraph(g);
+
+    var outputGroup = createOrSelectGroup(svg, "output");
+    var clustersGroup = createOrSelectGroup(outputGroup, "clusters");
+    var edgePathsGroup = createOrSelectGroup(outputGroup, "edgePaths");
+    var edgeLabels = createEdgeLabels(createOrSelectGroup(outputGroup, "edgeLabels"), g);
+    var nodes = createNodes(createOrSelectGroup(outputGroup, "nodes"), g, shapes);
+
+    layout(g);
+
+    positionNodes(nodes, g);
+    positionEdgeLabels(edgeLabels, g);
+    createEdgePaths(edgePathsGroup, g, arrows);
+
+    var clusters = createClusters(clustersGroup, g);
+    positionClusters(clusters, g);
+
+    postProcessGraph(g);
+  };
+
+  fn.createNodes = function(value) {
+    if (!arguments.length) return createNodes;
+    createNodes = value;
+    return fn;
+  };
+
+  fn.createClusters = function(value) {
+    if (!arguments.length) return createClusters;
+    createClusters = value;
+    return fn;
+  };
+
+  fn.createEdgeLabels = function(value) {
+    if (!arguments.length) return createEdgeLabels;
+    createEdgeLabels = value;
+    return fn;
+  };
+
+  fn.createEdgePaths = function(value) {
+    if (!arguments.length) return createEdgePaths;
+    createEdgePaths = value;
+    return fn;
+  };
+
+  fn.shapes = function(value) {
+    if (!arguments.length) return shapes;
+    shapes = value;
+    return fn;
+  };
+
+  fn.arrows = function(value) {
+    if (!arguments.length) return arrows;
+    arrows = value;
+    return fn;
+  };
+
+  return fn;
+}
+
+var NODE_DEFAULT_ATTRS = {
+  paddingLeft: 10,
+  paddingRight: 10,
+  paddingTop: 10,
+  paddingBottom: 10,
+  rx: 0,
+  ry: 0,
+  shape: "rect"
+};
+
+var EDGE_DEFAULT_ATTRS = {
+  arrowhead: "normal",
+  curve: d3.curveLinear
+};
+
+function preProcessGraph(g) {
+  g.nodes().forEach(function(v) {
+    var node = g.node(v);
+    if (!_.has(node, "label") && !g.children(v).length) { node.label = v; }
+
+    if (_.has(node, "paddingX")) {
+      _.defaults(node, {
+        paddingLeft: node.paddingX,
+        paddingRight: node.paddingX
+      });
+    }
+
+    if (_.has(node, "paddingY")) {
+      _.defaults(node, {
+        paddingTop: node.paddingY,
+        paddingBottom: node.paddingY
+      });
+    }
+
+    if (_.has(node, "padding")) {
+      _.defaults(node, {
+        paddingLeft: node.padding,
+        paddingRight: node.padding,
+        paddingTop: node.padding,
+        paddingBottom: node.padding
+      });
+    }
+
+    _.defaults(node, NODE_DEFAULT_ATTRS);
+
+    _.each(["paddingLeft", "paddingRight", "paddingTop", "paddingBottom"], function(k) {
+      node[k] = Number(node[k]);
+    });
+
+    // Save dimensions for restore during post-processing
+    if (_.has(node, "width")) { node._prevWidth = node.width; }
+    if (_.has(node, "height")) { node._prevHeight = node.height; }
+  });
+
+  g.edges().forEach(function(e) {
+    var edge = g.edge(e);
+    if (!_.has(edge, "label")) { edge.label = ""; }
+    _.defaults(edge, EDGE_DEFAULT_ATTRS);
+  });
+}
+
+function postProcessGraph(g) {
+  _.each(g.nodes(), function(v) {
+    var node = g.node(v);
+
+    // Restore original dimensions
+    if (_.has(node, "_prevWidth")) {
+      node.width = node._prevWidth;
+    } else {
+      delete node.width;
+    }
+
+    if (_.has(node, "_prevHeight")) {
+      node.height = node._prevHeight;
+    } else {
+      delete node.height;
+    }
+
+    delete node._prevWidth;
+    delete node._prevHeight;
+  });
+}
+
+function createOrSelectGroup(root, name) {
+  var selection = root.select("g." + name);
+  if (selection.empty()) {
+    selection = root.append("g").attr("class", name);
+  }
+  return selection;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/shapes.js":
+/*!*********************************************!*\
+  !*** ./node_modules/dagre-d3/lib/shapes.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var intersectRect = __webpack_require__(/*! ./intersect/intersect-rect */ "./node_modules/dagre-d3/lib/intersect/intersect-rect.js");
+var intersectEllipse = __webpack_require__(/*! ./intersect/intersect-ellipse */ "./node_modules/dagre-d3/lib/intersect/intersect-ellipse.js");
+var intersectCircle = __webpack_require__(/*! ./intersect/intersect-circle */ "./node_modules/dagre-d3/lib/intersect/intersect-circle.js");
+var intersectPolygon = __webpack_require__(/*! ./intersect/intersect-polygon */ "./node_modules/dagre-d3/lib/intersect/intersect-polygon.js");
+
+module.exports = {
+  rect: rect,
+  ellipse: ellipse,
+  circle: circle,
+  diamond: diamond
+};
+
+function rect(parent, bbox, node) {
+  var shapeSvg = parent.insert("rect", ":first-child")
+    .attr("rx", node.rx)
+    .attr("ry", node.ry)
+    .attr("x", -bbox.width / 2)
+    .attr("y", -bbox.height / 2)
+    .attr("width", bbox.width)
+    .attr("height", bbox.height);
+
+  node.intersect = function(point) {
+    return intersectRect(node, point);
+  };
+
+  return shapeSvg;
+}
+
+function ellipse(parent, bbox, node) {
+  var rx = bbox.width / 2;
+  var ry = bbox.height / 2;
+  var shapeSvg = parent.insert("ellipse", ":first-child")
+    .attr("x", -bbox.width / 2)
+    .attr("y", -bbox.height / 2)
+    .attr("rx", rx)
+    .attr("ry", ry);
+
+  node.intersect = function(point) {
+    return intersectEllipse(node, rx, ry, point);
+  };
+
+  return shapeSvg;
+}
+
+function circle(parent, bbox, node) {
+  var r = Math.max(bbox.width, bbox.height) / 2;
+  var shapeSvg = parent.insert("circle", ":first-child")
+    .attr("x", -bbox.width / 2)
+    .attr("y", -bbox.height / 2)
+    .attr("r", r);
+
+  node.intersect = function(point) {
+    return intersectCircle(node, r, point);
+  };
+
+  return shapeSvg;
+}
+
+// Circumscribe an ellipse for the bounding box with a diamond shape. I derived
+// the function to calculate the diamond shape from:
+// http://mathforum.org/kb/message.jspa?messageID=3750236
+function diamond(parent, bbox, node) {
+  var w = (bbox.width * Math.SQRT2) / 2;
+  var h = (bbox.height * Math.SQRT2) / 2;
+  var points = [
+    { x:  0, y: -h },
+    { x: -w, y:  0 },
+    { x:  0, y:  h },
+    { x:  w, y:  0 }
+  ];
+  var shapeSvg = parent.insert("polygon", ":first-child")
+    .attr("points", points.map(function(p) { return p.x + "," + p.y; }).join(" "));
+
+  node.intersect = function(p) {
+    return intersectPolygon(node, points, p);
+  };
+
+  return shapeSvg;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/util.js":
+/*!*******************************************!*\
+  !*** ./node_modules/dagre-d3/lib/util.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre-d3/lib/lodash.js");
+
+// Public utility functions
+module.exports = {
+  isSubgraph: isSubgraph,
+  edgeToId: edgeToId,
+  applyStyle: applyStyle,
+  applyClass: applyClass,
+  applyTransition: applyTransition
+};
+
+/*
+ * Returns true if the specified node in the graph is a subgraph node. A
+ * subgraph node is one that contains other nodes.
+ */
+function isSubgraph(g, v) {
+  return !!g.children(v).length;
+}
+
+function edgeToId(e) {
+  return escapeId(e.v) + ":" + escapeId(e.w) + ":" + escapeId(e.name);
+}
+
+var ID_DELIM = /:/g;
+function escapeId(str) {
+  return str ? String(str).replace(ID_DELIM, "\\:") : "";
+}
+
+function applyStyle(dom, styleFn) {
+  if (styleFn) {
+    dom.attr("style", styleFn);
+  }
+}
+
+function applyClass(dom, classFn, otherClasses) {
+  if (classFn) {
+    dom
+      .attr("class", classFn)
+      .attr("class", otherClasses + " " + dom.attr("class"));
+  }
+}
+
+function applyTransition(selection, g) {
+  var graph = g.graph();
+
+  if (_.isPlainObject(graph)) {
+    var transition = graph.transition;
+    if (_.isFunction(transition)) {
+      return transition(selection);
+    }
+  }
+
+  return selection;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre-d3/lib/version.js":
+/*!**********************************************!*\
+  !*** ./node_modules/dagre-d3/lib/version.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = "0.6.4";
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/index.js":
+/*!*************************************!*\
+  !*** ./node_modules/dagre/index.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/*
+Copyright (c) 2012-2014 Chris Pettitt
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+module.exports = {
+  graphlib: __webpack_require__(/*! ./lib/graphlib */ "./node_modules/dagre/lib/graphlib.js"),
+
+  layout: __webpack_require__(/*! ./lib/layout */ "./node_modules/dagre/lib/layout.js"),
+  debug: __webpack_require__(/*! ./lib/debug */ "./node_modules/dagre/lib/debug.js"),
+  util: {
+    time: __webpack_require__(/*! ./lib/util */ "./node_modules/dagre/lib/util.js").time,
+    notime: __webpack_require__(/*! ./lib/util */ "./node_modules/dagre/lib/util.js").notime
+  },
+  version: __webpack_require__(/*! ./lib/version */ "./node_modules/dagre/lib/version.js")
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/acyclic.js":
+/*!*******************************************!*\
+  !*** ./node_modules/dagre/lib/acyclic.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+var greedyFAS = __webpack_require__(/*! ./greedy-fas */ "./node_modules/dagre/lib/greedy-fas.js");
+
+module.exports = {
+  run: run,
+  undo: undo
+};
+
+function run(g) {
+  var fas = (g.graph().acyclicer === "greedy"
+    ? greedyFAS(g, weightFn(g))
+    : dfsFAS(g));
+  _.forEach(fas, function(e) {
+    var label = g.edge(e);
+    g.removeEdge(e);
+    label.forwardName = e.name;
+    label.reversed = true;
+    g.setEdge(e.w, e.v, label, _.uniqueId("rev"));
+  });
+
+  function weightFn(g) {
+    return function(e) {
+      return g.edge(e).weight;
+    };
+  }
+}
+
+function dfsFAS(g) {
+  var fas = [];
+  var stack = {};
+  var visited = {};
+
+  function dfs(v) {
+    if (_.has(visited, v)) {
+      return;
+    }
+    visited[v] = true;
+    stack[v] = true;
+    _.forEach(g.outEdges(v), function(e) {
+      if (_.has(stack, e.w)) {
+        fas.push(e);
+      } else {
+        dfs(e.w);
+      }
+    });
+    delete stack[v];
+  }
+
+  _.forEach(g.nodes(), dfs);
+  return fas;
+}
+
+function undo(g) {
+  _.forEach(g.edges(), function(e) {
+    var label = g.edge(e);
+    if (label.reversed) {
+      g.removeEdge(e);
+
+      var forwardName = label.forwardName;
+      delete label.reversed;
+      delete label.forwardName;
+      g.setEdge(e.w, e.v, label, forwardName);
+    }
+  });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/add-border-segments.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/dagre/lib/add-border-segments.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js");
+
+module.exports = addBorderSegments;
+
+function addBorderSegments(g) {
+  function dfs(v) {
+    var children = g.children(v);
+    var node = g.node(v);
+    if (children.length) {
+      _.forEach(children, dfs);
+    }
+
+    if (_.has(node, "minRank")) {
+      node.borderLeft = [];
+      node.borderRight = [];
+      for (var rank = node.minRank, maxRank = node.maxRank + 1;
+        rank < maxRank;
+        ++rank) {
+        addBorderNode(g, "borderLeft", "_bl", v, node, rank);
+        addBorderNode(g, "borderRight", "_br", v, node, rank);
+      }
+    }
+  }
+
+  _.forEach(g.children(), dfs);
+}
+
+function addBorderNode(g, prop, prefix, sg, sgNode, rank) {
+  var label = { width: 0, height: 0, rank: rank, borderType: prop };
+  var prev = sgNode[prop][rank - 1];
+  var curr = util.addDummyNode(g, "border", label, prefix);
+  sgNode[prop][rank] = curr;
+  g.setParent(curr, sg);
+  if (prev) {
+    g.setEdge(prev, curr, { weight: 1 });
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/coordinate-system.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/dagre/lib/coordinate-system.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+
+module.exports = {
+  adjust: adjust,
+  undo: undo
+};
+
+function adjust(g) {
+  var rankDir = g.graph().rankdir.toLowerCase();
+  if (rankDir === "lr" || rankDir === "rl") {
+    swapWidthHeight(g);
+  }
+}
+
+function undo(g) {
+  var rankDir = g.graph().rankdir.toLowerCase();
+  if (rankDir === "bt" || rankDir === "rl") {
+    reverseY(g);
+  }
+
+  if (rankDir === "lr" || rankDir === "rl") {
+    swapXY(g);
+    swapWidthHeight(g);
+  }
+}
+
+function swapWidthHeight(g) {
+  _.forEach(g.nodes(), function(v) { swapWidthHeightOne(g.node(v)); });
+  _.forEach(g.edges(), function(e) { swapWidthHeightOne(g.edge(e)); });
+}
+
+function swapWidthHeightOne(attrs) {
+  var w = attrs.width;
+  attrs.width = attrs.height;
+  attrs.height = w;
+}
+
+function reverseY(g) {
+  _.forEach(g.nodes(), function(v) { reverseYOne(g.node(v)); });
+
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    _.forEach(edge.points, reverseYOne);
+    if (_.has(edge, "y")) {
+      reverseYOne(edge);
+    }
+  });
+}
+
+function reverseYOne(attrs) {
+  attrs.y = -attrs.y;
+}
+
+function swapXY(g) {
+  _.forEach(g.nodes(), function(v) { swapXYOne(g.node(v)); });
+
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    _.forEach(edge.points, swapXYOne);
+    if (_.has(edge, "x")) {
+      swapXYOne(edge);
+    }
+  });
+}
+
+function swapXYOne(attrs) {
+  var x = attrs.x;
+  attrs.x = attrs.y;
+  attrs.y = x;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/data/list.js":
+/*!*********************************************!*\
+  !*** ./node_modules/dagre/lib/data/list.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/*
+ * Simple doubly linked list implementation derived from Cormen, et al.,
+ * "Introduction to Algorithms".
+ */
+
+module.exports = List;
+
+function List() {
+  var sentinel = {};
+  sentinel._next = sentinel._prev = sentinel;
+  this._sentinel = sentinel;
+}
+
+List.prototype.dequeue = function() {
+  var sentinel = this._sentinel;
+  var entry = sentinel._prev;
+  if (entry !== sentinel) {
+    unlink(entry);
+    return entry;
+  }
+};
+
+List.prototype.enqueue = function(entry) {
+  var sentinel = this._sentinel;
+  if (entry._prev && entry._next) {
+    unlink(entry);
+  }
+  entry._next = sentinel._next;
+  sentinel._next._prev = entry;
+  sentinel._next = entry;
+  entry._prev = sentinel;
+};
+
+List.prototype.toString = function() {
+  var strs = [];
+  var sentinel = this._sentinel;
+  var curr = sentinel._prev;
+  while (curr !== sentinel) {
+    strs.push(JSON.stringify(curr, filterOutLinks));
+    curr = curr._prev;
+  }
+  return "[" + strs.join(", ") + "]";
+};
+
+function unlink(entry) {
+  entry._prev._next = entry._next;
+  entry._next._prev = entry._prev;
+  delete entry._next;
+  delete entry._prev;
+}
+
+function filterOutLinks(k, v) {
+  if (k !== "_next" && k !== "_prev") {
+    return v;
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/debug.js":
+/*!*****************************************!*\
+  !*** ./node_modules/dagre/lib/debug.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js");
+var Graph = __webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph;
+
+module.exports = {
+  debugOrdering: debugOrdering
+};
+
+/* istanbul ignore next */
+function debugOrdering(g) {
+  var layerMatrix = util.buildLayerMatrix(g);
+
+  var h = new Graph({ compound: true, multigraph: true }).setGraph({});
+
+  _.forEach(g.nodes(), function(v) {
+    h.setNode(v, { label: v });
+    h.setParent(v, "layer" + g.node(v).rank);
+  });
+
+  _.forEach(g.edges(), function(e) {
+    h.setEdge(e.v, e.w, {}, e.name);
+  });
+
+  _.forEach(layerMatrix, function(layer, i) {
+    var layerV = "layer" + i;
+    h.setNode(layerV, { rank: "same" });
+    _.reduce(layer, function(u, v) {
+      h.setEdge(u, v, { style: "invis" });
+      return v;
+    });
+  });
+
+  return h;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/graphlib.js":
+/*!********************************************!*\
+  !*** ./node_modules/dagre/lib/graphlib.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* global window */
+
+var graphlib;
+
+if (true) {
+  try {
+    graphlib = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+  } catch (e) {
+    // continue regardless of error
+  }
+}
+
+if (!graphlib) {
+  graphlib = window.graphlib;
+}
+
+module.exports = graphlib;
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/greedy-fas.js":
+/*!**********************************************!*\
+  !*** ./node_modules/dagre/lib/greedy-fas.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+var Graph = __webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph;
+var List = __webpack_require__(/*! ./data/list */ "./node_modules/dagre/lib/data/list.js");
+
+/*
+ * A greedy heuristic for finding a feedback arc set for a graph. A feedback
+ * arc set is a set of edges that can be removed to make a graph acyclic.
+ * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, "A fast and
+ * effective heuristic for the feedback arc set problem." This implementation
+ * adjusts that from the paper to allow for weighted edges.
+ */
+module.exports = greedyFAS;
+
+var DEFAULT_WEIGHT_FN = _.constant(1);
+
+function greedyFAS(g, weightFn) {
+  if (g.nodeCount() <= 1) {
+    return [];
+  }
+  var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);
+  var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);
+
+  // Expand multi-edges
+  return _.flatten(_.map(results, function(e) {
+    return g.outEdges(e.v, e.w);
+  }), true);
+}
+
+function doGreedyFAS(g, buckets, zeroIdx) {
+  var results = [];
+  var sources = buckets[buckets.length - 1];
+  var sinks = buckets[0];
+
+  var entry;
+  while (g.nodeCount()) {
+    while ((entry = sinks.dequeue()))   { removeNode(g, buckets, zeroIdx, entry); }
+    while ((entry = sources.dequeue())) { removeNode(g, buckets, zeroIdx, entry); }
+    if (g.nodeCount()) {
+      for (var i = buckets.length - 2; i > 0; --i) {
+        entry = buckets[i].dequeue();
+        if (entry) {
+          results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));
+          break;
+        }
+      }
+    }
+  }
+
+  return results;
+}
+
+function removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {
+  var results = collectPredecessors ? [] : undefined;
+
+  _.forEach(g.inEdges(entry.v), function(edge) {
+    var weight = g.edge(edge);
+    var uEntry = g.node(edge.v);
+
+    if (collectPredecessors) {
+      results.push({ v: edge.v, w: edge.w });
+    }
+
+    uEntry.out -= weight;
+    assignBucket(buckets, zeroIdx, uEntry);
+  });
+
+  _.forEach(g.outEdges(entry.v), function(edge) {
+    var weight = g.edge(edge);
+    var w = edge.w;
+    var wEntry = g.node(w);
+    wEntry["in"] -= weight;
+    assignBucket(buckets, zeroIdx, wEntry);
+  });
+
+  g.removeNode(entry.v);
+
+  return results;
+}
+
+function buildState(g, weightFn) {
+  var fasGraph = new Graph();
+  var maxIn = 0;
+  var maxOut = 0;
+
+  _.forEach(g.nodes(), function(v) {
+    fasGraph.setNode(v, { v: v, "in": 0, out: 0 });
+  });
+
+  // Aggregate weights on nodes, but also sum the weights across multi-edges
+  // into a single edge for the fasGraph.
+  _.forEach(g.edges(), function(e) {
+    var prevWeight = fasGraph.edge(e.v, e.w) || 0;
+    var weight = weightFn(e);
+    var edgeWeight = prevWeight + weight;
+    fasGraph.setEdge(e.v, e.w, edgeWeight);
+    maxOut = Math.max(maxOut, fasGraph.node(e.v).out += weight);
+    maxIn  = Math.max(maxIn,  fasGraph.node(e.w)["in"]  += weight);
+  });
+
+  var buckets = _.range(maxOut + maxIn + 3).map(function() { return new List(); });
+  var zeroIdx = maxIn + 1;
+
+  _.forEach(fasGraph.nodes(), function(v) {
+    assignBucket(buckets, zeroIdx, fasGraph.node(v));
+  });
+
+  return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };
+}
+
+function assignBucket(buckets, zeroIdx, entry) {
+  if (!entry.out) {
+    buckets[0].enqueue(entry);
+  } else if (!entry["in"]) {
+    buckets[buckets.length - 1].enqueue(entry);
+  } else {
+    buckets[entry.out - entry["in"] + zeroIdx].enqueue(entry);
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/layout.js":
+/*!******************************************!*\
+  !*** ./node_modules/dagre/lib/layout.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+var acyclic = __webpack_require__(/*! ./acyclic */ "./node_modules/dagre/lib/acyclic.js");
+var normalize = __webpack_require__(/*! ./normalize */ "./node_modules/dagre/lib/normalize.js");
+var rank = __webpack_require__(/*! ./rank */ "./node_modules/dagre/lib/rank/index.js");
+var normalizeRanks = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js").normalizeRanks;
+var parentDummyChains = __webpack_require__(/*! ./parent-dummy-chains */ "./node_modules/dagre/lib/parent-dummy-chains.js");
+var removeEmptyRanks = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js").removeEmptyRanks;
+var nestingGraph = __webpack_require__(/*! ./nesting-graph */ "./node_modules/dagre/lib/nesting-graph.js");
+var addBorderSegments = __webpack_require__(/*! ./add-border-segments */ "./node_modules/dagre/lib/add-border-segments.js");
+var coordinateSystem = __webpack_require__(/*! ./coordinate-system */ "./node_modules/dagre/lib/coordinate-system.js");
+var order = __webpack_require__(/*! ./order */ "./node_modules/dagre/lib/order/index.js");
+var position = __webpack_require__(/*! ./position */ "./node_modules/dagre/lib/position/index.js");
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js");
+var Graph = __webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph;
+
+module.exports = layout;
+
+function layout(g, opts) {
+  var time = opts && opts.debugTiming ? util.time : util.notime;
+  time("layout", function() {
+    var layoutGraph = 
+      time("  buildLayoutGraph", function() { return buildLayoutGraph(g); });
+    time("  runLayout",        function() { runLayout(layoutGraph, time); });
+    time("  updateInputGraph", function() { updateInputGraph(g, layoutGraph); });
+  });
+}
+
+function runLayout(g, time) {
+  time("    makeSpaceForEdgeLabels", function() { makeSpaceForEdgeLabels(g); });
+  time("    removeSelfEdges",        function() { removeSelfEdges(g); });
+  time("    acyclic",                function() { acyclic.run(g); });
+  time("    nestingGraph.run",       function() { nestingGraph.run(g); });
+  time("    rank",                   function() { rank(util.asNonCompoundGraph(g)); });
+  time("    injectEdgeLabelProxies", function() { injectEdgeLabelProxies(g); });
+  time("    removeEmptyRanks",       function() { removeEmptyRanks(g); });
+  time("    nestingGraph.cleanup",   function() { nestingGraph.cleanup(g); });
+  time("    normalizeRanks",         function() { normalizeRanks(g); });
+  time("    assignRankMinMax",       function() { assignRankMinMax(g); });
+  time("    removeEdgeLabelProxies", function() { removeEdgeLabelProxies(g); });
+  time("    normalize.run",          function() { normalize.run(g); });
+  time("    parentDummyChains",      function() { parentDummyChains(g); });
+  time("    addBorderSegments",      function() { addBorderSegments(g); });
+  time("    order",                  function() { order(g); });
+  time("    insertSelfEdges",        function() { insertSelfEdges(g); });
+  time("    adjustCoordinateSystem", function() { coordinateSystem.adjust(g); });
+  time("    position",               function() { position(g); });
+  time("    positionSelfEdges",      function() { positionSelfEdges(g); });
+  time("    removeBorderNodes",      function() { removeBorderNodes(g); });
+  time("    normalize.undo",         function() { normalize.undo(g); });
+  time("    fixupEdgeLabelCoords",   function() { fixupEdgeLabelCoords(g); });
+  time("    undoCoordinateSystem",   function() { coordinateSystem.undo(g); });
+  time("    translateGraph",         function() { translateGraph(g); });
+  time("    assignNodeIntersects",   function() { assignNodeIntersects(g); });
+  time("    reversePoints",          function() { reversePointsForReversedEdges(g); });
+  time("    acyclic.undo",           function() { acyclic.undo(g); });
+}
+
+/*
+ * Copies final layout information from the layout graph back to the input
+ * graph. This process only copies whitelisted attributes from the layout graph
+ * to the input graph, so it serves as a good place to determine what
+ * attributes can influence layout.
+ */
+function updateInputGraph(inputGraph, layoutGraph) {
+  _.forEach(inputGraph.nodes(), function(v) {
+    var inputLabel = inputGraph.node(v);
+    var layoutLabel = layoutGraph.node(v);
+
+    if (inputLabel) {
+      inputLabel.x = layoutLabel.x;
+      inputLabel.y = layoutLabel.y;
+
+      if (layoutGraph.children(v).length) {
+        inputLabel.width = layoutLabel.width;
+        inputLabel.height = layoutLabel.height;
+      }
+    }
+  });
+
+  _.forEach(inputGraph.edges(), function(e) {
+    var inputLabel = inputGraph.edge(e);
+    var layoutLabel = layoutGraph.edge(e);
+
+    inputLabel.points = layoutLabel.points;
+    if (_.has(layoutLabel, "x")) {
+      inputLabel.x = layoutLabel.x;
+      inputLabel.y = layoutLabel.y;
+    }
+  });
+
+  inputGraph.graph().width = layoutGraph.graph().width;
+  inputGraph.graph().height = layoutGraph.graph().height;
+}
+
+var graphNumAttrs = ["nodesep", "edgesep", "ranksep", "marginx", "marginy"];
+var graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: "tb" };
+var graphAttrs = ["acyclicer", "ranker", "rankdir", "align"];
+var nodeNumAttrs = ["width", "height"];
+var nodeDefaults = { width: 0, height: 0 };
+var edgeNumAttrs = ["minlen", "weight", "width", "height", "labeloffset"];
+var edgeDefaults = {
+  minlen: 1, weight: 1, width: 0, height: 0,
+  labeloffset: 10, labelpos: "r"
+};
+var edgeAttrs = ["labelpos"];
+
+/*
+ * Constructs a new graph from the input graph, which can be used for layout.
+ * This process copies only whitelisted attributes from the input graph to the
+ * layout graph. Thus this function serves as a good place to determine what
+ * attributes can influence layout.
+ */
+function buildLayoutGraph(inputGraph) {
+  var g = new Graph({ multigraph: true, compound: true });
+  var graph = canonicalize(inputGraph.graph());
+
+  g.setGraph(_.merge({},
+    graphDefaults,
+    selectNumberAttrs(graph, graphNumAttrs),
+    _.pick(graph, graphAttrs)));
+
+  _.forEach(inputGraph.nodes(), function(v) {
+    var node = canonicalize(inputGraph.node(v));
+    g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));
+    g.setParent(v, inputGraph.parent(v));
+  });
+
+  _.forEach(inputGraph.edges(), function(e) {
+    var edge = canonicalize(inputGraph.edge(e));
+    g.setEdge(e, _.merge({},
+      edgeDefaults,
+      selectNumberAttrs(edge, edgeNumAttrs),
+      _.pick(edge, edgeAttrs)));
+  });
+
+  return g;
+}
+
+/*
+ * This idea comes from the Gansner paper: to account for edge labels in our
+ * layout we split each rank in half by doubling minlen and halving ranksep.
+ * Then we can place labels at these mid-points between nodes.
+ *
+ * We also add some minimal padding to the width to push the label for the edge
+ * away from the edge itself a bit.
+ */
+function makeSpaceForEdgeLabels(g) {
+  var graph = g.graph();
+  graph.ranksep /= 2;
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    edge.minlen *= 2;
+    if (edge.labelpos.toLowerCase() !== "c") {
+      if (graph.rankdir === "TB" || graph.rankdir === "BT") {
+        edge.width += edge.labeloffset;
+      } else {
+        edge.height += edge.labeloffset;
+      }
+    }
+  });
+}
+
+/*
+ * Creates temporary dummy nodes that capture the rank in which each edge's
+ * label is going to, if it has one of non-zero width and height. We do this
+ * so that we can safely remove empty ranks while preserving balance for the
+ * label's position.
+ */
+function injectEdgeLabelProxies(g) {
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    if (edge.width && edge.height) {
+      var v = g.node(e.v);
+      var w = g.node(e.w);
+      var label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };
+      util.addDummyNode(g, "edge-proxy", label, "_ep");
+    }
+  });
+}
+
+function assignRankMinMax(g) {
+  var maxRank = 0;
+  _.forEach(g.nodes(), function(v) {
+    var node = g.node(v);
+    if (node.borderTop) {
+      node.minRank = g.node(node.borderTop).rank;
+      node.maxRank = g.node(node.borderBottom).rank;
+      maxRank = _.max(maxRank, node.maxRank);
+    }
+  });
+  g.graph().maxRank = maxRank;
+}
+
+function removeEdgeLabelProxies(g) {
+  _.forEach(g.nodes(), function(v) {
+    var node = g.node(v);
+    if (node.dummy === "edge-proxy") {
+      g.edge(node.e).labelRank = node.rank;
+      g.removeNode(v);
+    }
+  });
+}
+
+function translateGraph(g) {
+  var minX = Number.POSITIVE_INFINITY;
+  var maxX = 0;
+  var minY = Number.POSITIVE_INFINITY;
+  var maxY = 0;
+  var graphLabel = g.graph();
+  var marginX = graphLabel.marginx || 0;
+  var marginY = graphLabel.marginy || 0;
+
+  function getExtremes(attrs) {
+    var x = attrs.x;
+    var y = attrs.y;
+    var w = attrs.width;
+    var h = attrs.height;
+    minX = Math.min(minX, x - w / 2);
+    maxX = Math.max(maxX, x + w / 2);
+    minY = Math.min(minY, y - h / 2);
+    maxY = Math.max(maxY, y + h / 2);
+  }
+
+  _.forEach(g.nodes(), function(v) { getExtremes(g.node(v)); });
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    if (_.has(edge, "x")) {
+      getExtremes(edge);
+    }
+  });
+
+  minX -= marginX;
+  minY -= marginY;
+
+  _.forEach(g.nodes(), function(v) {
+    var node = g.node(v);
+    node.x -= minX;
+    node.y -= minY;
+  });
+
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    _.forEach(edge.points, function(p) {
+      p.x -= minX;
+      p.y -= minY;
+    });
+    if (_.has(edge, "x")) { edge.x -= minX; }
+    if (_.has(edge, "y")) { edge.y -= minY; }
+  });
+
+  graphLabel.width = maxX - minX + marginX;
+  graphLabel.height = maxY - minY + marginY;
+}
+
+function assignNodeIntersects(g) {
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    var nodeV = g.node(e.v);
+    var nodeW = g.node(e.w);
+    var p1, p2;
+    if (!edge.points) {
+      edge.points = [];
+      p1 = nodeW;
+      p2 = nodeV;
+    } else {
+      p1 = edge.points[0];
+      p2 = edge.points[edge.points.length - 1];
+    }
+    edge.points.unshift(util.intersectRect(nodeV, p1));
+    edge.points.push(util.intersectRect(nodeW, p2));
+  });
+}
+
+function fixupEdgeLabelCoords(g) {
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    if (_.has(edge, "x")) {
+      if (edge.labelpos === "l" || edge.labelpos === "r") {
+        edge.width -= edge.labeloffset;
+      }
+      switch (edge.labelpos) {
+      case "l": edge.x -= edge.width / 2 + edge.labeloffset; break;
+      case "r": edge.x += edge.width / 2 + edge.labeloffset; break;
+      }
+    }
+  });
+}
+
+function reversePointsForReversedEdges(g) {
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    if (edge.reversed) {
+      edge.points.reverse();
+    }
+  });
+}
+
+function removeBorderNodes(g) {
+  _.forEach(g.nodes(), function(v) {
+    if (g.children(v).length) {
+      var node = g.node(v);
+      var t = g.node(node.borderTop);
+      var b = g.node(node.borderBottom);
+      var l = g.node(_.last(node.borderLeft));
+      var r = g.node(_.last(node.borderRight));
+
+      node.width = Math.abs(r.x - l.x);
+      node.height = Math.abs(b.y - t.y);
+      node.x = l.x + node.width / 2;
+      node.y = t.y + node.height / 2;
+    }
+  });
+
+  _.forEach(g.nodes(), function(v) {
+    if (g.node(v).dummy === "border") {
+      g.removeNode(v);
+    }
+  });
+}
+
+function removeSelfEdges(g) {
+  _.forEach(g.edges(), function(e) {
+    if (e.v === e.w) {
+      var node = g.node(e.v);
+      if (!node.selfEdges) {
+        node.selfEdges = [];
+      }
+      node.selfEdges.push({ e: e, label: g.edge(e) });
+      g.removeEdge(e);
+    }
+  });
+}
+
+function insertSelfEdges(g) {
+  var layers = util.buildLayerMatrix(g);
+  _.forEach(layers, function(layer) {
+    var orderShift = 0;
+    _.forEach(layer, function(v, i) {
+      var node = g.node(v);
+      node.order = i + orderShift;
+      _.forEach(node.selfEdges, function(selfEdge) {
+        util.addDummyNode(g, "selfedge", {
+          width: selfEdge.label.width,
+          height: selfEdge.label.height,
+          rank: node.rank,
+          order: i + (++orderShift),
+          e: selfEdge.e,
+          label: selfEdge.label
+        }, "_se");
+      });
+      delete node.selfEdges;
+    });
+  });
+}
+
+function positionSelfEdges(g) {
+  _.forEach(g.nodes(), function(v) {
+    var node = g.node(v);
+    if (node.dummy === "selfedge") {
+      var selfNode = g.node(node.e.v);
+      var x = selfNode.x + selfNode.width / 2;
+      var y = selfNode.y;
+      var dx = node.x - x;
+      var dy = selfNode.height / 2;
+      g.setEdge(node.e, node.label);
+      g.removeNode(v);
+      node.label.points = [
+        { x: x + 2 * dx / 3, y: y - dy },
+        { x: x + 5 * dx / 6, y: y - dy },
+        { x: x +     dx    , y: y },
+        { x: x + 5 * dx / 6, y: y + dy },
+        { x: x + 2 * dx / 3, y: y + dy }
+      ];
+      node.label.x = node.x;
+      node.label.y = node.y;
+    }
+  });
+}
+
+function selectNumberAttrs(obj, attrs) {
+  return _.mapValues(_.pick(obj, attrs), Number);
+}
+
+function canonicalize(attrs) {
+  var newAttrs = {};
+  _.forEach(attrs, function(v, k) {
+    newAttrs[k.toLowerCase()] = v;
+  });
+  return newAttrs;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/lodash.js":
+/*!******************************************!*\
+  !*** ./node_modules/dagre/lib/lodash.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* global window */
+
+var lodash;
+
+if (true) {
+  try {
+    lodash = {
+      cloneDeep: __webpack_require__(/*! lodash/cloneDeep */ "./node_modules/lodash/cloneDeep.js"),
+      constant: __webpack_require__(/*! lodash/constant */ "./node_modules/lodash/constant.js"),
+      defaults: __webpack_require__(/*! lodash/defaults */ "./node_modules/lodash/defaults.js"),
+      each: __webpack_require__(/*! lodash/each */ "./node_modules/lodash/each.js"),
+      filter: __webpack_require__(/*! lodash/filter */ "./node_modules/lodash/filter.js"),
+      find: __webpack_require__(/*! lodash/find */ "./node_modules/lodash/find.js"),
+      flatten: __webpack_require__(/*! lodash/flatten */ "./node_modules/lodash/flatten.js"),
+      forEach: __webpack_require__(/*! lodash/forEach */ "./node_modules/lodash/forEach.js"),
+      forIn: __webpack_require__(/*! lodash/forIn */ "./node_modules/lodash/forIn.js"),
+      has:  __webpack_require__(/*! lodash/has */ "./node_modules/lodash/has.js"),
+      isUndefined: __webpack_require__(/*! lodash/isUndefined */ "./node_modules/lodash/isUndefined.js"),
+      last: __webpack_require__(/*! lodash/last */ "./node_modules/lodash/last.js"),
+      map: __webpack_require__(/*! lodash/map */ "./node_modules/lodash/map.js"),
+      mapValues: __webpack_require__(/*! lodash/mapValues */ "./node_modules/lodash/mapValues.js"),
+      max: __webpack_require__(/*! lodash/max */ "./node_modules/lodash/max.js"),
+      merge: __webpack_require__(/*! lodash/merge */ "./node_modules/lodash/merge.js"),
+      min: __webpack_require__(/*! lodash/min */ "./node_modules/lodash/min.js"),
+      minBy: __webpack_require__(/*! lodash/minBy */ "./node_modules/lodash/minBy.js"),
+      now: __webpack_require__(/*! lodash/now */ "./node_modules/lodash/now.js"),
+      pick: __webpack_require__(/*! lodash/pick */ "./node_modules/lodash/pick.js"),
+      range: __webpack_require__(/*! lodash/range */ "./node_modules/lodash/range.js"),
+      reduce: __webpack_require__(/*! lodash/reduce */ "./node_modules/lodash/reduce.js"),
+      sortBy: __webpack_require__(/*! lodash/sortBy */ "./node_modules/lodash/sortBy.js"),
+      uniqueId: __webpack_require__(/*! lodash/uniqueId */ "./node_modules/lodash/uniqueId.js"),
+      values: __webpack_require__(/*! lodash/values */ "./node_modules/lodash/values.js"),
+      zipObject: __webpack_require__(/*! lodash/zipObject */ "./node_modules/lodash/zipObject.js"),
+    };
+  } catch (e) {
+    // continue regardless of error
+  }
+}
+
+if (!lodash) {
+  lodash = window._;
+}
+
+module.exports = lodash;
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/nesting-graph.js":
+/*!*************************************************!*\
+  !*** ./node_modules/dagre/lib/nesting-graph.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js");
+
+module.exports = {
+  run: run,
+  cleanup: cleanup
+};
+
+/*
+ * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,
+ * adds appropriate edges to ensure that all cluster nodes are placed between
+ * these boundries, and ensures that the graph is connected.
+ *
+ * In addition we ensure, through the use of the minlen property, that nodes
+ * and subgraph border nodes to not end up on the same rank.
+ *
+ * Preconditions:
+ *
+ *    1. Input graph is a DAG
+ *    2. Nodes in the input graph has a minlen attribute
+ *
+ * Postconditions:
+ *
+ *    1. Input graph is connected.
+ *    2. Dummy nodes are added for the tops and bottoms of subgraphs.
+ *    3. The minlen attribute for nodes is adjusted to ensure nodes do not
+ *       get placed on the same rank as subgraph border nodes.
+ *
+ * The nesting graph idea comes from Sander, "Layout of Compound Directed
+ * Graphs."
+ */
+function run(g) {
+  var root = util.addDummyNode(g, "root", {}, "_root");
+  var depths = treeDepths(g);
+  var height = _.max(_.values(depths)) - 1; // Note: depths is an Object not an array
+  var nodeSep = 2 * height + 1;
+
+  g.graph().nestingRoot = root;
+
+  // Multiply minlen by nodeSep to align nodes on non-border ranks.
+  _.forEach(g.edges(), function(e) { g.edge(e).minlen *= nodeSep; });
+
+  // Calculate a weight that is sufficient to keep subgraphs vertically compact
+  var weight = sumWeights(g) + 1;
+
+  // Create border nodes and link them up
+  _.forEach(g.children(), function(child) {
+    dfs(g, root, nodeSep, weight, height, depths, child);
+  });
+
+  // Save the multiplier for node layers for later removal of empty border
+  // layers.
+  g.graph().nodeRankFactor = nodeSep;
+}
+
+function dfs(g, root, nodeSep, weight, height, depths, v) {
+  var children = g.children(v);
+  if (!children.length) {
+    if (v !== root) {
+      g.setEdge(root, v, { weight: 0, minlen: nodeSep });
+    }
+    return;
+  }
+
+  var top = util.addBorderNode(g, "_bt");
+  var bottom = util.addBorderNode(g, "_bb");
+  var label = g.node(v);
+
+  g.setParent(top, v);
+  label.borderTop = top;
+  g.setParent(bottom, v);
+  label.borderBottom = bottom;
+
+  _.forEach(children, function(child) {
+    dfs(g, root, nodeSep, weight, height, depths, child);
+
+    var childNode = g.node(child);
+    var childTop = childNode.borderTop ? childNode.borderTop : child;
+    var childBottom = childNode.borderBottom ? childNode.borderBottom : child;
+    var thisWeight = childNode.borderTop ? weight : 2 * weight;
+    var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;
+
+    g.setEdge(top, childTop, {
+      weight: thisWeight,
+      minlen: minlen,
+      nestingEdge: true
+    });
+
+    g.setEdge(childBottom, bottom, {
+      weight: thisWeight,
+      minlen: minlen,
+      nestingEdge: true
+    });
+  });
+
+  if (!g.parent(v)) {
+    g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });
+  }
+}
+
+function treeDepths(g) {
+  var depths = {};
+  function dfs(v, depth) {
+    var children = g.children(v);
+    if (children && children.length) {
+      _.forEach(children, function(child) {
+        dfs(child, depth + 1);
+      });
+    }
+    depths[v] = depth;
+  }
+  _.forEach(g.children(), function(v) { dfs(v, 1); });
+  return depths;
+}
+
+function sumWeights(g) {
+  return _.reduce(g.edges(), function(acc, e) {
+    return acc + g.edge(e).weight;
+  }, 0);
+}
+
+function cleanup(g) {
+  var graphLabel = g.graph();
+  g.removeNode(graphLabel.nestingRoot);
+  delete graphLabel.nestingRoot;
+  _.forEach(g.edges(), function(e) {
+    var edge = g.edge(e);
+    if (edge.nestingEdge) {
+      g.removeEdge(e);
+    }
+  });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/normalize.js":
+/*!*********************************************!*\
+  !*** ./node_modules/dagre/lib/normalize.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+var util = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/util.js");
+
+module.exports = {
+  run: run,
+  undo: undo
+};
+
+/*
+ * Breaks any long edges in the graph into short segments that span 1 layer
+ * each. This operation is undoable with the denormalize function.
+ *
+ * Pre-conditions:
+ *
+ *    1. The input graph is a DAG.
+ *    2. Each node in the graph has a "rank" property.
+ *
+ * Post-condition:
+ *
+ *    1. All edges in the graph have a length of 1.
+ *    2. Dummy nodes are added where edges have been split into segments.
+ *    3. The graph is augmented with a "dummyChains" attribute which contains
+ *       the first dummy in each chain of dummy nodes produced.
+ */
+function run(g) {
+  g.graph().dummyChains = [];
+  _.forEach(g.edges(), function(edge) { normalizeEdge(g, edge); });
+}
+
+function normalizeEdge(g, e) {
+  var v = e.v;
+  var vRank = g.node(v).rank;
+  var w = e.w;
+  var wRank = g.node(w).rank;
+  var name = e.name;
+  var edgeLabel = g.edge(e);
+  var labelRank = edgeLabel.labelRank;
+
+  if (wRank === vRank + 1) return;
+
+  g.removeEdge(e);
+
+  var dummy, attrs, i;
+  for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {
+    edgeLabel.points = [];
+    attrs = {
+      width: 0, height: 0,
+      edgeLabel: edgeLabel, edgeObj: e,
+      rank: vRank
+    };
+    dummy = util.addDummyNode(g, "edge", attrs, "_d");
+    if (vRank === labelRank) {
+      attrs.width = edgeLabel.width;
+      attrs.height = edgeLabel.height;
+      attrs.dummy = "edge-label";
+      attrs.labelpos = edgeLabel.labelpos;
+    }
+    g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);
+    if (i === 0) {
+      g.graph().dummyChains.push(dummy);
+    }
+    v = dummy;
+  }
+
+  g.setEdge(v, w, { weight: edgeLabel.weight }, name);
+}
+
+function undo(g) {
+  _.forEach(g.graph().dummyChains, function(v) {
+    var node = g.node(v);
+    var origLabel = node.edgeLabel;
+    var w;
+    g.setEdge(node.edgeObj, origLabel);
+    while (node.dummy) {
+      w = g.successors(v)[0];
+      g.removeNode(v);
+      origLabel.points.push({ x: node.x, y: node.y });
+      if (node.dummy === "edge-label") {
+        origLabel.x = node.x;
+        origLabel.y = node.y;
+        origLabel.width = node.width;
+        origLabel.height = node.height;
+      }
+      v = w;
+      node = g.node(v);
+    }
+  });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/order/add-subgraph-constraints.js":
+/*!******************************************************************!*\
+  !*** ./node_modules/dagre/lib/order/add-subgraph-constraints.js ***!
+  \******************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+
+module.exports = addSubgraphConstraints;
+
+function addSubgraphConstraints(g, cg, vs) {
+  var prev = {},
+    rootPrev;
+
+  _.forEach(vs, function(v) {
+    var child = g.parent(v),
+      parent,
+      prevChild;
+    while (child) {
+      parent = g.parent(child);
+      if (parent) {
+        prevChild = prev[parent];
+        prev[parent] = child;
+      } else {
+        prevChild = rootPrev;
+        rootPrev = child;
+      }
+      if (prevChild && prevChild !== child) {
+        cg.setEdge(prevChild, child);
+        return;
+      }
+      child = parent;
+    }
+  });
+
+  /*
+  function dfs(v) {
+    var children = v ? g.children(v) : g.children();
+    if (children.length) {
+      var min = Number.POSITIVE_INFINITY,
+          subgraphs = [];
+      _.each(children, function(child) {
+        var childMin = dfs(child);
+        if (g.children(child).length) {
+          subgraphs.push({ v: child, order: childMin });
+        }
+        min = Math.min(min, childMin);
+      });
+      _.reduce(_.sortBy(subgraphs, "order"), function(prev, curr) {
+        cg.setEdge(prev.v, curr.v);
+        return curr;
+      });
+      return min;
+    }
+    return g.node(v).order;
+  }
+  dfs(undefined);
+  */
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/order/barycenter.js":
+/*!****************************************************!*\
+  !*** ./node_modules/dagre/lib/order/barycenter.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+
+module.exports = barycenter;
+
+function barycenter(g, movable) {
+  return _.map(movable, function(v) {
+    var inV = g.inEdges(v);
+    if (!inV.length) {
+      return { v: v };
+    } else {
+      var result = _.reduce(inV, function(acc, e) {
+        var edge = g.edge(e),
+          nodeU = g.node(e.v);
+        return {
+          sum: acc.sum + (edge.weight * nodeU.order),
+          weight: acc.weight + edge.weight
+        };
+      }, { sum: 0, weight: 0 });
+
+      return {
+        v: v,
+        barycenter: result.sum / result.weight,
+        weight: result.weight
+      };
+    }
+  });
+}
+
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/order/build-layer-graph.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/dagre/lib/order/build-layer-graph.js ***!
+  \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+var Graph = __webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph;
+
+module.exports = buildLayerGraph;
+
+/*
+ * Constructs a graph that can be used to sort a layer of nodes. The graph will
+ * contain all base and subgraph nodes from the request layer in their original
+ * hierarchy and any edges that are incident on these nodes and are of the type
+ * requested by the "relationship" parameter.
+ *
+ * Nodes from the requested rank that do not have parents are assigned a root
+ * node in the output graph, which is set in the root graph attribute. This
+ * makes it easy to walk the hierarchy of movable nodes during ordering.
+ *
+ * Pre-conditions:
+ *
+ *    1. Input graph is a DAG
+ *    2. Base nodes in the input graph have a rank attribute
+ *    3. Subgraph nodes in the input graph has minRank and maxRank attributes
+ *    4. Edges have an assigned weight
+ *
+ * Post-conditions:
+ *
+ *    1. Output graph has all nodes in the movable rank with preserved
+ *       hierarchy.
+ *    2. Root nodes in the movable layer are made children of the node
+ *       indicated by the root attribute of the graph.
+ *    3. Non-movable nodes incident on movable nodes, selected by the
+ *       relationship parameter, are included in the graph (without hierarchy).
+ *    4. Edges incident on movable nodes, selected by the relationship
+ *       parameter, are added to the output graph.
+ *    5. The weights for copied edges are aggregated as need, since the output
+ *       graph is not a multi-graph.
+ */
+function buildLayerGraph(g, rank, relationship) {
+  var root = createRootNode(g),
+    result = new Graph({ compound: true }).setGraph({ root: root })
+      .setDefaultNodeLabel(function(v) { return g.node(v); });
+
+  _.forEach(g.nodes(), function(v) {
+    var node = g.node(v),
+      parent = g.parent(v);
+
+    if (node.rank === rank || node.minRank <= rank && rank <= node.maxRank) {
+      result.setNode(v);
+      result.setParent(v, parent || root);
+
+      // This assumes we have only short edges!
+      _.forEach(g[relationship](v), function(e) {
+        var u = e.v === v ? e.w : e.v,
+          edge = result.edge(u, v),
+          weight = !_.isUndefined(edge) ? edge.weight : 0;
+        result.setEdge(u, v, { weight: g.edge(e).weight + weight });
+      });
+
+      if (_.has(node, "minRank")) {
+        result.setNode(v, {
+          borderLeft: node.borderLeft[rank],
+          borderRight: node.borderRight[rank]
+        });
+      }
+    }
+  });
+
+  return result;
+}
+
+function createRootNode(g) {
+  var v;
+  while (g.hasNode((v = _.uniqueId("_root"))));
+  return v;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/order/cross-count.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/dagre/lib/order/cross-count.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+
+module.exports = crossCount;
+
+/*
+ * A function that takes a layering (an array of layers, each with an array of
+ * ordererd nodes) and a graph and returns a weighted crossing count.
+ *
+ * Pre-conditions:
+ *
+ *    1. Input graph must be simple (not a multigraph), directed, and include
+ *       only simple edges.
+ *    2. Edges in the input graph must have assigned weights.
+ *
+ * Post-conditions:
+ *
+ *    1. The graph and layering matrix are left unchanged.
+ *
+ * This algorithm is derived from Barth, et al., "Bilayer Cross Counting."
+ */
+function crossCount(g, layering) {
+  var cc = 0;
+  for (var i = 1; i < layering.length; ++i) {
+    cc += twoLayerCrossCount(g, layering[i-1], layering[i]);
+  }
+  return cc;
+}
+
+function twoLayerCrossCount(g, northLayer, southLayer) {
+  // Sort all of the edges between the north and south layers by their position
+  // in the north layer and then the south. Map these edges to the position of
+  // their head in the south layer.
+  var southPos = _.zipObject(southLayer,
+    _.map(southLayer, function (v, i) { return i; }));
+  var southEntries = _.flatten(_.map(northLayer, function(v) {
+    return _.sortBy(_.map(g.outEdges(v), function(e) {
+      return { pos: southPos[e.w], weight: g.edge(e).weight };
+    }), "pos");
+  }), true);
+
+  // Build the accumulator tree
+  var firstIndex = 1;
+  while (firstIndex < southLayer.length) firstIndex <<= 1;
+  var treeSize = 2 * firstIndex - 1;
+  firstIndex -= 1;
+  var tree = _.map(new Array(treeSize), function() { return 0; });
+
+  // Calculate the weighted crossings
+  var cc = 0;
+  _.forEach(southEntries.forEach(function(entry) {
+    var index = entry.pos + firstIndex;
+    tree[index] += entry.weight;
+    var weightSum = 0;
+    while (index > 0) {
+      if (index % 2) {
+        weightSum += tree[index + 1];
+      }
+      index = (index - 1) >> 1;
+      tree[index] += entry.weight;
+    }
+    cc += entry.weight * weightSum;
+  }));
+
+  return cc;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/order/index.js":
+/*!***********************************************!*\
+  !*** ./node_modules/dagre/lib/order/index.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+var initOrder = __webpack_require__(/*! ./init-order */ "./node_modules/dagre/lib/order/init-order.js");
+var crossCount = __webpack_require__(/*! ./cross-count */ "./node_modules/dagre/lib/order/cross-count.js");
+var sortSubgraph = __webpack_require__(/*! ./sort-subgraph */ "./node_modules/dagre/lib/order/sort-subgraph.js");
+var buildLayerGraph = __webpack_require__(/*! ./build-layer-graph */ "./node_modules/dagre/lib/order/build-layer-graph.js");
+var addSubgraphConstraints = __webpack_require__(/*! ./add-subgraph-constraints */ "./node_modules/dagre/lib/order/add-subgraph-constraints.js");
+var Graph = __webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph;
+var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js");
+
+module.exports = order;
+
+/*
+ * Applies heuristics to minimize edge crossings in the graph and sets the best
+ * order solution as an order attribute on each node.
+ *
+ * Pre-conditions:
+ *
+ *    1. Graph must be DAG
+ *    2. Graph nodes must be objects with a "rank" attribute
+ *    3. Graph edges must have the "weight" attribute
+ *
+ * Post-conditions:
+ *
+ *    1. Graph nodes will have an "order" attribute based on the results of the
+ *       algorithm.
+ */
+function order(g) {
+  var maxRank = util.maxRank(g),
+    downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), "inEdges"),
+    upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), "outEdges");
+
+  var layering = initOrder(g);
+  assignOrder(g, layering);
+
+  var bestCC = Number.POSITIVE_INFINITY,
+    best;
+
+  for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {
+    sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);
+
+    layering = util.buildLayerMatrix(g);
+    var cc = crossCount(g, layering);
+    if (cc < bestCC) {
+      lastBest = 0;
+      best = _.cloneDeep(layering);
+      bestCC = cc;
+    }
+  }
+
+  assignOrder(g, best);
+}
+
+function buildLayerGraphs(g, ranks, relationship) {
+  return _.map(ranks, function(rank) {
+    return buildLayerGraph(g, rank, relationship);
+  });
+}
+
+function sweepLayerGraphs(layerGraphs, biasRight) {
+  var cg = new Graph();
+  _.forEach(layerGraphs, function(lg) {
+    var root = lg.graph().root;
+    var sorted = sortSubgraph(lg, root, cg, biasRight);
+    _.forEach(sorted.vs, function(v, i) {
+      lg.node(v).order = i;
+    });
+    addSubgraphConstraints(lg, cg, sorted.vs);
+  });
+}
+
+function assignOrder(g, layering) {
+  _.forEach(layering, function(layer) {
+    _.forEach(layer, function(v, i) {
+      g.node(v).order = i;
+    });
+  });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/order/init-order.js":
+/*!****************************************************!*\
+  !*** ./node_modules/dagre/lib/order/init-order.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+
+module.exports = initOrder;
+
+/*
+ * Assigns an initial order value for each node by performing a DFS search
+ * starting from nodes in the first rank. Nodes are assigned an order in their
+ * rank as they are first visited.
+ *
+ * This approach comes from Gansner, et al., "A Technique for Drawing Directed
+ * Graphs."
+ *
+ * Returns a layering matrix with an array per layer and each layer sorted by
+ * the order of its nodes.
+ */
+function initOrder(g) {
+  var visited = {};
+  var simpleNodes = _.filter(g.nodes(), function(v) {
+    return !g.children(v).length;
+  });
+  var maxRank = _.max(_.map(simpleNodes, function(v) { return g.node(v).rank; }));
+  var layers = _.map(_.range(maxRank + 1), function() { return []; });
+
+  function dfs(v) {
+    if (_.has(visited, v)) return;
+    visited[v] = true;
+    var node = g.node(v);
+    layers[node.rank].push(v);
+    _.forEach(g.successors(v), dfs);
+  }
+
+  var orderedVs = _.sortBy(simpleNodes, function(v) { return g.node(v).rank; });
+  _.forEach(orderedVs, dfs);
+
+  return layers;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/order/resolve-conflicts.js":
+/*!***********************************************************!*\
+  !*** ./node_modules/dagre/lib/order/resolve-conflicts.js ***!
+  \***********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+
+module.exports = resolveConflicts;
+
+/*
+ * Given a list of entries of the form {v, barycenter, weight} and a
+ * constraint graph this function will resolve any conflicts between the
+ * constraint graph and the barycenters for the entries. If the barycenters for
+ * an entry would violate a constraint in the constraint graph then we coalesce
+ * the nodes in the conflict into a new node that respects the contraint and
+ * aggregates barycenter and weight information.
+ *
+ * This implementation is based on the description in Forster, "A Fast and
+ * Simple Hueristic for Constrained Two-Level Crossing Reduction," thought it
+ * differs in some specific details.
+ *
+ * Pre-conditions:
+ *
+ *    1. Each entry has the form {v, barycenter, weight}, or if the node has
+ *       no barycenter, then {v}.
+ *
+ * Returns:
+ *
+ *    A new list of entries of the form {vs, i, barycenter, weight}. The list
+ *    `vs` may either be a singleton or it may be an aggregation of nodes
+ *    ordered such that they do not violate constraints from the constraint
+ *    graph. The property `i` is the lowest original index of any of the
+ *    elements in `vs`.
+ */
+function resolveConflicts(entries, cg) {
+  var mappedEntries = {};
+  _.forEach(entries, function(entry, i) {
+    var tmp = mappedEntries[entry.v] = {
+      indegree: 0,
+      "in": [],
+      out: [],
+      vs: [entry.v],
+      i: i
+    };
+    if (!_.isUndefined(entry.barycenter)) {
+      tmp.barycenter = entry.barycenter;
+      tmp.weight = entry.weight;
+    }
+  });
+
+  _.forEach(cg.edges(), function(e) {
+    var entryV = mappedEntries[e.v];
+    var entryW = mappedEntries[e.w];
+    if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {
+      entryW.indegree++;
+      entryV.out.push(mappedEntries[e.w]);
+    }
+  });
+
+  var sourceSet = _.filter(mappedEntries, function(entry) {
+    return !entry.indegree;
+  });
+
+  return doResolveConflicts(sourceSet);
+}
+
+function doResolveConflicts(sourceSet) {
+  var entries = [];
+
+  function handleIn(vEntry) {
+    return function(uEntry) {
+      if (uEntry.merged) {
+        return;
+      }
+      if (_.isUndefined(uEntry.barycenter) ||
+          _.isUndefined(vEntry.barycenter) ||
+          uEntry.barycenter >= vEntry.barycenter) {
+        mergeEntries(vEntry, uEntry);
+      }
+    };
+  }
+
+  function handleOut(vEntry) {
+    return function(wEntry) {
+      wEntry["in"].push(vEntry);
+      if (--wEntry.indegree === 0) {
+        sourceSet.push(wEntry);
+      }
+    };
+  }
+
+  while (sourceSet.length) {
+    var entry = sourceSet.pop();
+    entries.push(entry);
+    _.forEach(entry["in"].reverse(), handleIn(entry));
+    _.forEach(entry.out, handleOut(entry));
+  }
+
+  return _.map(_.filter(entries, function(entry) { return !entry.merged; }),
+    function(entry) {
+      return _.pick(entry, ["vs", "i", "barycenter", "weight"]);
+    });
+
+}
+
+function mergeEntries(target, source) {
+  var sum = 0;
+  var weight = 0;
+
+  if (target.weight) {
+    sum += target.barycenter * target.weight;
+    weight += target.weight;
+  }
+
+  if (source.weight) {
+    sum += source.barycenter * source.weight;
+    weight += source.weight;
+  }
+
+  target.vs = source.vs.concat(target.vs);
+  target.barycenter = sum / weight;
+  target.weight = weight;
+  target.i = Math.min(source.i, target.i);
+  source.merged = true;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/order/sort-subgraph.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/dagre/lib/order/sort-subgraph.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+var barycenter = __webpack_require__(/*! ./barycenter */ "./node_modules/dagre/lib/order/barycenter.js");
+var resolveConflicts = __webpack_require__(/*! ./resolve-conflicts */ "./node_modules/dagre/lib/order/resolve-conflicts.js");
+var sort = __webpack_require__(/*! ./sort */ "./node_modules/dagre/lib/order/sort.js");
+
+module.exports = sortSubgraph;
+
+function sortSubgraph(g, v, cg, biasRight) {
+  var movable = g.children(v);
+  var node = g.node(v);
+  var bl = node ? node.borderLeft : undefined;
+  var br = node ? node.borderRight: undefined;
+  var subgraphs = {};
+
+  if (bl) {
+    movable = _.filter(movable, function(w) {
+      return w !== bl && w !== br;
+    });
+  }
+
+  var barycenters = barycenter(g, movable);
+  _.forEach(barycenters, function(entry) {
+    if (g.children(entry.v).length) {
+      var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);
+      subgraphs[entry.v] = subgraphResult;
+      if (_.has(subgraphResult, "barycenter")) {
+        mergeBarycenters(entry, subgraphResult);
+      }
+    }
+  });
+
+  var entries = resolveConflicts(barycenters, cg);
+  expandSubgraphs(entries, subgraphs);
+
+  var result = sort(entries, biasRight);
+
+  if (bl) {
+    result.vs = _.flatten([bl, result.vs, br], true);
+    if (g.predecessors(bl).length) {
+      var blPred = g.node(g.predecessors(bl)[0]),
+        brPred = g.node(g.predecessors(br)[0]);
+      if (!_.has(result, "barycenter")) {
+        result.barycenter = 0;
+        result.weight = 0;
+      }
+      result.barycenter = (result.barycenter * result.weight +
+                           blPred.order + brPred.order) / (result.weight + 2);
+      result.weight += 2;
+    }
+  }
+
+  return result;
+}
+
+function expandSubgraphs(entries, subgraphs) {
+  _.forEach(entries, function(entry) {
+    entry.vs = _.flatten(entry.vs.map(function(v) {
+      if (subgraphs[v]) {
+        return subgraphs[v].vs;
+      }
+      return v;
+    }), true);
+  });
+}
+
+function mergeBarycenters(target, other) {
+  if (!_.isUndefined(target.barycenter)) {
+    target.barycenter = (target.barycenter * target.weight +
+                         other.barycenter * other.weight) /
+                        (target.weight + other.weight);
+    target.weight += other.weight;
+  } else {
+    target.barycenter = other.barycenter;
+    target.weight = other.weight;
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/order/sort.js":
+/*!**********************************************!*\
+  !*** ./node_modules/dagre/lib/order/sort.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js");
+
+module.exports = sort;
+
+function sort(entries, biasRight) {
+  var parts = util.partition(entries, function(entry) {
+    return _.has(entry, "barycenter");
+  });
+  var sortable = parts.lhs,
+    unsortable = _.sortBy(parts.rhs, function(entry) { return -entry.i; }),
+    vs = [],
+    sum = 0,
+    weight = 0,
+    vsIndex = 0;
+
+  sortable.sort(compareWithBias(!!biasRight));
+
+  vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
+
+  _.forEach(sortable, function (entry) {
+    vsIndex += entry.vs.length;
+    vs.push(entry.vs);
+    sum += entry.barycenter * entry.weight;
+    weight += entry.weight;
+    vsIndex = consumeUnsortable(vs, unsortable, vsIndex);
+  });
+
+  var result = { vs: _.flatten(vs, true) };
+  if (weight) {
+    result.barycenter = sum / weight;
+    result.weight = weight;
+  }
+  return result;
+}
+
+function consumeUnsortable(vs, unsortable, index) {
+  var last;
+  while (unsortable.length && (last = _.last(unsortable)).i <= index) {
+    unsortable.pop();
+    vs.push(last.vs);
+    index++;
+  }
+  return index;
+}
+
+function compareWithBias(bias) {
+  return function(entryV, entryW) {
+    if (entryV.barycenter < entryW.barycenter) {
+      return -1;
+    } else if (entryV.barycenter > entryW.barycenter) {
+      return 1;
+    }
+
+    return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;
+  };
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/parent-dummy-chains.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/dagre/lib/parent-dummy-chains.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+
+module.exports = parentDummyChains;
+
+function parentDummyChains(g) {
+  var postorderNums = postorder(g);
+
+  _.forEach(g.graph().dummyChains, function(v) {
+    var node = g.node(v);
+    var edgeObj = node.edgeObj;
+    var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);
+    var path = pathData.path;
+    var lca = pathData.lca;
+    var pathIdx = 0;
+    var pathV = path[pathIdx];
+    var ascending = true;
+
+    while (v !== edgeObj.w) {
+      node = g.node(v);
+
+      if (ascending) {
+        while ((pathV = path[pathIdx]) !== lca &&
+               g.node(pathV).maxRank < node.rank) {
+          pathIdx++;
+        }
+
+        if (pathV === lca) {
+          ascending = false;
+        }
+      }
+
+      if (!ascending) {
+        while (pathIdx < path.length - 1 &&
+               g.node(pathV = path[pathIdx + 1]).minRank <= node.rank) {
+          pathIdx++;
+        }
+        pathV = path[pathIdx];
+      }
+
+      g.setParent(v, pathV);
+      v = g.successors(v)[0];
+    }
+  });
+}
+
+// Find a path from v to w through the lowest common ancestor (LCA). Return the
+// full path and the LCA.
+function findPath(g, postorderNums, v, w) {
+  var vPath = [];
+  var wPath = [];
+  var low = Math.min(postorderNums[v].low, postorderNums[w].low);
+  var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);
+  var parent;
+  var lca;
+
+  // Traverse up from v to find the LCA
+  parent = v;
+  do {
+    parent = g.parent(parent);
+    vPath.push(parent);
+  } while (parent &&
+           (postorderNums[parent].low > low || lim > postorderNums[parent].lim));
+  lca = parent;
+
+  // Traverse from w to LCA
+  parent = w;
+  while ((parent = g.parent(parent)) !== lca) {
+    wPath.push(parent);
+  }
+
+  return { path: vPath.concat(wPath.reverse()), lca: lca };
+}
+
+function postorder(g) {
+  var result = {};
+  var lim = 0;
+
+  function dfs(v) {
+    var low = lim;
+    _.forEach(g.children(v), dfs);
+    result[v] = { low: low, lim: lim++ };
+  }
+  _.forEach(g.children(), dfs);
+
+  return result;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/position/bk.js":
+/*!***********************************************!*\
+  !*** ./node_modules/dagre/lib/position/bk.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+var Graph = __webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph;
+var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js");
+
+/*
+ * This module provides coordinate assignment based on Brandes and Köpf, "Fast
+ * and Simple Horizontal Coordinate Assignment."
+ */
+
+module.exports = {
+  positionX: positionX,
+  findType1Conflicts: findType1Conflicts,
+  findType2Conflicts: findType2Conflicts,
+  addConflict: addConflict,
+  hasConflict: hasConflict,
+  verticalAlignment: verticalAlignment,
+  horizontalCompaction: horizontalCompaction,
+  alignCoordinates: alignCoordinates,
+  findSmallestWidthAlignment: findSmallestWidthAlignment,
+  balance: balance
+};
+
+/*
+ * Marks all edges in the graph with a type-1 conflict with the "type1Conflict"
+ * property. A type-1 conflict is one where a non-inner segment crosses an
+ * inner segment. An inner segment is an edge with both incident nodes marked
+ * with the "dummy" property.
+ *
+ * This algorithm scans layer by layer, starting with the second, for type-1
+ * conflicts between the current layer and the previous layer. For each layer
+ * it scans the nodes from left to right until it reaches one that is incident
+ * on an inner segment. It then scans predecessors to determine if they have
+ * edges that cross that inner segment. At the end a final scan is done for all
+ * nodes on the current rank to see if they cross the last visited inner
+ * segment.
+ *
+ * This algorithm (safely) assumes that a dummy node will only be incident on a
+ * single node in the layers being scanned.
+ */
+function findType1Conflicts(g, layering) {
+  var conflicts = {};
+
+  function visitLayer(prevLayer, layer) {
+    var
+      // last visited node in the previous layer that is incident on an inner
+      // segment.
+      k0 = 0,
+      // Tracks the last node in this layer scanned for crossings with a type-1
+      // segment.
+      scanPos = 0,
+      prevLayerLength = prevLayer.length,
+      lastNode = _.last(layer);
+
+    _.forEach(layer, function(v, i) {
+      var w = findOtherInnerSegmentNode(g, v),
+        k1 = w ? g.node(w).order : prevLayerLength;
+
+      if (w || v === lastNode) {
+        _.forEach(layer.slice(scanPos, i +1), function(scanNode) {
+          _.forEach(g.predecessors(scanNode), function(u) {
+            var uLabel = g.node(u),
+              uPos = uLabel.order;
+            if ((uPos < k0 || k1 < uPos) &&
+                !(uLabel.dummy && g.node(scanNode).dummy)) {
+              addConflict(conflicts, u, scanNode);
+            }
+          });
+        });
+        scanPos = i + 1;
+        k0 = k1;
+      }
+    });
+
+    return layer;
+  }
+
+  _.reduce(layering, visitLayer);
+  return conflicts;
+}
+
+function findType2Conflicts(g, layering) {
+  var conflicts = {};
+
+  function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {
+    var v;
+    _.forEach(_.range(southPos, southEnd), function(i) {
+      v = south[i];
+      if (g.node(v).dummy) {
+        _.forEach(g.predecessors(v), function(u) {
+          var uNode = g.node(u);
+          if (uNode.dummy &&
+              (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {
+            addConflict(conflicts, u, v);
+          }
+        });
+      }
+    });
+  }
+
+
+  function visitLayer(north, south) {
+    var prevNorthPos = -1,
+      nextNorthPos,
+      southPos = 0;
+
+    _.forEach(south, function(v, southLookahead) {
+      if (g.node(v).dummy === "border") {
+        var predecessors = g.predecessors(v);
+        if (predecessors.length) {
+          nextNorthPos = g.node(predecessors[0]).order;
+          scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);
+          southPos = southLookahead;
+          prevNorthPos = nextNorthPos;
+        }
+      }
+      scan(south, southPos, south.length, nextNorthPos, north.length);
+    });
+
+    return south;
+  }
+
+  _.reduce(layering, visitLayer);
+  return conflicts;
+}
+
+function findOtherInnerSegmentNode(g, v) {
+  if (g.node(v).dummy) {
+    return _.find(g.predecessors(v), function(u) {
+      return g.node(u).dummy;
+    });
+  }
+}
+
+function addConflict(conflicts, v, w) {
+  if (v > w) {
+    var tmp = v;
+    v = w;
+    w = tmp;
+  }
+
+  var conflictsV = conflicts[v];
+  if (!conflictsV) {
+    conflicts[v] = conflictsV = {};
+  }
+  conflictsV[w] = true;
+}
+
+function hasConflict(conflicts, v, w) {
+  if (v > w) {
+    var tmp = v;
+    v = w;
+    w = tmp;
+  }
+  return _.has(conflicts[v], w);
+}
+
+/*
+ * Try to align nodes into vertical "blocks" where possible. This algorithm
+ * attempts to align a node with one of its median neighbors. If the edge
+ * connecting a neighbor is a type-1 conflict then we ignore that possibility.
+ * If a previous node has already formed a block with a node after the node
+ * we're trying to form a block with, we also ignore that possibility - our
+ * blocks would be split in that scenario.
+ */
+function verticalAlignment(g, layering, conflicts, neighborFn) {
+  var root = {},
+    align = {},
+    pos = {};
+
+  // We cache the position here based on the layering because the graph and
+  // layering may be out of sync. The layering matrix is manipulated to
+  // generate different extreme alignments.
+  _.forEach(layering, function(layer) {
+    _.forEach(layer, function(v, order) {
+      root[v] = v;
+      align[v] = v;
+      pos[v] = order;
+    });
+  });
+
+  _.forEach(layering, function(layer) {
+    var prevIdx = -1;
+    _.forEach(layer, function(v) {
+      var ws = neighborFn(v);
+      if (ws.length) {
+        ws = _.sortBy(ws, function(w) { return pos[w]; });
+        var mp = (ws.length - 1) / 2;
+        for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {
+          var w = ws[i];
+          if (align[v] === v &&
+              prevIdx < pos[w] &&
+              !hasConflict(conflicts, v, w)) {
+            align[w] = v;
+            align[v] = root[v] = root[w];
+            prevIdx = pos[w];
+          }
+        }
+      }
+    });
+  });
+
+  return { root: root, align: align };
+}
+
+function horizontalCompaction(g, layering, root, align, reverseSep) {
+  // This portion of the algorithm differs from BK due to a number of problems.
+  // Instead of their algorithm we construct a new block graph and do two
+  // sweeps. The first sweep places blocks with the smallest possible
+  // coordinates. The second sweep removes unused space by moving blocks to the
+  // greatest coordinates without violating separation.
+  var xs = {},
+    blockG = buildBlockGraph(g, layering, root, reverseSep),
+    borderType = reverseSep ? "borderLeft" : "borderRight";
+
+  function iterate(setXsFunc, nextNodesFunc) {
+    var stack = blockG.nodes();
+    var elem = stack.pop();
+    var visited = {};
+    while (elem) {
+      if (visited[elem]) {
+        setXsFunc(elem);
+      } else {
+        visited[elem] = true;
+        stack.push(elem);
+        stack = stack.concat(nextNodesFunc(elem));
+      }
+
+      elem = stack.pop();
+    }
+  }
+
+  // First pass, assign smallest coordinates
+  function pass1(elem) {
+    xs[elem] = blockG.inEdges(elem).reduce(function(acc, e) {
+      return Math.max(acc, xs[e.v] + blockG.edge(e));
+    }, 0);
+  }
+
+  // Second pass, assign greatest coordinates
+  function pass2(elem) {
+    var min = blockG.outEdges(elem).reduce(function(acc, e) {
+      return Math.min(acc, xs[e.w] - blockG.edge(e));
+    }, Number.POSITIVE_INFINITY);
+
+    var node = g.node(elem);
+    if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {
+      xs[elem] = Math.max(xs[elem], min);
+    }
+  }
+
+  iterate(pass1, blockG.predecessors.bind(blockG));
+  iterate(pass2, blockG.successors.bind(blockG));
+
+  // Assign x coordinates to all nodes
+  _.forEach(align, function(v) {
+    xs[v] = xs[root[v]];
+  });
+
+  return xs;
+}
+
+
+function buildBlockGraph(g, layering, root, reverseSep) {
+  var blockGraph = new Graph(),
+    graphLabel = g.graph(),
+    sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);
+
+  _.forEach(layering, function(layer) {
+    var u;
+    _.forEach(layer, function(v) {
+      var vRoot = root[v];
+      blockGraph.setNode(vRoot);
+      if (u) {
+        var uRoot = root[u],
+          prevMax = blockGraph.edge(uRoot, vRoot);
+        blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));
+      }
+      u = v;
+    });
+  });
+
+  return blockGraph;
+}
+
+/*
+ * Returns the alignment that has the smallest width of the given alignments.
+ */
+function findSmallestWidthAlignment(g, xss) {
+  return _.minBy(_.values(xss), function (xs) {
+    var max = Number.NEGATIVE_INFINITY;
+    var min = Number.POSITIVE_INFINITY;
+
+    _.forIn(xs, function (x, v) {
+      var halfWidth = width(g, v) / 2;
+
+      max = Math.max(x + halfWidth, max);
+      min = Math.min(x - halfWidth, min);
+    });
+
+    return max - min;
+  });
+}
+
+/*
+ * Align the coordinates of each of the layout alignments such that
+ * left-biased alignments have their minimum coordinate at the same point as
+ * the minimum coordinate of the smallest width alignment and right-biased
+ * alignments have their maximum coordinate at the same point as the maximum
+ * coordinate of the smallest width alignment.
+ */
+function alignCoordinates(xss, alignTo) {
+  var alignToVals = _.values(alignTo),
+    alignToMin = _.min(alignToVals),
+    alignToMax = _.max(alignToVals);
+
+  _.forEach(["u", "d"], function(vert) {
+    _.forEach(["l", "r"], function(horiz) {
+      var alignment = vert + horiz,
+        xs = xss[alignment],
+        delta;
+      if (xs === alignTo) return;
+
+      var xsVals = _.values(xs);
+      delta = horiz === "l" ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals);
+
+      if (delta) {
+        xss[alignment] = _.mapValues(xs, function(x) { return x + delta; });
+      }
+    });
+  });
+}
+
+function balance(xss, align) {
+  return _.mapValues(xss.ul, function(ignore, v) {
+    if (align) {
+      return xss[align.toLowerCase()][v];
+    } else {
+      var xs = _.sortBy(_.map(xss, v));
+      return (xs[1] + xs[2]) / 2;
+    }
+  });
+}
+
+function positionX(g) {
+  var layering = util.buildLayerMatrix(g);
+  var conflicts = _.merge(
+    findType1Conflicts(g, layering),
+    findType2Conflicts(g, layering));
+
+  var xss = {};
+  var adjustedLayering;
+  _.forEach(["u", "d"], function(vert) {
+    adjustedLayering = vert === "u" ? layering : _.values(layering).reverse();
+    _.forEach(["l", "r"], function(horiz) {
+      if (horiz === "r") {
+        adjustedLayering = _.map(adjustedLayering, function(inner) {
+          return _.values(inner).reverse();
+        });
+      }
+
+      var neighborFn = (vert === "u" ? g.predecessors : g.successors).bind(g);
+      var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);
+      var xs = horizontalCompaction(g, adjustedLayering,
+        align.root, align.align, horiz === "r");
+      if (horiz === "r") {
+        xs = _.mapValues(xs, function(x) { return -x; });
+      }
+      xss[vert + horiz] = xs;
+    });
+  });
+
+  var smallestWidth = findSmallestWidthAlignment(g, xss);
+  alignCoordinates(xss, smallestWidth);
+  return balance(xss, g.graph().align);
+}
+
+function sep(nodeSep, edgeSep, reverseSep) {
+  return function(g, v, w) {
+    var vLabel = g.node(v);
+    var wLabel = g.node(w);
+    var sum = 0;
+    var delta;
+
+    sum += vLabel.width / 2;
+    if (_.has(vLabel, "labelpos")) {
+      switch (vLabel.labelpos.toLowerCase()) {
+      case "l": delta = -vLabel.width / 2; break;
+      case "r": delta = vLabel.width / 2; break;
+      }
+    }
+    if (delta) {
+      sum += reverseSep ? delta : -delta;
+    }
+    delta = 0;
+
+    sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;
+    sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;
+
+    sum += wLabel.width / 2;
+    if (_.has(wLabel, "labelpos")) {
+      switch (wLabel.labelpos.toLowerCase()) {
+      case "l": delta = wLabel.width / 2; break;
+      case "r": delta = -wLabel.width / 2; break;
+      }
+    }
+    if (delta) {
+      sum += reverseSep ? delta : -delta;
+    }
+    delta = 0;
+
+    return sum;
+  };
+}
+
+function width(g, v) {
+  return g.node(v).width;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/position/index.js":
+/*!**************************************************!*\
+  !*** ./node_modules/dagre/lib/position/index.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+var util = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js");
+var positionX = __webpack_require__(/*! ./bk */ "./node_modules/dagre/lib/position/bk.js").positionX;
+
+module.exports = position;
+
+function position(g) {
+  g = util.asNonCompoundGraph(g);
+
+  positionY(g);
+  _.forEach(positionX(g), function(x, v) {
+    g.node(v).x = x;
+  });
+}
+
+function positionY(g) {
+  var layering = util.buildLayerMatrix(g);
+  var rankSep = g.graph().ranksep;
+  var prevY = 0;
+  _.forEach(layering, function(layer) {
+    var maxHeight = _.max(_.map(layer, function(v) { return g.node(v).height; }));
+    _.forEach(layer, function(v) {
+      g.node(v).y = prevY + maxHeight / 2;
+    });
+    prevY += maxHeight + rankSep;
+  });
+}
+
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/rank/feasible-tree.js":
+/*!******************************************************!*\
+  !*** ./node_modules/dagre/lib/rank/feasible-tree.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+var Graph = __webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph;
+var slack = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js").slack;
+
+module.exports = feasibleTree;
+
+/*
+ * Constructs a spanning tree with tight edges and adjusted the input node's
+ * ranks to achieve this. A tight edge is one that is has a length that matches
+ * its "minlen" attribute.
+ *
+ * The basic structure for this function is derived from Gansner, et al., "A
+ * Technique for Drawing Directed Graphs."
+ *
+ * Pre-conditions:
+ *
+ *    1. Graph must be a DAG.
+ *    2. Graph must be connected.
+ *    3. Graph must have at least one node.
+ *    5. Graph nodes must have been previously assigned a "rank" property that
+ *       respects the "minlen" property of incident edges.
+ *    6. Graph edges must have a "minlen" property.
+ *
+ * Post-conditions:
+ *
+ *    - Graph nodes will have their rank adjusted to ensure that all edges are
+ *      tight.
+ *
+ * Returns a tree (undirected graph) that is constructed using only "tight"
+ * edges.
+ */
+function feasibleTree(g) {
+  var t = new Graph({ directed: false });
+
+  // Choose arbitrary node from which to start our tree
+  var start = g.nodes()[0];
+  var size = g.nodeCount();
+  t.setNode(start, {});
+
+  var edge, delta;
+  while (tightTree(t, g) < size) {
+    edge = findMinSlackEdge(t, g);
+    delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);
+    shiftRanks(t, g, delta);
+  }
+
+  return t;
+}
+
+/*
+ * Finds a maximal tree of tight edges and returns the number of nodes in the
+ * tree.
+ */
+function tightTree(t, g) {
+  function dfs(v) {
+    _.forEach(g.nodeEdges(v), function(e) {
+      var edgeV = e.v,
+        w = (v === edgeV) ? e.w : edgeV;
+      if (!t.hasNode(w) && !slack(g, e)) {
+        t.setNode(w, {});
+        t.setEdge(v, w, {});
+        dfs(w);
+      }
+    });
+  }
+
+  _.forEach(t.nodes(), dfs);
+  return t.nodeCount();
+}
+
+/*
+ * Finds the edge with the smallest slack that is incident on tree and returns
+ * it.
+ */
+function findMinSlackEdge(t, g) {
+  return _.minBy(g.edges(), function(e) {
+    if (t.hasNode(e.v) !== t.hasNode(e.w)) {
+      return slack(g, e);
+    }
+  });
+}
+
+function shiftRanks(t, g, delta) {
+  _.forEach(t.nodes(), function(v) {
+    g.node(v).rank += delta;
+  });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/rank/index.js":
+/*!**********************************************!*\
+  !*** ./node_modules/dagre/lib/rank/index.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var rankUtil = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js");
+var longestPath = rankUtil.longestPath;
+var feasibleTree = __webpack_require__(/*! ./feasible-tree */ "./node_modules/dagre/lib/rank/feasible-tree.js");
+var networkSimplex = __webpack_require__(/*! ./network-simplex */ "./node_modules/dagre/lib/rank/network-simplex.js");
+
+module.exports = rank;
+
+/*
+ * Assigns a rank to each node in the input graph that respects the "minlen"
+ * constraint specified on edges between nodes.
+ *
+ * This basic structure is derived from Gansner, et al., "A Technique for
+ * Drawing Directed Graphs."
+ *
+ * Pre-conditions:
+ *
+ *    1. Graph must be a connected DAG
+ *    2. Graph nodes must be objects
+ *    3. Graph edges must have "weight" and "minlen" attributes
+ *
+ * Post-conditions:
+ *
+ *    1. Graph nodes will have a "rank" attribute based on the results of the
+ *       algorithm. Ranks can start at any index (including negative), we'll
+ *       fix them up later.
+ */
+function rank(g) {
+  switch(g.graph().ranker) {
+  case "network-simplex": networkSimplexRanker(g); break;
+  case "tight-tree": tightTreeRanker(g); break;
+  case "longest-path": longestPathRanker(g); break;
+  default: networkSimplexRanker(g);
+  }
+}
+
+// A fast and simple ranker, but results are far from optimal.
+var longestPathRanker = longestPath;
+
+function tightTreeRanker(g) {
+  longestPath(g);
+  feasibleTree(g);
+}
+
+function networkSimplexRanker(g) {
+  networkSimplex(g);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/rank/network-simplex.js":
+/*!********************************************************!*\
+  !*** ./node_modules/dagre/lib/rank/network-simplex.js ***!
+  \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+var feasibleTree = __webpack_require__(/*! ./feasible-tree */ "./node_modules/dagre/lib/rank/feasible-tree.js");
+var slack = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js").slack;
+var initRank = __webpack_require__(/*! ./util */ "./node_modules/dagre/lib/rank/util.js").longestPath;
+var preorder = __webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").alg.preorder;
+var postorder = __webpack_require__(/*! ../graphlib */ "./node_modules/dagre/lib/graphlib.js").alg.postorder;
+var simplify = __webpack_require__(/*! ../util */ "./node_modules/dagre/lib/util.js").simplify;
+
+module.exports = networkSimplex;
+
+// Expose some internals for testing purposes
+networkSimplex.initLowLimValues = initLowLimValues;
+networkSimplex.initCutValues = initCutValues;
+networkSimplex.calcCutValue = calcCutValue;
+networkSimplex.leaveEdge = leaveEdge;
+networkSimplex.enterEdge = enterEdge;
+networkSimplex.exchangeEdges = exchangeEdges;
+
+/*
+ * The network simplex algorithm assigns ranks to each node in the input graph
+ * and iteratively improves the ranking to reduce the length of edges.
+ *
+ * Preconditions:
+ *
+ *    1. The input graph must be a DAG.
+ *    2. All nodes in the graph must have an object value.
+ *    3. All edges in the graph must have "minlen" and "weight" attributes.
+ *
+ * Postconditions:
+ *
+ *    1. All nodes in the graph will have an assigned "rank" attribute that has
+ *       been optimized by the network simplex algorithm. Ranks start at 0.
+ *
+ *
+ * A rough sketch of the algorithm is as follows:
+ *
+ *    1. Assign initial ranks to each node. We use the longest path algorithm,
+ *       which assigns ranks to the lowest position possible. In general this
+ *       leads to very wide bottom ranks and unnecessarily long edges.
+ *    2. Construct a feasible tight tree. A tight tree is one such that all
+ *       edges in the tree have no slack (difference between length of edge
+ *       and minlen for the edge). This by itself greatly improves the assigned
+ *       rankings by shorting edges.
+ *    3. Iteratively find edges that have negative cut values. Generally a
+ *       negative cut value indicates that the edge could be removed and a new
+ *       tree edge could be added to produce a more compact graph.
+ *
+ * Much of the algorithms here are derived from Gansner, et al., "A Technique
+ * for Drawing Directed Graphs." The structure of the file roughly follows the
+ * structure of the overall algorithm.
+ */
+function networkSimplex(g) {
+  g = simplify(g);
+  initRank(g);
+  var t = feasibleTree(g);
+  initLowLimValues(t);
+  initCutValues(t, g);
+
+  var e, f;
+  while ((e = leaveEdge(t))) {
+    f = enterEdge(t, g, e);
+    exchangeEdges(t, g, e, f);
+  }
+}
+
+/*
+ * Initializes cut values for all edges in the tree.
+ */
+function initCutValues(t, g) {
+  var vs = postorder(t, t.nodes());
+  vs = vs.slice(0, vs.length - 1);
+  _.forEach(vs, function(v) {
+    assignCutValue(t, g, v);
+  });
+}
+
+function assignCutValue(t, g, child) {
+  var childLab = t.node(child);
+  var parent = childLab.parent;
+  t.edge(child, parent).cutvalue = calcCutValue(t, g, child);
+}
+
+/*
+ * Given the tight tree, its graph, and a child in the graph calculate and
+ * return the cut value for the edge between the child and its parent.
+ */
+function calcCutValue(t, g, child) {
+  var childLab = t.node(child);
+  var parent = childLab.parent;
+  // True if the child is on the tail end of the edge in the directed graph
+  var childIsTail = true;
+  // The graph's view of the tree edge we're inspecting
+  var graphEdge = g.edge(child, parent);
+  // The accumulated cut value for the edge between this node and its parent
+  var cutValue = 0;
+
+  if (!graphEdge) {
+    childIsTail = false;
+    graphEdge = g.edge(parent, child);
+  }
+
+  cutValue = graphEdge.weight;
+
+  _.forEach(g.nodeEdges(child), function(e) {
+    var isOutEdge = e.v === child,
+      other = isOutEdge ? e.w : e.v;
+
+    if (other !== parent) {
+      var pointsToHead = isOutEdge === childIsTail,
+        otherWeight = g.edge(e).weight;
+
+      cutValue += pointsToHead ? otherWeight : -otherWeight;
+      if (isTreeEdge(t, child, other)) {
+        var otherCutValue = t.edge(child, other).cutvalue;
+        cutValue += pointsToHead ? -otherCutValue : otherCutValue;
+      }
+    }
+  });
+
+  return cutValue;
+}
+
+function initLowLimValues(tree, root) {
+  if (arguments.length < 2) {
+    root = tree.nodes()[0];
+  }
+  dfsAssignLowLim(tree, {}, 1, root);
+}
+
+function dfsAssignLowLim(tree, visited, nextLim, v, parent) {
+  var low = nextLim;
+  var label = tree.node(v);
+
+  visited[v] = true;
+  _.forEach(tree.neighbors(v), function(w) {
+    if (!_.has(visited, w)) {
+      nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);
+    }
+  });
+
+  label.low = low;
+  label.lim = nextLim++;
+  if (parent) {
+    label.parent = parent;
+  } else {
+    // TODO should be able to remove this when we incrementally update low lim
+    delete label.parent;
+  }
+
+  return nextLim;
+}
+
+function leaveEdge(tree) {
+  return _.find(tree.edges(), function(e) {
+    return tree.edge(e).cutvalue < 0;
+  });
+}
+
+function enterEdge(t, g, edge) {
+  var v = edge.v;
+  var w = edge.w;
+
+  // For the rest of this function we assume that v is the tail and w is the
+  // head, so if we don't have this edge in the graph we should flip it to
+  // match the correct orientation.
+  if (!g.hasEdge(v, w)) {
+    v = edge.w;
+    w = edge.v;
+  }
+
+  var vLabel = t.node(v);
+  var wLabel = t.node(w);
+  var tailLabel = vLabel;
+  var flip = false;
+
+  // If the root is in the tail of the edge then we need to flip the logic that
+  // checks for the head and tail nodes in the candidates function below.
+  if (vLabel.lim > wLabel.lim) {
+    tailLabel = wLabel;
+    flip = true;
+  }
+
+  var candidates = _.filter(g.edges(), function(edge) {
+    return flip === isDescendant(t, t.node(edge.v), tailLabel) &&
+           flip !== isDescendant(t, t.node(edge.w), tailLabel);
+  });
+
+  return _.minBy(candidates, function(edge) { return slack(g, edge); });
+}
+
+function exchangeEdges(t, g, e, f) {
+  var v = e.v;
+  var w = e.w;
+  t.removeEdge(v, w);
+  t.setEdge(f.v, f.w, {});
+  initLowLimValues(t);
+  initCutValues(t, g);
+  updateRanks(t, g);
+}
+
+function updateRanks(t, g) {
+  var root = _.find(t.nodes(), function(v) { return !g.node(v).parent; });
+  var vs = preorder(t, root);
+  vs = vs.slice(1);
+  _.forEach(vs, function(v) {
+    var parent = t.node(v).parent,
+      edge = g.edge(v, parent),
+      flipped = false;
+
+    if (!edge) {
+      edge = g.edge(parent, v);
+      flipped = true;
+    }
+
+    g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);
+  });
+}
+
+/*
+ * Returns true if the edge is in the tree.
+ */
+function isTreeEdge(tree, u, v) {
+  return tree.hasEdge(u, v);
+}
+
+/*
+ * Returns true if the specified node is descendant of the root node per the
+ * assigned low and lim attributes in the tree.
+ */
+function isDescendant(tree, vLabel, rootLabel) {
+  return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/rank/util.js":
+/*!*********************************************!*\
+  !*** ./node_modules/dagre/lib/rank/util.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/dagre/lib/lodash.js");
+
+module.exports = {
+  longestPath: longestPath,
+  slack: slack
+};
+
+/*
+ * Initializes ranks for the input graph using the longest path algorithm. This
+ * algorithm scales well and is fast in practice, it yields rather poor
+ * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom
+ * ranks wide and leaving edges longer than necessary. However, due to its
+ * speed, this algorithm is good for getting an initial ranking that can be fed
+ * into other algorithms.
+ *
+ * This algorithm does not normalize layers because it will be used by other
+ * algorithms in most cases. If using this algorithm directly, be sure to
+ * run normalize at the end.
+ *
+ * Pre-conditions:
+ *
+ *    1. Input graph is a DAG.
+ *    2. Input graph node labels can be assigned properties.
+ *
+ * Post-conditions:
+ *
+ *    1. Each node will be assign an (unnormalized) "rank" property.
+ */
+function longestPath(g) {
+  var visited = {};
+
+  function dfs(v) {
+    var label = g.node(v);
+    if (_.has(visited, v)) {
+      return label.rank;
+    }
+    visited[v] = true;
+
+    var rank = _.min(_.map(g.outEdges(v), function(e) {
+      return dfs(e.w) - g.edge(e).minlen;
+    }));
+
+    if (rank === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3
+        rank === undefined || // return value of _.map([]) for Lodash 4
+        rank === null) { // return value of _.map([null])
+      rank = 0;
+    }
+
+    return (label.rank = rank);
+  }
+
+  _.forEach(g.sources(), dfs);
+}
+
+/*
+ * Returns the amount of slack for the given edge. The slack is defined as the
+ * difference between the length of the edge and its minimum length.
+ */
+function slack(g, e) {
+  return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/util.js":
+/*!****************************************!*\
+  !*** ./node_modules/dagre/lib/util.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* eslint "no-console": off */
+
+
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/dagre/lib/lodash.js");
+var Graph = __webpack_require__(/*! ./graphlib */ "./node_modules/dagre/lib/graphlib.js").Graph;
+
+module.exports = {
+  addDummyNode: addDummyNode,
+  simplify: simplify,
+  asNonCompoundGraph: asNonCompoundGraph,
+  successorWeights: successorWeights,
+  predecessorWeights: predecessorWeights,
+  intersectRect: intersectRect,
+  buildLayerMatrix: buildLayerMatrix,
+  normalizeRanks: normalizeRanks,
+  removeEmptyRanks: removeEmptyRanks,
+  addBorderNode: addBorderNode,
+  maxRank: maxRank,
+  partition: partition,
+  time: time,
+  notime: notime
+};
+
+/*
+ * Adds a dummy node to the graph and return v.
+ */
+function addDummyNode(g, type, attrs, name) {
+  var v;
+  do {
+    v = _.uniqueId(name);
+  } while (g.hasNode(v));
+
+  attrs.dummy = type;
+  g.setNode(v, attrs);
+  return v;
+}
+
+/*
+ * Returns a new graph with only simple edges. Handles aggregation of data
+ * associated with multi-edges.
+ */
+function simplify(g) {
+  var simplified = new Graph().setGraph(g.graph());
+  _.forEach(g.nodes(), function(v) { simplified.setNode(v, g.node(v)); });
+  _.forEach(g.edges(), function(e) {
+    var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 };
+    var label = g.edge(e);
+    simplified.setEdge(e.v, e.w, {
+      weight: simpleLabel.weight + label.weight,
+      minlen: Math.max(simpleLabel.minlen, label.minlen)
+    });
+  });
+  return simplified;
+}
+
+function asNonCompoundGraph(g) {
+  var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());
+  _.forEach(g.nodes(), function(v) {
+    if (!g.children(v).length) {
+      simplified.setNode(v, g.node(v));
+    }
+  });
+  _.forEach(g.edges(), function(e) {
+    simplified.setEdge(e, g.edge(e));
+  });
+  return simplified;
+}
+
+function successorWeights(g) {
+  var weightMap = _.map(g.nodes(), function(v) {
+    var sucs = {};
+    _.forEach(g.outEdges(v), function(e) {
+      sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;
+    });
+    return sucs;
+  });
+  return _.zipObject(g.nodes(), weightMap);
+}
+
+function predecessorWeights(g) {
+  var weightMap = _.map(g.nodes(), function(v) {
+    var preds = {};
+    _.forEach(g.inEdges(v), function(e) {
+      preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;
+    });
+    return preds;
+  });
+  return _.zipObject(g.nodes(), weightMap);
+}
+
+/*
+ * Finds where a line starting at point ({x, y}) would intersect a rectangle
+ * ({x, y, width, height}) if it were pointing at the rectangle's center.
+ */
+function intersectRect(rect, point) {
+  var x = rect.x;
+  var y = rect.y;
+
+  // Rectangle intersection algorithm from:
+  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes
+  var dx = point.x - x;
+  var dy = point.y - y;
+  var w = rect.width / 2;
+  var h = rect.height / 2;
+
+  if (!dx && !dy) {
+    throw new Error("Not possible to find intersection inside of the rectangle");
+  }
+
+  var sx, sy;
+  if (Math.abs(dy) * w > Math.abs(dx) * h) {
+    // Intersection is top or bottom of rect.
+    if (dy < 0) {
+      h = -h;
+    }
+    sx = h * dx / dy;
+    sy = h;
+  } else {
+    // Intersection is left or right of rect.
+    if (dx < 0) {
+      w = -w;
+    }
+    sx = w;
+    sy = w * dy / dx;
+  }
+
+  return { x: x + sx, y: y + sy };
+}
+
+/*
+ * Given a DAG with each node assigned "rank" and "order" properties, this
+ * function will produce a matrix with the ids of each node.
+ */
+function buildLayerMatrix(g) {
+  var layering = _.map(_.range(maxRank(g) + 1), function() { return []; });
+  _.forEach(g.nodes(), function(v) {
+    var node = g.node(v);
+    var rank = node.rank;
+    if (!_.isUndefined(rank)) {
+      layering[rank][node.order] = v;
+    }
+  });
+  return layering;
+}
+
+/*
+ * Adjusts the ranks for all nodes in the graph such that all nodes v have
+ * rank(v) >= 0 and at least one node w has rank(w) = 0.
+ */
+function normalizeRanks(g) {
+  var min = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));
+  _.forEach(g.nodes(), function(v) {
+    var node = g.node(v);
+    if (_.has(node, "rank")) {
+      node.rank -= min;
+    }
+  });
+}
+
+function removeEmptyRanks(g) {
+  // Ranks may not start at 0, so we need to offset them
+  var offset = _.min(_.map(g.nodes(), function(v) { return g.node(v).rank; }));
+
+  var layers = [];
+  _.forEach(g.nodes(), function(v) {
+    var rank = g.node(v).rank - offset;
+    if (!layers[rank]) {
+      layers[rank] = [];
+    }
+    layers[rank].push(v);
+  });
+
+  var delta = 0;
+  var nodeRankFactor = g.graph().nodeRankFactor;
+  _.forEach(layers, function(vs, i) {
+    if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {
+      --delta;
+    } else if (delta) {
+      _.forEach(vs, function(v) { g.node(v).rank += delta; });
+    }
+  });
+}
+
+function addBorderNode(g, prefix, rank, order) {
+  var node = {
+    width: 0,
+    height: 0
+  };
+  if (arguments.length >= 4) {
+    node.rank = rank;
+    node.order = order;
+  }
+  return addDummyNode(g, "border", node, prefix);
+}
+
+function maxRank(g) {
+  return _.max(_.map(g.nodes(), function(v) {
+    var rank = g.node(v).rank;
+    if (!_.isUndefined(rank)) {
+      return rank;
+    }
+  }));
+}
+
+/*
+ * Partition a collection into two groups: `lhs` and `rhs`. If the supplied
+ * function returns true for an entry it goes into `lhs`. Otherwise it goes
+ * into `rhs.
+ */
+function partition(collection, fn) {
+  var result = { lhs: [], rhs: [] };
+  _.forEach(collection, function(value) {
+    if (fn(value)) {
+      result.lhs.push(value);
+    } else {
+      result.rhs.push(value);
+    }
+  });
+  return result;
+}
+
+/*
+ * Returns a new function that wraps `fn` with a timer. The wrapper logs the
+ * time it takes to execute the function.
+ */
+function time(name, fn) {
+  var start = _.now();
+  try {
+    return fn();
+  } finally {
+    console.log(name + " time: " + (_.now() - start) + "ms");
+  }
+}
+
+function notime(name, fn) {
+  return fn();
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/dagre/lib/version.js":
+/*!*******************************************!*\
+  !*** ./node_modules/dagre/lib/version.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = "0.8.5";
+
+
+/***/ }),
+
+/***/ "./node_modules/entity-decode/browser.js":
+/*!***********************************************!*\
+  !*** ./node_modules/entity-decode/browser.js ***!
+  \***********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return decode; });
+/**
+ * @see https://github.com/vuejs/vue/commit/a855dd0564a657a73b7249469490d39817f27cf7#diff-c0a2623ea5896a83e3b630f236b47b52
+ * @see https://stackoverflow.com/a/13091266/4936667
+ */
+
+var decoder;
+
+function decode(html) {
+    decoder = decoder || document.createElement('div');
+    // Escape HTML before decoding for HTML Entities
+    html = escape(html).replace(/%26/g,'&').replace(/%23/g,'#').replace(/%3B/g,';');
+    // decoding
+    decoder.innerHTML = html;
+
+    return unescape(decoder.textContent);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/index.js":
+/*!****************************************!*\
+  !*** ./node_modules/graphlib/index.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/**
+ * Copyright (c) 2014, Chris Pettitt
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+var lib = __webpack_require__(/*! ./lib */ "./node_modules/graphlib/lib/index.js");
+
+module.exports = {
+  Graph: lib.Graph,
+  json: __webpack_require__(/*! ./lib/json */ "./node_modules/graphlib/lib/json.js"),
+  alg: __webpack_require__(/*! ./lib/alg */ "./node_modules/graphlib/lib/alg/index.js"),
+  version: lib.version
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/components.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/components.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+
+module.exports = components;
+
+function components(g) {
+  var visited = {};
+  var cmpts = [];
+  var cmpt;
+
+  function dfs(v) {
+    if (_.has(visited, v)) return;
+    visited[v] = true;
+    cmpt.push(v);
+    _.each(g.successors(v), dfs);
+    _.each(g.predecessors(v), dfs);
+  }
+
+  _.each(g.nodes(), function(v) {
+    cmpt = [];
+    dfs(v);
+    if (cmpt.length) {
+      cmpts.push(cmpt);
+    }
+  });
+
+  return cmpts;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/dfs.js":
+/*!**********************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/dfs.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+
+module.exports = dfs;
+
+/*
+ * A helper that preforms a pre- or post-order traversal on the input graph
+ * and returns the nodes in the order they were visited. If the graph is
+ * undirected then this algorithm will navigate using neighbors. If the graph
+ * is directed then this algorithm will navigate using successors.
+ *
+ * Order must be one of "pre" or "post".
+ */
+function dfs(g, vs, order) {
+  if (!_.isArray(vs)) {
+    vs = [vs];
+  }
+
+  var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);
+
+  var acc = [];
+  var visited = {};
+  _.each(vs, function(v) {
+    if (!g.hasNode(v)) {
+      throw new Error("Graph does not have node: " + v);
+    }
+
+    doDfs(g, v, order === "post", visited, navigation, acc);
+  });
+  return acc;
+}
+
+function doDfs(g, v, postorder, visited, navigation, acc) {
+  if (!_.has(visited, v)) {
+    visited[v] = true;
+
+    if (!postorder) { acc.push(v); }
+    _.each(navigation(v), function(w) {
+      doDfs(g, w, postorder, visited, navigation, acc);
+    });
+    if (postorder) { acc.push(v); }
+  }
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/dijkstra-all.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/dijkstra-all.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dijkstra = __webpack_require__(/*! ./dijkstra */ "./node_modules/graphlib/lib/alg/dijkstra.js");
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+
+module.exports = dijkstraAll;
+
+function dijkstraAll(g, weightFunc, edgeFunc) {
+  return _.transform(g.nodes(), function(acc, v) {
+    acc[v] = dijkstra(g, v, weightFunc, edgeFunc);
+  }, {});
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/dijkstra.js":
+/*!***************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/dijkstra.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+var PriorityQueue = __webpack_require__(/*! ../data/priority-queue */ "./node_modules/graphlib/lib/data/priority-queue.js");
+
+module.exports = dijkstra;
+
+var DEFAULT_WEIGHT_FUNC = _.constant(1);
+
+function dijkstra(g, source, weightFn, edgeFn) {
+  return runDijkstra(g, String(source),
+    weightFn || DEFAULT_WEIGHT_FUNC,
+    edgeFn || function(v) { return g.outEdges(v); });
+}
+
+function runDijkstra(g, source, weightFn, edgeFn) {
+  var results = {};
+  var pq = new PriorityQueue();
+  var v, vEntry;
+
+  var updateNeighbors = function(edge) {
+    var w = edge.v !== v ? edge.v : edge.w;
+    var wEntry = results[w];
+    var weight = weightFn(edge);
+    var distance = vEntry.distance + weight;
+
+    if (weight < 0) {
+      throw new Error("dijkstra does not allow negative edge weights. " +
+                      "Bad edge: " + edge + " Weight: " + weight);
+    }
+
+    if (distance < wEntry.distance) {
+      wEntry.distance = distance;
+      wEntry.predecessor = v;
+      pq.decrease(w, distance);
+    }
+  };
+
+  g.nodes().forEach(function(v) {
+    var distance = v === source ? 0 : Number.POSITIVE_INFINITY;
+    results[v] = { distance: distance };
+    pq.add(v, distance);
+  });
+
+  while (pq.size() > 0) {
+    v = pq.removeMin();
+    vEntry = results[v];
+    if (vEntry.distance === Number.POSITIVE_INFINITY) {
+      break;
+    }
+
+    edgeFn(v).forEach(updateNeighbors);
+  }
+
+  return results;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/find-cycles.js":
+/*!******************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/find-cycles.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+var tarjan = __webpack_require__(/*! ./tarjan */ "./node_modules/graphlib/lib/alg/tarjan.js");
+
+module.exports = findCycles;
+
+function findCycles(g) {
+  return _.filter(tarjan(g), function(cmpt) {
+    return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]));
+  });
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/floyd-warshall.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/floyd-warshall.js ***!
+  \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+
+module.exports = floydWarshall;
+
+var DEFAULT_WEIGHT_FUNC = _.constant(1);
+
+function floydWarshall(g, weightFn, edgeFn) {
+  return runFloydWarshall(g,
+    weightFn || DEFAULT_WEIGHT_FUNC,
+    edgeFn || function(v) { return g.outEdges(v); });
+}
+
+function runFloydWarshall(g, weightFn, edgeFn) {
+  var results = {};
+  var nodes = g.nodes();
+
+  nodes.forEach(function(v) {
+    results[v] = {};
+    results[v][v] = { distance: 0 };
+    nodes.forEach(function(w) {
+      if (v !== w) {
+        results[v][w] = { distance: Number.POSITIVE_INFINITY };
+      }
+    });
+    edgeFn(v).forEach(function(edge) {
+      var w = edge.v === v ? edge.w : edge.v;
+      var d = weightFn(edge);
+      results[v][w] = { distance: d, predecessor: v };
+    });
+  });
+
+  nodes.forEach(function(k) {
+    var rowK = results[k];
+    nodes.forEach(function(i) {
+      var rowI = results[i];
+      nodes.forEach(function(j) {
+        var ik = rowI[k];
+        var kj = rowK[j];
+        var ij = rowI[j];
+        var altDistance = ik.distance + kj.distance;
+        if (altDistance < ij.distance) {
+          ij.distance = altDistance;
+          ij.predecessor = kj.predecessor;
+        }
+      });
+    });
+  });
+
+  return results;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/index.js":
+/*!************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/index.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = {
+  components: __webpack_require__(/*! ./components */ "./node_modules/graphlib/lib/alg/components.js"),
+  dijkstra: __webpack_require__(/*! ./dijkstra */ "./node_modules/graphlib/lib/alg/dijkstra.js"),
+  dijkstraAll: __webpack_require__(/*! ./dijkstra-all */ "./node_modules/graphlib/lib/alg/dijkstra-all.js"),
+  findCycles: __webpack_require__(/*! ./find-cycles */ "./node_modules/graphlib/lib/alg/find-cycles.js"),
+  floydWarshall: __webpack_require__(/*! ./floyd-warshall */ "./node_modules/graphlib/lib/alg/floyd-warshall.js"),
+  isAcyclic: __webpack_require__(/*! ./is-acyclic */ "./node_modules/graphlib/lib/alg/is-acyclic.js"),
+  postorder: __webpack_require__(/*! ./postorder */ "./node_modules/graphlib/lib/alg/postorder.js"),
+  preorder: __webpack_require__(/*! ./preorder */ "./node_modules/graphlib/lib/alg/preorder.js"),
+  prim: __webpack_require__(/*! ./prim */ "./node_modules/graphlib/lib/alg/prim.js"),
+  tarjan: __webpack_require__(/*! ./tarjan */ "./node_modules/graphlib/lib/alg/tarjan.js"),
+  topsort: __webpack_require__(/*! ./topsort */ "./node_modules/graphlib/lib/alg/topsort.js")
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/is-acyclic.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/is-acyclic.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var topsort = __webpack_require__(/*! ./topsort */ "./node_modules/graphlib/lib/alg/topsort.js");
+
+module.exports = isAcyclic;
+
+function isAcyclic(g) {
+  try {
+    topsort(g);
+  } catch (e) {
+    if (e instanceof topsort.CycleException) {
+      return false;
+    }
+    throw e;
+  }
+  return true;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/postorder.js":
+/*!****************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/postorder.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js");
+
+module.exports = postorder;
+
+function postorder(g, vs) {
+  return dfs(g, vs, "post");
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/preorder.js":
+/*!***************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/preorder.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dfs = __webpack_require__(/*! ./dfs */ "./node_modules/graphlib/lib/alg/dfs.js");
+
+module.exports = preorder;
+
+function preorder(g, vs) {
+  return dfs(g, vs, "pre");
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/prim.js":
+/*!***********************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/prim.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+var Graph = __webpack_require__(/*! ../graph */ "./node_modules/graphlib/lib/graph.js");
+var PriorityQueue = __webpack_require__(/*! ../data/priority-queue */ "./node_modules/graphlib/lib/data/priority-queue.js");
+
+module.exports = prim;
+
+function prim(g, weightFunc) {
+  var result = new Graph();
+  var parents = {};
+  var pq = new PriorityQueue();
+  var v;
+
+  function updateNeighbors(edge) {
+    var w = edge.v === v ? edge.w : edge.v;
+    var pri = pq.priority(w);
+    if (pri !== undefined) {
+      var edgeWeight = weightFunc(edge);
+      if (edgeWeight < pri) {
+        parents[w] = v;
+        pq.decrease(w, edgeWeight);
+      }
+    }
+  }
+
+  if (g.nodeCount() === 0) {
+    return result;
+  }
+
+  _.each(g.nodes(), function(v) {
+    pq.add(v, Number.POSITIVE_INFINITY);
+    result.setNode(v);
+  });
+
+  // Start from an arbitrary node
+  pq.decrease(g.nodes()[0], 0);
+
+  var init = false;
+  while (pq.size() > 0) {
+    v = pq.removeMin();
+    if (_.has(parents, v)) {
+      result.setEdge(v, parents[v]);
+    } else if (init) {
+      throw new Error("Input graph is not connected: " + g);
+    } else {
+      init = true;
+    }
+
+    g.nodeEdges(v).forEach(updateNeighbors);
+  }
+
+  return result;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/tarjan.js":
+/*!*************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/tarjan.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+
+module.exports = tarjan;
+
+function tarjan(g) {
+  var index = 0;
+  var stack = [];
+  var visited = {}; // node id -> { onStack, lowlink, index }
+  var results = [];
+
+  function dfs(v) {
+    var entry = visited[v] = {
+      onStack: true,
+      lowlink: index,
+      index: index++
+    };
+    stack.push(v);
+
+    g.successors(v).forEach(function(w) {
+      if (!_.has(visited, w)) {
+        dfs(w);
+        entry.lowlink = Math.min(entry.lowlink, visited[w].lowlink);
+      } else if (visited[w].onStack) {
+        entry.lowlink = Math.min(entry.lowlink, visited[w].index);
+      }
+    });
+
+    if (entry.lowlink === entry.index) {
+      var cmpt = [];
+      var w;
+      do {
+        w = stack.pop();
+        visited[w].onStack = false;
+        cmpt.push(w);
+      } while (v !== w);
+      results.push(cmpt);
+    }
+  }
+
+  g.nodes().forEach(function(v) {
+    if (!_.has(visited, v)) {
+      dfs(v);
+    }
+  });
+
+  return results;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/alg/topsort.js":
+/*!**************************************************!*\
+  !*** ./node_modules/graphlib/lib/alg/topsort.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+
+module.exports = topsort;
+topsort.CycleException = CycleException;
+
+function topsort(g) {
+  var visited = {};
+  var stack = {};
+  var results = [];
+
+  function visit(node) {
+    if (_.has(stack, node)) {
+      throw new CycleException();
+    }
+
+    if (!_.has(visited, node)) {
+      stack[node] = true;
+      visited[node] = true;
+      _.each(g.predecessors(node), visit);
+      delete stack[node];
+      results.push(node);
+    }
+  }
+
+  _.each(g.sinks(), visit);
+
+  if (_.size(visited) !== g.nodeCount()) {
+    throw new CycleException();
+  }
+
+  return results;
+}
+
+function CycleException() {}
+CycleException.prototype = new Error(); // must be an instance of Error to pass testing
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/data/priority-queue.js":
+/*!**********************************************************!*\
+  !*** ./node_modules/graphlib/lib/data/priority-queue.js ***!
+  \**********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ../lodash */ "./node_modules/graphlib/lib/lodash.js");
+
+module.exports = PriorityQueue;
+
+/**
+ * A min-priority queue data structure. This algorithm is derived from Cormen,
+ * et al., "Introduction to Algorithms". The basic idea of a min-priority
+ * queue is that you can efficiently (in O(1) time) get the smallest key in
+ * the queue. Adding and removing elements takes O(log n) time. A key can
+ * have its priority decreased in O(log n) time.
+ */
+function PriorityQueue() {
+  this._arr = [];
+  this._keyIndices = {};
+}
+
+/**
+ * Returns the number of elements in the queue. Takes `O(1)` time.
+ */
+PriorityQueue.prototype.size = function() {
+  return this._arr.length;
+};
+
+/**
+ * Returns the keys that are in the queue. Takes `O(n)` time.
+ */
+PriorityQueue.prototype.keys = function() {
+  return this._arr.map(function(x) { return x.key; });
+};
+
+/**
+ * Returns `true` if **key** is in the queue and `false` if not.
+ */
+PriorityQueue.prototype.has = function(key) {
+  return _.has(this._keyIndices, key);
+};
+
+/**
+ * Returns the priority for **key**. If **key** is not present in the queue
+ * then this function returns `undefined`. Takes `O(1)` time.
+ *
+ * @param {Object} key
+ */
+PriorityQueue.prototype.priority = function(key) {
+  var index = this._keyIndices[key];
+  if (index !== undefined) {
+    return this._arr[index].priority;
+  }
+};
+
+/**
+ * Returns the key for the minimum element in this queue. If the queue is
+ * empty this function throws an Error. Takes `O(1)` time.
+ */
+PriorityQueue.prototype.min = function() {
+  if (this.size() === 0) {
+    throw new Error("Queue underflow");
+  }
+  return this._arr[0].key;
+};
+
+/**
+ * Inserts a new key into the priority queue. If the key already exists in
+ * the queue this function returns `false`; otherwise it will return `true`.
+ * Takes `O(n)` time.
+ *
+ * @param {Object} key the key to add
+ * @param {Number} priority the initial priority for the key
+ */
+PriorityQueue.prototype.add = function(key, priority) {
+  var keyIndices = this._keyIndices;
+  key = String(key);
+  if (!_.has(keyIndices, key)) {
+    var arr = this._arr;
+    var index = arr.length;
+    keyIndices[key] = index;
+    arr.push({key: key, priority: priority});
+    this._decrease(index);
+    return true;
+  }
+  return false;
+};
+
+/**
+ * Removes and returns the smallest key in the queue. Takes `O(log n)` time.
+ */
+PriorityQueue.prototype.removeMin = function() {
+  this._swap(0, this._arr.length - 1);
+  var min = this._arr.pop();
+  delete this._keyIndices[min.key];
+  this._heapify(0);
+  return min.key;
+};
+
+/**
+ * Decreases the priority for **key** to **priority**. If the new priority is
+ * greater than the previous priority, this function will throw an Error.
+ *
+ * @param {Object} key the key for which to raise priority
+ * @param {Number} priority the new priority for the key
+ */
+PriorityQueue.prototype.decrease = function(key, priority) {
+  var index = this._keyIndices[key];
+  if (priority > this._arr[index].priority) {
+    throw new Error("New priority is greater than current priority. " +
+        "Key: " + key + " Old: " + this._arr[index].priority + " New: " + priority);
+  }
+  this._arr[index].priority = priority;
+  this._decrease(index);
+};
+
+PriorityQueue.prototype._heapify = function(i) {
+  var arr = this._arr;
+  var l = 2 * i;
+  var r = l + 1;
+  var largest = i;
+  if (l < arr.length) {
+    largest = arr[l].priority < arr[largest].priority ? l : largest;
+    if (r < arr.length) {
+      largest = arr[r].priority < arr[largest].priority ? r : largest;
+    }
+    if (largest !== i) {
+      this._swap(i, largest);
+      this._heapify(largest);
+    }
+  }
+};
+
+PriorityQueue.prototype._decrease = function(index) {
+  var arr = this._arr;
+  var priority = arr[index].priority;
+  var parent;
+  while (index !== 0) {
+    parent = index >> 1;
+    if (arr[parent].priority < priority) {
+      break;
+    }
+    this._swap(index, parent);
+    index = parent;
+  }
+};
+
+PriorityQueue.prototype._swap = function(i, j) {
+  var arr = this._arr;
+  var keyIndices = this._keyIndices;
+  var origArrI = arr[i];
+  var origArrJ = arr[j];
+  arr[i] = origArrJ;
+  arr[j] = origArrI;
+  keyIndices[origArrJ.key] = i;
+  keyIndices[origArrI.key] = j;
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/graph.js":
+/*!********************************************!*\
+  !*** ./node_modules/graphlib/lib/graph.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/graphlib/lib/lodash.js");
+
+module.exports = Graph;
+
+var DEFAULT_EDGE_NAME = "\x00";
+var GRAPH_NODE = "\x00";
+var EDGE_KEY_DELIM = "\x01";
+
+// Implementation notes:
+//
+//  * Node id query functions should return string ids for the nodes
+//  * Edge id query functions should return an "edgeObj", edge object, that is
+//    composed of enough information to uniquely identify an edge: {v, w, name}.
+//  * Internally we use an "edgeId", a stringified form of the edgeObj, to
+//    reference edges. This is because we need a performant way to look these
+//    edges up and, object properties, which have string keys, are the closest
+//    we're going to get to a performant hashtable in JavaScript.
+
+function Graph(opts) {
+  this._isDirected = _.has(opts, "directed") ? opts.directed : true;
+  this._isMultigraph = _.has(opts, "multigraph") ? opts.multigraph : false;
+  this._isCompound = _.has(opts, "compound") ? opts.compound : false;
+
+  // Label for the graph itself
+  this._label = undefined;
+
+  // Defaults to be set when creating a new node
+  this._defaultNodeLabelFn = _.constant(undefined);
+
+  // Defaults to be set when creating a new edge
+  this._defaultEdgeLabelFn = _.constant(undefined);
+
+  // v -> label
+  this._nodes = {};
+
+  if (this._isCompound) {
+    // v -> parent
+    this._parent = {};
+
+    // v -> children
+    this._children = {};
+    this._children[GRAPH_NODE] = {};
+  }
+
+  // v -> edgeObj
+  this._in = {};
+
+  // u -> v -> Number
+  this._preds = {};
+
+  // v -> edgeObj
+  this._out = {};
+
+  // v -> w -> Number
+  this._sucs = {};
+
+  // e -> edgeObj
+  this._edgeObjs = {};
+
+  // e -> label
+  this._edgeLabels = {};
+}
+
+/* Number of nodes in the graph. Should only be changed by the implementation. */
+Graph.prototype._nodeCount = 0;
+
+/* Number of edges in the graph. Should only be changed by the implementation. */
+Graph.prototype._edgeCount = 0;
+
+
+/* === Graph functions ========= */
+
+Graph.prototype.isDirected = function() {
+  return this._isDirected;
+};
+
+Graph.prototype.isMultigraph = function() {
+  return this._isMultigraph;
+};
+
+Graph.prototype.isCompound = function() {
+  return this._isCompound;
+};
+
+Graph.prototype.setGraph = function(label) {
+  this._label = label;
+  return this;
+};
+
+Graph.prototype.graph = function() {
+  return this._label;
+};
+
+
+/* === Node functions ========== */
+
+Graph.prototype.setDefaultNodeLabel = function(newDefault) {
+  if (!_.isFunction(newDefault)) {
+    newDefault = _.constant(newDefault);
+  }
+  this._defaultNodeLabelFn = newDefault;
+  return this;
+};
+
+Graph.prototype.nodeCount = function() {
+  return this._nodeCount;
+};
+
+Graph.prototype.nodes = function() {
+  return _.keys(this._nodes);
+};
+
+Graph.prototype.sources = function() {
+  var self = this;
+  return _.filter(this.nodes(), function(v) {
+    return _.isEmpty(self._in[v]);
+  });
+};
+
+Graph.prototype.sinks = function() {
+  var self = this;
+  return _.filter(this.nodes(), function(v) {
+    return _.isEmpty(self._out[v]);
+  });
+};
+
+Graph.prototype.setNodes = function(vs, value) {
+  var args = arguments;
+  var self = this;
+  _.each(vs, function(v) {
+    if (args.length > 1) {
+      self.setNode(v, value);
+    } else {
+      self.setNode(v);
+    }
+  });
+  return this;
+};
+
+Graph.prototype.setNode = function(v, value) {
+  if (_.has(this._nodes, v)) {
+    if (arguments.length > 1) {
+      this._nodes[v] = value;
+    }
+    return this;
+  }
+
+  this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);
+  if (this._isCompound) {
+    this._parent[v] = GRAPH_NODE;
+    this._children[v] = {};
+    this._children[GRAPH_NODE][v] = true;
+  }
+  this._in[v] = {};
+  this._preds[v] = {};
+  this._out[v] = {};
+  this._sucs[v] = {};
+  ++this._nodeCount;
+  return this;
+};
+
+Graph.prototype.node = function(v) {
+  return this._nodes[v];
+};
+
+Graph.prototype.hasNode = function(v) {
+  return _.has(this._nodes, v);
+};
+
+Graph.prototype.removeNode =  function(v) {
+  var self = this;
+  if (_.has(this._nodes, v)) {
+    var removeEdge = function(e) { self.removeEdge(self._edgeObjs[e]); };
+    delete this._nodes[v];
+    if (this._isCompound) {
+      this._removeFromParentsChildList(v);
+      delete this._parent[v];
+      _.each(this.children(v), function(child) {
+        self.setParent(child);
+      });
+      delete this._children[v];
+    }
+    _.each(_.keys(this._in[v]), removeEdge);
+    delete this._in[v];
+    delete this._preds[v];
+    _.each(_.keys(this._out[v]), removeEdge);
+    delete this._out[v];
+    delete this._sucs[v];
+    --this._nodeCount;
+  }
+  return this;
+};
+
+Graph.prototype.setParent = function(v, parent) {
+  if (!this._isCompound) {
+    throw new Error("Cannot set parent in a non-compound graph");
+  }
+
+  if (_.isUndefined(parent)) {
+    parent = GRAPH_NODE;
+  } else {
+    // Coerce parent to string
+    parent += "";
+    for (var ancestor = parent;
+      !_.isUndefined(ancestor);
+      ancestor = this.parent(ancestor)) {
+      if (ancestor === v) {
+        throw new Error("Setting " + parent+ " as parent of " + v +
+                        " would create a cycle");
+      }
+    }
+
+    this.setNode(parent);
+  }
+
+  this.setNode(v);
+  this._removeFromParentsChildList(v);
+  this._parent[v] = parent;
+  this._children[parent][v] = true;
+  return this;
+};
+
+Graph.prototype._removeFromParentsChildList = function(v) {
+  delete this._children[this._parent[v]][v];
+};
+
+Graph.prototype.parent = function(v) {
+  if (this._isCompound) {
+    var parent = this._parent[v];
+    if (parent !== GRAPH_NODE) {
+      return parent;
+    }
+  }
+};
+
+Graph.prototype.children = function(v) {
+  if (_.isUndefined(v)) {
+    v = GRAPH_NODE;
+  }
+
+  if (this._isCompound) {
+    var children = this._children[v];
+    if (children) {
+      return _.keys(children);
+    }
+  } else if (v === GRAPH_NODE) {
+    return this.nodes();
+  } else if (this.hasNode(v)) {
+    return [];
+  }
+};
+
+Graph.prototype.predecessors = function(v) {
+  var predsV = this._preds[v];
+  if (predsV) {
+    return _.keys(predsV);
+  }
+};
+
+Graph.prototype.successors = function(v) {
+  var sucsV = this._sucs[v];
+  if (sucsV) {
+    return _.keys(sucsV);
+  }
+};
+
+Graph.prototype.neighbors = function(v) {
+  var preds = this.predecessors(v);
+  if (preds) {
+    return _.union(preds, this.successors(v));
+  }
+};
+
+Graph.prototype.isLeaf = function (v) {
+  var neighbors;
+  if (this.isDirected()) {
+    neighbors = this.successors(v);
+  } else {
+    neighbors = this.neighbors(v);
+  }
+  return neighbors.length === 0;
+};
+
+Graph.prototype.filterNodes = function(filter) {
+  var copy = new this.constructor({
+    directed: this._isDirected,
+    multigraph: this._isMultigraph,
+    compound: this._isCompound
+  });
+
+  copy.setGraph(this.graph());
+
+  var self = this;
+  _.each(this._nodes, function(value, v) {
+    if (filter(v)) {
+      copy.setNode(v, value);
+    }
+  });
+
+  _.each(this._edgeObjs, function(e) {
+    if (copy.hasNode(e.v) && copy.hasNode(e.w)) {
+      copy.setEdge(e, self.edge(e));
+    }
+  });
+
+  var parents = {};
+  function findParent(v) {
+    var parent = self.parent(v);
+    if (parent === undefined || copy.hasNode(parent)) {
+      parents[v] = parent;
+      return parent;
+    } else if (parent in parents) {
+      return parents[parent];
+    } else {
+      return findParent(parent);
+    }
+  }
+
+  if (this._isCompound) {
+    _.each(copy.nodes(), function(v) {
+      copy.setParent(v, findParent(v));
+    });
+  }
+
+  return copy;
+};
+
+/* === Edge functions ========== */
+
+Graph.prototype.setDefaultEdgeLabel = function(newDefault) {
+  if (!_.isFunction(newDefault)) {
+    newDefault = _.constant(newDefault);
+  }
+  this._defaultEdgeLabelFn = newDefault;
+  return this;
+};
+
+Graph.prototype.edgeCount = function() {
+  return this._edgeCount;
+};
+
+Graph.prototype.edges = function() {
+  return _.values(this._edgeObjs);
+};
+
+Graph.prototype.setPath = function(vs, value) {
+  var self = this;
+  var args = arguments;
+  _.reduce(vs, function(v, w) {
+    if (args.length > 1) {
+      self.setEdge(v, w, value);
+    } else {
+      self.setEdge(v, w);
+    }
+    return w;
+  });
+  return this;
+};
+
+/*
+ * setEdge(v, w, [value, [name]])
+ * setEdge({ v, w, [name] }, [value])
+ */
+Graph.prototype.setEdge = function() {
+  var v, w, name, value;
+  var valueSpecified = false;
+  var arg0 = arguments[0];
+
+  if (typeof arg0 === "object" && arg0 !== null && "v" in arg0) {
+    v = arg0.v;
+    w = arg0.w;
+    name = arg0.name;
+    if (arguments.length === 2) {
+      value = arguments[1];
+      valueSpecified = true;
+    }
+  } else {
+    v = arg0;
+    w = arguments[1];
+    name = arguments[3];
+    if (arguments.length > 2) {
+      value = arguments[2];
+      valueSpecified = true;
+    }
+  }
+
+  v = "" + v;
+  w = "" + w;
+  if (!_.isUndefined(name)) {
+    name = "" + name;
+  }
+
+  var e = edgeArgsToId(this._isDirected, v, w, name);
+  if (_.has(this._edgeLabels, e)) {
+    if (valueSpecified) {
+      this._edgeLabels[e] = value;
+    }
+    return this;
+  }
+
+  if (!_.isUndefined(name) && !this._isMultigraph) {
+    throw new Error("Cannot set a named edge when isMultigraph = false");
+  }
+
+  // It didn't exist, so we need to create it.
+  // First ensure the nodes exist.
+  this.setNode(v);
+  this.setNode(w);
+
+  this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);
+
+  var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);
+  // Ensure we add undirected edges in a consistent way.
+  v = edgeObj.v;
+  w = edgeObj.w;
+
+  Object.freeze(edgeObj);
+  this._edgeObjs[e] = edgeObj;
+  incrementOrInitEntry(this._preds[w], v);
+  incrementOrInitEntry(this._sucs[v], w);
+  this._in[w][e] = edgeObj;
+  this._out[v][e] = edgeObj;
+  this._edgeCount++;
+  return this;
+};
+
+Graph.prototype.edge = function(v, w, name) {
+  var e = (arguments.length === 1
+    ? edgeObjToId(this._isDirected, arguments[0])
+    : edgeArgsToId(this._isDirected, v, w, name));
+  return this._edgeLabels[e];
+};
+
+Graph.prototype.hasEdge = function(v, w, name) {
+  var e = (arguments.length === 1
+    ? edgeObjToId(this._isDirected, arguments[0])
+    : edgeArgsToId(this._isDirected, v, w, name));
+  return _.has(this._edgeLabels, e);
+};
+
+Graph.prototype.removeEdge = function(v, w, name) {
+  var e = (arguments.length === 1
+    ? edgeObjToId(this._isDirected, arguments[0])
+    : edgeArgsToId(this._isDirected, v, w, name));
+  var edge = this._edgeObjs[e];
+  if (edge) {
+    v = edge.v;
+    w = edge.w;
+    delete this._edgeLabels[e];
+    delete this._edgeObjs[e];
+    decrementOrRemoveEntry(this._preds[w], v);
+    decrementOrRemoveEntry(this._sucs[v], w);
+    delete this._in[w][e];
+    delete this._out[v][e];
+    this._edgeCount--;
+  }
+  return this;
+};
+
+Graph.prototype.inEdges = function(v, u) {
+  var inV = this._in[v];
+  if (inV) {
+    var edges = _.values(inV);
+    if (!u) {
+      return edges;
+    }
+    return _.filter(edges, function(edge) { return edge.v === u; });
+  }
+};
+
+Graph.prototype.outEdges = function(v, w) {
+  var outV = this._out[v];
+  if (outV) {
+    var edges = _.values(outV);
+    if (!w) {
+      return edges;
+    }
+    return _.filter(edges, function(edge) { return edge.w === w; });
+  }
+};
+
+Graph.prototype.nodeEdges = function(v, w) {
+  var inEdges = this.inEdges(v, w);
+  if (inEdges) {
+    return inEdges.concat(this.outEdges(v, w));
+  }
+};
+
+function incrementOrInitEntry(map, k) {
+  if (map[k]) {
+    map[k]++;
+  } else {
+    map[k] = 1;
+  }
+}
+
+function decrementOrRemoveEntry(map, k) {
+  if (!--map[k]) { delete map[k]; }
+}
+
+function edgeArgsToId(isDirected, v_, w_, name) {
+  var v = "" + v_;
+  var w = "" + w_;
+  if (!isDirected && v > w) {
+    var tmp = v;
+    v = w;
+    w = tmp;
+  }
+  return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM +
+             (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);
+}
+
+function edgeArgsToObj(isDirected, v_, w_, name) {
+  var v = "" + v_;
+  var w = "" + w_;
+  if (!isDirected && v > w) {
+    var tmp = v;
+    v = w;
+    w = tmp;
+  }
+  var edgeObj =  { v: v, w: w };
+  if (name) {
+    edgeObj.name = name;
+  }
+  return edgeObj;
+}
+
+function edgeObjToId(isDirected, edgeObj) {
+  return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/index.js":
+/*!********************************************!*\
+  !*** ./node_modules/graphlib/lib/index.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Includes only the "core" of graphlib
+module.exports = {
+  Graph: __webpack_require__(/*! ./graph */ "./node_modules/graphlib/lib/graph.js"),
+  version: __webpack_require__(/*! ./version */ "./node_modules/graphlib/lib/version.js")
+};
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/json.js":
+/*!*******************************************!*\
+  !*** ./node_modules/graphlib/lib/json.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var _ = __webpack_require__(/*! ./lodash */ "./node_modules/graphlib/lib/lodash.js");
+var Graph = __webpack_require__(/*! ./graph */ "./node_modules/graphlib/lib/graph.js");
+
+module.exports = {
+  write: write,
+  read: read
+};
+
+function write(g) {
+  var json = {
+    options: {
+      directed: g.isDirected(),
+      multigraph: g.isMultigraph(),
+      compound: g.isCompound()
+    },
+    nodes: writeNodes(g),
+    edges: writeEdges(g)
+  };
+  if (!_.isUndefined(g.graph())) {
+    json.value = _.clone(g.graph());
+  }
+  return json;
+}
+
+function writeNodes(g) {
+  return _.map(g.nodes(), function(v) {
+    var nodeValue = g.node(v);
+    var parent = g.parent(v);
+    var node = { v: v };
+    if (!_.isUndefined(nodeValue)) {
+      node.value = nodeValue;
+    }
+    if (!_.isUndefined(parent)) {
+      node.parent = parent;
+    }
+    return node;
+  });
+}
+
+function writeEdges(g) {
+  return _.map(g.edges(), function(e) {
+    var edgeValue = g.edge(e);
+    var edge = { v: e.v, w: e.w };
+    if (!_.isUndefined(e.name)) {
+      edge.name = e.name;
+    }
+    if (!_.isUndefined(edgeValue)) {
+      edge.value = edgeValue;
+    }
+    return edge;
+  });
+}
+
+function read(json) {
+  var g = new Graph(json.options).setGraph(json.value);
+  _.each(json.nodes, function(entry) {
+    g.setNode(entry.v, entry.value);
+    if (entry.parent) {
+      g.setParent(entry.v, entry.parent);
+    }
+  });
+  _.each(json.edges, function(entry) {
+    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);
+  });
+  return g;
+}
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/lodash.js":
+/*!*********************************************!*\
+  !*** ./node_modules/graphlib/lib/lodash.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* global window */
+
+var lodash;
+
+if (true) {
+  try {
+    lodash = {
+      clone: __webpack_require__(/*! lodash/clone */ "./node_modules/lodash/clone.js"),
+      constant: __webpack_require__(/*! lodash/constant */ "./node_modules/lodash/constant.js"),
+      each: __webpack_require__(/*! lodash/each */ "./node_modules/lodash/each.js"),
+      filter: __webpack_require__(/*! lodash/filter */ "./node_modules/lodash/filter.js"),
+      has:  __webpack_require__(/*! lodash/has */ "./node_modules/lodash/has.js"),
+      isArray: __webpack_require__(/*! lodash/isArray */ "./node_modules/lodash/isArray.js"),
+      isEmpty: __webpack_require__(/*! lodash/isEmpty */ "./node_modules/lodash/isEmpty.js"),
+      isFunction: __webpack_require__(/*! lodash/isFunction */ "./node_modules/lodash/isFunction.js"),
+      isUndefined: __webpack_require__(/*! lodash/isUndefined */ "./node_modules/lodash/isUndefined.js"),
+      keys: __webpack_require__(/*! lodash/keys */ "./node_modules/lodash/keys.js"),
+      map: __webpack_require__(/*! lodash/map */ "./node_modules/lodash/map.js"),
+      reduce: __webpack_require__(/*! lodash/reduce */ "./node_modules/lodash/reduce.js"),
+      size: __webpack_require__(/*! lodash/size */ "./node_modules/lodash/size.js"),
+      transform: __webpack_require__(/*! lodash/transform */ "./node_modules/lodash/transform.js"),
+      union: __webpack_require__(/*! lodash/union */ "./node_modules/lodash/union.js"),
+      values: __webpack_require__(/*! lodash/values */ "./node_modules/lodash/values.js")
+    };
+  } catch (e) {
+    // continue regardless of error
+  }
+}
+
+if (!lodash) {
+  lodash = window._;
+}
+
+module.exports = lodash;
+
+
+/***/ }),
+
+/***/ "./node_modules/graphlib/lib/version.js":
+/*!**********************************************!*\
+  !*** ./node_modules/graphlib/lib/version.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = '2.1.8';
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/channels/index.js":
+/*!****************************************************!*\
+  !*** ./node_modules/khroma/dist/channels/index.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var types_1 = __webpack_require__(/*! ../types */ "./node_modules/khroma/dist/types.js");
+var type_1 = __webpack_require__(/*! ./type */ "./node_modules/khroma/dist/channels/type.js");
+/* CHANNELS */
+var Channels = /** @class */ (function () {
+    /* CONSTRUCTOR */
+    function Channels(data, color) {
+        this.color = color;
+        this.changed = false;
+        this.data = data; //TSC
+        this.type = new type_1.default();
+    }
+    /* API */
+    Channels.prototype.set = function (data, color) {
+        this.color = color;
+        this.changed = false;
+        this.data = data; //TSC
+        this.type.type = types_1.TYPE.ALL;
+        return this;
+    };
+    /* HELPERS */
+    Channels.prototype._ensureHSL = function () {
+        if (this.data.h === undefined)
+            this.data.h = utils_1.default.channel.rgb2hsl(this.data, 'h');
+        if (this.data.s === undefined)
+            this.data.s = utils_1.default.channel.rgb2hsl(this.data, 's');
+        if (this.data.l === undefined)
+            this.data.l = utils_1.default.channel.rgb2hsl(this.data, 'l');
+    };
+    Channels.prototype._ensureRGB = function () {
+        if (this.data.r === undefined)
+            this.data.r = utils_1.default.channel.hsl2rgb(this.data, 'r');
+        if (this.data.g === undefined)
+            this.data.g = utils_1.default.channel.hsl2rgb(this.data, 'g');
+        if (this.data.b === undefined)
+            this.data.b = utils_1.default.channel.hsl2rgb(this.data, 'b');
+    };
+    Object.defineProperty(Channels.prototype, "r", {
+        /* GETTERS */
+        get: function () {
+            if (!this.type.is(types_1.TYPE.HSL) && this.data.r !== undefined)
+                return this.data.r;
+            this._ensureHSL();
+            return utils_1.default.channel.hsl2rgb(this.data, 'r');
+        },
+        /* SETTERS */
+        set: function (r) {
+            this.type.set(types_1.TYPE.RGB);
+            this.changed = true;
+            this.data.r = r;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(Channels.prototype, "g", {
+        get: function () {
+            if (!this.type.is(types_1.TYPE.HSL) && this.data.g !== undefined)
+                return this.data.g;
+            this._ensureHSL();
+            return utils_1.default.channel.hsl2rgb(this.data, 'g');
+        },
+        set: function (g) {
+            this.type.set(types_1.TYPE.RGB);
+            this.changed = true;
+            this.data.g = g;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(Channels.prototype, "b", {
+        get: function () {
+            if (!this.type.is(types_1.TYPE.HSL) && this.data.b !== undefined)
+                return this.data.b;
+            this._ensureHSL();
+            return utils_1.default.channel.hsl2rgb(this.data, 'b');
+        },
+        set: function (b) {
+            this.type.set(types_1.TYPE.RGB);
+            this.changed = true;
+            this.data.b = b;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(Channels.prototype, "h", {
+        get: function () {
+            if (!this.type.is(types_1.TYPE.RGB) && this.data.h !== undefined)
+                return this.data.h;
+            this._ensureRGB();
+            return utils_1.default.channel.rgb2hsl(this.data, 'h');
+        },
+        set: function (h) {
+            this.type.set(types_1.TYPE.HSL);
+            this.changed = true;
+            this.data.h = h;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(Channels.prototype, "s", {
+        get: function () {
+            if (!this.type.is(types_1.TYPE.RGB) && this.data.s !== undefined)
+                return this.data.s;
+            this._ensureRGB();
+            return utils_1.default.channel.rgb2hsl(this.data, 's');
+        },
+        set: function (s) {
+            this.type.set(types_1.TYPE.HSL);
+            this.changed = true;
+            this.data.s = s;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(Channels.prototype, "l", {
+        get: function () {
+            if (!this.type.is(types_1.TYPE.RGB) && this.data.l !== undefined)
+                return this.data.l;
+            this._ensureRGB();
+            return utils_1.default.channel.rgb2hsl(this.data, 'l');
+        },
+        set: function (l) {
+            this.type.set(types_1.TYPE.HSL);
+            this.changed = true;
+            this.data.l = l;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    Object.defineProperty(Channels.prototype, "a", {
+        get: function () {
+            return this.data.a;
+        },
+        set: function (a) {
+            this.changed = true;
+            this.data.a = a;
+        },
+        enumerable: true,
+        configurable: true
+    });
+    return Channels;
+}());
+/* EXPORT */
+exports.default = Channels;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/channels/reusable.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/khroma/dist/channels/reusable.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var _1 = __webpack_require__(/*! . */ "./node_modules/khroma/dist/channels/index.js");
+/* REUSABLE */
+var channels = new _1.default({ r: 0, g: 0, b: 0, a: 0 }, 'transparent');
+/* EXPORT */
+exports.default = channels;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/channels/type.js":
+/*!***************************************************!*\
+  !*** ./node_modules/khroma/dist/channels/type.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var types_1 = __webpack_require__(/*! ../types */ "./node_modules/khroma/dist/types.js");
+/* TYPE */
+var Type = /** @class */ (function () {
+    function Type() {
+        this.type = types_1.TYPE.ALL;
+    }
+    Type.prototype.get = function () {
+        return this.type;
+    };
+    Type.prototype.set = function (type) {
+        if (this.type && this.type !== type)
+            throw new Error('Cannot change both RGB and HSL channels at the same time');
+        this.type = type;
+    };
+    Type.prototype.reset = function () {
+        this.type = types_1.TYPE.ALL;
+    };
+    Type.prototype.is = function (type) {
+        return this.type === type;
+    };
+    return Type;
+}());
+/* EXPORT */
+exports.default = Type;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/color/hex.js":
+/*!***********************************************!*\
+  !*** ./node_modules/khroma/dist/color/hex.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var reusable_1 = __webpack_require__(/*! ../channels/reusable */ "./node_modules/khroma/dist/channels/reusable.js");
+var consts_1 = __webpack_require__(/*! ../consts */ "./node_modules/khroma/dist/consts.js");
+/* HEX */
+var Hex = {
+    /* VARIABLES */
+    re: /^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,
+    /* API */
+    parse: function (color) {
+        if (color.charCodeAt(0) !== 35)
+            return; // '#'
+        var match = color.match(Hex.re);
+        if (!match)
+            return;
+        var hex = match[1], dec = parseInt(hex, 16), length = hex.length, hasAlpha = length % 4 === 0, isFullLength = length > 4, multiplier = isFullLength ? 1 : 17, bits = isFullLength ? 8 : 4, bitsOffset = hasAlpha ? 0 : -1, mask = isFullLength ? 255 : 15;
+        return reusable_1.default.set({
+            r: ((dec >> (bits * (bitsOffset + 3))) & mask) * multiplier,
+            g: ((dec >> (bits * (bitsOffset + 2))) & mask) * multiplier,
+            b: ((dec >> (bits * (bitsOffset + 1))) & mask) * multiplier,
+            a: hasAlpha ? (dec & mask) * multiplier / 255 : 1
+        }, color);
+    },
+    stringify: function (channels) {
+        if (channels.a < 1) { // #RRGGBBAA
+            return "#" + consts_1.DEC2HEX[Math.round(channels.r)] + consts_1.DEC2HEX[Math.round(channels.g)] + consts_1.DEC2HEX[Math.round(channels.b)] + utils_1.default.unit.frac2hex(channels.a);
+        }
+        else { // #RRGGBB
+            return "#" + consts_1.DEC2HEX[Math.round(channels.r)] + consts_1.DEC2HEX[Math.round(channels.g)] + consts_1.DEC2HEX[Math.round(channels.b)];
+        }
+    }
+};
+/* EXPORT */
+exports.default = Hex;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/color/hsl.js":
+/*!***********************************************!*\
+  !*** ./node_modules/khroma/dist/color/hsl.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var reusable_1 = __webpack_require__(/*! ../channels/reusable */ "./node_modules/khroma/dist/channels/reusable.js");
+/* HSL */
+var HSL = {
+    /* VARIABLES */
+    re: /^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,
+    hueRe: /^(.+?)(deg|grad|rad|turn)$/i,
+    /* HELPERS */
+    _hue2deg: function (hue) {
+        var match = hue.match(HSL.hueRe);
+        if (match) {
+            var number = match[1], unit = match[2];
+            switch (unit) {
+                case 'grad': return utils_1.default.channel.clamp.h(parseFloat(number) * .9);
+                case 'rad': return utils_1.default.channel.clamp.h(parseFloat(number) * 180 / Math.PI);
+                case 'turn': return utils_1.default.channel.clamp.h(parseFloat(number) * 360);
+            }
+        }
+        return utils_1.default.channel.clamp.h(parseFloat(hue));
+    },
+    /* API */
+    parse: function (color) {
+        var charCode = color.charCodeAt(0);
+        if (charCode !== 104 && charCode !== 72)
+            return; // 'h'/'H'
+        var match = color.match(HSL.re);
+        if (!match)
+            return;
+        var h = match[1], s = match[2], l = match[3], a = match[4], isAlphaPercentage = match[5];
+        return reusable_1.default.set({
+            h: HSL._hue2deg(h),
+            s: utils_1.default.channel.clamp.s(parseFloat(s)),
+            l: utils_1.default.channel.clamp.l(parseFloat(l)),
+            a: a ? utils_1.default.channel.clamp.a(isAlphaPercentage ? parseFloat(a) / 100 : parseFloat(a)) : 1
+        }, color);
+    },
+    stringify: function (channels) {
+        if (channels.a < 1) { // HSLA
+            return "hsla(" + utils_1.default.lang.round(channels.h) + ", " + utils_1.default.lang.round(channels.s) + "%, " + utils_1.default.lang.round(channels.l) + "%, " + channels.a + ")";
+        }
+        else { // HSL
+            return "hsl(" + utils_1.default.lang.round(channels.h) + ", " + utils_1.default.lang.round(channels.s) + "%, " + utils_1.default.lang.round(channels.l) + "%)";
+        }
+    }
+};
+/* EXPORT */
+exports.default = HSL;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/color/index.js":
+/*!*************************************************!*\
+  !*** ./node_modules/khroma/dist/color/index.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var types_1 = __webpack_require__(/*! ../types */ "./node_modules/khroma/dist/types.js");
+var hex_1 = __webpack_require__(/*! ./hex */ "./node_modules/khroma/dist/color/hex.js");
+var keyword_1 = __webpack_require__(/*! ./keyword */ "./node_modules/khroma/dist/color/keyword.js");
+var rgb_1 = __webpack_require__(/*! ./rgb */ "./node_modules/khroma/dist/color/rgb.js");
+var hsl_1 = __webpack_require__(/*! ./hsl */ "./node_modules/khroma/dist/color/hsl.js");
+/* COLOR */
+var Color = {
+    /* VARIABLES */
+    format: {
+        keyword: keyword_1.default,
+        hex: hex_1.default,
+        rgb: rgb_1.default,
+        rgba: rgb_1.default,
+        hsl: hsl_1.default,
+        hsla: hsl_1.default
+    },
+    /* API */
+    parse: function (color) {
+        if (typeof color !== 'string')
+            return color;
+        var channels = hex_1.default.parse(color) || rgb_1.default.parse(color) || hsl_1.default.parse(color) || keyword_1.default.parse(color); // Color providers ordered with performance in mind
+        if (channels)
+            return channels;
+        throw new Error("Unsupported color format: \"" + color + "\"");
+    },
+    stringify: function (channels) {
+        // SASS returns a keyword if possible, but we avoid doing that as it's slower and doesn't really add any value
+        if (!channels.changed && channels.color)
+            return channels.color;
+        if (channels.type.is(types_1.TYPE.HSL) || channels.data.r === undefined) {
+            return hsl_1.default.stringify(channels);
+        }
+        else if (channels.a < 1 || !Number.isInteger(channels.r) || !Number.isInteger(channels.g) || !Number.isInteger(channels.b)) {
+            return rgb_1.default.stringify(channels);
+        }
+        else {
+            return hex_1.default.stringify(channels);
+        }
+    }
+};
+/* EXPORT */
+exports.default = Color;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/color/keyword.js":
+/*!***************************************************!*\
+  !*** ./node_modules/khroma/dist/color/keyword.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var hex_1 = __webpack_require__(/*! ./hex */ "./node_modules/khroma/dist/color/hex.js");
+/* KEYWORD */
+var Keyword = {
+    /* VARIABLES */
+    colors: {
+        aliceblue: '#f0f8ff',
+        antiquewhite: '#faebd7',
+        aqua: '#00ffff',
+        aquamarine: '#7fffd4',
+        azure: '#f0ffff',
+        beige: '#f5f5dc',
+        bisque: '#ffe4c4',
+        black: '#000000',
+        blanchedalmond: '#ffebcd',
+        blue: '#0000ff',
+        blueviolet: '#8a2be2',
+        brown: '#a52a2a',
+        burlywood: '#deb887',
+        cadetblue: '#5f9ea0',
+        chartreuse: '#7fff00',
+        chocolate: '#d2691e',
+        coral: '#ff7f50',
+        cornflowerblue: '#6495ed',
+        cornsilk: '#fff8dc',
+        crimson: '#dc143c',
+        cyanaqua: '#00ffff',
+        darkblue: '#00008b',
+        darkcyan: '#008b8b',
+        darkgoldenrod: '#b8860b',
+        darkgray: '#a9a9a9',
+        darkgreen: '#006400',
+        darkgrey: '#a9a9a9',
+        darkkhaki: '#bdb76b',
+        darkmagenta: '#8b008b',
+        darkolivegreen: '#556b2f',
+        darkorange: '#ff8c00',
+        darkorchid: '#9932cc',
+        darkred: '#8b0000',
+        darksalmon: '#e9967a',
+        darkseagreen: '#8fbc8f',
+        darkslateblue: '#483d8b',
+        darkslategray: '#2f4f4f',
+        darkslategrey: '#2f4f4f',
+        darkturquoise: '#00ced1',
+        darkviolet: '#9400d3',
+        deeppink: '#ff1493',
+        deepskyblue: '#00bfff',
+        dimgray: '#696969',
+        dimgrey: '#696969',
+        dodgerblue: '#1e90ff',
+        firebrick: '#b22222',
+        floralwhite: '#fffaf0',
+        forestgreen: '#228b22',
+        fuchsia: '#ff00ff',
+        gainsboro: '#dcdcdc',
+        ghostwhite: '#f8f8ff',
+        gold: '#ffd700',
+        goldenrod: '#daa520',
+        gray: '#808080',
+        green: '#008000',
+        greenyellow: '#adff2f',
+        grey: '#808080',
+        honeydew: '#f0fff0',
+        hotpink: '#ff69b4',
+        indianred: '#cd5c5c',
+        indigo: '#4b0082',
+        ivory: '#fffff0',
+        khaki: '#f0e68c',
+        lavender: '#e6e6fa',
+        lavenderblush: '#fff0f5',
+        lawngreen: '#7cfc00',
+        lemonchiffon: '#fffacd',
+        lightblue: '#add8e6',
+        lightcoral: '#f08080',
+        lightcyan: '#e0ffff',
+        lightgoldenrodyellow: '#fafad2',
+        lightgray: '#d3d3d3',
+        lightgreen: '#90ee90',
+        lightgrey: '#d3d3d3',
+        lightpink: '#ffb6c1',
+        lightsalmon: '#ffa07a',
+        lightseagreen: '#20b2aa',
+        lightskyblue: '#87cefa',
+        lightslategray: '#778899',
+        lightslategrey: '#778899',
+        lightsteelblue: '#b0c4de',
+        lightyellow: '#ffffe0',
+        lime: '#00ff00',
+        limegreen: '#32cd32',
+        linen: '#faf0e6',
+        magenta: '#ff00ff',
+        maroon: '#800000',
+        mediumaquamarine: '#66cdaa',
+        mediumblue: '#0000cd',
+        mediumorchid: '#ba55d3',
+        mediumpurple: '#9370db',
+        mediumseagreen: '#3cb371',
+        mediumslateblue: '#7b68ee',
+        mediumspringgreen: '#00fa9a',
+        mediumturquoise: '#48d1cc',
+        mediumvioletred: '#c71585',
+        midnightblue: '#191970',
+        mintcream: '#f5fffa',
+        mistyrose: '#ffe4e1',
+        moccasin: '#ffe4b5',
+        navajowhite: '#ffdead',
+        navy: '#000080',
+        oldlace: '#fdf5e6',
+        olive: '#808000',
+        olivedrab: '#6b8e23',
+        orange: '#ffa500',
+        orangered: '#ff4500',
+        orchid: '#da70d6',
+        palegoldenrod: '#eee8aa',
+        palegreen: '#98fb98',
+        paleturquoise: '#afeeee',
+        palevioletred: '#db7093',
+        papayawhip: '#ffefd5',
+        peachpuff: '#ffdab9',
+        peru: '#cd853f',
+        pink: '#ffc0cb',
+        plum: '#dda0dd',
+        powderblue: '#b0e0e6',
+        purple: '#800080',
+        rebeccapurple: '#663399',
+        red: '#ff0000',
+        rosybrown: '#bc8f8f',
+        royalblue: '#4169e1',
+        saddlebrown: '#8b4513',
+        salmon: '#fa8072',
+        sandybrown: '#f4a460',
+        seagreen: '#2e8b57',
+        seashell: '#fff5ee',
+        sienna: '#a0522d',
+        silver: '#c0c0c0',
+        skyblue: '#87ceeb',
+        slateblue: '#6a5acd',
+        slategray: '#708090',
+        slategrey: '#708090',
+        snow: '#fffafa',
+        springgreen: '#00ff7f',
+        tan: '#d2b48c',
+        teal: '#008080',
+        thistle: '#d8bfd8',
+        transparent: '#00000000',
+        turquoise: '#40e0d0',
+        violet: '#ee82ee',
+        wheat: '#f5deb3',
+        white: '#ffffff',
+        whitesmoke: '#f5f5f5',
+        yellow: '#ffff00',
+        yellowgreen: '#9acd32'
+    },
+    /* API */
+    parse: function (color) {
+        color = color.toLowerCase();
+        var hex = Keyword.colors[color];
+        if (!hex)
+            return;
+        return hex_1.default.parse(hex);
+    },
+    stringify: function (channels) {
+        var hex = hex_1.default.stringify(channels);
+        for (var name_1 in Keyword.colors) {
+            if (Keyword.colors[name_1] === hex)
+                return name_1;
+        }
+    }
+};
+/* EXPORT */
+exports.default = Keyword;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/color/rgb.js":
+/*!***********************************************!*\
+  !*** ./node_modules/khroma/dist/color/rgb.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var reusable_1 = __webpack_require__(/*! ../channels/reusable */ "./node_modules/khroma/dist/channels/reusable.js");
+/* RGB */
+var RGB = {
+    /* VARIABLES */
+    re: /^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,
+    /* API */
+    parse: function (color) {
+        var charCode = color.charCodeAt(0);
+        if (charCode !== 114 && charCode !== 82)
+            return; // 'r'/'R'
+        var match = color.match(RGB.re);
+        if (!match)
+            return;
+        var r = match[1], isRedPercentage = match[2], g = match[3], isGreenPercentage = match[4], b = match[5], isBluePercentage = match[6], a = match[7], isAlphaPercentage = match[8];
+        return reusable_1.default.set({
+            r: utils_1.default.channel.clamp.r(isRedPercentage ? parseFloat(r) * 2.55 : parseFloat(r)),
+            g: utils_1.default.channel.clamp.g(isGreenPercentage ? parseFloat(g) * 2.55 : parseFloat(g)),
+            b: utils_1.default.channel.clamp.b(isBluePercentage ? parseFloat(b) * 2.55 : parseFloat(b)),
+            a: a ? utils_1.default.channel.clamp.a(isAlphaPercentage ? parseFloat(a) / 100 : parseFloat(a)) : 1
+        }, color);
+    },
+    stringify: function (channels) {
+        if (channels.a < 1) { // RGBA
+            return "rgba(" + utils_1.default.lang.round(channels.r) + ", " + utils_1.default.lang.round(channels.g) + ", " + utils_1.default.lang.round(channels.b) + ", " + utils_1.default.lang.round(channels.a) + ")";
+        }
+        else { // RGB
+            return "rgb(" + utils_1.default.lang.round(channels.r) + ", " + utils_1.default.lang.round(channels.g) + ", " + utils_1.default.lang.round(channels.b) + ")";
+        }
+    }
+};
+/* EXPORT */
+exports.default = RGB;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/consts.js":
+/*!********************************************!*\
+  !*** ./node_modules/khroma/dist/consts.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ./utils */ "./node_modules/khroma/dist/utils/index.js");
+/* CONSTS */
+var DEC2HEX = {};
+exports.DEC2HEX = DEC2HEX;
+for (var i = 0; i <= 255; i++)
+    DEC2HEX[i] = utils_1.default.unit.dec2hex(i); // Populating dynamically, striking a balance between code size and performance
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/index.js":
+/*!*******************************************!*\
+  !*** ./node_modules/khroma/dist/index.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* EXPORT */
+function __export(m) {
+    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
+}
+Object.defineProperty(exports, "__esModule", { value: true });
+__export(__webpack_require__(/*! ./methods */ "./node_modules/khroma/dist/methods/index.js"));
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/adjust.js":
+/*!****************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/adjust.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+var change_1 = __webpack_require__(/*! ./change */ "./node_modules/khroma/dist/methods/change.js");
+/* ADJUST */
+function adjust(color, channels) {
+    var ch = color_1.default.parse(color), changes = {};
+    for (var c in channels) {
+        if (!channels[c])
+            continue;
+        changes[c] = ch[c] + channels[c];
+    }
+    return change_1.default(color, changes);
+}
+/* EXPORT */
+exports.default = adjust;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/adjust_channel.js":
+/*!************************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/adjust_channel.js ***!
+  \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+/* ADJUST CHANNEL */
+function adjustChannel(color, channel, amount) {
+    var channels = color_1.default.parse(color), amountCurrent = channels[channel], amountNext = utils_1.default.channel.clamp[channel](amountCurrent + amount);
+    if (amountCurrent !== amountNext)
+        channels[channel] = amountNext;
+    return color_1.default.stringify(channels);
+}
+/* EXPORT */
+exports.default = adjustChannel;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/alpha.js":
+/*!***************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/alpha.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var channel_1 = __webpack_require__(/*! ./channel */ "./node_modules/khroma/dist/methods/channel.js");
+/* ALPHA */
+function alpha(color) {
+    return channel_1.default(color, 'a');
+}
+/* EXPORT */
+exports.default = alpha;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/blue.js":
+/*!**************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/blue.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var channel_1 = __webpack_require__(/*! ./channel */ "./node_modules/khroma/dist/methods/channel.js");
+/* BLUE */
+function blue(color) {
+    return channel_1.default(color, 'b');
+}
+/* EXPORT */
+exports.default = blue;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/change.js":
+/*!****************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/change.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+/* CHANGE */
+function change(color, channels) {
+    var ch = color_1.default.parse(color);
+    for (var c in channels) {
+        ch[c] = utils_1.default.channel.clamp[c](channels[c]);
+    }
+    return color_1.default.stringify(ch);
+}
+/* EXPORT */
+exports.default = change;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/channel.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/channel.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+/* CHANNEL */
+function channel(color, channel) {
+    return utils_1.default.lang.round(color_1.default.parse(color)[channel]);
+}
+/* EXPORT */
+exports.default = channel;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/complement.js":
+/*!********************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/complement.js ***!
+  \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var adjust_channel_1 = __webpack_require__(/*! ./adjust_channel */ "./node_modules/khroma/dist/methods/adjust_channel.js");
+/* COMPLEMENT */
+function complement(color) {
+    return adjust_channel_1.default(color, 'h', 180);
+}
+/* EXPORT */
+exports.default = complement;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/darken.js":
+/*!****************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/darken.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var adjust_channel_1 = __webpack_require__(/*! ./adjust_channel */ "./node_modules/khroma/dist/methods/adjust_channel.js");
+/* DARKEN */
+function darken(color, amount) {
+    return adjust_channel_1.default(color, 'l', -amount);
+}
+/* EXPORT */
+exports.default = darken;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/desaturate.js":
+/*!********************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/desaturate.js ***!
+  \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var adjust_channel_1 = __webpack_require__(/*! ./adjust_channel */ "./node_modules/khroma/dist/methods/adjust_channel.js");
+/* DESATURATE */
+function desaturate(color, amount) {
+    return adjust_channel_1.default(color, 's', -amount);
+}
+/* EXPORT */
+exports.default = desaturate;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/grayscale.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/grayscale.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var change_1 = __webpack_require__(/*! ./change */ "./node_modules/khroma/dist/methods/change.js");
+/* GRAYSCALE */
+function grayscale(color) {
+    return change_1.default(color, { s: 0 });
+}
+/* EXPORT */
+exports.default = grayscale;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/green.js":
+/*!***************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/green.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var channel_1 = __webpack_require__(/*! ./channel */ "./node_modules/khroma/dist/methods/channel.js");
+/* GREEN */
+function green(color) {
+    return channel_1.default(color, 'g');
+}
+/* EXPORT */
+exports.default = green;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/hsla.js":
+/*!**************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/hsla.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var reusable_1 = __webpack_require__(/*! ../channels/reusable */ "./node_modules/khroma/dist/channels/reusable.js");
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+/* HSLA */
+function hsla(h, s, l, a) {
+    if (a === void 0) { a = 1; }
+    var channels = reusable_1.default.set({
+        h: utils_1.default.channel.clamp.h(h),
+        s: utils_1.default.channel.clamp.s(s),
+        l: utils_1.default.channel.clamp.l(l),
+        a: utils_1.default.channel.clamp.a(a)
+    });
+    return color_1.default.stringify(channels);
+}
+/* EXPORT */
+exports.default = hsla;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/hue.js":
+/*!*************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/hue.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var channel_1 = __webpack_require__(/*! ./channel */ "./node_modules/khroma/dist/methods/channel.js");
+/* HUE */
+function hue(color) {
+    return channel_1.default(color, 'h');
+}
+/* EXPORT */
+exports.default = hue;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/index.js":
+/*!***************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/index.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var rgba_1 = __webpack_require__(/*! ./rgba */ "./node_modules/khroma/dist/methods/rgba.js"); // Alias
+exports.hex = rgba_1.default;
+var rgba_2 = __webpack_require__(/*! ./rgba */ "./node_modules/khroma/dist/methods/rgba.js"); // Alias
+exports.rgb = rgba_2.default;
+var rgba_3 = __webpack_require__(/*! ./rgba */ "./node_modules/khroma/dist/methods/rgba.js");
+exports.rgba = rgba_3.default;
+var hsla_1 = __webpack_require__(/*! ./hsla */ "./node_modules/khroma/dist/methods/hsla.js"); // Alias
+exports.hsl = hsla_1.default;
+var hsla_2 = __webpack_require__(/*! ./hsla */ "./node_modules/khroma/dist/methods/hsla.js");
+exports.hsla = hsla_2.default;
+var channel_1 = __webpack_require__(/*! ./channel */ "./node_modules/khroma/dist/methods/channel.js");
+exports.channel = channel_1.default;
+var red_1 = __webpack_require__(/*! ./red */ "./node_modules/khroma/dist/methods/red.js");
+exports.red = red_1.default;
+var green_1 = __webpack_require__(/*! ./green */ "./node_modules/khroma/dist/methods/green.js");
+exports.green = green_1.default;
+var blue_1 = __webpack_require__(/*! ./blue */ "./node_modules/khroma/dist/methods/blue.js");
+exports.blue = blue_1.default;
+var hue_1 = __webpack_require__(/*! ./hue */ "./node_modules/khroma/dist/methods/hue.js");
+exports.hue = hue_1.default;
+var saturation_1 = __webpack_require__(/*! ./saturation */ "./node_modules/khroma/dist/methods/saturation.js");
+exports.saturation = saturation_1.default;
+var lightness_1 = __webpack_require__(/*! ./lightness */ "./node_modules/khroma/dist/methods/lightness.js");
+exports.lightness = lightness_1.default;
+var alpha_1 = __webpack_require__(/*! ./alpha */ "./node_modules/khroma/dist/methods/alpha.js");
+exports.alpha = alpha_1.default;
+var alpha_2 = __webpack_require__(/*! ./alpha */ "./node_modules/khroma/dist/methods/alpha.js"); // Alias
+exports.opacity = alpha_2.default;
+var luminance_1 = __webpack_require__(/*! ./luminance */ "./node_modules/khroma/dist/methods/luminance.js");
+exports.luminance = luminance_1.default;
+var is_dark_1 = __webpack_require__(/*! ./is_dark */ "./node_modules/khroma/dist/methods/is_dark.js");
+exports.isDark = is_dark_1.default;
+var is_light_1 = __webpack_require__(/*! ./is_light */ "./node_modules/khroma/dist/methods/is_light.js");
+exports.isLight = is_light_1.default;
+var is_valid_1 = __webpack_require__(/*! ./is_valid */ "./node_modules/khroma/dist/methods/is_valid.js");
+exports.isValid = is_valid_1.default;
+var saturate_1 = __webpack_require__(/*! ./saturate */ "./node_modules/khroma/dist/methods/saturate.js");
+exports.saturate = saturate_1.default;
+var desaturate_1 = __webpack_require__(/*! ./desaturate */ "./node_modules/khroma/dist/methods/desaturate.js");
+exports.desaturate = desaturate_1.default;
+var lighten_1 = __webpack_require__(/*! ./lighten */ "./node_modules/khroma/dist/methods/lighten.js");
+exports.lighten = lighten_1.default;
+var darken_1 = __webpack_require__(/*! ./darken */ "./node_modules/khroma/dist/methods/darken.js");
+exports.darken = darken_1.default;
+var opacify_1 = __webpack_require__(/*! ./opacify */ "./node_modules/khroma/dist/methods/opacify.js");
+exports.opacify = opacify_1.default;
+var opacify_2 = __webpack_require__(/*! ./opacify */ "./node_modules/khroma/dist/methods/opacify.js"); // Alias
+exports.fadeIn = opacify_2.default;
+var transparentize_1 = __webpack_require__(/*! ./transparentize */ "./node_modules/khroma/dist/methods/transparentize.js");
+exports.transparentize = transparentize_1.default;
+var transparentize_2 = __webpack_require__(/*! ./transparentize */ "./node_modules/khroma/dist/methods/transparentize.js"); // Alias
+exports.fadeOut = transparentize_2.default;
+var complement_1 = __webpack_require__(/*! ./complement */ "./node_modules/khroma/dist/methods/complement.js");
+exports.complement = complement_1.default;
+var grayscale_1 = __webpack_require__(/*! ./grayscale */ "./node_modules/khroma/dist/methods/grayscale.js");
+exports.grayscale = grayscale_1.default;
+var adjust_1 = __webpack_require__(/*! ./adjust */ "./node_modules/khroma/dist/methods/adjust.js");
+exports.adjust = adjust_1.default;
+var change_1 = __webpack_require__(/*! ./change */ "./node_modules/khroma/dist/methods/change.js");
+exports.change = change_1.default;
+var invert_1 = __webpack_require__(/*! ./invert */ "./node_modules/khroma/dist/methods/invert.js");
+exports.invert = invert_1.default;
+var mix_1 = __webpack_require__(/*! ./mix */ "./node_modules/khroma/dist/methods/mix.js");
+exports.mix = mix_1.default;
+var scale_1 = __webpack_require__(/*! ./scale */ "./node_modules/khroma/dist/methods/scale.js");
+exports.scale = scale_1.default;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/invert.js":
+/*!****************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/invert.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+var mix_1 = __webpack_require__(/*! ./mix */ "./node_modules/khroma/dist/methods/mix.js");
+/* INVERT */
+function invert(color, weight) {
+    if (weight === void 0) { weight = 100; }
+    var inverse = color_1.default.parse(color);
+    inverse.r = 255 - inverse.r;
+    inverse.g = 255 - inverse.g;
+    inverse.b = 255 - inverse.b;
+    return mix_1.default(inverse, color, weight);
+}
+/* EXPORT */
+exports.default = invert;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/is_dark.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/is_dark.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var is_light_1 = __webpack_require__(/*! ./is_light */ "./node_modules/khroma/dist/methods/is_light.js");
+/* IS DARK */
+function isDark(color) {
+    return !is_light_1.default(color);
+}
+/* EXPORT */
+exports.default = isDark;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/is_light.js":
+/*!******************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/is_light.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var luminance_1 = __webpack_require__(/*! ./luminance */ "./node_modules/khroma/dist/methods/luminance.js");
+/* IS LIGHT */
+function isLight(color) {
+    return luminance_1.default(color) >= .5;
+}
+/* EXPORT */
+exports.default = isLight;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/is_valid.js":
+/*!******************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/is_valid.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+/* IS VALID */
+function isValid(color) {
+    try {
+        color_1.default.parse(color);
+        return true;
+    }
+    catch (_a) {
+        return false;
+    }
+}
+/* EXPORT */
+exports.default = isValid;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/lighten.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/lighten.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var adjust_channel_1 = __webpack_require__(/*! ./adjust_channel */ "./node_modules/khroma/dist/methods/adjust_channel.js");
+/* LIGHTEN */
+function lighten(color, amount) {
+    return adjust_channel_1.default(color, 'l', amount);
+}
+/* EXPORT */
+exports.default = lighten;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/lightness.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/lightness.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var channel_1 = __webpack_require__(/*! ./channel */ "./node_modules/khroma/dist/methods/channel.js");
+/* LIGHTNESS */
+function lightness(color) {
+    return channel_1.default(color, 'l');
+}
+/* EXPORT */
+exports.default = lightness;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/luminance.js":
+/*!*******************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/luminance.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+/* LUMINANCE */
+//SOURCE: https://planetcalc.com/7779
+function luminance(color) {
+    var _a = color_1.default.parse(color), r = _a.r, g = _a.g, b = _a.b, luminance = .2126 * utils_1.default.channel.toLinear(r) + .7152 * utils_1.default.channel.toLinear(g) + .0722 * utils_1.default.channel.toLinear(b);
+    return utils_1.default.lang.round(luminance);
+}
+/* EXPORT */
+exports.default = luminance;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/mix.js":
+/*!*************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/mix.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+var rgba_1 = __webpack_require__(/*! ./rgba */ "./node_modules/khroma/dist/methods/rgba.js");
+/* MIX */
+//SOURCE: https://github.com/sass/dart-sass/blob/7457d2e9e7e623d9844ffd037a070cf32d39c348/lib/src/functions/color.dart#L718-L756
+function mix(color1, color2, weight) {
+    if (weight === void 0) { weight = 50; }
+    var _a = color_1.default.parse(color1), r1 = _a.r, g1 = _a.g, b1 = _a.b, a1 = _a.a, _b = color_1.default.parse(color2), r2 = _b.r, g2 = _b.g, b2 = _b.b, a2 = _b.a, weightScale = weight / 100, weightNormalized = (weightScale * 2) - 1, alphaDelta = a1 - a2, weight1combined = ((weightNormalized * alphaDelta) === -1) ? weightNormalized : (weightNormalized + alphaDelta) / (1 + weightNormalized * alphaDelta), weight1 = (weight1combined + 1) / 2, weight2 = 1 - weight1, r = (r1 * weight1) + (r2 * weight2), g = (g1 * weight1) + (g2 * weight2), b = (b1 * weight1) + (b2 * weight2), a = (a1 * weightScale) + (a2 * (1 - weightScale));
+    return rgba_1.default(r, g, b, a);
+}
+/* EXPORT */
+exports.default = mix;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/opacify.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/opacify.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var adjust_channel_1 = __webpack_require__(/*! ./adjust_channel */ "./node_modules/khroma/dist/methods/adjust_channel.js");
+/* OPACIFY */
+function opacify(color, amount) {
+    return adjust_channel_1.default(color, 'a', amount);
+}
+/* EXPORT */
+exports.default = opacify;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/red.js":
+/*!*************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/red.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var channel_1 = __webpack_require__(/*! ./channel */ "./node_modules/khroma/dist/methods/channel.js");
+/* RED */
+function red(color) {
+    return channel_1.default(color, 'r');
+}
+/* EXPORT */
+exports.default = red;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/rgba.js":
+/*!**************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/rgba.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var reusable_1 = __webpack_require__(/*! ../channels/reusable */ "./node_modules/khroma/dist/channels/reusable.js");
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+var change_1 = __webpack_require__(/*! ./change */ "./node_modules/khroma/dist/methods/change.js");
+function rgba(r, g, b, a) {
+    if (b === void 0) { b = 0; }
+    if (a === void 0) { a = 1; }
+    if (typeof r !== 'number')
+        return change_1.default(r, { a: g });
+    var channels = reusable_1.default.set({
+        r: utils_1.default.channel.clamp.r(r),
+        g: utils_1.default.channel.clamp.g(g),
+        b: utils_1.default.channel.clamp.b(b),
+        a: utils_1.default.channel.clamp.a(a)
+    });
+    return color_1.default.stringify(channels);
+}
+/* EXPORT */
+exports.default = rgba;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/saturate.js":
+/*!******************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/saturate.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var adjust_channel_1 = __webpack_require__(/*! ./adjust_channel */ "./node_modules/khroma/dist/methods/adjust_channel.js");
+/* SATURATE */
+function saturate(color, amount) {
+    return adjust_channel_1.default(color, 's', amount);
+}
+/* EXPORT */
+exports.default = saturate;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/saturation.js":
+/*!********************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/saturation.js ***!
+  \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var channel_1 = __webpack_require__(/*! ./channel */ "./node_modules/khroma/dist/methods/channel.js");
+/* SATURATION */
+function saturation(color) {
+    return channel_1.default(color, 's');
+}
+/* EXPORT */
+exports.default = saturation;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/scale.js":
+/*!***************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/scale.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var utils_1 = __webpack_require__(/*! ../utils */ "./node_modules/khroma/dist/utils/index.js");
+var color_1 = __webpack_require__(/*! ../color */ "./node_modules/khroma/dist/color/index.js");
+var adjust_1 = __webpack_require__(/*! ./adjust */ "./node_modules/khroma/dist/methods/adjust.js");
+/* SCALE */
+function scale(color, channels) {
+    var ch = color_1.default.parse(color), adjustments = {}, delta = function (amount, weight, max) { return weight > 0 ? (max - amount) * weight / 100 : amount * weight / 100; };
+    for (var c in channels) {
+        adjustments[c] = delta(ch[c], channels[c], utils_1.default.channel.max[c]);
+    }
+    return adjust_1.default(color, adjustments);
+}
+/* EXPORT */
+exports.default = scale;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/methods/transparentize.js":
+/*!************************************************************!*\
+  !*** ./node_modules/khroma/dist/methods/transparentize.js ***!
+  \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var adjust_channel_1 = __webpack_require__(/*! ./adjust_channel */ "./node_modules/khroma/dist/methods/adjust_channel.js");
+/* TRANSPARENTIZE */
+function transparentize(color, amount) {
+    return adjust_channel_1.default(color, 'a', -amount);
+}
+/* EXPORT */
+exports.default = transparentize;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/types.js":
+/*!*******************************************!*\
+  !*** ./node_modules/khroma/dist/types.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* ENUMS */
+Object.defineProperty(exports, "__esModule", { value: true });
+var TYPE;
+(function (TYPE) {
+    TYPE[TYPE["ALL"] = 0] = "ALL";
+    TYPE[TYPE["RGB"] = 1] = "RGB";
+    TYPE[TYPE["HSL"] = 2] = "HSL";
+})(TYPE || (TYPE = {}));
+exports.TYPE = TYPE;
+;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/utils/channel.js":
+/*!***************************************************!*\
+  !*** ./node_modules/khroma/dist/utils/channel.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+/* CHANNEL */
+var Channel = {
+    /* CLAMP */
+    min: {
+        r: 0,
+        g: 0,
+        b: 0,
+        s: 0,
+        l: 0,
+        a: 0
+    },
+    max: {
+        r: 255,
+        g: 255,
+        b: 255,
+        h: 360,
+        s: 100,
+        l: 100,
+        a: 1
+    },
+    clamp: {
+        r: function (r) { return r >= 255 ? 255 : (r < 0 ? 0 : r); },
+        g: function (g) { return g >= 255 ? 255 : (g < 0 ? 0 : g); },
+        b: function (b) { return b >= 255 ? 255 : (b < 0 ? 0 : b); },
+        h: function (h) { return h % 360; },
+        s: function (s) { return s >= 100 ? 100 : (s < 0 ? 0 : s); },
+        l: function (l) { return l >= 100 ? 100 : (l < 0 ? 0 : l); },
+        a: function (a) { return a >= 1 ? 1 : (a < 0 ? 0 : a); }
+    },
+    /* CONVERSION */
+    //SOURCE: https://planetcalc.com/7779
+    toLinear: function (c) {
+        var n = c / 255;
+        return c > .03928 ? Math.pow(((n + .055) / 1.055), 2.4) : n / 12.92;
+    },
+    //SOURCE: https://gist.github.com/mjackson/5311256
+    hue2rgb: function (p, q, t) {
+        if (t < 0)
+            t += 1;
+        if (t > 1)
+            t -= 1;
+        if (t < 1 / 6)
+            return p + (q - p) * 6 * t;
+        if (t < 1 / 2)
+            return q;
+        if (t < 2 / 3)
+            return p + (q - p) * (2 / 3 - t) * 6;
+        return p;
+    },
+    hsl2rgb: function (_a, channel) {
+        var h = _a.h, s = _a.s, l = _a.l;
+        if (s === 100)
+            return l * 2.55; // Achromatic
+        h /= 360;
+        s /= 100;
+        l /= 100;
+        var q = (l < .5) ? l * (1 + s) : (l + s) - (l * s), p = 2 * l - q;
+        switch (channel) {
+            case 'r': return Channel.hue2rgb(p, q, h + 1 / 3) * 255;
+            case 'g': return Channel.hue2rgb(p, q, h) * 255;
+            case 'b': return Channel.hue2rgb(p, q, h - 1 / 3) * 255;
+        }
+    },
+    rgb2hsl: function (_a, channel) {
+        var r = _a.r, g = _a.g, b = _a.b;
+        r /= 255;
+        g /= 255;
+        b /= 255;
+        var max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2;
+        if (channel === 'l')
+            return l * 100;
+        if (max === min)
+            return 0; // Achromatic
+        var d = max - min, s = (l > .5) ? d / (2 - max - min) : d / (max + min);
+        if (channel === 's')
+            return s * 100;
+        switch (max) {
+            case r: return ((g - b) / d + (g < b ? 6 : 0)) * 60;
+            case g: return ((b - r) / d + 2) * 60;
+            case b: return ((r - g) / d + 4) * 60;
+            default: return -1; //TSC: TypeScript is stupid and complains if there isn't this useless default statement
+        }
+    }
+};
+/* EXPORT */
+exports.default = Channel;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/utils/index.js":
+/*!*************************************************!*\
+  !*** ./node_modules/khroma/dist/utils/index.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* IMPORT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var channel_1 = __webpack_require__(/*! ./channel */ "./node_modules/khroma/dist/utils/channel.js");
+var lang_1 = __webpack_require__(/*! ./lang */ "./node_modules/khroma/dist/utils/lang.js");
+var unit_1 = __webpack_require__(/*! ./unit */ "./node_modules/khroma/dist/utils/unit.js");
+/* UTILS */
+var Utils = {
+    channel: channel_1.default,
+    lang: lang_1.default,
+    unit: unit_1.default
+};
+/* EXPORT */
+exports.default = Utils;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/utils/lang.js":
+/*!************************************************!*\
+  !*** ./node_modules/khroma/dist/utils/lang.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* LANG */
+Object.defineProperty(exports, "__esModule", { value: true });
+var Lang = {
+    round: function (number) {
+        return Math.round(number * 10000000000) / 10000000000;
+    }
+};
+/* EXPORT */
+exports.default = Lang;
+
+
+/***/ }),
+
+/***/ "./node_modules/khroma/dist/utils/unit.js":
+/*!************************************************!*\
+  !*** ./node_modules/khroma/dist/utils/unit.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+/* UNIT */
+Object.defineProperty(exports, "__esModule", { value: true });
+var Unit = {
+    frac2hex: function (frac) {
+        var hex = Math.round(frac * 255).toString(16);
+        return hex.length > 1 ? hex : "0" + hex;
+    },
+    dec2hex: function (dec) {
+        var hex = Math.round(dec).toString(16);
+        return hex.length > 1 ? hex : "0" + hex;
+    }
+};
+/* EXPORT */
+exports.default = Unit;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_DataView.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_DataView.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"),
+    root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/* Built-in method references that are verified to be native. */
+var DataView = getNative(root, 'DataView');
+
+module.exports = DataView;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_Hash.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/_Hash.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var hashClear = __webpack_require__(/*! ./_hashClear */ "./node_modules/lodash/_hashClear.js"),
+    hashDelete = __webpack_require__(/*! ./_hashDelete */ "./node_modules/lodash/_hashDelete.js"),
+    hashGet = __webpack_require__(/*! ./_hashGet */ "./node_modules/lodash/_hashGet.js"),
+    hashHas = __webpack_require__(/*! ./_hashHas */ "./node_modules/lodash/_hashHas.js"),
+    hashSet = __webpack_require__(/*! ./_hashSet */ "./node_modules/lodash/_hashSet.js");
+
+/**
+ * Creates a hash object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function Hash(entries) {
+  var index = -1,
+      length = entries == null ? 0 : entries.length;
+
+  this.clear();
+  while (++index < length) {
+    var entry = entries[index];
+    this.set(entry[0], entry[1]);
+  }
+}
+
+// Add methods to `Hash`.
+Hash.prototype.clear = hashClear;
+Hash.prototype['delete'] = hashDelete;
+Hash.prototype.get = hashGet;
+Hash.prototype.has = hashHas;
+Hash.prototype.set = hashSet;
+
+module.exports = Hash;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_ListCache.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_ListCache.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var listCacheClear = __webpack_require__(/*! ./_listCacheClear */ "./node_modules/lodash/_listCacheClear.js"),
+    listCacheDelete = __webpack_require__(/*! ./_listCacheDelete */ "./node_modules/lodash/_listCacheDelete.js"),
+    listCacheGet = __webpack_require__(/*! ./_listCacheGet */ "./node_modules/lodash/_listCacheGet.js"),
+    listCacheHas = __webpack_require__(/*! ./_listCacheHas */ "./node_modules/lodash/_listCacheHas.js"),
+    listCacheSet = __webpack_require__(/*! ./_listCacheSet */ "./node_modules/lodash/_listCacheSet.js");
+
+/**
+ * Creates an list cache object.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function ListCache(entries) {
+  var index = -1,
+      length = entries == null ? 0 : entries.length;
+
+  this.clear();
+  while (++index < length) {
+    var entry = entries[index];
+    this.set(entry[0], entry[1]);
+  }
+}
+
+// Add methods to `ListCache`.
+ListCache.prototype.clear = listCacheClear;
+ListCache.prototype['delete'] = listCacheDelete;
+ListCache.prototype.get = listCacheGet;
+ListCache.prototype.has = listCacheHas;
+ListCache.prototype.set = listCacheSet;
+
+module.exports = ListCache;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_Map.js":
+/*!*************************************!*\
+  !*** ./node_modules/lodash/_Map.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"),
+    root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/* Built-in method references that are verified to be native. */
+var Map = getNative(root, 'Map');
+
+module.exports = Map;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_MapCache.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_MapCache.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var mapCacheClear = __webpack_require__(/*! ./_mapCacheClear */ "./node_modules/lodash/_mapCacheClear.js"),
+    mapCacheDelete = __webpack_require__(/*! ./_mapCacheDelete */ "./node_modules/lodash/_mapCacheDelete.js"),
+    mapCacheGet = __webpack_require__(/*! ./_mapCacheGet */ "./node_modules/lodash/_mapCacheGet.js"),
+    mapCacheHas = __webpack_require__(/*! ./_mapCacheHas */ "./node_modules/lodash/_mapCacheHas.js"),
+    mapCacheSet = __webpack_require__(/*! ./_mapCacheSet */ "./node_modules/lodash/_mapCacheSet.js");
+
+/**
+ * Creates a map cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function MapCache(entries) {
+  var index = -1,
+      length = entries == null ? 0 : entries.length;
+
+  this.clear();
+  while (++index < length) {
+    var entry = entries[index];
+    this.set(entry[0], entry[1]);
+  }
+}
+
+// Add methods to `MapCache`.
+MapCache.prototype.clear = mapCacheClear;
+MapCache.prototype['delete'] = mapCacheDelete;
+MapCache.prototype.get = mapCacheGet;
+MapCache.prototype.has = mapCacheHas;
+MapCache.prototype.set = mapCacheSet;
+
+module.exports = MapCache;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_Promise.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_Promise.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"),
+    root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/* Built-in method references that are verified to be native. */
+var Promise = getNative(root, 'Promise');
+
+module.exports = Promise;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_Set.js":
+/*!*************************************!*\
+  !*** ./node_modules/lodash/_Set.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"),
+    root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/* Built-in method references that are verified to be native. */
+var Set = getNative(root, 'Set');
+
+module.exports = Set;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_SetCache.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_SetCache.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js"),
+    setCacheAdd = __webpack_require__(/*! ./_setCacheAdd */ "./node_modules/lodash/_setCacheAdd.js"),
+    setCacheHas = __webpack_require__(/*! ./_setCacheHas */ "./node_modules/lodash/_setCacheHas.js");
+
+/**
+ *
+ * Creates an array cache object to store unique values.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [values] The values to cache.
+ */
+function SetCache(values) {
+  var index = -1,
+      length = values == null ? 0 : values.length;
+
+  this.__data__ = new MapCache;
+  while (++index < length) {
+    this.add(values[index]);
+  }
+}
+
+// Add methods to `SetCache`.
+SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
+SetCache.prototype.has = setCacheHas;
+
+module.exports = SetCache;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_Stack.js":
+/*!***************************************!*\
+  !*** ./node_modules/lodash/_Stack.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"),
+    stackClear = __webpack_require__(/*! ./_stackClear */ "./node_modules/lodash/_stackClear.js"),
+    stackDelete = __webpack_require__(/*! ./_stackDelete */ "./node_modules/lodash/_stackDelete.js"),
+    stackGet = __webpack_require__(/*! ./_stackGet */ "./node_modules/lodash/_stackGet.js"),
+    stackHas = __webpack_require__(/*! ./_stackHas */ "./node_modules/lodash/_stackHas.js"),
+    stackSet = __webpack_require__(/*! ./_stackSet */ "./node_modules/lodash/_stackSet.js");
+
+/**
+ * Creates a stack cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [entries] The key-value pairs to cache.
+ */
+function Stack(entries) {
+  var data = this.__data__ = new ListCache(entries);
+  this.size = data.size;
+}
+
+// Add methods to `Stack`.
+Stack.prototype.clear = stackClear;
+Stack.prototype['delete'] = stackDelete;
+Stack.prototype.get = stackGet;
+Stack.prototype.has = stackHas;
+Stack.prototype.set = stackSet;
+
+module.exports = Stack;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_Symbol.js":
+/*!****************************************!*\
+  !*** ./node_modules/lodash/_Symbol.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/** Built-in value references. */
+var Symbol = root.Symbol;
+
+module.exports = Symbol;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_Uint8Array.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_Uint8Array.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/** Built-in value references. */
+var Uint8Array = root.Uint8Array;
+
+module.exports = Uint8Array;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_WeakMap.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_WeakMap.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js"),
+    root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/* Built-in method references that are verified to be native. */
+var WeakMap = getNative(root, 'WeakMap');
+
+module.exports = WeakMap;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_apply.js":
+/*!***************************************!*\
+  !*** ./node_modules/lodash/_apply.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * A faster alternative to `Function#apply`, this function invokes `func`
+ * with the `this` binding of `thisArg` and the arguments of `args`.
+ *
+ * @private
+ * @param {Function} func The function to invoke.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {Array} args The arguments to invoke `func` with.
+ * @returns {*} Returns the result of `func`.
+ */
+function apply(func, thisArg, args) {
+  switch (args.length) {
+    case 0: return func.call(thisArg);
+    case 1: return func.call(thisArg, args[0]);
+    case 2: return func.call(thisArg, args[0], args[1]);
+    case 3: return func.call(thisArg, args[0], args[1], args[2]);
+  }
+  return func.apply(thisArg, args);
+}
+
+module.exports = apply;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_arrayEach.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_arrayEach.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * A specialized version of `_.forEach` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
+function arrayEach(array, iteratee) {
+  var index = -1,
+      length = array == null ? 0 : array.length;
+
+  while (++index < length) {
+    if (iteratee(array[index], index, array) === false) {
+      break;
+    }
+  }
+  return array;
+}
+
+module.exports = arrayEach;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_arrayFilter.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_arrayFilter.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * A specialized version of `_.filter` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ */
+function arrayFilter(array, predicate) {
+  var index = -1,
+      length = array == null ? 0 : array.length,
+      resIndex = 0,
+      result = [];
+
+  while (++index < length) {
+    var value = array[index];
+    if (predicate(value, index, array)) {
+      result[resIndex++] = value;
+    }
+  }
+  return result;
+}
+
+module.exports = arrayFilter;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_arrayIncludes.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_arrayIncludes.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIndexOf = __webpack_require__(/*! ./_baseIndexOf */ "./node_modules/lodash/_baseIndexOf.js");
+
+/**
+ * A specialized version of `_.includes` for arrays without support for
+ * specifying an index to search from.
+ *
+ * @private
+ * @param {Array} [array] The array to inspect.
+ * @param {*} target The value to search for.
+ * @returns {boolean} Returns `true` if `target` is found, else `false`.
+ */
+function arrayIncludes(array, value) {
+  var length = array == null ? 0 : array.length;
+  return !!length && baseIndexOf(array, value, 0) > -1;
+}
+
+module.exports = arrayIncludes;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_arrayIncludesWith.js":
+/*!***************************************************!*\
+  !*** ./node_modules/lodash/_arrayIncludesWith.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * This function is like `arrayIncludes` except that it accepts a comparator.
+ *
+ * @private
+ * @param {Array} [array] The array to inspect.
+ * @param {*} target The value to search for.
+ * @param {Function} comparator The comparator invoked per element.
+ * @returns {boolean} Returns `true` if `target` is found, else `false`.
+ */
+function arrayIncludesWith(array, value, comparator) {
+  var index = -1,
+      length = array == null ? 0 : array.length;
+
+  while (++index < length) {
+    if (comparator(value, array[index])) {
+      return true;
+    }
+  }
+  return false;
+}
+
+module.exports = arrayIncludesWith;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_arrayLikeKeys.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_arrayLikeKeys.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseTimes = __webpack_require__(/*! ./_baseTimes */ "./node_modules/lodash/_baseTimes.js"),
+    isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"),
+    isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"),
+    isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js");
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Creates an array of the enumerable property names of the array-like `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @param {boolean} inherited Specify returning inherited property names.
+ * @returns {Array} Returns the array of property names.
+ */
+function arrayLikeKeys(value, inherited) {
+  var isArr = isArray(value),
+      isArg = !isArr && isArguments(value),
+      isBuff = !isArr && !isArg && isBuffer(value),
+      isType = !isArr && !isArg && !isBuff && isTypedArray(value),
+      skipIndexes = isArr || isArg || isBuff || isType,
+      result = skipIndexes ? baseTimes(value.length, String) : [],
+      length = result.length;
+
+  for (var key in value) {
+    if ((inherited || hasOwnProperty.call(value, key)) &&
+        !(skipIndexes && (
+           // Safari 9 has enumerable `arguments.length` in strict mode.
+           key == 'length' ||
+           // Node.js 0.10 has enumerable non-index properties on buffers.
+           (isBuff && (key == 'offset' || key == 'parent')) ||
+           // PhantomJS 2 has enumerable non-index properties on typed arrays.
+           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
+           // Skip index properties.
+           isIndex(key, length)
+        ))) {
+      result.push(key);
+    }
+  }
+  return result;
+}
+
+module.exports = arrayLikeKeys;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_arrayMap.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_arrayMap.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * A specialized version of `_.map` for arrays without support for iteratee
+ * shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
+function arrayMap(array, iteratee) {
+  var index = -1,
+      length = array == null ? 0 : array.length,
+      result = Array(length);
+
+  while (++index < length) {
+    result[index] = iteratee(array[index], index, array);
+  }
+  return result;
+}
+
+module.exports = arrayMap;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_arrayPush.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_arrayPush.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Appends the elements of `values` to `array`.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {Array} values The values to append.
+ * @returns {Array} Returns `array`.
+ */
+function arrayPush(array, values) {
+  var index = -1,
+      length = values.length,
+      offset = array.length;
+
+  while (++index < length) {
+    array[offset + index] = values[index];
+  }
+  return array;
+}
+
+module.exports = arrayPush;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_arrayReduce.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_arrayReduce.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * A specialized version of `_.reduce` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initAccum] Specify using the first element of `array` as
+ *  the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
+function arrayReduce(array, iteratee, accumulator, initAccum) {
+  var index = -1,
+      length = array == null ? 0 : array.length;
+
+  if (initAccum && length) {
+    accumulator = array[++index];
+  }
+  while (++index < length) {
+    accumulator = iteratee(accumulator, array[index], index, array);
+  }
+  return accumulator;
+}
+
+module.exports = arrayReduce;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_arraySome.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_arraySome.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * A specialized version of `_.some` for arrays without support for iteratee
+ * shorthands.
+ *
+ * @private
+ * @param {Array} [array] The array to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {boolean} Returns `true` if any element passes the predicate check,
+ *  else `false`.
+ */
+function arraySome(array, predicate) {
+  var index = -1,
+      length = array == null ? 0 : array.length;
+
+  while (++index < length) {
+    if (predicate(array[index], index, array)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+module.exports = arraySome;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_asciiSize.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_asciiSize.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js");
+
+/**
+ * Gets the size of an ASCII `string`.
+ *
+ * @private
+ * @param {string} string The string inspect.
+ * @returns {number} Returns the string size.
+ */
+var asciiSize = baseProperty('length');
+
+module.exports = asciiSize;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_assignMergeValue.js":
+/*!**************************************************!*\
+  !*** ./node_modules/lodash/_assignMergeValue.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"),
+    eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js");
+
+/**
+ * This function is like `assignValue` except that it doesn't assign
+ * `undefined` values.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+function assignMergeValue(object, key, value) {
+  if ((value !== undefined && !eq(object[key], value)) ||
+      (value === undefined && !(key in object))) {
+    baseAssignValue(object, key, value);
+  }
+}
+
+module.exports = assignMergeValue;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_assignValue.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_assignValue.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"),
+    eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js");
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Assigns `value` to `key` of `object` if the existing value is not equivalent
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+function assignValue(object, key, value) {
+  var objValue = object[key];
+  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
+      (value === undefined && !(key in object))) {
+    baseAssignValue(object, key, value);
+  }
+}
+
+module.exports = assignValue;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_assocIndexOf.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_assocIndexOf.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js");
+
+/**
+ * Gets the index at which the `key` is found in `array` of key-value pairs.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} key The key to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+function assocIndexOf(array, key) {
+  var length = array.length;
+  while (length--) {
+    if (eq(array[length][0], key)) {
+      return length;
+    }
+  }
+  return -1;
+}
+
+module.exports = assocIndexOf;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseAssign.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_baseAssign.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"),
+    keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js");
+
+/**
+ * The base implementation of `_.assign` without support for multiple sources
+ * or `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+function baseAssign(object, source) {
+  return object && copyObject(source, keys(source), object);
+}
+
+module.exports = baseAssign;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseAssignIn.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_baseAssignIn.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"),
+    keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js");
+
+/**
+ * The base implementation of `_.assignIn` without support for multiple sources
+ * or `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+function baseAssignIn(object, source) {
+  return object && copyObject(source, keysIn(source), object);
+}
+
+module.exports = baseAssignIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseAssignValue.js":
+/*!*************************************************!*\
+  !*** ./node_modules/lodash/_baseAssignValue.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js");
+
+/**
+ * The base implementation of `assignValue` and `assignMergeValue` without
+ * value checks.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+function baseAssignValue(object, key, value) {
+  if (key == '__proto__' && defineProperty) {
+    defineProperty(object, key, {
+      'configurable': true,
+      'enumerable': true,
+      'value': value,
+      'writable': true
+    });
+  } else {
+    object[key] = value;
+  }
+}
+
+module.exports = baseAssignValue;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseClone.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_baseClone.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"),
+    arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"),
+    assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"),
+    baseAssign = __webpack_require__(/*! ./_baseAssign */ "./node_modules/lodash/_baseAssign.js"),
+    baseAssignIn = __webpack_require__(/*! ./_baseAssignIn */ "./node_modules/lodash/_baseAssignIn.js"),
+    cloneBuffer = __webpack_require__(/*! ./_cloneBuffer */ "./node_modules/lodash/_cloneBuffer.js"),
+    copyArray = __webpack_require__(/*! ./_copyArray */ "./node_modules/lodash/_copyArray.js"),
+    copySymbols = __webpack_require__(/*! ./_copySymbols */ "./node_modules/lodash/_copySymbols.js"),
+    copySymbolsIn = __webpack_require__(/*! ./_copySymbolsIn */ "./node_modules/lodash/_copySymbolsIn.js"),
+    getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js"),
+    getAllKeysIn = __webpack_require__(/*! ./_getAllKeysIn */ "./node_modules/lodash/_getAllKeysIn.js"),
+    getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"),
+    initCloneArray = __webpack_require__(/*! ./_initCloneArray */ "./node_modules/lodash/_initCloneArray.js"),
+    initCloneByTag = __webpack_require__(/*! ./_initCloneByTag */ "./node_modules/lodash/_initCloneByTag.js"),
+    initCloneObject = __webpack_require__(/*! ./_initCloneObject */ "./node_modules/lodash/_initCloneObject.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"),
+    isMap = __webpack_require__(/*! ./isMap */ "./node_modules/lodash/isMap.js"),
+    isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"),
+    isSet = __webpack_require__(/*! ./isSet */ "./node_modules/lodash/isSet.js"),
+    keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js");
+
+/** Used to compose bitmasks for cloning. */
+var CLONE_DEEP_FLAG = 1,
+    CLONE_FLAT_FLAG = 2,
+    CLONE_SYMBOLS_FLAG = 4;
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]',
+    arrayTag = '[object Array]',
+    boolTag = '[object Boolean]',
+    dateTag = '[object Date]',
+    errorTag = '[object Error]',
+    funcTag = '[object Function]',
+    genTag = '[object GeneratorFunction]',
+    mapTag = '[object Map]',
+    numberTag = '[object Number]',
+    objectTag = '[object Object]',
+    regexpTag = '[object RegExp]',
+    setTag = '[object Set]',
+    stringTag = '[object String]',
+    symbolTag = '[object Symbol]',
+    weakMapTag = '[object WeakMap]';
+
+var arrayBufferTag = '[object ArrayBuffer]',
+    dataViewTag = '[object DataView]',
+    float32Tag = '[object Float32Array]',
+    float64Tag = '[object Float64Array]',
+    int8Tag = '[object Int8Array]',
+    int16Tag = '[object Int16Array]',
+    int32Tag = '[object Int32Array]',
+    uint8Tag = '[object Uint8Array]',
+    uint8ClampedTag = '[object Uint8ClampedArray]',
+    uint16Tag = '[object Uint16Array]',
+    uint32Tag = '[object Uint32Array]';
+
+/** Used to identify `toStringTag` values supported by `_.clone`. */
+var cloneableTags = {};
+cloneableTags[argsTag] = cloneableTags[arrayTag] =
+cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
+cloneableTags[boolTag] = cloneableTags[dateTag] =
+cloneableTags[float32Tag] = cloneableTags[float64Tag] =
+cloneableTags[int8Tag] = cloneableTags[int16Tag] =
+cloneableTags[int32Tag] = cloneableTags[mapTag] =
+cloneableTags[numberTag] = cloneableTags[objectTag] =
+cloneableTags[regexpTag] = cloneableTags[setTag] =
+cloneableTags[stringTag] = cloneableTags[symbolTag] =
+cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
+cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
+cloneableTags[errorTag] = cloneableTags[funcTag] =
+cloneableTags[weakMapTag] = false;
+
+/**
+ * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+ * traversed objects.
+ *
+ * @private
+ * @param {*} value The value to clone.
+ * @param {boolean} bitmask The bitmask flags.
+ *  1 - Deep clone
+ *  2 - Flatten inherited properties
+ *  4 - Clone symbols
+ * @param {Function} [customizer] The function to customize cloning.
+ * @param {string} [key] The key of `value`.
+ * @param {Object} [object] The parent object of `value`.
+ * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+ * @returns {*} Returns the cloned value.
+ */
+function baseClone(value, bitmask, customizer, key, object, stack) {
+  var result,
+      isDeep = bitmask & CLONE_DEEP_FLAG,
+      isFlat = bitmask & CLONE_FLAT_FLAG,
+      isFull = bitmask & CLONE_SYMBOLS_FLAG;
+
+  if (customizer) {
+    result = object ? customizer(value, key, object, stack) : customizer(value);
+  }
+  if (result !== undefined) {
+    return result;
+  }
+  if (!isObject(value)) {
+    return value;
+  }
+  var isArr = isArray(value);
+  if (isArr) {
+    result = initCloneArray(value);
+    if (!isDeep) {
+      return copyArray(value, result);
+    }
+  } else {
+    var tag = getTag(value),
+        isFunc = tag == funcTag || tag == genTag;
+
+    if (isBuffer(value)) {
+      return cloneBuffer(value, isDeep);
+    }
+    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
+      result = (isFlat || isFunc) ? {} : initCloneObject(value);
+      if (!isDeep) {
+        return isFlat
+          ? copySymbolsIn(value, baseAssignIn(result, value))
+          : copySymbols(value, baseAssign(result, value));
+      }
+    } else {
+      if (!cloneableTags[tag]) {
+        return object ? value : {};
+      }
+      result = initCloneByTag(value, tag, isDeep);
+    }
+  }
+  // Check for circular references and return its corresponding clone.
+  stack || (stack = new Stack);
+  var stacked = stack.get(value);
+  if (stacked) {
+    return stacked;
+  }
+  stack.set(value, result);
+
+  if (isSet(value)) {
+    value.forEach(function(subValue) {
+      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
+    });
+  } else if (isMap(value)) {
+    value.forEach(function(subValue, key) {
+      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
+    });
+  }
+
+  var keysFunc = isFull
+    ? (isFlat ? getAllKeysIn : getAllKeys)
+    : (isFlat ? keysIn : keys);
+
+  var props = isArr ? undefined : keysFunc(value);
+  arrayEach(props || value, function(subValue, key) {
+    if (props) {
+      key = subValue;
+      subValue = value[key];
+    }
+    // Recursively populate clone (susceptible to call stack limits).
+    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
+  });
+  return result;
+}
+
+module.exports = baseClone;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseCreate.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_baseCreate.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js");
+
+/** Built-in value references. */
+var objectCreate = Object.create;
+
+/**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} proto The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
+var baseCreate = (function() {
+  function object() {}
+  return function(proto) {
+    if (!isObject(proto)) {
+      return {};
+    }
+    if (objectCreate) {
+      return objectCreate(proto);
+    }
+    object.prototype = proto;
+    var result = new object;
+    object.prototype = undefined;
+    return result;
+  };
+}());
+
+module.exports = baseCreate;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseEach.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_baseEach.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"),
+    createBaseEach = __webpack_require__(/*! ./_createBaseEach */ "./node_modules/lodash/_createBaseEach.js");
+
+/**
+ * The base implementation of `_.forEach` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ */
+var baseEach = createBaseEach(baseForOwn);
+
+module.exports = baseEach;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseExtremum.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_baseExtremum.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js");
+
+/**
+ * The base implementation of methods like `_.max` and `_.min` which accepts a
+ * `comparator` to determine the extremum value.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The iteratee invoked per iteration.
+ * @param {Function} comparator The comparator used to compare values.
+ * @returns {*} Returns the extremum value.
+ */
+function baseExtremum(array, iteratee, comparator) {
+  var index = -1,
+      length = array.length;
+
+  while (++index < length) {
+    var value = array[index],
+        current = iteratee(value);
+
+    if (current != null && (computed === undefined
+          ? (current === current && !isSymbol(current))
+          : comparator(current, computed)
+        )) {
+      var computed = current,
+          result = value;
+    }
+  }
+  return result;
+}
+
+module.exports = baseExtremum;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseFilter.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_baseFilter.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js");
+
+/**
+ * The base implementation of `_.filter` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} predicate The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ */
+function baseFilter(collection, predicate) {
+  var result = [];
+  baseEach(collection, function(value, index, collection) {
+    if (predicate(value, index, collection)) {
+      result.push(value);
+    }
+  });
+  return result;
+}
+
+module.exports = baseFilter;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseFindIndex.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_baseFindIndex.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.findIndex` and `_.findLastIndex` without
+ * support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {number} fromIndex The index to search from.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+function baseFindIndex(array, predicate, fromIndex, fromRight) {
+  var length = array.length,
+      index = fromIndex + (fromRight ? 1 : -1);
+
+  while ((fromRight ? index-- : ++index < length)) {
+    if (predicate(array[index], index, array)) {
+      return index;
+    }
+  }
+  return -1;
+}
+
+module.exports = baseFindIndex;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseFlatten.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_baseFlatten.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"),
+    isFlattenable = __webpack_require__(/*! ./_isFlattenable */ "./node_modules/lodash/_isFlattenable.js");
+
+/**
+ * The base implementation of `_.flatten` with support for restricting flattening.
+ *
+ * @private
+ * @param {Array} array The array to flatten.
+ * @param {number} depth The maximum recursion depth.
+ * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
+ * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
+ * @param {Array} [result=[]] The initial result value.
+ * @returns {Array} Returns the new flattened array.
+ */
+function baseFlatten(array, depth, predicate, isStrict, result) {
+  var index = -1,
+      length = array.length;
+
+  predicate || (predicate = isFlattenable);
+  result || (result = []);
+
+  while (++index < length) {
+    var value = array[index];
+    if (depth > 0 && predicate(value)) {
+      if (depth > 1) {
+        // Recursively flatten arrays (susceptible to call stack limits).
+        baseFlatten(value, depth - 1, predicate, isStrict, result);
+      } else {
+        arrayPush(result, value);
+      }
+    } else if (!isStrict) {
+      result[result.length] = value;
+    }
+  }
+  return result;
+}
+
+module.exports = baseFlatten;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseFor.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_baseFor.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createBaseFor = __webpack_require__(/*! ./_createBaseFor */ "./node_modules/lodash/_createBaseFor.js");
+
+/**
+ * The base implementation of `baseForOwn` which iterates over `object`
+ * properties returned by `keysFunc` and invokes `iteratee` for each property.
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */
+var baseFor = createBaseFor();
+
+module.exports = baseFor;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseForOwn.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_baseForOwn.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"),
+    keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js");
+
+/**
+ * The base implementation of `_.forOwn` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
+function baseForOwn(object, iteratee) {
+  return object && baseFor(object, iteratee, keys);
+}
+
+module.exports = baseForOwn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseGet.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_baseGet.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"),
+    toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js");
+
+/**
+ * The base implementation of `_.get` without support for default values.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @returns {*} Returns the resolved value.
+ */
+function baseGet(object, path) {
+  path = castPath(path, object);
+
+  var index = 0,
+      length = path.length;
+
+  while (object != null && index < length) {
+    object = object[toKey(path[index++])];
+  }
+  return (index && index == length) ? object : undefined;
+}
+
+module.exports = baseGet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseGetAllKeys.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_baseGetAllKeys.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js");
+
+/**
+ * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
+ * `keysFunc` and `symbolsFunc` to get the enumerable property names and
+ * symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @param {Function} symbolsFunc The function to get the symbols of `object`.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
+function baseGetAllKeys(object, keysFunc, symbolsFunc) {
+  var result = keysFunc(object);
+  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
+}
+
+module.exports = baseGetAllKeys;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseGetTag.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_baseGetTag.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"),
+    getRawTag = __webpack_require__(/*! ./_getRawTag */ "./node_modules/lodash/_getRawTag.js"),
+    objectToString = __webpack_require__(/*! ./_objectToString */ "./node_modules/lodash/_objectToString.js");
+
+/** `Object#toString` result references. */
+var nullTag = '[object Null]',
+    undefinedTag = '[object Undefined]';
+
+/** Built-in value references. */
+var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+
+/**
+ * The base implementation of `getTag` without fallbacks for buggy environments.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+function baseGetTag(value) {
+  if (value == null) {
+    return value === undefined ? undefinedTag : nullTag;
+  }
+  return (symToStringTag && symToStringTag in Object(value))
+    ? getRawTag(value)
+    : objectToString(value);
+}
+
+module.exports = baseGetTag;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseGt.js":
+/*!****************************************!*\
+  !*** ./node_modules/lodash/_baseGt.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.gt` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is greater than `other`,
+ *  else `false`.
+ */
+function baseGt(value, other) {
+  return value > other;
+}
+
+module.exports = baseGt;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseHas.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_baseHas.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * The base implementation of `_.has` without support for deep paths.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {Array|string} key The key to check.
+ * @returns {boolean} Returns `true` if `key` exists, else `false`.
+ */
+function baseHas(object, key) {
+  return object != null && hasOwnProperty.call(object, key);
+}
+
+module.exports = baseHas;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseHasIn.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_baseHasIn.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.hasIn` without support for deep paths.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {Array|string} key The key to check.
+ * @returns {boolean} Returns `true` if `key` exists, else `false`.
+ */
+function baseHasIn(object, key) {
+  return object != null && key in Object(object);
+}
+
+module.exports = baseHasIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIndexOf.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_baseIndexOf.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"),
+    baseIsNaN = __webpack_require__(/*! ./_baseIsNaN */ "./node_modules/lodash/_baseIsNaN.js"),
+    strictIndexOf = __webpack_require__(/*! ./_strictIndexOf */ "./node_modules/lodash/_strictIndexOf.js");
+
+/**
+ * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+function baseIndexOf(array, value, fromIndex) {
+  return value === value
+    ? strictIndexOf(array, value, fromIndex)
+    : baseFindIndex(array, baseIsNaN, fromIndex);
+}
+
+module.exports = baseIndexOf;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIsArguments.js":
+/*!*************************************************!*\
+  !*** ./node_modules/lodash/_baseIsArguments.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]';
+
+/**
+ * The base implementation of `_.isArguments`.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ */
+function baseIsArguments(value) {
+  return isObjectLike(value) && baseGetTag(value) == argsTag;
+}
+
+module.exports = baseIsArguments;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIsEqual.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_baseIsEqual.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsEqualDeep = __webpack_require__(/*! ./_baseIsEqualDeep */ "./node_modules/lodash/_baseIsEqualDeep.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/**
+ * The base implementation of `_.isEqual` which supports partial comparisons
+ * and tracks traversed objects.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @param {boolean} bitmask The bitmask flags.
+ *  1 - Unordered comparison
+ *  2 - Partial comparison
+ * @param {Function} [customizer] The function to customize comparisons.
+ * @param {Object} [stack] Tracks traversed `value` and `other` objects.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ */
+function baseIsEqual(value, other, bitmask, customizer, stack) {
+  if (value === other) {
+    return true;
+  }
+  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
+    return value !== value && other !== other;
+  }
+  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
+}
+
+module.exports = baseIsEqual;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIsEqualDeep.js":
+/*!*************************************************!*\
+  !*** ./node_modules/lodash/_baseIsEqualDeep.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"),
+    equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"),
+    equalByTag = __webpack_require__(/*! ./_equalByTag */ "./node_modules/lodash/_equalByTag.js"),
+    equalObjects = __webpack_require__(/*! ./_equalObjects */ "./node_modules/lodash/_equalObjects.js"),
+    getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"),
+    isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js");
+
+/** Used to compose bitmasks for value comparisons. */
+var COMPARE_PARTIAL_FLAG = 1;
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]',
+    arrayTag = '[object Array]',
+    objectTag = '[object Object]';
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * A specialized version of `baseIsEqual` for arrays and objects which performs
+ * deep comparisons and tracks traversed objects enabling objects with circular
+ * references to be compared.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} [stack] Tracks traversed `object` and `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
+  var objIsArr = isArray(object),
+      othIsArr = isArray(other),
+      objTag = objIsArr ? arrayTag : getTag(object),
+      othTag = othIsArr ? arrayTag : getTag(other);
+
+  objTag = objTag == argsTag ? objectTag : objTag;
+  othTag = othTag == argsTag ? objectTag : othTag;
+
+  var objIsObj = objTag == objectTag,
+      othIsObj = othTag == objectTag,
+      isSameTag = objTag == othTag;
+
+  if (isSameTag && isBuffer(object)) {
+    if (!isBuffer(other)) {
+      return false;
+    }
+    objIsArr = true;
+    objIsObj = false;
+  }
+  if (isSameTag && !objIsObj) {
+    stack || (stack = new Stack);
+    return (objIsArr || isTypedArray(object))
+      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
+      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
+  }
+  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
+    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+
+    if (objIsWrapped || othIsWrapped) {
+      var objUnwrapped = objIsWrapped ? object.value() : object,
+          othUnwrapped = othIsWrapped ? other.value() : other;
+
+      stack || (stack = new Stack);
+      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
+    }
+  }
+  if (!isSameTag) {
+    return false;
+  }
+  stack || (stack = new Stack);
+  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
+}
+
+module.exports = baseIsEqualDeep;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIsMap.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_baseIsMap.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/** `Object#toString` result references. */
+var mapTag = '[object Map]';
+
+/**
+ * The base implementation of `_.isMap` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+ */
+function baseIsMap(value) {
+  return isObjectLike(value) && getTag(value) == mapTag;
+}
+
+module.exports = baseIsMap;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIsMatch.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_baseIsMatch.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"),
+    baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js");
+
+/** Used to compose bitmasks for value comparisons. */
+var COMPARE_PARTIAL_FLAG = 1,
+    COMPARE_UNORDERED_FLAG = 2;
+
+/**
+ * The base implementation of `_.isMatch` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The object to inspect.
+ * @param {Object} source The object of property values to match.
+ * @param {Array} matchData The property names, values, and compare flags to match.
+ * @param {Function} [customizer] The function to customize comparisons.
+ * @returns {boolean} Returns `true` if `object` is a match, else `false`.
+ */
+function baseIsMatch(object, source, matchData, customizer) {
+  var index = matchData.length,
+      length = index,
+      noCustomizer = !customizer;
+
+  if (object == null) {
+    return !length;
+  }
+  object = Object(object);
+  while (index--) {
+    var data = matchData[index];
+    if ((noCustomizer && data[2])
+          ? data[1] !== object[data[0]]
+          : !(data[0] in object)
+        ) {
+      return false;
+    }
+  }
+  while (++index < length) {
+    data = matchData[index];
+    var key = data[0],
+        objValue = object[key],
+        srcValue = data[1];
+
+    if (noCustomizer && data[2]) {
+      if (objValue === undefined && !(key in object)) {
+        return false;
+      }
+    } else {
+      var stack = new Stack;
+      if (customizer) {
+        var result = customizer(objValue, srcValue, key, object, source, stack);
+      }
+      if (!(result === undefined
+            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
+            : result
+          )) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
+module.exports = baseIsMatch;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIsNaN.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_baseIsNaN.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.isNaN` without support for number objects.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
+ */
+function baseIsNaN(value) {
+  return value !== value;
+}
+
+module.exports = baseIsNaN;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIsNative.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_baseIsNative.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"),
+    isMasked = __webpack_require__(/*! ./_isMasked */ "./node_modules/lodash/_isMasked.js"),
+    isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"),
+    toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js");
+
+/**
+ * Used to match `RegExp`
+ * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
+ */
+var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+
+/** Used to detect host constructors (Safari). */
+var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+/** Used for built-in method references. */
+var funcProto = Function.prototype,
+    objectProto = Object.prototype;
+
+/** Used to resolve the decompiled source of functions. */
+var funcToString = funcProto.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/** Used to detect if a method is native. */
+var reIsNative = RegExp('^' +
+  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
+  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+);
+
+/**
+ * The base implementation of `_.isNative` without bad shim checks.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function,
+ *  else `false`.
+ */
+function baseIsNative(value) {
+  if (!isObject(value) || isMasked(value)) {
+    return false;
+  }
+  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
+  return pattern.test(toSource(value));
+}
+
+module.exports = baseIsNative;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIsSet.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_baseIsSet.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/** `Object#toString` result references. */
+var setTag = '[object Set]';
+
+/**
+ * The base implementation of `_.isSet` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+ */
+function baseIsSet(value) {
+  return isObjectLike(value) && getTag(value) == setTag;
+}
+
+module.exports = baseIsSet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIsTypedArray.js":
+/*!**************************************************!*\
+  !*** ./node_modules/lodash/_baseIsTypedArray.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"),
+    isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/** `Object#toString` result references. */
+var argsTag = '[object Arguments]',
+    arrayTag = '[object Array]',
+    boolTag = '[object Boolean]',
+    dateTag = '[object Date]',
+    errorTag = '[object Error]',
+    funcTag = '[object Function]',
+    mapTag = '[object Map]',
+    numberTag = '[object Number]',
+    objectTag = '[object Object]',
+    regexpTag = '[object RegExp]',
+    setTag = '[object Set]',
+    stringTag = '[object String]',
+    weakMapTag = '[object WeakMap]';
+
+var arrayBufferTag = '[object ArrayBuffer]',
+    dataViewTag = '[object DataView]',
+    float32Tag = '[object Float32Array]',
+    float64Tag = '[object Float64Array]',
+    int8Tag = '[object Int8Array]',
+    int16Tag = '[object Int16Array]',
+    int32Tag = '[object Int32Array]',
+    uint8Tag = '[object Uint8Array]',
+    uint8ClampedTag = '[object Uint8ClampedArray]',
+    uint16Tag = '[object Uint16Array]',
+    uint32Tag = '[object Uint32Array]';
+
+/** Used to identify `toStringTag` values of typed arrays. */
+var typedArrayTags = {};
+typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
+typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
+typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
+typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
+typedArrayTags[uint32Tag] = true;
+typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
+typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
+typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
+typedArrayTags[errorTag] = typedArrayTags[funcTag] =
+typedArrayTags[mapTag] = typedArrayTags[numberTag] =
+typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
+typedArrayTags[setTag] = typedArrayTags[stringTag] =
+typedArrayTags[weakMapTag] = false;
+
+/**
+ * The base implementation of `_.isTypedArray` without Node.js optimizations.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ */
+function baseIsTypedArray(value) {
+  return isObjectLike(value) &&
+    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
+}
+
+module.exports = baseIsTypedArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseIteratee.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_baseIteratee.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseMatches = __webpack_require__(/*! ./_baseMatches */ "./node_modules/lodash/_baseMatches.js"),
+    baseMatchesProperty = __webpack_require__(/*! ./_baseMatchesProperty */ "./node_modules/lodash/_baseMatchesProperty.js"),
+    identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    property = __webpack_require__(/*! ./property */ "./node_modules/lodash/property.js");
+
+/**
+ * The base implementation of `_.iteratee`.
+ *
+ * @private
+ * @param {*} [value=_.identity] The value to convert to an iteratee.
+ * @returns {Function} Returns the iteratee.
+ */
+function baseIteratee(value) {
+  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
+  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
+  if (typeof value == 'function') {
+    return value;
+  }
+  if (value == null) {
+    return identity;
+  }
+  if (typeof value == 'object') {
+    return isArray(value)
+      ? baseMatchesProperty(value[0], value[1])
+      : baseMatches(value);
+  }
+  return property(value);
+}
+
+module.exports = baseIteratee;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseKeys.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_baseKeys.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"),
+    nativeKeys = __webpack_require__(/*! ./_nativeKeys */ "./node_modules/lodash/_nativeKeys.js");
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function baseKeys(object) {
+  if (!isPrototype(object)) {
+    return nativeKeys(object);
+  }
+  var result = [];
+  for (var key in Object(object)) {
+    if (hasOwnProperty.call(object, key) && key != 'constructor') {
+      result.push(key);
+    }
+  }
+  return result;
+}
+
+module.exports = baseKeys;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseKeysIn.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_baseKeysIn.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"),
+    isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"),
+    nativeKeysIn = __webpack_require__(/*! ./_nativeKeysIn */ "./node_modules/lodash/_nativeKeysIn.js");
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function baseKeysIn(object) {
+  if (!isObject(object)) {
+    return nativeKeysIn(object);
+  }
+  var isProto = isPrototype(object),
+      result = [];
+
+  for (var key in object) {
+    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
+      result.push(key);
+    }
+  }
+  return result;
+}
+
+module.exports = baseKeysIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseLt.js":
+/*!****************************************!*\
+  !*** ./node_modules/lodash/_baseLt.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.lt` which doesn't coerce arguments.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if `value` is less than `other`,
+ *  else `false`.
+ */
+function baseLt(value, other) {
+  return value < other;
+}
+
+module.exports = baseLt;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseMap.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_baseMap.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"),
+    isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js");
+
+/**
+ * The base implementation of `_.map` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
+function baseMap(collection, iteratee) {
+  var index = -1,
+      result = isArrayLike(collection) ? Array(collection.length) : [];
+
+  baseEach(collection, function(value, key, collection) {
+    result[++index] = iteratee(value, key, collection);
+  });
+  return result;
+}
+
+module.exports = baseMap;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseMatches.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_baseMatches.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsMatch = __webpack_require__(/*! ./_baseIsMatch */ "./node_modules/lodash/_baseIsMatch.js"),
+    getMatchData = __webpack_require__(/*! ./_getMatchData */ "./node_modules/lodash/_getMatchData.js"),
+    matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js");
+
+/**
+ * The base implementation of `_.matches` which doesn't clone `source`.
+ *
+ * @private
+ * @param {Object} source The object of property values to match.
+ * @returns {Function} Returns the new spec function.
+ */
+function baseMatches(source) {
+  var matchData = getMatchData(source);
+  if (matchData.length == 1 && matchData[0][2]) {
+    return matchesStrictComparable(matchData[0][0], matchData[0][1]);
+  }
+  return function(object) {
+    return object === source || baseIsMatch(object, source, matchData);
+  };
+}
+
+module.exports = baseMatches;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseMatchesProperty.js":
+/*!*****************************************************!*\
+  !*** ./node_modules/lodash/_baseMatchesProperty.js ***!
+  \*****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsEqual = __webpack_require__(/*! ./_baseIsEqual */ "./node_modules/lodash/_baseIsEqual.js"),
+    get = __webpack_require__(/*! ./get */ "./node_modules/lodash/get.js"),
+    hasIn = __webpack_require__(/*! ./hasIn */ "./node_modules/lodash/hasIn.js"),
+    isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"),
+    isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"),
+    matchesStrictComparable = __webpack_require__(/*! ./_matchesStrictComparable */ "./node_modules/lodash/_matchesStrictComparable.js"),
+    toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js");
+
+/** Used to compose bitmasks for value comparisons. */
+var COMPARE_PARTIAL_FLAG = 1,
+    COMPARE_UNORDERED_FLAG = 2;
+
+/**
+ * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
+ *
+ * @private
+ * @param {string} path The path of the property to get.
+ * @param {*} srcValue The value to match.
+ * @returns {Function} Returns the new spec function.
+ */
+function baseMatchesProperty(path, srcValue) {
+  if (isKey(path) && isStrictComparable(srcValue)) {
+    return matchesStrictComparable(toKey(path), srcValue);
+  }
+  return function(object) {
+    var objValue = get(object, path);
+    return (objValue === undefined && objValue === srcValue)
+      ? hasIn(object, path)
+      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
+  };
+}
+
+module.exports = baseMatchesProperty;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseMerge.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_baseMerge.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Stack = __webpack_require__(/*! ./_Stack */ "./node_modules/lodash/_Stack.js"),
+    assignMergeValue = __webpack_require__(/*! ./_assignMergeValue */ "./node_modules/lodash/_assignMergeValue.js"),
+    baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"),
+    baseMergeDeep = __webpack_require__(/*! ./_baseMergeDeep */ "./node_modules/lodash/_baseMergeDeep.js"),
+    isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"),
+    keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js"),
+    safeGet = __webpack_require__(/*! ./_safeGet */ "./node_modules/lodash/_safeGet.js");
+
+/**
+ * The base implementation of `_.merge` without support for multiple sources.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {number} srcIndex The index of `source`.
+ * @param {Function} [customizer] The function to customize merged values.
+ * @param {Object} [stack] Tracks traversed source values and their merged
+ *  counterparts.
+ */
+function baseMerge(object, source, srcIndex, customizer, stack) {
+  if (object === source) {
+    return;
+  }
+  baseFor(source, function(srcValue, key) {
+    stack || (stack = new Stack);
+    if (isObject(srcValue)) {
+      baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
+    }
+    else {
+      var newValue = customizer
+        ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
+        : undefined;
+
+      if (newValue === undefined) {
+        newValue = srcValue;
+      }
+      assignMergeValue(object, key, newValue);
+    }
+  }, keysIn);
+}
+
+module.exports = baseMerge;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseMergeDeep.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_baseMergeDeep.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var assignMergeValue = __webpack_require__(/*! ./_assignMergeValue */ "./node_modules/lodash/_assignMergeValue.js"),
+    cloneBuffer = __webpack_require__(/*! ./_cloneBuffer */ "./node_modules/lodash/_cloneBuffer.js"),
+    cloneTypedArray = __webpack_require__(/*! ./_cloneTypedArray */ "./node_modules/lodash/_cloneTypedArray.js"),
+    copyArray = __webpack_require__(/*! ./_copyArray */ "./node_modules/lodash/_copyArray.js"),
+    initCloneObject = __webpack_require__(/*! ./_initCloneObject */ "./node_modules/lodash/_initCloneObject.js"),
+    isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isArrayLikeObject = __webpack_require__(/*! ./isArrayLikeObject */ "./node_modules/lodash/isArrayLikeObject.js"),
+    isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"),
+    isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"),
+    isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"),
+    isPlainObject = __webpack_require__(/*! ./isPlainObject */ "./node_modules/lodash/isPlainObject.js"),
+    isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js"),
+    safeGet = __webpack_require__(/*! ./_safeGet */ "./node_modules/lodash/_safeGet.js"),
+    toPlainObject = __webpack_require__(/*! ./toPlainObject */ "./node_modules/lodash/toPlainObject.js");
+
+/**
+ * A specialized version of `baseMerge` for arrays and objects which performs
+ * deep merges and tracks traversed objects enabling objects with circular
+ * references to be merged.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @param {string} key The key of the value to merge.
+ * @param {number} srcIndex The index of `source`.
+ * @param {Function} mergeFunc The function to merge values.
+ * @param {Function} [customizer] The function to customize assigned values.
+ * @param {Object} [stack] Tracks traversed source values and their merged
+ *  counterparts.
+ */
+function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
+  var objValue = safeGet(object, key),
+      srcValue = safeGet(source, key),
+      stacked = stack.get(srcValue);
+
+  if (stacked) {
+    assignMergeValue(object, key, stacked);
+    return;
+  }
+  var newValue = customizer
+    ? customizer(objValue, srcValue, (key + ''), object, source, stack)
+    : undefined;
+
+  var isCommon = newValue === undefined;
+
+  if (isCommon) {
+    var isArr = isArray(srcValue),
+        isBuff = !isArr && isBuffer(srcValue),
+        isTyped = !isArr && !isBuff && isTypedArray(srcValue);
+
+    newValue = srcValue;
+    if (isArr || isBuff || isTyped) {
+      if (isArray(objValue)) {
+        newValue = objValue;
+      }
+      else if (isArrayLikeObject(objValue)) {
+        newValue = copyArray(objValue);
+      }
+      else if (isBuff) {
+        isCommon = false;
+        newValue = cloneBuffer(srcValue, true);
+      }
+      else if (isTyped) {
+        isCommon = false;
+        newValue = cloneTypedArray(srcValue, true);
+      }
+      else {
+        newValue = [];
+      }
+    }
+    else if (isPlainObject(srcValue) || isArguments(srcValue)) {
+      newValue = objValue;
+      if (isArguments(objValue)) {
+        newValue = toPlainObject(objValue);
+      }
+      else if (!isObject(objValue) || isFunction(objValue)) {
+        newValue = initCloneObject(srcValue);
+      }
+    }
+    else {
+      isCommon = false;
+    }
+  }
+  if (isCommon) {
+    // Recursively merge objects and arrays (susceptible to call stack limits).
+    stack.set(srcValue, newValue);
+    mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
+    stack['delete'](srcValue);
+  }
+  assignMergeValue(object, key, newValue);
+}
+
+module.exports = baseMergeDeep;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseOrderBy.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_baseOrderBy.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"),
+    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"),
+    baseMap = __webpack_require__(/*! ./_baseMap */ "./node_modules/lodash/_baseMap.js"),
+    baseSortBy = __webpack_require__(/*! ./_baseSortBy */ "./node_modules/lodash/_baseSortBy.js"),
+    baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"),
+    compareMultiple = __webpack_require__(/*! ./_compareMultiple */ "./node_modules/lodash/_compareMultiple.js"),
+    identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js");
+
+/**
+ * The base implementation of `_.orderBy` without param guards.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
+ * @param {string[]} orders The sort orders of `iteratees`.
+ * @returns {Array} Returns the new sorted array.
+ */
+function baseOrderBy(collection, iteratees, orders) {
+  var index = -1;
+  iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));
+
+  var result = baseMap(collection, function(value, key, collection) {
+    var criteria = arrayMap(iteratees, function(iteratee) {
+      return iteratee(value);
+    });
+    return { 'criteria': criteria, 'index': ++index, 'value': value };
+  });
+
+  return baseSortBy(result, function(object, other) {
+    return compareMultiple(object, other, orders);
+  });
+}
+
+module.exports = baseOrderBy;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_basePick.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_basePick.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var basePickBy = __webpack_require__(/*! ./_basePickBy */ "./node_modules/lodash/_basePickBy.js"),
+    hasIn = __webpack_require__(/*! ./hasIn */ "./node_modules/lodash/hasIn.js");
+
+/**
+ * The base implementation of `_.pick` without support for individual
+ * property identifiers.
+ *
+ * @private
+ * @param {Object} object The source object.
+ * @param {string[]} paths The property paths to pick.
+ * @returns {Object} Returns the new object.
+ */
+function basePick(object, paths) {
+  return basePickBy(object, paths, function(value, path) {
+    return hasIn(object, path);
+  });
+}
+
+module.exports = basePick;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_basePickBy.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_basePickBy.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js"),
+    baseSet = __webpack_require__(/*! ./_baseSet */ "./node_modules/lodash/_baseSet.js"),
+    castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js");
+
+/**
+ * The base implementation of  `_.pickBy` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The source object.
+ * @param {string[]} paths The property paths to pick.
+ * @param {Function} predicate The function invoked per property.
+ * @returns {Object} Returns the new object.
+ */
+function basePickBy(object, paths, predicate) {
+  var index = -1,
+      length = paths.length,
+      result = {};
+
+  while (++index < length) {
+    var path = paths[index],
+        value = baseGet(object, path);
+
+    if (predicate(value, path)) {
+      baseSet(result, castPath(path, object), value);
+    }
+  }
+  return result;
+}
+
+module.exports = basePickBy;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseProperty.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_baseProperty.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new accessor function.
+ */
+function baseProperty(key) {
+  return function(object) {
+    return object == null ? undefined : object[key];
+  };
+}
+
+module.exports = baseProperty;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_basePropertyDeep.js":
+/*!**************************************************!*\
+  !*** ./node_modules/lodash/_basePropertyDeep.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js");
+
+/**
+ * A specialized version of `baseProperty` which supports deep paths.
+ *
+ * @private
+ * @param {Array|string} path The path of the property to get.
+ * @returns {Function} Returns the new accessor function.
+ */
+function basePropertyDeep(path) {
+  return function(object) {
+    return baseGet(object, path);
+  };
+}
+
+module.exports = basePropertyDeep;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseRange.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_baseRange.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeCeil = Math.ceil,
+    nativeMax = Math.max;
+
+/**
+ * The base implementation of `_.range` and `_.rangeRight` which doesn't
+ * coerce arguments.
+ *
+ * @private
+ * @param {number} start The start of the range.
+ * @param {number} end The end of the range.
+ * @param {number} step The value to increment or decrement by.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Array} Returns the range of numbers.
+ */
+function baseRange(start, end, step, fromRight) {
+  var index = -1,
+      length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
+      result = Array(length);
+
+  while (length--) {
+    result[fromRight ? length : ++index] = start;
+    start += step;
+  }
+  return result;
+}
+
+module.exports = baseRange;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseReduce.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_baseReduce.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.reduce` and `_.reduceRight`, without support
+ * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} accumulator The initial value.
+ * @param {boolean} initAccum Specify using the first or last element of
+ *  `collection` as the initial value.
+ * @param {Function} eachFunc The function to iterate over `collection`.
+ * @returns {*} Returns the accumulated value.
+ */
+function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
+  eachFunc(collection, function(value, index, collection) {
+    accumulator = initAccum
+      ? (initAccum = false, value)
+      : iteratee(accumulator, value, index, collection);
+  });
+  return accumulator;
+}
+
+module.exports = baseReduce;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseRest.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_baseRest.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js"),
+    overRest = __webpack_require__(/*! ./_overRest */ "./node_modules/lodash/_overRest.js"),
+    setToString = __webpack_require__(/*! ./_setToString */ "./node_modules/lodash/_setToString.js");
+
+/**
+ * The base implementation of `_.rest` which doesn't validate or coerce arguments.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ */
+function baseRest(func, start) {
+  return setToString(overRest(func, start, identity), func + '');
+}
+
+module.exports = baseRest;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseSet.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_baseSet.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"),
+    castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"),
+    isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"),
+    isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"),
+    toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js");
+
+/**
+ * The base implementation of `_.set`.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {Array|string} path The path of the property to set.
+ * @param {*} value The value to set.
+ * @param {Function} [customizer] The function to customize path creation.
+ * @returns {Object} Returns `object`.
+ */
+function baseSet(object, path, value, customizer) {
+  if (!isObject(object)) {
+    return object;
+  }
+  path = castPath(path, object);
+
+  var index = -1,
+      length = path.length,
+      lastIndex = length - 1,
+      nested = object;
+
+  while (nested != null && ++index < length) {
+    var key = toKey(path[index]),
+        newValue = value;
+
+    if (index != lastIndex) {
+      var objValue = nested[key];
+      newValue = customizer ? customizer(objValue, key, nested) : undefined;
+      if (newValue === undefined) {
+        newValue = isObject(objValue)
+          ? objValue
+          : (isIndex(path[index + 1]) ? [] : {});
+      }
+    }
+    assignValue(nested, key, newValue);
+    nested = nested[key];
+  }
+  return object;
+}
+
+module.exports = baseSet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseSetToString.js":
+/*!*************************************************!*\
+  !*** ./node_modules/lodash/_baseSetToString.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var constant = __webpack_require__(/*! ./constant */ "./node_modules/lodash/constant.js"),
+    defineProperty = __webpack_require__(/*! ./_defineProperty */ "./node_modules/lodash/_defineProperty.js"),
+    identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js");
+
+/**
+ * The base implementation of `setToString` without support for hot loop shorting.
+ *
+ * @private
+ * @param {Function} func The function to modify.
+ * @param {Function} string The `toString` result.
+ * @returns {Function} Returns `func`.
+ */
+var baseSetToString = !defineProperty ? identity : function(func, string) {
+  return defineProperty(func, 'toString', {
+    'configurable': true,
+    'enumerable': false,
+    'value': constant(string),
+    'writable': true
+  });
+};
+
+module.exports = baseSetToString;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseSortBy.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_baseSortBy.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.sortBy` which uses `comparer` to define the
+ * sort order of `array` and replaces criteria objects with their corresponding
+ * values.
+ *
+ * @private
+ * @param {Array} array The array to sort.
+ * @param {Function} comparer The function to define sort order.
+ * @returns {Array} Returns `array`.
+ */
+function baseSortBy(array, comparer) {
+  var length = array.length;
+
+  array.sort(comparer);
+  while (length--) {
+    array[length] = array[length].value;
+  }
+  return array;
+}
+
+module.exports = baseSortBy;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseTimes.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_baseTimes.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.times` without support for iteratee shorthands
+ * or max array length checks.
+ *
+ * @private
+ * @param {number} n The number of times to invoke `iteratee`.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the array of results.
+ */
+function baseTimes(n, iteratee) {
+  var index = -1,
+      result = Array(n);
+
+  while (++index < n) {
+    result[index] = iteratee(index);
+  }
+  return result;
+}
+
+module.exports = baseTimes;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseToString.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_baseToString.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"),
+    arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js");
+
+/** Used as references for various `Number` constants. */
+var INFINITY = 1 / 0;
+
+/** Used to convert symbols to primitives and strings. */
+var symbolProto = Symbol ? Symbol.prototype : undefined,
+    symbolToString = symbolProto ? symbolProto.toString : undefined;
+
+/**
+ * The base implementation of `_.toString` which doesn't convert nullish
+ * values to empty strings.
+ *
+ * @private
+ * @param {*} value The value to process.
+ * @returns {string} Returns the string.
+ */
+function baseToString(value) {
+  // Exit early for strings to avoid a performance hit in some environments.
+  if (typeof value == 'string') {
+    return value;
+  }
+  if (isArray(value)) {
+    // Recursively convert values (susceptible to call stack limits).
+    return arrayMap(value, baseToString) + '';
+  }
+  if (isSymbol(value)) {
+    return symbolToString ? symbolToString.call(value) : '';
+  }
+  var result = (value + '');
+  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
+}
+
+module.exports = baseToString;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseUnary.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_baseUnary.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * The base implementation of `_.unary` without support for storing metadata.
+ *
+ * @private
+ * @param {Function} func The function to cap arguments for.
+ * @returns {Function} Returns the new capped function.
+ */
+function baseUnary(func) {
+  return function(value) {
+    return func(value);
+  };
+}
+
+module.exports = baseUnary;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseUniq.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_baseUniq.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"),
+    arrayIncludes = __webpack_require__(/*! ./_arrayIncludes */ "./node_modules/lodash/_arrayIncludes.js"),
+    arrayIncludesWith = __webpack_require__(/*! ./_arrayIncludesWith */ "./node_modules/lodash/_arrayIncludesWith.js"),
+    cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js"),
+    createSet = __webpack_require__(/*! ./_createSet */ "./node_modules/lodash/_createSet.js"),
+    setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js");
+
+/** Used as the size to enable large array optimizations. */
+var LARGE_ARRAY_SIZE = 200;
+
+/**
+ * The base implementation of `_.uniqBy` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {Function} [iteratee] The iteratee invoked per element.
+ * @param {Function} [comparator] The comparator invoked per element.
+ * @returns {Array} Returns the new duplicate free array.
+ */
+function baseUniq(array, iteratee, comparator) {
+  var index = -1,
+      includes = arrayIncludes,
+      length = array.length,
+      isCommon = true,
+      result = [],
+      seen = result;
+
+  if (comparator) {
+    isCommon = false;
+    includes = arrayIncludesWith;
+  }
+  else if (length >= LARGE_ARRAY_SIZE) {
+    var set = iteratee ? null : createSet(array);
+    if (set) {
+      return setToArray(set);
+    }
+    isCommon = false;
+    includes = cacheHas;
+    seen = new SetCache;
+  }
+  else {
+    seen = iteratee ? [] : result;
+  }
+  outer:
+  while (++index < length) {
+    var value = array[index],
+        computed = iteratee ? iteratee(value) : value;
+
+    value = (comparator || value !== 0) ? value : 0;
+    if (isCommon && computed === computed) {
+      var seenIndex = seen.length;
+      while (seenIndex--) {
+        if (seen[seenIndex] === computed) {
+          continue outer;
+        }
+      }
+      if (iteratee) {
+        seen.push(computed);
+      }
+      result.push(value);
+    }
+    else if (!includes(seen, computed, comparator)) {
+      if (seen !== result) {
+        seen.push(computed);
+      }
+      result.push(value);
+    }
+  }
+  return result;
+}
+
+module.exports = baseUniq;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseValues.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_baseValues.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js");
+
+/**
+ * The base implementation of `_.values` and `_.valuesIn` which creates an
+ * array of `object` property values corresponding to the property names
+ * of `props`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array} props The property names to get values for.
+ * @returns {Object} Returns the array of property values.
+ */
+function baseValues(object, props) {
+  return arrayMap(props, function(key) {
+    return object[key];
+  });
+}
+
+module.exports = baseValues;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_baseZipObject.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_baseZipObject.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
+ *
+ * @private
+ * @param {Array} props The property identifiers.
+ * @param {Array} values The property values.
+ * @param {Function} assignFunc The function to assign values.
+ * @returns {Object} Returns the new object.
+ */
+function baseZipObject(props, values, assignFunc) {
+  var index = -1,
+      length = props.length,
+      valsLength = values.length,
+      result = {};
+
+  while (++index < length) {
+    var value = index < valsLength ? values[index] : undefined;
+    assignFunc(result, props[index], value);
+  }
+  return result;
+}
+
+module.exports = baseZipObject;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_cacheHas.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_cacheHas.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Checks if a `cache` value for `key` exists.
+ *
+ * @private
+ * @param {Object} cache The cache to query.
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function cacheHas(cache, key) {
+  return cache.has(key);
+}
+
+module.exports = cacheHas;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_castFunction.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_castFunction.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js");
+
+/**
+ * Casts `value` to `identity` if it's not a function.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @returns {Function} Returns cast function.
+ */
+function castFunction(value) {
+  return typeof value == 'function' ? value : identity;
+}
+
+module.exports = castFunction;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_castPath.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_castPath.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"),
+    stringToPath = __webpack_require__(/*! ./_stringToPath */ "./node_modules/lodash/_stringToPath.js"),
+    toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js");
+
+/**
+ * Casts `value` to a path array if it's not one.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @param {Object} [object] The object to query keys on.
+ * @returns {Array} Returns the cast property path array.
+ */
+function castPath(value, object) {
+  if (isArray(value)) {
+    return value;
+  }
+  return isKey(value, object) ? [value] : stringToPath(toString(value));
+}
+
+module.exports = castPath;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_cloneArrayBuffer.js":
+/*!**************************************************!*\
+  !*** ./node_modules/lodash/_cloneArrayBuffer.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js");
+
+/**
+ * Creates a clone of `arrayBuffer`.
+ *
+ * @private
+ * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
+ */
+function cloneArrayBuffer(arrayBuffer) {
+  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
+  new Uint8Array(result).set(new Uint8Array(arrayBuffer));
+  return result;
+}
+
+module.exports = cloneArrayBuffer;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_cloneBuffer.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_cloneBuffer.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/** Detect free variable `exports`. */
+var freeExports =  true && exports && !exports.nodeType && exports;
+
+/** Detect free variable `module`. */
+var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
+
+/** Detect the popular CommonJS extension `module.exports`. */
+var moduleExports = freeModule && freeModule.exports === freeExports;
+
+/** Built-in value references. */
+var Buffer = moduleExports ? root.Buffer : undefined,
+    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;
+
+/**
+ * Creates a clone of  `buffer`.
+ *
+ * @private
+ * @param {Buffer} buffer The buffer to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Buffer} Returns the cloned buffer.
+ */
+function cloneBuffer(buffer, isDeep) {
+  if (isDeep) {
+    return buffer.slice();
+  }
+  var length = buffer.length,
+      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
+
+  buffer.copy(result);
+  return result;
+}
+
+module.exports = cloneBuffer;
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_cloneDataView.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_cloneDataView.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js");
+
+/**
+ * Creates a clone of `dataView`.
+ *
+ * @private
+ * @param {Object} dataView The data view to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned data view.
+ */
+function cloneDataView(dataView, isDeep) {
+  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
+  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
+}
+
+module.exports = cloneDataView;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_cloneRegExp.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_cloneRegExp.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used to match `RegExp` flags from their coerced string values. */
+var reFlags = /\w*$/;
+
+/**
+ * Creates a clone of `regexp`.
+ *
+ * @private
+ * @param {Object} regexp The regexp to clone.
+ * @returns {Object} Returns the cloned regexp.
+ */
+function cloneRegExp(regexp) {
+  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+  result.lastIndex = regexp.lastIndex;
+  return result;
+}
+
+module.exports = cloneRegExp;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_cloneSymbol.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_cloneSymbol.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js");
+
+/** Used to convert symbols to primitives and strings. */
+var symbolProto = Symbol ? Symbol.prototype : undefined,
+    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
+
+/**
+ * Creates a clone of the `symbol` object.
+ *
+ * @private
+ * @param {Object} symbol The symbol object to clone.
+ * @returns {Object} Returns the cloned symbol object.
+ */
+function cloneSymbol(symbol) {
+  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
+}
+
+module.exports = cloneSymbol;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_cloneTypedArray.js":
+/*!*************************************************!*\
+  !*** ./node_modules/lodash/_cloneTypedArray.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js");
+
+/**
+ * Creates a clone of `typedArray`.
+ *
+ * @private
+ * @param {Object} typedArray The typed array to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned typed array.
+ */
+function cloneTypedArray(typedArray, isDeep) {
+  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+}
+
+module.exports = cloneTypedArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_compareAscending.js":
+/*!**************************************************!*\
+  !*** ./node_modules/lodash/_compareAscending.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js");
+
+/**
+ * Compares values to sort them in ascending order.
+ *
+ * @private
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {number} Returns the sort order indicator for `value`.
+ */
+function compareAscending(value, other) {
+  if (value !== other) {
+    var valIsDefined = value !== undefined,
+        valIsNull = value === null,
+        valIsReflexive = value === value,
+        valIsSymbol = isSymbol(value);
+
+    var othIsDefined = other !== undefined,
+        othIsNull = other === null,
+        othIsReflexive = other === other,
+        othIsSymbol = isSymbol(other);
+
+    if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
+        (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
+        (valIsNull && othIsDefined && othIsReflexive) ||
+        (!valIsDefined && othIsReflexive) ||
+        !valIsReflexive) {
+      return 1;
+    }
+    if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
+        (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
+        (othIsNull && valIsDefined && valIsReflexive) ||
+        (!othIsDefined && valIsReflexive) ||
+        !othIsReflexive) {
+      return -1;
+    }
+  }
+  return 0;
+}
+
+module.exports = compareAscending;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_compareMultiple.js":
+/*!*************************************************!*\
+  !*** ./node_modules/lodash/_compareMultiple.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var compareAscending = __webpack_require__(/*! ./_compareAscending */ "./node_modules/lodash/_compareAscending.js");
+
+/**
+ * Used by `_.orderBy` to compare multiple properties of a value to another
+ * and stable sort them.
+ *
+ * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
+ * specify an order of "desc" for descending or "asc" for ascending sort order
+ * of corresponding values.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {boolean[]|string[]} orders The order to sort by for each property.
+ * @returns {number} Returns the sort order indicator for `object`.
+ */
+function compareMultiple(object, other, orders) {
+  var index = -1,
+      objCriteria = object.criteria,
+      othCriteria = other.criteria,
+      length = objCriteria.length,
+      ordersLength = orders.length;
+
+  while (++index < length) {
+    var result = compareAscending(objCriteria[index], othCriteria[index]);
+    if (result) {
+      if (index >= ordersLength) {
+        return result;
+      }
+      var order = orders[index];
+      return result * (order == 'desc' ? -1 : 1);
+    }
+  }
+  // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
+  // that causes it, under certain circumstances, to provide the same value for
+  // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
+  // for more details.
+  //
+  // This also ensures a stable sort in V8 and other engines.
+  // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
+  return object.index - other.index;
+}
+
+module.exports = compareMultiple;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_copyArray.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_copyArray.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Copies the values of `source` to `array`.
+ *
+ * @private
+ * @param {Array} source The array to copy values from.
+ * @param {Array} [array=[]] The array to copy values to.
+ * @returns {Array} Returns `array`.
+ */
+function copyArray(source, array) {
+  var index = -1,
+      length = source.length;
+
+  array || (array = Array(length));
+  while (++index < length) {
+    array[index] = source[index];
+  }
+  return array;
+}
+
+module.exports = copyArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_copyObject.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_copyObject.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"),
+    baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js");
+
+/**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property identifiers to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @param {Function} [customizer] The function to customize copied values.
+ * @returns {Object} Returns `object`.
+ */
+function copyObject(source, props, object, customizer) {
+  var isNew = !object;
+  object || (object = {});
+
+  var index = -1,
+      length = props.length;
+
+  while (++index < length) {
+    var key = props[index];
+
+    var newValue = customizer
+      ? customizer(object[key], source[key], key, object, source)
+      : undefined;
+
+    if (newValue === undefined) {
+      newValue = source[key];
+    }
+    if (isNew) {
+      baseAssignValue(object, key, newValue);
+    } else {
+      assignValue(object, key, newValue);
+    }
+  }
+  return object;
+}
+
+module.exports = copyObject;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_copySymbols.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_copySymbols.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"),
+    getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js");
+
+/**
+ * Copies own symbols of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy symbols from.
+ * @param {Object} [object={}] The object to copy symbols to.
+ * @returns {Object} Returns `object`.
+ */
+function copySymbols(source, object) {
+  return copyObject(source, getSymbols(source), object);
+}
+
+module.exports = copySymbols;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_copySymbolsIn.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_copySymbolsIn.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"),
+    getSymbolsIn = __webpack_require__(/*! ./_getSymbolsIn */ "./node_modules/lodash/_getSymbolsIn.js");
+
+/**
+ * Copies own and inherited symbols of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy symbols from.
+ * @param {Object} [object={}] The object to copy symbols to.
+ * @returns {Object} Returns `object`.
+ */
+function copySymbolsIn(source, object) {
+  return copyObject(source, getSymbolsIn(source), object);
+}
+
+module.exports = copySymbolsIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_coreJsData.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_coreJsData.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/** Used to detect overreaching core-js shims. */
+var coreJsData = root['__core-js_shared__'];
+
+module.exports = coreJsData;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_createAssigner.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_createAssigner.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"),
+    isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js");
+
+/**
+ * Creates a function like `_.assign`.
+ *
+ * @private
+ * @param {Function} assigner The function to assign values.
+ * @returns {Function} Returns the new assigner function.
+ */
+function createAssigner(assigner) {
+  return baseRest(function(object, sources) {
+    var index = -1,
+        length = sources.length,
+        customizer = length > 1 ? sources[length - 1] : undefined,
+        guard = length > 2 ? sources[2] : undefined;
+
+    customizer = (assigner.length > 3 && typeof customizer == 'function')
+      ? (length--, customizer)
+      : undefined;
+
+    if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+      customizer = length < 3 ? undefined : customizer;
+      length = 1;
+    }
+    object = Object(object);
+    while (++index < length) {
+      var source = sources[index];
+      if (source) {
+        assigner(object, source, index, customizer);
+      }
+    }
+    return object;
+  });
+}
+
+module.exports = createAssigner;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_createBaseEach.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_createBaseEach.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js");
+
+/**
+ * Creates a `baseEach` or `baseEachRight` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+function createBaseEach(eachFunc, fromRight) {
+  return function(collection, iteratee) {
+    if (collection == null) {
+      return collection;
+    }
+    if (!isArrayLike(collection)) {
+      return eachFunc(collection, iteratee);
+    }
+    var length = collection.length,
+        index = fromRight ? length : -1,
+        iterable = Object(collection);
+
+    while ((fromRight ? index-- : ++index < length)) {
+      if (iteratee(iterable[index], index, iterable) === false) {
+        break;
+      }
+    }
+    return collection;
+  };
+}
+
+module.exports = createBaseEach;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_createBaseFor.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_createBaseFor.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Creates a base function for methods like `_.forIn` and `_.forOwn`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+function createBaseFor(fromRight) {
+  return function(object, iteratee, keysFunc) {
+    var index = -1,
+        iterable = Object(object),
+        props = keysFunc(object),
+        length = props.length;
+
+    while (length--) {
+      var key = props[fromRight ? length : ++index];
+      if (iteratee(iterable[key], key, iterable) === false) {
+        break;
+      }
+    }
+    return object;
+  };
+}
+
+module.exports = createBaseFor;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_createFind.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_createFind.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"),
+    isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"),
+    keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js");
+
+/**
+ * Creates a `_.find` or `_.findLast` function.
+ *
+ * @private
+ * @param {Function} findIndexFunc The function to find the collection index.
+ * @returns {Function} Returns the new find function.
+ */
+function createFind(findIndexFunc) {
+  return function(collection, predicate, fromIndex) {
+    var iterable = Object(collection);
+    if (!isArrayLike(collection)) {
+      var iteratee = baseIteratee(predicate, 3);
+      collection = keys(collection);
+      predicate = function(key) { return iteratee(iterable[key], key, iterable); };
+    }
+    var index = findIndexFunc(collection, predicate, fromIndex);
+    return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
+  };
+}
+
+module.exports = createFind;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_createRange.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_createRange.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseRange = __webpack_require__(/*! ./_baseRange */ "./node_modules/lodash/_baseRange.js"),
+    isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"),
+    toFinite = __webpack_require__(/*! ./toFinite */ "./node_modules/lodash/toFinite.js");
+
+/**
+ * Creates a `_.range` or `_.rangeRight` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new range function.
+ */
+function createRange(fromRight) {
+  return function(start, end, step) {
+    if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
+      end = step = undefined;
+    }
+    // Ensure the sign of `-0` is preserved.
+    start = toFinite(start);
+    if (end === undefined) {
+      end = start;
+      start = 0;
+    } else {
+      end = toFinite(end);
+    }
+    step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
+    return baseRange(start, end, step, fromRight);
+  };
+}
+
+module.exports = createRange;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_createSet.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_createSet.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"),
+    noop = __webpack_require__(/*! ./noop */ "./node_modules/lodash/noop.js"),
+    setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js");
+
+/** Used as references for various `Number` constants. */
+var INFINITY = 1 / 0;
+
+/**
+ * Creates a set object of `values`.
+ *
+ * @private
+ * @param {Array} values The values to add to the set.
+ * @returns {Object} Returns the new set.
+ */
+var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
+  return new Set(values);
+};
+
+module.exports = createSet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_defineProperty.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_defineProperty.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js");
+
+var defineProperty = (function() {
+  try {
+    var func = getNative(Object, 'defineProperty');
+    func({}, '', {});
+    return func;
+  } catch (e) {}
+}());
+
+module.exports = defineProperty;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_equalArrays.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_equalArrays.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var SetCache = __webpack_require__(/*! ./_SetCache */ "./node_modules/lodash/_SetCache.js"),
+    arraySome = __webpack_require__(/*! ./_arraySome */ "./node_modules/lodash/_arraySome.js"),
+    cacheHas = __webpack_require__(/*! ./_cacheHas */ "./node_modules/lodash/_cacheHas.js");
+
+/** Used to compose bitmasks for value comparisons. */
+var COMPARE_PARTIAL_FLAG = 1,
+    COMPARE_UNORDERED_FLAG = 2;
+
+/**
+ * A specialized version of `baseIsEqualDeep` for arrays with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Array} array The array to compare.
+ * @param {Array} other The other array to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} stack Tracks traversed `array` and `other` objects.
+ * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
+ */
+function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
+  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+      arrLength = array.length,
+      othLength = other.length;
+
+  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
+    return false;
+  }
+  // Assume cyclic values are equal.
+  var stacked = stack.get(array);
+  if (stacked && stack.get(other)) {
+    return stacked == other;
+  }
+  var index = -1,
+      result = true,
+      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
+
+  stack.set(array, other);
+  stack.set(other, array);
+
+  // Ignore non-index properties.
+  while (++index < arrLength) {
+    var arrValue = array[index],
+        othValue = other[index];
+
+    if (customizer) {
+      var compared = isPartial
+        ? customizer(othValue, arrValue, index, other, array, stack)
+        : customizer(arrValue, othValue, index, array, other, stack);
+    }
+    if (compared !== undefined) {
+      if (compared) {
+        continue;
+      }
+      result = false;
+      break;
+    }
+    // Recursively compare arrays (susceptible to call stack limits).
+    if (seen) {
+      if (!arraySome(other, function(othValue, othIndex) {
+            if (!cacheHas(seen, othIndex) &&
+                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
+              return seen.push(othIndex);
+            }
+          })) {
+        result = false;
+        break;
+      }
+    } else if (!(
+          arrValue === othValue ||
+            equalFunc(arrValue, othValue, bitmask, customizer, stack)
+        )) {
+      result = false;
+      break;
+    }
+  }
+  stack['delete'](array);
+  stack['delete'](other);
+  return result;
+}
+
+module.exports = equalArrays;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_equalByTag.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_equalByTag.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"),
+    Uint8Array = __webpack_require__(/*! ./_Uint8Array */ "./node_modules/lodash/_Uint8Array.js"),
+    eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"),
+    equalArrays = __webpack_require__(/*! ./_equalArrays */ "./node_modules/lodash/_equalArrays.js"),
+    mapToArray = __webpack_require__(/*! ./_mapToArray */ "./node_modules/lodash/_mapToArray.js"),
+    setToArray = __webpack_require__(/*! ./_setToArray */ "./node_modules/lodash/_setToArray.js");
+
+/** Used to compose bitmasks for value comparisons. */
+var COMPARE_PARTIAL_FLAG = 1,
+    COMPARE_UNORDERED_FLAG = 2;
+
+/** `Object#toString` result references. */
+var boolTag = '[object Boolean]',
+    dateTag = '[object Date]',
+    errorTag = '[object Error]',
+    mapTag = '[object Map]',
+    numberTag = '[object Number]',
+    regexpTag = '[object RegExp]',
+    setTag = '[object Set]',
+    stringTag = '[object String]',
+    symbolTag = '[object Symbol]';
+
+var arrayBufferTag = '[object ArrayBuffer]',
+    dataViewTag = '[object DataView]';
+
+/** Used to convert symbols to primitives and strings. */
+var symbolProto = Symbol ? Symbol.prototype : undefined,
+    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
+
+/**
+ * A specialized version of `baseIsEqualDeep` for comparing objects of
+ * the same `toStringTag`.
+ *
+ * **Note:** This function only supports comparing values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {string} tag The `toStringTag` of the objects to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} stack Tracks traversed `object` and `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
+  switch (tag) {
+    case dataViewTag:
+      if ((object.byteLength != other.byteLength) ||
+          (object.byteOffset != other.byteOffset)) {
+        return false;
+      }
+      object = object.buffer;
+      other = other.buffer;
+
+    case arrayBufferTag:
+      if ((object.byteLength != other.byteLength) ||
+          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
+        return false;
+      }
+      return true;
+
+    case boolTag:
+    case dateTag:
+    case numberTag:
+      // Coerce booleans to `1` or `0` and dates to milliseconds.
+      // Invalid dates are coerced to `NaN`.
+      return eq(+object, +other);
+
+    case errorTag:
+      return object.name == other.name && object.message == other.message;
+
+    case regexpTag:
+    case stringTag:
+      // Coerce regexes to strings and treat strings, primitives and objects,
+      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
+      // for more details.
+      return object == (other + '');
+
+    case mapTag:
+      var convert = mapToArray;
+
+    case setTag:
+      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
+      convert || (convert = setToArray);
+
+      if (object.size != other.size && !isPartial) {
+        return false;
+      }
+      // Assume cyclic values are equal.
+      var stacked = stack.get(object);
+      if (stacked) {
+        return stacked == other;
+      }
+      bitmask |= COMPARE_UNORDERED_FLAG;
+
+      // Recursively compare objects (susceptible to call stack limits).
+      stack.set(object, other);
+      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
+      stack['delete'](object);
+      return result;
+
+    case symbolTag:
+      if (symbolValueOf) {
+        return symbolValueOf.call(object) == symbolValueOf.call(other);
+      }
+  }
+  return false;
+}
+
+module.exports = equalByTag;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_equalObjects.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_equalObjects.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getAllKeys = __webpack_require__(/*! ./_getAllKeys */ "./node_modules/lodash/_getAllKeys.js");
+
+/** Used to compose bitmasks for value comparisons. */
+var COMPARE_PARTIAL_FLAG = 1;
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * A specialized version of `baseIsEqualDeep` for objects with support for
+ * partial deep comparisons.
+ *
+ * @private
+ * @param {Object} object The object to compare.
+ * @param {Object} other The other object to compare.
+ * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
+ * @param {Function} customizer The function to customize comparisons.
+ * @param {Function} equalFunc The function to determine equivalents of values.
+ * @param {Object} stack Tracks traversed `object` and `other` objects.
+ * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
+ */
+function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
+  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
+      objProps = getAllKeys(object),
+      objLength = objProps.length,
+      othProps = getAllKeys(other),
+      othLength = othProps.length;
+
+  if (objLength != othLength && !isPartial) {
+    return false;
+  }
+  var index = objLength;
+  while (index--) {
+    var key = objProps[index];
+    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
+      return false;
+    }
+  }
+  // Assume cyclic values are equal.
+  var stacked = stack.get(object);
+  if (stacked && stack.get(other)) {
+    return stacked == other;
+  }
+  var result = true;
+  stack.set(object, other);
+  stack.set(other, object);
+
+  var skipCtor = isPartial;
+  while (++index < objLength) {
+    key = objProps[index];
+    var objValue = object[key],
+        othValue = other[key];
+
+    if (customizer) {
+      var compared = isPartial
+        ? customizer(othValue, objValue, key, other, object, stack)
+        : customizer(objValue, othValue, key, object, other, stack);
+    }
+    // Recursively compare objects (susceptible to call stack limits).
+    if (!(compared === undefined
+          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
+          : compared
+        )) {
+      result = false;
+      break;
+    }
+    skipCtor || (skipCtor = key == 'constructor');
+  }
+  if (result && !skipCtor) {
+    var objCtor = object.constructor,
+        othCtor = other.constructor;
+
+    // Non `Object` object instances with different constructors are not equal.
+    if (objCtor != othCtor &&
+        ('constructor' in object && 'constructor' in other) &&
+        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
+          typeof othCtor == 'function' && othCtor instanceof othCtor)) {
+      result = false;
+    }
+  }
+  stack['delete'](object);
+  stack['delete'](other);
+  return result;
+}
+
+module.exports = equalObjects;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_flatRest.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_flatRest.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var flatten = __webpack_require__(/*! ./flatten */ "./node_modules/lodash/flatten.js"),
+    overRest = __webpack_require__(/*! ./_overRest */ "./node_modules/lodash/_overRest.js"),
+    setToString = __webpack_require__(/*! ./_setToString */ "./node_modules/lodash/_setToString.js");
+
+/**
+ * A specialized version of `baseRest` which flattens the rest array.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @returns {Function} Returns the new function.
+ */
+function flatRest(func) {
+  return setToString(overRest(func, undefined, flatten), func + '');
+}
+
+module.exports = flatRest;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_freeGlobal.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_freeGlobal.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */
+var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+
+module.exports = freeGlobal;
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getAllKeys.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_getAllKeys.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"),
+    getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"),
+    keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js");
+
+/**
+ * Creates an array of own enumerable property names and symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
+function getAllKeys(object) {
+  return baseGetAllKeys(object, keys, getSymbols);
+}
+
+module.exports = getAllKeys;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getAllKeysIn.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_getAllKeysIn.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGetAllKeys = __webpack_require__(/*! ./_baseGetAllKeys */ "./node_modules/lodash/_baseGetAllKeys.js"),
+    getSymbolsIn = __webpack_require__(/*! ./_getSymbolsIn */ "./node_modules/lodash/_getSymbolsIn.js"),
+    keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js");
+
+/**
+ * Creates an array of own and inherited enumerable property names and
+ * symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names and symbols.
+ */
+function getAllKeysIn(object) {
+  return baseGetAllKeys(object, keysIn, getSymbolsIn);
+}
+
+module.exports = getAllKeysIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getMapData.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_getMapData.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isKeyable = __webpack_require__(/*! ./_isKeyable */ "./node_modules/lodash/_isKeyable.js");
+
+/**
+ * Gets the data for `map`.
+ *
+ * @private
+ * @param {Object} map The map to query.
+ * @param {string} key The reference key.
+ * @returns {*} Returns the map data.
+ */
+function getMapData(map, key) {
+  var data = map.__data__;
+  return isKeyable(key)
+    ? data[typeof key == 'string' ? 'string' : 'hash']
+    : data.map;
+}
+
+module.exports = getMapData;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getMatchData.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_getMatchData.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isStrictComparable = __webpack_require__(/*! ./_isStrictComparable */ "./node_modules/lodash/_isStrictComparable.js"),
+    keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js");
+
+/**
+ * Gets the property names, values, and compare flags of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the match data of `object`.
+ */
+function getMatchData(object) {
+  var result = keys(object),
+      length = result.length;
+
+  while (length--) {
+    var key = result[length],
+        value = object[key];
+
+    result[length] = [key, value, isStrictComparable(value)];
+  }
+  return result;
+}
+
+module.exports = getMatchData;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getNative.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_getNative.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsNative = __webpack_require__(/*! ./_baseIsNative */ "./node_modules/lodash/_baseIsNative.js"),
+    getValue = __webpack_require__(/*! ./_getValue */ "./node_modules/lodash/_getValue.js");
+
+/**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+function getNative(object, key) {
+  var value = getValue(object, key);
+  return baseIsNative(value) ? value : undefined;
+}
+
+module.exports = getNative;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getPrototype.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_getPrototype.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js");
+
+/** Built-in value references. */
+var getPrototype = overArg(Object.getPrototypeOf, Object);
+
+module.exports = getPrototype;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getRawTag.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_getRawTag.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js");
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var nativeObjectToString = objectProto.toString;
+
+/** Built-in value references. */
+var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
+
+/**
+ * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the raw `toStringTag`.
+ */
+function getRawTag(value) {
+  var isOwn = hasOwnProperty.call(value, symToStringTag),
+      tag = value[symToStringTag];
+
+  try {
+    value[symToStringTag] = undefined;
+    var unmasked = true;
+  } catch (e) {}
+
+  var result = nativeObjectToString.call(value);
+  if (unmasked) {
+    if (isOwn) {
+      value[symToStringTag] = tag;
+    } else {
+      delete value[symToStringTag];
+    }
+  }
+  return result;
+}
+
+module.exports = getRawTag;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getSymbols.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_getSymbols.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"),
+    stubArray = __webpack_require__(/*! ./stubArray */ "./node_modules/lodash/stubArray.js");
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Built-in value references. */
+var propertyIsEnumerable = objectProto.propertyIsEnumerable;
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeGetSymbols = Object.getOwnPropertySymbols;
+
+/**
+ * Creates an array of the own enumerable symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of symbols.
+ */
+var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
+  if (object == null) {
+    return [];
+  }
+  object = Object(object);
+  return arrayFilter(nativeGetSymbols(object), function(symbol) {
+    return propertyIsEnumerable.call(object, symbol);
+  });
+};
+
+module.exports = getSymbols;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getSymbolsIn.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_getSymbolsIn.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayPush = __webpack_require__(/*! ./_arrayPush */ "./node_modules/lodash/_arrayPush.js"),
+    getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"),
+    getSymbols = __webpack_require__(/*! ./_getSymbols */ "./node_modules/lodash/_getSymbols.js"),
+    stubArray = __webpack_require__(/*! ./stubArray */ "./node_modules/lodash/stubArray.js");
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeGetSymbols = Object.getOwnPropertySymbols;
+
+/**
+ * Creates an array of the own and inherited enumerable symbols of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of symbols.
+ */
+var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
+  var result = [];
+  while (object) {
+    arrayPush(result, getSymbols(object));
+    object = getPrototype(object);
+  }
+  return result;
+};
+
+module.exports = getSymbolsIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getTag.js":
+/*!****************************************!*\
+  !*** ./node_modules/lodash/_getTag.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DataView = __webpack_require__(/*! ./_DataView */ "./node_modules/lodash/_DataView.js"),
+    Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"),
+    Promise = __webpack_require__(/*! ./_Promise */ "./node_modules/lodash/_Promise.js"),
+    Set = __webpack_require__(/*! ./_Set */ "./node_modules/lodash/_Set.js"),
+    WeakMap = __webpack_require__(/*! ./_WeakMap */ "./node_modules/lodash/_WeakMap.js"),
+    baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"),
+    toSource = __webpack_require__(/*! ./_toSource */ "./node_modules/lodash/_toSource.js");
+
+/** `Object#toString` result references. */
+var mapTag = '[object Map]',
+    objectTag = '[object Object]',
+    promiseTag = '[object Promise]',
+    setTag = '[object Set]',
+    weakMapTag = '[object WeakMap]';
+
+var dataViewTag = '[object DataView]';
+
+/** Used to detect maps, sets, and weakmaps. */
+var dataViewCtorString = toSource(DataView),
+    mapCtorString = toSource(Map),
+    promiseCtorString = toSource(Promise),
+    setCtorString = toSource(Set),
+    weakMapCtorString = toSource(WeakMap);
+
+/**
+ * Gets the `toStringTag` of `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+var getTag = baseGetTag;
+
+// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
+if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
+    (Map && getTag(new Map) != mapTag) ||
+    (Promise && getTag(Promise.resolve()) != promiseTag) ||
+    (Set && getTag(new Set) != setTag) ||
+    (WeakMap && getTag(new WeakMap) != weakMapTag)) {
+  getTag = function(value) {
+    var result = baseGetTag(value),
+        Ctor = result == objectTag ? value.constructor : undefined,
+        ctorString = Ctor ? toSource(Ctor) : '';
+
+    if (ctorString) {
+      switch (ctorString) {
+        case dataViewCtorString: return dataViewTag;
+        case mapCtorString: return mapTag;
+        case promiseCtorString: return promiseTag;
+        case setCtorString: return setTag;
+        case weakMapCtorString: return weakMapTag;
+      }
+    }
+    return result;
+  };
+}
+
+module.exports = getTag;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_getValue.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_getValue.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Gets the value at `key` of `object`.
+ *
+ * @private
+ * @param {Object} [object] The object to query.
+ * @param {string} key The key of the property to get.
+ * @returns {*} Returns the property value.
+ */
+function getValue(object, key) {
+  return object == null ? undefined : object[key];
+}
+
+module.exports = getValue;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_hasPath.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_hasPath.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var castPath = __webpack_require__(/*! ./_castPath */ "./node_modules/lodash/_castPath.js"),
+    isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"),
+    isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js"),
+    toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js");
+
+/**
+ * Checks if `path` exists on `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @param {Function} hasFunc The function to check properties.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ */
+function hasPath(object, path, hasFunc) {
+  path = castPath(path, object);
+
+  var index = -1,
+      length = path.length,
+      result = false;
+
+  while (++index < length) {
+    var key = toKey(path[index]);
+    if (!(result = object != null && hasFunc(object, key))) {
+      break;
+    }
+    object = object[key];
+  }
+  if (result || ++index != length) {
+    return result;
+  }
+  length = object == null ? 0 : object.length;
+  return !!length && isLength(length) && isIndex(key, length) &&
+    (isArray(object) || isArguments(object));
+}
+
+module.exports = hasPath;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_hasUnicode.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_hasUnicode.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used to compose unicode character classes. */
+var rsAstralRange = '\\ud800-\\udfff',
+    rsComboMarksRange = '\\u0300-\\u036f',
+    reComboHalfMarksRange = '\\ufe20-\\ufe2f',
+    rsComboSymbolsRange = '\\u20d0-\\u20ff',
+    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
+    rsVarRange = '\\ufe0e\\ufe0f';
+
+/** Used to compose unicode capture groups. */
+var rsZWJ = '\\u200d';
+
+/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
+var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');
+
+/**
+ * Checks if `string` contains Unicode symbols.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {boolean} Returns `true` if a symbol is found, else `false`.
+ */
+function hasUnicode(string) {
+  return reHasUnicode.test(string);
+}
+
+module.exports = hasUnicode;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_hashClear.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_hashClear.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js");
+
+/**
+ * Removes all key-value entries from the hash.
+ *
+ * @private
+ * @name clear
+ * @memberOf Hash
+ */
+function hashClear() {
+  this.__data__ = nativeCreate ? nativeCreate(null) : {};
+  this.size = 0;
+}
+
+module.exports = hashClear;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_hashDelete.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_hashDelete.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Removes `key` and its value from the hash.
+ *
+ * @private
+ * @name delete
+ * @memberOf Hash
+ * @param {Object} hash The hash to modify.
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function hashDelete(key) {
+  var result = this.has(key) && delete this.__data__[key];
+  this.size -= result ? 1 : 0;
+  return result;
+}
+
+module.exports = hashDelete;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_hashGet.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_hashGet.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js");
+
+/** Used to stand-in for `undefined` hash values. */
+var HASH_UNDEFINED = '__lodash_hash_undefined__';
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Gets the hash value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Hash
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function hashGet(key) {
+  var data = this.__data__;
+  if (nativeCreate) {
+    var result = data[key];
+    return result === HASH_UNDEFINED ? undefined : result;
+  }
+  return hasOwnProperty.call(data, key) ? data[key] : undefined;
+}
+
+module.exports = hashGet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_hashHas.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_hashHas.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js");
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Checks if a hash value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Hash
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function hashHas(key) {
+  var data = this.__data__;
+  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
+}
+
+module.exports = hashHas;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_hashSet.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_hashSet.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var nativeCreate = __webpack_require__(/*! ./_nativeCreate */ "./node_modules/lodash/_nativeCreate.js");
+
+/** Used to stand-in for `undefined` hash values. */
+var HASH_UNDEFINED = '__lodash_hash_undefined__';
+
+/**
+ * Sets the hash `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Hash
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the hash instance.
+ */
+function hashSet(key, value) {
+  var data = this.__data__;
+  this.size += this.has(key) ? 0 : 1;
+  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
+  return this;
+}
+
+module.exports = hashSet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_initCloneArray.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_initCloneArray.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Initializes an array clone.
+ *
+ * @private
+ * @param {Array} array The array to clone.
+ * @returns {Array} Returns the initialized clone.
+ */
+function initCloneArray(array) {
+  var length = array.length,
+      result = new array.constructor(length);
+
+  // Add properties assigned by `RegExp#exec`.
+  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
+    result.index = array.index;
+    result.input = array.input;
+  }
+  return result;
+}
+
+module.exports = initCloneArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_initCloneByTag.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_initCloneByTag.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var cloneArrayBuffer = __webpack_require__(/*! ./_cloneArrayBuffer */ "./node_modules/lodash/_cloneArrayBuffer.js"),
+    cloneDataView = __webpack_require__(/*! ./_cloneDataView */ "./node_modules/lodash/_cloneDataView.js"),
+    cloneRegExp = __webpack_require__(/*! ./_cloneRegExp */ "./node_modules/lodash/_cloneRegExp.js"),
+    cloneSymbol = __webpack_require__(/*! ./_cloneSymbol */ "./node_modules/lodash/_cloneSymbol.js"),
+    cloneTypedArray = __webpack_require__(/*! ./_cloneTypedArray */ "./node_modules/lodash/_cloneTypedArray.js");
+
+/** `Object#toString` result references. */
+var boolTag = '[object Boolean]',
+    dateTag = '[object Date]',
+    mapTag = '[object Map]',
+    numberTag = '[object Number]',
+    regexpTag = '[object RegExp]',
+    setTag = '[object Set]',
+    stringTag = '[object String]',
+    symbolTag = '[object Symbol]';
+
+var arrayBufferTag = '[object ArrayBuffer]',
+    dataViewTag = '[object DataView]',
+    float32Tag = '[object Float32Array]',
+    float64Tag = '[object Float64Array]',
+    int8Tag = '[object Int8Array]',
+    int16Tag = '[object Int16Array]',
+    int32Tag = '[object Int32Array]',
+    uint8Tag = '[object Uint8Array]',
+    uint8ClampedTag = '[object Uint8ClampedArray]',
+    uint16Tag = '[object Uint16Array]',
+    uint32Tag = '[object Uint32Array]';
+
+/**
+ * Initializes an object clone based on its `toStringTag`.
+ *
+ * **Note:** This function only supports cloning values with tags of
+ * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @param {string} tag The `toStringTag` of the object to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+function initCloneByTag(object, tag, isDeep) {
+  var Ctor = object.constructor;
+  switch (tag) {
+    case arrayBufferTag:
+      return cloneArrayBuffer(object);
+
+    case boolTag:
+    case dateTag:
+      return new Ctor(+object);
+
+    case dataViewTag:
+      return cloneDataView(object, isDeep);
+
+    case float32Tag: case float64Tag:
+    case int8Tag: case int16Tag: case int32Tag:
+    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
+      return cloneTypedArray(object, isDeep);
+
+    case mapTag:
+      return new Ctor;
+
+    case numberTag:
+    case stringTag:
+      return new Ctor(object);
+
+    case regexpTag:
+      return cloneRegExp(object);
+
+    case setTag:
+      return new Ctor;
+
+    case symbolTag:
+      return cloneSymbol(object);
+  }
+}
+
+module.exports = initCloneByTag;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_initCloneObject.js":
+/*!*************************************************!*\
+  !*** ./node_modules/lodash/_initCloneObject.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseCreate = __webpack_require__(/*! ./_baseCreate */ "./node_modules/lodash/_baseCreate.js"),
+    getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"),
+    isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js");
+
+/**
+ * Initializes an object clone.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+function initCloneObject(object) {
+  return (typeof object.constructor == 'function' && !isPrototype(object))
+    ? baseCreate(getPrototype(object))
+    : {};
+}
+
+module.exports = initCloneObject;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_isFlattenable.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_isFlattenable.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Symbol = __webpack_require__(/*! ./_Symbol */ "./node_modules/lodash/_Symbol.js"),
+    isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js");
+
+/** Built-in value references. */
+var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
+
+/**
+ * Checks if `value` is a flattenable `arguments` object or array.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
+ */
+function isFlattenable(value) {
+  return isArray(value) || isArguments(value) ||
+    !!(spreadableSymbol && value && value[spreadableSymbol]);
+}
+
+module.exports = isFlattenable;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_isIndex.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_isIndex.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/** Used to detect unsigned integer values. */
+var reIsUint = /^(?:0|[1-9]\d*)$/;
+
+/**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+function isIndex(value, length) {
+  var type = typeof value;
+  length = length == null ? MAX_SAFE_INTEGER : length;
+
+  return !!length &&
+    (type == 'number' ||
+      (type != 'symbol' && reIsUint.test(value))) &&
+        (value > -1 && value % 1 == 0 && value < length);
+}
+
+module.exports = isIndex;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_isIterateeCall.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_isIterateeCall.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"),
+    isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"),
+    isIndex = __webpack_require__(/*! ./_isIndex */ "./node_modules/lodash/_isIndex.js"),
+    isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js");
+
+/**
+ * Checks if the given arguments are from an iteratee call.
+ *
+ * @private
+ * @param {*} value The potential iteratee value argument.
+ * @param {*} index The potential iteratee index or key argument.
+ * @param {*} object The potential iteratee object argument.
+ * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
+ *  else `false`.
+ */
+function isIterateeCall(value, index, object) {
+  if (!isObject(object)) {
+    return false;
+  }
+  var type = typeof index;
+  if (type == 'number'
+        ? (isArrayLike(object) && isIndex(index, object.length))
+        : (type == 'string' && index in object)
+      ) {
+    return eq(object[index], value);
+  }
+  return false;
+}
+
+module.exports = isIterateeCall;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_isKey.js":
+/*!***************************************!*\
+  !*** ./node_modules/lodash/_isKey.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js");
+
+/** Used to match property names within property paths. */
+var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
+    reIsPlainProp = /^\w*$/;
+
+/**
+ * Checks if `value` is a property name and not a property path.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {Object} [object] The object to query keys on.
+ * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
+ */
+function isKey(value, object) {
+  if (isArray(value)) {
+    return false;
+  }
+  var type = typeof value;
+  if (type == 'number' || type == 'symbol' || type == 'boolean' ||
+      value == null || isSymbol(value)) {
+    return true;
+  }
+  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
+    (object != null && value in Object(object));
+}
+
+module.exports = isKey;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_isKeyable.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/_isKeyable.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Checks if `value` is suitable for use as unique object key.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+ */
+function isKeyable(value) {
+  var type = typeof value;
+  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
+    ? (value !== '__proto__')
+    : (value === null);
+}
+
+module.exports = isKeyable;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_isMasked.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_isMasked.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var coreJsData = __webpack_require__(/*! ./_coreJsData */ "./node_modules/lodash/_coreJsData.js");
+
+/** Used to detect methods masquerading as native. */
+var maskSrcKey = (function() {
+  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
+  return uid ? ('Symbol(src)_1.' + uid) : '';
+}());
+
+/**
+ * Checks if `func` has its source masked.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` is masked, else `false`.
+ */
+function isMasked(func) {
+  return !!maskSrcKey && (maskSrcKey in func);
+}
+
+module.exports = isMasked;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_isPrototype.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_isPrototype.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Checks if `value` is likely a prototype object.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
+ */
+function isPrototype(value) {
+  var Ctor = value && value.constructor,
+      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
+
+  return value === proto;
+}
+
+module.exports = isPrototype;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_isStrictComparable.js":
+/*!****************************************************!*\
+  !*** ./node_modules/lodash/_isStrictComparable.js ***!
+  \****************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js");
+
+/**
+ * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` if suitable for strict
+ *  equality comparisons, else `false`.
+ */
+function isStrictComparable(value) {
+  return value === value && !isObject(value);
+}
+
+module.exports = isStrictComparable;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_listCacheClear.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_listCacheClear.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Removes all key-value entries from the list cache.
+ *
+ * @private
+ * @name clear
+ * @memberOf ListCache
+ */
+function listCacheClear() {
+  this.__data__ = [];
+  this.size = 0;
+}
+
+module.exports = listCacheClear;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_listCacheDelete.js":
+/*!*************************************************!*\
+  !*** ./node_modules/lodash/_listCacheDelete.js ***!
+  \*************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js");
+
+/** Used for built-in method references. */
+var arrayProto = Array.prototype;
+
+/** Built-in value references. */
+var splice = arrayProto.splice;
+
+/**
+ * Removes `key` and its value from the list cache.
+ *
+ * @private
+ * @name delete
+ * @memberOf ListCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function listCacheDelete(key) {
+  var data = this.__data__,
+      index = assocIndexOf(data, key);
+
+  if (index < 0) {
+    return false;
+  }
+  var lastIndex = data.length - 1;
+  if (index == lastIndex) {
+    data.pop();
+  } else {
+    splice.call(data, index, 1);
+  }
+  --this.size;
+  return true;
+}
+
+module.exports = listCacheDelete;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_listCacheGet.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_listCacheGet.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js");
+
+/**
+ * Gets the list cache value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf ListCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function listCacheGet(key) {
+  var data = this.__data__,
+      index = assocIndexOf(data, key);
+
+  return index < 0 ? undefined : data[index][1];
+}
+
+module.exports = listCacheGet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_listCacheHas.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_listCacheHas.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js");
+
+/**
+ * Checks if a list cache value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf ListCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function listCacheHas(key) {
+  return assocIndexOf(this.__data__, key) > -1;
+}
+
+module.exports = listCacheHas;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_listCacheSet.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_listCacheSet.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var assocIndexOf = __webpack_require__(/*! ./_assocIndexOf */ "./node_modules/lodash/_assocIndexOf.js");
+
+/**
+ * Sets the list cache `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf ListCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the list cache instance.
+ */
+function listCacheSet(key, value) {
+  var data = this.__data__,
+      index = assocIndexOf(data, key);
+
+  if (index < 0) {
+    ++this.size;
+    data.push([key, value]);
+  } else {
+    data[index][1] = value;
+  }
+  return this;
+}
+
+module.exports = listCacheSet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_mapCacheClear.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_mapCacheClear.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Hash = __webpack_require__(/*! ./_Hash */ "./node_modules/lodash/_Hash.js"),
+    ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"),
+    Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js");
+
+/**
+ * Removes all key-value entries from the map.
+ *
+ * @private
+ * @name clear
+ * @memberOf MapCache
+ */
+function mapCacheClear() {
+  this.size = 0;
+  this.__data__ = {
+    'hash': new Hash,
+    'map': new (Map || ListCache),
+    'string': new Hash
+  };
+}
+
+module.exports = mapCacheClear;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_mapCacheDelete.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_mapCacheDelete.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js");
+
+/**
+ * Removes `key` and its value from the map.
+ *
+ * @private
+ * @name delete
+ * @memberOf MapCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function mapCacheDelete(key) {
+  var result = getMapData(this, key)['delete'](key);
+  this.size -= result ? 1 : 0;
+  return result;
+}
+
+module.exports = mapCacheDelete;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_mapCacheGet.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_mapCacheGet.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js");
+
+/**
+ * Gets the map value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf MapCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function mapCacheGet(key) {
+  return getMapData(this, key).get(key);
+}
+
+module.exports = mapCacheGet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_mapCacheHas.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_mapCacheHas.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js");
+
+/**
+ * Checks if a map value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf MapCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function mapCacheHas(key) {
+  return getMapData(this, key).has(key);
+}
+
+module.exports = mapCacheHas;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_mapCacheSet.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_mapCacheSet.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getMapData = __webpack_require__(/*! ./_getMapData */ "./node_modules/lodash/_getMapData.js");
+
+/**
+ * Sets the map `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf MapCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the map cache instance.
+ */
+function mapCacheSet(key, value) {
+  var data = getMapData(this, key),
+      size = data.size;
+
+  data.set(key, value);
+  this.size += data.size == size ? 0 : 1;
+  return this;
+}
+
+module.exports = mapCacheSet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_mapToArray.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_mapToArray.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Converts `map` to its key-value pairs.
+ *
+ * @private
+ * @param {Object} map The map to convert.
+ * @returns {Array} Returns the key-value pairs.
+ */
+function mapToArray(map) {
+  var index = -1,
+      result = Array(map.size);
+
+  map.forEach(function(value, key) {
+    result[++index] = [key, value];
+  });
+  return result;
+}
+
+module.exports = mapToArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_matchesStrictComparable.js":
+/*!*********************************************************!*\
+  !*** ./node_modules/lodash/_matchesStrictComparable.js ***!
+  \*********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * A specialized version of `matchesProperty` for source values suitable
+ * for strict equality comparisons, i.e. `===`.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @param {*} srcValue The value to match.
+ * @returns {Function} Returns the new spec function.
+ */
+function matchesStrictComparable(key, srcValue) {
+  return function(object) {
+    if (object == null) {
+      return false;
+    }
+    return object[key] === srcValue &&
+      (srcValue !== undefined || (key in Object(object)));
+  };
+}
+
+module.exports = matchesStrictComparable;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_memoizeCapped.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_memoizeCapped.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var memoize = __webpack_require__(/*! ./memoize */ "./node_modules/lodash/memoize.js");
+
+/** Used as the maximum memoize cache size. */
+var MAX_MEMOIZE_SIZE = 500;
+
+/**
+ * A specialized version of `_.memoize` which clears the memoized function's
+ * cache when it exceeds `MAX_MEMOIZE_SIZE`.
+ *
+ * @private
+ * @param {Function} func The function to have its output memoized.
+ * @returns {Function} Returns the new memoized function.
+ */
+function memoizeCapped(func) {
+  var result = memoize(func, function(key) {
+    if (cache.size === MAX_MEMOIZE_SIZE) {
+      cache.clear();
+    }
+    return key;
+  });
+
+  var cache = result.cache;
+  return result;
+}
+
+module.exports = memoizeCapped;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_nativeCreate.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_nativeCreate.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getNative = __webpack_require__(/*! ./_getNative */ "./node_modules/lodash/_getNative.js");
+
+/* Built-in method references that are verified to be native. */
+var nativeCreate = getNative(Object, 'create');
+
+module.exports = nativeCreate;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_nativeKeys.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_nativeKeys.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var overArg = __webpack_require__(/*! ./_overArg */ "./node_modules/lodash/_overArg.js");
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeKeys = overArg(Object.keys, Object);
+
+module.exports = nativeKeys;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_nativeKeysIn.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_nativeKeysIn.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * This function is like
+ * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * except that it includes inherited enumerable properties.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+function nativeKeysIn(object) {
+  var result = [];
+  if (object != null) {
+    for (var key in Object(object)) {
+      result.push(key);
+    }
+  }
+  return result;
+}
+
+module.exports = nativeKeysIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_nodeUtil.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_nodeUtil.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(module) {var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js");
+
+/** Detect free variable `exports`. */
+var freeExports =  true && exports && !exports.nodeType && exports;
+
+/** Detect free variable `module`. */
+var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
+
+/** Detect the popular CommonJS extension `module.exports`. */
+var moduleExports = freeModule && freeModule.exports === freeExports;
+
+/** Detect free variable `process` from Node.js. */
+var freeProcess = moduleExports && freeGlobal.process;
+
+/** Used to access faster Node.js helpers. */
+var nodeUtil = (function() {
+  try {
+    // Use `util.types` for Node.js 10+.
+    var types = freeModule && freeModule.require && freeModule.require('util').types;
+
+    if (types) {
+      return types;
+    }
+
+    // Legacy `process.binding('util')` for Node.js < 10.
+    return freeProcess && freeProcess.binding && freeProcess.binding('util');
+  } catch (e) {}
+}());
+
+module.exports = nodeUtil;
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_objectToString.js":
+/*!************************************************!*\
+  !*** ./node_modules/lodash/_objectToString.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/**
+ * Used to resolve the
+ * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+var nativeObjectToString = objectProto.toString;
+
+/**
+ * Converts `value` to a string using `Object.prototype.toString`.
+ *
+ * @private
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ */
+function objectToString(value) {
+  return nativeObjectToString.call(value);
+}
+
+module.exports = objectToString;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_overArg.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_overArg.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Creates a unary function that invokes `func` with its argument transformed.
+ *
+ * @private
+ * @param {Function} func The function to wrap.
+ * @param {Function} transform The argument transform.
+ * @returns {Function} Returns the new function.
+ */
+function overArg(func, transform) {
+  return function(arg) {
+    return func(transform(arg));
+  };
+}
+
+module.exports = overArg;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_overRest.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_overRest.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var apply = __webpack_require__(/*! ./_apply */ "./node_modules/lodash/_apply.js");
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeMax = Math.max;
+
+/**
+ * A specialized version of `baseRest` which transforms the rest array.
+ *
+ * @private
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @param {Function} transform The rest array transform.
+ * @returns {Function} Returns the new function.
+ */
+function overRest(func, start, transform) {
+  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
+  return function() {
+    var args = arguments,
+        index = -1,
+        length = nativeMax(args.length - start, 0),
+        array = Array(length);
+
+    while (++index < length) {
+      array[index] = args[start + index];
+    }
+    index = -1;
+    var otherArgs = Array(start + 1);
+    while (++index < start) {
+      otherArgs[index] = args[index];
+    }
+    otherArgs[start] = transform(array);
+    return apply(func, this, otherArgs);
+  };
+}
+
+module.exports = overRest;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_root.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/_root.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var freeGlobal = __webpack_require__(/*! ./_freeGlobal */ "./node_modules/lodash/_freeGlobal.js");
+
+/** Detect free variable `self`. */
+var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+
+/** Used as a reference to the global object. */
+var root = freeGlobal || freeSelf || Function('return this')();
+
+module.exports = root;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_safeGet.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/_safeGet.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the property to get.
+ * @returns {*} Returns the property value.
+ */
+function safeGet(object, key) {
+  if (key === 'constructor' && typeof object[key] === 'function') {
+    return;
+  }
+
+  if (key == '__proto__') {
+    return;
+  }
+
+  return object[key];
+}
+
+module.exports = safeGet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_setCacheAdd.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_setCacheAdd.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used to stand-in for `undefined` hash values. */
+var HASH_UNDEFINED = '__lodash_hash_undefined__';
+
+/**
+ * Adds `value` to the array cache.
+ *
+ * @private
+ * @name add
+ * @memberOf SetCache
+ * @alias push
+ * @param {*} value The value to cache.
+ * @returns {Object} Returns the cache instance.
+ */
+function setCacheAdd(value) {
+  this.__data__.set(value, HASH_UNDEFINED);
+  return this;
+}
+
+module.exports = setCacheAdd;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_setCacheHas.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_setCacheHas.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Checks if `value` is in the array cache.
+ *
+ * @private
+ * @name has
+ * @memberOf SetCache
+ * @param {*} value The value to search for.
+ * @returns {number} Returns `true` if `value` is found, else `false`.
+ */
+function setCacheHas(value) {
+  return this.__data__.has(value);
+}
+
+module.exports = setCacheHas;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_setToArray.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_setToArray.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Converts `set` to an array of its values.
+ *
+ * @private
+ * @param {Object} set The set to convert.
+ * @returns {Array} Returns the values.
+ */
+function setToArray(set) {
+  var index = -1,
+      result = Array(set.size);
+
+  set.forEach(function(value) {
+    result[++index] = value;
+  });
+  return result;
+}
+
+module.exports = setToArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_setToString.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_setToString.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseSetToString = __webpack_require__(/*! ./_baseSetToString */ "./node_modules/lodash/_baseSetToString.js"),
+    shortOut = __webpack_require__(/*! ./_shortOut */ "./node_modules/lodash/_shortOut.js");
+
+/**
+ * Sets the `toString` method of `func` to return `string`.
+ *
+ * @private
+ * @param {Function} func The function to modify.
+ * @param {Function} string The `toString` result.
+ * @returns {Function} Returns `func`.
+ */
+var setToString = shortOut(baseSetToString);
+
+module.exports = setToString;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_shortOut.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_shortOut.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used to detect hot functions by number of calls within a span of milliseconds. */
+var HOT_COUNT = 800,
+    HOT_SPAN = 16;
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeNow = Date.now;
+
+/**
+ * Creates a function that'll short out and invoke `identity` instead
+ * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
+ * milliseconds.
+ *
+ * @private
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new shortable function.
+ */
+function shortOut(func) {
+  var count = 0,
+      lastCalled = 0;
+
+  return function() {
+    var stamp = nativeNow(),
+        remaining = HOT_SPAN - (stamp - lastCalled);
+
+    lastCalled = stamp;
+    if (remaining > 0) {
+      if (++count >= HOT_COUNT) {
+        return arguments[0];
+      }
+    } else {
+      count = 0;
+    }
+    return func.apply(undefined, arguments);
+  };
+}
+
+module.exports = shortOut;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_stackClear.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_stackClear.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js");
+
+/**
+ * Removes all key-value entries from the stack.
+ *
+ * @private
+ * @name clear
+ * @memberOf Stack
+ */
+function stackClear() {
+  this.__data__ = new ListCache;
+  this.size = 0;
+}
+
+module.exports = stackClear;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_stackDelete.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_stackDelete.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Removes `key` and its value from the stack.
+ *
+ * @private
+ * @name delete
+ * @memberOf Stack
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+function stackDelete(key) {
+  var data = this.__data__,
+      result = data['delete'](key);
+
+  this.size = data.size;
+  return result;
+}
+
+module.exports = stackDelete;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_stackGet.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_stackGet.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Gets the stack value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Stack
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+function stackGet(key) {
+  return this.__data__.get(key);
+}
+
+module.exports = stackGet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_stackHas.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_stackHas.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Checks if a stack value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Stack
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+function stackHas(key) {
+  return this.__data__.has(key);
+}
+
+module.exports = stackHas;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_stackSet.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_stackSet.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var ListCache = __webpack_require__(/*! ./_ListCache */ "./node_modules/lodash/_ListCache.js"),
+    Map = __webpack_require__(/*! ./_Map */ "./node_modules/lodash/_Map.js"),
+    MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js");
+
+/** Used as the size to enable large array optimizations. */
+var LARGE_ARRAY_SIZE = 200;
+
+/**
+ * Sets the stack `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Stack
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the stack cache instance.
+ */
+function stackSet(key, value) {
+  var data = this.__data__;
+  if (data instanceof ListCache) {
+    var pairs = data.__data__;
+    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
+      pairs.push([key, value]);
+      this.size = ++data.size;
+      return this;
+    }
+    data = this.__data__ = new MapCache(pairs);
+  }
+  data.set(key, value);
+  this.size = data.size;
+  return this;
+}
+
+module.exports = stackSet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_strictIndexOf.js":
+/*!***********************************************!*\
+  !*** ./node_modules/lodash/_strictIndexOf.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * A specialized version of `_.indexOf` which performs strict equality
+ * comparisons of values, i.e. `===`.
+ *
+ * @private
+ * @param {Array} array The array to inspect.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+function strictIndexOf(array, value, fromIndex) {
+  var index = fromIndex - 1,
+      length = array.length;
+
+  while (++index < length) {
+    if (array[index] === value) {
+      return index;
+    }
+  }
+  return -1;
+}
+
+module.exports = strictIndexOf;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_stringSize.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/_stringSize.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var asciiSize = __webpack_require__(/*! ./_asciiSize */ "./node_modules/lodash/_asciiSize.js"),
+    hasUnicode = __webpack_require__(/*! ./_hasUnicode */ "./node_modules/lodash/_hasUnicode.js"),
+    unicodeSize = __webpack_require__(/*! ./_unicodeSize */ "./node_modules/lodash/_unicodeSize.js");
+
+/**
+ * Gets the number of symbols in `string`.
+ *
+ * @private
+ * @param {string} string The string to inspect.
+ * @returns {number} Returns the string size.
+ */
+function stringSize(string) {
+  return hasUnicode(string)
+    ? unicodeSize(string)
+    : asciiSize(string);
+}
+
+module.exports = stringSize;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_stringToPath.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/_stringToPath.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var memoizeCapped = __webpack_require__(/*! ./_memoizeCapped */ "./node_modules/lodash/_memoizeCapped.js");
+
+/** Used to match property names within property paths. */
+var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
+
+/** Used to match backslashes in property paths. */
+var reEscapeChar = /\\(\\)?/g;
+
+/**
+ * Converts `string` to a property path array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the property path array.
+ */
+var stringToPath = memoizeCapped(function(string) {
+  var result = [];
+  if (string.charCodeAt(0) === 46 /* . */) {
+    result.push('');
+  }
+  string.replace(rePropName, function(match, number, quote, subString) {
+    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
+  });
+  return result;
+});
+
+module.exports = stringToPath;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_toKey.js":
+/*!***************************************!*\
+  !*** ./node_modules/lodash/_toKey.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js");
+
+/** Used as references for various `Number` constants. */
+var INFINITY = 1 / 0;
+
+/**
+ * Converts `value` to a string key if it's not a string or symbol.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @returns {string|symbol} Returns the key.
+ */
+function toKey(value) {
+  if (typeof value == 'string' || isSymbol(value)) {
+    return value;
+  }
+  var result = (value + '');
+  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
+}
+
+module.exports = toKey;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_toSource.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/_toSource.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used for built-in method references. */
+var funcProto = Function.prototype;
+
+/** Used to resolve the decompiled source of functions. */
+var funcToString = funcProto.toString;
+
+/**
+ * Converts `func` to its source code.
+ *
+ * @private
+ * @param {Function} func The function to convert.
+ * @returns {string} Returns the source code.
+ */
+function toSource(func) {
+  if (func != null) {
+    try {
+      return funcToString.call(func);
+    } catch (e) {}
+    try {
+      return (func + '');
+    } catch (e) {}
+  }
+  return '';
+}
+
+module.exports = toSource;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/_unicodeSize.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/_unicodeSize.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used to compose unicode character classes. */
+var rsAstralRange = '\\ud800-\\udfff',
+    rsComboMarksRange = '\\u0300-\\u036f',
+    reComboHalfMarksRange = '\\ufe20-\\ufe2f',
+    rsComboSymbolsRange = '\\u20d0-\\u20ff',
+    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
+    rsVarRange = '\\ufe0e\\ufe0f';
+
+/** Used to compose unicode capture groups. */
+var rsAstral = '[' + rsAstralRange + ']',
+    rsCombo = '[' + rsComboRange + ']',
+    rsFitz = '\\ud83c[\\udffb-\\udfff]',
+    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
+    rsNonAstral = '[^' + rsAstralRange + ']',
+    rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
+    rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
+    rsZWJ = '\\u200d';
+
+/** Used to compose unicode regexes. */
+var reOptMod = rsModifier + '?',
+    rsOptVar = '[' + rsVarRange + ']?',
+    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
+    rsSeq = rsOptVar + reOptMod + rsOptJoin,
+    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
+
+/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
+var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
+
+/**
+ * Gets the size of a Unicode `string`.
+ *
+ * @private
+ * @param {string} string The string inspect.
+ * @returns {number} Returns the string size.
+ */
+function unicodeSize(string) {
+  var result = reUnicode.lastIndex = 0;
+  while (reUnicode.test(string)) {
+    ++result;
+  }
+  return result;
+}
+
+module.exports = unicodeSize;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/clone.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/clone.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseClone = __webpack_require__(/*! ./_baseClone */ "./node_modules/lodash/_baseClone.js");
+
+/** Used to compose bitmasks for cloning. */
+var CLONE_SYMBOLS_FLAG = 4;
+
+/**
+ * Creates a shallow clone of `value`.
+ *
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
+ * and supports cloning arrays, array buffers, booleans, date objects, maps,
+ * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
+ * arrays. The own enumerable properties of `arguments` objects are cloned
+ * as plain objects. An empty object is returned for uncloneable values such
+ * as error objects, functions, DOM nodes, and WeakMaps.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to clone.
+ * @returns {*} Returns the cloned value.
+ * @see _.cloneDeep
+ * @example
+ *
+ * var objects = [{ 'a': 1 }, { 'b': 2 }];
+ *
+ * var shallow = _.clone(objects);
+ * console.log(shallow[0] === objects[0]);
+ * // => true
+ */
+function clone(value) {
+  return baseClone(value, CLONE_SYMBOLS_FLAG);
+}
+
+module.exports = clone;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/cloneDeep.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/cloneDeep.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseClone = __webpack_require__(/*! ./_baseClone */ "./node_modules/lodash/_baseClone.js");
+
+/** Used to compose bitmasks for cloning. */
+var CLONE_DEEP_FLAG = 1,
+    CLONE_SYMBOLS_FLAG = 4;
+
+/**
+ * This method is like `_.clone` except that it recursively clones `value`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.0.0
+ * @category Lang
+ * @param {*} value The value to recursively clone.
+ * @returns {*} Returns the deep cloned value.
+ * @see _.clone
+ * @example
+ *
+ * var objects = [{ 'a': 1 }, { 'b': 2 }];
+ *
+ * var deep = _.cloneDeep(objects);
+ * console.log(deep[0] === objects[0]);
+ * // => false
+ */
+function cloneDeep(value) {
+  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
+}
+
+module.exports = cloneDeep;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/constant.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/constant.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Creates a function that returns `value`.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Util
+ * @param {*} value The value to return from the new function.
+ * @returns {Function} Returns the new constant function.
+ * @example
+ *
+ * var objects = _.times(2, _.constant({ 'a': 1 }));
+ *
+ * console.log(objects);
+ * // => [{ 'a': 1 }, { 'a': 1 }]
+ *
+ * console.log(objects[0] === objects[1]);
+ * // => true
+ */
+function constant(value) {
+  return function() {
+    return value;
+  };
+}
+
+module.exports = constant;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/defaults.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/defaults.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"),
+    eq = __webpack_require__(/*! ./eq */ "./node_modules/lodash/eq.js"),
+    isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js"),
+    keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js");
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Assigns own and inherited enumerable string keyed properties of source
+ * objects to the destination object for all destination properties that
+ * resolve to `undefined`. Source objects are applied from left to right.
+ * Once a property is set, additional values of the same property are ignored.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @see _.defaultsDeep
+ * @example
+ *
+ * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
+ * // => { 'a': 1, 'b': 2 }
+ */
+var defaults = baseRest(function(object, sources) {
+  object = Object(object);
+
+  var index = -1;
+  var length = sources.length;
+  var guard = length > 2 ? sources[2] : undefined;
+
+  if (guard && isIterateeCall(sources[0], sources[1], guard)) {
+    length = 1;
+  }
+
+  while (++index < length) {
+    var source = sources[index];
+    var props = keysIn(source);
+    var propsIndex = -1;
+    var propsLength = props.length;
+
+    while (++propsIndex < propsLength) {
+      var key = props[propsIndex];
+      var value = object[key];
+
+      if (value === undefined ||
+          (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
+        object[key] = source[key];
+      }
+    }
+  }
+
+  return object;
+});
+
+module.exports = defaults;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/each.js":
+/*!*************************************!*\
+  !*** ./node_modules/lodash/each.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(/*! ./forEach */ "./node_modules/lodash/forEach.js");
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/eq.js":
+/*!***********************************!*\
+  !*** ./node_modules/lodash/eq.js ***!
+  \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Performs a
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * comparison between two values to determine if they are equivalent.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ * var other = { 'a': 1 };
+ *
+ * _.eq(object, object);
+ * // => true
+ *
+ * _.eq(object, other);
+ * // => false
+ *
+ * _.eq('a', 'a');
+ * // => true
+ *
+ * _.eq('a', Object('a'));
+ * // => false
+ *
+ * _.eq(NaN, NaN);
+ * // => true
+ */
+function eq(value, other) {
+  return value === other || (value !== value && other !== other);
+}
+
+module.exports = eq;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/filter.js":
+/*!***************************************!*\
+  !*** ./node_modules/lodash/filter.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayFilter = __webpack_require__(/*! ./_arrayFilter */ "./node_modules/lodash/_arrayFilter.js"),
+    baseFilter = __webpack_require__(/*! ./_baseFilter */ "./node_modules/lodash/_baseFilter.js"),
+    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js");
+
+/**
+ * Iterates over elements of `collection`, returning an array of all elements
+ * `predicate` returns truthy for. The predicate is invoked with three
+ * arguments: (value, index|key, collection).
+ *
+ * **Note:** Unlike `_.remove`, this method returns a new array.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new filtered array.
+ * @see _.reject
+ * @example
+ *
+ * var users = [
+ *   { 'user': 'barney', 'age': 36, 'active': true },
+ *   { 'user': 'fred',   'age': 40, 'active': false }
+ * ];
+ *
+ * _.filter(users, function(o) { return !o.active; });
+ * // => objects for ['fred']
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.filter(users, { 'age': 36, 'active': true });
+ * // => objects for ['barney']
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.filter(users, ['active', false]);
+ * // => objects for ['fred']
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.filter(users, 'active');
+ * // => objects for ['barney']
+ */
+function filter(collection, predicate) {
+  var func = isArray(collection) ? arrayFilter : baseFilter;
+  return func(collection, baseIteratee(predicate, 3));
+}
+
+module.exports = filter;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/find.js":
+/*!*************************************!*\
+  !*** ./node_modules/lodash/find.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createFind = __webpack_require__(/*! ./_createFind */ "./node_modules/lodash/_createFind.js"),
+    findIndex = __webpack_require__(/*! ./findIndex */ "./node_modules/lodash/findIndex.js");
+
+/**
+ * Iterates over elements of `collection`, returning the first element
+ * `predicate` returns truthy for. The predicate is invoked with three
+ * arguments: (value, index|key, collection).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {*} Returns the matched element, else `undefined`.
+ * @example
+ *
+ * var users = [
+ *   { 'user': 'barney',  'age': 36, 'active': true },
+ *   { 'user': 'fred',    'age': 40, 'active': false },
+ *   { 'user': 'pebbles', 'age': 1,  'active': true }
+ * ];
+ *
+ * _.find(users, function(o) { return o.age < 40; });
+ * // => object for 'barney'
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.find(users, { 'age': 1, 'active': true });
+ * // => object for 'pebbles'
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.find(users, ['active', false]);
+ * // => object for 'fred'
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.find(users, 'active');
+ * // => object for 'barney'
+ */
+var find = createFind(findIndex);
+
+module.exports = find;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/findIndex.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/findIndex.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseFindIndex = __webpack_require__(/*! ./_baseFindIndex */ "./node_modules/lodash/_baseFindIndex.js"),
+    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"),
+    toInteger = __webpack_require__(/*! ./toInteger */ "./node_modules/lodash/toInteger.js");
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeMax = Math.max;
+
+/**
+ * This method is like `_.find` except that it returns the index of the first
+ * element `predicate` returns truthy for instead of the element itself.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.1.0
+ * @category Array
+ * @param {Array} array The array to inspect.
+ * @param {Function} [predicate=_.identity] The function invoked per iteration.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {number} Returns the index of the found element, else `-1`.
+ * @example
+ *
+ * var users = [
+ *   { 'user': 'barney',  'active': false },
+ *   { 'user': 'fred',    'active': false },
+ *   { 'user': 'pebbles', 'active': true }
+ * ];
+ *
+ * _.findIndex(users, function(o) { return o.user == 'barney'; });
+ * // => 0
+ *
+ * // The `_.matches` iteratee shorthand.
+ * _.findIndex(users, { 'user': 'fred', 'active': false });
+ * // => 1
+ *
+ * // The `_.matchesProperty` iteratee shorthand.
+ * _.findIndex(users, ['active', false]);
+ * // => 0
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.findIndex(users, 'active');
+ * // => 2
+ */
+function findIndex(array, predicate, fromIndex) {
+  var length = array == null ? 0 : array.length;
+  if (!length) {
+    return -1;
+  }
+  var index = fromIndex == null ? 0 : toInteger(fromIndex);
+  if (index < 0) {
+    index = nativeMax(length + index, 0);
+  }
+  return baseFindIndex(array, baseIteratee(predicate, 3), index);
+}
+
+module.exports = findIndex;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/flatten.js":
+/*!****************************************!*\
+  !*** ./node_modules/lodash/flatten.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js");
+
+/**
+ * Flattens `array` a single level deep.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to flatten.
+ * @returns {Array} Returns the new flattened array.
+ * @example
+ *
+ * _.flatten([1, [2, [3, [4]], 5]]);
+ * // => [1, 2, [3, [4]], 5]
+ */
+function flatten(array) {
+  var length = array == null ? 0 : array.length;
+  return length ? baseFlatten(array, 1) : [];
+}
+
+module.exports = flatten;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/forEach.js":
+/*!****************************************!*\
+  !*** ./node_modules/lodash/forEach.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"),
+    baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"),
+    castFunction = __webpack_require__(/*! ./_castFunction */ "./node_modules/lodash/_castFunction.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js");
+
+/**
+ * Iterates over elements of `collection` and invokes `iteratee` for each element.
+ * The iteratee is invoked with three arguments: (value, index|key, collection).
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * **Note:** As with other "Collections" methods, objects with a "length"
+ * property are iterated like arrays. To avoid this behavior use `_.forIn`
+ * or `_.forOwn` for object iteration.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @alias each
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ * @see _.forEachRight
+ * @example
+ *
+ * _.forEach([1, 2], function(value) {
+ *   console.log(value);
+ * });
+ * // => Logs `1` then `2`.
+ *
+ * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
+ *   console.log(key);
+ * });
+ * // => Logs 'a' then 'b' (iteration order is not guaranteed).
+ */
+function forEach(collection, iteratee) {
+  var func = isArray(collection) ? arrayEach : baseEach;
+  return func(collection, castFunction(iteratee));
+}
+
+module.exports = forEach;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/forIn.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/forIn.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseFor = __webpack_require__(/*! ./_baseFor */ "./node_modules/lodash/_baseFor.js"),
+    castFunction = __webpack_require__(/*! ./_castFunction */ "./node_modules/lodash/_castFunction.js"),
+    keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js");
+
+/**
+ * Iterates over own and inherited enumerable string keyed properties of an
+ * object and invokes `iteratee` for each property. The iteratee is invoked
+ * with three arguments: (value, key, object). Iteratee functions may exit
+ * iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.3.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @see _.forInRight
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ *   this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forIn(new Foo, function(value, key) {
+ *   console.log(key);
+ * });
+ * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
+ */
+function forIn(object, iteratee) {
+  return object == null
+    ? object
+    : baseFor(object, castFunction(iteratee), keysIn);
+}
+
+module.exports = forIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/get.js":
+/*!************************************!*\
+  !*** ./node_modules/lodash/get.js ***!
+  \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGet = __webpack_require__(/*! ./_baseGet */ "./node_modules/lodash/_baseGet.js");
+
+/**
+ * Gets the value at `path` of `object`. If the resolved value is
+ * `undefined`, the `defaultValue` is returned in its place.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.7.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @param {*} [defaultValue] The value returned for `undefined` resolved values.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.get(object, 'a[0].b.c');
+ * // => 3
+ *
+ * _.get(object, ['a', '0', 'b', 'c']);
+ * // => 3
+ *
+ * _.get(object, 'a.b.c', 'default');
+ * // => 'default'
+ */
+function get(object, path, defaultValue) {
+  var result = object == null ? undefined : baseGet(object, path);
+  return result === undefined ? defaultValue : result;
+}
+
+module.exports = get;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/has.js":
+/*!************************************!*\
+  !*** ./node_modules/lodash/has.js ***!
+  \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseHas = __webpack_require__(/*! ./_baseHas */ "./node_modules/lodash/_baseHas.js"),
+    hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js");
+
+/**
+ * Checks if `path` is a direct property of `object`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ * @example
+ *
+ * var object = { 'a': { 'b': 2 } };
+ * var other = _.create({ 'a': _.create({ 'b': 2 }) });
+ *
+ * _.has(object, 'a');
+ * // => true
+ *
+ * _.has(object, 'a.b');
+ * // => true
+ *
+ * _.has(object, ['a', 'b']);
+ * // => true
+ *
+ * _.has(other, 'a');
+ * // => false
+ */
+function has(object, path) {
+  return object != null && hasPath(object, path, baseHas);
+}
+
+module.exports = has;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/hasIn.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/hasIn.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseHasIn = __webpack_require__(/*! ./_baseHasIn */ "./node_modules/lodash/_baseHasIn.js"),
+    hasPath = __webpack_require__(/*! ./_hasPath */ "./node_modules/lodash/_hasPath.js");
+
+/**
+ * Checks if `path` is a direct or inherited property of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ * @example
+ *
+ * var object = _.create({ 'a': _.create({ 'b': 2 }) });
+ *
+ * _.hasIn(object, 'a');
+ * // => true
+ *
+ * _.hasIn(object, 'a.b');
+ * // => true
+ *
+ * _.hasIn(object, ['a', 'b']);
+ * // => true
+ *
+ * _.hasIn(object, 'b');
+ * // => false
+ */
+function hasIn(object, path) {
+  return object != null && hasPath(object, path, baseHasIn);
+}
+
+module.exports = hasIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/identity.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/identity.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * This method returns the first argument it receives.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Util
+ * @param {*} value Any value.
+ * @returns {*} Returns `value`.
+ * @example
+ *
+ * var object = { 'a': 1 };
+ *
+ * console.log(_.identity(object) === object);
+ * // => true
+ */
+function identity(value) {
+  return value;
+}
+
+module.exports = identity;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isArguments.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/isArguments.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsArguments = __webpack_require__(/*! ./_baseIsArguments */ "./node_modules/lodash/_baseIsArguments.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/** Built-in value references. */
+var propertyIsEnumerable = objectProto.propertyIsEnumerable;
+
+/**
+ * Checks if `value` is likely an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an `arguments` object,
+ *  else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
+  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
+    !propertyIsEnumerable.call(value, 'callee');
+};
+
+module.exports = isArguments;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isArray.js":
+/*!****************************************!*\
+  !*** ./node_modules/lodash/isArray.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(document.body.children);
+ * // => false
+ *
+ * _.isArray('abc');
+ * // => false
+ *
+ * _.isArray(_.noop);
+ * // => false
+ */
+var isArray = Array.isArray;
+
+module.exports = isArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isArrayLike.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/isArrayLike.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"),
+    isLength = __webpack_require__(/*! ./isLength */ "./node_modules/lodash/isLength.js");
+
+/**
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+function isArrayLike(value) {
+  return value != null && isLength(value.length) && !isFunction(value);
+}
+
+module.exports = isArrayLike;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isArrayLikeObject.js":
+/*!**************************************************!*\
+  !*** ./node_modules/lodash/isArrayLikeObject.js ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object,
+ *  else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
+function isArrayLikeObject(value) {
+  return isObjectLike(value) && isArrayLike(value);
+}
+
+module.exports = isArrayLikeObject;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isBuffer.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/isBuffer.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(module) {var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js"),
+    stubFalse = __webpack_require__(/*! ./stubFalse */ "./node_modules/lodash/stubFalse.js");
+
+/** Detect free variable `exports`. */
+var freeExports =  true && exports && !exports.nodeType && exports;
+
+/** Detect free variable `module`. */
+var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
+
+/** Detect the popular CommonJS extension `module.exports`. */
+var moduleExports = freeModule && freeModule.exports === freeExports;
+
+/** Built-in value references. */
+var Buffer = moduleExports ? root.Buffer : undefined;
+
+/* Built-in method references for those with the same name as other `lodash` methods. */
+var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
+
+/**
+ * Checks if `value` is a buffer.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
+ * @example
+ *
+ * _.isBuffer(new Buffer(2));
+ * // => true
+ *
+ * _.isBuffer(new Uint8Array(2));
+ * // => false
+ */
+var isBuffer = nativeIsBuffer || stubFalse;
+
+module.exports = isBuffer;
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isEmpty.js":
+/*!****************************************!*\
+  !*** ./node_modules/lodash/isEmpty.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"),
+    getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"),
+    isArguments = __webpack_require__(/*! ./isArguments */ "./node_modules/lodash/isArguments.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"),
+    isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"),
+    isPrototype = __webpack_require__(/*! ./_isPrototype */ "./node_modules/lodash/_isPrototype.js"),
+    isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js");
+
+/** `Object#toString` result references. */
+var mapTag = '[object Map]',
+    setTag = '[object Set]';
+
+/** Used for built-in method references. */
+var objectProto = Object.prototype;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/**
+ * Checks if `value` is an empty object, collection, map, or set.
+ *
+ * Objects are considered empty if they have no own enumerable string keyed
+ * properties.
+ *
+ * Array-like values such as `arguments` objects, arrays, buffers, strings, or
+ * jQuery-like collections are considered empty if they have a `length` of `0`.
+ * Similarly, maps and sets are considered empty if they have a `size` of `0`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+ * @example
+ *
+ * _.isEmpty(null);
+ * // => true
+ *
+ * _.isEmpty(true);
+ * // => true
+ *
+ * _.isEmpty(1);
+ * // => true
+ *
+ * _.isEmpty([1, 2, 3]);
+ * // => false
+ *
+ * _.isEmpty({ 'a': 1 });
+ * // => false
+ */
+function isEmpty(value) {
+  if (value == null) {
+    return true;
+  }
+  if (isArrayLike(value) &&
+      (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
+        isBuffer(value) || isTypedArray(value) || isArguments(value))) {
+    return !value.length;
+  }
+  var tag = getTag(value);
+  if (tag == mapTag || tag == setTag) {
+    return !value.size;
+  }
+  if (isPrototype(value)) {
+    return !baseKeys(value).length;
+  }
+  for (var key in value) {
+    if (hasOwnProperty.call(value, key)) {
+      return false;
+    }
+  }
+  return true;
+}
+
+module.exports = isEmpty;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isFunction.js":
+/*!*******************************************!*\
+  !*** ./node_modules/lodash/isFunction.js ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"),
+    isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js");
+
+/** `Object#toString` result references. */
+var asyncTag = '[object AsyncFunction]',
+    funcTag = '[object Function]',
+    genTag = '[object GeneratorFunction]',
+    proxyTag = '[object Proxy]';
+
+/**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a function, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+function isFunction(value) {
+  if (!isObject(value)) {
+    return false;
+  }
+  // The use of `Object#toString` avoids issues with the `typeof` operator
+  // in Safari 9 which returns 'object' for typed arrays and other constructors.
+  var tag = baseGetTag(value);
+  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
+}
+
+module.exports = isFunction;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isLength.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/isLength.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/** Used as references for various `Number` constants. */
+var MAX_SAFE_INTEGER = 9007199254740991;
+
+/**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
+function isLength(value) {
+  return typeof value == 'number' &&
+    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+}
+
+module.exports = isLength;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isMap.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/isMap.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsMap = __webpack_require__(/*! ./_baseIsMap */ "./node_modules/lodash/_baseIsMap.js"),
+    baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"),
+    nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js");
+
+/* Node.js helper references. */
+var nodeIsMap = nodeUtil && nodeUtil.isMap;
+
+/**
+ * Checks if `value` is classified as a `Map` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a map, else `false`.
+ * @example
+ *
+ * _.isMap(new Map);
+ * // => true
+ *
+ * _.isMap(new WeakMap);
+ * // => false
+ */
+var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
+
+module.exports = isMap;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isObject.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/isObject.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Checks if `value` is the
+ * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
+ * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+function isObject(value) {
+  var type = typeof value;
+  return value != null && (type == 'object' || type == 'function');
+}
+
+module.exports = isObject;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isObjectLike.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/isObjectLike.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+function isObjectLike(value) {
+  return value != null && typeof value == 'object';
+}
+
+module.exports = isObjectLike;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isPlainObject.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/isPlainObject.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"),
+    getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/** `Object#toString` result references. */
+var objectTag = '[object Object]';
+
+/** Used for built-in method references. */
+var funcProto = Function.prototype,
+    objectProto = Object.prototype;
+
+/** Used to resolve the decompiled source of functions. */
+var funcToString = funcProto.toString;
+
+/** Used to check objects for own properties. */
+var hasOwnProperty = objectProto.hasOwnProperty;
+
+/** Used to infer the `Object` constructor. */
+var objectCtorString = funcToString.call(Object);
+
+/**
+ * Checks if `value` is a plain object, that is, an object created by the
+ * `Object` constructor or one with a `[[Prototype]]` of `null`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.8.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ * }
+ *
+ * _.isPlainObject(new Foo);
+ * // => false
+ *
+ * _.isPlainObject([1, 2, 3]);
+ * // => false
+ *
+ * _.isPlainObject({ 'x': 0, 'y': 0 });
+ * // => true
+ *
+ * _.isPlainObject(Object.create(null));
+ * // => true
+ */
+function isPlainObject(value) {
+  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
+    return false;
+  }
+  var proto = getPrototype(value);
+  if (proto === null) {
+    return true;
+  }
+  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
+  return typeof Ctor == 'function' && Ctor instanceof Ctor &&
+    funcToString.call(Ctor) == objectCtorString;
+}
+
+module.exports = isPlainObject;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isSet.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/isSet.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsSet = __webpack_require__(/*! ./_baseIsSet */ "./node_modules/lodash/_baseIsSet.js"),
+    baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"),
+    nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js");
+
+/* Node.js helper references. */
+var nodeIsSet = nodeUtil && nodeUtil.isSet;
+
+/**
+ * Checks if `value` is classified as a `Set` object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.3.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a set, else `false`.
+ * @example
+ *
+ * _.isSet(new Set);
+ * // => true
+ *
+ * _.isSet(new WeakSet);
+ * // => false
+ */
+var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
+
+module.exports = isSet;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isString.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/isString.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/** `Object#toString` result references. */
+var stringTag = '[object String]';
+
+/**
+ * Checks if `value` is classified as a `String` primitive or object.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a string, else `false`.
+ * @example
+ *
+ * _.isString('abc');
+ * // => true
+ *
+ * _.isString(1);
+ * // => false
+ */
+function isString(value) {
+  return typeof value == 'string' ||
+    (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
+}
+
+module.exports = isString;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isSymbol.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/isSymbol.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseGetTag = __webpack_require__(/*! ./_baseGetTag */ "./node_modules/lodash/_baseGetTag.js"),
+    isObjectLike = __webpack_require__(/*! ./isObjectLike */ "./node_modules/lodash/isObjectLike.js");
+
+/** `Object#toString` result references. */
+var symbolTag = '[object Symbol]';
+
+/**
+ * Checks if `value` is classified as a `Symbol` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
+ * @example
+ *
+ * _.isSymbol(Symbol.iterator);
+ * // => true
+ *
+ * _.isSymbol('abc');
+ * // => false
+ */
+function isSymbol(value) {
+  return typeof value == 'symbol' ||
+    (isObjectLike(value) && baseGetTag(value) == symbolTag);
+}
+
+module.exports = isSymbol;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isTypedArray.js":
+/*!*********************************************!*\
+  !*** ./node_modules/lodash/isTypedArray.js ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseIsTypedArray = __webpack_require__(/*! ./_baseIsTypedArray */ "./node_modules/lodash/_baseIsTypedArray.js"),
+    baseUnary = __webpack_require__(/*! ./_baseUnary */ "./node_modules/lodash/_baseUnary.js"),
+    nodeUtil = __webpack_require__(/*! ./_nodeUtil */ "./node_modules/lodash/_nodeUtil.js");
+
+/* Node.js helper references. */
+var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
+
+/**
+ * Checks if `value` is classified as a typed array.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
+ * @example
+ *
+ * _.isTypedArray(new Uint8Array);
+ * // => true
+ *
+ * _.isTypedArray([]);
+ * // => false
+ */
+var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
+
+module.exports = isTypedArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/isUndefined.js":
+/*!********************************************!*\
+  !*** ./node_modules/lodash/isUndefined.js ***!
+  \********************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Checks if `value` is `undefined`.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
+ * @example
+ *
+ * _.isUndefined(void 0);
+ * // => true
+ *
+ * _.isUndefined(null);
+ * // => false
+ */
+function isUndefined(value) {
+  return value === undefined;
+}
+
+module.exports = isUndefined;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/keys.js":
+/*!*************************************!*\
+  !*** ./node_modules/lodash/keys.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"),
+    baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"),
+    isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js");
+
+/**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ *   this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+function keys(object) {
+  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
+}
+
+module.exports = keys;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/keysIn.js":
+/*!***************************************!*\
+  !*** ./node_modules/lodash/keysIn.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayLikeKeys = __webpack_require__(/*! ./_arrayLikeKeys */ "./node_modules/lodash/_arrayLikeKeys.js"),
+    baseKeysIn = __webpack_require__(/*! ./_baseKeysIn */ "./node_modules/lodash/_baseKeysIn.js"),
+    isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js");
+
+/**
+ * Creates an array of the own and inherited enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ *   this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keysIn(new Foo);
+ * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
+ */
+function keysIn(object) {
+  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
+}
+
+module.exports = keysIn;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/last.js":
+/*!*************************************!*\
+  !*** ./node_modules/lodash/last.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * Gets the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the last element of `array`.
+ * @example
+ *
+ * _.last([1, 2, 3]);
+ * // => 3
+ */
+function last(array) {
+  var length = array == null ? 0 : array.length;
+  return length ? array[length - 1] : undefined;
+}
+
+module.exports = last;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/map.js":
+/*!************************************!*\
+  !*** ./node_modules/lodash/map.js ***!
+  \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayMap = __webpack_require__(/*! ./_arrayMap */ "./node_modules/lodash/_arrayMap.js"),
+    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"),
+    baseMap = __webpack_require__(/*! ./_baseMap */ "./node_modules/lodash/_baseMap.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js");
+
+/**
+ * Creates an array of values by running each element in `collection` thru
+ * `iteratee`. The iteratee is invoked with three arguments:
+ * (value, index|key, collection).
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
+ *
+ * The guarded methods are:
+ * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
+ * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
+ * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
+ * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ * @example
+ *
+ * function square(n) {
+ *   return n * n;
+ * }
+ *
+ * _.map([4, 8], square);
+ * // => [16, 64]
+ *
+ * _.map({ 'a': 4, 'b': 8 }, square);
+ * // => [16, 64] (iteration order is not guaranteed)
+ *
+ * var users = [
+ *   { 'user': 'barney' },
+ *   { 'user': 'fred' }
+ * ];
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.map(users, 'user');
+ * // => ['barney', 'fred']
+ */
+function map(collection, iteratee) {
+  var func = isArray(collection) ? arrayMap : baseMap;
+  return func(collection, baseIteratee(iteratee, 3));
+}
+
+module.exports = map;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/mapValues.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/mapValues.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseAssignValue = __webpack_require__(/*! ./_baseAssignValue */ "./node_modules/lodash/_baseAssignValue.js"),
+    baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"),
+    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js");
+
+/**
+ * Creates an object with the same keys as `object` and values generated
+ * by running each own enumerable string keyed property of `object` thru
+ * `iteratee`. The iteratee is invoked with three arguments:
+ * (value, key, object).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns the new mapped object.
+ * @see _.mapKeys
+ * @example
+ *
+ * var users = {
+ *   'fred':    { 'user': 'fred',    'age': 40 },
+ *   'pebbles': { 'user': 'pebbles', 'age': 1 }
+ * };
+ *
+ * _.mapValues(users, function(o) { return o.age; });
+ * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.mapValues(users, 'age');
+ * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
+ */
+function mapValues(object, iteratee) {
+  var result = {};
+  iteratee = baseIteratee(iteratee, 3);
+
+  baseForOwn(object, function(value, key, object) {
+    baseAssignValue(result, key, iteratee(value, key, object));
+  });
+  return result;
+}
+
+module.exports = mapValues;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/max.js":
+/*!************************************!*\
+  !*** ./node_modules/lodash/max.js ***!
+  \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"),
+    baseGt = __webpack_require__(/*! ./_baseGt */ "./node_modules/lodash/_baseGt.js"),
+    identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js");
+
+/**
+ * Computes the maximum value of `array`. If `array` is empty or falsey,
+ * `undefined` is returned.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Math
+ * @param {Array} array The array to iterate over.
+ * @returns {*} Returns the maximum value.
+ * @example
+ *
+ * _.max([4, 2, 8, 6]);
+ * // => 8
+ *
+ * _.max([]);
+ * // => undefined
+ */
+function max(array) {
+  return (array && array.length)
+    ? baseExtremum(array, identity, baseGt)
+    : undefined;
+}
+
+module.exports = max;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/memoize.js":
+/*!****************************************!*\
+  !*** ./node_modules/lodash/memoize.js ***!
+  \****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var MapCache = __webpack_require__(/*! ./_MapCache */ "./node_modules/lodash/_MapCache.js");
+
+/** Error message constants. */
+var FUNC_ERROR_TEXT = 'Expected a function';
+
+/**
+ * Creates a function that memoizes the result of `func`. If `resolver` is
+ * provided, it determines the cache key for storing the result based on the
+ * arguments provided to the memoized function. By default, the first argument
+ * provided to the memoized function is used as the map cache key. The `func`
+ * is invoked with the `this` binding of the memoized function.
+ *
+ * **Note:** The cache is exposed as the `cache` property on the memoized
+ * function. Its creation may be customized by replacing the `_.memoize.Cache`
+ * constructor with one whose instances implement the
+ * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
+ * method interface of `clear`, `delete`, `get`, `has`, and `set`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Function
+ * @param {Function} func The function to have its output memoized.
+ * @param {Function} [resolver] The function to resolve the cache key.
+ * @returns {Function} Returns the new memoized function.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': 2 };
+ * var other = { 'c': 3, 'd': 4 };
+ *
+ * var values = _.memoize(_.values);
+ * values(object);
+ * // => [1, 2]
+ *
+ * values(other);
+ * // => [3, 4]
+ *
+ * object.a = 2;
+ * values(object);
+ * // => [1, 2]
+ *
+ * // Modify the result cache.
+ * values.cache.set(object, ['a', 'b']);
+ * values(object);
+ * // => ['a', 'b']
+ *
+ * // Replace `_.memoize.Cache`.
+ * _.memoize.Cache = WeakMap;
+ */
+function memoize(func, resolver) {
+  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
+    throw new TypeError(FUNC_ERROR_TEXT);
+  }
+  var memoized = function() {
+    var args = arguments,
+        key = resolver ? resolver.apply(this, args) : args[0],
+        cache = memoized.cache;
+
+    if (cache.has(key)) {
+      return cache.get(key);
+    }
+    var result = func.apply(this, args);
+    memoized.cache = cache.set(key, result) || cache;
+    return result;
+  };
+  memoized.cache = new (memoize.Cache || MapCache);
+  return memoized;
+}
+
+// Expose `MapCache`.
+memoize.Cache = MapCache;
+
+module.exports = memoize;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/merge.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/merge.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseMerge = __webpack_require__(/*! ./_baseMerge */ "./node_modules/lodash/_baseMerge.js"),
+    createAssigner = __webpack_require__(/*! ./_createAssigner */ "./node_modules/lodash/_createAssigner.js");
+
+/**
+ * This method is like `_.assign` except that it recursively merges own and
+ * inherited enumerable string keyed properties of source objects into the
+ * destination object. Source properties that resolve to `undefined` are
+ * skipped if a destination value exists. Array and plain object properties
+ * are merged recursively. Other objects and value types are overridden by
+ * assignment. Source objects are applied from left to right. Subsequent
+ * sources overwrite property assignments of previous sources.
+ *
+ * **Note:** This method mutates `object`.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.5.0
+ * @category Object
+ * @param {Object} object The destination object.
+ * @param {...Object} [sources] The source objects.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * var object = {
+ *   'a': [{ 'b': 2 }, { 'd': 4 }]
+ * };
+ *
+ * var other = {
+ *   'a': [{ 'c': 3 }, { 'e': 5 }]
+ * };
+ *
+ * _.merge(object, other);
+ * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
+ */
+var merge = createAssigner(function(object, source, srcIndex) {
+  baseMerge(object, source, srcIndex);
+});
+
+module.exports = merge;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/min.js":
+/*!************************************!*\
+  !*** ./node_modules/lodash/min.js ***!
+  \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"),
+    baseLt = __webpack_require__(/*! ./_baseLt */ "./node_modules/lodash/_baseLt.js"),
+    identity = __webpack_require__(/*! ./identity */ "./node_modules/lodash/identity.js");
+
+/**
+ * Computes the minimum value of `array`. If `array` is empty or falsey,
+ * `undefined` is returned.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Math
+ * @param {Array} array The array to iterate over.
+ * @returns {*} Returns the minimum value.
+ * @example
+ *
+ * _.min([4, 2, 8, 6]);
+ * // => 2
+ *
+ * _.min([]);
+ * // => undefined
+ */
+function min(array) {
+  return (array && array.length)
+    ? baseExtremum(array, identity, baseLt)
+    : undefined;
+}
+
+module.exports = min;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/minBy.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/minBy.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseExtremum = __webpack_require__(/*! ./_baseExtremum */ "./node_modules/lodash/_baseExtremum.js"),
+    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"),
+    baseLt = __webpack_require__(/*! ./_baseLt */ "./node_modules/lodash/_baseLt.js");
+
+/**
+ * This method is like `_.min` except that it accepts `iteratee` which is
+ * invoked for each element in `array` to generate the criterion by which
+ * the value is ranked. The iteratee is invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Math
+ * @param {Array} array The array to iterate over.
+ * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
+ * @returns {*} Returns the minimum value.
+ * @example
+ *
+ * var objects = [{ 'n': 1 }, { 'n': 2 }];
+ *
+ * _.minBy(objects, function(o) { return o.n; });
+ * // => { 'n': 1 }
+ *
+ * // The `_.property` iteratee shorthand.
+ * _.minBy(objects, 'n');
+ * // => { 'n': 1 }
+ */
+function minBy(array, iteratee) {
+  return (array && array.length)
+    ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt)
+    : undefined;
+}
+
+module.exports = minBy;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/noop.js":
+/*!*************************************!*\
+  !*** ./node_modules/lodash/noop.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * This method returns `undefined`.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.3.0
+ * @category Util
+ * @example
+ *
+ * _.times(2, _.noop);
+ * // => [undefined, undefined]
+ */
+function noop() {
+  // No operation performed.
+}
+
+module.exports = noop;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/now.js":
+/*!************************************!*\
+  !*** ./node_modules/lodash/now.js ***!
+  \************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var root = __webpack_require__(/*! ./_root */ "./node_modules/lodash/_root.js");
+
+/**
+ * Gets the timestamp of the number of milliseconds that have elapsed since
+ * the Unix epoch (1 January 1970 00:00:00 UTC).
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Date
+ * @returns {number} Returns the timestamp.
+ * @example
+ *
+ * _.defer(function(stamp) {
+ *   console.log(_.now() - stamp);
+ * }, _.now());
+ * // => Logs the number of milliseconds it took for the deferred invocation.
+ */
+var now = function() {
+  return root.Date.now();
+};
+
+module.exports = now;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/pick.js":
+/*!*************************************!*\
+  !*** ./node_modules/lodash/pick.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var basePick = __webpack_require__(/*! ./_basePick */ "./node_modules/lodash/_basePick.js"),
+    flatRest = __webpack_require__(/*! ./_flatRest */ "./node_modules/lodash/_flatRest.js");
+
+/**
+ * Creates an object composed of the picked `object` properties.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The source object.
+ * @param {...(string|string[])} [paths] The property paths to pick.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * var object = { 'a': 1, 'b': '2', 'c': 3 };
+ *
+ * _.pick(object, ['a', 'c']);
+ * // => { 'a': 1, 'c': 3 }
+ */
+var pick = flatRest(function(object, paths) {
+  return object == null ? {} : basePick(object, paths);
+});
+
+module.exports = pick;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/property.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/property.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseProperty = __webpack_require__(/*! ./_baseProperty */ "./node_modules/lodash/_baseProperty.js"),
+    basePropertyDeep = __webpack_require__(/*! ./_basePropertyDeep */ "./node_modules/lodash/_basePropertyDeep.js"),
+    isKey = __webpack_require__(/*! ./_isKey */ "./node_modules/lodash/_isKey.js"),
+    toKey = __webpack_require__(/*! ./_toKey */ "./node_modules/lodash/_toKey.js");
+
+/**
+ * Creates a function that returns the value at `path` of a given object.
+ *
+ * @static
+ * @memberOf _
+ * @since 2.4.0
+ * @category Util
+ * @param {Array|string} path The path of the property to get.
+ * @returns {Function} Returns the new accessor function.
+ * @example
+ *
+ * var objects = [
+ *   { 'a': { 'b': 2 } },
+ *   { 'a': { 'b': 1 } }
+ * ];
+ *
+ * _.map(objects, _.property('a.b'));
+ * // => [2, 1]
+ *
+ * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
+ * // => [1, 2]
+ */
+function property(path) {
+  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
+}
+
+module.exports = property;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/range.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/range.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var createRange = __webpack_require__(/*! ./_createRange */ "./node_modules/lodash/_createRange.js");
+
+/**
+ * Creates an array of numbers (positive and/or negative) progressing from
+ * `start` up to, but not including, `end`. A step of `-1` is used if a negative
+ * `start` is specified without an `end` or `step`. If `end` is not specified,
+ * it's set to `start` with `start` then set to `0`.
+ *
+ * **Note:** JavaScript follows the IEEE-754 standard for resolving
+ * floating-point values which can produce unexpected results.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Util
+ * @param {number} [start=0] The start of the range.
+ * @param {number} end The end of the range.
+ * @param {number} [step=1] The value to increment or decrement by.
+ * @returns {Array} Returns the range of numbers.
+ * @see _.inRange, _.rangeRight
+ * @example
+ *
+ * _.range(4);
+ * // => [0, 1, 2, 3]
+ *
+ * _.range(-4);
+ * // => [0, -1, -2, -3]
+ *
+ * _.range(1, 5);
+ * // => [1, 2, 3, 4]
+ *
+ * _.range(0, 20, 5);
+ * // => [0, 5, 10, 15]
+ *
+ * _.range(0, -4, -1);
+ * // => [0, -1, -2, -3]
+ *
+ * _.range(1, 4, 0);
+ * // => [1, 1, 1]
+ *
+ * _.range(0);
+ * // => []
+ */
+var range = createRange();
+
+module.exports = range;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/reduce.js":
+/*!***************************************!*\
+  !*** ./node_modules/lodash/reduce.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayReduce = __webpack_require__(/*! ./_arrayReduce */ "./node_modules/lodash/_arrayReduce.js"),
+    baseEach = __webpack_require__(/*! ./_baseEach */ "./node_modules/lodash/_baseEach.js"),
+    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"),
+    baseReduce = __webpack_require__(/*! ./_baseReduce */ "./node_modules/lodash/_baseReduce.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js");
+
+/**
+ * Reduces `collection` to a value which is the accumulated result of running
+ * each element in `collection` thru `iteratee`, where each successive
+ * invocation is supplied the return value of the previous. If `accumulator`
+ * is not given, the first element of `collection` is used as the initial
+ * value. The iteratee is invoked with four arguments:
+ * (accumulator, value, index|key, collection).
+ *
+ * Many lodash methods are guarded to work as iteratees for methods like
+ * `_.reduce`, `_.reduceRight`, and `_.transform`.
+ *
+ * The guarded methods are:
+ * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
+ * and `sortBy`
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @returns {*} Returns the accumulated value.
+ * @see _.reduceRight
+ * @example
+ *
+ * _.reduce([1, 2], function(sum, n) {
+ *   return sum + n;
+ * }, 0);
+ * // => 3
+ *
+ * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+ *   (result[value] || (result[value] = [])).push(key);
+ *   return result;
+ * }, {});
+ * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
+ */
+function reduce(collection, iteratee, accumulator) {
+  var func = isArray(collection) ? arrayReduce : baseReduce,
+      initAccum = arguments.length < 3;
+
+  return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
+}
+
+module.exports = reduce;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/size.js":
+/*!*************************************!*\
+  !*** ./node_modules/lodash/size.js ***!
+  \*************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseKeys = __webpack_require__(/*! ./_baseKeys */ "./node_modules/lodash/_baseKeys.js"),
+    getTag = __webpack_require__(/*! ./_getTag */ "./node_modules/lodash/_getTag.js"),
+    isArrayLike = __webpack_require__(/*! ./isArrayLike */ "./node_modules/lodash/isArrayLike.js"),
+    isString = __webpack_require__(/*! ./isString */ "./node_modules/lodash/isString.js"),
+    stringSize = __webpack_require__(/*! ./_stringSize */ "./node_modules/lodash/_stringSize.js");
+
+/** `Object#toString` result references. */
+var mapTag = '[object Map]',
+    setTag = '[object Set]';
+
+/**
+ * Gets the size of `collection` by returning its length for array-like
+ * values or the number of own enumerable string keyed properties for objects.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object|string} collection The collection to inspect.
+ * @returns {number} Returns the collection size.
+ * @example
+ *
+ * _.size([1, 2, 3]);
+ * // => 3
+ *
+ * _.size({ 'a': 1, 'b': 2 });
+ * // => 2
+ *
+ * _.size('pebbles');
+ * // => 7
+ */
+function size(collection) {
+  if (collection == null) {
+    return 0;
+  }
+  if (isArrayLike(collection)) {
+    return isString(collection) ? stringSize(collection) : collection.length;
+  }
+  var tag = getTag(collection);
+  if (tag == mapTag || tag == setTag) {
+    return collection.size;
+  }
+  return baseKeys(collection).length;
+}
+
+module.exports = size;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/sortBy.js":
+/*!***************************************!*\
+  !*** ./node_modules/lodash/sortBy.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"),
+    baseOrderBy = __webpack_require__(/*! ./_baseOrderBy */ "./node_modules/lodash/_baseOrderBy.js"),
+    baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"),
+    isIterateeCall = __webpack_require__(/*! ./_isIterateeCall */ "./node_modules/lodash/_isIterateeCall.js");
+
+/**
+ * Creates an array of elements, sorted in ascending order by the results of
+ * running each element in a collection thru each iteratee. This method
+ * performs a stable sort, that is, it preserves the original sort order of
+ * equal elements. The iteratees are invoked with one argument: (value).
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {...(Function|Function[])} [iteratees=[_.identity]]
+ *  The iteratees to sort by.
+ * @returns {Array} Returns the new sorted array.
+ * @example
+ *
+ * var users = [
+ *   { 'user': 'fred',   'age': 48 },
+ *   { 'user': 'barney', 'age': 36 },
+ *   { 'user': 'fred',   'age': 40 },
+ *   { 'user': 'barney', 'age': 34 }
+ * ];
+ *
+ * _.sortBy(users, [function(o) { return o.user; }]);
+ * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
+ *
+ * _.sortBy(users, ['user', 'age']);
+ * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
+ */
+var sortBy = baseRest(function(collection, iteratees) {
+  if (collection == null) {
+    return [];
+  }
+  var length = iteratees.length;
+  if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
+    iteratees = [];
+  } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
+    iteratees = [iteratees[0]];
+  }
+  return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
+});
+
+module.exports = sortBy;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/stubArray.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/stubArray.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * This method returns a new empty array.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.13.0
+ * @category Util
+ * @returns {Array} Returns the new empty array.
+ * @example
+ *
+ * var arrays = _.times(2, _.stubArray);
+ *
+ * console.log(arrays);
+ * // => [[], []]
+ *
+ * console.log(arrays[0] === arrays[1]);
+ * // => false
+ */
+function stubArray() {
+  return [];
+}
+
+module.exports = stubArray;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/stubFalse.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/stubFalse.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+/**
+ * This method returns `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.13.0
+ * @category Util
+ * @returns {boolean} Returns `false`.
+ * @example
+ *
+ * _.times(2, _.stubFalse);
+ * // => [false, false]
+ */
+function stubFalse() {
+  return false;
+}
+
+module.exports = stubFalse;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/toFinite.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/toFinite.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toNumber = __webpack_require__(/*! ./toNumber */ "./node_modules/lodash/toNumber.js");
+
+/** Used as references for various `Number` constants. */
+var INFINITY = 1 / 0,
+    MAX_INTEGER = 1.7976931348623157e+308;
+
+/**
+ * Converts `value` to a finite number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.12.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted number.
+ * @example
+ *
+ * _.toFinite(3.2);
+ * // => 3.2
+ *
+ * _.toFinite(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toFinite(Infinity);
+ * // => 1.7976931348623157e+308
+ *
+ * _.toFinite('3.2');
+ * // => 3.2
+ */
+function toFinite(value) {
+  if (!value) {
+    return value === 0 ? value : 0;
+  }
+  value = toNumber(value);
+  if (value === INFINITY || value === -INFINITY) {
+    var sign = (value < 0 ? -1 : 1);
+    return sign * MAX_INTEGER;
+  }
+  return value === value ? value : 0;
+}
+
+module.exports = toFinite;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/toInteger.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/toInteger.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toFinite = __webpack_require__(/*! ./toFinite */ "./node_modules/lodash/toFinite.js");
+
+/**
+ * Converts `value` to an integer.
+ *
+ * **Note:** This method is loosely based on
+ * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.toInteger(3.2);
+ * // => 3
+ *
+ * _.toInteger(Number.MIN_VALUE);
+ * // => 0
+ *
+ * _.toInteger(Infinity);
+ * // => 1.7976931348623157e+308
+ *
+ * _.toInteger('3.2');
+ * // => 3
+ */
+function toInteger(value) {
+  var result = toFinite(value),
+      remainder = result % 1;
+
+  return result === result ? (remainder ? result - remainder : result) : 0;
+}
+
+module.exports = toInteger;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/toNumber.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/toNumber.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"),
+    isSymbol = __webpack_require__(/*! ./isSymbol */ "./node_modules/lodash/isSymbol.js");
+
+/** Used as references for various `Number` constants. */
+var NAN = 0 / 0;
+
+/** Used to match leading and trailing whitespace. */
+var reTrim = /^\s+|\s+$/g;
+
+/** Used to detect bad signed hexadecimal string values. */
+var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+
+/** Used to detect binary string values. */
+var reIsBinary = /^0b[01]+$/i;
+
+/** Used to detect octal string values. */
+var reIsOctal = /^0o[0-7]+$/i;
+
+/** Built-in method references without a dependency on `root`. */
+var freeParseInt = parseInt;
+
+/**
+ * Converts `value` to a number.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3.2);
+ * // => 3.2
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3.2');
+ * // => 3.2
+ */
+function toNumber(value) {
+  if (typeof value == 'number') {
+    return value;
+  }
+  if (isSymbol(value)) {
+    return NAN;
+  }
+  if (isObject(value)) {
+    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
+    value = isObject(other) ? (other + '') : other;
+  }
+  if (typeof value != 'string') {
+    return value === 0 ? value : +value;
+  }
+  value = value.replace(reTrim, '');
+  var isBinary = reIsBinary.test(value);
+  return (isBinary || reIsOctal.test(value))
+    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
+    : (reIsBadHex.test(value) ? NAN : +value);
+}
+
+module.exports = toNumber;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/toPlainObject.js":
+/*!**********************************************!*\
+  !*** ./node_modules/lodash/toPlainObject.js ***!
+  \**********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var copyObject = __webpack_require__(/*! ./_copyObject */ "./node_modules/lodash/_copyObject.js"),
+    keysIn = __webpack_require__(/*! ./keysIn */ "./node_modules/lodash/keysIn.js");
+
+/**
+ * Converts `value` to a plain object flattening inherited enumerable string
+ * keyed properties of `value` to own properties of the plain object.
+ *
+ * @static
+ * @memberOf _
+ * @since 3.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {Object} Returns the converted plain object.
+ * @example
+ *
+ * function Foo() {
+ *   this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.assign({ 'a': 1 }, new Foo);
+ * // => { 'a': 1, 'b': 2 }
+ *
+ * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
+ * // => { 'a': 1, 'b': 2, 'c': 3 }
+ */
+function toPlainObject(value) {
+  return copyObject(value, keysIn(value));
+}
+
+module.exports = toPlainObject;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/toString.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/toString.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseToString = __webpack_require__(/*! ./_baseToString */ "./node_modules/lodash/_baseToString.js");
+
+/**
+ * Converts `value` to a string. An empty string is returned for `null`
+ * and `undefined` values. The sign of `-0` is preserved.
+ *
+ * @static
+ * @memberOf _
+ * @since 4.0.0
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {string} Returns the converted string.
+ * @example
+ *
+ * _.toString(null);
+ * // => ''
+ *
+ * _.toString(-0);
+ * // => '-0'
+ *
+ * _.toString([1, 2, 3]);
+ * // => '1,2,3'
+ */
+function toString(value) {
+  return value == null ? '' : baseToString(value);
+}
+
+module.exports = toString;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/transform.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/transform.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayEach = __webpack_require__(/*! ./_arrayEach */ "./node_modules/lodash/_arrayEach.js"),
+    baseCreate = __webpack_require__(/*! ./_baseCreate */ "./node_modules/lodash/_baseCreate.js"),
+    baseForOwn = __webpack_require__(/*! ./_baseForOwn */ "./node_modules/lodash/_baseForOwn.js"),
+    baseIteratee = __webpack_require__(/*! ./_baseIteratee */ "./node_modules/lodash/_baseIteratee.js"),
+    getPrototype = __webpack_require__(/*! ./_getPrototype */ "./node_modules/lodash/_getPrototype.js"),
+    isArray = __webpack_require__(/*! ./isArray */ "./node_modules/lodash/isArray.js"),
+    isBuffer = __webpack_require__(/*! ./isBuffer */ "./node_modules/lodash/isBuffer.js"),
+    isFunction = __webpack_require__(/*! ./isFunction */ "./node_modules/lodash/isFunction.js"),
+    isObject = __webpack_require__(/*! ./isObject */ "./node_modules/lodash/isObject.js"),
+    isTypedArray = __webpack_require__(/*! ./isTypedArray */ "./node_modules/lodash/isTypedArray.js");
+
+/**
+ * An alternative to `_.reduce`; this method transforms `object` to a new
+ * `accumulator` object which is the result of running each of its own
+ * enumerable string keyed properties thru `iteratee`, with each invocation
+ * potentially mutating the `accumulator` object. If `accumulator` is not
+ * provided, a new object with the same `[[Prototype]]` will be used. The
+ * iteratee is invoked with four arguments: (accumulator, value, key, object).
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @since 1.3.0
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @param {*} [accumulator] The custom accumulator value.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * _.transform([2, 3, 4], function(result, n) {
+ *   result.push(n *= n);
+ *   return n % 2 == 0;
+ * }, []);
+ * // => [4, 9]
+ *
+ * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
+ *   (result[value] || (result[value] = [])).push(key);
+ * }, {});
+ * // => { '1': ['a', 'c'], '2': ['b'] }
+ */
+function transform(object, iteratee, accumulator) {
+  var isArr = isArray(object),
+      isArrLike = isArr || isBuffer(object) || isTypedArray(object);
+
+  iteratee = baseIteratee(iteratee, 4);
+  if (accumulator == null) {
+    var Ctor = object && object.constructor;
+    if (isArrLike) {
+      accumulator = isArr ? new Ctor : [];
+    }
+    else if (isObject(object)) {
+      accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
+    }
+    else {
+      accumulator = {};
+    }
+  }
+  (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
+    return iteratee(accumulator, value, index, object);
+  });
+  return accumulator;
+}
+
+module.exports = transform;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/union.js":
+/*!**************************************!*\
+  !*** ./node_modules/lodash/union.js ***!
+  \**************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseFlatten = __webpack_require__(/*! ./_baseFlatten */ "./node_modules/lodash/_baseFlatten.js"),
+    baseRest = __webpack_require__(/*! ./_baseRest */ "./node_modules/lodash/_baseRest.js"),
+    baseUniq = __webpack_require__(/*! ./_baseUniq */ "./node_modules/lodash/_baseUniq.js"),
+    isArrayLikeObject = __webpack_require__(/*! ./isArrayLikeObject */ "./node_modules/lodash/isArrayLikeObject.js");
+
+/**
+ * Creates an array of unique values, in order, from all given arrays using
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.1.0
+ * @category Array
+ * @param {...Array} [arrays] The arrays to inspect.
+ * @returns {Array} Returns the new array of combined values.
+ * @example
+ *
+ * _.union([2], [1, 2]);
+ * // => [2, 1]
+ */
+var union = baseRest(function(arrays) {
+  return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
+});
+
+module.exports = union;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/uniqueId.js":
+/*!*****************************************!*\
+  !*** ./node_modules/lodash/uniqueId.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toString = __webpack_require__(/*! ./toString */ "./node_modules/lodash/toString.js");
+
+/** Used to generate unique IDs. */
+var idCounter = 0;
+
+/**
+ * Generates a unique ID. If `prefix` is given, the ID is appended to it.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Util
+ * @param {string} [prefix=''] The value to prefix the ID with.
+ * @returns {string} Returns the unique ID.
+ * @example
+ *
+ * _.uniqueId('contact_');
+ * // => 'contact_104'
+ *
+ * _.uniqueId();
+ * // => '105'
+ */
+function uniqueId(prefix) {
+  var id = ++idCounter;
+  return toString(prefix) + id;
+}
+
+module.exports = uniqueId;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/values.js":
+/*!***************************************!*\
+  !*** ./node_modules/lodash/values.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var baseValues = __webpack_require__(/*! ./_baseValues */ "./node_modules/lodash/_baseValues.js"),
+    keys = __webpack_require__(/*! ./keys */ "./node_modules/lodash/keys.js");
+
+/**
+ * Creates an array of the own enumerable string keyed property values of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects.
+ *
+ * @static
+ * @since 0.1.0
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property values.
+ * @example
+ *
+ * function Foo() {
+ *   this.a = 1;
+ *   this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.values(new Foo);
+ * // => [1, 2] (iteration order is not guaranteed)
+ *
+ * _.values('hi');
+ * // => ['h', 'i']
+ */
+function values(object) {
+  return object == null ? [] : baseValues(object, keys(object));
+}
+
+module.exports = values;
+
+
+/***/ }),
+
+/***/ "./node_modules/lodash/zipObject.js":
+/*!******************************************!*\
+  !*** ./node_modules/lodash/zipObject.js ***!
+  \******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var assignValue = __webpack_require__(/*! ./_assignValue */ "./node_modules/lodash/_assignValue.js"),
+    baseZipObject = __webpack_require__(/*! ./_baseZipObject */ "./node_modules/lodash/_baseZipObject.js");
+
+/**
+ * This method is like `_.fromPairs` except that it accepts two arrays,
+ * one of property identifiers and one of corresponding values.
+ *
+ * @static
+ * @memberOf _
+ * @since 0.4.0
+ * @category Array
+ * @param {Array} [props=[]] The property identifiers.
+ * @param {Array} [values=[]] The property values.
+ * @returns {Object} Returns the new object.
+ * @example
+ *
+ * _.zipObject(['a', 'b'], [1, 2]);
+ * // => { 'a': 1, 'b': 2 }
+ */
+function zipObject(props, values) {
+  return baseZipObject(props || [], values || [], assignValue);
+}
+
+module.exports = zipObject;
+
+
+/***/ }),
+
+/***/ "./node_modules/moment-mini/locale sync recursive ^\\.\\/.*$":
+/*!*******************************************************!*\
+  !*** ./node_modules/moment-mini/locale sync ^\.\/.*$ ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+var map = {
+	"./locale": "./node_modules/moment-mini/locale/locale.js",
+	"./locale.js": "./node_modules/moment-mini/locale/locale.js"
+};
+
+
+function webpackContext(req) {
+	var id = webpackContextResolve(req);
+	return __webpack_require__(id);
+}
+function webpackContextResolve(req) {
+	if(!__webpack_require__.o(map, req)) {
+		var e = new Error("Cannot find module '" + req + "'");
+		e.code = 'MODULE_NOT_FOUND';
+		throw e;
+	}
+	return map[req];
+}
+webpackContext.keys = function webpackContextKeys() {
+	return Object.keys(map);
+};
+webpackContext.resolve = webpackContextResolve;
+module.exports = webpackContext;
+webpackContext.id = "./node_modules/moment-mini/locale sync recursive ^\\.\\/.*$";
+
+/***/ }),
+
+/***/ "./node_modules/moment-mini/locale/locale.js":
+/*!***************************************************!*\
+  !*** ./node_modules/moment-mini/locale/locale.js ***!
+  \***************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+
+/***/ "./node_modules/moment-mini/moment.min.js":
+/*!************************************************!*\
+  !*** ./node_modules/moment-mini/moment.min.js ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(module) {!function(e,t){ true?module.exports=t():undefined}(this,function(){"use strict";var e,i;function c(){return e.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function u(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e){return void 0===e}function h(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function d(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,s=[];for(n=0;n<e.length;++n)s.push(t(e[n],n));return s}function m(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function _(e,t){for(var n in t)m(t,n)&&(e[n]=t[n]);return m(t,"toString")&&(e.toString=t.toString),m(t,"valueOf")&&(e.valueOf=t.valueOf),e}function y(e,t,n,s){return Tt(e,t,n,s,!0).utc()}function g(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function v(e){if(null==e._isValid){var t=g(e),n=i.call(t.parsedDateParts,function(e){return null!=e}),s=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n);if(e._strict&&(s=s&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return s;e._isValid=s}return e._isValid}function p(e){var t=y(NaN);return null!=e?_(g(t),e):g(t).userInvalidated=!0,t}i=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1};var r=c.momentProperties=[];function w(e,t){var n,s,i;if(l(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),l(t._i)||(e._i=t._i),l(t._f)||(e._f=t._f),l(t._l)||(e._l=t._l),l(t._strict)||(e._strict=t._strict),l(t._tzm)||(e._tzm=t._tzm),l(t._isUTC)||(e._isUTC=t._isUTC),l(t._offset)||(e._offset=t._offset),l(t._pf)||(e._pf=g(t)),l(t._locale)||(e._locale=t._locale),0<r.length)for(n=0;n<r.length;n++)l(i=t[s=r[n]])||(e[s]=i);return e}var t=!1;function M(e){w(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===t&&(t=!0,c.updateOffset(this),t=!1)}function k(e){return e instanceof M||null!=e&&null!=e._isAMomentObject}function S(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function D(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=S(t)),n}function a(e,t,n){var s,i=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),a=0;for(s=0;s<i;s++)(n&&e[s]!==t[s]||!n&&D(e[s])!==D(t[s]))&&a++;return a+r}function Y(e){!1===c.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function n(i,r){var a=!0;return _(function(){if(null!=c.deprecationHandler&&c.deprecationHandler(null,i),a){for(var e,t=[],n=0;n<arguments.length;n++){if(e="","object"==typeof arguments[n]){for(var s in e+="\n["+n+"] ",arguments[0])e+=s+": "+arguments[0][s]+", ";e=e.slice(0,-2)}else e=arguments[n];t.push(e)}Y(i+"\nArguments: "+Array.prototype.slice.call(t).join("")+"\n"+(new Error).stack),a=!1}return r.apply(this,arguments)},r)}var s,O={};function T(e,t){null!=c.deprecationHandler&&c.deprecationHandler(e,t),O[e]||(Y(t),O[e]=!0)}function b(e){return e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function x(e,t){var n,s=_({},e);for(n in t)m(t,n)&&(u(e[n])&&u(t[n])?(s[n]={},_(s[n],e[n]),_(s[n],t[n])):null!=t[n]?s[n]=t[n]:delete s[n]);for(n in e)m(e,n)&&!m(t,n)&&u(e[n])&&(s[n]=_({},s[n]));return s}function P(e){null!=e&&this.set(e)}c.suppressDeprecationWarnings=!1,c.deprecationHandler=null,s=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)m(e,t)&&n.push(t);return n};var W={};function C(e,t){var n=e.toLowerCase();W[n]=W[n+"s"]=W[t]=e}function H(e){return"string"==typeof e?W[e]||W[e.toLowerCase()]:void 0}function R(e){var t,n,s={};for(n in e)m(e,n)&&(t=H(n))&&(s[t]=e[n]);return s}var U={};function F(e,t){U[e]=t}function L(e,t,n){var s=""+Math.abs(e),i=t-s.length;return(0<=e?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+s}var N=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,G=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,V={},E={};function I(e,t,n,s){var i=s;"string"==typeof s&&(i=function(){return this[s]()}),e&&(E[e]=i),t&&(E[t[0]]=function(){return L(i.apply(this,arguments),t[1],t[2])}),n&&(E[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function A(e,t){return e.isValid()?(t=j(t,e.localeData()),V[t]=V[t]||function(s){var e,i,t,r=s.match(N);for(e=0,i=r.length;e<i;e++)E[r[e]]?r[e]=E[r[e]]:r[e]=(t=r[e]).match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"");return function(e){var t,n="";for(t=0;t<i;t++)n+=b(r[t])?r[t].call(e,s):r[t];return n}}(t),V[t](e)):e.localeData().invalidDate()}function j(e,t){var n=5;function s(e){return t.longDateFormat(e)||e}for(G.lastIndex=0;0<=n&&G.test(e);)e=e.replace(G,s),G.lastIndex=0,n-=1;return e}var Z=/\d/,z=/\d\d/,$=/\d{3}/,q=/\d{4}/,J=/[+-]?\d{6}/,B=/\d\d?/,Q=/\d\d\d\d?/,X=/\d\d\d\d\d\d?/,K=/\d{1,3}/,ee=/\d{1,4}/,te=/[+-]?\d{1,6}/,ne=/\d+/,se=/[+-]?\d+/,ie=/Z|[+-]\d\d:?\d\d/gi,re=/Z|[+-]\d\d(?::?\d\d)?/gi,ae=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,oe={};function ue(e,n,s){oe[e]=b(n)?n:function(e,t){return e&&s?s:n}}function le(e,t){return m(oe,e)?oe[e](t._strict,t._locale):new RegExp(he(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,s,i){return t||n||s||i})))}function he(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var de={};function ce(e,n){var t,s=n;for("string"==typeof e&&(e=[e]),h(n)&&(s=function(e,t){t[n]=D(e)}),t=0;t<e.length;t++)de[e[t]]=s}function fe(e,i){ce(e,function(e,t,n,s){n._w=n._w||{},i(e,n._w,n,s)})}var me=0,_e=1,ye=2,ge=3,ve=4,pe=5,we=6,Me=7,ke=8;function Se(e){return De(e)?366:365}function De(e){return e%4==0&&e%100!=0||e%400==0}I("Y",0,0,function(){var e=this.year();return e<=9999?""+e:"+"+e}),I(0,["YY",2],0,function(){return this.year()%100}),I(0,["YYYY",4],0,"year"),I(0,["YYYYY",5],0,"year"),I(0,["YYYYYY",6,!0],0,"year"),C("year","y"),F("year",1),ue("Y",se),ue("YY",B,z),ue("YYYY",ee,q),ue("YYYYY",te,J),ue("YYYYYY",te,J),ce(["YYYYY","YYYYYY"],me),ce("YYYY",function(e,t){t[me]=2===e.length?c.parseTwoDigitYear(e):D(e)}),ce("YY",function(e,t){t[me]=c.parseTwoDigitYear(e)}),ce("Y",function(e,t){t[me]=parseInt(e,10)}),c.parseTwoDigitYear=function(e){return D(e)+(68<D(e)?1900:2e3)};var Ye,Oe=Te("FullYear",!0);function Te(t,n){return function(e){return null!=e?(xe(this,t,e),c.updateOffset(this,n),this):be(this,t)}}function be(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function xe(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&De(e.year())&&1===e.month()&&29===e.date()?e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),Pe(n,e.month())):e._d["set"+(e._isUTC?"UTC":"")+t](n))}function Pe(e,t){if(isNaN(e)||isNaN(t))return NaN;var n,s=(t%(n=12)+n)%n;return e+=(t-s)/12,1===s?De(e)?29:28:31-s%7%2}Ye=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1},I("M",["MM",2],"Mo",function(){return this.month()+1}),I("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),I("MMMM",0,0,function(e){return this.localeData().months(this,e)}),C("month","M"),F("month",8),ue("M",B),ue("MM",B,z),ue("MMM",function(e,t){return t.monthsShortRegex(e)}),ue("MMMM",function(e,t){return t.monthsRegex(e)}),ce(["M","MM"],function(e,t){t[_e]=D(e)-1}),ce(["MMM","MMMM"],function(e,t,n,s){var i=n._locale.monthsParse(e,s,n._strict);null!=i?t[_e]=i:g(n).invalidMonth=e});var We=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,Ce="January_February_March_April_May_June_July_August_September_October_November_December".split("_");var He="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function Re(e,t){var n;if(!e.isValid())return e;if("string"==typeof t)if(/^\d+$/.test(t))t=D(t);else if(!h(t=e.localeData().monthsParse(t)))return e;return n=Math.min(e.date(),Pe(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n),e}function Ue(e){return null!=e?(Re(this,e),c.updateOffset(this,!0),this):be(this,"Month")}var Fe=ae;var Le=ae;function Ne(){function e(e,t){return t.length-e.length}var t,n,s=[],i=[],r=[];for(t=0;t<12;t++)n=y([2e3,t]),s.push(this.monthsShort(n,"")),i.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(s.sort(e),i.sort(e),r.sort(e),t=0;t<12;t++)s[t]=he(s[t]),i[t]=he(i[t]);for(t=0;t<24;t++)r[t]=he(r[t]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+s.join("|")+")","i")}function Ge(e){var t;if(e<100&&0<=e){var n=Array.prototype.slice.call(arguments);n[0]=e+400,t=new Date(Date.UTC.apply(null,n)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)}else t=new Date(Date.UTC.apply(null,arguments));return t}function Ve(e,t,n){var s=7+t-n;return-((7+Ge(e,0,s).getUTCDay()-t)%7)+s-1}function Ee(e,t,n,s,i){var r,a,o=1+7*(t-1)+(7+n-s)%7+Ve(e,s,i);return a=o<=0?Se(r=e-1)+o:o>Se(e)?(r=e+1,o-Se(e)):(r=e,o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(Se(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),C("week","w"),C("isoWeek","W"),F("week",5),F("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=D(e)});function je(e,t){return e.slice(t,7).concat(e.slice(0,t))}I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),C("day","d"),C("weekday","e"),C("isoWeekday","E"),F("day",11),F("weekday",11),F("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=D(e)});var Ze="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var $e="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var qe=ae;var Je=ae;var Be=ae;function Qe(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=he(o[t]),u[t]=he(u[t]),l[t]=he(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Xe(){return this.hours()%12||12}function Ke(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function et(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Xe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Xe.apply(this)+L(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Xe.apply(this)+L(this.minutes(),2)+L(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+L(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+L(this.minutes(),2)+L(this.seconds(),2)}),Ke("a",!0),Ke("A",!1),C("hour","h"),F("hour",13),ue("a",et),ue("A",et),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=D(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=D(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s,2)),t[pe]=D(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=D(e.substr(0,s)),t[ve]=D(e.substr(s,2)),t[pe]=D(e.substr(i))});var tt,nt=Te("Hours",!0),st={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Ce,monthsShort:He,week:{dow:0,doy:6},weekdays:Ze,weekdaysMin:$e,weekdaysShort:ze,meridiemParse:/[ap]\.?m?\.?/i},it={},rt={};function at(e){return e?e.toLowerCase().replace("_","-"):e}function ot(e){var t=null;if(!it[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=tt._abbr,__webpack_require__("./node_modules/moment-mini/locale sync recursive ^\\.\\/.*$")("./"+e),ut(t)}catch(e){}return it[e]}function ut(e,t){var n;return e&&((n=l(t)?ht(e):lt(e,t))?tt=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),tt._abbr}function lt(e,t){if(null===t)return delete it[e],null;var n,s=st;if(t.abbr=e,null!=it[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=it[e]._config;else if(null!=t.parentLocale)if(null!=it[t.parentLocale])s=it[t.parentLocale]._config;else{if(null==(n=ot(t.parentLocale)))return rt[t.parentLocale]||(rt[t.parentLocale]=[]),rt[t.parentLocale].push({name:e,config:t}),null;s=n._config}return it[e]=new P(x(s,t)),rt[e]&&rt[e].forEach(function(e){lt(e.name,e.config)}),ut(e),it[e]}function ht(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return tt;if(!o(e)){if(t=ot(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r<e.length;){for(t=(i=at(e[r]).split("-")).length,n=(n=at(e[r+1]))?n.split("-"):null;0<t;){if(s=ot(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&a(i,n,!0)>=t-1)break;t--}r++}return tt}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11<n[_e]?_e:n[ye]<1||n[ye]>Pe(n[me],n[_e])?ye:n[ge]<0||24<n[ge]||24===n[ge]&&(0!==n[ve]||0!==n[pe]||0!==n[we])?ge:n[ve]<0||59<n[ve]?ve:n[pe]<0||59<n[pe]?pe:n[we]<0||999<n[we]?we:-1,g(e)._overflowDayOfYear&&(t<me||ye<t)&&(t=ye),g(e)._overflowWeeks&&-1===t&&(t=Me),g(e)._overflowWeekday&&-1===t&&(t=ke),g(e).overflow=t),e}function ct(e,t,n){return null!=e?e:null!=t?t:n}function ft(e){var t,n,s,i,r,a=[];if(!e._d){var o,u;for(o=e,u=new Date(c.now()),s=o._useUTC?[u.getUTCFullYear(),u.getUTCMonth(),u.getUTCDate()]:[u.getFullYear(),u.getMonth(),u.getDate()],e._w&&null==e._a[ye]&&null==e._a[_e]&&function(e){var t,n,s,i,r,a,o,u;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)r=1,a=4,n=ct(t.GG,e._a[me],Ie(bt(),1,4).year),s=ct(t.W,1),((i=ct(t.E,1))<1||7<i)&&(u=!0);else{r=e._locale._week.dow,a=e._locale._week.doy;var l=Ie(bt(),r,a);n=ct(t.gg,e._a[me],l.year),s=ct(t.w,l.week),null!=t.d?((i=t.d)<0||6<i)&&(u=!0):null!=t.e?(i=t.e+r,(t.e<0||6<t.e)&&(u=!0)):i=r}s<1||s>Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ct(e._a[me],s[me]),(e._dayOfYear>Se(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[ve]&&0===e._a[pe]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o;return e<100&&0<=e?(o=new Date(e+400,t,n,s,i,r,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,n,s,i,r,a),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var mt=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_t=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,yt=/Z|[+-]\d\d(?::?\d\d)?/,gt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],vt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],pt=/^\/?Date\((\-?\d+)/i;function wt(e){var t,n,s,i,r,a,o=e._i,u=mt.exec(o)||_t.exec(o);if(u){for(g(e).iso=!0,t=0,n=gt.length;t<n;t++)if(gt[t][1].exec(u[1])){i=gt[t][0],s=!1!==gt[t][2];break}if(null==i)return void(e._isValid=!1);if(u[3]){for(t=0,n=vt.length;t<n;t++)if(vt[t][1].exec(u[3])){r=(u[2]||" ")+vt[t][0];break}if(null==r)return void(e._isValid=!1)}if(!s&&null!=r)return void(e._isValid=!1);if(u[4]){if(!yt.exec(u[4]))return void(e._isValid=!1);a="Z"}e._f=i+(r||"")+(a||""),Yt(e)}else e._isValid=!1}var Mt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function kt(e,t,n,s,i,r){var a=[function(e){var t=parseInt(e,10);{if(t<=49)return 2e3+t;if(t<=999)return 1900+t}return t}(e),He.indexOf(t),parseInt(n,10),parseInt(s,10),parseInt(i,10)];return r&&a.push(parseInt(r,10)),a}var St={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Dt(e){var t,n,s,i=Mt.exec(e._i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));if(i){var r=kt(i[4],i[3],i[2],i[5],i[6],i[7]);if(t=i[1],n=r,s=e,t&&ze.indexOf(t)!==new Date(n[0],n[1],n[2]).getDay()&&(g(s).weekdayMismatch=!0,!(s._isValid=!1)))return;e._a=r,e._tzm=function(e,t,n){if(e)return St[e];if(t)return 0;var s=parseInt(n,10),i=s%100;return(s-i)/100*60+i}(i[8],i[9],i[10]),e._d=Ge.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),g(e).rfc2822=!0}else e._isValid=!1}function Yt(e){if(e._f!==c.ISO_8601)if(e._f!==c.RFC_2822){e._a=[],g(e).empty=!0;var t,n,s,i,r,a,o,u,l=""+e._i,h=l.length,d=0;for(s=j(e._f,e._locale).match(N)||[],t=0;t<s.length;t++)i=s[t],(n=(l.match(le(i,e))||[])[0])&&(0<(r=l.substr(0,l.indexOf(n))).length&&g(e).unusedInput.push(r),l=l.slice(l.indexOf(n)+n.length),d+=n.length),E[i]?(n?g(e).empty=!1:g(e).unusedTokens.push(i),a=i,u=e,null!=(o=n)&&m(de,a)&&de[a](o,u._a,u,a)):e._strict&&!n&&g(e).unusedTokens.push(i);g(e).charsLeftOver=h-d,0<l.length&&g(e).unusedInput.push(l),e._a[ge]<=12&&!0===g(e).bigHour&&0<e._a[ge]&&(g(e).bigHour=void 0),g(e).parsedDateParts=e._a.slice(0),g(e).meridiem=e._meridiem,e._a[ge]=function(e,t,n){var s;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):(null!=e.isPM&&((s=e.isPM(n))&&t<12&&(t+=12),s||12!==t||(t=0)),t)}(e._locale,e._a[ge],e._meridiem),ft(e),dt(e)}else Dt(e);else wt(e)}function Ot(e){var t,n,s,i,r=e._i,a=e._f;return e._locale=e._locale||ht(e._l),null===r||void 0===a&&""===r?p({nullInput:!0}):("string"==typeof r&&(e._i=r=e._locale.preparse(r)),k(r)?new M(dt(r)):(d(r)?e._d=r:o(a)?function(e){var t,n,s,i,r;if(0===e._f.length)return g(e).invalidFormat=!0,e._d=new Date(NaN);for(i=0;i<e._f.length;i++)r=0,t=w({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[i],Yt(t),v(t)&&(r+=g(t).charsLeftOver,r+=10*g(t).unusedTokens.length,g(t).score=r,(null==s||r<s)&&(s=r,n=t));_(e,n||t)}(e):a?Yt(e):l(n=(t=e)._i)?t._d=new Date(c.now()):d(n)?t._d=new Date(n.valueOf()):"string"==typeof n?(s=t,null===(i=pt.exec(s._i))?(wt(s),!1===s._isValid&&(delete s._isValid,Dt(s),!1===s._isValid&&(delete s._isValid,c.createFromInputFallback(s)))):s._d=new Date(+i[1])):o(n)?(t._a=f(n.slice(0),function(e){return parseInt(e,10)}),ft(t)):u(n)?function(e){if(!e._d){var t=R(e._i);e._a=f([t.year,t.month,t.day||t.date,t.hour,t.minute,t.second,t.millisecond],function(e){return e&&parseInt(e,10)}),ft(e)}}(t):h(n)?t._d=new Date(n):c.createFromInputFallback(t),v(e)||(e._d=null),e))}function Tt(e,t,n,s,i){var r,a={};return!0!==n&&!1!==n||(s=n,n=void 0),(u(e)&&function(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(e.hasOwnProperty(t))return!1;return!0}(e)||o(e)&&0===e.length)&&(e=void 0),a._isAMomentObject=!0,a._useUTC=a._isUTC=i,a._l=n,a._i=e,a._f=t,a._strict=s,(r=new M(dt(Ot(a))))._nextDay&&(r.add(1,"d"),r._nextDay=void 0),r}function bt(e,t,n,s){return Tt(e,t,n,s,!1)}c.createFromInputFallback=n("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),c.ISO_8601=function(){},c.RFC_2822=function(){};var xt=n("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=bt.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:p()}),Pt=n("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=bt.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:p()});function Wt(e,t){var n,s;if(1===t.length&&o(t[0])&&(t=t[0]),!t.length)return bt();for(n=t[0],s=1;s<t.length;++s)t[s].isValid()&&!t[s][e](n)||(n=t[s]);return n}var Ct=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Ht(e){var t=R(e),n=t.year||0,s=t.quarter||0,i=t.month||0,r=t.week||t.isoWeek||0,a=t.day||0,o=t.hour||0,u=t.minute||0,l=t.second||0,h=t.millisecond||0;this._isValid=function(e){for(var t in e)if(-1===Ye.call(Ct,t)||null!=e[t]&&isNaN(e[t]))return!1;for(var n=!1,s=0;s<Ct.length;++s)if(e[Ct[s]]){if(n)return!1;parseFloat(e[Ct[s]])!==D(e[Ct[s]])&&(n=!0)}return!0}(t),this._milliseconds=+h+1e3*l+6e4*u+1e3*o*60*60,this._days=+a+7*r,this._months=+i+3*s+12*n,this._data={},this._locale=ht(),this._bubble()}function Rt(e){return e instanceof Ht}function Ut(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Ft(e,n){I(e,0,0,function(){var e=this.utcOffset(),t="+";return e<0&&(e=-e,t="-"),t+L(~~(e/60),2)+n+L(~~e%60,2)})}Ft("Z",":"),Ft("ZZ",""),ue("Z",re),ue("ZZ",re),ce(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Nt(re,e)});var Lt=/([\+\-]|\d\d)/gi;function Nt(e,t){var n=(t||"").match(e);if(null===n)return null;var s=((n[n.length-1]||[])+"").match(Lt)||["-",0,0],i=60*s[1]+D(s[2]);return 0===i?0:"+"===s[0]?i:-i}function Gt(e,t){var n,s;return t._isUTC?(n=t.clone(),s=(k(e)||d(e)?e.valueOf():bt(e).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+s),c.updateOffset(n,!1),n):bt(e).local()}function Vt(e){return 15*-Math.round(e._d.getTimezoneOffset()/15)}function Et(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}c.updateOffset=function(){};var It=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,At=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function jt(e,t){var n,s,i,r=e,a=null;return Rt(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:h(e)?(r={},t?r[t]=e:r.milliseconds=e):(a=It.exec(e))?(n="-"===a[1]?-1:1,r={y:0,d:D(a[ye])*n,h:D(a[ge])*n,m:D(a[ve])*n,s:D(a[pe])*n,ms:D(Ut(1e3*a[we]))*n}):(a=At.exec(e))?(n="-"===a[1]?-1:1,r={y:Zt(a[2],n),M:Zt(a[3],n),w:Zt(a[4],n),d:Zt(a[5],n),h:Zt(a[6],n),m:Zt(a[7],n),s:Zt(a[8],n)}):null==r?r={}:"object"==typeof r&&("from"in r||"to"in r)&&(i=function(e,t){var n;if(!e.isValid()||!t.isValid())return{milliseconds:0,months:0};t=Gt(t,e),e.isBefore(t)?n=zt(e,t):((n=zt(t,e)).milliseconds=-n.milliseconds,n.months=-n.months);return n}(bt(r.from),bt(r.to)),(r={}).ms=i.milliseconds,r.M=i.months),s=new Ht(r),Rt(e)&&m(e,"_locale")&&(s._locale=e._locale),s}function Zt(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function zt(e,t){var n={};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function $t(s,i){return function(e,t){var n;return null===t||isNaN(+t)||(T(i,"moment()."+i+"(period, number) is deprecated. Please use moment()."+i+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),n=e,e=t,t=n),qt(this,jt(e="string"==typeof e?+e:e,t),s),this}}function qt(e,t,n,s){var i=t._milliseconds,r=Ut(t._days),a=Ut(t._months);e.isValid()&&(s=null==s||s,a&&Re(e,be(e,"Month")+a*n),r&&xe(e,"Date",be(e,"Date")+r*n),i&&e._d.setTime(e._d.valueOf()+i*n),s&&c.updateOffset(e,r||a))}jt.fn=Ht.prototype,jt.invalid=function(){return jt(NaN)};var Jt=$t(1,"add"),Bt=$t(-1,"subtract");function Qt(e,t){var n=12*(t.year()-e.year())+(t.month()-e.month()),s=e.clone().add(n,"months");return-(n+(t-s<0?(t-s)/(s-e.clone().add(n-1,"months")):(t-s)/(e.clone().add(n+1,"months")-s)))||0}function Xt(e){var t;return void 0===e?this._locale._abbr:(null!=(t=ht(e))&&(this._locale=t),this)}c.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",c.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Kt=n("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});function en(){return this._locale}var tn=126227808e5;function nn(e,t){return(e%t+t)%t}function sn(e,t,n){return e<100&&0<=e?new Date(e+400,t,n)-tn:new Date(e,t,n).valueOf()}function rn(e,t,n){return e<100&&0<=e?Date.UTC(e+400,t,n)-tn:Date.UTC(e,t,n)}function an(e,t){I(0,[e,e.length],0,t)}function on(e,t,n,s,i){var r;return null==e?Ie(this,s,i).year:((r=Ae(e,s,i))<t&&(t=r),function(e,t,n,s,i){var r=Ee(e,t,n,s,i),a=Ge(r.year,0,r.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}.call(this,e,t,n,s,i))}I(0,["gg",2],0,function(){return this.weekYear()%100}),I(0,["GG",2],0,function(){return this.isoWeekYear()%100}),an("gggg","weekYear"),an("ggggg","weekYear"),an("GGGG","isoWeekYear"),an("GGGGG","isoWeekYear"),C("weekYear","gg"),C("isoWeekYear","GG"),F("weekYear",1),F("isoWeekYear",1),ue("G",se),ue("g",se),ue("GG",B,z),ue("gg",B,z),ue("GGGG",ee,q),ue("gggg",ee,q),ue("GGGGG",te,J),ue("ggggg",te,J),fe(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=D(e)}),fe(["gg","GG"],function(e,t,n,s){t[s]=c.parseTwoDigitYear(e)}),I("Q",0,"Qo","quarter"),C("quarter","Q"),F("quarter",7),ue("Q",Z),ce("Q",function(e,t){t[_e]=3*(D(e)-1)}),I("D",["DD",2],"Do","date"),C("date","D"),F("date",9),ue("D",B),ue("DD",B,z),ue("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),ce(["D","DD"],ye),ce("Do",function(e,t){t[ye]=D(e.match(B)[0])});var un=Te("Date",!0);I("DDD",["DDDD",3],"DDDo","dayOfYear"),C("dayOfYear","DDD"),F("dayOfYear",4),ue("DDD",K),ue("DDDD",$),ce(["DDD","DDDD"],function(e,t,n){n._dayOfYear=D(e)}),I("m",["mm",2],0,"minute"),C("minute","m"),F("minute",14),ue("m",B),ue("mm",B,z),ce(["m","mm"],ve);var ln=Te("Minutes",!1);I("s",["ss",2],0,"second"),C("second","s"),F("second",15),ue("s",B),ue("ss",B,z),ce(["s","ss"],pe);var hn,dn=Te("Seconds",!1);for(I("S",0,0,function(){return~~(this.millisecond()/100)}),I(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),I(0,["SSS",3],0,"millisecond"),I(0,["SSSS",4],0,function(){return 10*this.millisecond()}),I(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),I(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),I(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),I(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),I(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),C("millisecond","ms"),F("millisecond",16),ue("S",K,Z),ue("SS",K,z),ue("SSS",K,$),hn="SSSS";hn.length<=9;hn+="S")ue(hn,ne);function cn(e,t){t[we]=D(1e3*("0."+e))}for(hn="S";hn.length<=9;hn+="S")ce(hn,cn);var fn=Te("Milliseconds",!1);I("z",0,0,"zoneAbbr"),I("zz",0,0,"zoneName");var mn=M.prototype;function _n(e){return e}mn.add=Jt,mn.calendar=function(e,t){var n=e||bt(),s=Gt(n,this).startOf("day"),i=c.calendarFormat(this,s)||"sameElse",r=t&&(b(t[i])?t[i].call(this,n):t[i]);return this.format(r||this.localeData().calendar(i,this,bt(n)))},mn.clone=function(){return new M(this)},mn.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Gt(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=H(t)){case"year":r=Qt(this,s)/12;break;case"month":r=Qt(this,s);break;case"quarter":r=Qt(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-i)/864e5;break;case"week":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:S(r)},mn.endOf=function(e){var t;if(void 0===(e=H(e))||"millisecond"===e||!this.isValid())return this;var n=this._isUTC?rn:sn;switch(e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=36e5-nn(t+(this._isUTC?0:6e4*this.utcOffset()),36e5)-1;break;case"minute":t=this._d.valueOf(),t+=6e4-nn(t,6e4)-1;break;case"second":t=this._d.valueOf(),t+=1e3-nn(t,1e3)-1;break}return this._d.setTime(t),c.updateOffset(this,!0),this},mn.format=function(e){e||(e=this.isUtc()?c.defaultFormatUtc:c.defaultFormat);var t=A(this,e);return this.localeData().postformat(t)},mn.from=function(e,t){return this.isValid()&&(k(e)&&e.isValid()||bt(e).isValid())?jt({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},mn.fromNow=function(e){return this.from(bt(),e)},mn.to=function(e,t){return this.isValid()&&(k(e)&&e.isValid()||bt(e).isValid())?jt({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},mn.toNow=function(e){return this.to(bt(),e)},mn.get=function(e){return b(this[e=H(e)])?this[e]():this},mn.invalidAt=function(){return g(this).overflow},mn.isAfter=function(e,t){var n=k(e)?e:bt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=H(t)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(t).valueOf())},mn.isBefore=function(e,t){var n=k(e)?e:bt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=H(t)||"millisecond")?this.valueOf()<n.valueOf():this.clone().endOf(t).valueOf()<n.valueOf())},mn.isBetween=function(e,t,n,s){var i=k(e)?e:bt(e),r=k(t)?t:bt(t);return!!(this.isValid()&&i.isValid()&&r.isValid())&&("("===(s=s||"()")[0]?this.isAfter(i,n):!this.isBefore(i,n))&&(")"===s[1]?this.isBefore(r,n):!this.isAfter(r,n))},mn.isSame=function(e,t){var n,s=k(e)?e:bt(e);return!(!this.isValid()||!s.isValid())&&("millisecond"===(t=H(t)||"millisecond")?this.valueOf()===s.valueOf():(n=s.valueOf(),this.clone().startOf(t).valueOf()<=n&&n<=this.clone().endOf(t).valueOf()))},mn.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)},mn.isSameOrBefore=function(e,t){return this.isSame(e,t)||this.isBefore(e,t)},mn.isValid=function(){return v(this)},mn.lang=Kt,mn.locale=Xt,mn.localeData=en,mn.max=Pt,mn.min=xt,mn.parsingFlags=function(){return _({},g(this))},mn.set=function(e,t){if("object"==typeof e)for(var n=function(e){var t=[];for(var n in e)t.push({unit:n,priority:U[n]});return t.sort(function(e,t){return e.priority-t.priority}),t}(e=R(e)),s=0;s<n.length;s++)this[n[s].unit](e[n[s].unit]);else if(b(this[e=H(e)]))return this[e](t);return this},mn.startOf=function(e){var t;if(void 0===(e=H(e))||"millisecond"===e||!this.isValid())return this;var n=this._isUTC?rn:sn;switch(e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=nn(t+(this._isUTC?0:6e4*this.utcOffset()),36e5);break;case"minute":t=this._d.valueOf(),t-=nn(t,6e4);break;case"second":t=this._d.valueOf(),t-=nn(t,1e3);break}return this._d.setTime(t),c.updateOffset(this,!0),this},mn.subtract=Bt,mn.toArray=function(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]},mn.toObject=function(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}},mn.toDate=function(){return new Date(this.valueOf())},mn.toISOString=function(e){if(!this.isValid())return null;var t=!0!==e,n=t?this.clone().utc():this;return n.year()<0||9999<n.year()?A(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):b(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",A(n,"Z")):A(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},mn.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var n="["+e+'("]',s=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i=t+'[")]';return this.format(n+s+"-MM-DD[T]HH:mm:ss.SSS"+i)},mn.toJSON=function(){return this.isValid()?this.toISOString():null},mn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},mn.unix=function(){return Math.floor(this.valueOf()/1e3)},mn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},mn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},mn.year=Oe,mn.isLeapYear=function(){return De(this.year())},mn.weekYear=function(e){return on.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},mn.isoWeekYear=function(e){return on.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},mn.quarter=mn.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},mn.month=Ue,mn.daysInMonth=function(){return Pe(this.year(),this.month())},mn.week=mn.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},mn.isoWeek=mn.isoWeeks=function(e){var t=Ie(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},mn.weeksInYear=function(){var e=this.localeData()._week;return Ae(this.year(),e.dow,e.doy)},mn.isoWeeksInYear=function(){return Ae(this.year(),1,4)},mn.date=un,mn.day=mn.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t,n,s=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(t=e,n=this.localeData(),e="string"!=typeof t?t:isNaN(t)?"number"==typeof(t=n.weekdaysParse(t))?t:null:parseInt(t,10),this.add(e-s,"d")):s},mn.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},mn.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null==e)return this.day()||7;var t,n,s=(t=e,n=this.localeData(),"string"==typeof t?n.weekdaysParse(t)%7||7:isNaN(t)?null:t);return this.day(this.day()%7?s:s-7)},mn.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},mn.hour=mn.hours=nt,mn.minute=mn.minutes=ln,mn.second=mn.seconds=dn,mn.millisecond=mn.milliseconds=fn,mn.utcOffset=function(e,t,n){var s,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null==e)return this._isUTC?i:Vt(this);if("string"==typeof e){if(null===(e=Nt(re,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(s=Vt(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),i!==e&&(!t||this._changeInProgress?qt(this,jt(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,c.updateOffset(this,!0),this._changeInProgress=null)),this},mn.utc=function(e){return this.utcOffset(0,e)},mn.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Vt(this),"m")),this},mn.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var e=Nt(ie,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},mn.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?bt(e).utcOffset():0,(this.utcOffset()-e)%60==0)},mn.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},mn.isLocal=function(){return!!this.isValid()&&!this._isUTC},mn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},mn.isUtc=Et,mn.isUTC=Et,mn.zoneAbbr=function(){return this._isUTC?"UTC":""},mn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},mn.dates=n("dates accessor is deprecated. Use date instead.",un),mn.months=n("months accessor is deprecated. Use month instead",Ue),mn.years=n("years accessor is deprecated. Use year instead",Oe),mn.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),mn.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Ot(e))._a){var t=e._isUTC?y(e._a):bt(e._a);this._isDSTShifted=this.isValid()&&0<a(e._a,t.toArray())}else this._isDSTShifted=!1;return this._isDSTShifted});var yn=P.prototype;function gn(e,t,n,s){var i=ht(),r=y().set(s,t);return i[n](r,e)}function vn(e,t,n){if(h(e)&&(t=e,e=void 0),e=e||"",null!=t)return gn(e,t,n,"month");var s,i=[];for(s=0;s<12;s++)i[s]=gn(e,s,n,"month");return i}function pn(e,t,n,s){t=("boolean"==typeof e?h(t)&&(n=t,t=void 0):(t=e,e=!1,h(n=t)&&(n=t,t=void 0)),t||"");var i,r=ht(),a=e?r._week.dow:0;if(null!=n)return gn(t,(n+a)%7,s,"day");var o=[];for(i=0;i<7;i++)o[i]=gn(t,(i+a)%7,s,"day");return o}yn.calendar=function(e,t,n){var s=this._calendar[e]||this._calendar.sameElse;return b(s)?s.call(t,n):s},yn.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])},yn.invalidDate=function(){return this._invalidDate},yn.ordinal=function(e){return this._ordinal.replace("%d",e)},yn.preparse=_n,yn.postformat=_n,yn.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return b(i)?i(e,t,n,s):i.replace(/%d/i,e)},yn.pastFuture=function(e,t){var n=this._relativeTime[0<e?"future":"past"];return b(n)?n(t):n.replace(/%s/i,t)},yn.set=function(e){var t,n;for(n in e)b(t=e[n])?this[n]=t:this["_"+n]=t;this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},yn.months=function(e,t){return e?o(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||We).test(t)?"format":"standalone"][e.month()]:o(this._months)?this._months:this._months.standalone},yn.monthsShort=function(e,t){return e?o(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[We.test(t)?"format":"standalone"][e.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},yn.monthsParse=function(e,t,n){var s,i,r;if(this._monthsParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=y([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(i=Ye.call(this._shortMonthsParse,a))?i:null:-1!==(i=Ye.call(this._longMonthsParse,a))?i:null:"MMM"===t?-1!==(i=Ye.call(this._shortMonthsParse,a))?i:-1!==(i=Ye.call(this._longMonthsParse,a))?i:null:-1!==(i=Ye.call(this._longMonthsParse,a))?i:-1!==(i=Ye.call(this._shortMonthsParse,a))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=y([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(r="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},yn.monthsRegex=function(e){return this._monthsParseExact?(m(this,"_monthsRegex")||Ne.call(this),e?this._monthsStrictRegex:this._monthsRegex):(m(this,"_monthsRegex")||(this._monthsRegex=Le),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},yn.monthsShortRegex=function(e){return this._monthsParseExact?(m(this,"_monthsRegex")||Ne.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(m(this,"_monthsShortRegex")||(this._monthsShortRegex=Fe),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},yn.week=function(e){return Ie(e,this._week.dow,this._week.doy).week},yn.firstDayOfYear=function(){return this._week.doy},yn.firstDayOfWeek=function(){return this._week.dow},yn.weekdays=function(e,t){var n=o(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"];return!0===e?je(n,this._week.dow):e?n[e.day()]:n},yn.weekdaysMin=function(e){return!0===e?je(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin},yn.weekdaysShort=function(e){return!0===e?je(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort},yn.weekdaysParse=function(e,t,n){var s,i,r;if(this._weekdaysParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=y([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=Ye.call(this._weekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:"dddd"===t?-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=y([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(r="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},yn.weekdaysRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Qe.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(m(this,"_weekdaysRegex")||(this._weekdaysRegex=qe),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},yn.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Qe.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(m(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Je),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},yn.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Qe.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(m(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Be),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},yn.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},yn.meridiem=function(e,t,n){return 11<e?n?"pm":"PM":n?"am":"AM"},ut("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===D(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),c.lang=n("moment.lang is deprecated. Use moment.locale instead.",ut),c.langData=n("moment.langData is deprecated. Use moment.localeData instead.",ht);var wn=Math.abs;function Mn(e,t,n,s){var i=jt(t,n);return e._milliseconds+=s*i._milliseconds,e._days+=s*i._days,e._months+=s*i._months,e._bubble()}function kn(e){return e<0?Math.floor(e):Math.ceil(e)}function Sn(e){return 4800*e/146097}function Dn(e){return 146097*e/4800}function Yn(e){return function(){return this.as(e)}}var On=Yn("ms"),Tn=Yn("s"),bn=Yn("m"),xn=Yn("h"),Pn=Yn("d"),Wn=Yn("w"),Cn=Yn("M"),Hn=Yn("Q"),Rn=Yn("y");function Un(e){return function(){return this.isValid()?this._data[e]:NaN}}var Fn=Un("milliseconds"),Ln=Un("seconds"),Nn=Un("minutes"),Gn=Un("hours"),Vn=Un("days"),En=Un("months"),In=Un("years");var An=Math.round,jn={ss:44,s:45,m:45,h:22,d:26,M:11};var Zn=Math.abs;function zn(e){return(0<e)-(e<0)||+e}function $n(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n=Zn(this._milliseconds)/1e3,s=Zn(this._days),i=Zn(this._months);t=S((e=S(n/60))/60),n%=60,e%=60;var r=S(i/12),a=i%=12,o=s,u=t,l=e,h=n?n.toFixed(3).replace(/\.?0+$/,""):"",d=this.asSeconds();if(!d)return"P0D";var c=d<0?"-":"",f=zn(this._months)!==zn(d)?"-":"",m=zn(this._days)!==zn(d)?"-":"",_=zn(this._milliseconds)!==zn(d)?"-":"";return c+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(o?m+o+"D":"")+(u||l||h?"T":"")+(u?_+u+"H":"")+(l?_+l+"M":"")+(h?_+h+"S":"")}var qn=Ht.prototype;return qn.isValid=function(){return this._isValid},qn.abs=function(){var e=this._data;return this._milliseconds=wn(this._milliseconds),this._days=wn(this._days),this._months=wn(this._months),e.milliseconds=wn(e.milliseconds),e.seconds=wn(e.seconds),e.minutes=wn(e.minutes),e.hours=wn(e.hours),e.months=wn(e.months),e.years=wn(e.years),this},qn.add=function(e,t){return Mn(this,e,t,1)},qn.subtract=function(e,t){return Mn(this,e,t,-1)},qn.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=H(e))||"quarter"===e||"year"===e)switch(t=this._days+s/864e5,n=this._months+Sn(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(Dn(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},qn.asMilliseconds=On,qn.asSeconds=Tn,qn.asMinutes=bn,qn.asHours=xn,qn.asDays=Pn,qn.asWeeks=Wn,qn.asMonths=Cn,qn.asQuarters=Hn,qn.asYears=Rn,qn.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*D(this._months/12):NaN},qn._bubble=function(){var e,t,n,s,i,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return 0<=r&&0<=a&&0<=o||r<=0&&a<=0&&o<=0||(r+=864e5*kn(Dn(o)+a),o=a=0),u.milliseconds=r%1e3,e=S(r/1e3),u.seconds=e%60,t=S(e/60),u.minutes=t%60,n=S(t/60),u.hours=n%24,o+=i=S(Sn(a+=S(n/24))),a-=kn(Dn(i)),s=S(o/12),o%=12,u.days=a,u.months=o,u.years=s,this},qn.clone=function(){return jt(this)},qn.get=function(e){return e=H(e),this.isValid()?this[e+"s"]():NaN},qn.milliseconds=Fn,qn.seconds=Ln,qn.minutes=Nn,qn.hours=Gn,qn.days=Vn,qn.weeks=function(){return S(this.days()/7)},qn.months=En,qn.years=In,qn.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t,n,s,i,r,a,o,u,l,h,d,c=this.localeData(),f=(n=!e,s=c,i=jt(t=this).abs(),r=An(i.as("s")),a=An(i.as("m")),o=An(i.as("h")),u=An(i.as("d")),l=An(i.as("M")),h=An(i.as("y")),(d=r<=jn.ss&&["s",r]||r<jn.s&&["ss",r]||a<=1&&["m"]||a<jn.m&&["mm",a]||o<=1&&["h"]||o<jn.h&&["hh",o]||u<=1&&["d"]||u<jn.d&&["dd",u]||l<=1&&["M"]||l<jn.M&&["MM",l]||h<=1&&["y"]||["yy",h])[2]=n,d[3]=0<+t,d[4]=s,function(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}.apply(null,d));return e&&(f=c.pastFuture(+this,f)),c.postformat(f)},qn.toISOString=$n,qn.toString=$n,qn.toJSON=$n,qn.locale=Xt,qn.localeData=en,qn.toIsoString=n("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",$n),qn.lang=Kt,I("X",0,0,"unix"),I("x",0,0,"valueOf"),ue("x",se),ue("X",/[+-]?\d+(\.\d{1,3})?/),ce("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),ce("x",function(e,t,n){n._d=new Date(D(e))}),c.version="2.24.0",e=bt,c.fn=mn,c.min=function(){return Wt("isBefore",[].slice.call(arguments,0))},c.max=function(){return Wt("isAfter",[].slice.call(arguments,0))},c.now=function(){return Date.now?Date.now():+new Date},c.utc=y,c.unix=function(e){return bt(1e3*e)},c.months=function(e,t){return vn(e,t,"months")},c.isDate=d,c.locale=ut,c.invalid=p,c.duration=jt,c.isMoment=k,c.weekdays=function(e,t,n){return pn(e,t,n,"weekdays")},c.parseZone=function(){return bt.apply(null,arguments).parseZone()},c.localeData=ht,c.isDuration=Rt,c.monthsShort=function(e,t){return vn(e,t,"monthsShort")},c.weekdaysMin=function(e,t,n){return pn(e,t,n,"weekdaysMin")},c.defineLocale=lt,c.updateLocale=function(e,t){if(null!=t){var n,s,i=st;null!=(s=ot(e))&&(i=s._config),(n=new P(t=x(i,t))).parentLocale=it[e],it[e]=n,ut(e)}else null!=it[e]&&(null!=it[e].parentLocale?it[e]=it[e].parentLocale:null!=it[e]&&delete it[e]);return it[e]},c.locales=function(){return s(it)},c.weekdaysShort=function(e,t,n){return pn(e,t,n,"weekdaysShort")},c.normalizeUnits=H,c.relativeTimeRounding=function(e){return void 0===e?An:"function"==typeof e&&(An=e,!0)},c.relativeTimeThreshold=function(e,t){return void 0!==jn[e]&&(void 0===t?jn[e]:(jn[e]=t,"s"===e&&(jn.ss=t-1),!0))},c.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},c.prototype=mn,c.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},c});
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./node_modules/node-libs-browser/mock/empty.js":
+/*!******************************************************!*\
+  !*** ./node_modules/node-libs-browser/mock/empty.js ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+
+
+/***/ }),
+
+/***/ "./node_modules/path-browserify/index.js":
+/*!***********************************************!*\
+  !*** ./node_modules/path-browserify/index.js ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process) {// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
+// backported and transplited with Babel, with backwards-compat fixes
+
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+  // if the path tries to go above the root, `up` ends up > 0
+  var up = 0;
+  for (var i = parts.length - 1; i >= 0; i--) {
+    var last = parts[i];
+    if (last === '.') {
+      parts.splice(i, 1);
+    } else if (last === '..') {
+      parts.splice(i, 1);
+      up++;
+    } else if (up) {
+      parts.splice(i, 1);
+      up--;
+    }
+  }
+
+  // if the path is allowed to go above the root, restore leading ..s
+  if (allowAboveRoot) {
+    for (; up--; up) {
+      parts.unshift('..');
+    }
+  }
+
+  return parts;
+}
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+  var resolvedPath = '',
+      resolvedAbsolute = false;
+
+  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+    var path = (i >= 0) ? arguments[i] : process.cwd();
+
+    // Skip empty and invalid entries
+    if (typeof path !== 'string') {
+      throw new TypeError('Arguments to path.resolve must be strings');
+    } else if (!path) {
+      continue;
+    }
+
+    resolvedPath = path + '/' + resolvedPath;
+    resolvedAbsolute = path.charAt(0) === '/';
+  }
+
+  // At this point the path should be resolved to a full absolute path, but
+  // handle relative paths to be safe (might happen when process.cwd() fails)
+
+  // Normalize the path
+  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+    return !!p;
+  }), !resolvedAbsolute).join('/');
+
+  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+  var isAbsolute = exports.isAbsolute(path),
+      trailingSlash = substr(path, -1) === '/';
+
+  // Normalize the path
+  path = normalizeArray(filter(path.split('/'), function(p) {
+    return !!p;
+  }), !isAbsolute).join('/');
+
+  if (!path && !isAbsolute) {
+    path = '.';
+  }
+  if (path && trailingSlash) {
+    path += '/';
+  }
+
+  return (isAbsolute ? '/' : '') + path;
+};
+
+// posix version
+exports.isAbsolute = function(path) {
+  return path.charAt(0) === '/';
+};
+
+// posix version
+exports.join = function() {
+  var paths = Array.prototype.slice.call(arguments, 0);
+  return exports.normalize(filter(paths, function(p, index) {
+    if (typeof p !== 'string') {
+      throw new TypeError('Arguments to path.join must be strings');
+    }
+    return p;
+  }).join('/'));
+};
+
+
+// path.relative(from, to)
+// posix version
+exports.relative = function(from, to) {
+  from = exports.resolve(from).substr(1);
+  to = exports.resolve(to).substr(1);
+
+  function trim(arr) {
+    var start = 0;
+    for (; start < arr.length; start++) {
+      if (arr[start] !== '') break;
+    }
+
+    var end = arr.length - 1;
+    for (; end >= 0; end--) {
+      if (arr[end] !== '') break;
+    }
+
+    if (start > end) return [];
+    return arr.slice(start, end - start + 1);
+  }
+
+  var fromParts = trim(from.split('/'));
+  var toParts = trim(to.split('/'));
+
+  var length = Math.min(fromParts.length, toParts.length);
+  var samePartsLength = length;
+  for (var i = 0; i < length; i++) {
+    if (fromParts[i] !== toParts[i]) {
+      samePartsLength = i;
+      break;
+    }
+  }
+
+  var outputParts = [];
+  for (var i = samePartsLength; i < fromParts.length; i++) {
+    outputParts.push('..');
+  }
+
+  outputParts = outputParts.concat(toParts.slice(samePartsLength));
+
+  return outputParts.join('/');
+};
+
+exports.sep = '/';
+exports.delimiter = ':';
+
+exports.dirname = function (path) {
+  if (typeof path !== 'string') path = path + '';
+  if (path.length === 0) return '.';
+  var code = path.charCodeAt(0);
+  var hasRoot = code === 47 /*/*/;
+  var end = -1;
+  var matchedSlash = true;
+  for (var i = path.length - 1; i >= 1; --i) {
+    code = path.charCodeAt(i);
+    if (code === 47 /*/*/) {
+        if (!matchedSlash) {
+          end = i;
+          break;
+        }
+      } else {
+      // We saw the first non-path separator
+      matchedSlash = false;
+    }
+  }
+
+  if (end === -1) return hasRoot ? '/' : '.';
+  if (hasRoot && end === 1) {
+    // return '//';
+    // Backwards-compat fix:
+    return '/';
+  }
+  return path.slice(0, end);
+};
+
+function basename(path) {
+  if (typeof path !== 'string') path = path + '';
+
+  var start = 0;
+  var end = -1;
+  var matchedSlash = true;
+  var i;
+
+  for (i = path.length - 1; i >= 0; --i) {
+    if (path.charCodeAt(i) === 47 /*/*/) {
+        // If we reached a path separator that was not part of a set of path
+        // separators at the end of the string, stop now
+        if (!matchedSlash) {
+          start = i + 1;
+          break;
+        }
+      } else if (end === -1) {
+      // We saw the first non-path separator, mark this as the end of our
+      // path component
+      matchedSlash = false;
+      end = i + 1;
+    }
+  }
+
+  if (end === -1) return '';
+  return path.slice(start, end);
+}
+
+// Uses a mixed approach for backwards-compatibility, as ext behavior changed
+// in new Node.js versions, so only basename() above is backported here
+exports.basename = function (path, ext) {
+  var f = basename(path);
+  if (ext && f.substr(-1 * ext.length) === ext) {
+    f = f.substr(0, f.length - ext.length);
+  }
+  return f;
+};
+
+exports.extname = function (path) {
+  if (typeof path !== 'string') path = path + '';
+  var startDot = -1;
+  var startPart = 0;
+  var end = -1;
+  var matchedSlash = true;
+  // Track the state of characters (if any) we see before our first dot and
+  // after any path separator we find
+  var preDotState = 0;
+  for (var i = path.length - 1; i >= 0; --i) {
+    var code = path.charCodeAt(i);
+    if (code === 47 /*/*/) {
+        // If we reached a path separator that was not part of a set of path
+        // separators at the end of the string, stop now
+        if (!matchedSlash) {
+          startPart = i + 1;
+          break;
+        }
+        continue;
+      }
+    if (end === -1) {
+      // We saw the first non-path separator, mark this as the end of our
+      // extension
+      matchedSlash = false;
+      end = i + 1;
+    }
+    if (code === 46 /*.*/) {
+        // If this is our first dot, mark it as the start of our extension
+        if (startDot === -1)
+          startDot = i;
+        else if (preDotState !== 1)
+          preDotState = 1;
+    } else if (startDot !== -1) {
+      // We saw a non-dot and non-path separator before our dot, so we should
+      // have a good chance at having a non-empty extension
+      preDotState = -1;
+    }
+  }
+
+  if (startDot === -1 || end === -1 ||
+      // We saw a non-dot character immediately before the dot
+      preDotState === 0 ||
+      // The (right-most) trimmed path component is exactly '..'
+      preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
+    return '';
+  }
+  return path.slice(startDot, end);
+};
+
+function filter (xs, f) {
+    if (xs.filter) return xs.filter(f);
+    var res = [];
+    for (var i = 0; i < xs.length; i++) {
+        if (f(xs[i], i, xs)) res.push(xs[i]);
+    }
+    return res;
+}
+
+// String.prototype.substr - negative index don't work in IE8
+var substr = 'ab'.substr(-1) === 'b'
+    ? function (str, start, len) { return str.substr(start, len) }
+    : function (str, start, len) {
+        if (start < 0) start = str.length + start;
+        return str.substr(start, len);
+    }
+;
+
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../process/browser.js */ "./node_modules/process/browser.js")))
+
+/***/ }),
+
+/***/ "./node_modules/process/browser.js":
+/*!*****************************************!*\
+  !*** ./node_modules/process/browser.js ***!
+  \*****************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things.  But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals.  It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+    throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+    throw new Error('clearTimeout has not been defined');
+}
+(function () {
+    try {
+        if (typeof setTimeout === 'function') {
+            cachedSetTimeout = setTimeout;
+        } else {
+            cachedSetTimeout = defaultSetTimout;
+        }
+    } catch (e) {
+        cachedSetTimeout = defaultSetTimout;
+    }
+    try {
+        if (typeof clearTimeout === 'function') {
+            cachedClearTimeout = clearTimeout;
+        } else {
+            cachedClearTimeout = defaultClearTimeout;
+        }
+    } catch (e) {
+        cachedClearTimeout = defaultClearTimeout;
+    }
+} ())
+function runTimeout(fun) {
+    if (cachedSetTimeout === setTimeout) {
+        //normal enviroments in sane situations
+        return setTimeout(fun, 0);
+    }
+    // if setTimeout wasn't available but was latter defined
+    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+        cachedSetTimeout = setTimeout;
+        return setTimeout(fun, 0);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedSetTimeout(fun, 0);
+    } catch(e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+            return cachedSetTimeout.call(null, fun, 0);
+        } catch(e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+            return cachedSetTimeout.call(this, fun, 0);
+        }
+    }
+
+
+}
+function runClearTimeout(marker) {
+    if (cachedClearTimeout === clearTimeout) {
+        //normal enviroments in sane situations
+        return clearTimeout(marker);
+    }
+    // if clearTimeout wasn't available but was latter defined
+    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+        cachedClearTimeout = clearTimeout;
+        return clearTimeout(marker);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedClearTimeout(marker);
+    } catch (e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
+            return cachedClearTimeout.call(null, marker);
+        } catch (e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+            return cachedClearTimeout.call(this, marker);
+        }
+    }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+    if (!draining || !currentQueue) {
+        return;
+    }
+    draining = false;
+    if (currentQueue.length) {
+        queue = currentQueue.concat(queue);
+    } else {
+        queueIndex = -1;
+    }
+    if (queue.length) {
+        drainQueue();
+    }
+}
+
+function drainQueue() {
+    if (draining) {
+        return;
+    }
+    var timeout = runTimeout(cleanUpNextTick);
+    draining = true;
+
+    var len = queue.length;
+    while(len) {
+        currentQueue = queue;
+        queue = [];
+        while (++queueIndex < len) {
+            if (currentQueue) {
+                currentQueue[queueIndex].run();
+            }
+        }
+        queueIndex = -1;
+        len = queue.length;
+    }
+    currentQueue = null;
+    draining = false;
+    runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+    var args = new Array(arguments.length - 1);
+    if (arguments.length > 1) {
+        for (var i = 1; i < arguments.length; i++) {
+            args[i - 1] = arguments[i];
+        }
+    }
+    queue.push(new Item(fun, args));
+    if (queue.length === 1 && !draining) {
+        runTimeout(drainQueue);
+    }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+    this.fun = fun;
+    this.array = array;
+}
+Item.prototype.run = function () {
+    this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+    throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+    throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+
+/***/ }),
+
+/***/ "./node_modules/stylis/stylis.js":
+/*!***************************************!*\
+  !*** ./node_modules/stylis/stylis.js ***!
+  \***************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/*
+ *          __        ___
+ *    _____/ /___  __/ (_)____
+ *   / ___/ __/ / / / / / ___/
+ *  (__  ) /_/ /_/ / / (__  )
+ * /____/\__/\__, /_/_/____/
+ *          /____/
+ *
+ * light - weight css preprocessor @licence MIT
+ */
+(function (factory) {/* eslint-disable */
+	 true ? (module['exports'] = factory(null)) :
+		undefined
+}(/** @param {*=} options */function factory (options) {/* eslint-disable */
+
+	'use strict'
+
+	/**
+	 * Notes
+	 *
+	 * The ['<method name>'] pattern is used to support closure compiler
+	 * the jsdoc signatures are also used to the same effect
+	 *
+	 * ----
+	 *
+	 * int + int + int === n4 [faster]
+	 *
+	 * vs
+	 *
+	 * int === n1 && int === n2 && int === n3
+	 *
+	 * ----
+	 *
+	 * switch (int) { case ints...} [faster]
+	 *
+	 * vs
+	 *
+	 * if (int == 1 && int === 2 ...)
+	 *
+	 * ----
+	 *
+	 * The (first*n1 + second*n2 + third*n3) format used in the property parser
+	 * is a simple way to hash the sequence of characters
+	 * taking into account the index they occur in
+	 * since any number of 3 character sequences could produce duplicates.
+	 *
+	 * On the other hand sequences that are directly tied to the index of the character
+	 * resolve a far more accurate measure, it's also faster
+	 * to evaluate one condition in a switch statement
+	 * than three in an if statement regardless of the added math.
+	 *
+	 * This allows the vendor prefixer to be both small and fast.
+	 */
+
+	var nullptn = /^\0+/g /* matches leading null characters */
+	var formatptn = /[\0\r\f]/g /* matches new line, null and formfeed characters */
+	var colonptn = /: */g /* splits animation rules */
+	var cursorptn = /zoo|gra/ /* assert cursor varient */
+	var transformptn = /([,: ])(transform)/g /* vendor prefix transform, older webkit */
+	var animationptn = /,+\s*(?![^(]*[)])/g /* splits multiple shorthand notation animations */
+	var propertiesptn = / +\s*(?![^(]*[)])/g /* animation properties */
+	var elementptn = / *[\0] */g /* selector elements */
+	var selectorptn = /,\r+?/g /* splits selectors */
+	var andptn = /([\t\r\n ])*\f?&/g /* match & */
+	var escapeptn = /:global\(((?:[^\(\)\[\]]*|\[.*\]|\([^\(\)]*\))*)\)/g /* matches :global(.*) */
+	var invalidptn = /\W+/g /* removes invalid characters from keyframes */
+	var keyframeptn = /@(k\w+)\s*(\S*)\s*/ /* matches @keyframes $1 */
+	var plcholdrptn = /::(place)/g /* match ::placeholder varient */
+	var readonlyptn = /:(read-only)/g /* match :read-only varient */
+	var beforeptn = /\s+(?=[{\];=:>])/g /* matches \s before ] ; = : */
+	var afterptn = /([[}=:>])\s+/g /* matches \s after characters [ } = : */
+	var tailptn = /(\{[^{]+?);(?=\})/g /* matches tail semi-colons ;} */
+	var whiteptn = /\s{2,}/g /* matches repeating whitespace */
+	var pseudoptn = /([^\(])(:+) */g /* pseudo element */
+	var writingptn = /[svh]\w+-[tblr]{2}/ /* match writing mode property values */
+	var gradientptn = /([\w-]+t\()/g /* match *gradient property */
+	var supportsptn = /\(\s*(.*)\s*\)/g /* match supports (groups) */
+	var propertyptn = /([\s\S]*?);/g /* match properties leading semicolon */
+	var selfptn = /-self|flex-/g /* match flex- and -self in align-self: flex-*; */
+	var pseudofmt = /[^]*?(:[rp][el]a[\w-]+)[^]*/ /* extrats :readonly or :placholder from selector */
+	var trimptn = /[ \t]+$/ /* match tail whitspace */
+	var dimensionptn = /stretch|:\s*\w+\-(?:conte|avail)/ /* match max/min/fit-content, fill-available */
+	var imgsrcptn = /([^-])(image-set\()/
+
+	/* vendors */
+	var webkit = '-webkit-'
+	var moz = '-moz-'
+	var ms = '-ms-'
+
+	/* character codes */
+	var SEMICOLON = 59 /* ; */
+	var CLOSEBRACES = 125 /* } */
+	var OPENBRACES = 123 /* { */
+	var OPENPARENTHESES = 40 /* ( */
+	var CLOSEPARENTHESES = 41 /* ) */
+	var OPENBRACKET = 91 /* [ */
+	var CLOSEBRACKET = 93 /* ] */
+	var NEWLINE = 10 /* \n */
+	var CARRIAGE = 13 /* \r */
+	var TAB = 9 /* \t */
+	var AT = 64 /* @ */
+	var SPACE = 32 /*   */
+	var AND = 38 /* & */
+	var DASH = 45 /* - */
+	var UNDERSCORE = 95 /* _ */
+	var STAR = 42 /* * */
+	var COMMA = 44 /* , */
+	var COLON = 58 /* : */
+	var SINGLEQUOTE = 39 /* ' */
+	var DOUBLEQUOTE = 34 /* " */
+	var FOWARDSLASH = 47 /* / */
+	var GREATERTHAN = 62 /* > */
+	var PLUS = 43 /* + */
+	var TILDE = 126 /* ~ */
+	var NULL = 0 /* \0 */
+	var FORMFEED = 12 /* \f */
+	var VERTICALTAB = 11 /* \v */
+
+	/* special identifiers */
+	var KEYFRAME = 107 /* k */
+	var MEDIA = 109 /* m */
+	var SUPPORTS = 115 /* s */
+	var PLACEHOLDER = 112 /* p */
+	var READONLY = 111 /* o */
+	var IMPORT = 105 /* <at>i */
+	var CHARSET = 99 /* <at>c */
+	var DOCUMENT = 100 /* <at>d */
+	var PAGE = 112 /* <at>p */
+
+	var column = 1 /* current column */
+	var line = 1 /* current line numebr */
+	var pattern = 0 /* :pattern */
+
+	var cascade = 1 /* #id h1 h2 vs h1#id h2#id  */
+	var prefix = 1 /* vendor prefix */
+	var escape = 1 /* escape :global() pattern */
+	var compress = 0 /* compress output */
+	var semicolon = 0 /* no/semicolon option */
+	var preserve = 0 /* preserve empty selectors */
+
+	/* empty reference */
+	var array = []
+
+	/* plugins */
+	var plugins = []
+	var plugged = 0
+	var should = null
+
+	/* plugin context */
+	var POSTS = -2
+	var PREPS = -1
+	var UNKWN = 0
+	var PROPS = 1
+	var BLCKS = 2
+	var ATRUL = 3
+
+	/* plugin newline context */
+	var unkwn = 0
+
+	/* keyframe animation */
+	var keyed = 1
+	var key = ''
+
+	/* selector namespace */
+	var nscopealt = ''
+	var nscope = ''
+
+	/**
+	 * Compile
+	 *
+	 * @param {Array<string>} parent
+	 * @param {Array<string>} current
+	 * @param {string} body
+	 * @param {number} id
+	 * @param {number} depth
+	 * @return {string}
+	 */
+	function compile (parent, current, body, id, depth) {
+		var bracket = 0 /* brackets [] */
+		var comment = 0 /* comments /* // or /* */
+		var parentheses = 0 /* functions () */
+		var quote = 0 /* quotes '', "" */
+
+		var first = 0 /* first character code */
+		var second = 0 /* second character code */
+		var code = 0 /* current character code */
+		var tail = 0 /* previous character code */
+		var trail = 0 /* character before previous code */
+		var peak = 0 /* previous non-whitespace code */
+
+		var counter = 0 /* count sequence termination */
+		var context = 0 /* track current context */
+		var atrule = 0 /* track @at-rule context */
+		var pseudo = 0 /* track pseudo token index */
+		var caret = 0 /* current character index */
+		var format = 0 /* control character formating context */
+		var insert = 0 /* auto semicolon insertion */
+		var invert = 0 /* inverted selector pattern */
+		var length = 0 /* generic length address */
+		var eof = body.length /* end of file(length) */
+		var eol = eof - 1 /* end of file(characters) */
+
+		var char = '' /* current character */
+		var chars = '' /* current buffer of characters */
+		var child = '' /* next buffer of characters */
+		var out = '' /* compiled body */
+		var children = '' /* compiled children */
+		var flat = '' /* compiled leafs */
+		var selector /* generic selector address */
+		var result /* generic address */
+
+		// ...build body
+		while (caret < eof) {
+			code = body.charCodeAt(caret)
+
+			// eof varient
+			if (caret === eol) {
+				// last character + noop context, add synthetic padding for noop context to terminate
+				if (comment + quote + parentheses + bracket !== 0) {
+					if (comment !== 0) {
+						code = comment === FOWARDSLASH ? NEWLINE : FOWARDSLASH
+					}
+
+					quote = parentheses = bracket = 0
+					eof++
+					eol++
+				}
+			}
+
+			if (comment + quote + parentheses + bracket === 0) {
+				// eof varient
+				if (caret === eol) {
+					if (format > 0) {
+						chars = chars.replace(formatptn, '')
+					}
+
+					if (chars.trim().length > 0) {
+						switch (code) {
+							case SPACE:
+							case TAB:
+							case SEMICOLON:
+							case CARRIAGE:
+							case NEWLINE: {
+								break
+							}
+							default: {
+								chars += body.charAt(caret)
+							}
+						}
+
+						code = SEMICOLON
+					}
+				}
+
+				// auto semicolon insertion
+				if (insert === 1) {
+					switch (code) {
+						// false flags
+						case OPENBRACES:
+						case CLOSEBRACES:
+						case SEMICOLON:
+						case DOUBLEQUOTE:
+						case SINGLEQUOTE:
+						case OPENPARENTHESES:
+						case CLOSEPARENTHESES:
+						case COMMA: {
+							insert = 0
+						}
+						// ignore
+						case TAB:
+						case CARRIAGE:
+						case NEWLINE:
+						case SPACE: {
+							break
+						}
+						// valid
+						default: {
+							insert = 0
+							length = caret
+							first = code
+							caret--
+							code = SEMICOLON
+
+							while (length < eof) {
+								switch (body.charCodeAt(length++)) {
+									case NEWLINE:
+									case CARRIAGE:
+									case SEMICOLON: {
+										++caret
+										code = first
+										length = eof
+										break
+									}
+									case COLON: {
+										if (format > 0) {
+											++caret
+											code = first
+										}
+									}
+									case OPENBRACES: {
+										length = eof
+									}
+								}
+							}
+						}
+					}
+				}
+
+				// token varient
+				switch (code) {
+					case OPENBRACES: {
+						chars = chars.trim()
+						first = chars.charCodeAt(0)
+						counter = 1
+						length = ++caret
+
+						while (caret < eof) {
+							switch (code = body.charCodeAt(caret)) {
+								case OPENBRACES: {
+									counter++
+									break
+								}
+								case CLOSEBRACES: {
+									counter--
+									break
+								}
+								case FOWARDSLASH: {
+									switch (second = body.charCodeAt(caret + 1)) {
+										// /*, //
+										case STAR:
+										case FOWARDSLASH: {
+											caret = delimited(second, caret, eol, body)
+										}
+									}
+									break
+								}
+								// given "[" === 91 & "]" === 93 hence forth 91 + 1 + 1 === 93
+								case OPENBRACKET: {
+									code++
+								}
+								// given "(" === 40 & ")" === 41 hence forth 40 + 1 === 41
+								case OPENPARENTHESES: {
+									code++
+								}
+								// quote tail delimiter is identical to the head delimiter hence noop,
+								// fallthrough clauses have been shifted to the correct tail delimiter
+								case DOUBLEQUOTE:
+								case SINGLEQUOTE: {
+									while (caret++ < eol) {
+										if (body.charCodeAt(caret) === code) {
+											break
+										}
+									}
+								}
+							}
+
+							if (counter === 0) {
+								break
+							}
+
+							caret++
+						}
+
+						child = body.substring(length, caret)
+
+						if (first === NULL) {
+							first = (chars = chars.replace(nullptn, '').trim()).charCodeAt(0)
+						}
+
+						switch (first) {
+							// @at-rule
+							case AT: {
+								if (format > 0) {
+									chars = chars.replace(formatptn, '')
+								}
+
+								second = chars.charCodeAt(1)
+
+								switch (second) {
+									case DOCUMENT:
+									case MEDIA:
+									case SUPPORTS:
+									case DASH: {
+										selector = current
+										break
+									}
+									default: {
+										selector = array
+									}
+								}
+
+								child = compile(current, selector, child, second, depth+1)
+								length = child.length
+
+								// preserve empty @at-rule
+								if (preserve > 0 && length === 0) {
+									length = chars.length
+								}
+
+								// execute plugins, @at-rule context
+								if (plugged > 0) {
+									selector = select(array, chars, invert)
+									result = proxy(ATRUL, child, selector, current, line, column, length, second, depth, id)
+									chars = selector.join('')
+
+									if (result !== void 0) {
+										if ((length = (child = result.trim()).length) === 0) {
+											second = 0
+											child = ''
+										}
+									}
+								}
+
+								if (length > 0) {
+									switch (second) {
+										case SUPPORTS: {
+											chars = chars.replace(supportsptn, supports)
+										}
+										case DOCUMENT:
+										case MEDIA:
+										case DASH: {
+											child = chars + '{' + child + '}'
+											break
+										}
+										case KEYFRAME: {
+											chars = chars.replace(keyframeptn, '$1 $2' + (keyed > 0 ? key : ''))
+											child = chars + '{' + child + '}'
+
+											if (prefix === 1 || (prefix === 2 && vendor('@'+child, 3))) {
+												child = '@' + webkit + child + '@' + child
+											} else {
+												child = '@' + child
+											}
+											break
+										}
+										default: {
+											child = chars + child
+
+											if (id === PAGE) {
+												child = (out += child, '')
+											}
+										}
+									}
+								} else {
+									child = ''
+								}
+
+								break
+							}
+							// selector
+							default: {
+								child = compile(current, select(current, chars, invert), child, id, depth+1)
+							}
+						}
+
+						children += child
+
+						// reset
+						context = 0
+						insert = 0
+						pseudo = 0
+						format = 0
+						invert = 0
+						atrule = 0
+						chars = ''
+						child = ''
+						code = body.charCodeAt(++caret)
+						break
+					}
+					case CLOSEBRACES:
+					case SEMICOLON: {
+						chars = (format > 0 ? chars.replace(formatptn, '') : chars).trim()
+
+						if ((length = chars.length) > 1) {
+							// monkey-patch missing colon
+							if (pseudo === 0) {
+								first = chars.charCodeAt(0)
+
+								// first character is a letter or dash, buffer has a space character
+								if ((first === DASH || first > 96 && first < 123)) {
+									length = (chars = chars.replace(' ', ':')).length
+								}
+							}
+
+							// execute plugins, property context
+							if (plugged > 0) {
+								if ((result = proxy(PROPS, chars, current, parent, line, column, out.length, id, depth, id)) !== void 0) {
+									if ((length = (chars = result.trim()).length) === 0) {
+										chars = '\0\0'
+									}
+								}
+							}
+
+							first = chars.charCodeAt(0)
+							second = chars.charCodeAt(1)
+
+							switch (first) {
+								case NULL: {
+									break
+								}
+								case AT: {
+									if (second === IMPORT || second === CHARSET) {
+										flat += chars + body.charAt(caret)
+										break
+									}
+								}
+								default: {
+									if (chars.charCodeAt(length-1) === COLON) {
+										break
+									}
+
+									out += property(chars, first, second, chars.charCodeAt(2))
+								}
+							}
+						}
+
+						// reset
+						context = 0
+						insert = 0
+						pseudo = 0
+						format = 0
+						invert = 0
+						chars = ''
+						code = body.charCodeAt(++caret)
+						break
+					}
+				}
+			}
+
+			// parse characters
+			switch (code) {
+				case CARRIAGE:
+				case NEWLINE: {
+					// auto insert semicolon
+					if (comment + quote + parentheses + bracket + semicolon === 0) {
+						// valid non-whitespace characters that
+						// may precede a newline
+						switch (peak) {
+							case CLOSEPARENTHESES:
+							case SINGLEQUOTE:
+							case DOUBLEQUOTE:
+							case AT:
+							case TILDE:
+							case GREATERTHAN:
+							case STAR:
+							case PLUS:
+							case FOWARDSLASH:
+							case DASH:
+							case COLON:
+							case COMMA:
+							case SEMICOLON:
+							case OPENBRACES:
+							case CLOSEBRACES: {
+								break
+							}
+							default: {
+								// current buffer has a colon
+								if (pseudo > 0) {
+									insert = 1
+								}
+							}
+						}
+					}
+
+					// terminate line comment
+					if (comment === FOWARDSLASH) {
+						comment = 0
+					} else if (cascade + context === 0 && id !== KEYFRAME && chars.length > 0) {
+						format = 1
+						chars += '\0'
+					}
+
+					// execute plugins, newline context
+					if (plugged * unkwn > 0) {
+						proxy(UNKWN, chars, current, parent, line, column, out.length, id, depth, id)
+					}
+
+					// next line, reset column position
+					column = 1
+					line++
+					break
+				}
+				case SEMICOLON:
+				case CLOSEBRACES: {
+					if (comment + quote + parentheses + bracket === 0) {
+						column++
+						break
+					}
+				}
+				default: {
+					// increment column position
+					column++
+
+					// current character
+					char = body.charAt(caret)
+
+					// remove comments, escape functions, strings, attributes and prepare selectors
+					switch (code) {
+						case TAB:
+						case SPACE: {
+							if (quote + bracket + comment === 0) {
+								switch (tail) {
+									case COMMA:
+									case COLON:
+									case TAB:
+									case SPACE: {
+										char = ''
+										break
+									}
+									default: {
+										if (code !== SPACE) {
+											char = ' '
+										}
+									}
+								}
+							}
+							break
+						}
+						// escape breaking control characters
+						case NULL: {
+							char = '\\0'
+							break
+						}
+						case FORMFEED: {
+							char = '\\f'
+							break
+						}
+						case VERTICALTAB: {
+							char = '\\v'
+							break
+						}
+						// &
+						case AND: {
+							// inverted selector pattern i.e html &
+							if (quote + comment + bracket === 0 && cascade > 0) {
+								invert = 1
+								format = 1
+								char = '\f' + char
+							}
+							break
+						}
+						// ::p<l>aceholder, l
+						// :read-on<l>y, l
+						case 108: {
+							if (quote + comment + bracket + pattern === 0 && pseudo > 0) {
+								switch (caret - pseudo) {
+									// ::placeholder
+									case 2: {
+										if (tail === PLACEHOLDER && body.charCodeAt(caret-3) === COLON) {
+											pattern = tail
+										}
+									}
+									// :read-only
+									case 8: {
+										if (trail === READONLY) {
+											pattern = trail
+										}
+									}
+								}
+							}
+							break
+						}
+						// :<pattern>
+						case COLON: {
+							if (quote + comment + bracket === 0) {
+								pseudo = caret
+							}
+							break
+						}
+						// selectors
+						case COMMA: {
+							if (comment + parentheses + quote + bracket === 0) {
+								format = 1
+								char += '\r'
+							}
+							break
+						}
+						// quotes
+						case DOUBLEQUOTE:
+						case SINGLEQUOTE: {
+							if (comment === 0) {
+								quote = quote === code ? 0 : (quote === 0 ? code : quote)
+							}
+							break
+						}
+						// attributes
+						case OPENBRACKET: {
+							if (quote + comment + parentheses === 0) {
+								bracket++
+							}
+							break
+						}
+						case CLOSEBRACKET: {
+							if (quote + comment + parentheses === 0) {
+								bracket--
+							}
+							break
+						}
+						// functions
+						case CLOSEPARENTHESES: {
+							if (quote + comment + bracket === 0) {
+								parentheses--
+							}
+							break
+						}
+						case OPENPARENTHESES: {
+							if (quote + comment + bracket === 0) {
+								if (context === 0) {
+									switch (tail*2 + trail*3) {
+										// :matches
+										case 533: {
+											break
+										}
+										// :global, :not, :nth-child etc...
+										default: {
+											counter = 0
+											context = 1
+										}
+									}
+								}
+
+								parentheses++
+							}
+							break
+						}
+						case AT: {
+							if (comment + parentheses + quote + bracket + pseudo + atrule === 0) {
+								atrule = 1
+							}
+							break
+						}
+						// block/line comments
+						case STAR:
+						case FOWARDSLASH: {
+							if (quote + bracket + parentheses > 0) {
+								break
+							}
+
+							switch (comment) {
+								// initialize line/block comment context
+								case 0: {
+									switch (code*2 + body.charCodeAt(caret+1)*3) {
+										// //
+										case 235: {
+											comment = FOWARDSLASH
+											break
+										}
+										// /*
+										case 220: {
+											length = caret
+											comment = STAR
+											break
+										}
+									}
+									break
+								}
+								// end block comment context
+								case STAR: {
+									if (code === FOWARDSLASH && tail === STAR && length + 2 !== caret) {
+										// /*<!> ... */, !
+										if (body.charCodeAt(length+2) === 33) {
+											out += body.substring(length, caret+1)
+										}
+										char = ''
+										comment = 0
+									}
+								}
+							}
+						}
+					}
+
+					// ignore comment blocks
+					if (comment === 0) {
+						// aggressive isolation mode, divide each individual selector
+						// including selectors in :not function but excluding selectors in :global function
+						if (cascade + quote + bracket + atrule === 0 && id !== KEYFRAME && code !== SEMICOLON) {
+							switch (code) {
+								case COMMA:
+								case TILDE:
+								case GREATERTHAN:
+								case PLUS:
+								case CLOSEPARENTHESES:
+								case OPENPARENTHESES: {
+									if (context === 0) {
+										// outside of an isolated context i.e nth-child(<...>)
+										switch (tail) {
+											case TAB:
+											case SPACE:
+											case NEWLINE:
+											case CARRIAGE: {
+												char = char + '\0'
+												break
+											}
+											default: {
+												char = '\0' + char + (code === COMMA ? '' : '\0')
+											}
+										}
+										format = 1
+									} else {
+										// within an isolated context, sleep untill it's terminated
+										switch (code) {
+											case OPENPARENTHESES: {
+												// :globa<l>(
+												if (pseudo + 7 === caret && tail === 108) {
+													pseudo = 0
+												}
+												context = ++counter
+												break
+											}
+											case CLOSEPARENTHESES: {
+												if ((context = --counter) === 0) {
+													format = 1
+													char += '\0'
+												}
+												break
+											}
+										}
+									}
+									break
+								}
+								case TAB:
+								case SPACE: {
+									switch (tail) {
+										case NULL:
+										case OPENBRACES:
+										case CLOSEBRACES:
+										case SEMICOLON:
+										case COMMA:
+										case FORMFEED:
+										case TAB:
+										case SPACE:
+										case NEWLINE:
+										case CARRIAGE: {
+											break
+										}
+										default: {
+											// ignore in isolated contexts
+											if (context === 0) {
+												format = 1
+												char += '\0'
+											}
+										}
+									}
+								}
+							}
+						}
+
+						// concat buffer of characters
+						chars += char
+
+						// previous non-whitespace character code
+						if (code !== SPACE && code !== TAB) {
+							peak = code
+						}
+					}
+				}
+			}
+
+			// tail character codes
+			trail = tail
+			tail = code
+
+			// visit every character
+			caret++
+		}
+
+		length = out.length
+
+		// preserve empty selector
+ 		if (preserve > 0) {
+ 			if (length === 0 && children.length === 0 && (current[0].length === 0) === false) {
+ 				if (id !== MEDIA || (current.length === 1 && (cascade > 0 ? nscopealt : nscope) === current[0])) {
+					length = current.join(',').length + 2
+ 				}
+ 			}
+		}
+
+		if (length > 0) {
+			// cascade isolation mode?
+			selector = cascade === 0 && id !== KEYFRAME ? isolate(current) : current
+
+			// execute plugins, block context
+			if (plugged > 0) {
+				result = proxy(BLCKS, out, selector, parent, line, column, length, id, depth, id)
+
+				if (result !== void 0 && (out = result).length === 0) {
+					return flat + out + children
+				}
+			}
+
+			out = selector.join(',') + '{' + out + '}'
+
+			if (prefix*pattern !== 0) {
+				if (prefix === 2 && !vendor(out, 2))
+					pattern = 0
+
+				switch (pattern) {
+					// ::read-only
+					case READONLY: {
+						out = out.replace(readonlyptn, ':'+moz+'$1')+out
+						break
+					}
+					// ::placeholder
+					case PLACEHOLDER: {
+						out = (
+							out.replace(plcholdrptn, '::' + webkit + 'input-$1') +
+							out.replace(plcholdrptn, '::' + moz + '$1') +
+							out.replace(plcholdrptn, ':' + ms + 'input-$1') + out
+						)
+						break
+					}
+				}
+
+				pattern = 0
+			}
+		}
+
+		return flat + out + children
+	}
+
+	/**
+	 * Select
+	 *
+	 * @param {Array<string>} parent
+	 * @param {string} current
+	 * @param {number} invert
+	 * @return {Array<string>}
+	 */
+	function select (parent, current, invert) {
+		var selectors = current.trim().split(selectorptn)
+		var out = selectors
+
+		var length = selectors.length
+		var l = parent.length
+
+		switch (l) {
+			// 0-1 parent selectors
+			case 0:
+			case 1: {
+				for (var i = 0, selector = l === 0 ? '' : parent[0] + ' '; i < length; ++i) {
+					out[i] = scope(selector, out[i], invert, l).trim()
+				}
+				break
+			}
+			// >2 parent selectors, nested
+			default: {
+				for (var i = 0, j = 0, out = []; i < length; ++i) {
+					for (var k = 0; k < l; ++k) {
+						out[j++] = scope(parent[k] + ' ', selectors[i], invert, l).trim()
+					}
+				}
+			}
+		}
+
+		return out
+	}
+
+	/**
+	 * Scope
+	 *
+	 * @param {string} parent
+	 * @param {string} current
+	 * @param {number} invert
+	 * @param {number} level
+	 * @return {string}
+	 */
+	function scope (parent, current, invert, level) {
+		var selector = current
+		var code = selector.charCodeAt(0)
+
+		// trim leading whitespace
+		if (code < 33) {
+			code = (selector = selector.trim()).charCodeAt(0)
+		}
+
+		switch (code) {
+			// &
+			case AND: {
+				switch (cascade + level) {
+					case 0:
+					case 1: {
+						if (parent.trim().length === 0) {
+							break
+						}
+					}
+					default: {
+						return selector.replace(andptn, '$1'+parent.trim())
+					}
+				}
+				break
+			}
+			// :
+			case COLON: {
+				switch (selector.charCodeAt(1)) {
+					// g in :global
+					case 103: {
+						if (escape > 0 && cascade > 0) {
+							return selector.replace(escapeptn, '$1').replace(andptn, '$1'+nscope)
+						}
+						break
+					}
+					default: {
+						// :hover
+						return parent.trim() + selector.replace(andptn, '$1'+parent.trim())
+					}
+				}
+			}
+			default: {
+				// html &
+				if (invert*cascade > 0 && selector.indexOf('\f') > 0) {
+					return selector.replace(andptn, (parent.charCodeAt(0) === COLON ? '' : '$1')+parent.trim())
+				}
+			}
+		}
+
+		return parent + selector
+	}
+
+	/**
+	 * Property
+	 *
+	 * @param {string} input
+	 * @param {number} first
+	 * @param {number} second
+	 * @param {number} third
+	 * @return {string}
+	 */
+	function property (input, first, second, third) {
+		var index = 0
+		var out = input + ';'
+		var hash = (first*2) + (second*3) + (third*4)
+		var cache
+
+		// animation: a, n, i characters
+		if (hash === 944) {
+			return animation(out)
+		} else if (prefix === 0 || (prefix === 2 && !vendor(out, 1))) {
+			return out
+		}
+
+		// vendor prefix
+		switch (hash) {
+			// text-decoration/text-size-adjust/text-shadow/text-align/text-transform: t, e, x
+			case 1015: {
+				// text-shadow/text-align/text-transform, a
+				return out.charCodeAt(10) === 97 ? webkit + out + out : out
+			}
+			// filter/fill f, i, l
+			case 951: {
+				// filter, t
+				return out.charCodeAt(3) === 116 ? webkit + out + out : out
+			}
+			// color/column, c, o, l
+			case 963: {
+				// column, n
+				return out.charCodeAt(5) === 110 ? webkit + out + out : out
+			}
+			// box-decoration-break, b, o, x
+			case 1009: {
+				if (out.charCodeAt(4) !== 100) {
+					break
+				}
+			}
+			// mask, m, a, s
+			// clip-path, c, l, i
+			case 969:
+			case 942: {
+				return webkit + out + out
+			}
+			// appearance: a, p, p
+			case 978: {
+				return webkit + out + moz + out + out
+			}
+			// hyphens: h, y, p
+			// user-select: u, s, e
+			case 1019:
+			case 983: {
+				return webkit + out + moz + out + ms + out + out
+			}
+			// background/backface-visibility, b, a, c
+			case 883: {
+				// backface-visibility, -
+				if (out.charCodeAt(8) === DASH) {
+					return webkit + out + out
+				}
+
+				// image-set(...)
+				if (out.indexOf('image-set(', 11) > 0) {
+					return out.replace(imgsrcptn, '$1'+webkit+'$2') + out
+				}
+
+				return out
+			}
+			// flex: f, l, e
+			case 932: {
+				if (out.charCodeAt(4) === DASH) {
+					switch (out.charCodeAt(5)) {
+						// flex-grow, g
+						case 103: {
+							return webkit + 'box-' + out.replace('-grow', '') + webkit + out + ms + out.replace('grow', 'positive') + out
+						}
+						// flex-shrink, s
+						case 115: {
+							return webkit + out + ms + out.replace('shrink', 'negative') + out
+						}
+						// flex-basis, b
+						case 98: {
+							return webkit + out + ms + out.replace('basis', 'preferred-size') + out
+						}
+					}
+				}
+
+				return webkit + out + ms + out + out
+			}
+			// order: o, r, d
+			case 964: {
+				return webkit + out + ms + 'flex' + '-' + out + out
+			}
+			// justify-items/justify-content, j, u, s
+			case 1023: {
+				// justify-content, c
+				if (out.charCodeAt(8) !== 99) {
+					break
+				}
+
+				cache = out.substring(out.indexOf(':', 15)).replace('flex-', '').replace('space-between', 'justify')
+				return webkit + 'box-pack' + cache + webkit + out + ms + 'flex-pack' + cache + out
+			}
+			// cursor, c, u, r
+			case 1005: {
+				return cursorptn.test(out) ? out.replace(colonptn, ':' + webkit) + out.replace(colonptn, ':' + moz) + out : out
+			}
+			// writing-mode, w, r, i
+			case 1000: {
+				cache = out.substring(13).trim()
+				index = cache.indexOf('-') + 1
+
+				switch (cache.charCodeAt(0)+cache.charCodeAt(index)) {
+					// vertical-lr
+					case 226: {
+						cache = out.replace(writingptn, 'tb')
+						break
+					}
+					// vertical-rl
+					case 232: {
+						cache = out.replace(writingptn, 'tb-rl')
+						break
+					}
+					// horizontal-tb
+					case 220: {
+						cache = out.replace(writingptn, 'lr')
+						break
+					}
+					default: {
+						return out
+					}
+				}
+
+				return webkit + out + ms + cache + out
+			}
+			// position: sticky
+			case 1017: {
+				if (out.indexOf('sticky', 9) === -1) {
+					return out
+				}
+			}
+			// display(flex/inline-flex/inline-box): d, i, s
+			case 975: {
+				index = (out = input).length - 10
+				cache = (out.charCodeAt(index) === 33 ? out.substring(0, index) : out).substring(input.indexOf(':', 7) + 1).trim()
+
+				switch (hash = cache.charCodeAt(0) + (cache.charCodeAt(7)|0)) {
+					// inline-
+					case 203: {
+						// inline-box
+						if (cache.charCodeAt(8) < 111) {
+							break
+						}
+					}
+					// inline-box/sticky
+					case 115: {
+						out = out.replace(cache, webkit+cache)+';'+out
+						break
+					}
+					// inline-flex
+					// flex
+					case 207:
+					case 102: {
+						out = (
+							out.replace(cache, webkit+(hash > 102 ? 'inline-' : '')+'box')+';'+
+							out.replace(cache, webkit+cache)+';'+
+							out.replace(cache, ms+cache+'box')+';'+
+							out
+						)
+					}
+				}
+
+				return out + ';'
+			}
+			// align-items, align-center, align-self: a, l, i, -
+			case 938: {
+				if (out.charCodeAt(5) === DASH) {
+					switch (out.charCodeAt(6)) {
+						// align-items, i
+						case 105: {
+							cache = out.replace('-items', '')
+							return webkit + out + webkit + 'box-' + cache + ms + 'flex-' + cache + out
+						}
+						// align-self, s
+						case 115: {
+							return webkit + out + ms + 'flex-item-' + out.replace(selfptn, '') + out
+						}
+						// align-content
+						default: {
+							return webkit + out + ms + 'flex-line-pack' + out.replace('align-content', '').replace(selfptn, '') + out
+						}
+					}
+				}
+				break
+			}
+			// min/max
+			case 973:
+			case 989: {
+				// min-/max- height/width/block-size/inline-size
+				if (out.charCodeAt(3) !== DASH || out.charCodeAt(4) === 122) {
+					break
+				}
+			}
+			// height/width: min-content / width: max-content
+			case 931:
+			case 953: {
+				if (dimensionptn.test(input) === true) {
+					// stretch
+					if ((cache = input.substring(input.indexOf(':') + 1)).charCodeAt(0) === 115)
+						return property(input.replace('stretch', 'fill-available'), first, second, third).replace(':fill-available', ':stretch')
+					else
+						return out.replace(cache, webkit + cache) + out.replace(cache, moz + cache.replace('fill-', '')) + out
+				}
+				break
+			}
+			// transform, transition: t, r, a
+			case 962: {
+				out = webkit + out + (out.charCodeAt(5) === 102 ? ms + out : '') + out
+
+				// transitions
+				if (second + third === 211 && out.charCodeAt(13) === 105 && out.indexOf('transform', 10) > 0) {
+					return out.substring(0, out.indexOf(';', 27) + 1).replace(transformptn, '$1' + webkit + '$2') + out
+				}
+
+				break
+			}
+		}
+
+		return out
+	}
+
+	/**
+	 * Vendor
+	 *
+	 * @param {string} content
+	 * @param {number} context
+	 * @return {boolean}
+	 */
+	function vendor (content, context) {
+		var index = content.indexOf(context === 1 ? ':' : '{')
+		var key = content.substring(0, context !== 3 ? index : 10)
+		var value = content.substring(index + 1, content.length - 1)
+
+		return should(context !== 2 ? key : key.replace(pseudofmt, '$1'), value, context)
+	}
+
+	/**
+	 * Supports
+	 *
+	 * @param {string} match
+	 * @param {string} group
+	 * @return {string}
+	 */
+	function supports (match, group) {
+		var out = property(group, group.charCodeAt(0), group.charCodeAt(1), group.charCodeAt(2))
+
+		return out !== group+';' ? out.replace(propertyptn, ' or ($1)').substring(4) : '('+group+')'
+	}
+
+	/**
+	 * Animation
+	 *
+	 * @param {string} input
+	 * @return {string}
+	 */
+	function animation (input) {
+		var length = input.length
+		var index = input.indexOf(':', 9) + 1
+		var declare = input.substring(0, index).trim()
+		var out = input.substring(index, length-1).trim()
+
+		switch (input.charCodeAt(9)*keyed) {
+			case 0: {
+				break
+			}
+			// animation-*, -
+			case DASH: {
+				// animation-name, n
+				if (input.charCodeAt(10) !== 110) {
+					break
+				}
+			}
+			// animation/animation-name
+			default: {
+				// split in case of multiple animations
+				var list = out.split((out = '', animationptn))
+
+				for (var i = 0, index = 0, length = list.length; i < length; index = 0, ++i) {
+					var value = list[i]
+					var items = value.split(propertiesptn)
+
+					while (value = items[index]) {
+						var peak = value.charCodeAt(0)
+
+						if (keyed === 1 && (
+							// letters
+							(peak > AT && peak < 90) || (peak > 96 && peak < 123) || peak === UNDERSCORE ||
+							// dash but not in sequence i.e --
+							(peak === DASH && value.charCodeAt(1) !== DASH)
+						)) {
+							// not a number/function
+							switch (isNaN(parseFloat(value)) + (value.indexOf('(') !== -1)) {
+								case 1: {
+									switch (value) {
+										// not a valid reserved keyword
+										case 'infinite': case 'alternate': case 'backwards': case 'running':
+										case 'normal': case 'forwards': case 'both': case 'none': case 'linear':
+										case 'ease': case 'ease-in': case 'ease-out': case 'ease-in-out':
+										case 'paused': case 'reverse': case 'alternate-reverse': case 'inherit':
+										case 'initial': case 'unset': case 'step-start': case 'step-end': {
+											break
+										}
+										default: {
+											value += key
+										}
+									}
+								}
+							}
+						}
+
+						items[index++] = value
+					}
+
+					out += (i === 0 ? '' : ',') + items.join(' ')
+				}
+			}
+		}
+
+		out = declare + out + ';'
+
+		if (prefix === 1 || (prefix === 2 && vendor(out, 1)))
+			return webkit + out + out
+
+		return out
+	}
+
+	/**
+	 * Isolate
+	 *
+	 * @param {Array<string>} current
+	 */
+	function isolate (current) {
+		for (var i = 0, length = current.length, selector = Array(length), padding, element; i < length; ++i) {
+			// split individual elements in a selector i.e h1 h2 === [h1, h2]
+			var elements = current[i].split(elementptn)
+			var out = ''
+
+			for (var j = 0, size = 0, tail = 0, code = 0, l = elements.length; j < l; ++j) {
+				// empty element
+				if ((size = (element = elements[j]).length) === 0 && l > 1) {
+					continue
+				}
+
+				tail = out.charCodeAt(out.length-1)
+				code = element.charCodeAt(0)
+				padding = ''
+
+				if (j !== 0) {
+					// determine if we need padding
+					switch (tail) {
+						case STAR:
+						case TILDE:
+						case GREATERTHAN:
+						case PLUS:
+						case SPACE:
+						case OPENPARENTHESES:  {
+							break
+						}
+						default: {
+							padding = ' '
+						}
+					}
+				}
+
+				switch (code) {
+					case AND: {
+						element = padding + nscopealt
+					}
+					case TILDE:
+					case GREATERTHAN:
+					case PLUS:
+					case SPACE:
+					case CLOSEPARENTHESES:
+					case OPENPARENTHESES: {
+						break
+					}
+					case OPENBRACKET: {
+						element = padding + element + nscopealt
+						break
+					}
+					case COLON: {
+						switch (element.charCodeAt(1)*2 + element.charCodeAt(2)*3) {
+							// :global
+							case 530: {
+								if (escape > 0) {
+									element = padding + element.substring(8, size - 1)
+									break
+								}
+							}
+							// :hover, :nth-child(), ...
+							default: {
+								if (j < 1 || elements[j-1].length < 1) {
+									element = padding + nscopealt + element
+								}
+							}
+						}
+						break
+					}
+					case COMMA: {
+						padding = ''
+					}
+					default: {
+						if (size > 1 && element.indexOf(':') > 0) {
+							element = padding + element.replace(pseudoptn, '$1' + nscopealt + '$2')
+						} else {
+							element = padding + element + nscopealt
+						}
+					}
+				}
+
+				out += element
+			}
+
+			selector[i] = out.replace(formatptn, '').trim()
+		}
+
+		return selector
+	}
+
+	/**
+	 * Proxy
+	 *
+	 * @param {number} context
+	 * @param {string} content
+	 * @param {Array<string>} selectors
+	 * @param {Array<string>} parents
+	 * @param {number} line
+	 * @param {number} column
+	 * @param {number} length
+	 * @param {number} id
+	 * @param {number} depth
+	 * @param {number} at
+	 * @return {(string|void|*)}
+	 */
+	function proxy (context, content, selectors, parents, line, column, length, id, depth, at) {
+		for (var i = 0, out = content, next; i < plugged; ++i) {
+			switch (next = plugins[i].call(stylis, context, out, selectors, parents, line, column, length, id, depth, at)) {
+				case void 0:
+				case false:
+				case true:
+				case null: {
+					break
+				}
+				default: {
+					out = next
+				}
+			}
+		}
+		if (out !== content) {
+		  return out
+		}
+	}
+
+	/**
+	 * @param {number} code
+	 * @param {number} index
+	 * @param {number} length
+	 * @param {string} body
+	 * @return {number}
+	 */
+	function delimited (code, index, length, body) {
+		for (var i = index + 1; i < length; ++i) {
+			switch (body.charCodeAt(i)) {
+				// /*
+				case FOWARDSLASH: {
+					if (code === STAR) {
+						if (body.charCodeAt(i - 1) === STAR &&  index + 2 !== i) {
+							return i + 1
+						}
+					}
+					break
+				}
+				// //
+				case NEWLINE: {
+					if (code === FOWARDSLASH) {
+						return i + 1
+					}
+				}
+			}
+		}
+
+		return i
+	}
+
+	/**
+	 * @param {number} type
+	 * @param {number} index
+	 * @param {number} length
+	 * @param {number} find
+	 * @param {string} body
+	 * @return {number}
+	 */
+	function match (type, index, length, body) {
+		for (var i = index + 1; i < length; ++i) {
+			switch (body.charCodeAt(i)) {
+				case type: {
+					return i
+				}
+			}
+		}
+
+		return i
+	}
+
+	/**
+	 * Minify
+	 *
+	 * @param {(string|*)} output
+	 * @return {string}
+	 */
+	function minify (output) {
+		return output
+			.replace(formatptn, '')
+			.replace(beforeptn, '')
+			.replace(afterptn, '$1')
+			.replace(tailptn, '$1')
+			.replace(whiteptn, ' ')
+	}
+
+	/**
+	 * Use
+	 *
+	 * @param {(Array<function(...?)>|function(...?)|number|void)?} plugin
+	 */
+	function use (plugin) {
+		switch (plugin) {
+			case void 0:
+			case null: {
+				plugged = plugins.length = 0
+				break
+			}
+			default: {
+				if (typeof plugin === 'function') {
+					plugins[plugged++] = plugin
+				}	else if (typeof plugin === 'object') {
+					for (var i = 0, length = plugin.length; i < length; ++i) {
+						use(plugin[i])
+					}
+				} else {
+					unkwn = !!plugin|0
+				}
+			}
+ 		}
+
+ 		return use
+	}
+
+	/**
+	 * Set
+	 *
+	 * @param {*} options
+	 */
+	function set (options) {
+		for (var name in options) {
+			var value = options[name]
+			switch (name) {
+				case 'keyframe': keyed = value|0; break
+				case 'global': escape = value|0; break
+				case 'cascade': cascade = value|0; break
+				case 'compress': compress = value|0; break
+				case 'semicolon': semicolon = value|0; break
+				case 'preserve': preserve = value|0; break
+				case 'prefix':
+					should = null
+
+					if (!value) {
+						prefix = 0
+					} else if (typeof value !== 'function') {
+						prefix = 1
+					} else {
+						prefix = 2
+						should = value
+					}
+			}
+		}
+
+		return set
+	}
+
+	/**
+	 * Stylis
+	 *
+	 * @param {string} selector
+	 * @param {string} input
+	 * @return {*}
+	 */
+	function stylis (selector, input) {
+		if (this !== void 0 && this.constructor === stylis) {
+			return factory(selector)
+		}
+
+		// setup
+		var ns = selector
+		var code = ns.charCodeAt(0)
+
+		// trim leading whitespace
+		if (code < 33) {
+			code = (ns = ns.trim()).charCodeAt(0)
+		}
+
+		// keyframe/animation namespace
+		if (keyed > 0) {
+			key = ns.replace(invalidptn, code === OPENBRACKET ? '' : '-')
+		}
+
+		// reset, used to assert if a plugin is moneky-patching the return value
+		code = 1
+
+		// cascade/isolate
+		if (cascade === 1) {
+			nscope = ns
+		} else {
+			nscopealt = ns
+		}
+
+		var selectors = [nscope]
+		var result
+
+		// execute plugins, pre-process context
+		if (plugged > 0) {
+			result = proxy(PREPS, input, selectors, selectors, line, column, 0, 0, 0, 0)
+
+			if (result !== void 0 && typeof result === 'string') {
+				input = result
+			}
+		}
+
+		// build
+		var output = compile(array, selectors, input, 0, 0)
+
+		// execute plugins, post-process context
+		if (plugged > 0) {
+			result = proxy(POSTS, output, selectors, selectors, line, column, output.length, 0, 0, 0)
+
+			// bypass minification
+			if (result !== void 0 && typeof(output = result) !== 'string') {
+				code = 0
+			}
+		}
+
+		// reset
+		key = ''
+		nscope = ''
+		nscopealt = ''
+		pattern = 0
+		line = 1
+		column = 1
+
+		return compress*code === 0 ? output : minify(output)
+	}
+
+	stylis['use'] = use
+	stylis['set'] = set
+
+	if (options !== void 0) {
+		set(options)
+	}
+
+	return stylis
+}));
+
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/global.js":
+/*!***********************************!*\
+  !*** (webpack)/buildin/global.js ***!
+  \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var g;
+
+// This works in non-strict mode
+g = (function() {
+	return this;
+})();
+
+try {
+	// This works if eval is allowed (see CSP)
+	g = g || new Function("return this")();
+} catch (e) {
+	// This works if the window reference is available
+	if (typeof window === "object") g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+
+
+/***/ }),
+
+/***/ "./node_modules/webpack/buildin/module.js":
+/*!***********************************!*\
+  !*** (webpack)/buildin/module.js ***!
+  \***********************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = function(module) {
+	if (!module.webpackPolyfill) {
+		module.deprecate = function() {};
+		module.paths = [];
+		// module.parent = undefined by default
+		if (!module.children) module.children = [];
+		Object.defineProperty(module, "loaded", {
+			enumerable: true,
+			get: function() {
+				return module.l;
+			}
+		});
+		Object.defineProperty(module, "id", {
+			enumerable: true,
+			get: function() {
+				return module.i;
+			}
+		});
+		module.webpackPolyfill = 1;
+	}
+	return module;
+};
+
+
+/***/ }),
+
+/***/ "./package.json":
+/*!**********************!*\
+  !*** ./package.json ***!
+  \**********************/
+/*! exports provided: name, version, description, main, keywords, scripts, repository, author, license, standard, dependencies, devDependencies, files, yarn-upgrade-all, sideEffects, husky, default */
+/***/ (function(module) {
+
+module.exports = JSON.parse("{\"name\":\"mermaid\",\"version\":\"8.7.0\",\"description\":\"Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.\",\"main\":\"dist/mermaid.core.js\",\"keywords\":[\"diagram\",\"markdown\",\"flowchart\",\"sequence diagram\",\"gantt\",\"class diagram\",\"git graph\"],\"scripts\":{\"build:development\":\"webpack --progress --colors\",\"build:production\":\"yarn build:development -p --config webpack.config.prod.babel.js\",\"build\":\"yarn build:development && yarn build:production\",\"postbuild\":\"documentation build src/mermaidAPI.js src/config.js --shallow -f md --markdown-toc false -o docs/Setup.md\",\"build:watch\":\"yarn build --watch\",\"minify\":\"minify ./dist/mermaid.js > ./dist/mermaid.min.js\",\"release\":\"yarn build\",\"lint\":\"eslint src\",\"e2e:depr\":\"yarn lint && jest e2e --config e2e/jest.config.js\",\"cypress\":\"percy exec -- cypress run\",\"e2e\":\"start-server-and-test dev http://localhost:9000/ cypress\",\"e2e-upd\":\"yarn lint && jest e2e -u --config e2e/jest.config.js\",\"dev\":\"webpack-dev-server --config webpack.config.e2e.js\",\"test\":\"yarn lint && jest src/.*\",\"test:watch\":\"jest --watch src\",\"prepublishOnly\":\"yarn build && yarn test && yarn e2e\",\"prepare\":\"yarn build\"},\"repository\":{\"type\":\"git\",\"url\":\"https://github.com/knsv/mermaid\"},\"author\":\"Knut Sveidqvist\",\"license\":\"MIT\",\"standard\":{\"ignore\":[\"**/parser/*.js\",\"dist/**/*.js\",\"cypress/**/*.js\"],\"globals\":[\"page\"]},\"dependencies\":{\"@braintree/sanitize-url\":\"^3.1.0\",\"babel-eslint\":\"^10.1.0\",\"d3\":\"^5.7.0\",\"dagre\":\"^0.8.4\",\"dagre-d3\":\"^0.6.4\",\"entity-decode\":\"^2.0.2\",\"graphlib\":\"^2.1.7\",\"he\":\"^1.2.0\",\"khroma\":\"^1.1.0\",\"minify\":\"^4.1.1\",\"moment-mini\":\"^2.22.1\",\"stylis\":\"^3.5.2\"},\"devDependencies\":{\"@babel/core\":\"^7.2.2\",\"@babel/preset-env\":\"^7.8.4\",\"@babel/register\":\"^7.0.0\",\"@percy/cypress\":\"*\",\"babel-core\":\"7.0.0-bridge.0\",\"babel-jest\":\"^24.9.0\",\"babel-loader\":\"^8.0.4\",\"coveralls\":\"^3.0.2\",\"css-loader\":\"^2.0.1\",\"css-to-string-loader\":\"^0.1.3\",\"cypress\":\"4.0.1\",\"documentation\":\"^12.0.1\",\"eslint\":\"^6.3.0\",\"eslint-config-prettier\":\"^6.3.0\",\"eslint-plugin-prettier\":\"^3.1.0\",\"husky\":\"^1.2.1\",\"identity-obj-proxy\":\"^3.0.0\",\"jest\":\"^24.9.0\",\"jison\":\"^0.4.18\",\"moment\":\"^2.23.0\",\"node-sass\":\"^4.12.0\",\"prettier\":\"^1.18.2\",\"puppeteer\":\"^1.17.0\",\"sass-loader\":\"^7.1.0\",\"start-server-and-test\":\"^1.10.6\",\"terser-webpack-plugin\":\"^2.2.2\",\"webpack\":\"^4.41.2\",\"webpack-bundle-analyzer\":\"^3.7.0\",\"webpack-cli\":\"^3.1.2\",\"webpack-dev-server\":\"^3.4.1\",\"webpack-node-externals\":\"^1.7.2\",\"yarn-upgrade-all\":\"^0.5.0\"},\"files\":[\"dist\"],\"yarn-upgrade-all\":{\"ignore\":[\"babel-core\"]},\"sideEffects\":[\"**/*.css\",\"**/*.scss\"],\"husky\":{\"hooks\":{\"pre-push\":\"yarn test\"}}}");
+
+/***/ }),
+
+/***/ "./src/config.js":
+/*!***********************!*\
+  !*** ./src/config.js ***!
+  \***********************/
+/*! exports provided: defaultConfig, updateCurrentConfig, setSiteConfig, setSiteConfigDelta, updateSiteConfig, getSiteConfig, setConfig, getConfig, sanitize, addDirective, reset */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultConfig", function() { return defaultConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateCurrentConfig", function() { return updateCurrentConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSiteConfig", function() { return setSiteConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSiteConfigDelta", function() { return setSiteConfigDelta; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateSiteConfig", function() { return updateSiteConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSiteConfig", function() { return getSiteConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConfig", function() { return setConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getConfig", function() { return getConfig; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sanitize", function() { return sanitize; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addDirective", function() { return addDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reset", function() { return reset; });
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/utils.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logger */ "./src/logger.js");
+/* harmony import */ var _themes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themes */ "./src/themes/index.js");
+/* harmony import */ var _defaultConfig__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./defaultConfig */ "./src/defaultConfig.js");
+
+
+
+ // debugger;
+
+var defaultConfig = Object.freeze(_defaultConfig__WEBPACK_IMPORTED_MODULE_3__["default"]);
+var siteConfig = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])({}, defaultConfig);
+var siteConfigDelta;
+var directives = [];
+var currentConfig = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])({}, defaultConfig);
+var updateCurrentConfig = function updateCurrentConfig(siteCfg, _directives) {
+  // start with config beeing the siteConfig
+  var cfg = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])({}, siteCfg); // let sCfg = assignWithDepth(defaultConfig, siteConfigDelta);
+  // Join directives
+
+  var sumOfDirectives = {};
+
+  for (var i = 0; i < _directives.length; i++) {
+    var d = _directives[i];
+    sanitize(d); // Apply the data from the directive where the the overrides the themeVaraibles
+
+    sumOfDirectives = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])(sumOfDirectives, d);
+  }
+
+  cfg = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])(cfg, sumOfDirectives);
+
+  if (sumOfDirectives.theme) {
+    var themeVariables = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])(siteConfigDelta.themeVariables || {}, sumOfDirectives.themeVariables);
+    cfg.themeVariables = _themes__WEBPACK_IMPORTED_MODULE_2__["default"][cfg.theme].getThemeVariables(themeVariables);
+  } // if (cfg.theme && theme[cfg.theme]) {
+  //   let tVars = assignWithDepth({}, cfg.themeVariables);
+  //   tVars = assignWithDepth(tVars, themeVariables);
+  //   const variables = theme[cfg.theme].getThemeVariables(tVars);
+  //   cfg.themeVariables = variables;
+  // }
+
+
+  currentConfig = cfg;
+  return cfg;
+};
+/**
+ *## setSiteConfig
+ *| Function | Description         | Type    | Values             |
+ *| --------- | ------------------- | ------- | ------------------ |
+ *| setSiteConfig|Sets the siteConfig to desired values | Put Request | Any Values, except ones in secure array|
+ ***Notes:**
+ *Sets the siteConfig. The siteConfig is a protected configuration for repeat use. Calls to reset() will reset
+ *the currentConfig to siteConfig. Calls to reset(configApi.defaultConfig) will reset siteConfig and currentConfig
+ *to the defaultConfig
+ *Note: currentConfig is set in this function
+ **Default value: At default, will mirror Global Config**
+ * @param conf - the base currentConfig to use as siteConfig
+ * @returns {*} - the siteConfig
+ */
+
+var setSiteConfig = function setSiteConfig(conf) {
+  siteConfig = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])({}, defaultConfig);
+  siteConfig = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])(siteConfig, conf);
+
+  if (conf.theme) {
+    siteConfig.themeVariables = _themes__WEBPACK_IMPORTED_MODULE_2__["default"][conf.theme].getThemeVariables(conf.themeVariables);
+  }
+
+  currentConfig = updateCurrentConfig(siteConfig, directives);
+  return siteConfig;
+};
+var setSiteConfigDelta = function setSiteConfigDelta(conf) {
+  siteConfigDelta = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])({}, conf);
+};
+var updateSiteConfig = function updateSiteConfig(conf) {
+  siteConfig = Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])(siteConfig, conf);
+  updateCurrentConfig(siteConfig, directives);
+  return siteConfig;
+};
+/**
+ *## getSiteConfig
+ *| Function | Description         | Type    |  Values             |
+ *| --------- | ------------------- | ------- |  ------------------ |
+ *| setSiteConfig|Returns the current siteConfig base configuration | Get Request | Returns Any Values  in siteConfig|
+ ***Notes**:
+ *Returns **any** values in siteConfig.
+ * @returns {*}
+ */
+
+var getSiteConfig = function getSiteConfig() {
+  return Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])({}, siteConfig);
+};
+/**
+ *## setConfig
+ *| Function  | Description         | Type    | Values             |
+ *| --------- | ------------------- | ------- | ------------------ |
+ *| setSiteConfig|Sets the siteConfig to desired values | Put Request| Any Values, except ones in secure array|
+ ***Notes**:
+ *Sets the currentConfig. The parameter conf is sanitized based on the siteConfig.secure keys. Any
+ *values found in conf with key found in siteConfig.secure will be replaced with the corresponding
+ *siteConfig value.
+ * @param conf - the potential currentConfig
+ * @returns {*} - the currentConfig merged with the sanitized conf
+ */
+
+var setConfig = function setConfig(conf) {
+  // sanitize(conf);
+  // Object.keys(conf).forEach(key => {
+  //   const manipulator = manipulators[key];
+  //   conf[key] = manipulator ? manipulator(conf[key]) : conf[key];
+  // });
+  Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])(currentConfig, conf);
+  return getConfig();
+};
+/**
+ *   ## getConfig
+ *| Function  | Description         | Type    | Return Values            |
+ *| --------- | ------------------- | ------- | ------------------ |
+ *| getConfig |Obtains the currentConfig | Get Request | Any Values from currentConfig|
+ ***Notes**:
+ *Returns **any** the currentConfig
+ * @returns {*} - the currentConfig
+ */
+
+var getConfig = function getConfig() {
+  return Object(_utils__WEBPACK_IMPORTED_MODULE_0__["assignWithDepth"])({}, currentConfig);
+};
+/**
+ *## sanitize
+ *| Function | Description         | Type    | Values             |
+ *| --------- | ------------------- | ------- | ------------------ |
+ *| sanitize  |Sets the siteConfig to desired values. | Put Request |None|
+ *Ensures options parameter does not attempt to override siteConfig secure keys
+ *Note: modifies options in-place
+ * @param options - the potential setConfig parameter
+ */
+
+var sanitize = function sanitize(options) {
+  Object.keys(siteConfig.secure).forEach(function (key) {
+    if (typeof options[siteConfig.secure[key]] !== 'undefined') {
+      // DO NOT attempt to print options[siteConfig.secure[key]] within `${}` as a malicious script
+      // can exploit the logger's attempt to stringify the value and execute arbitrary code
+      _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].debug("Denied attempt to modify a secure key ".concat(siteConfig.secure[key]), options[siteConfig.secure[key]]);
+      delete options[siteConfig.secure[key]];
+    }
+  });
+};
+var addDirective = function addDirective(directive) {
+  if (directive.fontFamily) {
+    if (!directive.themeVariables) {
+      directive.themeVariables = {
+        fontFamily: directive.fontFamily
+      };
+    } else {
+      if (!directive.themeVariables.fontFamily) {
+        directive.themeVariables = {
+          fontFamily: directive.fontFamily
+        };
+      }
+    }
+  }
+
+  directives.push(directive);
+  updateCurrentConfig(siteConfig, directives);
+};
+/**
+ *## reset
+ *| Function | Description         | Type    | Required | Values             |
+ *| --------- | ------------------- | ------- | -------- | ------------------ |
+ *| reset|Resets currentConfig to conf| Put Request | Required | None|
+ *
+ *| Parameter | Description |Type | Required | Values|
+ *| --- | --- | --- | --- | --- |
+ *| conf| base set of values, which currentConfig coul be **reset** to.| Dictionary | Required | Any Values, with respect to the secure Array|
+ *
+ **Notes :
+ (default: current siteConfig ) (optional, default `getSiteConfig()`)
+ * @param conf  the base currentConfig to reset to (default: current siteConfig ) (optional, default `getSiteConfig()`)
+ */
+
+var reset = function reset() {
+  // Replace current config with siteConfig
+  directives = [];
+  updateCurrentConfig(siteConfig, directives);
+};
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/clusters.js":
+/*!***************************************!*\
+  !*** ./src/dagre-wrapper/clusters.js ***!
+  \***************************************/
+/*! exports provided: insertCluster, getClusterTitleWidth, clear, positionCluster */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertCluster", function() { return insertCluster; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClusterTitleWidth", function() { return getClusterTitleWidth; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "positionCluster", function() { return positionCluster; });
+/* harmony import */ var _intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./intersect/intersect-rect */ "./src/dagre-wrapper/intersect/intersect-rect.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
+/* harmony import */ var _createLabel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./createLabel */ "./src/dagre-wrapper/createLabel.js");
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../config */ "./src/config.js");
+
+ // eslint-disable-line
+
+
+
+
+
+var rect = function rect(parent, node) {
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].trace('Creating subgraph rect for ', node.id, node); // Add outer g element
+
+  var shapeSvg = parent.insert('g').attr('class', 'cluster').attr('id', node.id); // add the rect
+
+  var rect = shapeSvg.insert('rect', ':first-child'); // Create the label and insert it after the rect
+
+  var label = shapeSvg.insert('g').attr('class', 'cluster-label');
+  var text = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_2__["default"])(node.labelText, node.labelStyle, undefined, true)); // Get the size of the label
+
+  var bbox = text.getBBox();
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
+    var div = text.children[0];
+    var dv = Object(d3__WEBPACK_IMPORTED_MODULE_3__["select"])(text);
+    bbox = div.getBoundingClientRect();
+    dv.attr('width', bbox.width);
+    dv.attr('height', bbox.height);
+  }
+
+  var padding = 0 * node.padding;
+  var halfPadding = padding / 2;
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].trace('Data ', node, JSON.stringify(node)); // center the rect around its coordinate
+
+  rect.attr('rx', node.rx).attr('ry', node.ry).attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2 - halfPadding).attr('width', node.width + padding).attr('height', node.height + padding); // Center the label
+
+  label.attr('transform', 'translate(' + (node.x - bbox.width / 2) + ', ' + (node.y - node.height / 2 - node.padding / 3 + 3) + ')');
+  var rectBox = rect.node().getBBox();
+  node.width = rectBox.width;
+  node.height = rectBox.height;
+
+  node.intersect = function (point) {
+    return Object(_intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point);
+  };
+
+  return shapeSvg;
+};
+/**
+ * Non visiable cluster where the note is group with its
+ */
+
+
+var noteGroup = function noteGroup(parent, node) {
+  // Add outer g element
+  var shapeSvg = parent.insert('g').attr('class', 'note-cluster').attr('id', node.id); // add the rect
+
+  var rect = shapeSvg.insert('rect', ':first-child');
+  var padding = 0 * node.padding;
+  var halfPadding = padding / 2; // center the rect around its coordinate
+
+  rect.attr('rx', node.rx).attr('ry', node.ry).attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2 - halfPadding).attr('width', node.width + padding).attr('height', node.height + padding).attr('fill', 'none');
+  var rectBox = rect.node().getBBox();
+  node.width = rectBox.width;
+  node.height = rectBox.height;
+
+  node.intersect = function (point) {
+    return Object(_intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var roundedWithTitle = function roundedWithTitle(parent, node) {
+  // Add outer g element
+  var shapeSvg = parent.insert('g').attr('class', node.classes).attr('id', node.id); // add the rect
+
+  var rect = shapeSvg.insert('rect', ':first-child'); // Create the label and insert it after the rect
+
+  var label = shapeSvg.insert('g').attr('class', 'cluster-label');
+  var innerRect = shapeSvg.append('rect');
+  var text = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_2__["default"])(node.labelText, node.labelStyle, undefined, true)); // Get the size of the label
+
+  var bbox = text.getBBox();
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
+    var div = text.children[0];
+    var dv = Object(d3__WEBPACK_IMPORTED_MODULE_3__["select"])(text);
+    bbox = div.getBoundingClientRect();
+    dv.attr('width', bbox.width);
+    dv.attr('height', bbox.height);
+  }
+
+  bbox = text.getBBox();
+  var padding = 0 * node.padding;
+  var halfPadding = padding / 2; // center the rect around its coordinate
+
+  rect.attr('class', 'outer').attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2 - halfPadding).attr('width', node.width + padding).attr('height', node.height + padding);
+  innerRect.attr('class', 'inner').attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2 - halfPadding + bbox.height - 1).attr('width', node.width + padding).attr('height', node.height + padding - bbox.height - 3); // Center the label
+
+  label.attr('transform', 'translate(' + (node.x - bbox.width / 2) + ', ' + (node.y - node.height / 2 - node.padding / 3 + (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels ? 5 : 3)) + ')');
+  var rectBox = rect.node().getBBox();
+  node.width = rectBox.width;
+  node.height = rectBox.height;
+
+  node.intersect = function (point) {
+    return Object(_intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var divider = function divider(parent, node) {
+  // Add outer g element
+  var shapeSvg = parent.insert('g').attr('class', node.classes).attr('id', node.id); // add the rect
+
+  var rect = shapeSvg.insert('rect', ':first-child');
+  var padding = 0 * node.padding;
+  var halfPadding = padding / 2; // center the rect around its coordinate
+
+  rect.attr('class', 'divider').attr('x', node.x - node.width / 2 - halfPadding).attr('y', node.y - node.height / 2).attr('width', node.width + padding).attr('height', node.height + padding);
+  var rectBox = rect.node().getBBox();
+  node.width = rectBox.width;
+  node.height = rectBox.height;
+
+  node.intersect = function (point) {
+    return Object(_intersect_intersect_rect__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var shapes = {
+  rect: rect,
+  roundedWithTitle: roundedWithTitle,
+  noteGroup: noteGroup,
+  divider: divider
+};
+var clusterElems = {};
+var insertCluster = function insertCluster(elem, node) {
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].trace('Inserting cluster');
+  var shape = node.shape || 'rect';
+  clusterElems[node.id] = shapes[shape](elem, node);
+};
+var getClusterTitleWidth = function getClusterTitleWidth(elem, node) {
+  var label = Object(_createLabel__WEBPACK_IMPORTED_MODULE_2__["default"])(node.labelText, node.labelStyle, undefined, true);
+  elem.node().appendChild(label);
+  var width = label.getBBox().width;
+  elem.node().removeChild(label);
+  return width;
+};
+var clear = function clear() {
+  clusterElems = {};
+};
+var positionCluster = function positionCluster(node) {
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('Position cluster');
+  var el = clusterElems[node.id];
+  el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');
+};
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/createLabel.js":
+/*!******************************************!*\
+  !*** ./src/dagre-wrapper/createLabel.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config */ "./src/config.js");
+
+ // eslint-disable-line
+// let vertexNode;
+// if (getConfig().flowchart.htmlLabels) {
+//   // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?
+//   const node = {
+//     label: vertexText.replace(/fa[lrsb]?:fa-[\w-]+/g, s => `<i class='${s.replace(':', ' ')}'></i>`)
+//   };
+//   vertexNode = addHtmlLabel(svg, node).node();
+//   vertexNode.parentNode.removeChild(vertexNode);
+// } else {
+//   const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
+//   svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));
+//   const rows = vertexText.split(common.lineBreakRegex);
+//   for (let j = 0; j < rows.length; j++) {
+//     const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
+//     tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
+//     tspan.setAttribute('dy', '1em');
+//     tspan.setAttribute('x', '1');
+//     tspan.textContent = rows[j];
+//     svgLabel.appendChild(tspan);
+//   }
+//   vertexNode = svgLabel;
+// }
+
+
+
+function applyStyle(dom, styleFn) {
+  if (styleFn) {
+    dom.attr('style', styleFn);
+  }
+}
+
+function addHtmlLabel(node) {
+  // var fo = root.append('foreignObject').attr('width', '100000');
+  // var div = fo.append('xhtml:div');
+  // div.attr('xmlns', 'http://www.w3.org/1999/xhtml');
+  // var label = node.label;
+  // switch (typeof label) {
+  //   case 'function':
+  //     div.insert(label);
+  //     break;
+  //   case 'object':
+  //     // Currently we assume this is a DOM object.
+  //     div.insert(function() {
+  //       return label;
+  //     });
+  //     break;
+  //   default:
+  //     div.html(label);
+  // }
+  // applyStyle(div, node.labelStyle);
+  // div.style('display', 'inline-block');
+  // // Fix for firefox
+  // div.style('white-space', 'nowrap');
+  // var client = div.node().getBoundingClientRect();
+  // fo.attr('width', client.width).attr('height', client.height);
+  var fo = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject'));
+  var div = fo.append('xhtml:div');
+  var label = node.label;
+  var labelClass = node.isNode ? 'nodeLabel' : 'edgeLabel';
+  div.html('<span class="' + labelClass + '">' + label + '</span>');
+  applyStyle(div, node.labelStyle);
+  div.style('display', 'inline-block'); // Fix for firefox
+
+  div.style('white-space', 'nowrap');
+  div.attr('xmlns', 'http://www.w3.org/1999/xhtml');
+  return fo.node();
+}
+
+var createLabel = function createLabel(_vertexText, style, isTitle, isNode) {
+  var vertexText = _vertexText || '';
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_2__["getConfig"])().flowchart.htmlLabels) {
+    // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?
+    vertexText = vertexText.replace(/\\n|\n/g, '<br />');
+    _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('vertexText' + vertexText);
+    var node = {
+      isNode: isNode,
+      label: vertexText.replace(/fa[lrsb]?:fa-[\w-]+/g, function (s) {
+        return "<i class='".concat(s.replace(':', ' '), "'></i>");
+      })
+    };
+    var vertexNode = addHtmlLabel(node); // vertexNode.parentNode.removeChild(vertexNode);
+
+    return vertexNode;
+  } else {
+    var svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
+    svgLabel.setAttribute('style', style.replace('color:', 'fill:'));
+    var rows = [];
+
+    if (typeof vertexText === 'string') {
+      rows = vertexText.split(/\\n|\n|<br\s*\/?>/gi);
+    } else if (Array.isArray(vertexText)) {
+      rows = vertexText;
+    } else {
+      rows = [];
+    }
+
+    for (var j = 0; j < rows.length; j++) {
+      var tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
+      tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
+      tspan.setAttribute('dy', '1em');
+      tspan.setAttribute('x', '0');
+
+      if (isTitle) {
+        tspan.setAttribute('class', 'title-row');
+      } else {
+        tspan.setAttribute('class', 'row');
+      }
+
+      tspan.textContent = rows[j].trim();
+      svgLabel.appendChild(tspan);
+    }
+
+    return svgLabel;
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (createLabel);
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/edges.js":
+/*!************************************!*\
+  !*** ./src/dagre-wrapper/edges.js ***!
+  \************************************/
+/*! exports provided: clear, insertEdgeLabel, positionEdgeLabel, intersection, insertEdge */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertEdgeLabel", function() { return insertEdgeLabel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "positionEdgeLabel", function() { return positionEdgeLabel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "intersection", function() { return intersection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertEdge", function() { return insertEdge; });
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
+/* harmony import */ var _createLabel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./createLabel */ "./src/dagre-wrapper/createLabel.js");
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config */ "./src/config.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ "./src/utils.js");
+ // eslint-disable-line
+
+
+
+
+ // import { calcLabelPosition } from '../utils';
+
+var edgeLabels = {};
+var clear = function clear() {
+  edgeLabels = {};
+};
+var insertEdgeLabel = function insertEdgeLabel(elem, edge) {
+  // Create the actual text element
+  var labelElement = Object(_createLabel__WEBPACK_IMPORTED_MODULE_1__["default"])(edge.label, edge.labelStyle); // Create outer g, edgeLabel, this will be positioned after graph layout
+
+  var edgeLabel = elem.insert('g').attr('class', 'edgeLabel'); // Create inner g, label, this will be positioned now for centering the text
+
+  var label = edgeLabel.insert('g').attr('class', 'label');
+  label.node().appendChild(labelElement); // Center the label
+
+  var bbox = labelElement.getBBox();
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"])().flowchart.htmlLabels) {
+    var div = labelElement.children[0];
+    var dv = Object(d3__WEBPACK_IMPORTED_MODULE_2__["select"])(labelElement);
+    bbox = div.getBoundingClientRect();
+    dv.attr('width', bbox.width);
+    dv.attr('height', bbox.height);
+  }
+
+  label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')'); // Make element accessible by id for positioning
+
+  edgeLabels[edge.id] = edgeLabel; // Update the abstract data of the edge with the new information about its width and height
+
+  edge.width = bbox.width;
+  edge.height = bbox.height;
+};
+var positionEdgeLabel = function positionEdgeLabel(edge, points) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Moving label', edge.id, edge.label, edgeLabels[edge.id]);
+
+  if (edge.label) {
+    var el = edgeLabels[edge.id];
+    var x = edge.x;
+    var y = edge.y;
+
+    if (points) {
+      // debugger;
+      var pos = _utils__WEBPACK_IMPORTED_MODULE_4__["default"].calcLabelPosition(points);
+      x = pos.x;
+      y = pos.y;
+    }
+
+    el.attr('transform', 'translate(' + x + ', ' + y + ')');
+  }
+}; // const getRelationType = function(type) {
+//   switch (type) {
+//     case stateDb.relationType.AGGREGATION:
+//       return 'aggregation';
+//     case stateDb.relationType.EXTENSION:
+//       return 'extension';
+//     case stateDb.relationType.COMPOSITION:
+//       return 'composition';
+//     case stateDb.relationType.DEPENDENCY:
+//       return 'dependency';
+//   }
+// };
+
+var outsideNode = function outsideNode(node, point) {
+  // logger.warn('Checking bounds ', node, point);
+  var x = node.x;
+  var y = node.y;
+  var dx = Math.abs(point.x - x);
+  var dy = Math.abs(point.y - y);
+  var w = node.width / 2;
+  var h = node.height / 2;
+
+  if (dx >= w || dy >= h) {
+    return true;
+  }
+
+  return false;
+};
+
+var intersection = function intersection(node, outsidePoint, insidePoint) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('intersection calc o:', outsidePoint, ' i:', insidePoint, node);
+  var x = node.x;
+  var y = node.y;
+  var dx = Math.abs(x - insidePoint.x);
+  var w = node.width / 2;
+  var r = insidePoint.x < outsidePoint.x ? w - dx : w + dx;
+  var h = node.height / 2;
+  var edges = {
+    x1: x - w,
+    x2: x + w,
+    y1: y - h,
+    y2: y + h
+  };
+
+  if (outsidePoint.x === edges.x1 || outsidePoint.x === edges.x2 || outsidePoint.y === edges.y1 || outsidePoint.y === edges.y2) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('calc equals on edge');
+    return outsidePoint;
+  }
+
+  var Q = Math.abs(outsidePoint.y - insidePoint.y);
+  var R = Math.abs(outsidePoint.x - insidePoint.x); // log.warn();
+
+  if (Math.abs(y - outsidePoint.y) * w > Math.abs(x - outsidePoint.x) * h) {
+    // eslint-disable-line
+    // Intersection is top or bottom of rect.
+    // let q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;
+    var q = insidePoint.y < outsidePoint.y ? outsidePoint.y - h - y : y - h - outsidePoint.y;
+    r = R * q / Q;
+    var res = {
+      x: insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x - r,
+      y: outsidePoint.y + q
+    };
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn("topp/bott calc, Q ".concat(Q, ", q ").concat(q, ", R ").concat(R, ", r ").concat(r), res);
+    return res;
+  } else {
+    // Intersection onn sides of rect
+    // q = (Q * r) / R;
+    // q = 2;
+    // r = (R * q) / Q;
+    if (insidePoint.x < outsidePoint.x) {
+      r = outsidePoint.x - w - x;
+    } else {
+      // r = outsidePoint.x - w - x;
+      r = x - w - outsidePoint.x;
+    }
+
+    var _q = _q = Q * r / R;
+
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn("sides calc, Q ".concat(Q, ", q ").concat(_q, ", R ").concat(R, ", r ").concat(r), {
+      x: insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x + dx - w,
+      y: insidePoint.y < outsidePoint.y ? insidePoint.y + _q : insidePoint.y - _q
+    });
+    return {
+      x: insidePoint.x < outsidePoint.x ? insidePoint.x + R - r : insidePoint.x + dx - w,
+      y: insidePoint.y < outsidePoint.y ? insidePoint.y + _q : insidePoint.y - _q
+    };
+  }
+}; //(edgePaths, e, edge, clusterDb, diagramtype, graph)
+
+var insertEdge = function insertEdge(elem, e, edge, clusterDb, diagramType, graph) {
+  var points = edge.points;
+  var pointsHasChanged = false;
+  var tail = graph.node(e.v);
+  var head = graph.node(e.w);
+
+  if (head.intersect && tail.intersect) {
+    points = points.slice(1, edge.points.length - 1);
+    points.unshift(tail.intersect(points[0]));
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Last point', points[points.length - 1], head, head.intersect(points[points.length - 1]));
+    points.push(head.intersect(points[points.length - 1]));
+  }
+
+  if (edge.toCluster) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('edge', edge);
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('to cluster', clusterDb[edge.toCluster]);
+    points = [];
+    var lastPointOutside;
+    var isInside = false;
+    edge.points.forEach(function (point) {
+      var node = clusterDb[edge.toCluster].node;
+
+      if (!outsideNode(node, point) && !isInside) {
+        _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('inside', edge.toCluster, point, lastPointOutside); // First point inside the rect
+
+        var inter = intersection(node, lastPointOutside, point);
+        var pointPresent = false;
+        points.forEach(function (p) {
+          pointPresent = pointPresent || p.x === inter.x && p.y === inter.y;
+        }); // if (!pointPresent) {
+
+        if (!points.find(function (e) {
+          return e.x === inter.x && e.y === inter.y;
+        })) {
+          points.push(inter);
+        } else {
+          _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('no intersect', inter, points);
+        }
+
+        isInside = true;
+      } else {
+        if (!isInside) points.push(point);
+      }
+
+      lastPointOutside = point;
+    });
+    pointsHasChanged = true;
+  }
+
+  if (edge.fromCluster) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('edge', edge);
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('from cluster', clusterDb[edge.fromCluster]);
+    var updatedPoints = [];
+
+    var _lastPointOutside;
+
+    var _isInside = false;
+
+    for (var i = points.length - 1; i >= 0; i--) {
+      var point = points[i];
+      var node = clusterDb[edge.fromCluster].node;
+
+      if (!outsideNode(node, point) && !_isInside) {
+        _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('inside', edge.fromCluster, point, node); // First point inside the rect
+
+        var insterection = intersection(node, _lastPointOutside, point); // logger.trace('intersect', intersection(node, lastPointOutside, point));
+
+        updatedPoints.unshift(insterection); // points.push(insterection);
+
+        _isInside = true;
+      } else {
+        // at the outside
+        _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Outside point', point);
+        if (!_isInside) updatedPoints.unshift(point);
+      }
+
+      _lastPointOutside = point;
+    }
+
+    points = updatedPoints;
+    pointsHasChanged = true;
+  } // The data for our line
+
+
+  var lineData = points.filter(function (p) {
+    return !Number.isNaN(p.y);
+  }); // This is the accessor function we talked about above
+
+  var lineFunction = Object(d3__WEBPACK_IMPORTED_MODULE_2__["line"])().x(function (d) {
+    return d.x;
+  }).y(function (d) {
+    return d.y;
+  }).curve(d3__WEBPACK_IMPORTED_MODULE_2__["curveBasis"]); // Contruct stroke classes based on properties
+
+  var strokeClasses;
+
+  switch (edge.thickness) {
+    case 'normal':
+      strokeClasses = 'edge-thickness-normal';
+      break;
+
+    case 'thick':
+      strokeClasses = 'edge-thickness-thick';
+      break;
+
+    default:
+      strokeClasses = '';
+  }
+
+  switch (edge.pattern) {
+    case 'solid':
+      strokeClasses += ' edge-pattern-solid';
+      break;
+
+    case 'dotted':
+      strokeClasses += ' edge-pattern-dotted';
+      break;
+
+    case 'dashed':
+      strokeClasses += ' edge-pattern-dashed';
+      break;
+  }
+
+  var svgPath = elem.append('path').attr('d', lineFunction(lineData)).attr('id', edge.id).attr('class', ' ' + strokeClasses + (edge.classes ? ' ' + edge.classes : '')); // DEBUG code, adds a red circle at each edge coordinate
+  // edge.points.forEach(point => {
+  //   elem
+  //     .append('circle')
+  //     .style('stroke', 'red')
+  //     .style('fill', 'red')
+  //     .attr('r', 1)
+  //     .attr('cx', point.x)
+  //     .attr('cy', point.y);
+  // });
+
+  var url = '';
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"])().state.arrowMarkerAbsolute) {
+    url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
+    url = url.replace(/\(/g, '\\(');
+    url = url.replace(/\)/g, '\\)');
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('arrowTypeStart', edge.arrowTypeStart);
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('arrowTypeEnd', edge.arrowTypeEnd);
+
+  switch (edge.arrowTypeStart) {
+    case 'arrow_cross':
+      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-crossStart' + ')');
+      break;
+
+    case 'arrow_point':
+      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-pointStart' + ')');
+      break;
+
+    case 'arrow_barb':
+      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-barbStart' + ')');
+      break;
+
+    case 'arrow_circle':
+      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-circleStart' + ')');
+      break;
+
+    case 'aggregation':
+      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-aggregationStart' + ')');
+      break;
+
+    case 'extension':
+      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-extensionStart' + ')');
+      break;
+
+    case 'composition':
+      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-compositionStart' + ')');
+      break;
+
+    case 'dependency':
+      svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-dependencyStart' + ')');
+      break;
+
+    default:
+  }
+
+  switch (edge.arrowTypeEnd) {
+    case 'arrow_cross':
+      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-crossEnd' + ')');
+      break;
+
+    case 'arrow_point':
+      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-pointEnd' + ')');
+      break;
+
+    case 'arrow_barb':
+      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-barbEnd' + ')');
+      break;
+
+    case 'arrow_circle':
+      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-circleEnd' + ')');
+      break;
+
+    case 'aggregation':
+      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-aggregationEnd' + ')');
+      break;
+
+    case 'extension':
+      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-extensionEnd' + ')');
+      break;
+
+    case 'composition':
+      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-compositionEnd' + ')');
+      break;
+
+    case 'dependency':
+      svgPath.attr('marker-end', 'url(' + url + '#' + diagramType + '-dependencyEnd' + ')');
+      break;
+
+    default:
+  }
+
+  if (pointsHasChanged) {
+    return points;
+  }
+};
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/index.js":
+/*!************************************!*\
+  !*** ./src/dagre-wrapper/index.js ***!
+  \************************************/
+/*! exports provided: render */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dagre */ "./node_modules/dagre/index.js");
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dagre__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _markers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./markers */ "./src/dagre-wrapper/markers.js");
+/* harmony import */ var _shapes_util__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./shapes/util */ "./src/dagre-wrapper/shapes/util.js");
+/* harmony import */ var _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mermaid-graphlib */ "./src/dagre-wrapper/mermaid-graphlib.js");
+/* harmony import */ var _nodes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./nodes */ "./src/dagre-wrapper/nodes.js");
+/* harmony import */ var _clusters__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./clusters */ "./src/dagre-wrapper/clusters.js");
+/* harmony import */ var _edges__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./edges */ "./src/dagre-wrapper/edges.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
+
+
+
+
+
+
+
+
+
+
+var recursiveRender = function recursiveRender(_elem, graph, diagramtype, parentCluster) {
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Graph in recursive render:', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph), parentCluster);
+  var dir = graph.graph().rankdir;
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Dir in recursive render - dir:', dir);
+
+  var elem = _elem.insert('g').attr('class', 'root'); // eslint-disable-line
+
+
+  if (!graph.nodes()) {
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('No nodes found for', graph);
+  } else {
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Recursive render', graph.nodes());
+  }
+
+  if (graph.edges().length > 0) {
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Recursive edges', graph.edge(graph.edges()[0]));
+  }
+
+  var clusters = elem.insert('g').attr('class', 'clusters'); // eslint-disable-line
+
+  var edgePaths = elem.insert('g').attr('class', 'edgePaths');
+  var edgeLabels = elem.insert('g').attr('class', 'edgeLabels');
+  var nodes = elem.insert('g').attr('class', 'nodes'); // Insert nodes, this will insert them into the dom and each node will get a size. The size is updated
+  // to the abstract node and is later used by dagre for the layout
+
+  graph.nodes().forEach(function (v) {
+    var node = graph.node(v);
+
+    if (typeof parentCluster !== 'undefined') {
+      var data = JSON.parse(JSON.stringify(parentCluster.clusterData)); // data.clusterPositioning = true;
+
+      _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Setting data for cluster', data);
+      graph.setNode(parentCluster.id, data);
+      graph.setParent(v, parentCluster.id, data);
+    }
+
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('(Insert) Node ' + v + ': ' + JSON.stringify(graph.node(v)));
+
+    if (node && node.clusterNode) {
+      // const children = graph.children(v);
+      _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Cluster identified', v, node, graph.node(v));
+      var newEl = recursiveRender(nodes, node.graph, diagramtype, graph.node(v));
+      Object(_shapes_util__WEBPACK_IMPORTED_MODULE_3__["updateNodeBounds"])(node, newEl);
+      Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["setNodeElem"])(newEl, node);
+      _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Recursive render complete', newEl, node);
+    } else {
+      if (graph.children(v).length > 0) {
+        // This is a cluster but not to be rendered recusively
+        // Render as before
+        _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Cluster - the non recursive path', v, node.id, node, graph);
+        _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info(Object(_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["findNonClusterChild"])(node.id, graph));
+        _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"][node.id] = {
+          id: Object(_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["findNonClusterChild"])(node.id, graph),
+          node: node
+        }; // insertCluster(clusters, graph.node(v));
+      } else {
+        _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Node - the non recursive path', v, node.id, node);
+        Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["insertNode"])(nodes, graph.node(v), dir);
+      }
+    }
+  }); // Insert labels, this will insert them into the dom so that the width can be calculated
+  // Also figure out which edges point to/from clusters and adjust them accordingly
+  // Edges from/to clusters really points to the first child in the cluster.
+  // TODO: pick optimal child in the cluster to us as link anchor
+
+  graph.edges().forEach(function (e) {
+    var edge = graph.edge(e.v, e.w, e.name);
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Edge ' + e.v + ' -> ' + e.w + ': ', e, ' ', JSON.stringify(graph.edge(e))); // Check if link is either from or to a cluster
+
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Fix', _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"], 'ids:', e.v, e.w, 'Translateing: ', _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"][e.v], _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"][e.w]);
+    Object(_edges__WEBPACK_IMPORTED_MODULE_7__["insertEdgeLabel"])(edgeLabels, edge);
+  });
+  graph.edges().forEach(function (e) {
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));
+  });
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('#############################################');
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('###                Layout                 ###');
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('#############################################');
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info(graph);
+  dagre__WEBPACK_IMPORTED_MODULE_0___default.a.layout(graph);
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Graph after layout:', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph)); // Move the nodes to the correct place
+
+  graph.nodes().forEach(function (v) {
+    var node = graph.node(v);
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Position ' + v + ': ' + JSON.stringify(graph.node(v)));
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Position ' + v + ': (' + node.x, ',' + node.y, ') width: ', node.width, ' height: ', node.height);
+
+    if (node && node.clusterNode) {
+      // clusterDb[node.id].node = node;
+      Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["positionNode"])(node);
+    } else {
+      // Non cluster node
+      if (graph.children(v).length > 0) {
+        // A cluster in the non-recurive way
+        // positionCluster(node);
+        Object(_clusters__WEBPACK_IMPORTED_MODULE_6__["insertCluster"])(clusters, node);
+        _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"][node.id].node = node;
+      } else {
+        Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["positionNode"])(node);
+      }
+    }
+  }); // Move the edge labels to the correct place after layout
+
+  graph.edges().forEach(function (e) {
+    var edge = graph.edge(e);
+    _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(edge), edge);
+    var updatedPath = Object(_edges__WEBPACK_IMPORTED_MODULE_7__["insertEdge"])(edgePaths, e, edge, _mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clusterDb"], diagramtype, graph);
+    Object(_edges__WEBPACK_IMPORTED_MODULE_7__["positionEdgeLabel"])(edge, updatedPath);
+  });
+  return elem;
+};
+
+var render = function render(elem, graph, markers, diagramtype, id) {
+  Object(_markers__WEBPACK_IMPORTED_MODULE_2__["default"])(elem, markers, diagramtype, id);
+  Object(_nodes__WEBPACK_IMPORTED_MODULE_5__["clear"])();
+  Object(_edges__WEBPACK_IMPORTED_MODULE_7__["clear"])();
+  Object(_clusters__WEBPACK_IMPORTED_MODULE_6__["clear"])();
+  Object(_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["clear"])();
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Graph before:', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
+  Object(_mermaid_graphlib__WEBPACK_IMPORTED_MODULE_4__["adjustClustersAndEdges"])(graph);
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Graph after:', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
+  _logger__WEBPACK_IMPORTED_MODULE_8__["logger"].warn('Graph ever  after:', graph.graph());
+  recursiveRender(elem, graph, diagramtype);
+}; // const shapeDefinitions = {};
+// export const addShape = ({ shapeType: fun }) => {
+//   shapeDefinitions[shapeType] = fun;
+// };
+// const arrowDefinitions = {};
+// export const addArrow = ({ arrowType: fun }) => {
+//   arrowDefinitions[arrowType] = fun;
+// };
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/intersect/index.js":
+/*!**********************************************!*\
+  !*** ./src/dagre-wrapper/intersect/index.js ***!
+  \**********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _intersect_node_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./intersect-node.js */ "./src/dagre-wrapper/intersect/intersect-node.js");
+/* harmony import */ var _intersect_node_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_intersect_node_js__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _intersect_circle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./intersect-circle.js */ "./src/dagre-wrapper/intersect/intersect-circle.js");
+/* harmony import */ var _intersect_ellipse_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./intersect-ellipse.js */ "./src/dagre-wrapper/intersect/intersect-ellipse.js");
+/* harmony import */ var _intersect_polygon_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./intersect-polygon.js */ "./src/dagre-wrapper/intersect/intersect-polygon.js");
+/* harmony import */ var _intersect_rect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./intersect-rect.js */ "./src/dagre-wrapper/intersect/intersect-rect.js");
+/*
+ * Borrowed with love from from dagrge-d3. Many thanks to cpettitt!
+ */
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  node: _intersect_node_js__WEBPACK_IMPORTED_MODULE_0___default.a,
+  circle: _intersect_circle_js__WEBPACK_IMPORTED_MODULE_1__["default"],
+  ellipse: _intersect_ellipse_js__WEBPACK_IMPORTED_MODULE_2__["default"],
+  polygon: _intersect_polygon_js__WEBPACK_IMPORTED_MODULE_3__["default"],
+  rect: _intersect_rect_js__WEBPACK_IMPORTED_MODULE_4__["default"]
+});
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/intersect/intersect-circle.js":
+/*!*********************************************************!*\
+  !*** ./src/dagre-wrapper/intersect/intersect-circle.js ***!
+  \*********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _intersect_ellipse__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./intersect-ellipse */ "./src/dagre-wrapper/intersect/intersect-ellipse.js");
+
+
+function intersectCircle(node, rx, point) {
+  return Object(_intersect_ellipse__WEBPACK_IMPORTED_MODULE_0__["default"])(node, rx, rx, point);
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (intersectCircle);
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/intersect/intersect-ellipse.js":
+/*!**********************************************************!*\
+  !*** ./src/dagre-wrapper/intersect/intersect-ellipse.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function intersectEllipse(node, rx, ry, point) {
+  // Formulae from: http://mathworld.wolfram.com/Ellipse-LineIntersection.html
+  var cx = node.x;
+  var cy = node.y;
+  var px = cx - point.x;
+  var py = cy - point.y;
+  var det = Math.sqrt(rx * rx * py * py + ry * ry * px * px);
+  var dx = Math.abs(rx * ry * px / det);
+
+  if (point.x < cx) {
+    dx = -dx;
+  }
+
+  var dy = Math.abs(rx * ry * py / det);
+
+  if (point.y < cy) {
+    dy = -dy;
+  }
+
+  return {
+    x: cx + dx,
+    y: cy + dy
+  };
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (intersectEllipse);
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/intersect/intersect-line.js":
+/*!*******************************************************!*\
+  !*** ./src/dagre-wrapper/intersect/intersect-line.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/*
+ * Returns the point at which two lines, p and q, intersect or returns
+ * undefined if they do not intersect.
+ */
+function intersectLine(p1, p2, q1, q2) {
+  // Algorithm from J. Avro, (ed.) Graphics Gems, No 2, Morgan Kaufmann, 1994,
+  // p7 and p473.
+  var a1, a2, b1, b2, c1, c2;
+  var r1, r2, r3, r4;
+  var denom, offset, num;
+  var x, y; // Compute a1, b1, c1, where line joining points 1 and 2 is F(x,y) = a1 x +
+  // b1 y + c1 = 0.
+
+  a1 = p2.y - p1.y;
+  b1 = p1.x - p2.x;
+  c1 = p2.x * p1.y - p1.x * p2.y; // Compute r3 and r4.
+
+  r3 = a1 * q1.x + b1 * q1.y + c1;
+  r4 = a1 * q2.x + b1 * q2.y + c1; // Check signs of r3 and r4. If both point 3 and point 4 lie on
+  // same side of line 1, the line segments do not intersect.
+
+  if (r3 !== 0 && r4 !== 0 && sameSign(r3, r4)) {
+    return;
+  } // Compute a2, b2, c2 where line joining points 3 and 4 is G(x,y) = a2 x + b2 y + c2 = 0
+
+
+  a2 = q2.y - q1.y;
+  b2 = q1.x - q2.x;
+  c2 = q2.x * q1.y - q1.x * q2.y; // Compute r1 and r2
+
+  r1 = a2 * p1.x + b2 * p1.y + c2;
+  r2 = a2 * p2.x + b2 * p2.y + c2; // Check signs of r1 and r2. If both point 1 and point 2 lie
+  // on same side of second line segment, the line segments do
+  // not intersect.
+
+  if (r1 !== 0 && r2 !== 0 && sameSign(r1, r2)) {
+    return;
+  } // Line segments intersect: compute intersection point.
+
+
+  denom = a1 * b2 - a2 * b1;
+
+  if (denom === 0) {
+    return;
+  }
+
+  offset = Math.abs(denom / 2); // The denom/2 is to get rounding instead of truncating. It
+  // is added or subtracted to the numerator, depending upon the
+  // sign of the numerator.
+
+  num = b1 * c2 - b2 * c1;
+  x = num < 0 ? (num - offset) / denom : (num + offset) / denom;
+  num = a2 * c1 - a1 * c2;
+  y = num < 0 ? (num - offset) / denom : (num + offset) / denom;
+  return {
+    x: x,
+    y: y
+  };
+}
+
+function sameSign(r1, r2) {
+  return r1 * r2 > 0;
+}
+
+/* harmony default export */ __webpack_exports__["default"] = (intersectLine);
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/intersect/intersect-node.js":
+/*!*******************************************************!*\
+  !*** ./src/dagre-wrapper/intersect/intersect-node.js ***!
+  \*******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+module.exports = intersectNode;
+
+function intersectNode(node, point) {
+  // console.info('Intersect Node');
+  return node.intersect(point);
+}
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/intersect/intersect-polygon.js":
+/*!**********************************************************!*\
+  !*** ./src/dagre-wrapper/intersect/intersect-polygon.js ***!
+  \**********************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _intersect_line__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./intersect-line */ "./src/dagre-wrapper/intersect/intersect-line.js");
+/* eslint "no-console": off */
+
+/* harmony default export */ __webpack_exports__["default"] = (intersectPolygon);
+/*
+ * Returns the point ({x, y}) at which the point argument intersects with the
+ * node argument assuming that it has the shape specified by polygon.
+ */
+
+function intersectPolygon(node, polyPoints, point) {
+  var x1 = node.x;
+  var y1 = node.y;
+  var intersections = [];
+  var minX = Number.POSITIVE_INFINITY;
+  var minY = Number.POSITIVE_INFINITY;
+
+  if (typeof polyPoints.forEach === 'function') {
+    polyPoints.forEach(function (entry) {
+      minX = Math.min(minX, entry.x);
+      minY = Math.min(minY, entry.y);
+    });
+  } else {
+    minX = Math.min(minX, polyPoints.x);
+    minY = Math.min(minY, polyPoints.y);
+  }
+
+  var left = x1 - node.width / 2 - minX;
+  var top = y1 - node.height / 2 - minY;
+
+  for (var i = 0; i < polyPoints.length; i++) {
+    var p1 = polyPoints[i];
+    var p2 = polyPoints[i < polyPoints.length - 1 ? i + 1 : 0];
+    var intersect = Object(_intersect_line__WEBPACK_IMPORTED_MODULE_0__["default"])(node, point, {
+      x: left + p1.x,
+      y: top + p1.y
+    }, {
+      x: left + p2.x,
+      y: top + p2.y
+    });
+
+    if (intersect) {
+      intersections.push(intersect);
+    }
+  }
+
+  if (!intersections.length) {
+    // console.log('NO INTERSECTION FOUND, RETURN NODE CENTER', node);
+    return node;
+  }
+
+  if (intersections.length > 1) {
+    // More intersections, find the one nearest to edge end point
+    intersections.sort(function (p, q) {
+      var pdx = p.x - point.x;
+      var pdy = p.y - point.y;
+      var distp = Math.sqrt(pdx * pdx + pdy * pdy);
+      var qdx = q.x - point.x;
+      var qdy = q.y - point.y;
+      var distq = Math.sqrt(qdx * qdx + qdy * qdy);
+      return distp < distq ? -1 : distp === distq ? 0 : 1;
+    });
+  }
+
+  return intersections[0];
+}
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/intersect/intersect-rect.js":
+/*!*******************************************************!*\
+  !*** ./src/dagre-wrapper/intersect/intersect-rect.js ***!
+  \*******************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var intersectRect = function intersectRect(node, point) {
+  var x = node.x;
+  var y = node.y; // Rectangle intersection algorithm from:
+  // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes
+
+  var dx = point.x - x;
+  var dy = point.y - y;
+  var w = node.width / 2;
+  var h = node.height / 2;
+  var sx, sy;
+
+  if (Math.abs(dy) * w > Math.abs(dx) * h) {
+    // Intersection is top or bottom of rect.
+    if (dy < 0) {
+      h = -h;
+    }
+
+    sx = dy === 0 ? 0 : h * dx / dy;
+    sy = h;
+  } else {
+    // Intersection is left or right of rect.
+    if (dx < 0) {
+      w = -w;
+    }
+
+    sx = w;
+    sy = dx === 0 ? 0 : w * dy / dx;
+  }
+
+  return {
+    x: x + sx,
+    y: y + sy
+  };
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (intersectRect);
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/markers.js":
+/*!**************************************!*\
+  !*** ./src/dagre-wrapper/markers.js ***!
+  \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
+/**
+ * Setup arrow head and define the marker. The result is appended to the svg.
+ */
+ // Only add the number of markers that the diagram needs
+
+var insertMarkers = function insertMarkers(elem, markerArray, type, id) {
+  markerArray.forEach(function (markerName) {
+    markers[markerName](elem, type, id);
+  });
+};
+
+var extension = function extension(elem, type, id) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Making markers for ', id);
+  elem.append('defs').append('marker').attr('id', type + '-extensionStart').attr('class', 'marker extension ' + type).attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 1,7 L18,13 V 1 Z');
+  elem.append('defs').append('marker').attr('id', type + '-extensionEnd').attr('class', 'marker extension ' + type).attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead
+};
+
+var composition = function composition(elem, type) {
+  elem.append('defs').append('marker').attr('id', type + '-compositionStart').attr('class', 'marker composition ' + type).attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
+  elem.append('defs').append('marker').attr('id', type + '-compositionEnd').attr('class', 'marker composition ' + type).attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
+};
+
+var aggregation = function aggregation(elem, type) {
+  elem.append('defs').append('marker').attr('id', type + '-aggregationStart').attr('class', 'marker aggregation ' + type).attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
+  elem.append('defs').append('marker').attr('id', type + '-aggregationEnd').attr('class', 'marker aggregation ' + type).attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
+};
+
+var dependency = function dependency(elem, type) {
+  elem.append('defs').append('marker').attr('id', type + '-dependencyStart').attr('class', 'marker dependency ' + type).attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');
+  elem.append('defs').append('marker').attr('id', type + '-dependencyEnd').attr('class', 'marker dependency ' + type).attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');
+};
+
+var point = function point(elem, type) {
+  elem.append('marker').attr('id', type + '-pointEnd').attr('class', 'marker ' + type).attr('viewBox', '0 0 10 10').attr('refX', 9).attr('refY', 5).attr('markerUnits', 'userSpaceOnUse').attr('markerWidth', 12).attr('markerHeight', 12).attr('orient', 'auto').append('path').attr('d', 'M 0 0 L 10 5 L 0 10 z').attr('class', 'arrowMarkerPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
+  elem.append('marker').attr('id', type + '-pointStart').attr('class', 'marker ' + type).attr('viewBox', '0 0 10 10').attr('refX', 0).attr('refY', 5).attr('markerUnits', 'userSpaceOnUse').attr('markerWidth', 12).attr('markerHeight', 12).attr('orient', 'auto').append('path').attr('d', 'M 0 5 L 10 10 L 10 0 z').attr('class', 'arrowMarkerPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
+};
+
+var circle = function circle(elem, type) {
+  elem.append('marker').attr('id', type + '-circleEnd').attr('class', 'marker ' + type).attr('viewBox', '0 0 10 10').attr('refX', 11).attr('refY', 5).attr('markerUnits', 'userSpaceOnUse').attr('markerWidth', 11).attr('markerHeight', 11).attr('orient', 'auto').append('circle').attr('cx', '5').attr('cy', '5').attr('r', '5').attr('class', 'arrowMarkerPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
+  elem.append('marker').attr('id', type + '-circleStart').attr('class', 'marker ' + type).attr('viewBox', '0 0 10 10').attr('refX', -1).attr('refY', 5).attr('markerUnits', 'userSpaceOnUse').attr('markerWidth', 11).attr('markerHeight', 11).attr('orient', 'auto').append('circle').attr('cx', '5').attr('cy', '5').attr('r', '5').attr('class', 'arrowMarkerPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
+};
+
+var cross = function cross(elem, type) {
+  elem.append('marker').attr('id', type + '-crossEnd').attr('class', 'marker cross ' + type).attr('viewBox', '0 0 11 11').attr('refX', 12).attr('refY', 5.2).attr('markerUnits', 'userSpaceOnUse').attr('markerWidth', 11).attr('markerHeight', 11).attr('orient', 'auto').append('path') // .attr('stroke', 'black')
+  .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9').attr('class', 'arrowMarkerPath').style('stroke-width', 2).style('stroke-dasharray', '1,0');
+  elem.append('marker').attr('id', type + '-crossStart').attr('class', 'marker cross ' + type).attr('viewBox', '0 0 11 11').attr('refX', -1).attr('refY', 5.2).attr('markerUnits', 'userSpaceOnUse').attr('markerWidth', 11).attr('markerHeight', 11).attr('orient', 'auto').append('path') // .attr('stroke', 'black')
+  .attr('d', 'M 1,1 l 9,9 M 10,1 l -9,9').attr('class', 'arrowMarkerPath').style('stroke-width', 2).style('stroke-dasharray', '1,0');
+};
+
+var barb = function barb(elem, type) {
+  elem.append('defs').append('marker').attr('id', type + '-barbEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 14).attr('markerUnits', 'strokeWidth').attr('orient', 'auto').append('path').attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');
+}; // TODO rename the class diagram markers to something shape descriptive and semanitc free
+
+
+var markers = {
+  extension: extension,
+  composition: composition,
+  aggregation: aggregation,
+  dependency: dependency,
+  point: point,
+  circle: circle,
+  cross: cross,
+  barb: barb
+};
+/* harmony default export */ __webpack_exports__["default"] = (insertMarkers);
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/mermaid-graphlib.js":
+/*!***********************************************!*\
+  !*** ./src/dagre-wrapper/mermaid-graphlib.js ***!
+  \***********************************************/
+/*! exports provided: clusterDb, clear, extractDecendants, validate, findNonClusterChild, adjustClustersAndEdges, extractor */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clusterDb", function() { return clusterDb; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractDecendants", function() { return extractDecendants; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validate", function() { return validate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findNonClusterChild", function() { return findNonClusterChild; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "adjustClustersAndEdges", function() { return adjustClustersAndEdges; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "extractor", function() { return extractor; });
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_1__);
+/**
+ * Decorates with functions required by mermaids dagre-wrapper.
+ */
+
+
+var clusterDb = {};
+var decendants = {};
+var parents = {};
+var clear = function clear() {
+  decendants = {};
+  parents = {};
+  clusterDb = {};
+};
+
+var isDecendant = function isDecendant(id, ancenstorId) {
+  // if (id === ancenstorId) return true;
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('In isDecendant', ancenstorId, ' ', id, ' = ', decendants[ancenstorId].indexOf(id) >= 0);
+  if (decendants[ancenstorId].indexOf(id) >= 0) return true;
+  return false;
+};
+
+var edgeInCluster = function edgeInCluster(edge, clusterId) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Decendants of ', clusterId, ' is ', decendants[clusterId]);
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Edge is ', edge); // Edges to/from the cluster is not in the cluster, they are in the parent
+
+  if (edge.v === clusterId) return false;
+  if (edge.w === clusterId) return false;
+
+  if (!decendants[clusterId]) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Tilt, ', clusterId, ',not in decendants');
+    return false;
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Here ');
+  if (decendants[clusterId].indexOf(edge.v) >= 0) return true;
+  if (isDecendant(edge.v, clusterId)) return true;
+  if (isDecendant(edge.w, clusterId)) return true;
+  if (decendants[clusterId].indexOf(edge.w) >= 0) return true;
+  return false;
+};
+
+var copy = function copy(clusterId, graph, newGraph, rootId) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Copying children of ', clusterId, 'root', rootId, 'data', graph.node(clusterId), rootId);
+  var nodes = graph.children(clusterId) || []; // Include cluster node if it is not the root
+
+  if (clusterId !== rootId) {
+    nodes.push(clusterId);
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Copying (nodes) clusterId', clusterId, 'nodes', nodes);
+  nodes.forEach(function (node) {
+    if (graph.children(node).length > 0) {
+      copy(node, graph, newGraph, rootId);
+    } else {
+      var data = graph.node(node);
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('cp ', node, ' to ', rootId, ' with parent ', clusterId); //,node, data, ' parent is ', clusterId);
+
+      newGraph.setNode(node, data);
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Setting parent', node, graph.parent(node));
+
+      if (rootId !== graph.parent(node)) {
+        newGraph.setParent(node, graph.parent(node));
+      }
+
+      if (clusterId !== rootId && node !== clusterId) {
+        _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Setting parent', node, clusterId);
+        newGraph.setParent(node, clusterId);
+      } else {
+        _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('In copy ', clusterId, 'root', rootId, 'data', graph.node(clusterId), rootId);
+        _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Not Setting parent for node=', node, 'cluster!==rootId', clusterId !== rootId, 'node!==clusterId', node !== clusterId);
+      }
+
+      var edges = graph.edges(node);
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Copying Edges', edges);
+      edges.forEach(function (edge) {
+        _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Edge', edge);
+        var data = graph.edge(edge.v, edge.w, edge.name);
+        _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Edge data', data, rootId);
+
+        try {
+          // Do not copy edges in and out of the root cluster, they belong to the parent graph
+          if (edgeInCluster(edge, rootId)) {
+            _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Copying as ', edge.v, edge.w, data, edge.name);
+            newGraph.setEdge(edge.v, edge.w, data, edge.name);
+            _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('newGraph edges ', newGraph.edges(), newGraph.edge(newGraph.edges()[0]));
+          } else {
+            _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Skipping copy of edge ', edge.v, '-->', edge.w, ' rootId: ', rootId, ' clusterId:', clusterId);
+          }
+        } catch (e) {
+          _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error(e);
+        }
+      });
+    }
+
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Removing node', node);
+    graph.removeNode(node);
+  });
+};
+
+var extractDecendants = function extractDecendants(id, graph) {
+  // log.debug('Extracting ', id);
+  var children = graph.children(id);
+  var res = [].concat(children);
+
+  for (var i = 0; i < children.length; i++) {
+    parents[children[i]] = id;
+    res = res.concat(extractDecendants(children[i], graph));
+  }
+
+  return res;
+};
+/**
+ * Validates the graph, checking that all parent child relation points to existing nodes and that
+ * edges between nodes also ia correct. When not correct the function logs the discrepancies.
+ * @param {graphlib graph} g
+ */
+
+var validate = function validate(graph) {
+  var edges = graph.edges();
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Edges: ', edges);
+
+  for (var i = 0; i < edges.length; i++) {
+    if (graph.children(edges[i].v).length > 0) {
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('The node ', edges[i].v, ' is part of and edge even though it has children');
+      return false;
+    }
+
+    if (graph.children(edges[i].w).length > 0) {
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('The node ', edges[i].w, ' is part of and edge even though it has children');
+      return false;
+    }
+  }
+
+  return true;
+};
+/**
+ * Finds a child that is not a cluster. When faking a edge between a node and a cluster.
+ * @param {Finds a } id
+ * @param {*} graph
+ */
+
+var findNonClusterChild = function findNonClusterChild(id, graph) {
+  // const node = graph.node(id);
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Searching', id); // const children = graph.children(id).reverse();
+
+  var children = graph.children(id); //.reverse();
+
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Searching children of id ', id, children);
+
+  if (children.length < 1) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('This is a valid node', id);
+    return id;
+  }
+
+  for (var i = 0; i < children.length; i++) {
+    var _id = findNonClusterChild(children[i], graph);
+
+    if (_id) {
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Found replacement for', id, ' => ', _id);
+      return _id;
+    }
+  }
+};
+
+var getAnchorId = function getAnchorId(id) {
+  if (!clusterDb[id]) {
+    return id;
+  } // If the cluster has no external connections
+
+
+  if (!clusterDb[id].externalConnections) {
+    return id;
+  } // Return the replacement node
+
+
+  if (clusterDb[id]) {
+    return clusterDb[id].id;
+  }
+
+  return id;
+};
+
+var adjustClustersAndEdges = function adjustClustersAndEdges(graph, depth) {
+  if (!graph || depth > 10) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Opting out, no graph ');
+    return;
+  } else {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Opting in, graph ');
+  } // Go through the nodes and for each cluster found, save a replacment node, this can be used when
+  // faking a link to a cluster
+
+
+  graph.nodes().forEach(function (id) {
+    var children = graph.children(id);
+
+    if (children.length > 0) {
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('Cluster identified', id, ' Replacement id in edges: ', findNonClusterChild(id, graph));
+      decendants[id] = extractDecendants(id, graph);
+      clusterDb[id] = {
+        id: findNonClusterChild(id, graph),
+        clusterData: graph.node(id)
+      };
+    }
+  }); // Check incoming and outgoing edges for each cluster
+
+  graph.nodes().forEach(function (id) {
+    var children = graph.children(id);
+    var edges = graph.edges();
+
+    if (children.length > 0) {
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Cluster identified', id, decendants);
+      edges.forEach(function (edge) {
+        // log.debug('Edge, decendants: ', edge, decendants[id]);
+        // Check if any edge leaves the cluster (not the actual cluster, thats a link from the box)
+        if (edge.v !== id && edge.w !== id) {
+          // Any edge where either the one of the nodes is decending to the cluster but not the other
+          // if (decendants[id].indexOf(edge.v) < 0 && decendants[id].indexOf(edge.w) < 0) {
+          var d1 = isDecendant(edge.v, id);
+          var d2 = isDecendant(edge.w, id); // d1 xor d2 - if either d1 is true and d2 is false or the other way around
+
+          if (d1 ^ d2) {
+            _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Edge: ', edge, ' leaves cluster ', id);
+            _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Decendants of ', id, ': ', decendants[id]);
+            clusterDb[id].externalConnections = true;
+          }
+        }
+      });
+    }
+  });
+  extractor(graph, 0); // For clusters with incoming and/or outgoing edges translate those edges to a real node
+  // in the cluster inorder to fake the edge
+
+  graph.edges().forEach(function (e) {
+    var edge = graph.edge(e);
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));
+    var v = e.v;
+    var w = e.w; // Check if link is either from or to a cluster
+
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace('Fix', clusterDb, 'ids:', e.v, e.w, 'Translateing: ', clusterDb[e.v], clusterDb[e.w]);
+
+    if (clusterDb[e.v] || clusterDb[e.w]) {
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('Fixing and trixing - removing', e.v, e.w, e.name);
+      v = getAnchorId(e.v);
+      w = getAnchorId(e.w);
+      graph.removeEdge(e.v, e.w, e.name);
+      if (v !== e.v) edge.fromCluster = e.v;
+      if (w !== e.w) edge.toCluster = e.w;
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('Replacing with', v, w, e.name);
+      graph.setEdge(v, w, edge, e.name);
+    }
+  });
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].warn('Adjusted Graph', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].trace(clusterDb); // Remove references to extracted cluster
+  // graph.edges().forEach(edge => {
+  //   if (isDecendant(edge.v, clusterId) || isDecendant(edge.w, clusterId)) {
+  //     graph.removeEdge(edge);
+  //   }
+  // });
+};
+var extractor = function extractor(graph, depth) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('extractor - ', depth, graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph), graph.children('D'));
+
+  if (depth > 10) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error('Bailing out');
+    return;
+  } // For clusters without incoming and/or outgoing edges, create a new cluster-node
+  // containing the nodes and edges in the custer in a new graph
+  // for (let i = 0;)
+
+
+  var nodes = graph.nodes();
+  var hasChildren = false;
+
+  for (var i = 0; i < nodes.length; i++) {
+    var node = nodes[i];
+    var children = graph.children(node);
+    hasChildren = hasChildren || children.length > 0;
+  }
+
+  if (!hasChildren) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Done, no node has children', graph.nodes());
+    return;
+  } // const clusters = Object.keys(clusterDb);
+  // clusters.forEach(clusterId => {
+
+
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Nodes = ', nodes, depth);
+
+  for (var _i = 0; _i < nodes.length; _i++) {
+    var _node = nodes[_i];
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Extracting node', _node, clusterDb, clusterDb[_node] && !clusterDb[_node].externalConnections, !graph.parent(_node), graph.node(_node), graph.children('D'), ' Depth ', depth); // Note that the node might have been removed after the Object.keys call so better check
+    // that it still is in the game
+
+    if (!clusterDb[_node]) {
+      // Skip if the node is not a cluster
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Not a cluster', _node, depth); // break;
+    } else if (!clusterDb[_node].externalConnections && !graph.parent(_node) && graph.children(_node) && graph.children(_node).length > 0) {
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Cluster without external connections, without a parent and with children', _node, depth);
+      var graphSettings = graph.graph();
+      var clusterGraph = new graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.Graph({
+        multigraph: true,
+        compound: true
+      }).setGraph({
+        rankdir: graphSettings.rankdir === 'TB' ? 'LR' : 'TB',
+        // Todo: set proper spacing
+        nodesep: 50,
+        ranksep: 50,
+        marginx: 8,
+        marginy: 8
+      }).setDefaultEdgeLabel(function () {
+        return {};
+      });
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Old graph before copy', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
+      copy(_node, graph, clusterGraph, _node);
+      graph.setNode(_node, {
+        clusterNode: true,
+        id: _node,
+        clusterData: clusterDb[_node].clusterData,
+        labelText: clusterDb[_node].labelText,
+        graph: clusterGraph
+      });
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('New graph after copy', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(clusterGraph));
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Old graph after copy', graphlib__WEBPACK_IMPORTED_MODULE_1___default.a.json.write(graph));
+    } else {
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Cluster ** ', _node, ' **not meeting the criteria !externalConnections:', !clusterDb[_node].externalConnections, ' no parent: ', !graph.parent(_node), ' children ', graph.children(_node) && graph.children(_node).length > 0, graph.children('D'), depth);
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(clusterDb);
+    }
+  }
+
+  nodes = graph.nodes();
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('New list of nodes', nodes);
+
+  for (var _i2 = 0; _i2 < nodes.length; _i2++) {
+    var _node2 = nodes[_i2];
+    var data = graph.node(_node2);
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(' Now next leveö', _node2, data);
+
+    if (data.clusterNode) {
+      extractor(data.graph, depth + 1);
+    }
+  }
+};
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/nodes.js":
+/*!************************************!*\
+  !*** ./src/dagre-wrapper/nodes.js ***!
+  \************************************/
+/*! exports provided: insertNode, setNodeElem, clear, positionNode */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertNode", function() { return insertNode; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setNodeElem", function() { return setNodeElem; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "positionNode", function() { return positionNode; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger */ "./src/logger.js");
+/* harmony import */ var _shapes_util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./shapes/util */ "./src/dagre-wrapper/shapes/util.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config */ "./src/config.js");
+/* harmony import */ var _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./intersect/index.js */ "./src/dagre-wrapper/intersect/index.js");
+/* harmony import */ var _createLabel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./createLabel */ "./src/dagre-wrapper/createLabel.js");
+/* harmony import */ var _shapes_note__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./shapes/note */ "./src/dagre-wrapper/shapes/note.js");
+
+ // eslint-disable-line
+
+
+
+
+
+
+
+var question = function question(parent, node) {
+  var _labelHelper = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper.shapeSvg,
+      bbox = _labelHelper.bbox;
+
+  var w = bbox.width + node.padding;
+  var h = bbox.height + node.padding;
+  var s = w + h;
+  var points = [{
+    x: s / 2,
+    y: 0
+  }, {
+    x: s,
+    y: -s / 2
+  }, {
+    x: s / 2,
+    y: -s
+  }, {
+    x: 0,
+    y: -s / 2
+  }];
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('Question main (Circle)');
+  var questionElem = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["insertPolygonShape"])(shapeSvg, s, s, points);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, questionElem);
+
+  node.intersect = function (point) {
+    _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].warn('Intersect called');
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].polygon(node, points, point);
+  };
+
+  return shapeSvg;
+};
+
+var hexagon = function hexagon(parent, node) {
+  var _labelHelper2 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper2.shapeSvg,
+      bbox = _labelHelper2.bbox;
+
+  var f = 4;
+  var h = bbox.height + node.padding;
+  var m = h / f;
+  var w = bbox.width + 2 * m + node.padding;
+  var points = [{
+    x: m,
+    y: 0
+  }, {
+    x: w - m,
+    y: 0
+  }, {
+    x: w,
+    y: -h / 2
+  }, {
+    x: w - m,
+    y: -h
+  }, {
+    x: m,
+    y: -h
+  }, {
+    x: 0,
+    y: -h / 2
+  }];
+  var hex = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["insertPolygonShape"])(shapeSvg, w, h, points);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, hex);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].polygon(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var rect_left_inv_arrow = function rect_left_inv_arrow(parent, node) {
+  var _labelHelper3 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper3.shapeSvg,
+      bbox = _labelHelper3.bbox;
+
+  var w = bbox.width + node.padding;
+  var h = bbox.height + node.padding;
+  var points = [{
+    x: -h / 2,
+    y: 0
+  }, {
+    x: w,
+    y: 0
+  }, {
+    x: w,
+    y: -h
+  }, {
+    x: -h / 2,
+    y: -h
+  }, {
+    x: 0,
+    y: -h / 2
+  }];
+  var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["insertPolygonShape"])(shapeSvg, w, h, points);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, el);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].polygon(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var lean_right = function lean_right(parent, node) {
+  var _labelHelper4 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper4.shapeSvg,
+      bbox = _labelHelper4.bbox;
+
+  var w = bbox.width + node.padding;
+  var h = bbox.height + node.padding;
+  var points = [{
+    x: -2 * h / 6,
+    y: 0
+  }, {
+    x: w - h / 6,
+    y: 0
+  }, {
+    x: w + 2 * h / 6,
+    y: -h
+  }, {
+    x: h / 6,
+    y: -h
+  }];
+  var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["insertPolygonShape"])(shapeSvg, w, h, points);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, el);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].polygon(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var lean_left = function lean_left(parent, node) {
+  var _labelHelper5 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper5.shapeSvg,
+      bbox = _labelHelper5.bbox;
+
+  var w = bbox.width + node.padding;
+  var h = bbox.height + node.padding;
+  var points = [{
+    x: 2 * h / 6,
+    y: 0
+  }, {
+    x: w + h / 6,
+    y: 0
+  }, {
+    x: w - 2 * h / 6,
+    y: -h
+  }, {
+    x: -h / 6,
+    y: -h
+  }];
+  var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["insertPolygonShape"])(shapeSvg, w, h, points);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, el);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].polygon(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var trapezoid = function trapezoid(parent, node) {
+  var _labelHelper6 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper6.shapeSvg,
+      bbox = _labelHelper6.bbox;
+
+  var w = bbox.width + node.padding;
+  var h = bbox.height + node.padding;
+  var points = [{
+    x: -2 * h / 6,
+    y: 0
+  }, {
+    x: w + 2 * h / 6,
+    y: 0
+  }, {
+    x: w - h / 6,
+    y: -h
+  }, {
+    x: h / 6,
+    y: -h
+  }];
+  var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["insertPolygonShape"])(shapeSvg, w, h, points);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, el);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].polygon(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var inv_trapezoid = function inv_trapezoid(parent, node) {
+  var _labelHelper7 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper7.shapeSvg,
+      bbox = _labelHelper7.bbox;
+
+  var w = bbox.width + node.padding;
+  var h = bbox.height + node.padding;
+  var points = [{
+    x: h / 6,
+    y: 0
+  }, {
+    x: w - h / 6,
+    y: 0
+  }, {
+    x: w + 2 * h / 6,
+    y: -h
+  }, {
+    x: -2 * h / 6,
+    y: -h
+  }];
+  var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["insertPolygonShape"])(shapeSvg, w, h, points);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, el);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].polygon(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var rect_right_inv_arrow = function rect_right_inv_arrow(parent, node) {
+  var _labelHelper8 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper8.shapeSvg,
+      bbox = _labelHelper8.bbox;
+
+  var w = bbox.width + node.padding;
+  var h = bbox.height + node.padding;
+  var points = [{
+    x: 0,
+    y: 0
+  }, {
+    x: w + h / 2,
+    y: 0
+  }, {
+    x: w,
+    y: -h / 2
+  }, {
+    x: w + h / 2,
+    y: -h
+  }, {
+    x: 0,
+    y: -h
+  }];
+  var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["insertPolygonShape"])(shapeSvg, w, h, points);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, el);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].polygon(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var cylinder = function cylinder(parent, node) {
+  var _labelHelper9 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper9.shapeSvg,
+      bbox = _labelHelper9.bbox;
+
+  var w = bbox.width + node.padding;
+  var rx = w / 2;
+  var ry = rx / (2.5 + w / 50);
+  var h = bbox.height + ry + node.padding;
+  var shape = 'M 0,' + ry + ' a ' + rx + ',' + ry + ' 0,0,0 ' + w + ' 0 a ' + rx + ',' + ry + ' 0,0,0 ' + -w + ' 0 l 0,' + h + ' a ' + rx + ',' + ry + ' 0,0,0 ' + w + ' 0 l 0,' + -h;
+  var el = shapeSvg.attr('label-offset-y', ry).insert('path', ':first-child').attr('d', shape).attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2 + ry) + ')');
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, el);
+
+  node.intersect = function (point) {
+    var pos = _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].rect(node, point);
+    var x = pos.x - node.x;
+
+    if (rx != 0 && (Math.abs(x) < node.width / 2 || Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry)) {
+      // ellipsis equation: x*x / a*a + y*y / b*b = 1
+      // solve for y to get adjustion value for pos.y
+      var y = ry * ry * (1 - x * x / (rx * rx));
+      if (y != 0) y = Math.sqrt(y);
+      y = ry - y;
+      if (point.y - node.y > 0) y = -y;
+      pos.y += y;
+    }
+
+    return pos;
+  };
+
+  return shapeSvg;
+};
+
+var rect = function rect(parent, node) {
+  var _labelHelper10 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, 'node ' + node.classes, true),
+      shapeSvg = _labelHelper10.shapeSvg,
+      bbox = _labelHelper10.bbox,
+      halfPadding = _labelHelper10.halfPadding;
+
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].trace('Classes = ', node.classes); // add the rect
+
+  var rect = shapeSvg.insert('rect', ':first-child');
+  rect.attr('class', 'basic label-container').attr('rx', node.rx).attr('ry', node.ry).attr('x', -bbox.width / 2 - halfPadding).attr('y', -bbox.height / 2 - halfPadding).attr('width', bbox.width + node.padding).attr('height', bbox.height + node.padding);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, rect);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].rect(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var rectWithTitle = function rectWithTitle(parent, node) {
+  // const { shapeSvg, bbox, halfPadding } = labelHelper(parent, node, 'node ' + node.classes);
+  var classes;
+
+  if (!node.classes) {
+    classes = 'node default';
+  } else {
+    classes = 'node ' + node.classes;
+  } // Add outer g element
+
+
+  var shapeSvg = parent.insert('g').attr('class', classes).attr('id', node.id); // Create the title label and insert it after the rect
+
+  var rect = shapeSvg.insert('rect', ':first-child'); // const innerRect = shapeSvg.insert('rect');
+
+  var innerLine = shapeSvg.insert('line');
+  var label = shapeSvg.insert('g').attr('class', 'label');
+  var text2 = node.labelText.flat();
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('Label text', text2[0]);
+  var text = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_5__["default"])(text2[0], node.labelStyle, true, true));
+  var bbox;
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"])().flowchart.htmlLabels) {
+    var div = text.children[0];
+    var dv = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(text);
+    bbox = div.getBoundingClientRect();
+    dv.attr('width', bbox.width);
+    dv.attr('height', bbox.height);
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('Text 2', text2);
+  var textRows = text2.slice(1, text2.length);
+  var titleBox = text.getBBox();
+  var descr = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_5__["default"])(textRows.join('<br/>'), node.labelStyle, true, true));
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"])().flowchart.htmlLabels) {
+    var _div = descr.children[0];
+
+    var _dv = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(descr);
+
+    bbox = _div.getBoundingClientRect();
+
+    _dv.attr('width', bbox.width);
+
+    _dv.attr('height', bbox.height);
+  } // bbox = label.getBBox();
+  // logger.info(descr);
+
+
+  var halfPadding = node.padding / 2;
+  Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(descr).attr('transform', 'translate( ' + ( // (titleBox.width - bbox.width) / 2 +
+  bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) + ', ' + (titleBox.height + halfPadding + 5) + ')');
+  Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(text).attr('transform', 'translate( ' + ( // (titleBox.width - bbox.width) / 2 +
+  bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) + ', ' + 0 + ')'); // Get the size of the label
+  // Bounding box for title and text
+
+  bbox = label.node().getBBox(); // Center the label
+
+  label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + (-bbox.height / 2 - halfPadding + 3) + ')');
+  rect.attr('class', 'outer title-state').attr('x', -bbox.width / 2 - halfPadding).attr('y', -bbox.height / 2 - halfPadding).attr('width', bbox.width + node.padding).attr('height', bbox.height + node.padding);
+  innerLine.attr('class', 'divider').attr('x1', -bbox.width / 2 - halfPadding).attr('x2', bbox.width / 2 + halfPadding).attr('y1', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding).attr('y2', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, rect);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].rect(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var stadium = function stadium(parent, node) {
+  var _labelHelper11 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper11.shapeSvg,
+      bbox = _labelHelper11.bbox;
+
+  var h = bbox.height + node.padding;
+  var w = bbox.width + h / 4 + node.padding; // add the rect
+
+  var rect = shapeSvg.insert('rect', ':first-child').attr('rx', h / 2).attr('ry', h / 2).attr('x', -w / 2).attr('y', -h / 2).attr('width', w).attr('height', h);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, rect);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].rect(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var circle = function circle(parent, node) {
+  var _labelHelper12 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper12.shapeSvg,
+      bbox = _labelHelper12.bbox,
+      halfPadding = _labelHelper12.halfPadding;
+
+  var circle = shapeSvg.insert('circle', ':first-child'); // center the circle around its coordinate
+
+  circle.attr('rx', node.rx).attr('ry', node.ry).attr('r', bbox.width / 2 + halfPadding).attr('width', bbox.width + node.padding).attr('height', bbox.height + node.padding);
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('Circle main');
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, circle);
+
+  node.intersect = function (point) {
+    _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('Circle intersect', node, bbox.width / 2 + halfPadding, point);
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].circle(node, bbox.width / 2 + halfPadding, point);
+  };
+
+  return shapeSvg;
+};
+
+var subroutine = function subroutine(parent, node) {
+  var _labelHelper13 = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["labelHelper"])(parent, node, undefined, true),
+      shapeSvg = _labelHelper13.shapeSvg,
+      bbox = _labelHelper13.bbox;
+
+  var w = bbox.width + node.padding;
+  var h = bbox.height + node.padding;
+  var points = [{
+    x: 0,
+    y: 0
+  }, {
+    x: w,
+    y: 0
+  }, {
+    x: w,
+    y: -h
+  }, {
+    x: 0,
+    y: -h
+  }, {
+    x: 0,
+    y: 0
+  }, {
+    x: -8,
+    y: 0
+  }, {
+    x: w + 8,
+    y: 0
+  }, {
+    x: w + 8,
+    y: -h
+  }, {
+    x: -8,
+    y: -h
+  }, {
+    x: -8,
+    y: 0
+  }];
+  var el = Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["insertPolygonShape"])(shapeSvg, w, h, points);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, el);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].polygon(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var start = function start(parent, node) {
+  var shapeSvg = parent.insert('g').attr('class', 'node default').attr('id', node.id);
+  var circle = shapeSvg.insert('circle', ':first-child'); // center the circle around its coordinate
+
+  circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, circle);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].circle(node, 7, point);
+  };
+
+  return shapeSvg;
+};
+
+var forkJoin = function forkJoin(parent, node, dir) {
+  var shapeSvg = parent.insert('g').attr('class', 'node default').attr('id', node.id);
+  var width = 70;
+  var height = 10;
+
+  if (dir === 'LR') {
+    width = 10;
+    height = 70;
+  }
+
+  var shape = shapeSvg.append('rect').style('stroke', 'black').style('fill', 'black').attr('x', -1 * width / 2).attr('y', -1 * height / 2).attr('width', width).attr('height', height).attr('class', 'fork-join');
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, shape);
+  node.height = node.height + node.padding / 2;
+  node.width = node.width + node.padding / 2;
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].rect(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var end = function end(parent, node) {
+  var shapeSvg = parent.insert('g').attr('class', 'node default').attr('id', node.id);
+  var innerCircle = shapeSvg.insert('circle', ':first-child');
+  var circle = shapeSvg.insert('circle', ':first-child');
+  circle.attr('class', 'state-start').attr('r', 7).attr('width', 14).attr('height', 14);
+  innerCircle.attr('class', 'state-end').attr('r', 5).attr('width', 10).attr('height', 10);
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, circle);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].circle(node, 7, point);
+  };
+
+  return shapeSvg;
+};
+
+var class_box = function class_box(parent, node) {
+  var halfPadding = node.padding / 2;
+  var rowPadding = 4;
+  var lineHeight = 8;
+  var classes;
+
+  if (!node.classes) {
+    classes = 'node default';
+  } else {
+    classes = 'node ' + node.classes;
+  } // Add outer g element
+
+
+  var shapeSvg = parent.insert('g').attr('class', classes).attr('id', node.id); // Create the title label and insert it after the rect
+
+  var rect = shapeSvg.insert('rect', ':first-child');
+  var topLine = shapeSvg.insert('line');
+  var bottomLine = shapeSvg.insert('line');
+  var maxWidth = 0;
+  var maxHeight = rowPadding;
+  var labelContainer = shapeSvg.insert('g').attr('class', 'label');
+  var verticalPos = 0;
+  var hasInterface = node.classData.annotations && node.classData.annotations[0]; // 1. Create the labels
+
+  var interfaceLabel = labelContainer.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_5__["default"])(node.classData.annotations[0], node.labelStyle, true, true));
+  var interfaceBBox = interfaceLabel.getBBox();
+
+  if (node.classData.annotations[0]) {
+    maxHeight += interfaceBBox.height + rowPadding;
+    maxWidth += interfaceBBox.width;
+  }
+
+  var classTitleLabel = labelContainer.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_5__["default"])(node.labelText, node.labelStyle, true, true));
+  var classTitleBBox = classTitleLabel.getBBox();
+  maxHeight += classTitleBBox.height + rowPadding;
+
+  if (classTitleBBox.width > maxWidth) {
+    maxWidth = classTitleBBox.width;
+  }
+
+  var classAttributes = [];
+  node.classData.members.forEach(function (str) {
+    var lbl = labelContainer.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_5__["default"])(str, node.labelStyle, true, true));
+    var bbox = lbl.getBBox();
+
+    if (bbox.width > maxWidth) {
+      maxWidth = bbox.width;
+    }
+
+    maxHeight += bbox.height + rowPadding;
+    classAttributes.push(lbl);
+  });
+  var classMethods = [];
+  node.classData.methods.forEach(function (str) {
+    var lbl = labelContainer.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_5__["default"])(str, node.labelStyle, true, true));
+    var bbox = lbl.getBBox();
+
+    if (bbox.width > maxWidth) {
+      maxWidth = bbox.width;
+    }
+
+    maxHeight += bbox.height + rowPadding;
+    classMethods.push(lbl);
+  });
+  maxHeight += lineHeight; // 2. Position the labels
+  // position the interface label
+
+  if (hasInterface) {
+    Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(interfaceLabel).attr('transform', 'translate( ' + -(maxWidth + node.padding - interfaceBBox.width / 2) / 2 + ', ' + -1 * maxHeight / 2 + ')');
+    verticalPos = interfaceBBox.height + rowPadding;
+  } // Positin the class title label
+
+
+  var diffX = (maxWidth - classTitleBBox.width) / 2;
+  Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(classTitleLabel).attr('transform', 'translate( ' + (-1 * maxWidth / 2 + diffX) + ', ' + (-1 * maxHeight / 2 + verticalPos) + ')');
+  verticalPos += classTitleBBox.height + rowPadding;
+  topLine.attr('class', 'divider').attr('x1', -maxWidth / 2 - halfPadding).attr('x2', maxWidth / 2 + halfPadding).attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos).attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);
+  verticalPos += lineHeight;
+  classAttributes.forEach(function (lbl) {
+    Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(lbl).attr('transform', 'translate( ' + -maxWidth / 2 + ', ' + (-1 * maxHeight / 2 + verticalPos + lineHeight / 2) + ')');
+    verticalPos += classTitleBBox.height + rowPadding;
+  });
+  bottomLine.attr('class', 'divider').attr('x1', -maxWidth / 2 - halfPadding).attr('x2', maxWidth / 2 + halfPadding).attr('y1', -maxHeight / 2 - halfPadding + lineHeight + verticalPos).attr('y2', -maxHeight / 2 - halfPadding + lineHeight + verticalPos);
+  verticalPos += lineHeight;
+  classMethods.forEach(function (lbl) {
+    Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(lbl).attr('transform', 'translate( ' + -maxWidth / 2 + ', ' + (-1 * maxHeight / 2 + verticalPos) + ')');
+    verticalPos += classTitleBBox.height + rowPadding;
+  }); //
+
+  var bbox;
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"])().flowchart.htmlLabels) {
+    var div = interfaceLabel.children[0];
+    var dv = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(interfaceLabel);
+    bbox = div.getBoundingClientRect();
+    dv.attr('width', bbox.width);
+    dv.attr('height', bbox.height);
+  } // bbox = labelContainer.getBBox();
+  // logger.info('Text 2', text2);
+  // const textRows = text2.slice(1, text2.length);
+  // let titleBox = text.getBBox();
+  // const descr = label
+  //   .node()
+  //   .appendChild(createLabel(textRows.join('<br/>'), node.labelStyle, true, true));
+  // if (getConfig().flowchart.htmlLabels) {
+  //   const div = descr.children[0];
+  //   const dv = select(descr);
+  //   bbox = div.getBoundingClientRect();
+  //   dv.attr('width', bbox.width);
+  //   dv.attr('height', bbox.height);
+  // }
+  // // bbox = label.getBBox();
+  // // logger.info(descr);
+  // select(descr).attr(
+  //   'transform',
+  //   'translate( ' +
+  //     // (titleBox.width - bbox.width) / 2 +
+  //     (bbox.width > titleBox.width ? 0 : (titleBox.width - bbox.width) / 2) +
+  //     ', ' +
+  //     (titleBox.height + halfPadding + 5) +
+  //     ')'
+  // );
+  // select(text).attr(
+  //   'transform',
+  //   'translate( ' +
+  //     // (titleBox.width - bbox.width) / 2 +
+  //     (bbox.width < titleBox.width ? 0 : -(titleBox.width - bbox.width) / 2) +
+  //     ', ' +
+  //     0 +
+  //     ')'
+  // );
+  // // Get the size of the label
+  // // Bounding box for title and text
+  // bbox = label.node().getBBox();
+  // // Center the label
+  // label.attr(
+  //   'transform',
+  //   'translate(' + -bbox.width / 2 + ', ' + (-bbox.height / 2 - halfPadding + 3) + ')'
+  // );
+
+
+  rect.attr('class', 'outer title-state').attr('x', -maxWidth / 2 - halfPadding).attr('y', -(maxHeight / 2) - halfPadding).attr('width', maxWidth + node.padding).attr('height', maxHeight + node.padding); // innerLine
+  //   .attr('class', 'divider')
+  //   .attr('x1', -bbox.width / 2 - halfPadding)
+  //   .attr('x2', bbox.width / 2 + halfPadding)
+  //   .attr('y1', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding)
+  //   .attr('y2', -bbox.height / 2 - halfPadding + titleBox.height + halfPadding);
+
+  Object(_shapes_util__WEBPACK_IMPORTED_MODULE_2__["updateNodeBounds"])(node, rect);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].rect(node, point);
+  };
+
+  return shapeSvg;
+};
+
+var shapes = {
+  question: question,
+  rect: rect,
+  rectWithTitle: rectWithTitle,
+  circle: circle,
+  stadium: stadium,
+  hexagon: hexagon,
+  rect_left_inv_arrow: rect_left_inv_arrow,
+  lean_right: lean_right,
+  lean_left: lean_left,
+  trapezoid: trapezoid,
+  inv_trapezoid: inv_trapezoid,
+  rect_right_inv_arrow: rect_right_inv_arrow,
+  cylinder: cylinder,
+  start: start,
+  end: end,
+  note: _shapes_note__WEBPACK_IMPORTED_MODULE_6__["default"],
+  subroutine: subroutine,
+  fork: forkJoin,
+  join: forkJoin,
+  class_box: class_box
+};
+var nodeElems = {};
+var insertNode = function insertNode(elem, node, dir) {
+  nodeElems[node.id] = shapes[node.shape](elem, node, dir);
+};
+var setNodeElem = function setNodeElem(elem, node) {
+  nodeElems[node.id] = elem;
+};
+var clear = function clear() {
+  nodeElems = {};
+};
+var positionNode = function positionNode(node) {
+  var el = nodeElems[node.id];
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].trace('Transforming node', node, 'translate(' + (node.x - node.width / 2 - 5) + ', ' + (node.y - node.height / 2 - 5) + ')');
+  var padding = 8;
+
+  if (node.clusterNode) {
+    el.attr('transform', 'translate(' + (node.x - node.width / 2 - padding) + ', ' + (node.y - node.height / 2 - padding) + ')');
+  } else {
+    el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');
+  }
+};
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/shapes/note.js":
+/*!******************************************!*\
+  !*** ./src/dagre-wrapper/shapes/note.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ "./src/dagre-wrapper/shapes/util.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _intersect_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../intersect/index.js */ "./src/dagre-wrapper/intersect/index.js");
+
+ // eslint-disable-line
+
+
+
+var note = function note(parent, node) {
+  var _labelHelper = Object(_util__WEBPACK_IMPORTED_MODULE_0__["labelHelper"])(parent, node, 'node ' + node.classes, true),
+      shapeSvg = _labelHelper.shapeSvg,
+      bbox = _labelHelper.bbox,
+      halfPadding = _labelHelper.halfPadding;
+
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].info('Classes = ', node.classes); // add the rect
+
+  var rect = shapeSvg.insert('rect', ':first-child');
+  rect.attr('rx', node.rx).attr('ry', node.ry).attr('x', -bbox.width / 2 - halfPadding).attr('y', -bbox.height / 2 - halfPadding).attr('width', bbox.width + node.padding).attr('height', bbox.height + node.padding);
+  Object(_util__WEBPACK_IMPORTED_MODULE_0__["updateNodeBounds"])(node, rect);
+
+  node.intersect = function (point) {
+    return _intersect_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].rect(node, point);
+  };
+
+  return shapeSvg;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (note);
+
+/***/ }),
+
+/***/ "./src/dagre-wrapper/shapes/util.js":
+/*!******************************************!*\
+  !*** ./src/dagre-wrapper/shapes/util.js ***!
+  \******************************************/
+/*! exports provided: labelHelper, updateNodeBounds, insertPolygonShape */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "labelHelper", function() { return labelHelper; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateNodeBounds", function() { return updateNodeBounds; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertPolygonShape", function() { return insertPolygonShape; });
+/* harmony import */ var _createLabel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../createLabel */ "./src/dagre-wrapper/createLabel.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+
+
+
+var labelHelper = function labelHelper(parent, node, _classes, isNode) {
+  var classes;
+
+  if (!_classes) {
+    classes = 'node default';
+  } else {
+    classes = _classes;
+  } // Add outer g element
+
+
+  var shapeSvg = parent.insert('g').attr('class', classes).attr('id', node.id); // Create the label and insert it after the rect
+
+  var label = shapeSvg.insert('g').attr('class', 'label');
+  var text = label.node().appendChild(Object(_createLabel__WEBPACK_IMPORTED_MODULE_0__["default"])(node.labelText, node.labelStyle, false, isNode)); // Get the size of the label
+
+  var bbox = text.getBBox();
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_1__["getConfig"])().flowchart.htmlLabels) {
+    var div = text.children[0];
+    var dv = Object(d3__WEBPACK_IMPORTED_MODULE_2__["select"])(text);
+    bbox = div.getBoundingClientRect();
+    dv.attr('width', bbox.width);
+    dv.attr('height', bbox.height);
+  }
+
+  var halfPadding = node.padding / 2; // Center the label
+
+  label.attr('transform', 'translate(' + -bbox.width / 2 + ', ' + -bbox.height / 2 + ')');
+  return {
+    shapeSvg: shapeSvg,
+    bbox: bbox,
+    halfPadding: halfPadding,
+    label: label
+  };
+};
+var updateNodeBounds = function updateNodeBounds(node, element) {
+  var bbox = element.node().getBBox();
+  node.width = bbox.width;
+  node.height = bbox.height;
+};
+function insertPolygonShape(parent, w, h, points) {
+  return parent.insert('polygon', ':first-child').attr('points', points.map(function (d) {
+    return d.x + ',' + d.y;
+  }).join(' ')).attr('class', 'label-container').attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');
+}
+
+/***/ }),
+
+/***/ "./src/defaultConfig.js":
+/*!******************************!*\
+  !*** ./src/defaultConfig.js ***!
+  \******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _themes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./themes */ "./src/themes/index.js");
+
+/**
+ * **Configuration methods in Mermaid version 8.6.0 have been updated, to learn more[[click here](8.6.0_docs.md)].**
+ *
+ * ## **What follows are config instructions for older versions**
+ * These are the default options which can be overridden with the initialization call like so:
+ * **Example 1:**
+ * <pre>
+ * mermaid.initialize({
+ *   flowchart:{
+ *     htmlLabels: false
+ *   }
+ * });
+ * </pre>
+ *
+ * **Example 2:**
+ * <pre>
+ * &lt;script>
+ *   var config = {
+ *     startOnLoad:true,
+ *     flowchart:{
+ *       useMaxWidth:true,
+ *       htmlLabels:true,
+ *       curve:'cardinal',
+ *     },
+ *
+ *     securityLevel:'loose',
+ *   };
+ *   mermaid.initialize(config);
+ * &lt;/script>
+ * </pre>
+ * A summary of all options and their defaults is found [here](#mermaidapi-configuration-defaults). A description of each option follows below.
+ *
+ * @name Configuration
+ */
+
+var config = {
+  /** theme , the CSS style sheet
+   *
+   * theme , the CSS style sheet
+   *
+   *| Parameter | Description |Type | Required | Values|
+   *| --- | --- | --- | --- | --- |
+   *| Theme |Built in Themes| String | Optional | Values include, default, forest, dark, neutral, null|
+   *
+   ***Notes:**To disable any pre-defined mermaid theme, use "null".
+   * <pre>
+   *  "theme": "forest",
+   *  "themeCSS": ".node rect { fill: red; }"
+   * </pre>
+   */
+  theme: 'default',
+  themeVariables: _themes__WEBPACK_IMPORTED_MODULE_0__["default"]['default'].getThemeVariables(),
+  themeCSS: undefined,
+
+  /* **maxTextSize** - The maximum allowed size of the users text diamgram */
+  maxTextSize: 50000,
+
+  /**
+   *| Parameter | Description |Type | Required | Values|
+   *| --- | --- | --- | --- | --- |
+   *|fontFamily | specifies the font to be used in the rendered diagrams| String | Required | Verdana, Arial, Trebuchet MS,|
+   *
+   ***notes: Default value is \\"trebuchet ms\\".
+   */
+  fontFamily: '"trebuchet ms", verdana, arial;',
+
+  /**
+   *| Parameter | Description |Type | Required | Values|
+   *| --- | --- | --- | --- | --- |
+   *| logLevel |This option decides the amount of logging to be used.| String | Required | 1, 2, 3, 4, 5 |
+   *
+   *
+   ***Notes:**
+   *-   debug: 1.
+   *-   info: 2.
+   *-   warn: 3.
+   *-   error: 4.
+   *-   fatal: 5(default).
+   */
+  logLevel: 5,
+
+  /**
+   *| Parameter | Description |Type | Required | Values|
+   *| --- | --- | --- | --- | --- |
+   *| securitylevel | Level of trust for parsed diagram|String | Required | Strict, Loose, antiscript |
+   *
+   ***Notes:
+   *-   **strict**: (**default**) tags in text are encoded, click functionality is disabeled
+   *-   **loose**: tags in text are allowed, click functionality is enabled
+   *-   **antiscript**: html tags in text are allowed, (only script element is removed), click functionality is enabled
+   */
+  securityLevel: 'strict',
+
+  /**
+   *| Parameter | Description |Type | Required | Values|
+   *| --- | --- | --- | --- | --- |
+   *| startOnLoad| Dictates whether mermaind starts on Page load | Boolean | Required | True, False |
+   *
+   ***Notes:**
+   ***Default value: true**
+   */
+  startOnLoad: true,
+
+  /**
+   *| Parameter | Description |Type | Required |Values|
+   *| --- | --- | --- | --- | --- |
+   *| arrowMarkerAbsolute | Controls whether or arrow markers in html code are absolute paths or anchors | Boolean | Required |  True, False |
+   *
+   *
+   *## Notes**: This matters if you are using base tag settings.
+   ***Default value: false**.
+   */
+  arrowMarkerAbsolute: false,
+
+  /**
+   * This option controls which currentConfig keys are considered _secure_ and can only be changed via
+   * call to mermaidAPI.initialize. Calls to mermaidAPI.reinitialize cannot make changes to
+   * the `secure` keys in the current currentConfig. This prevents malicious graph directives from
+   * overriding a site's default security.
+   */
+  secure: ['secure', 'securityLevel', 'startOnLoad', 'maxTextSize'],
+
+  /**
+   * The object containing configurations specific for flowcharts
+   */
+  flowchart: {
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| diagramPadding | amount of padding around the diagram as a whole | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**The amount of padding around the diagram as a whole so that embedded diagrams have margins, expressed in pixels
+     ***Default value: 8**.
+     */
+    diagramPadding: 8,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| htmlLabels | Flag for setting whether or not a html tag should be used for rendering labels on the edges. | Boolean| Required | True, False|
+     *
+     ***Notes: Default value: true**.
+     */
+    htmlLabels: true,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| nodeSpacing | Defines the spacing between nodes on the same level | Integer| Required | Any positive Numbers |
+     *
+     ***Notes:
+     *Pertains to horizontal spacing for TB (top to bottom) or BT (bottom to top) graphs, and the vertical spacing for LR as well as RL graphs.**
+     ***Default value 50**.
+     */
+    nodeSpacing: 50,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| rankSpacing | Defines the spacing between nodes on different levels | Integer | Required| Any Positive Numbers |
+     *
+     ***Notes: pertains to vertical spacing for TB (top to bottom) or BT (bottom to top), and the horizontal spacing for LR as well as RL graphs.
+     ***Default value 50**.
+     */
+    rankSpacing: 50,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| curve | Defines how mermaid renders curves for flowcharts. | String | Required | Basis, Linear, Cardinal|
+     *
+     ***Notes:
+     *Default Vaue: Linear**
+     */
+    curve: 'linear',
+    // Only used in new experimental rendering
+    // repreesents the padding between the labels and the shape
+    padding: 15
+  },
+
+  /**
+   * The object containing configurations specific for sequence diagrams
+   */
+  sequence: {
+    /**
+     * widt of the activation rect
+     * **Default value 10**.
+     */
+    activationWidth: 10,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| diagramMarginX | margin to the right and left of the sequence diagram | Integer | Required | Any Positive Values |
+     *
+     ***Notes:**
+     ***Default value 50**.
+     */
+    diagramMarginX: 50,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| diagramMarginY | Margin to the over and under the sequence diagram | Integer | Required | Any Positive Values|
+     *
+     ***Notes:**
+     ***Default value 10**.
+     */
+    diagramMarginY: 10,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| actorMargin | Margin between actors. | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 50**.
+     */
+    actorMargin: 50,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| width | Width of actor boxes | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 150**.
+     */
+    width: 150,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| height | Height of actor boxes | Integer | Required | Any Positive Value|
+     *
+     ***Notes:**
+     ***Default value 65**..
+     */
+    height: 65,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     *
+     ***Default value 10**.
+     */
+    boxMargin: 10,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| boxTextMargin| margin around the text in loop/alt/opt boxes | Integer | Required| Any Positive Value|
+     *
+     ***Notes:**
+     *
+     ***Default value 5**.
+     */
+    boxTextMargin: 5,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| noteMargin | margin around notes. | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     *
+     ***Default value 10**.
+     */
+    noteMargin: 10,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| messageMargin | Space between messages. | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     *
+     *Space between messages.
+     ***Default value 35**.
+     */
+    messageMargin: 35,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| messageAlign | Multiline message alignment | Integer | Required | left, center, right |
+     *
+     ***Notes:**center **default**
+     */
+    messageAlign: 'center',
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| mirrorActors | mirror actors under diagram. | Boolean| Required | True, False |
+     *
+     ***Notes:**
+     *
+     ***Default value true**.
+     */
+    mirrorActors: true,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| bottomMarginAdj | Prolongs the edge of the diagram downwards. | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**Depending on css styling this might need adjustment.
+     ***Default value 1**.
+     */
+    bottomMarginAdj: 1,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| useMaxWidth | See Notes | Boolean | Required | True, False |
+     *
+     ***Notes:**
+     *when this flag is set to true, the height and width is set to 100% and is then scaling with the
+     *available space. If set to false, the absolute space required is used.
+     ***Default value: True**.
+     */
+    useMaxWidth: true,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| rightAngles | display curve arrows as right angles| Boolean | Required | True, False |
+     *
+     ***Notes:**
+     *
+     *This will display arrows that start and begin at the same node as right angles, rather than a curve
+     ***Default value false**.
+     */
+    rightAngles: false,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| showSequenceNumbers | This will show the node numbers | Boolean | Required | True, False |
+     *
+     ***Notes:**
+     ***Default value false**.
+     */
+    showSequenceNumbers: false,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| actorFontSize| This sets the font size of the actor's description | Integer | Require | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 14**..
+     */
+    actorFontSize: 14,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| actorFontFamily |This sets the font family of the actor's description | 3 | 4 | Open-Sans, Sans-Serif |
+     *
+     ***Notes:**
+     ***Default value "Open-Sans", "sans-serif"**.
+     */
+    actorFontFamily: '"Open-Sans", "sans-serif"',
+
+    /**
+     * This sets the font weight of the actor's description
+     * **Default value 400.
+     */
+    actorFontWeight: 400,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| noteFontSize |This sets the font size of actor-attached notes. | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 14**..
+     */
+    noteFontSize: 14,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| noteFontFamily| This sets the font family of actor-attached notes. | String | Required |  trebuchet ms, verdana, arial |
+     *
+     ***Notes:**
+     ***Default value: trebuchet ms **.
+     */
+    noteFontFamily: '"trebuchet ms", verdana, arial',
+
+    /**
+     * This sets the font weight of the note's description
+     * **Default value 400.
+     */
+    noteFontWeight: 400,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| noteAlign | This sets the text alignment of actor-attached notes. | string | required | left, center, right|
+     *
+     ***Notes:**
+     ***Default value center**.
+     */
+    noteAlign: 'center',
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| messageFontSize | This sets the font size of actor messages. | Integer | Required | Any Positive Number |
+     *
+     ***Notes:**
+     ***Default value 16**.
+     */
+    messageFontSize: 16,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| messageFontFamily | This sets the font family of actor messages. | String| Required | trebuchet ms", verdana, aria |
+     *
+     ***Notes:**
+     ***Default value:"trebuchet ms**.
+     */
+    messageFontFamily: '"trebuchet ms", verdana, arial',
+
+    /**
+     * This sets the font weight of the message's description
+     * **Default value 400.
+     */
+    messageFontWeight: 400,
+
+    /**
+     * This sets the auto-wrap state for the diagram
+     * **Default value false.
+     */
+    wrap: false,
+
+    /**
+     * This sets the auto-wrap padding for the diagram (sides only)
+     * **Default value 10.
+     */
+    wrapPadding: 10,
+
+    /**
+     * This sets the width of the loop-box (loop, alt, opt, par)
+     * **Default value 50.
+     */
+    labelBoxWidth: 50,
+
+    /**
+     * This sets the height of the loop-box (loop, alt, opt, par)
+     * **Default value 20.
+     */
+    labelBoxHeight: 20,
+    messageFont: function messageFont() {
+      return {
+        fontFamily: this.messageFontFamily,
+        fontSize: this.messageFontSize,
+        fontWeight: this.messageFontWeight
+      };
+    },
+    noteFont: function noteFont() {
+      return {
+        fontFamily: this.noteFontFamily,
+        fontSize: this.noteFontSize,
+        fontWeight: this.noteFontWeight
+      };
+    },
+    actorFont: function actorFont() {
+      return {
+        fontFamily: this.actorFontFamily,
+        fontSize: this.actorFontSize,
+        fontWeight: this.actorFontWeight
+      };
+    }
+  },
+
+  /**
+   * The object containing configurations specific for gantt diagrams*
+   */
+  gantt: {
+    /**
+     *### titleTopMargin
+     *
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| titleTopMargin | Margin top for the text over the gantt diagram | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 25**.
+     */
+    titleTopMargin: 25,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| barHeight | The height of the bars in the graph | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 20**.
+     */
+    barHeight: 20,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| barGap | The margin between the different activities in the gantt diagram. | Integer | Optional |Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 4**.
+     */
+    barGap: 4,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| topPadding | Margin between title and gantt diagram and between axis and gantt diagram. | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 50**.
+     */
+    topPadding: 50,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| leftPadding | The space allocated for the section name to the left of the activities. | Integer| Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 75**.
+     */
+    leftPadding: 75,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| gridLineStartPadding | Vertical starting position of the grid lines. | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 35**.
+     */
+    gridLineStartPadding: 35,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| fontSize | Font size| Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 11**.
+     */
+    fontSize: 11,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| fontFamily | font Family | string | required |"Open-Sans", "sans-serif" |
+     *
+     ***Notes:**
+     *
+     ***Default value '"Open-Sans", "sans-serif"'**.
+     */
+    fontFamily: '"Open-Sans", "sans-serif"',
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| numberSectionStyles | The number of alternating section styles | Integer | 4 | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 4**.
+     */
+    numberSectionStyles: 4,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| axisFormat | Datetime format of the axis. | 3 | Required | Date in yy-mm-dd |
+     *
+     ***Notes:**
+     *
+     * This might need adjustment to match your locale and preferences
+     ***Default value '%Y-%m-%d'**.
+     */
+    axisFormat: '%Y-%m-%d'
+  },
+
+  /**
+   * The object containing configurations specific for journey diagrams
+   */
+  journey: {
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| diagramMarginX | margin to the right and left of the sequence diagram | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 50**.
+     */
+    diagramMarginX: 50,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| diagramMarginY | margin to the over and under the sequence diagram. | Integer | Required | Any Positive Value|
+     *
+     ***Notes:**
+     ***Default value 10**..
+     */
+    diagramMarginY: 10,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| actorMargin | Margin between actors. | Integer | Required | Any Positive Value|
+     *
+     ***Notes:**
+     ***Default value 50**.
+     */
+    actorMargin: 50,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| width | Width of actor boxes | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 150**.
+     */
+    width: 150,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| height | Height of actor boxes | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 65**.
+     */
+    height: 65,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 10**.
+     */
+    boxMargin: 10,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| boxTextMargin | margin around the text in loop/alt/opt boxes | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     */
+    boxTextMargin: 5,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| noteMargin | margin around notes. | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     ***Default value 10**.
+     */
+    noteMargin: 10,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| messageMargin |Space between messages. | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**
+     *
+     *Space between messages.
+     ***Default value 35**.
+     */
+    messageMargin: 35,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| messageAlign |Multiline message alignment | 3 | 4 | left, center, right |
+     *
+     ***Notes:**default:center**
+     */
+    messageAlign: 'center',
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| bottomMarginAdj | Prolongs the edge of the diagram downwards. | Integer | 4 | Any Positive Value |
+     *
+     ***Notes:**Depending on css styling this might need adjustment.
+     ***Default value 1**.
+     */
+    bottomMarginAdj: 1,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| useMaxWidth | See notes | Boolean | 4 | True, False |
+     *
+     ***Notes:**when this flag is set the height and width is set to 100% and is then scaling with the
+     *available space if not the absolute space required is used.
+     *
+     ***Default value true**.
+     */
+    useMaxWidth: true,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| rightAngles | Curved Arrows become Right Angles,  | 3 | 4 | True, False |
+     *
+     ***Notes:**This will display arrows that start and begin at the same node as right angles, rather than a curves
+     ***Default value false**.
+     */
+    rightAngles: false
+  },
+  class: {
+    arrowMarkerAbsolute: false
+  },
+  git: {
+    arrowMarkerAbsolute: false
+  },
+  state: {
+    dividerMargin: 10,
+    sizeUnit: 5,
+    padding: 8,
+    textHeight: 10,
+    titleShift: -15,
+    noteMargin: 10,
+    forkWidth: 70,
+    forkHeight: 7,
+    // Used
+    miniPadding: 2,
+    // Font size factor, this is used to guess the width of the edges labels before rendering by dagre
+    // layout. This might need updating if/when switching font
+    fontSizeFactor: 5.02,
+    fontSize: 24,
+    labelHeight: 16,
+    edgeLengthFactor: '20',
+    compositTitleSize: 35,
+    radius: 5
+  },
+
+  /**
+   * The object containing configurations specific for entity relationship diagrams
+   */
+  er: {
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| diagramPadding | amount of padding around the diagram as a whole | Integer | Required | Any Positive Value |
+     *
+     ***Notes:**The amount of padding around the diagram as a whole so that embedded diagrams have margins, expressed in pixels
+     ***Default value: 20**.
+     */
+    diagramPadding: 20,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| layoutDirection | Directional bias for layout of entities. | String | Required | "TB", "BT","LR","RL" |
+     *
+     ***Notes:**
+     *'TB' for Top-Bottom, 'BT'for Bottom-Top, 'LR' for Left-Right, or 'RL' for Right to Left.
+     * T = top, B = bottom, L = left, and R = right.
+     ***Default value: TB **.
+     */
+    layoutDirection: 'TB',
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| minEntityWidth | The mimimum width of an entity box, | Integer | Required| Any Positive Value  |
+     *
+     ***Notes:**expressed in pixels
+     ***Default value: 100**.
+     */
+    minEntityWidth: 100,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| minEntityHeight| The minimum height of an entity box, | Integer | 4 | Any Positive Value |
+     *
+     ***Notes:**expressed in pixels
+     ***Default value: 75 **
+     */
+    minEntityHeight: 75,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| entityPadding|minimum internal padding betweentext in box and  box borders| Integer | 4 | Any Positive Value |
+     *
+     ***Notes:**The minimum internal padding betweentext in an entity box and the enclosing box borders, expressed in pixels.
+     ***Default value: 15 **
+     */
+    entityPadding: 15,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| stroke | Stroke color of box edges and lines | String | 4 | Any recognized color |
+     ***Default value: gray **
+     */
+    stroke: 'gray',
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| fill | Fill color of entity boxes | String | 4 | Any recognized color |
+     *
+     ***Notes:**
+     ***Default value:'honeydew'**
+     */
+    fill: 'honeydew',
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| fontSize| Font Size in pixels| Integer |  | Any Positive Value |
+     *
+     ***Notes:**Font size (expressed as an integer representing a number of pixels)
+     ***Default value: 12 **
+     */
+    fontSize: 12,
+
+    /**
+     *| Parameter | Description |Type | Required | Values|
+     *| --- | --- | --- | --- | --- |
+     *| useMaxWidth | See Notes | Boolean | Required | true, false |
+     *
+     ***Notes:**
+     *When this flag is set to true, the diagram width is locked to 100% and
+     *scaled based on available space. If set to false, the diagram reserves its
+     *absolute width.
+     ***Default value: true**.
+     */
+    useMaxWidth: true
+  }
+};
+config.class.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
+config.git.arrowMarkerAbsolute = config.arrowMarkerAbsolute;
+/* harmony default export */ __webpack_exports__["default"] = (config);
+
+/***/ }),
+
+/***/ "./src/diagrams/class/classDb.js":
+/*!***************************************!*\
+  !*** ./src/diagrams/class/classDb.js ***!
+  \***************************************/
+/*! exports provided: parseDirective, addClass, lookUpDomId, clear, getClass, getClasses, getRelations, addRelation, addAnnotation, addMember, addMembers, cleanupLabel, setCssClass, setLink, setClickEvent, bindFunctions, lineType, relationType, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseDirective", function() { return parseDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addClass", function() { return addClass; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lookUpDomId", function() { return lookUpDomId; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClass", function() { return getClass; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRelations", function() { return getRelations; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addRelation", function() { return addRelation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addAnnotation", function() { return addAnnotation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addMember", function() { return addMember; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addMembers", function() { return addMembers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cleanupLabel", function() { return cleanupLabel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setCssClass", function() { return setCssClass; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLink", function() { return setLink; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClickEvent", function() { return setClickEvent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindFunctions", function() { return bindFunctions; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineType", function() { return lineType; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relationType", function() { return relationType; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
+
+
+
+
+
+
+var MERMAID_DOM_ID_PREFIX = 'classid-';
+var config = _config__WEBPACK_IMPORTED_MODULE_2__["getConfig"]();
+var relations = [];
+var classes = {};
+var classCounter = 0;
+var funs = [];
+var parseDirective = function parseDirective(statement, context, type) {
+  _mermaidAPI__WEBPACK_IMPORTED_MODULE_5__["default"].parseDirective(this, statement, context, type);
+};
+
+var splitClassNameAndType = function splitClassNameAndType(id) {
+  var genericType = '';
+  var className = id;
+
+  if (id.indexOf('~') > 0) {
+    var split = id.split('~');
+    className = split[0];
+    genericType = split[1];
+  }
+
+  return {
+    className: className,
+    type: genericType
+  };
+};
+/**
+ * Function called by parser when a node definition has been found.
+ * @param id
+ * @public
+ */
+
+
+var addClass = function addClass(id) {
+  var classId = splitClassNameAndType(id); // Only add class if not exists
+
+  if (typeof classes[classId.className] !== 'undefined') return;
+  classes[classId.className] = {
+    id: classId.className,
+    type: classId.type,
+    cssClasses: [],
+    methods: [],
+    members: [],
+    annotations: [],
+    domId: MERMAID_DOM_ID_PREFIX + classId.className + '-' + classCounter
+  };
+  classCounter++;
+};
+/**
+ * Function to lookup domId from id in the graph definition.
+ * @param id
+ * @public
+ */
+
+var lookUpDomId = function lookUpDomId(id) {
+  var classKeys = Object.keys(classes);
+
+  for (var i = 0; i < classKeys.length; i++) {
+    if (classes[classKeys[i]].id === id) {
+      return classes[classKeys[i]].domId;
+    }
+  }
+};
+var clear = function clear() {
+  relations = [];
+  classes = {};
+  funs = [];
+  funs.push(setupToolTips);
+};
+var getClass = function getClass(id) {
+  return classes[id];
+};
+var getClasses = function getClasses() {
+  return classes;
+};
+var getRelations = function getRelations() {
+  return relations;
+};
+var addRelation = function addRelation(relation) {
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].debug('Adding relation: ' + JSON.stringify(relation));
+  addClass(relation.id1);
+  addClass(relation.id2);
+  relation.id1 = splitClassNameAndType(relation.id1).className;
+  relation.id2 = splitClassNameAndType(relation.id2).className;
+  relations.push(relation);
+};
+/**
+ * Adds an annotation to the specified class
+ * Annotations mark special properties of the given type (like 'interface' or 'service')
+ * @param className The class name
+ * @param annotation The name of the annotation without any brackets
+ * @public
+ */
+
+var addAnnotation = function addAnnotation(className, annotation) {
+  var validatedClassName = splitClassNameAndType(className).className;
+  classes[validatedClassName].annotations.push(annotation);
+};
+/**
+ * Adds a member to the specified class
+ * @param className The class name
+ * @param member The full name of the member.
+ * If the member is enclosed in <<brackets>> it is treated as an annotation
+ * If the member is ending with a closing bracket ) it is treated as a method
+ * Otherwise the member will be treated as a normal property
+ * @public
+ */
+
+var addMember = function addMember(className, member) {
+  var validatedClassName = splitClassNameAndType(className).className;
+  var theClass = classes[validatedClassName];
+
+  if (typeof member === 'string') {
+    // Member can contain white spaces, we trim them out
+    var memberString = member.trim();
+
+    if (memberString.startsWith('<<') && memberString.endsWith('>>')) {
+      // Remove leading and trailing brackets
+      theClass.annotations.push(memberString.substring(2, memberString.length - 2));
+    } else if (memberString.indexOf(')') > 0) {
+      theClass.methods.push(memberString);
+    } else if (memberString) {
+      theClass.members.push(memberString);
+    }
+  }
+};
+var addMembers = function addMembers(className, members) {
+  if (Array.isArray(members)) {
+    members.reverse();
+    members.forEach(function (member) {
+      return addMember(className, member);
+    });
+  }
+};
+var cleanupLabel = function cleanupLabel(label) {
+  if (label.substring(0, 1) === ':') {
+    return label.substr(1).trim();
+  } else {
+    return label.trim();
+  }
+};
+/**
+ * Called by parser when a special node is found, e.g. a clickable element.
+ * @param ids Comma separated list of ids
+ * @param className Class to add
+ */
+
+var setCssClass = function setCssClass(ids, className) {
+  ids.split(',').forEach(function (_id) {
+    var id = _id;
+    if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
+
+    if (typeof classes[id] !== 'undefined') {
+      classes[id].cssClasses.push(className);
+    }
+  });
+};
+/**
+ * Called by parser when a link is found. Adds the URL to the vertex data.
+ * @param ids Comma separated list of ids
+ * @param linkStr URL to create a link for
+ * @param tooltip Tooltip for the clickable element
+ */
+
+var setLink = function setLink(ids, linkStr, tooltip) {
+  ids.split(',').forEach(function (_id) {
+    var id = _id;
+    if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
+
+    if (typeof classes[id] !== 'undefined') {
+      classes[id].link = _utils__WEBPACK_IMPORTED_MODULE_4__["default"].formatUrl(linkStr, config);
+
+      if (tooltip) {
+        classes[id].tooltip = _common_common__WEBPACK_IMPORTED_MODULE_3__["default"].sanitizeText(tooltip, config);
+      }
+    }
+  });
+  setCssClass(ids, 'clickable');
+};
+/**
+ * Called by parser when a click definition is found. Registers an event handler.
+ * @param ids Comma separated list of ids
+ * @param functionName Function to be called on click
+ * @param tooltip Tooltip for the clickable element
+ */
+
+var setClickEvent = function setClickEvent(ids, functionName, tooltip) {
+  ids.split(',').forEach(function (id) {
+    setClickFunc(id, functionName, tooltip);
+  });
+  setCssClass(ids, 'clickable');
+};
+
+var setClickFunc = function setClickFunc(domId, functionName, tooltip) {
+  var id = domId;
+  var elemId = lookUpDomId(id);
+
+  if (config.securityLevel !== 'loose') {
+    return;
+  }
+
+  if (typeof functionName === 'undefined') {
+    return;
+  }
+
+  if (typeof classes[id] !== 'undefined') {
+    if (tooltip) {
+      classes[id].tooltip = _common_common__WEBPACK_IMPORTED_MODULE_3__["default"].sanitizeText(tooltip, config);
+    }
+
+    funs.push(function () {
+      var elem = document.querySelector("[id=\"".concat(elemId, "\"]"));
+
+      if (elem !== null) {
+        elem.addEventListener('click', function () {
+          _utils__WEBPACK_IMPORTED_MODULE_4__["default"].runFunc(functionName, elemId);
+        }, false);
+      }
+    });
+  }
+};
+
+var bindFunctions = function bindFunctions(element) {
+  funs.forEach(function (fun) {
+    fun(element);
+  });
+};
+var lineType = {
+  LINE: 0,
+  DOTTED_LINE: 1
+};
+var relationType = {
+  AGGREGATION: 0,
+  EXTENSION: 1,
+  COMPOSITION: 2,
+  DEPENDENCY: 3
+};
+
+var setupToolTips = function setupToolTips(element) {
+  var tooltipElem = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('.mermaidTooltip');
+
+  if ((tooltipElem._groups || tooltipElem)[0][0] === null) {
+    tooltipElem = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('body').append('div').attr('class', 'mermaidTooltip').style('opacity', 0);
+  }
+
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(element).select('svg');
+  var nodes = svg.selectAll('g.node');
+  nodes.on('mouseover', function () {
+    var el = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(this);
+    var title = el.attr('title'); // Dont try to draw a tooltip if no data is provided
+
+    if (title === null) {
+      return;
+    }
+
+    var rect = this.getBoundingClientRect();
+    tooltipElem.transition().duration(200).style('opacity', '.9');
+    tooltipElem.html(el.attr('title')).style('left', window.scrollX + rect.left + (rect.right - rect.left) / 2 + 'px').style('top', window.scrollY + rect.top - 14 + document.body.scrollTop + 'px');
+    el.classed('hover', true);
+  }).on('mouseout', function () {
+    tooltipElem.transition().duration(500).style('opacity', 0);
+    var el = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(this);
+    el.classed('hover', false);
+  });
+};
+
+funs.push(setupToolTips);
+/* harmony default export */ __webpack_exports__["default"] = ({
+  parseDirective: parseDirective,
+  getConfig: function getConfig() {
+    return _config__WEBPACK_IMPORTED_MODULE_2__["getConfig"]().class;
+  },
+  addClass: addClass,
+  bindFunctions: bindFunctions,
+  clear: clear,
+  getClass: getClass,
+  getClasses: getClasses,
+  addAnnotation: addAnnotation,
+  getRelations: getRelations,
+  addRelation: addRelation,
+  addMember: addMember,
+  addMembers: addMembers,
+  cleanupLabel: cleanupLabel,
+  lineType: lineType,
+  relationType: relationType,
+  setClickEvent: setClickEvent,
+  setCssClass: setCssClass,
+  setLink: setLink,
+  lookUpDomId: lookUpDomId
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/class/classRenderer-v2.js":
+/*!************************************************!*\
+  !*** ./src/diagrams/class/classRenderer-v2.js ***!
+  \************************************************/
+/*! exports provided: addClasses, addRelations, setConf, drawOld, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addClasses", function() { return addClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addRelations", function() { return addRelations; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawOld", function() { return drawOld; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dagre */ "./node_modules/dagre/index.js");
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dagre__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _classDb__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./classDb */ "./src/diagrams/class/classDb.js");
+/* harmony import */ var _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./parser/classDiagram */ "./src/diagrams/class/parser/classDiagram.jison");
+/* harmony import */ var _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _svgDraw__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./svgDraw */ "./src/diagrams/class/svgDraw.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../dagre-wrapper/index.js */ "./src/dagre-wrapper/index.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+
+
+
+
+
+
+
+
+ // import addHtmlLabel from 'dagre-d3/lib/label/add-html-label.js';
+
+
+
+
+_parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].yy = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"];
+var idCache = {};
+var padding = 20;
+var conf = {
+  dividerMargin: 10,
+  padding: 5,
+  textHeight: 10
+};
+/**
+ * Function that adds the vertices found during parsing to the graph to be rendered.
+ * @param vert Object containing the vertices.
+ * @param g The graph that is to be drawn.
+ */
+
+var addClasses = function addClasses(classes, g) {
+  // const svg = select(`[id="${svgId}"]`);
+  var keys = Object.keys(classes);
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('keys:', keys);
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info(classes); // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition
+
+  keys.forEach(function (id) {
+    var vertex = classes[id];
+    /**
+     * Variable for storing the classes for the vertex
+     * @type {string}
+     */
+
+    var classStr = 'default'; // if (vertex.classes.length > 0) {
+    //   classStr = vertex.classes.join(' ');
+    // }
+
+    var styles = {
+      labelStyle: ''
+    }; //getStylesFromArray(vertex.styles);
+    // Use vertex id as text in the box if no text is provided by the graph definition
+
+    var vertexText = vertex.text !== undefined ? vertex.text : vertex.id; // We create a SVG label, either by delegating to addHtmlLabel or manually
+    // let vertexNode;
+    // if (getConfig().flowchart.htmlLabels) {
+    //   const node = {
+    //     label: vertexText.replace(
+    //       /fa[lrsb]?:fa-[\w-]+/g,
+    //       s => `<i class='${s.replace(':', ' ')}'></i>`
+    //     )
+    //   };
+    //   vertexNode = addHtmlLabel(svg, node).node();
+    //   vertexNode.parentNode.removeChild(vertexNode);
+    // } else {
+    //   const svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
+    //   svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));
+    //   const rows = vertexText.split(common.lineBreakRegex);
+    //   for (let j = 0; j < rows.length; j++) {
+    //     const tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
+    //     tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
+    //     tspan.setAttribute('dy', '1em');
+    //     tspan.setAttribute('x', '1');
+    //     tspan.textContent = rows[j];
+    //     svgLabel.appendChild(tspan);
+    //   }
+    //   vertexNode = svgLabel;
+    // }
+
+    var radious = 0;
+    var _shape = ''; // Set the shape based parameters
+
+    switch (vertex.type) {
+      case 'class':
+        _shape = 'class_box';
+        break;
+
+      default:
+        _shape = 'class_box';
+    } // Add the node
+
+
+    g.setNode(vertex.id, {
+      labelStyle: styles.labelStyle,
+      shape: _shape,
+      labelText: vertexText,
+      classData: vertex,
+      rx: radious,
+      ry: radious,
+      class: classStr,
+      style: styles.style,
+      id: vertex.id,
+      width: vertex.type === 'group' ? 500 : undefined,
+      type: vertex.type,
+      padding: Object(_config__WEBPACK_IMPORTED_MODULE_7__["getConfig"])().flowchart.padding
+    });
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('setNode', {
+      labelStyle: styles.labelStyle,
+      shape: _shape,
+      labelText: vertexText,
+      rx: radious,
+      ry: radious,
+      class: classStr,
+      style: styles.style,
+      id: vertex.id,
+      width: vertex.type === 'group' ? 500 : undefined,
+      type: vertex.type,
+      padding: Object(_config__WEBPACK_IMPORTED_MODULE_7__["getConfig"])().flowchart.padding
+    });
+  });
+};
+/**
+ * Add edges to graph based on parsed graph defninition
+ * @param {Object} edges The edges to add to the graph
+ * @param {Object} g The graph object
+ */
+
+var addRelations = function addRelations(relations, g) {
+  var cnt = 0;
+  var defaultStyle;
+  var defaultLabelStyle; // if (typeof relations.defaultStyle !== 'undefined') {
+  //   const defaultStyles = getStylesFromArray(relations.defaultStyle);
+  //   defaultStyle = defaultStyles.style;
+  //   defaultLabelStyle = defaultStyles.labelStyle;
+  // }
+
+  relations.forEach(function (edge) {
+    cnt++;
+    var edgeData = {}; //Set relationship style and line type
+
+    edgeData.classes = 'relation';
+    edgeData.pattern = edge.relation.lineType == 1 ? 'dashed' : 'solid';
+    edgeData.id = 'id' + cnt; // Set link type for rendering
+
+    if (edge.type === 'arrow_open') {
+      edgeData.arrowhead = 'none';
+    } else {
+      edgeData.arrowhead = 'normal';
+    }
+
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info(edgeData, edge); //Set relation arrow types
+
+    edgeData.arrowTypeStart = getArrowMarker(edge.relation.type1);
+    edgeData.arrowTypeEnd = getArrowMarker(edge.relation.type2);
+    var style = '';
+    var labelStyle = '';
+
+    if (typeof edge.style !== 'undefined') {
+      var styles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(edge.style);
+      style = styles.style;
+      labelStyle = styles.labelStyle;
+    } else {
+      style = 'fill:none';
+
+      if (typeof defaultStyle !== 'undefined') {
+        style = defaultStyle;
+      }
+
+      if (typeof defaultLabelStyle !== 'undefined') {
+        labelStyle = defaultLabelStyle;
+      }
+    }
+
+    edgeData.style = style;
+    edgeData.labelStyle = labelStyle;
+
+    if (typeof edge.interpolate !== 'undefined') {
+      edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(edge.interpolate, d3__WEBPACK_IMPORTED_MODULE_0__["curveLinear"]);
+    } else if (typeof relations.defaultInterpolate !== 'undefined') {
+      edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(relations.defaultInterpolate, d3__WEBPACK_IMPORTED_MODULE_0__["curveLinear"]);
+    } else {
+      edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(conf.curve, d3__WEBPACK_IMPORTED_MODULE_0__["curveLinear"]);
+    }
+
+    edge.text = edge.title;
+
+    if (typeof edge.text === 'undefined') {
+      if (typeof edge.style !== 'undefined') {
+        edgeData.arrowheadStyle = 'fill: #333';
+      }
+    } else {
+      edgeData.arrowheadStyle = 'fill: #333';
+      edgeData.labelpos = 'c';
+
+      if (Object(_config__WEBPACK_IMPORTED_MODULE_7__["getConfig"])().flowchart.htmlLabels && false) {
+        // eslint-disable-line
+        edgeData.labelType = 'html';
+        edgeData.label = '<span class="edgeLabel">' + edge.text + '</span>';
+      } else {
+        edgeData.labelType = 'text';
+        edgeData.label = edge.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_10__["default"].lineBreakRegex, '\n');
+
+        if (typeof edge.style === 'undefined') {
+          edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none';
+        }
+
+        edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');
+      }
+    } // Add the edge to the graph
+
+
+    g.setEdge(edge.id1, edge.id2, edgeData, cnt);
+  });
+}; // Todo optimize
+
+var getGraphId = function getGraphId(label) {
+  var keys = Object.keys(idCache);
+
+  for (var i = 0; i < keys.length; i++) {
+    if (idCache[keys[i]].label === label) {
+      return keys[i];
+    }
+  }
+
+  return undefined;
+};
+
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+  keys.forEach(function (key) {
+    conf[key] = cnf[key];
+  });
+};
+/**
+ * Draws a flowchart in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+
+var drawOld = function drawOld(text, id) {
+  idCache = {};
+  _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].yy.clear();
+  _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].parse(text);
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Rendering diagram ' + text); // Fetch the default direction, use TD if none was found
+
+  var diagram = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id='".concat(id, "']")); // insertMarkers(diagram);
+  // Layout graph, Create a new directed graph
+
+  var g = new graphlib__WEBPACK_IMPORTED_MODULE_2___default.a.Graph({
+    multigraph: true
+  }); // Set an object for the graph label
+
+  g.setGraph({
+    isMultiGraph: true
+  }); // Default to assigning a new object as a label for each new edge.
+
+  g.setDefaultEdgeLabel(function () {
+    return {};
+  });
+  var classes = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"].getClasses();
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('classes:');
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info(classes);
+  var keys = Object.keys(classes);
+
+  for (var i = 0; i < keys.length; i++) {
+    var classDef = classes[keys[i]];
+    var node = _svgDraw__WEBPACK_IMPORTED_MODULE_6__["default"].drawClass(diagram, classDef, conf);
+    idCache[node.id] = node; // Add nodes to the graph. The first argument is the node id. The second is
+    // metadata about the node. In this case we're going to add labels to each of
+    // our nodes.
+
+    g.setNode(node.id, node);
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Org height: ' + node.height);
+  }
+
+  var relations = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"].getRelations();
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('relations:', relations);
+  relations.forEach(function (relation) {
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('tjoho' + getGraphId(relation.id1) + getGraphId(relation.id2) + JSON.stringify(relation));
+    g.setEdge(getGraphId(relation.id1), getGraphId(relation.id2), {
+      relation: relation
+    }, relation.title || 'DEFAULT');
+  });
+  dagre__WEBPACK_IMPORTED_MODULE_1___default.a.layout(g);
+  g.nodes().forEach(function (v) {
+    if (typeof v !== 'undefined' && typeof g.node(v) !== 'undefined') {
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Node ' + v + ': ' + JSON.stringify(g.node(v)));
+      Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + Object(_classDb__WEBPACK_IMPORTED_MODULE_4__["lookUpDomId"])(v)).attr('transform', 'translate(' + (g.node(v).x - g.node(v).width / 2) + ',' + (g.node(v).y - g.node(v).height / 2) + ' )');
+    }
+  });
+  g.edges().forEach(function (e) {
+    if (typeof e !== 'undefined' && typeof g.edge(e) !== 'undefined') {
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(g.edge(e)));
+      _svgDraw__WEBPACK_IMPORTED_MODULE_6__["default"].drawEdge(diagram, g.edge(e), g.edge(e).relation, conf);
+    }
+  });
+  var svgBounds = diagram.node().getBBox();
+  var width = svgBounds.width + padding * 2;
+  var height = svgBounds.height + padding * 2;
+
+  if (conf.useMaxWidth) {
+    diagram.attr('width', '100%');
+    diagram.attr('style', "max-width: ".concat(width, "px;"));
+  } else {
+    diagram.attr('height', height);
+    diagram.attr('width', width);
+  } // Ensure the viewBox includes the whole svgBounds area with extra space for padding
+
+
+  var vBox = "".concat(svgBounds.x - padding, " ").concat(svgBounds.y - padding, " ").concat(width, " ").concat(height);
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug("viewBox ".concat(vBox));
+  diagram.attr('viewBox', vBox);
+};
+var draw = function draw(text, id) {
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Drawing class');
+  _classDb__WEBPACK_IMPORTED_MODULE_4__["default"].clear(); // const parser = classDb.parser;
+  // parser.yy = classDb;
+  // Parse the graph definition
+  // try {
+
+  _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].parse(text); // } catch (err) {
+  // logger.debug('Parsing failed');
+  // }
+  // Fetch the default direction, use TD if none was found
+
+  var dir = 'TD';
+  var conf = Object(_config__WEBPACK_IMPORTED_MODULE_7__["getConfig"])().flowchart;
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('config:', conf);
+  var nodeSpacing = conf.nodeSpacing || 50;
+  var rankSpacing = conf.rankSpacing || 50; // Create the input mermaid.graph
+
+  var g = new graphlib__WEBPACK_IMPORTED_MODULE_2___default.a.Graph({
+    multigraph: true,
+    compound: true
+  }).setGraph({
+    rankdir: dir,
+    nodesep: nodeSpacing,
+    ranksep: rankSpacing,
+    marginx: 8,
+    marginy: 8
+  }).setDefaultEdgeLabel(function () {
+    return {};
+  }); // let subG;
+  // const subGraphs = flowDb.getSubGraphs();
+  // logger.info('Subgraphs - ', subGraphs);
+  // for (let i = subGraphs.length - 1; i >= 0; i--) {
+  //   subG = subGraphs[i];
+  //   logger.info('Subgraph - ', subG);
+  //   flowDb.addVertex(subG.id, subG.title, 'group', undefined, subG.classes);
+  // }
+  // Fetch the verices/nodes and edges/links from the parsed graph definition
+
+  var classes = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"].getClasses();
+  var relations = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"].getRelations();
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info(relations); // let i = 0;
+  // for (i = subGraphs.length - 1; i >= 0; i--) {
+  //   subG = subGraphs[i];
+  //   selectAll('cluster').append('text');
+  //   for (let j = 0; j < subG.nodes.length; j++) {
+  //     g.setParent(subG.nodes[j], subG.id);
+  //   }
+  // }
+
+  addClasses(classes, g, id);
+  addRelations(relations, g); // Add custom shapes
+  // flowChartShapes.addToRenderV2(addShape);
+  // Set up an SVG group so that we can translate the final graph.
+
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id=\"".concat(id, "\"]"));
+  svg.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink'); // Run the renderer. This is what draws the final graph.
+
+  var element = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + id + ' g');
+  Object(_dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_8__["render"])(element, g, ['aggregation', 'extension', 'composition', 'dependency'], 'classDiagram', id); // element.selectAll('g.node').attr('title', function() {
+  //   return flowDb.getTooltip(this.id);
+  // });
+
+  var padding = 8;
+  var svgBounds = svg.node().getBBox();
+  var width = svgBounds.width + padding * 2;
+  var height = svgBounds.height + padding * 2;
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug("new ViewBox 0 0 ".concat(width, " ").concat(height), "translate(".concat(padding - g._label.marginx, ", ").concat(padding - g._label.marginy, ")"));
+
+  if (conf.useMaxWidth) {
+    svg.attr('width', '100%');
+    svg.attr('style', "max-width: ".concat(width, "px;"));
+  } else {
+    svg.attr('height', height);
+    svg.attr('width', width);
+  }
+
+  svg.attr('viewBox', "0 0 ".concat(width, " ").concat(height));
+  svg.select('g').attr('transform', "translate(".concat(padding - g._label.marginx, ", ").concat(padding - svgBounds.y, ")")); // Index nodes
+  // flowDb.indexNodes('subGraph' + i);
+  // Add label rects for non html labels
+
+  if (!conf.htmlLabels) {
+    var labels = document.querySelectorAll('[id="' + id + '"] .edgeLabel .label');
+
+    for (var k = 0; k < labels.length; k++) {
+      var label = labels[k]; // Get dimensions of label
+
+      var dim = label.getBBox();
+      var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
+      rect.setAttribute('rx', 0);
+      rect.setAttribute('ry', 0);
+      rect.setAttribute('width', dim.width);
+      rect.setAttribute('height', dim.height);
+      rect.setAttribute('style', 'fill:#e8e8e8;');
+      label.insertBefore(rect, label.firstChild);
+    }
+  } // If node has a link, wrap it in an anchor SVG object.
+  // const keys = Object.keys(classes);
+  // keys.forEach(function(key) {
+  //   const vertex = classes[key];
+  //   if (vertex.link) {
+  //     const node = select('#' + id + ' [id="' + key + '"]');
+  //     if (node) {
+  //       const link = document.createElementNS('http://www.w3.org/2000/svg', 'a');
+  //       link.setAttributeNS('http://www.w3.org/2000/svg', 'class', vertex.classes.join(' '));
+  //       link.setAttributeNS('http://www.w3.org/2000/svg', 'href', vertex.link);
+  //       link.setAttributeNS('http://www.w3.org/2000/svg', 'rel', 'noopener');
+  //       const linkNode = node.insert(function() {
+  //         return link;
+  //       }, ':first-child');
+  //       const shape = node.select('.label-container');
+  //       if (shape) {
+  //         linkNode.append(function() {
+  //           return shape.node();
+  //         });
+  //       }
+  //       const label = node.select('.label');
+  //       if (label) {
+  //         linkNode.append(function() {
+  //           return label.node();
+  //         });
+  //       }
+  //     }
+  //   }
+  // });
+
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+function getArrowMarker(type) {
+  var marker;
+
+  switch (type) {
+    case 0:
+      marker = 'aggregation';
+      break;
+
+    case 1:
+      marker = 'extension';
+      break;
+
+    case 2:
+      marker = 'composition';
+      break;
+
+    case 3:
+      marker = 'dependency';
+      break;
+
+    default:
+      marker = 'none';
+  }
+
+  return marker;
+}
+
+/***/ }),
+
+/***/ "./src/diagrams/class/classRenderer.js":
+/*!*********************************************!*\
+  !*** ./src/diagrams/class/classRenderer.js ***!
+  \*********************************************/
+/*! exports provided: setConf, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dagre */ "./node_modules/dagre/index.js");
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dagre__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _classDb__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./classDb */ "./src/diagrams/class/classDb.js");
+/* harmony import */ var _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./parser/classDiagram */ "./src/diagrams/class/parser/classDiagram.jison");
+/* harmony import */ var _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var _svgDraw__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./svgDraw */ "./src/diagrams/class/svgDraw.js");
+
+
+
+
+
+
+
+_parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].yy = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"];
+var idCache = {};
+var padding = 20;
+var conf = {
+  dividerMargin: 10,
+  padding: 5,
+  textHeight: 10
+}; // Todo optimize
+
+var getGraphId = function getGraphId(label) {
+  var keys = Object.keys(idCache);
+
+  for (var i = 0; i < keys.length; i++) {
+    if (idCache[keys[i]].label === label) {
+      return keys[i];
+    }
+  }
+
+  return undefined;
+};
+/**
+ * Setup arrow head and define the marker. The result is appended to the svg.
+ */
+
+
+var insertMarkers = function insertMarkers(elem) {
+  elem.append('defs').append('marker').attr('id', 'extensionStart').attr('class', 'extension').attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 1,7 L18,13 V 1 Z');
+  elem.append('defs').append('marker').attr('id', 'extensionEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 1,1 V 13 L18,7 Z'); // this is actual shape for arrowhead
+
+  elem.append('defs').append('marker').attr('id', 'compositionStart').attr('class', 'extension').attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
+  elem.append('defs').append('marker').attr('id', 'compositionEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
+  elem.append('defs').append('marker').attr('id', 'aggregationStart').attr('class', 'extension').attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
+  elem.append('defs').append('marker').attr('id', 'aggregationEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L1,7 L9,1 Z');
+  elem.append('defs').append('marker').attr('id', 'dependencyStart').attr('class', 'extension').attr('refX', 0).attr('refY', 7).attr('markerWidth', 190).attr('markerHeight', 240).attr('orient', 'auto').append('path').attr('d', 'M 5,7 L9,13 L1,7 L9,1 Z');
+  elem.append('defs').append('marker').attr('id', 'dependencyEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 18,7 L9,13 L14,7 L9,1 Z');
+};
+
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+  keys.forEach(function (key) {
+    conf[key] = cnf[key];
+  });
+};
+/**
+ * Draws a flowchart in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+
+var draw = function draw(text, id) {
+  idCache = {};
+  _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].yy.clear();
+  _parser_classDiagram__WEBPACK_IMPORTED_MODULE_5__["parser"].parse(text);
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Rendering diagram ' + text); // Fetch the default direction, use TD if none was found
+
+  var diagram = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id='".concat(id, "']"));
+  diagram.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');
+  insertMarkers(diagram); // Layout graph, Create a new directed graph
+
+  var g = new graphlib__WEBPACK_IMPORTED_MODULE_2___default.a.Graph({
+    multigraph: true
+  }); // Set an object for the graph label
+
+  g.setGraph({
+    isMultiGraph: true
+  }); // Default to assigning a new object as a label for each new edge.
+
+  g.setDefaultEdgeLabel(function () {
+    return {};
+  });
+  var classes = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"].getClasses();
+  var keys = Object.keys(classes);
+
+  for (var i = 0; i < keys.length; i++) {
+    var classDef = classes[keys[i]];
+    var node = _svgDraw__WEBPACK_IMPORTED_MODULE_6__["default"].drawClass(diagram, classDef, conf);
+    idCache[node.id] = node; // Add nodes to the graph. The first argument is the node id. The second is
+    // metadata about the node. In this case we're going to add labels to each of
+    // our nodes.
+
+    g.setNode(node.id, node);
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Org height: ' + node.height);
+  }
+
+  var relations = _classDb__WEBPACK_IMPORTED_MODULE_4__["default"].getRelations();
+  relations.forEach(function (relation) {
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('tjoho' + getGraphId(relation.id1) + getGraphId(relation.id2) + JSON.stringify(relation));
+    g.setEdge(getGraphId(relation.id1), getGraphId(relation.id2), {
+      relation: relation
+    }, relation.title || 'DEFAULT');
+  });
+  dagre__WEBPACK_IMPORTED_MODULE_1___default.a.layout(g);
+  g.nodes().forEach(function (v) {
+    if (typeof v !== 'undefined' && typeof g.node(v) !== 'undefined') {
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Node ' + v + ': ' + JSON.stringify(g.node(v)));
+      Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + Object(_classDb__WEBPACK_IMPORTED_MODULE_4__["lookUpDomId"])(v)).attr('transform', 'translate(' + (g.node(v).x - g.node(v).width / 2) + ',' + (g.node(v).y - g.node(v).height / 2) + ' )');
+    }
+  });
+  g.edges().forEach(function (e) {
+    if (typeof e !== 'undefined' && typeof g.edge(e) !== 'undefined') {
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(g.edge(e)));
+      _svgDraw__WEBPACK_IMPORTED_MODULE_6__["default"].drawEdge(diagram, g.edge(e), g.edge(e).relation, conf);
+    }
+  });
+  var svgBounds = diagram.node().getBBox();
+  var width = svgBounds.width + padding * 2;
+  var height = svgBounds.height + padding * 2;
+
+  if (conf.useMaxWidth) {
+    diagram.attr('width', '100%');
+    diagram.attr('style', "max-width: ".concat(width, "px;"));
+  } else {
+    diagram.attr('height', height);
+    diagram.attr('width', width);
+  } // Ensure the viewBox includes the whole svgBounds area with extra space for padding
+
+
+  var vBox = "".concat(svgBounds.x - padding, " ").concat(svgBounds.y - padding, " ").concat(width, " ").concat(height);
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug("viewBox ".concat(vBox));
+  diagram.attr('viewBox', vBox);
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/class/parser/classDiagram.jison":
+/*!******************************************************!*\
+  !*** ./src/diagrams/class/parser/classDiagram.jison ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,7],$V1=[1,6],$V2=[1,14],$V3=[1,25],$V4=[1,28],$V5=[1,26],$V6=[1,27],$V7=[1,29],$V8=[1,30],$V9=[1,31],$Va=[1,33],$Vb=[1,34],$Vc=[1,35],$Vd=[10,19],$Ve=[1,47],$Vf=[1,48],$Vg=[1,49],$Vh=[1,50],$Vi=[1,51],$Vj=[1,52],$Vk=[10,19,25,32,33,41,44,45,46,47,48,49],$Vl=[10,19,23,25,32,33,37,41,44,45,46,47,48,49,66,67,68],$Vm=[10,13,17,19],$Vn=[41,66,67,68],$Vo=[41,48,49,66,67,68],$Vp=[41,44,45,46,47,66,67,68],$Vq=[10,19,25],$Vr=[1,81];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"mermaidDoc":4,"directive":5,"graphConfig":6,"openDirective":7,"typeDirective":8,"closeDirective":9,"NEWLINE":10,":":11,"argDirective":12,"open_directive":13,"type_directive":14,"arg_directive":15,"close_directive":16,"CLASS_DIAGRAM":17,"statements":18,"EOF":19,"statement":20,"className":21,"alphaNumToken":22,"GENERICTYPE":23,"relationStatement":24,"LABEL":25,"classStatement":26,"methodStatement":27,"annotationStatement":28,"clickStatement":29,"cssClassStatement":30,"CLASS":31,"STYLE_SEPARATOR":32,"STRUCT_START":33,"members":34,"STRUCT_STOP":35,"ANNOTATION_START":36,"ANNOTATION_END":37,"MEMBER":38,"SEPARATOR":39,"relation":40,"STR":41,"relationType":42,"lineType":43,"AGGREGATION":44,"EXTENSION":45,"COMPOSITION":46,"DEPENDENCY":47,"LINE":48,"DOTTED_LINE":49,"CALLBACK":50,"LINK":51,"CSSCLASS":52,"commentToken":53,"textToken":54,"graphCodeTokens":55,"textNoTagsToken":56,"TAGSTART":57,"TAGEND":58,"==":59,"--":60,"PCT":61,"DEFAULT":62,"SPACE":63,"MINUS":64,"keywords":65,"UNICODE_TEXT":66,"NUM":67,"ALPHA":68,"$accept":0,"$end":1},
+terminals_: {2:"error",10:"NEWLINE",11:":",13:"open_directive",14:"type_directive",15:"arg_directive",16:"close_directive",17:"CLASS_DIAGRAM",19:"EOF",23:"GENERICTYPE",25:"LABEL",31:"CLASS",32:"STYLE_SEPARATOR",33:"STRUCT_START",35:"STRUCT_STOP",36:"ANNOTATION_START",37:"ANNOTATION_END",38:"MEMBER",39:"SEPARATOR",41:"STR",44:"AGGREGATION",45:"EXTENSION",46:"COMPOSITION",47:"DEPENDENCY",48:"LINE",49:"DOTTED_LINE",50:"CALLBACK",51:"LINK",52:"CSSCLASS",55:"graphCodeTokens",57:"TAGSTART",58:"TAGEND",59:"==",60:"--",61:"PCT",62:"DEFAULT",63:"SPACE",64:"MINUS",65:"keywords",66:"UNICODE_TEXT",67:"NUM",68:"ALPHA"},
+productions_: [0,[3,1],[3,2],[4,1],[5,4],[5,6],[7,1],[8,1],[12,1],[9,1],[6,4],[18,1],[18,2],[18,3],[21,1],[21,2],[21,3],[21,2],[20,1],[20,2],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[26,2],[26,4],[26,5],[26,7],[28,4],[34,1],[34,2],[27,1],[27,2],[27,1],[27,1],[24,3],[24,4],[24,4],[24,5],[40,3],[40,2],[40,2],[40,1],[42,1],[42,1],[42,1],[42,1],[43,1],[43,1],[29,3],[29,4],[29,3],[29,4],[30,3],[53,1],[53,1],[54,1],[54,1],[54,1],[54,1],[54,1],[54,1],[54,1],[56,1],[56,1],[56,1],[56,1],[22,1],[22,1],[22,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 6:
+ yy.parseDirective('%%{', 'open_directive'); 
+break;
+case 7:
+ yy.parseDirective($$[$0], 'type_directive'); 
+break;
+case 8:
+ $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); 
+break;
+case 9:
+ yy.parseDirective('}%%', 'close_directive', 'class'); 
+break;
+case 14:
+ this.$=$$[$0]; 
+break;
+case 15:
+ this.$=$$[$0-1]+$$[$0]; 
+break;
+case 16:
+ this.$=$$[$0-2]+'~'+$$[$0-1]+$$[$0]; 
+break;
+case 17:
+ this.$=$$[$0-1]+'~'+$$[$0]; 
+break;
+case 18:
+ yy.addRelation($$[$0]); 
+break;
+case 19:
+ $$[$0-1].title =  yy.cleanupLabel($$[$0]); yy.addRelation($$[$0-1]);        
+break;
+case 26:
+yy.addClass($$[$0]);
+break;
+case 27:
+yy.addClass($$[$0-2]);yy.setCssClass($$[$0-2], $$[$0]);
+break;
+case 28:
+/*console.log($$[$0-3],JSON.stringify($$[$0-1]));*/yy.addClass($$[$0-3]);yy.addMembers($$[$0-3],$$[$0-1]);
+break;
+case 29:
+yy.addClass($$[$0-5]);yy.setCssClass($$[$0-5], $$[$0-3]);yy.addMembers($$[$0-5],$$[$0-1]);
+break;
+case 30:
+ yy.addAnnotation($$[$0],$$[$0-2]); 
+break;
+case 31:
+ this.$ = [$$[$0]]; 
+break;
+case 32:
+ $$[$0].push($$[$0-1]);this.$=$$[$0];
+break;
+case 33:
+/*console.log('Rel found',$$[$0]);*/
+break;
+case 34:
+yy.addMember($$[$0-1],yy.cleanupLabel($$[$0]));
+break;
+case 35:
+/*console.warn('Member',$$[$0]);*/
+break;
+case 36:
+/*console.log('sep found',$$[$0]);*/
+break;
+case 37:
+ this.$ = {'id1':$$[$0-2],'id2':$$[$0], relation:$$[$0-1], relationTitle1:'none', relationTitle2:'none'}; 
+break;
+case 38:
+ this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-1], relationTitle1:$$[$0-2], relationTitle2:'none'}
+break;
+case 39:
+ this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-2], relationTitle1:'none', relationTitle2:$$[$0-1]}; 
+break;
+case 40:
+ this.$ = {id1:$$[$0-4], id2:$$[$0], relation:$$[$0-2], relationTitle1:$$[$0-3], relationTitle2:$$[$0-1]} 
+break;
+case 41:
+ this.$={type1:$$[$0-2],type2:$$[$0],lineType:$$[$0-1]}; 
+break;
+case 42:
+ this.$={type1:'none',type2:$$[$0],lineType:$$[$0-1]}; 
+break;
+case 43:
+ this.$={type1:$$[$0-1],type2:'none',lineType:$$[$0]}; 
+break;
+case 44:
+ this.$={type1:'none',type2:'none',lineType:$$[$0]}; 
+break;
+case 45:
+ this.$=yy.relationType.AGGREGATION;
+break;
+case 46:
+ this.$=yy.relationType.EXTENSION;
+break;
+case 47:
+ this.$=yy.relationType.COMPOSITION;
+break;
+case 48:
+ this.$=yy.relationType.DEPENDENCY;
+break;
+case 49:
+this.$=yy.lineType.LINE;
+break;
+case 50:
+this.$=yy.lineType.DOTTED_LINE;
+break;
+case 51:
+this.$ = $$[$0-2];yy.setClickEvent($$[$0-1], $$[$0], undefined);
+break;
+case 52:
+this.$ = $$[$0-3];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);
+break;
+case 53:
+this.$ = $$[$0-2];yy.setLink($$[$0-1], $$[$0], undefined);
+break;
+case 54:
+this.$ = $$[$0-3];yy.setLink($$[$0-2], $$[$0-1], $$[$0]);
+break;
+case 55:
+yy.setCssClass($$[$0-1], $$[$0]);
+break;
+}
+},
+table: [{3:1,4:2,5:3,6:4,7:5,13:$V0,17:$V1},{1:[3]},{1:[2,1]},{3:8,4:2,5:3,6:4,7:5,13:$V0,17:$V1},{1:[2,3]},{8:9,14:[1,10]},{10:[1,11]},{14:[2,6]},{1:[2,2]},{9:12,11:[1,13],16:$V2},o([11,16],[2,7]),{5:23,7:5,13:$V0,18:15,20:16,21:24,22:32,24:17,26:18,27:19,28:20,29:21,30:22,31:$V3,36:$V4,38:$V5,39:$V6,50:$V7,51:$V8,52:$V9,66:$Va,67:$Vb,68:$Vc},{10:[1,36]},{12:37,15:[1,38]},{10:[2,9]},{19:[1,39]},{10:[1,40],19:[2,11]},o($Vd,[2,18],{25:[1,41]}),o($Vd,[2,20]),o($Vd,[2,21]),o($Vd,[2,22]),o($Vd,[2,23]),o($Vd,[2,24]),o($Vd,[2,25]),o($Vd,[2,33],{40:42,42:45,43:46,25:[1,44],41:[1,43],44:$Ve,45:$Vf,46:$Vg,47:$Vh,48:$Vi,49:$Vj}),{21:53,22:32,66:$Va,67:$Vb,68:$Vc},o($Vd,[2,35]),o($Vd,[2,36]),{22:54,66:$Va,67:$Vb,68:$Vc},{21:55,22:32,66:$Va,67:$Vb,68:$Vc},{21:56,22:32,66:$Va,67:$Vb,68:$Vc},{41:[1,57]},o($Vk,[2,14],{22:32,21:58,23:[1,59],66:$Va,67:$Vb,68:$Vc}),o($Vl,[2,69]),o($Vl,[2,70]),o($Vl,[2,71]),o($Vm,[2,4]),{9:60,16:$V2},{16:[2,8]},{1:[2,10]},{5:23,7:5,13:$V0,18:61,19:[2,12],20:16,21:24,22:32,24:17,26:18,27:19,28:20,29:21,30:22,31:$V3,36:$V4,38:$V5,39:$V6,50:$V7,51:$V8,52:$V9,66:$Va,67:$Vb,68:$Vc},o($Vd,[2,19]),{21:62,22:32,41:[1,63],66:$Va,67:$Vb,68:$Vc},{40:64,42:45,43:46,44:$Ve,45:$Vf,46:$Vg,47:$Vh,48:$Vi,49:$Vj},o($Vd,[2,34]),{43:65,48:$Vi,49:$Vj},o($Vn,[2,44],{42:66,44:$Ve,45:$Vf,46:$Vg,47:$Vh}),o($Vo,[2,45]),o($Vo,[2,46]),o($Vo,[2,47]),o($Vo,[2,48]),o($Vp,[2,49]),o($Vp,[2,50]),o($Vd,[2,26],{32:[1,67],33:[1,68]}),{37:[1,69]},{41:[1,70]},{41:[1,71]},{22:72,66:$Va,67:$Vb,68:$Vc},o($Vk,[2,15]),o($Vk,[2,17],{22:32,21:73,66:$Va,67:$Vb,68:$Vc}),{10:[1,74]},{19:[2,13]},o($Vq,[2,37]),{21:75,22:32,66:$Va,67:$Vb,68:$Vc},{21:76,22:32,41:[1,77],66:$Va,67:$Vb,68:$Vc},o($Vn,[2,43],{42:78,44:$Ve,45:$Vf,46:$Vg,47:$Vh}),o($Vn,[2,42]),{22:79,66:$Va,67:$Vb,68:$Vc},{34:80,38:$Vr},{21:82,22:32,66:$Va,67:$Vb,68:$Vc},o($Vd,[2,51],{41:[1,83]}),o($Vd,[2,53],{41:[1,84]}),o($Vd,[2,55]),o($Vk,[2,16]),o($Vm,[2,5]),o($Vq,[2,39]),o($Vq,[2,38]),{21:85,22:32,66:$Va,67:$Vb,68:$Vc},o($Vn,[2,41]),o($Vd,[2,27],{33:[1,86]}),{35:[1,87]},{34:88,35:[2,31],38:$Vr},o($Vd,[2,30]),o($Vd,[2,52]),o($Vd,[2,54]),o($Vq,[2,40]),{34:89,38:$Vr},o($Vd,[2,28]),{35:[2,32]},{35:[1,90]},o($Vd,[2,29])],
+defaultActions: {2:[2,1],4:[2,3],7:[2,6],8:[2,2],14:[2,9],38:[2,8],39:[2,10],61:[2,13],88:[2,32]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0: this.begin('open_directive'); return 13; 
+break;
+case 1: this.begin('type_directive'); return 14; 
+break;
+case 2: this.popState(); this.begin('arg_directive'); return 11; 
+break;
+case 3: this.popState(); this.popState(); return 16; 
+break;
+case 4:return 15;
+break;
+case 5:/* skip comments */
+break;
+case 6:/* skip comments */
+break;
+case 7:return 10;
+break;
+case 8:/* skip whitespace */
+break;
+case 9:return 17;
+break;
+case 10:return 17;
+break;
+case 11: this.begin("struct"); /*console.log('Starting struct');*/ return 33;
+break;
+case 12:return "EOF_IN_STRUCT";
+break;
+case 13:return "OPEN_IN_STRUCT";
+break;
+case 14: /*console.log('Ending struct');*/this.popState(); return 35;
+break;
+case 15:/* nothing */
+break;
+case 16: /*console.log('lex-member: ' + yy_.yytext);*/  return "MEMBER";
+break;
+case 17:return 31;
+break;
+case 18:return 52;
+break;
+case 19:return 50;
+break;
+case 20:return 51;
+break;
+case 21:return 36;
+break;
+case 22:return 37;
+break;
+case 23:this.begin("generic");
+break;
+case 24:this.popState();
+break;
+case 25:return "GENERICTYPE";
+break;
+case 26:this.begin("string");
+break;
+case 27:this.popState();
+break;
+case 28:return "STR";
+break;
+case 29:return 45;
+break;
+case 30:return 45;
+break;
+case 31:return 47;
+break;
+case 32:return 47;
+break;
+case 33:return 46;
+break;
+case 34:return 44;
+break;
+case 35:return 48;
+break;
+case 36:return 49;
+break;
+case 37:return 25;
+break;
+case 38:return 32;
+break;
+case 39:return 64;
+break;
+case 40:return 'DOT';
+break;
+case 41:return 'PLUS';
+break;
+case 42:return 61;
+break;
+case 43:return 'EQUALS';
+break;
+case 44:return 'EQUALS';
+break;
+case 45:return 68;
+break;
+case 46:return 'PUNCTUATION';
+break;
+case 47:return 67;
+break;
+case 48:return 66;
+break;
+case 49:return 63;
+break;
+case 50:return 19;
+break;
+}
+},
+rules: [/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:[{])/,/^(?:$)/,/^(?:[{])/,/^(?:[}])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:class\b)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:[~])/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],
+conditions: {"string":{"rules":[27,28],"inclusive":false},"generic":{"rules":[24,25],"inclusive":false},"struct":{"rules":[12,13,14,15,16],"inclusive":false},"open_directive":{"rules":[1],"inclusive":false},"type_directive":{"rules":[2,3],"inclusive":false},"arg_directive":{"rules":[3,4],"inclusive":false},"INITIAL":{"rules":[0,5,6,7,8,9,10,11,17,18,19,20,21,22,23,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/class/styles.js":
+/*!**************************************!*\
+  !*** ./src/diagrams/class/styles.js ***!
+  \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles(options) {
+  return "g.classGroup text {\n  fill: ".concat(options.nodeBorder, ";\n  fill: ").concat(options.classText, ";\n  stroke: none;\n  font-family: ").concat(options.fontFamily, ";\n  font-size: 10px;\n\n  .title {\n    font-weight: bolder;\n  }\n}\n.node rect,\n  .node circle,\n  .node ellipse,\n  .node polygon,\n  .node path {\n    fill: ").concat(options.mainBkg, ";\n    stroke: ").concat(options.nodeBorder, ";\n    stroke-width: 1px;\n  }\n\n\n.divider {\n  stroke: ").concat(options.nodeBorder, ";\n  stroke: 1;\n}\n\ng.clickable {\n  cursor: pointer;\n}\n\ng.classGroup rect {\n  fill: ").concat(options.mainBkg, ";\n  stroke: ").concat(options.nodeBorder, ";\n}\n\ng.classGroup line {\n  stroke: ").concat(options.nodeBorder, ";\n  stroke-width: 1;\n}\n\n.classLabel .box {\n  stroke: none;\n  stroke-width: 0;\n  fill: ").concat(options.mainBkg, ";\n  opacity: 0.5;\n}\n\n.classLabel .label {\n  fill: ").concat(options.nodeBorder, ";\n  font-size: 10px;\n}\n\n.relation {\n  stroke: ").concat(options.lineColor, ";\n  stroke-width: 1;\n  fill: none;\n}\n\n.dashed-line{\n  stroke-dasharray: 3;\n}\n\n#compositionStart, .composition {\n  fill: ").concat(options.lineColor, " !important;\n  stroke: ").concat(options.lineColor, " !important;\n  stroke-width: 1;\n}\n\n#compositionEnd, .composition {\n  fill: ").concat(options.lineColor, " !important;\n  stroke: ").concat(options.lineColor, " !important;\n  stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n  fill: ").concat(options.lineColor, " !important;\n  stroke: ").concat(options.lineColor, " !important;\n  stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n  fill: ").concat(options.lineColor, " !important;\n  stroke: ").concat(options.lineColor, " !important;\n  stroke-width: 1;\n}\n\n#extensionStart, .extension {\n  fill: ").concat(options.lineColor, " !important;\n  stroke: ").concat(options.lineColor, " !important;\n  stroke-width: 1;\n}\n\n#extensionEnd, .extension {\n  fill: ").concat(options.lineColor, " !important;\n  stroke: ").concat(options.lineColor, " !important;\n  stroke-width: 1;\n}\n\n#aggregationStart, .aggregation {\n  fill: ").concat(options.mainBkg, " !important;\n  stroke: ").concat(options.lineColor, " !important;\n  stroke-width: 1;\n}\n\n#aggregationEnd, .aggregation {\n  fill: ").concat(options.mainBkg, " !important;\n  stroke: ").concat(options.lineColor, " !important;\n  stroke-width: 1;\n}\n");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/class/svgDraw.js":
+/*!***************************************!*\
+  !*** ./src/diagrams/class/svgDraw.js ***!
+  \***************************************/
+/*! exports provided: drawEdge, drawClass, parseMember, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawEdge", function() { return drawEdge; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawClass", function() { return drawClass; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseMember", function() { return parseMember; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _classDb__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./classDb */ "./src/diagrams/class/classDb.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+
+
+
+
+var edgeCount = 0;
+var drawEdge = function drawEdge(elem, path, relation, conf) {
+  var getRelationType = function getRelationType(type) {
+    switch (type) {
+      case _classDb__WEBPACK_IMPORTED_MODULE_1__["relationType"].AGGREGATION:
+        return 'aggregation';
+
+      case _classDb__WEBPACK_IMPORTED_MODULE_1__["relationType"].EXTENSION:
+        return 'extension';
+
+      case _classDb__WEBPACK_IMPORTED_MODULE_1__["relationType"].COMPOSITION:
+        return 'composition';
+
+      case _classDb__WEBPACK_IMPORTED_MODULE_1__["relationType"].DEPENDENCY:
+        return 'dependency';
+    }
+  };
+
+  path.points = path.points.filter(function (p) {
+    return !Number.isNaN(p.y);
+  }); // The data for our line
+
+  var lineData = path.points; // This is the accessor function we talked about above
+
+  var lineFunction = Object(d3__WEBPACK_IMPORTED_MODULE_0__["line"])().x(function (d) {
+    return d.x;
+  }).y(function (d) {
+    return d.y;
+  }).curve(d3__WEBPACK_IMPORTED_MODULE_0__["curveBasis"]);
+  var svgPath = elem.append('path').attr('d', lineFunction(lineData)).attr('id', 'edge' + edgeCount).attr('class', 'relation');
+  var url = '';
+
+  if (conf.arrowMarkerAbsolute) {
+    url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
+    url = url.replace(/\(/g, '\\(');
+    url = url.replace(/\)/g, '\\)');
+  }
+
+  if (relation.relation.lineType == 1) {
+    svgPath.attr('class', 'relation dashed-line');
+  }
+
+  if (relation.relation.type1 !== 'none') {
+    svgPath.attr('marker-start', 'url(' + url + '#' + getRelationType(relation.relation.type1) + 'Start' + ')');
+  }
+
+  if (relation.relation.type2 !== 'none') {
+    svgPath.attr('marker-end', 'url(' + url + '#' + getRelationType(relation.relation.type2) + 'End' + ')');
+  }
+
+  var x, y;
+  var l = path.points.length; // Calculate Label position
+
+  var labelPosition = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].calcLabelPosition(path.points);
+  x = labelPosition.x;
+  y = labelPosition.y;
+  var p1_card_x, p1_card_y;
+  var p2_card_x, p2_card_y;
+
+  if (l % 2 !== 0 && l > 1) {
+    var cardinality_1_point = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].calcCardinalityPosition(relation.relation.type1 !== 'none', path.points, path.points[0]);
+    var cardinality_2_point = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].calcCardinalityPosition(relation.relation.type2 !== 'none', path.points, path.points[l - 1]);
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('cardinality_1_point ' + JSON.stringify(cardinality_1_point));
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('cardinality_2_point ' + JSON.stringify(cardinality_2_point));
+    p1_card_x = cardinality_1_point.x;
+    p1_card_y = cardinality_1_point.y;
+    p2_card_x = cardinality_2_point.x;
+    p2_card_y = cardinality_2_point.y;
+  }
+
+  if (typeof relation.title !== 'undefined') {
+    var g = elem.append('g').attr('class', 'classLabel');
+    var label = g.append('text').attr('class', 'label').attr('x', x).attr('y', y).attr('fill', 'red').attr('text-anchor', 'middle').text(relation.title);
+    window.label = label;
+    var bounds = label.node().getBBox();
+    g.insert('rect', ':first-child').attr('class', 'box').attr('x', bounds.x - conf.padding / 2).attr('y', bounds.y - conf.padding / 2).attr('width', bounds.width + conf.padding).attr('height', bounds.height + conf.padding);
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Rendering relation ' + JSON.stringify(relation));
+
+  if (typeof relation.relationTitle1 !== 'undefined' && relation.relationTitle1 !== 'none') {
+    var _g = elem.append('g').attr('class', 'cardinality');
+
+    _g.append('text').attr('class', 'type1').attr('x', p1_card_x).attr('y', p1_card_y).attr('fill', 'black').attr('font-size', '6').text(relation.relationTitle1);
+  }
+
+  if (typeof relation.relationTitle2 !== 'undefined' && relation.relationTitle2 !== 'none') {
+    var _g2 = elem.append('g').attr('class', 'cardinality');
+
+    _g2.append('text').attr('class', 'type2').attr('x', p2_card_x).attr('y', p2_card_y).attr('fill', 'black').attr('font-size', '6').text(relation.relationTitle2);
+  }
+
+  edgeCount++;
+};
+var drawClass = function drawClass(elem, classDef, conf) {
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info('Rendering class ' + classDef);
+  var id = classDef.id;
+  var classInfo = {
+    id: id,
+    label: classDef.id,
+    width: 0,
+    height: 0
+  }; // add class group
+
+  var g = elem.append('g').attr('id', Object(_classDb__WEBPACK_IMPORTED_MODULE_1__["lookUpDomId"])(id)).attr('class', 'classGroup'); // add title
+
+  var title;
+
+  if (classDef.link) {
+    title = g.append('svg:a').attr('xlink:href', classDef.link).attr('target', '_blank').append('text').attr('y', conf.textHeight + conf.padding).attr('x', 0);
+  } else {
+    title = g.append('text').attr('y', conf.textHeight + conf.padding).attr('x', 0);
+  } // add annotations
+
+
+  var isFirst = true;
+  classDef.annotations.forEach(function (member) {
+    var titleText2 = title.append('tspan').text('«' + member + '»');
+    if (!isFirst) titleText2.attr('dy', conf.textHeight);
+    isFirst = false;
+  });
+  var classTitleString = classDef.id;
+
+  if (classDef.type !== undefined && classDef.type !== '') {
+    classTitleString += '<' + classDef.type + '>';
+  }
+
+  var classTitle = title.append('tspan').text(classTitleString).attr('class', 'title'); // If class has annotations the title needs to have an offset of the text height
+
+  if (!isFirst) classTitle.attr('dy', conf.textHeight);
+  var titleHeight = title.node().getBBox().height;
+  var membersLine = g.append('line') // text label for the x axis
+  .attr('x1', 0).attr('y1', conf.padding + titleHeight + conf.dividerMargin / 2).attr('y2', conf.padding + titleHeight + conf.dividerMargin / 2);
+  var members = g.append('text') // text label for the x axis
+  .attr('x', conf.padding).attr('y', titleHeight + conf.dividerMargin + conf.textHeight).attr('fill', 'white').attr('class', 'classText');
+  isFirst = true;
+  classDef.members.forEach(function (member) {
+    addTspan(members, member, isFirst, conf);
+    isFirst = false;
+  });
+  var membersBox = members.node().getBBox();
+  var methodsLine = g.append('line') // text label for the x axis
+  .attr('x1', 0).attr('y1', conf.padding + titleHeight + conf.dividerMargin + membersBox.height).attr('y2', conf.padding + titleHeight + conf.dividerMargin + membersBox.height);
+  var methods = g.append('text') // text label for the x axis
+  .attr('x', conf.padding).attr('y', titleHeight + 2 * conf.dividerMargin + membersBox.height + conf.textHeight).attr('fill', 'white').attr('class', 'classText');
+  isFirst = true;
+  classDef.methods.forEach(function (method) {
+    addTspan(methods, method, isFirst, conf);
+    isFirst = false;
+  });
+  var classBox = g.node().getBBox();
+  var cssClassStr = ' ';
+
+  if (classDef.cssClasses.length > 0) {
+    cssClassStr = cssClassStr + classDef.cssClasses.join(' ');
+  }
+
+  var rect = g.insert('rect', ':first-child').attr('x', 0).attr('y', 0).attr('width', classBox.width + 2 * conf.padding).attr('height', classBox.height + conf.padding + 0.5 * conf.dividerMargin).attr('class', cssClassStr);
+  var rectWidth = rect.node().getBBox().width; // Center title
+  // We subtract the width of each text element from the class box width and divide it by 2
+
+  title.node().childNodes.forEach(function (x) {
+    x.setAttribute('x', (rectWidth - x.getBBox().width) / 2);
+  });
+
+  if (classDef.tooltip) {
+    title.insert('title').text(classDef.tooltip);
+  }
+
+  membersLine.attr('x2', rectWidth);
+  methodsLine.attr('x2', rectWidth);
+  classInfo.width = rectWidth;
+  classInfo.height = classBox.height + conf.padding + 0.5 * conf.dividerMargin;
+  return classInfo;
+};
+var parseMember = function parseMember(text) {
+  var fieldRegEx = /(\+|-|~|#)?(\w+)(~\w+~|\[\])?\s+(\w+)/;
+  var methodRegEx = /^([+|\-|~|#])?(\w+) *\( *(.*)\) *(\*|\$)? *(\w*[~|[\]]*\s*\w*~?)$/;
+  var fieldMatch = text.match(fieldRegEx);
+  var methodMatch = text.match(methodRegEx);
+
+  if (fieldMatch && !methodMatch) {
+    return buildFieldDisplay(fieldMatch);
+  } else if (methodMatch) {
+    return buildMethodDisplay(methodMatch);
+  } else {
+    return buildLegacyDisplay(text);
+  }
+};
+
+var buildFieldDisplay = function buildFieldDisplay(parsedText) {
+  var displayText = '';
+
+  try {
+    var visibility = parsedText[1] ? parsedText[1].trim() : '';
+    var fieldType = parsedText[2] ? parsedText[2].trim() : '';
+    var genericType = parsedText[3] ? parseGenericTypes(parsedText[3].trim()) : '';
+    var fieldName = parsedText[4] ? parsedText[4].trim() : '';
+    displayText = visibility + fieldType + genericType + ' ' + fieldName;
+  } catch (err) {
+    displayText = parsedText;
+  }
+
+  return {
+    displayText: displayText,
+    cssStyle: ''
+  };
+};
+
+var buildMethodDisplay = function buildMethodDisplay(parsedText) {
+  var cssStyle = '';
+  var displayText = '';
+
+  try {
+    var visibility = parsedText[1] ? parsedText[1].trim() : '';
+    var methodName = parsedText[2] ? parsedText[2].trim() : '';
+    var parameters = parsedText[3] ? parseGenericTypes(parsedText[3].trim()) : '';
+    var classifier = parsedText[4] ? parsedText[4].trim() : '';
+    var returnType = parsedText[5] ? ' : ' + parseGenericTypes(parsedText[5]).trim() : '';
+    displayText = visibility + methodName + '(' + parameters + ')' + returnType;
+    cssStyle = parseClassifier(classifier);
+  } catch (err) {
+    displayText = parsedText;
+  }
+
+  return {
+    displayText: displayText,
+    cssStyle: cssStyle
+  };
+};
+
+var buildLegacyDisplay = function buildLegacyDisplay(text) {
+  // if for some reason we dont have any match, use old format to parse text
+  var displayText = '';
+  var cssStyle = '';
+  var memberText = '';
+  var returnType = '';
+  var methodStart = text.indexOf('(');
+  var methodEnd = text.indexOf(')');
+
+  if (methodStart > 1 && methodEnd > methodStart && methodEnd <= text.length) {
+    var visibility = '';
+    var methodName = '';
+    var firstChar = text.substring(0, 1);
+
+    if (firstChar.match(/\w/)) {
+      methodName = text.substring(0, methodStart).trim();
+    } else {
+      if (firstChar.match(/\+|-|~|#/)) {
+        visibility = firstChar;
+      }
+
+      methodName = text.substring(1, methodStart).trim();
+    }
+
+    var parameters = text.substring(methodStart + 1, methodEnd);
+    var classifier = text.substring(methodEnd + 1, 1);
+    cssStyle = parseClassifier(classifier);
+    displayText = visibility + methodName + '(' + parseGenericTypes(parameters.trim()) + ')';
+
+    if (methodEnd < memberText.length) {
+      returnType = text.substring(methodEnd + 2).trim();
+
+      if (returnType !== '') {
+        returnType = ' : ' + parseGenericTypes(returnType);
+      }
+    }
+  } else {
+    // finally - if all else fails, just send the text back as written (other than parsing for generic types)
+    displayText = parseGenericTypes(text);
+  }
+
+  return {
+    displayText: displayText,
+    cssStyle: cssStyle
+  };
+};
+
+var addTspan = function addTspan(textEl, txt, isFirst, conf) {
+  var member = parseMember(txt);
+  var tSpan = textEl.append('tspan').attr('x', conf.padding).text(member.displayText);
+
+  if (member.cssStyle !== '') {
+    tSpan.attr('style', member.cssStyle);
+  }
+
+  if (!isFirst) {
+    tSpan.attr('dy', conf.textHeight);
+  }
+};
+
+var parseGenericTypes = function parseGenericTypes(text) {
+  var cleanedText = text;
+
+  if (text.indexOf('~') != -1) {
+    cleanedText = cleanedText.replace('~', '<');
+    cleanedText = cleanedText.replace('~', '>');
+    return parseGenericTypes(cleanedText);
+  } else {
+    return cleanedText;
+  }
+};
+
+var parseClassifier = function parseClassifier(classifier) {
+  switch (classifier) {
+    case '*':
+      return 'font-style:italic;';
+
+    case '$':
+      return 'text-decoration:underline;';
+
+    default:
+      return '';
+  }
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  drawClass: drawClass,
+  drawEdge: drawEdge,
+  parseMember: parseMember
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/common/common.js":
+/*!***************************************!*\
+  !*** ./src/diagrams/common/common.js ***!
+  \***************************************/
+/*! exports provided: getRows, removeScript, sanitizeText, lineBreakRegex, hasBreaks, splitBreaks, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRows", function() { return getRows; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeScript", function() { return removeScript; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sanitizeText", function() { return sanitizeText; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineBreakRegex", function() { return lineBreakRegex; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasBreaks", function() { return hasBreaks; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "splitBreaks", function() { return splitBreaks; });
+var getRows = function getRows(s) {
+  if (!s) return 1;
+  var str = breakToPlaceholder(s);
+  str = str.replace(/\\n/g, '#br#');
+  return str.split('#br#');
+};
+var removeScript = function removeScript(txt) {
+  var rs = '';
+  var idx = 0;
+
+  while (idx >= 0) {
+    idx = txt.indexOf('<script');
+
+    if (idx >= 0) {
+      rs += txt.substr(0, idx);
+      txt = txt.substr(idx + 1);
+      idx = txt.indexOf('</script>');
+
+      if (idx >= 0) {
+        idx += 9;
+        txt = txt.substr(idx);
+      }
+    } else {
+      rs += txt;
+      idx = -1;
+      break;
+    }
+  }
+
+  return rs;
+};
+var sanitizeText = function sanitizeText(text, config) {
+  var txt = text;
+  var htmlLabels = true;
+
+  if (config.flowchart && (config.flowchart.htmlLabels === false || config.flowchart.htmlLabels === 'false')) {
+    htmlLabels = false;
+  }
+
+  if (htmlLabels) {
+    var level = config.securityLevel;
+
+    if (level === 'antiscript') {
+      txt = removeScript(txt);
+    } else if (level !== 'loose') {
+      // eslint-disable-line
+      txt = breakToPlaceholder(txt);
+      txt = txt.replace(/</g, '&lt;').replace(/>/g, '&gt;');
+      txt = txt.replace(/=/g, '&equals;');
+      txt = placeholderToBreak(txt);
+    }
+  }
+
+  return txt;
+};
+var lineBreakRegex = /<br\s*\/?>/gi;
+var hasBreaks = function hasBreaks(text) {
+  return /<br\s*[/]?>/gi.test(text);
+};
+var splitBreaks = function splitBreaks(text) {
+  return text.split(/<br\s*[/]?>/gi);
+};
+
+var breakToPlaceholder = function breakToPlaceholder(s) {
+  return s.replace(lineBreakRegex, '#br#');
+};
+
+var placeholderToBreak = function placeholderToBreak(s) {
+  return s.replace(/#br#/g, '<br/>');
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  getRows: getRows,
+  sanitizeText: sanitizeText,
+  hasBreaks: hasBreaks,
+  splitBreaks: splitBreaks,
+  lineBreakRegex: lineBreakRegex,
+  removeScript: removeScript
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/er/erDb.js":
+/*!*********************************!*\
+  !*** ./src/diagrams/er/erDb.js ***!
+  \*********************************/
+/*! exports provided: parseDirective, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseDirective", function() { return parseDirective; });
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/**
+ *
+ */
+
+
+
+var entities = {};
+var relationships = [];
+var title = '';
+var Cardinality = {
+  ZERO_OR_ONE: 'ZERO_OR_ONE',
+  ZERO_OR_MORE: 'ZERO_OR_MORE',
+  ONE_OR_MORE: 'ONE_OR_MORE',
+  ONLY_ONE: 'ONLY_ONE'
+};
+var Identification = {
+  NON_IDENTIFYING: 'NON_IDENTIFYING',
+  IDENTIFYING: 'IDENTIFYING'
+};
+var parseDirective = function parseDirective(statement, context, type) {
+  _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].parseDirective(this, statement, context, type);
+};
+
+var addEntity = function addEntity(name) {
+  if (typeof entities[name] === 'undefined') {
+    entities[name] = name;
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Added new entity :', name);
+  }
+};
+
+var getEntities = function getEntities() {
+  return entities;
+};
+/**
+ * Add a relationship
+ * @param entA The first entity in the relationship
+ * @param rolA The role played by the first entity in relation to the second
+ * @param entB The second entity in the relationship
+ * @param rSpec The details of the relationship between the two entities
+ */
+
+
+var addRelationship = function addRelationship(entA, rolA, entB, rSpec) {
+  var rel = {
+    entityA: entA,
+    roleA: rolA,
+    entityB: entB,
+    relSpec: rSpec
+  };
+  relationships.push(rel);
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Added new relationship :', rel);
+};
+
+var getRelationships = function getRelationships() {
+  return relationships;
+}; // Keep this - TODO: revisit...allow the diagram to have a title
+
+
+var setTitle = function setTitle(txt) {
+  title = txt;
+};
+
+var getTitle = function getTitle() {
+  return title;
+};
+
+var clear = function clear() {
+  entities = {};
+  relationships = [];
+  title = '';
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  Cardinality: Cardinality,
+  Identification: Identification,
+  parseDirective: parseDirective,
+  getConfig: function getConfig() {
+    return _config__WEBPACK_IMPORTED_MODULE_2__["getConfig"]().er;
+  },
+  addEntity: addEntity,
+  getEntities: getEntities,
+  addRelationship: addRelationship,
+  getRelationships: getRelationships,
+  clear: clear,
+  setTitle: setTitle,
+  getTitle: getTitle
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/er/erMarkers.js":
+/*!**************************************!*\
+  !*** ./src/diagrams/er/erMarkers.js ***!
+  \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var ERMarkers = {
+  ONLY_ONE_START: 'ONLY_ONE_START',
+  ONLY_ONE_END: 'ONLY_ONE_END',
+  ZERO_OR_ONE_START: 'ZERO_OR_ONE_START',
+  ZERO_OR_ONE_END: 'ZERO_OR_ONE_END',
+  ONE_OR_MORE_START: 'ONE_OR_MORE_START',
+  ONE_OR_MORE_END: 'ONE_OR_MORE_END',
+  ZERO_OR_MORE_START: 'ZERO_OR_MORE_START',
+  ZERO_OR_MORE_END: 'ZERO_OR_MORE_END'
+};
+/**
+ * Put the markers into the svg DOM for later use with edge paths
+ */
+
+var insertMarkers = function insertMarkers(elem, conf) {
+  var marker;
+  elem.append('defs').append('marker').attr('id', ERMarkers.ONLY_ONE_START).attr('refX', 0).attr('refY', 9).attr('markerWidth', 18).attr('markerHeight', 18).attr('orient', 'auto').append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M9,0 L9,18 M15,0 L15,18');
+  elem.append('defs').append('marker').attr('id', ERMarkers.ONLY_ONE_END).attr('refX', 18).attr('refY', 9).attr('markerWidth', 18).attr('markerHeight', 18).attr('orient', 'auto').append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M3,0 L3,18 M9,0 L9,18');
+  marker = elem.append('defs').append('marker').attr('id', ERMarkers.ZERO_OR_ONE_START).attr('refX', 0).attr('refY', 9).attr('markerWidth', 30).attr('markerHeight', 18).attr('orient', 'auto');
+  marker.append('circle').attr('stroke', conf.stroke).attr('fill', 'white').attr('cx', 21).attr('cy', 9).attr('r', 6);
+  marker.append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M9,0 L9,18');
+  marker = elem.append('defs').append('marker').attr('id', ERMarkers.ZERO_OR_ONE_END).attr('refX', 30).attr('refY', 9).attr('markerWidth', 30).attr('markerHeight', 18).attr('orient', 'auto');
+  marker.append('circle').attr('stroke', conf.stroke).attr('fill', 'white').attr('cx', 9).attr('cy', 9).attr('r', 6);
+  marker.append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M21,0 L21,18');
+  elem.append('defs').append('marker').attr('id', ERMarkers.ONE_OR_MORE_START).attr('refX', 18).attr('refY', 18).attr('markerWidth', 45).attr('markerHeight', 36).attr('orient', 'auto').append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27');
+  elem.append('defs').append('marker').attr('id', ERMarkers.ONE_OR_MORE_END).attr('refX', 27).attr('refY', 18).attr('markerWidth', 45).attr('markerHeight', 36).attr('orient', 'auto').append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18');
+  marker = elem.append('defs').append('marker').attr('id', ERMarkers.ZERO_OR_MORE_START).attr('refX', 18).attr('refY', 18).attr('markerWidth', 57).attr('markerHeight', 36).attr('orient', 'auto');
+  marker.append('circle').attr('stroke', conf.stroke).attr('fill', 'white').attr('cx', 48).attr('cy', 18).attr('r', 6);
+  marker.append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M0,18 Q18,0 36,18 Q18,36 0,18');
+  marker = elem.append('defs').append('marker').attr('id', ERMarkers.ZERO_OR_MORE_END).attr('refX', 39).attr('refY', 18).attr('markerWidth', 57).attr('markerHeight', 36).attr('orient', 'auto');
+  marker.append('circle').attr('stroke', conf.stroke).attr('fill', 'white').attr('cx', 9).attr('cy', 18).attr('r', 6);
+  marker.append('path').attr('stroke', conf.stroke).attr('fill', 'none').attr('d', 'M21,18 Q39,0 57,18 Q39,36 21,18');
+  return;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  ERMarkers: ERMarkers,
+  insertMarkers: insertMarkers
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/er/erRenderer.js":
+/*!***************************************!*\
+  !*** ./src/diagrams/er/erRenderer.js ***!
+  \***************************************/
+/*! exports provided: setConf, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _erDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./erDb */ "./src/diagrams/er/erDb.js");
+/* harmony import */ var _parser_erDiagram__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/erDiagram */ "./src/diagrams/er/parser/erDiagram.jison");
+/* harmony import */ var _parser_erDiagram__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_erDiagram__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! dagre */ "./node_modules/dagre/index.js");
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(dagre__WEBPACK_IMPORTED_MODULE_4__);
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _erMarkers__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./erMarkers */ "./src/diagrams/er/erMarkers.js");
+
+
+
+
+
+
+
+
+var conf = {};
+/**
+ * Allows the top-level API module to inject config specific to this renderer,
+ * storing it in the local conf object. Note that generic config still needs to be
+ * retrieved using getConfig() imported from the config module
+ */
+
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+
+  for (var i = 0; i < keys.length; i++) {
+    conf[keys[i]] = cnf[keys[i]];
+  }
+};
+/**
+ * Use D3 to construct the svg elements for the entities
+ * @param svgNode the svg node that contains the diagram
+ * @param entities The entities to be drawn
+ * @param graph The graph that contains the vertex and edge definitions post-layout
+ * @return The first entity that was inserted
+ */
+
+var drawEntities = function drawEntities(svgNode, entities, graph) {
+  var keys = Object.keys(entities);
+  var firstOne;
+  keys.forEach(function (id) {
+    // Create a group for each entity
+    var groupNode = svgNode.append('g').attr('id', id);
+    firstOne = firstOne === undefined ? id : firstOne; // Label the entity - this is done first so that we can get the bounding box
+    // which then determines the size of the rectangle
+
+    var textId = 'entity-' + id;
+    var textNode = groupNode.append('text').attr('class', 'er entityLabel').attr('id', textId).attr('x', 0).attr('y', 0).attr('dominant-baseline', 'middle').attr('text-anchor', 'middle').attr('style', 'font-family: ' + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().fontFamily + '; font-size: ' + conf.fontSize + 'px').text(id); // Calculate the width and height of the entity
+
+    var textBBox = textNode.node().getBBox();
+    var entityWidth = Math.max(conf.minEntityWidth, textBBox.width + conf.entityPadding * 2);
+    var entityHeight = Math.max(conf.minEntityHeight, textBBox.height + conf.entityPadding * 2); // Make sure the text gets centred relative to the entity box
+
+    textNode.attr('transform', 'translate(' + entityWidth / 2 + ',' + entityHeight / 2 + ')'); // Draw the rectangle - insert it before the text so that the text is not obscured
+
+    var rectNode = groupNode.insert('rect', '#' + textId).attr('class', 'er entityBox').attr('fill', conf.fill).attr('fill-opacity', '100%').attr('stroke', conf.stroke).attr('x', 0).attr('y', 0).attr('width', entityWidth).attr('height', entityHeight);
+    var rectBBox = rectNode.node().getBBox(); // Add the entity to the graph
+
+    graph.setNode(id, {
+      width: rectBBox.width,
+      height: rectBBox.height,
+      shape: 'rect',
+      id: id
+    });
+  });
+  return firstOne;
+}; // drawEntities
+
+
+var adjustEntities = function adjustEntities(svgNode, graph) {
+  graph.nodes().forEach(function (v) {
+    if (typeof v !== 'undefined' && typeof graph.node(v) !== 'undefined') {
+      svgNode.select('#' + v).attr('transform', 'translate(' + (graph.node(v).x - graph.node(v).width / 2) + ',' + (graph.node(v).y - graph.node(v).height / 2) + ' )');
+    }
+  });
+  return;
+};
+
+var getEdgeName = function getEdgeName(rel) {
+  return (rel.entityA + rel.roleA + rel.entityB).replace(/\s/g, '');
+};
+/**
+ * Add each relationship to the graph
+ * @param relationships the relationships to be added
+ * @param g the graph
+ * @return {Array} The array of relationships
+ */
+
+
+var addRelationships = function addRelationships(relationships, g) {
+  relationships.forEach(function (r) {
+    g.setEdge(r.entityA, r.entityB, {
+      relationship: r
+    }, getEdgeName(r));
+  });
+  return relationships;
+}; // addRelationships
+
+
+var relCnt = 0;
+/**
+ * Draw a relationship using edge information from the graph
+ * @param svg the svg node
+ * @param rel the relationship to draw in the svg
+ * @param g the graph containing the edge information
+ * @param insert the insertion point in the svg DOM (because relationships have markers that need to sit 'behind' opaque entity boxes)
+ */
+
+var drawRelationshipFromLayout = function drawRelationshipFromLayout(svg, rel, g, insert) {
+  relCnt++; // Find the edge relating to this relationship
+
+  var edge = g.edge(rel.entityA, rel.entityB, getEdgeName(rel)); // Get a function that will generate the line path
+
+  var lineFunction = Object(d3__WEBPACK_IMPORTED_MODULE_1__["line"])().x(function (d) {
+    return d.x;
+  }).y(function (d) {
+    return d.y;
+  }).curve(d3__WEBPACK_IMPORTED_MODULE_1__["curveBasis"]); // Insert the line at the right place
+
+  var svgPath = svg.insert('path', '#' + insert).attr('class', 'er relationshipLine').attr('d', lineFunction(edge.points)).attr('stroke', conf.stroke).attr('fill', 'none'); // ...and with dashes if necessary
+
+  if (rel.relSpec.relType === _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Identification.NON_IDENTIFYING) {
+    svgPath.attr('stroke-dasharray', '8,8');
+  } // TODO: Understand this better
+
+
+  var url = '';
+
+  if (conf.arrowMarkerAbsolute) {
+    url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
+    url = url.replace(/\(/g, '\\(');
+    url = url.replace(/\)/g, '\\)');
+  } // Decide which start and end markers it needs. It may be possible to be more concise here
+  // by reversing a start marker to make an end marker...but this will do for now
+  // Note that the 'A' entity's marker is at the end of the relationship and the 'B' entity's marker is at the start
+
+
+  switch (rel.relSpec.cardA) {
+    case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ZERO_OR_ONE:
+      svgPath.attr('marker-end', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ZERO_OR_ONE_END + ')');
+      break;
+
+    case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ZERO_OR_MORE:
+      svgPath.attr('marker-end', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ZERO_OR_MORE_END + ')');
+      break;
+
+    case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ONE_OR_MORE:
+      svgPath.attr('marker-end', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ONE_OR_MORE_END + ')');
+      break;
+
+    case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ONLY_ONE:
+      svgPath.attr('marker-end', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ONLY_ONE_END + ')');
+      break;
+  }
+
+  switch (rel.relSpec.cardB) {
+    case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ZERO_OR_ONE:
+      svgPath.attr('marker-start', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ZERO_OR_ONE_START + ')');
+      break;
+
+    case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ZERO_OR_MORE:
+      svgPath.attr('marker-start', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ZERO_OR_MORE_START + ')');
+      break;
+
+    case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ONE_OR_MORE:
+      svgPath.attr('marker-start', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ONE_OR_MORE_START + ')');
+      break;
+
+    case _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].Cardinality.ONLY_ONE:
+      svgPath.attr('marker-start', 'url(' + url + '#' + _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].ERMarkers.ONLY_ONE_START + ')');
+      break;
+  } // Now label the relationship
+  // Find the half-way point
+
+
+  var len = svgPath.node().getTotalLength();
+  var labelPoint = svgPath.node().getPointAtLength(len * 0.5); // Append a text node containing the label
+
+  var labelId = 'rel' + relCnt;
+  var labelNode = svg.append('text').attr('class', 'er relationshipLabel').attr('id', labelId).attr('x', labelPoint.x).attr('y', labelPoint.y).attr('text-anchor', 'middle').attr('dominant-baseline', 'middle').attr('style', 'font-family: ' + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().fontFamily + '; font-size: ' + conf.fontSize + 'px').text(rel.roleA); // Figure out how big the opaque 'container' rectangle needs to be
+
+  var labelBBox = labelNode.node().getBBox(); // Insert the opaque rectangle before the text label
+
+  svg.insert('rect', '#' + labelId).attr('class', 'er relationshipLabelBox').attr('x', labelPoint.x - labelBBox.width / 2).attr('y', labelPoint.y - labelBBox.height / 2).attr('width', labelBBox.width).attr('height', labelBBox.height).attr('fill', 'white').attr('fill-opacity', '85%');
+  return;
+};
+/**
+ * Draw en E-R diagram in the tag with id: id based on the text definition of the diagram
+ * @param text the text of the diagram
+ * @param id the unique id of the DOM node that contains the diagram
+ */
+
+
+var draw = function draw(text, id) {
+  _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Drawing ER diagram');
+  _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
+  var parser = _parser_erDiagram__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
+  parser.yy = _erDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the text to populate erDb
+
+  try {
+    parser.parse(text);
+  } catch (err) {
+    _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].debug('Parsing failed');
+  } // Get a reference to the svg node that contains the text
+
+
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id='".concat(id, "']")); // Add cardinality marker definitions to the svg
+
+  _erMarkers__WEBPACK_IMPORTED_MODULE_7__["default"].insertMarkers(svg, conf); // Now we have to construct the diagram in a specific way:
+  // ---
+  // 1. Create all the entities in the svg node at 0,0, but with the correct dimensions (allowing for text content)
+  // 2. Make sure they are all added to the graph
+  // 3. Add all the edges (relationships) to the graph aswell
+  // 4. Let dagre do its magic to layout the graph.  This assigns:
+  //    - the centre co-ordinates for each node, bearing in mind the dimensions and edge relationships
+  //    - the path co-ordinates for each edge
+  //    But it has no impact on the svg child nodes - the diagram remains with every entity rooted at 0,0
+  // 5. Now assign a transform to each entity in the svg node so that it gets drawn in the correct place, as determined by
+  //    its centre point, which is obtained from the graph, and it's width and height
+  // 6. And finally, create all the edges in the svg node using information from the graph
+  // ---
+  // Create the graph
+
+  var g; // TODO: Explore directed vs undirected graphs, and how the layout is affected
+  // An E-R diagram could be said to be undirected, but there is merit in setting
+  // the direction from parent to child in a one-to-many as this influences graphlib to
+  // put the parent above the child (does it?), which is intuitive.  Most relationships
+  // in ER diagrams are one-to-many.
+
+  g = new graphlib__WEBPACK_IMPORTED_MODULE_0___default.a.Graph({
+    multigraph: true,
+    directed: true,
+    compound: false
+  }).setGraph({
+    rankdir: conf.layoutDirection,
+    marginx: 20,
+    marginy: 20,
+    nodesep: 100,
+    edgesep: 100,
+    ranksep: 100
+  }).setDefaultEdgeLabel(function () {
+    return {};
+  }); // Draw the entities (at 0,0), returning the first svg node that got
+  // inserted - this represents the insertion point for relationship paths
+
+  var firstEntity = drawEntities(svg, _erDb__WEBPACK_IMPORTED_MODULE_2__["default"].getEntities(), g); // TODO: externalise the addition of entities to the graph - it's a bit 'buried' in the above
+  // Add all the relationships to the graph
+
+  var relationships = addRelationships(_erDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRelationships(), g);
+  dagre__WEBPACK_IMPORTED_MODULE_4___default.a.layout(g); // Node and edge positions will be updated
+  // Adjust the positions of the entities so that they adhere to the layout
+
+  adjustEntities(svg, g); // Draw the relationships
+
+  relationships.forEach(function (rel) {
+    drawRelationshipFromLayout(svg, rel, g, firstEntity);
+  });
+  var padding = conf.diagramPadding;
+  var svgBounds = svg.node().getBBox();
+  var width = svgBounds.width + padding * 2;
+  var height = svgBounds.height + padding * 2;
+
+  if (conf.useMaxWidth) {
+    svg.attr('width', '100%');
+    svg.attr('style', "max-width: ".concat(width, "px;"));
+  } else {
+    svg.attr('height', height);
+    svg.attr('width', width);
+  }
+
+  svg.attr('viewBox', "".concat(svgBounds.x - padding, " ").concat(svgBounds.y - padding, " ").concat(width, " ").concat(height));
+}; // draw
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/er/parser/erDiagram.jison":
+/*!************************************************!*\
+  !*** ./src/diagrams/er/parser/erDiagram.jison ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,5],$V2=[6,9,11,20,30],$V3=[1,17],$V4=[1,20],$V5=[1,24],$V6=[1,25],$V7=[1,26],$V8=[1,27],$V9=[20,27,28],$Va=[4,6,9,11,20,30],$Vb=[23,24,25,26];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"ER_DIAGRAM":4,"document":5,"EOF":6,"directive":7,"line":8,"SPACE":9,"statement":10,"NEWLINE":11,"openDirective":12,"typeDirective":13,"closeDirective":14,":":15,"argDirective":16,"entityName":17,"relSpec":18,"role":19,"ALPHANUM":20,"cardinality":21,"relType":22,"ZERO_OR_ONE":23,"ZERO_OR_MORE":24,"ONE_OR_MORE":25,"ONLY_ONE":26,"NON_IDENTIFYING":27,"IDENTIFYING":28,"WORD":29,"open_directive":30,"type_directive":31,"arg_directive":32,"close_directive":33,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"ER_DIAGRAM",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",20:"ALPHANUM",23:"ZERO_OR_ONE",24:"ZERO_OR_MORE",25:"ONE_OR_MORE",26:"ONLY_ONE",27:"NON_IDENTIFYING",28:"IDENTIFYING",29:"WORD",30:"open_directive",31:"type_directive",32:"arg_directive",33:"close_directive"},
+productions_: [0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,5],[17,1],[18,3],[21,1],[21,1],[21,1],[21,1],[22,1],[22,1],[19,1],[19,1],[12,1],[13,1],[16,1],[14,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1:
+ /*console.log('finished parsing');*/ 
+break;
+case 3:
+ this.$ = [] 
+break;
+case 4:
+$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
+break;
+case 5: case 6:
+ this.$ = $$[$0] 
+break;
+case 7: case 8:
+ this.$=[];
+break;
+case 12:
+
+          yy.addEntity($$[$0-4]);
+          yy.addEntity($$[$0-2]);
+          yy.addRelationship($$[$0-4], $$[$0], $$[$0-2], $$[$0-3]);
+          /*console.log($$[$0-4] + $$[$0-3] + $$[$0-2] + ':' + $$[$0]);*/
+      
+break;
+case 13:
+ this.$ = $$[$0]; /*console.log('Entity: ' + $$[$0]);*/ 
+break;
+case 14:
+
+        this.$ = { cardA: $$[$0], relType: $$[$0-1], cardB: $$[$0-2] };
+        /*console.log('relSpec: ' + $$[$0] + $$[$0-1] + $$[$0-2]);*/
+      
+break;
+case 15:
+ this.$ = yy.Cardinality.ZERO_OR_ONE; 
+break;
+case 16:
+ this.$ = yy.Cardinality.ZERO_OR_MORE; 
+break;
+case 17:
+ this.$ = yy.Cardinality.ONE_OR_MORE; 
+break;
+case 18:
+ this.$ = yy.Cardinality.ONLY_ONE; 
+break;
+case 19:
+ this.$ = yy.Identification.NON_IDENTIFYING;  
+break;
+case 20:
+ this.$ = yy.Identification.IDENTIFYING; 
+break;
+case 21:
+ this.$ = $$[$0].replace(/"/g, ''); 
+break;
+case 22:
+ this.$ = $$[$0]; 
+break;
+case 23:
+ yy.parseDirective('%%{', 'open_directive'); 
+break;
+case 24:
+ yy.parseDirective($$[$0], 'type_directive'); 
+break;
+case 25:
+ $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); 
+break;
+case 26:
+ yy.parseDirective('}%%', 'close_directive', 'er'); 
+break;
+}
+},
+table: [{3:1,4:$V0,7:3,12:4,30:$V1},{1:[3]},o($V2,[2,3],{5:6}),{3:7,4:$V0,7:3,12:4,30:$V1},{13:8,31:[1,9]},{31:[2,23]},{6:[1,10],7:15,8:11,9:[1,12],10:13,11:[1,14],12:4,17:16,20:$V3,30:$V1},{1:[2,2]},{14:18,15:[1,19],33:$V4},o([15,33],[2,24]),o($V2,[2,8],{1:[2,1]}),o($V2,[2,4]),{7:15,10:21,12:4,17:16,20:$V3,30:$V1},o($V2,[2,6]),o($V2,[2,7]),o($V2,[2,11]),{18:22,21:23,23:$V5,24:$V6,25:$V7,26:$V8},o([15,23,24,25,26],[2,13]),{11:[1,28]},{16:29,32:[1,30]},{11:[2,26]},o($V2,[2,5]),{17:31,20:$V3},{22:32,27:[1,33],28:[1,34]},o($V9,[2,15]),o($V9,[2,16]),o($V9,[2,17]),o($V9,[2,18]),o($Va,[2,9]),{14:35,33:$V4},{33:[2,25]},{15:[1,36]},{21:37,23:$V5,24:$V6,25:$V7,26:$V8},o($Vb,[2,19]),o($Vb,[2,20]),{11:[1,38]},{19:39,20:[1,41],29:[1,40]},{20:[2,14]},o($Va,[2,10]),o($V2,[2,12]),o($V2,[2,21]),o($V2,[2,22])],
+defaultActions: {5:[2,23],7:[2,2],20:[2,26],30:[2,25],37:[2,14]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0: this.begin('open_directive'); return 30; 
+break;
+case 1: this.begin('type_directive'); return 31; 
+break;
+case 2: this.popState(); this.begin('arg_directive'); return 15; 
+break;
+case 3: this.popState(); this.popState(); return 33; 
+break;
+case 4:return 32;
+break;
+case 5:/* skip comments */
+break;
+case 6:/* skip comments */
+break;
+case 7:return 11;
+break;
+case 8:/* skip whitespace */
+break;
+case 9:return 9;
+break;
+case 10:return 29;
+break;
+case 11:return 4;
+break;
+case 12:return 23;
+break;
+case 13:return 24;
+break;
+case 14:return 25;
+break;
+case 15:return 26;
+break;
+case 16:return 23;
+break;
+case 17:return 24;
+break;
+case 18:return 25;
+break;
+case 19:return 27;
+break;
+case 20:return 28;
+break;
+case 21:return 27;
+break;
+case 22:return 27;
+break;
+case 23:return 20;
+break;
+case 24:return yy_.yytext[0];
+break;
+case 25:return 6;
+break;
+}
+},
+rules: [/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\|o\b)/i,/^(?:\}o\b)/i,/^(?:\}\|)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z][A-Za-z0-9\-]*)/i,/^(?:.)/i,/^(?:$)/i],
+conditions: {"open_directive":{"rules":[1],"inclusive":false},"type_directive":{"rules":[2,3],"inclusive":false},"arg_directive":{"rules":[3,4],"inclusive":false},"INITIAL":{"rules":[0,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/er/styles.js":
+/*!***********************************!*\
+  !*** ./src/diagrams/er/styles.js ***!
+  \***********************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles(options) {
+  return "\n  .entityBox {\n    fill: ".concat(options.mainBkg, ";\n    stroke: ").concat(options.nodeBorder, ";\n  }\n\n  .relationshipLabelBox {\n    fill: ").concat(options.tertiaryColor, ";\n    opacity: 0.7;\n    background-color: ").concat(options.tertiaryColor, ";\n      rect {\n        opacity: 0.5;\n      }\n  }\n\n    .relationshipLine {\n      stroke: ").concat(options.lineColor, ";\n    }\n");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/flowchart/flowChartShapes.js":
+/*!***************************************************!*\
+  !*** ./src/diagrams/flowchart/flowChartShapes.js ***!
+  \***************************************************/
+/*! exports provided: addToRender, addToRenderV2, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToRender", function() { return addToRender; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToRenderV2", function() { return addToRenderV2; });
+/* harmony import */ var dagre_d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! dagre-d3 */ "./node_modules/dagre-d3/index.js");
+/* harmony import */ var dagre_d3__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dagre_d3__WEBPACK_IMPORTED_MODULE_0__);
+
+
+function question(parent, bbox, node) {
+  var w = bbox.width;
+  var h = bbox.height;
+  var s = (w + h) * 0.9;
+  var points = [{
+    x: s / 2,
+    y: 0
+  }, {
+    x: s,
+    y: -s / 2
+  }, {
+    x: s / 2,
+    y: -s
+  }, {
+    x: 0,
+    y: -s / 2
+  }];
+  var shapeSvg = insertPolygonShape(parent, s, s, points);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
+  };
+
+  return shapeSvg;
+}
+
+function hexagon(parent, bbox, node) {
+  var f = 4;
+  var h = bbox.height;
+  var m = h / f;
+  var w = bbox.width + 2 * m;
+  var points = [{
+    x: m,
+    y: 0
+  }, {
+    x: w - m,
+    y: 0
+  }, {
+    x: w,
+    y: -h / 2
+  }, {
+    x: w - m,
+    y: -h
+  }, {
+    x: m,
+    y: -h
+  }, {
+    x: 0,
+    y: -h / 2
+  }];
+  var shapeSvg = insertPolygonShape(parent, w, h, points);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
+  };
+
+  return shapeSvg;
+}
+
+function rect_left_inv_arrow(parent, bbox, node) {
+  var w = bbox.width;
+  var h = bbox.height;
+  var points = [{
+    x: -h / 2,
+    y: 0
+  }, {
+    x: w,
+    y: 0
+  }, {
+    x: w,
+    y: -h
+  }, {
+    x: -h / 2,
+    y: -h
+  }, {
+    x: 0,
+    y: -h / 2
+  }];
+  var shapeSvg = insertPolygonShape(parent, w, h, points);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
+  };
+
+  return shapeSvg;
+}
+
+function lean_right(parent, bbox, node) {
+  var w = bbox.width;
+  var h = bbox.height;
+  var points = [{
+    x: -2 * h / 6,
+    y: 0
+  }, {
+    x: w - h / 6,
+    y: 0
+  }, {
+    x: w + 2 * h / 6,
+    y: -h
+  }, {
+    x: h / 6,
+    y: -h
+  }];
+  var shapeSvg = insertPolygonShape(parent, w, h, points);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
+  };
+
+  return shapeSvg;
+}
+
+function lean_left(parent, bbox, node) {
+  var w = bbox.width;
+  var h = bbox.height;
+  var points = [{
+    x: 2 * h / 6,
+    y: 0
+  }, {
+    x: w + h / 6,
+    y: 0
+  }, {
+    x: w - 2 * h / 6,
+    y: -h
+  }, {
+    x: -h / 6,
+    y: -h
+  }];
+  var shapeSvg = insertPolygonShape(parent, w, h, points);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
+  };
+
+  return shapeSvg;
+}
+
+function trapezoid(parent, bbox, node) {
+  var w = bbox.width;
+  var h = bbox.height;
+  var points = [{
+    x: -2 * h / 6,
+    y: 0
+  }, {
+    x: w + 2 * h / 6,
+    y: 0
+  }, {
+    x: w - h / 6,
+    y: -h
+  }, {
+    x: h / 6,
+    y: -h
+  }];
+  var shapeSvg = insertPolygonShape(parent, w, h, points);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
+  };
+
+  return shapeSvg;
+}
+
+function inv_trapezoid(parent, bbox, node) {
+  var w = bbox.width;
+  var h = bbox.height;
+  var points = [{
+    x: h / 6,
+    y: 0
+  }, {
+    x: w - h / 6,
+    y: 0
+  }, {
+    x: w + 2 * h / 6,
+    y: -h
+  }, {
+    x: -2 * h / 6,
+    y: -h
+  }];
+  var shapeSvg = insertPolygonShape(parent, w, h, points);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
+  };
+
+  return shapeSvg;
+}
+
+function rect_right_inv_arrow(parent, bbox, node) {
+  var w = bbox.width;
+  var h = bbox.height;
+  var points = [{
+    x: 0,
+    y: 0
+  }, {
+    x: w + h / 2,
+    y: 0
+  }, {
+    x: w,
+    y: -h / 2
+  }, {
+    x: w + h / 2,
+    y: -h
+  }, {
+    x: 0,
+    y: -h
+  }];
+  var shapeSvg = insertPolygonShape(parent, w, h, points);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
+  };
+
+  return shapeSvg;
+}
+
+function stadium(parent, bbox, node) {
+  var h = bbox.height;
+  var w = bbox.width + h / 4;
+  var shapeSvg = parent.insert('rect', ':first-child').attr('rx', h / 2).attr('ry', h / 2).attr('x', -w / 2).attr('y', -h / 2).attr('width', w).attr('height', h);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.rect(node, point);
+  };
+
+  return shapeSvg;
+}
+
+function subroutine(parent, bbox, node) {
+  var w = bbox.width;
+  var h = bbox.height;
+  var points = [{
+    x: 0,
+    y: 0
+  }, {
+    x: w,
+    y: 0
+  }, {
+    x: w,
+    y: -h
+  }, {
+    x: 0,
+    y: -h
+  }, {
+    x: 0,
+    y: 0
+  }, {
+    x: -8,
+    y: 0
+  }, {
+    x: w + 8,
+    y: 0
+  }, {
+    x: w + 8,
+    y: -h
+  }, {
+    x: -8,
+    y: -h
+  }, {
+    x: -8,
+    y: 0
+  }];
+  var shapeSvg = insertPolygonShape(parent, w, h, points);
+
+  node.intersect = function (point) {
+    return dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.polygon(node, points, point);
+  };
+
+  return shapeSvg;
+}
+
+function cylinder(parent, bbox, node) {
+  var w = bbox.width;
+  var rx = w / 2;
+  var ry = rx / (2.5 + w / 50);
+  var h = bbox.height + ry;
+  var shape = 'M 0,' + ry + ' a ' + rx + ',' + ry + ' 0,0,0 ' + w + ' 0 a ' + rx + ',' + ry + ' 0,0,0 ' + -w + ' 0 l 0,' + h + ' a ' + rx + ',' + ry + ' 0,0,0 ' + w + ' 0 l 0,' + -h;
+  var shapeSvg = parent.attr('label-offset-y', ry).insert('path', ':first-child').attr('d', shape).attr('transform', 'translate(' + -w / 2 + ',' + -(h / 2 + ry) + ')');
+
+  node.intersect = function (point) {
+    var pos = dagre_d3__WEBPACK_IMPORTED_MODULE_0___default.a.intersect.rect(node, point);
+    var x = pos.x - node.x;
+
+    if (rx != 0 && (Math.abs(x) < node.width / 2 || Math.abs(x) == node.width / 2 && Math.abs(pos.y - node.y) > node.height / 2 - ry)) {
+      // ellipsis equation: x*x / a*a + y*y / b*b = 1
+      // solve for y to get adjustion value for pos.y
+      var y = ry * ry * (1 - x * x / (rx * rx));
+      if (y != 0) y = Math.sqrt(y);
+      y = ry - y;
+      if (point.y - node.y > 0) y = -y;
+      pos.y += y;
+    }
+
+    return pos;
+  };
+
+  return shapeSvg;
+}
+
+function addToRender(render) {
+  render.shapes().question = question;
+  render.shapes().hexagon = hexagon;
+  render.shapes().stadium = stadium;
+  render.shapes().subroutine = subroutine;
+  render.shapes().cylinder = cylinder; // Add custom shape for box with inverted arrow on left side
+
+  render.shapes().rect_left_inv_arrow = rect_left_inv_arrow; // Add custom shape for box with inverted arrow on left side
+
+  render.shapes().lean_right = lean_right; // Add custom shape for box with inverted arrow on left side
+
+  render.shapes().lean_left = lean_left; // Add custom shape for box with inverted arrow on left side
+
+  render.shapes().trapezoid = trapezoid; // Add custom shape for box with inverted arrow on left side
+
+  render.shapes().inv_trapezoid = inv_trapezoid; // Add custom shape for box with inverted arrow on right side
+
+  render.shapes().rect_right_inv_arrow = rect_right_inv_arrow;
+}
+function addToRenderV2(addShape) {
+  addShape({
+    question: question
+  });
+  addShape({
+    hexagon: hexagon
+  });
+  addShape({
+    stadium: stadium
+  });
+  addShape({
+    subroutine: subroutine
+  });
+  addShape({
+    cylinder: cylinder
+  }); // Add custom shape for box with inverted arrow on left side
+
+  addShape({
+    rect_left_inv_arrow: rect_left_inv_arrow
+  }); // Add custom shape for box with inverted arrow on left side
+
+  addShape({
+    lean_right: lean_right
+  }); // Add custom shape for box with inverted arrow on left side
+
+  addShape({
+    lean_left: lean_left
+  }); // Add custom shape for box with inverted arrow on left side
+
+  addShape({
+    trapezoid: trapezoid
+  }); // Add custom shape for box with inverted arrow on left side
+
+  addShape({
+    inv_trapezoid: inv_trapezoid
+  }); // Add custom shape for box with inverted arrow on right side
+
+  addShape({
+    rect_right_inv_arrow: rect_right_inv_arrow
+  });
+}
+
+function insertPolygonShape(parent, w, h, points) {
+  return parent.insert('polygon', ':first-child').attr('points', points.map(function (d) {
+    return d.x + ',' + d.y;
+  }).join(' ')).attr('transform', 'translate(' + -w / 2 + ',' + h / 2 + ')');
+}
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  addToRender: addToRender,
+  addToRenderV2: addToRenderV2
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/flowchart/flowDb.js":
+/*!******************************************!*\
+  !*** ./src/diagrams/flowchart/flowDb.js ***!
+  \******************************************/
+/*! exports provided: parseDirective, addVertex, addSingleLink, addLink, updateLinkInterpolate, updateLink, addClass, setDirection, setClass, setLink, getTooltip, setClickEvent, bindFunctions, getDirection, getVertices, getEdges, getClasses, clear, defaultStyle, addSubGraph, getDepthFirstPos, indexNodes, getSubGraphs, firstGraph, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseDirective", function() { return parseDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addVertex", function() { return addVertex; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSingleLink", function() { return addSingleLink; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addLink", function() { return addLink; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateLinkInterpolate", function() { return updateLinkInterpolate; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateLink", function() { return updateLink; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addClass", function() { return addClass; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setDirection", function() { return setDirection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClass", function() { return setClass; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLink", function() { return setLink; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTooltip", function() { return getTooltip; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClickEvent", function() { return setClickEvent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindFunctions", function() { return bindFunctions; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDirection", function() { return getDirection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVertices", function() { return getVertices; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEdges", function() { return getEdges; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultStyle", function() { return defaultStyle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSubGraph", function() { return addSubGraph; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDepthFirstPos", function() { return getDepthFirstPos; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "indexNodes", function() { return indexNodes; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSubGraphs", function() { return getSubGraphs; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "firstGraph", function() { return firstGraph; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+
+
+
+
+ // const MERMAID_DOM_ID_PREFIX = 'mermaid-dom-id-';
+
+var MERMAID_DOM_ID_PREFIX = '';
+var config = _config__WEBPACK_IMPORTED_MODULE_2__["getConfig"]();
+var vertices = {};
+var edges = [];
+var classes = [];
+var subGraphs = [];
+var subGraphLookup = {};
+var tooltips = {};
+var subCount = 0;
+var firstGraphFlag = true;
+var direction; // Functions to be run after graph rendering
+
+var funs = [];
+var parseDirective = function parseDirective(statement, context, type) {
+  _mermaidAPI__WEBPACK_IMPORTED_MODULE_4__["default"].parseDirective(this, statement, context, type);
+};
+/**
+ * Function called by parser when a node definition has been found
+ * @param id
+ * @param text
+ * @param type
+ * @param style
+ * @param classes
+ */
+
+var addVertex = function addVertex(_id, text, type, style, classes) {
+  var txt;
+  var id = _id;
+
+  if (typeof id === 'undefined') {
+    return;
+  }
+
+  if (id.trim().length === 0) {
+    return;
+  }
+
+  if (id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
+
+  if (typeof vertices[id] === 'undefined') {
+    vertices[id] = {
+      id: id,
+      styles: [],
+      classes: []
+    };
+  }
+
+  if (typeof text !== 'undefined') {
+    config = _config__WEBPACK_IMPORTED_MODULE_2__["getConfig"]();
+    txt = _common_common__WEBPACK_IMPORTED_MODULE_3__["default"].sanitizeText(text.trim(), config); // strip quotes if string starts and ends with a quote
+
+    if (txt[0] === '"' && txt[txt.length - 1] === '"') {
+      txt = txt.substring(1, txt.length - 1);
+    }
+
+    vertices[id].text = txt;
+  } else {
+    if (typeof vertices[id].text === 'undefined') {
+      vertices[id].text = _id;
+    }
+  }
+
+  if (typeof type !== 'undefined') {
+    vertices[id].type = type;
+  }
+
+  if (typeof style !== 'undefined') {
+    if (style !== null) {
+      style.forEach(function (s) {
+        vertices[id].styles.push(s);
+      });
+    }
+  }
+
+  if (typeof classes !== 'undefined') {
+    if (classes !== null) {
+      classes.forEach(function (s) {
+        vertices[id].classes.push(s);
+      });
+    }
+  }
+};
+/**
+ * Function called by parser when a link/edge definition has been found
+ * @param start
+ * @param end
+ * @param type
+ * @param linktext
+ */
+
+var addSingleLink = function addSingleLink(_start, _end, type, linktext) {
+  var start = _start;
+  var end = _end;
+  if (start[0].match(/\d/)) start = MERMAID_DOM_ID_PREFIX + start;
+  if (end[0].match(/\d/)) end = MERMAID_DOM_ID_PREFIX + end; // logger.info('Got edge...', start, end);
+
+  var edge = {
+    start: start,
+    end: end,
+    type: undefined,
+    text: ''
+  };
+  linktext = type.text;
+
+  if (typeof linktext !== 'undefined') {
+    edge.text = _common_common__WEBPACK_IMPORTED_MODULE_3__["default"].sanitizeText(linktext.trim(), config); // strip quotes if string starts and exnds with a quote
+
+    if (edge.text[0] === '"' && edge.text[edge.text.length - 1] === '"') {
+      edge.text = edge.text.substring(1, edge.text.length - 1);
+    }
+  }
+
+  if (typeof type !== 'undefined') {
+    edge.type = type.type;
+    edge.stroke = type.stroke;
+    edge.length = type.length;
+  }
+
+  edges.push(edge);
+};
+var addLink = function addLink(_start, _end, type, linktext) {
+  var i, j;
+
+  for (i = 0; i < _start.length; i++) {
+    for (j = 0; j < _end.length; j++) {
+      addSingleLink(_start[i], _end[j], type, linktext);
+    }
+  }
+};
+/**
+ * Updates a link's line interpolation algorithm
+ * @param pos
+ * @param interpolate
+ */
+
+var updateLinkInterpolate = function updateLinkInterpolate(positions, interp) {
+  positions.forEach(function (pos) {
+    if (pos === 'default') {
+      edges.defaultInterpolate = interp;
+    } else {
+      edges[pos].interpolate = interp;
+    }
+  });
+};
+/**
+ * Updates a link with a style
+ * @param pos
+ * @param style
+ */
+
+var updateLink = function updateLink(positions, style) {
+  positions.forEach(function (pos) {
+    if (pos === 'default') {
+      edges.defaultStyle = style;
+    } else {
+      if (_utils__WEBPACK_IMPORTED_MODULE_1__["default"].isSubstringInArray('fill', style) === -1) {
+        style.push('fill:none');
+      }
+
+      edges[pos].style = style;
+    }
+  });
+};
+var addClass = function addClass(id, style) {
+  if (typeof classes[id] === 'undefined') {
+    classes[id] = {
+      id: id,
+      styles: [],
+      textStyles: []
+    };
+  }
+
+  if (typeof style !== 'undefined') {
+    if (style !== null) {
+      style.forEach(function (s) {
+        if (s.match('color')) {
+          var newStyle1 = s.replace('fill', 'bgFill');
+          var newStyle2 = newStyle1.replace('color', 'fill');
+          classes[id].textStyles.push(newStyle2);
+        }
+
+        classes[id].styles.push(s);
+      });
+    }
+  }
+};
+/**
+ * Called by parser when a graph definition is found, stores the direction of the chart.
+ * @param dir
+ */
+
+var setDirection = function setDirection(dir) {
+  direction = dir;
+
+  if (direction.match(/.*</)) {
+    direction = 'RL';
+  }
+
+  if (direction.match(/.*\^/)) {
+    direction = 'BT';
+  }
+
+  if (direction.match(/.*>/)) {
+    direction = 'LR';
+  }
+
+  if (direction.match(/.*v/)) {
+    direction = 'TB';
+  }
+};
+/**
+ * Called by parser when a special node is found, e.g. a clickable element.
+ * @param ids Comma separated list of ids
+ * @param className Class to add
+ */
+
+var setClass = function setClass(ids, className) {
+  ids.split(',').forEach(function (_id) {
+    var id = _id;
+    if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
+
+    if (typeof vertices[id] !== 'undefined') {
+      vertices[id].classes.push(className);
+    }
+
+    if (typeof subGraphLookup[id] !== 'undefined') {
+      subGraphLookup[id].classes.push(className);
+    }
+  });
+};
+
+var setTooltip = function setTooltip(ids, tooltip) {
+  ids.split(',').forEach(function (id) {
+    if (typeof tooltip !== 'undefined') {
+      tooltips[id] = _common_common__WEBPACK_IMPORTED_MODULE_3__["default"].sanitizeText(tooltip, config);
+    }
+  });
+};
+
+var setClickFun = function setClickFun(_id, functionName) {
+  var id = _id;
+  if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
+
+  if (_config__WEBPACK_IMPORTED_MODULE_2__["getConfig"]().securityLevel !== 'loose') {
+    return;
+  }
+
+  if (typeof functionName === 'undefined') {
+    return;
+  }
+
+  if (typeof vertices[id] !== 'undefined') {
+    funs.push(function () {
+      var elem = document.querySelector("[id=\"".concat(id, "\"]"));
+
+      if (elem !== null) {
+        elem.addEventListener('click', function () {
+          _utils__WEBPACK_IMPORTED_MODULE_1__["default"].runFunc(functionName, id);
+        }, false);
+      }
+    });
+  }
+};
+/**
+ * Called by parser when a link is found. Adds the URL to the vertex data.
+ * @param ids Comma separated list of ids
+ * @param linkStr URL to create a link for
+ * @param tooltip Tooltip for the clickable element
+ */
+
+
+var setLink = function setLink(ids, linkStr, tooltip, target) {
+  ids.split(',').forEach(function (_id) {
+    var id = _id;
+    if (_id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
+
+    if (typeof vertices[id] !== 'undefined') {
+      vertices[id].link = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].formatUrl(linkStr, config);
+      vertices[id].linkTarget = target;
+    }
+  });
+  setTooltip(ids, tooltip);
+  setClass(ids, 'clickable');
+};
+var getTooltip = function getTooltip(id) {
+  return tooltips[id];
+};
+/**
+ * Called by parser when a click definition is found. Registers an event handler.
+ * @param ids Comma separated list of ids
+ * @param functionName Function to be called on click
+ * @param tooltip Tooltip for the clickable element
+ */
+
+var setClickEvent = function setClickEvent(ids, functionName, tooltip) {
+  ids.split(',').forEach(function (id) {
+    setClickFun(id, functionName);
+  });
+  setTooltip(ids, tooltip);
+  setClass(ids, 'clickable');
+};
+var bindFunctions = function bindFunctions(element) {
+  funs.forEach(function (fun) {
+    fun(element);
+  });
+};
+var getDirection = function getDirection() {
+  return direction.trim();
+};
+/**
+ * Retrieval function for fetching the found nodes after parsing has completed.
+ * @returns {{}|*|vertices}
+ */
+
+var getVertices = function getVertices() {
+  return vertices;
+};
+/**
+ * Retrieval function for fetching the found links after parsing has completed.
+ * @returns {{}|*|edges}
+ */
+
+var getEdges = function getEdges() {
+  return edges;
+};
+/**
+ * Retrieval function for fetching the found class definitions after parsing has completed.
+ * @returns {{}|*|classes}
+ */
+
+var getClasses = function getClasses() {
+  return classes;
+};
+
+var setupToolTips = function setupToolTips(element) {
+  var tooltipElem = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('.mermaidTooltip');
+
+  if ((tooltipElem._groups || tooltipElem)[0][0] === null) {
+    tooltipElem = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('body').append('div').attr('class', 'mermaidTooltip').style('opacity', 0);
+  }
+
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(element).select('svg');
+  var nodes = svg.selectAll('g.node');
+  nodes.on('mouseover', function () {
+    var el = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(this);
+    var title = el.attr('title'); // Dont try to draw a tooltip if no data is provided
+
+    if (title === null) {
+      return;
+    }
+
+    var rect = this.getBoundingClientRect();
+    tooltipElem.transition().duration(200).style('opacity', '.9');
+    tooltipElem.html(el.attr('title')).style('left', window.scrollX + rect.left + (rect.right - rect.left) / 2 + 'px').style('top', window.scrollY + rect.top - 14 + document.body.scrollTop + 'px');
+    el.classed('hover', true);
+  }).on('mouseout', function () {
+    tooltipElem.transition().duration(500).style('opacity', 0);
+    var el = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])(this);
+    el.classed('hover', false);
+  });
+};
+
+funs.push(setupToolTips);
+/**
+ * Clears the internal graph db so that a new graph can be parsed.
+ */
+
+var clear = function clear() {
+  vertices = {};
+  classes = {};
+  edges = [];
+  funs = [];
+  funs.push(setupToolTips);
+  subGraphs = [];
+  subGraphLookup = {};
+  subCount = 0;
+  tooltips = [];
+  firstGraphFlag = true;
+};
+/**
+ *
+ * @returns {string}
+ */
+
+var defaultStyle = function defaultStyle() {
+  return 'fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;';
+};
+/**
+ * Clears the internal graph db so that a new graph can be parsed.
+ */
+
+var addSubGraph = function addSubGraph(_id, list, _title) {
+  var id = _id.trim();
+
+  var title = _title;
+
+  if (_id === _title && _title.match(/\s/)) {
+    id = undefined;
+  }
+
+  function uniq(a) {
+    var prims = {
+      boolean: {},
+      number: {},
+      string: {}
+    };
+    var objs = [];
+    return a.filter(function (item) {
+      var type = _typeof(item);
+
+      if (item.trim() === '') {
+        return false;
+      }
+
+      if (type in prims) {
+        return prims[type].hasOwnProperty(item) ? false : prims[type][item] = true; // eslint-disable-line
+      } else {
+        return objs.indexOf(item) >= 0 ? false : objs.push(item);
+      }
+    });
+  }
+
+  var nodeList = [];
+  nodeList = uniq(nodeList.concat.apply(nodeList, list));
+
+  for (var i = 0; i < nodeList.length; i++) {
+    if (nodeList[i][0].match(/\d/)) nodeList[i] = MERMAID_DOM_ID_PREFIX + nodeList[i];
+  }
+
+  id = id || 'subGraph' + subCount;
+  if (id[0].match(/\d/)) id = MERMAID_DOM_ID_PREFIX + id;
+  title = title || '';
+  title = _common_common__WEBPACK_IMPORTED_MODULE_3__["default"].sanitizeText(title, config);
+  subCount = subCount + 1;
+  var subGraph = {
+    id: id,
+    nodes: nodeList,
+    title: title.trim(),
+    classes: []
+  };
+  subGraphs.push(subGraph);
+  subGraphLookup[id] = subGraph;
+  return id;
+};
+
+var getPosForId = function getPosForId(id) {
+  for (var i = 0; i < subGraphs.length; i++) {
+    if (subGraphs[i].id === id) {
+      return i;
+    }
+  }
+
+  return -1;
+};
+
+var secCount = -1;
+var posCrossRef = [];
+
+var indexNodes2 = function indexNodes2(id, pos) {
+  var nodes = subGraphs[pos].nodes;
+  secCount = secCount + 1;
+
+  if (secCount > 2000) {
+    return;
+  }
+
+  posCrossRef[secCount] = pos; // Check if match
+
+  if (subGraphs[pos].id === id) {
+    return {
+      result: true,
+      count: 0
+    };
+  }
+
+  var count = 0;
+  var posCount = 1;
+
+  while (count < nodes.length) {
+    var childPos = getPosForId(nodes[count]); // Ignore regular nodes (pos will be -1)
+
+    if (childPos >= 0) {
+      var res = indexNodes2(id, childPos);
+
+      if (res.result) {
+        return {
+          result: true,
+          count: posCount + res.count
+        };
+      } else {
+        posCount = posCount + res.count;
+      }
+    }
+
+    count = count + 1;
+  }
+
+  return {
+    result: false,
+    count: posCount
+  };
+};
+
+var getDepthFirstPos = function getDepthFirstPos(pos) {
+  return posCrossRef[pos];
+};
+var indexNodes = function indexNodes() {
+  secCount = -1;
+
+  if (subGraphs.length > 0) {
+    indexNodes2('none', subGraphs.length - 1, 0);
+  }
+};
+var getSubGraphs = function getSubGraphs() {
+  return subGraphs;
+};
+var firstGraph = function firstGraph() {
+  if (firstGraphFlag) {
+    firstGraphFlag = false;
+    return true;
+  }
+
+  return false;
+};
+
+var destructStartLink = function destructStartLink(_str) {
+  var str = _str.trim();
+
+  var type = 'arrow_open';
+
+  switch (str[0]) {
+    case '<':
+      type = 'arrow_point';
+      str = str.slice(1);
+      break;
+
+    case 'x':
+      type = 'arrow_cross';
+      str = str.slice(1);
+      break;
+
+    case 'o':
+      type = 'arrow_circle';
+      str = str.slice(1);
+      break;
+  }
+
+  var stroke = 'normal';
+
+  if (str.indexOf('=') !== -1) {
+    stroke = 'thick';
+  }
+
+  if (str.indexOf('.') !== -1) {
+    stroke = 'dotted';
+  }
+
+  return {
+    type: type,
+    stroke: stroke
+  };
+};
+
+var countChar = function countChar(char, str) {
+  var length = str.length;
+  var count = 0;
+
+  for (var i = 0; i < length; ++i) {
+    if (str[i] === char) {
+      ++count;
+    }
+  }
+
+  return count;
+};
+
+var destructEndLink = function destructEndLink(_str) {
+  var str = _str.trim();
+
+  var line = str.slice(0, -1);
+  var type = 'arrow_open';
+
+  switch (str.slice(-1)) {
+    case 'x':
+      type = 'arrow_cross';
+
+      if (str[0] === 'x') {
+        type = 'double_' + type;
+        line = line.slice(1);
+      }
+
+      break;
+
+    case '>':
+      type = 'arrow_point';
+
+      if (str[0] === '<') {
+        type = 'double_' + type;
+        line = line.slice(1);
+      }
+
+      break;
+
+    case 'o':
+      type = 'arrow_circle';
+
+      if (str[0] === 'o') {
+        type = 'double_' + type;
+        line = line.slice(1);
+      }
+
+      break;
+  }
+
+  var stroke = 'normal';
+  var length = line.length - 1;
+
+  if (line[0] === '=') {
+    stroke = 'thick';
+  }
+
+  var dots = countChar('.', line);
+
+  if (dots) {
+    stroke = 'dotted';
+    length = dots;
+  }
+
+  return {
+    type: type,
+    stroke: stroke,
+    length: length
+  };
+};
+
+var destructLink = function destructLink(_str, _startStr) {
+  var info = destructEndLink(_str);
+  var startInfo;
+
+  if (_startStr) {
+    startInfo = destructStartLink(_startStr);
+
+    if (startInfo.stroke !== info.stroke) {
+      return {
+        type: 'INVALID',
+        stroke: 'INVALID'
+      };
+    }
+
+    if (startInfo.type === 'arrow_open') {
+      // -- xyz -->  - take arrow type from ending
+      startInfo.type = info.type;
+    } else {
+      // x-- xyz -->  - not supported
+      if (startInfo.type !== info.type) return {
+        type: 'INVALID',
+        stroke: 'INVALID'
+      };
+      startInfo.type = 'double_' + startInfo.type;
+    }
+
+    if (startInfo.type === 'double_arrow') {
+      startInfo.type = 'double_arrow_point';
+    }
+
+    startInfo.length = info.length;
+    return startInfo;
+  }
+
+  return info;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  parseDirective: parseDirective,
+  defaultConfig: function defaultConfig() {
+    return _config__WEBPACK_IMPORTED_MODULE_2__["defaultConfig"].flowchart;
+  },
+  addVertex: addVertex,
+  addLink: addLink,
+  updateLinkInterpolate: updateLinkInterpolate,
+  updateLink: updateLink,
+  addClass: addClass,
+  setDirection: setDirection,
+  setClass: setClass,
+  getTooltip: getTooltip,
+  setClickEvent: setClickEvent,
+  setLink: setLink,
+  bindFunctions: bindFunctions,
+  getDirection: getDirection,
+  getVertices: getVertices,
+  getEdges: getEdges,
+  getClasses: getClasses,
+  clear: clear,
+  defaultStyle: defaultStyle,
+  addSubGraph: addSubGraph,
+  getDepthFirstPos: getDepthFirstPos,
+  indexNodes: indexNodes,
+  getSubGraphs: getSubGraphs,
+  destructLink: destructLink,
+  lex: {
+    firstGraph: firstGraph
+  }
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/flowchart/flowRenderer-v2.js":
+/*!***************************************************!*\
+  !*** ./src/diagrams/flowchart/flowRenderer-v2.js ***!
+  \***************************************************/
+/*! exports provided: setConf, addVertices, addEdges, getClasses, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addVertices", function() { return addVertices; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addEdges", function() { return addEdges; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _flowDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./flowDb */ "./src/diagrams/flowchart/flowDb.js");
+/* harmony import */ var _parser_flow__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/flow */ "./src/diagrams/flowchart/parser/flow.jison");
+/* harmony import */ var _parser_flow__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_flow__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../dagre-wrapper/index.js */ "./src/dagre-wrapper/index.js");
+/* harmony import */ var dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! dagre-d3/lib/label/add-html-label.js */ "./node_modules/dagre-d3/lib/label/add-html-label.js");
+/* harmony import */ var dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+
+
+
+
+
+
+
+
+
+
+var conf = {};
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+
+  for (var i = 0; i < keys.length; i++) {
+    conf[keys[i]] = cnf[keys[i]];
+  }
+};
+/**
+ * Function that adds the vertices found during parsing to the graph to be rendered.
+ * @param vert Object containing the vertices.
+ * @param g The graph that is to be drawn.
+ */
+
+var addVertices = function addVertices(vert, g, svgId) {
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(svgId, "\"]"));
+  var keys = Object.keys(vert); // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition
+
+  keys.forEach(function (id) {
+    var vertex = vert[id];
+    /**
+     * Variable for storing the classes for the vertex
+     * @type {string}
+     */
+
+    var classStr = 'default';
+
+    if (vertex.classes.length > 0) {
+      classStr = vertex.classes.join(' ');
+    }
+
+    var styles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(vertex.styles); // Use vertex id as text in the box if no text is provided by the graph definition
+
+    var vertexText = vertex.text !== undefined ? vertex.text : vertex.id; // We create a SVG label, either by delegating to addHtmlLabel or manually
+
+    var vertexNode;
+
+    if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
+      // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?
+      var node = {
+        label: vertexText.replace(/fa[lrsb]?:fa-[\w-]+/g, function (s) {
+          return "<i class='".concat(s.replace(':', ' '), "'></i>");
+        })
+      };
+      vertexNode = dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6___default()(svg, node).node();
+      vertexNode.parentNode.removeChild(vertexNode);
+    } else {
+      var svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
+      svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));
+      var rows = vertexText.split(_common_common__WEBPACK_IMPORTED_MODULE_8__["default"].lineBreakRegex);
+
+      for (var j = 0; j < rows.length; j++) {
+        var tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
+        tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
+        tspan.setAttribute('dy', '1em');
+        tspan.setAttribute('x', '1');
+        tspan.textContent = rows[j];
+        svgLabel.appendChild(tspan);
+      }
+
+      vertexNode = svgLabel;
+    }
+
+    var radious = 0;
+    var _shape = ''; // Set the shape based parameters
+
+    switch (vertex.type) {
+      case 'round':
+        radious = 5;
+        _shape = 'rect';
+        break;
+
+      case 'square':
+        _shape = 'rect';
+        break;
+
+      case 'diamond':
+        _shape = 'question';
+        break;
+
+      case 'hexagon':
+        _shape = 'hexagon';
+        break;
+
+      case 'odd':
+        _shape = 'rect_left_inv_arrow';
+        break;
+
+      case 'lean_right':
+        _shape = 'lean_right';
+        break;
+
+      case 'lean_left':
+        _shape = 'lean_left';
+        break;
+
+      case 'trapezoid':
+        _shape = 'trapezoid';
+        break;
+
+      case 'inv_trapezoid':
+        _shape = 'inv_trapezoid';
+        break;
+
+      case 'odd_right':
+        _shape = 'rect_left_inv_arrow';
+        break;
+
+      case 'circle':
+        _shape = 'circle';
+        break;
+
+      case 'ellipse':
+        _shape = 'ellipse';
+        break;
+
+      case 'stadium':
+        _shape = 'stadium';
+        break;
+
+      case 'subroutine':
+        _shape = 'subroutine';
+        break;
+
+      case 'cylinder':
+        _shape = 'cylinder';
+        break;
+
+      case 'group':
+        _shape = 'rect';
+        break;
+
+      default:
+        _shape = 'rect';
+    } // Add the node
+
+
+    g.setNode(vertex.id, {
+      labelStyle: styles.labelStyle,
+      shape: _shape,
+      labelText: vertexText,
+      rx: radious,
+      ry: radious,
+      class: classStr,
+      style: styles.style,
+      id: vertex.id,
+      width: vertex.type === 'group' ? 500 : undefined,
+      type: vertex.type,
+      padding: Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.padding
+    });
+    _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('setNode', {
+      labelStyle: styles.labelStyle,
+      shape: _shape,
+      labelText: vertexText,
+      rx: radious,
+      ry: radious,
+      class: classStr,
+      style: styles.style,
+      id: vertex.id,
+      width: vertex.type === 'group' ? 500 : undefined,
+      type: vertex.type,
+      padding: Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.padding
+    });
+  });
+};
+/**
+ * Add edges to graph based on parsed graph defninition
+ * @param {Object} edges The edges to add to the graph
+ * @param {Object} g The graph object
+ */
+
+var addEdges = function addEdges(edges, g) {
+  var cnt = 0;
+  var defaultStyle;
+  var defaultLabelStyle;
+
+  if (typeof edges.defaultStyle !== 'undefined') {
+    var defaultStyles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(edges.defaultStyle);
+    defaultStyle = defaultStyles.style;
+    defaultLabelStyle = defaultStyles.labelStyle;
+  }
+
+  edges.forEach(function (edge) {
+    cnt++; // Identify Link
+
+    var linkId = 'L-' + edge.start + '-' + edge.end;
+    var linkNameStart = 'LS-' + edge.start;
+    var linkNameEnd = 'LE-' + edge.end;
+    var edgeData = {};
+    edgeData.minlen = edge.length || 1; //edgeData.id = 'id' + cnt;
+    // Set link type for rendering
+
+    if (edge.type === 'arrow_open') {
+      edgeData.arrowhead = 'none';
+    } else {
+      edgeData.arrowhead = 'normal';
+    } // Check of arrow types, placed here in order not to break old rendering
+
+
+    edgeData.arrowTypeStart = 'arrow_open';
+    edgeData.arrowTypeEnd = 'arrow_open';
+    /* eslint-disable no-fallthrough */
+
+    switch (edge.type) {
+      case 'double_arrow_cross':
+        edgeData.arrowTypeStart = 'arrow_cross';
+
+      case 'arrow_cross':
+        edgeData.arrowTypeEnd = 'arrow_cross';
+        break;
+
+      case 'double_arrow_point':
+        edgeData.arrowTypeStart = 'arrow_point';
+
+      case 'arrow_point':
+        edgeData.arrowTypeEnd = 'arrow_point';
+        break;
+
+      case 'double_arrow_circle':
+        edgeData.arrowTypeStart = 'arrow_circle';
+
+      case 'arrow_circle':
+        edgeData.arrowTypeEnd = 'arrow_circle';
+        break;
+    } // logger.info('apa', edgeData, edge);
+    // edgeData.arrowTypeStart = edge.arrowTypeStart;
+    // edgeData.arrowTypeStart = edge.arrowTypeStart;
+    // edgeData.arrowType = edgeData.arrowTypeEnd;
+    // logger.info('apa', edgeData, edge);
+
+
+    var style = '';
+    var labelStyle = '';
+
+    if (typeof edge.style !== 'undefined') {
+      var styles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(edge.style);
+      style = styles.style;
+      labelStyle = styles.labelStyle;
+    } else {
+      switch (edge.stroke) {
+        case 'normal':
+          style = 'fill:none';
+
+          if (typeof defaultStyle !== 'undefined') {
+            style = defaultStyle;
+          }
+
+          if (typeof defaultLabelStyle !== 'undefined') {
+            labelStyle = defaultLabelStyle;
+          }
+
+          edgeData.thickness = 'normal';
+          edgeData.pattern = 'solid';
+          break;
+
+        case 'dotted':
+          edgeData.thickness = 'normal';
+          edgeData.pattern = 'dotted';
+          break;
+
+        case 'thick':
+          edgeData.thickness = 'thick';
+          edgeData.pattern = 'solid';
+          break;
+      }
+    }
+
+    edgeData.style = style;
+    edgeData.labelStyle = labelStyle;
+
+    if (typeof edge.interpolate !== 'undefined') {
+      edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(edge.interpolate, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
+    } else if (typeof edges.defaultInterpolate !== 'undefined') {
+      edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(edges.defaultInterpolate, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
+    } else {
+      edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(conf.curve, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
+    }
+
+    if (typeof edge.text === 'undefined') {
+      if (typeof edge.style !== 'undefined') {
+        edgeData.arrowheadStyle = 'fill: #333';
+      }
+    } else {
+      edgeData.arrowheadStyle = 'fill: #333';
+      edgeData.labelpos = 'c';
+
+      if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels && false) {
+        // eslint-disable-line
+        edgeData.labelType = 'html';
+        edgeData.label = "<span id=\"L-".concat(linkId, "\" class=\"edgeLabel L-").concat(linkNameStart, "' L-").concat(linkNameEnd, "\">").concat(edge.text, "</span>");
+      } else {
+        edgeData.labelType = 'text';
+        edgeData.label = edge.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_8__["default"].lineBreakRegex, '\n');
+
+        if (typeof edge.style === 'undefined') {
+          edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none';
+        }
+
+        edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');
+      }
+    }
+
+    edgeData.id = linkId;
+    edgeData.classes = 'flowchart-link ' + linkNameStart + ' ' + linkNameEnd; // Add the edge to the graph
+
+    g.setEdge(edge.start, edge.end, edgeData, cnt);
+  });
+};
+/**
+ * Returns the all the styles from classDef statements in the graph definition.
+ * @returns {object} classDef styles
+ */
+
+var getClasses = function getClasses(text) {
+  _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Extracting classes');
+  _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
+  var parser = _parser_flow__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
+  parser.yy = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"];
+
+  try {
+    // Parse the graph definition
+    parser.parse(text);
+  } catch (e) {
+    return;
+  }
+
+  return _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getClasses();
+};
+/**
+ * Draws a flowchart in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+
+var draw = function draw(text, id) {
+  _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Drawing flowchart');
+  _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
+  var parser = _parser_flow__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
+  parser.yy = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
+  // try {
+
+  parser.parse(text); // } catch (err) {
+  // logger.debug('Parsing failed');
+  // }
+  // Fetch the default direction, use TD if none was found
+
+  var dir = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getDirection();
+
+  if (typeof dir === 'undefined') {
+    dir = 'TD';
+  }
+
+  var conf = Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart;
+  var nodeSpacing = conf.nodeSpacing || 50;
+  var rankSpacing = conf.rankSpacing || 50; // Create the input mermaid.graph
+
+  var g = new graphlib__WEBPACK_IMPORTED_MODULE_0___default.a.Graph({
+    multigraph: true,
+    compound: true
+  }).setGraph({
+    rankdir: dir,
+    nodesep: nodeSpacing,
+    ranksep: rankSpacing,
+    marginx: 8,
+    marginy: 8
+  }).setDefaultEdgeLabel(function () {
+    return {};
+  });
+  var subG;
+  var subGraphs = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getSubGraphs();
+  _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Subgraphs - ', subGraphs);
+
+  for (var _i = subGraphs.length - 1; _i >= 0; _i--) {
+    subG = subGraphs[_i];
+    _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Subgraph - ', subG);
+    _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].addVertex(subG.id, subG.title, 'group', undefined, subG.classes);
+  } // Fetch the verices/nodes and edges/links from the parsed graph definition
+
+
+  var vert = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getVertices();
+  var edges = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getEdges();
+  _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info(edges);
+  var i = 0;
+
+  for (i = subGraphs.length - 1; i >= 0; i--) {
+    subG = subGraphs[i];
+    Object(d3__WEBPACK_IMPORTED_MODULE_1__["selectAll"])('cluster').append('text');
+
+    for (var j = 0; j < subG.nodes.length; j++) {
+      g.setParent(subG.nodes[j], subG.id);
+    }
+  }
+
+  addVertices(vert, g, id);
+  addEdges(edges, g); // Add custom shapes
+  // flowChartShapes.addToRenderV2(addShape);
+  // Set up an SVG group so that we can translate the final graph.
+
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(id, "\"]"));
+  svg.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink'); // Run the renderer. This is what draws the final graph.
+
+  var element = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' g');
+  Object(_dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_5__["render"])(element, g, ['point', 'circle', 'cross'], 'flowchart', id); // dagre.layout(g);
+
+  element.selectAll('g.node').attr('title', function () {
+    return _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getTooltip(this.id);
+  });
+  var padding = conf.diagramPadding;
+  var svgBounds = svg.node().getBBox();
+  var width = svgBounds.width + padding * 2;
+  var height = svgBounds.height + padding * 2;
+  _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].debug("new ViewBox 0 0 ".concat(width, " ").concat(height), "translate(".concat(padding - g._label.marginx, ", ").concat(padding - g._label.marginy, ")"));
+
+  if (conf.useMaxWidth) {
+    svg.attr('width', '100%');
+    svg.attr('style', "max-width: ".concat(width, "px;"));
+  } else {
+    svg.attr('height', height);
+    svg.attr('width', width);
+  }
+
+  svg.attr('viewBox', "0 0 ".concat(width, " ").concat(height));
+  svg.select('g').attr('transform', "translate(".concat(padding - g._label.marginx, ", ").concat(padding - svgBounds.y, ")")); // Index nodes
+
+  _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].indexNodes('subGraph' + i); // // reposition labels
+  // for (i = 0; i < subGraphs.length; i++) {
+  //   subG = subGraphs[i];
+  //   if (subG.title !== 'undefined') {
+  //     const clusterRects = document.querySelectorAll('#' + id + ' [id="' + subG.id + '"] rect');
+  //     const clusterEl = document.querySelectorAll('#' + id + ' [id="' + subG.id + '"]');
+  //     const xPos = clusterRects[0].x.baseVal.value;
+  //     const yPos = clusterRects[0].y.baseVal.value;
+  //     const width = clusterRects[0].width.baseVal.value;
+  //     const cluster = d3.select(clusterEl[0]);
+  //     const te = cluster.select('.label');
+  //     te.attr('transform', `translate(${xPos + width / 2}, ${yPos + 14})`);
+  //     te.attr('id', id + 'Text');
+  //     for (let j = 0; j < subG.classes.length; j++) {
+  //       clusterEl[0].classList.add(subG.classes[j]);
+  //     }
+  //   }
+  // }
+  // Add label rects for non html labels
+
+  if (!conf.htmlLabels) {
+    var labels = document.querySelectorAll('[id="' + id + '"] .edgeLabel .label');
+
+    for (var k = 0; k < labels.length; k++) {
+      var label = labels[k]; // Get dimensions of label
+
+      var dim = label.getBBox();
+      var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
+      rect.setAttribute('rx', 0);
+      rect.setAttribute('ry', 0);
+      rect.setAttribute('width', dim.width);
+      rect.setAttribute('height', dim.height); // rect.setAttribute('style', 'fill:#e8e8e8;');
+
+      label.insertBefore(rect, label.firstChild);
+    }
+  } // If node has a link, wrap it in an anchor SVG object.
+
+
+  var keys = Object.keys(vert);
+  keys.forEach(function (key) {
+    var vertex = vert[key];
+
+    if (vertex.link) {
+      var node = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' [id="' + key + '"]');
+
+      if (node) {
+        var link = document.createElementNS('http://www.w3.org/2000/svg', 'a');
+        link.setAttributeNS('http://www.w3.org/2000/svg', 'class', vertex.classes.join(' '));
+        link.setAttributeNS('http://www.w3.org/2000/svg', 'href', vertex.link);
+        link.setAttributeNS('http://www.w3.org/2000/svg', 'rel', 'noopener');
+
+        if (vertex.linkTarget) {
+          link.setAttributeNS('http://www.w3.org/2000/svg', 'target', vertex.linkTarget);
+        }
+
+        var linkNode = node.insert(function () {
+          return link;
+        }, ':first-child');
+        var shape = node.select('.label-container');
+
+        if (shape) {
+          linkNode.append(function () {
+            return shape.node();
+          });
+        }
+
+        var _label = node.select('.label');
+
+        if (_label) {
+          linkNode.append(function () {
+            return _label.node();
+          });
+        }
+      }
+    }
+  });
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  addVertices: addVertices,
+  addEdges: addEdges,
+  getClasses: getClasses,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/flowchart/flowRenderer.js":
+/*!************************************************!*\
+  !*** ./src/diagrams/flowchart/flowRenderer.js ***!
+  \************************************************/
+/*! exports provided: setConf, addVertices, addEdges, getClasses, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addVertices", function() { return addVertices; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addEdges", function() { return addEdges; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _flowDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./flowDb */ "./src/diagrams/flowchart/flowDb.js");
+/* harmony import */ var _parser_flow__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/flow */ "./src/diagrams/flowchart/parser/flow.jison");
+/* harmony import */ var _parser_flow__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_flow__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var dagre_d3__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! dagre-d3 */ "./node_modules/dagre-d3/index.js");
+/* harmony import */ var dagre_d3__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(dagre_d3__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! dagre-d3/lib/label/add-html-label.js */ "./node_modules/dagre-d3/lib/label/add-html-label.js");
+/* harmony import */ var dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+/* harmony import */ var _flowChartShapes__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./flowChartShapes */ "./src/diagrams/flowchart/flowChartShapes.js");
+
+
+
+
+
+
+
+
+
+
+
+var conf = {};
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+
+  for (var i = 0; i < keys.length; i++) {
+    conf[keys[i]] = cnf[keys[i]];
+  }
+};
+/**
+ * Function that adds the vertices found in the graph definition to the graph to be rendered.
+ * @param vert Object containing the vertices.
+ * @param g The graph that is to be drawn.
+ */
+
+var addVertices = function addVertices(vert, g, svgId) {
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(svgId, "\"]"));
+  var keys = Object.keys(vert); // Iterate through each item in the vertex object (containing all the vertices found) in the graph definition
+
+  keys.forEach(function (id) {
+    var vertex = vert[id];
+    /**
+     * Variable for storing the classes for the vertex
+     * @type {string}
+     */
+
+    var classStr = 'default';
+
+    if (vertex.classes.length > 0) {
+      classStr = vertex.classes.join(' ');
+    }
+
+    var styles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(vertex.styles); // Use vertex id as text in the box if no text is provided by the graph definition
+
+    var vertexText = vertex.text !== undefined ? vertex.text : vertex.id; // We create a SVG label, either by delegating to addHtmlLabel or manually
+
+    var vertexNode;
+
+    if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
+      // TODO: addHtmlLabel accepts a labelStyle. Do we possibly have that?
+      var node = {
+        label: vertexText.replace(/fa[lrsb]?:fa-[\w-]+/g, function (s) {
+          return "<i class='".concat(s.replace(':', ' '), "'></i>");
+        })
+      };
+      vertexNode = dagre_d3_lib_label_add_html_label_js__WEBPACK_IMPORTED_MODULE_6___default()(svg, node).node();
+      vertexNode.parentNode.removeChild(vertexNode);
+    } else {
+      var svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
+      svgLabel.setAttribute('style', styles.labelStyle.replace('color:', 'fill:'));
+      var rows = vertexText.split(_common_common__WEBPACK_IMPORTED_MODULE_8__["default"].lineBreakRegex);
+
+      for (var j = 0; j < rows.length; j++) {
+        var tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
+        tspan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve');
+        tspan.setAttribute('dy', '1em');
+        tspan.setAttribute('x', '1');
+        tspan.textContent = rows[j];
+        svgLabel.appendChild(tspan);
+      }
+
+      vertexNode = svgLabel;
+    }
+
+    var radious = 0;
+    var _shape = ''; // Set the shape based parameters
+
+    switch (vertex.type) {
+      case 'round':
+        radious = 5;
+        _shape = 'rect';
+        break;
+
+      case 'square':
+        _shape = 'rect';
+        break;
+
+      case 'diamond':
+        _shape = 'question';
+        break;
+
+      case 'hexagon':
+        _shape = 'hexagon';
+        break;
+
+      case 'odd':
+        _shape = 'rect_left_inv_arrow';
+        break;
+
+      case 'lean_right':
+        _shape = 'lean_right';
+        break;
+
+      case 'lean_left':
+        _shape = 'lean_left';
+        break;
+
+      case 'trapezoid':
+        _shape = 'trapezoid';
+        break;
+
+      case 'inv_trapezoid':
+        _shape = 'inv_trapezoid';
+        break;
+
+      case 'odd_right':
+        _shape = 'rect_left_inv_arrow';
+        break;
+
+      case 'circle':
+        _shape = 'circle';
+        break;
+
+      case 'ellipse':
+        _shape = 'ellipse';
+        break;
+
+      case 'stadium':
+        _shape = 'stadium';
+        break;
+
+      case 'subroutine':
+        _shape = 'subroutine';
+        break;
+
+      case 'cylinder':
+        _shape = 'cylinder';
+        break;
+
+      case 'group':
+        _shape = 'rect';
+        break;
+
+      default:
+        _shape = 'rect';
+    } // Add the node
+
+
+    g.setNode(vertex.id, {
+      labelType: 'svg',
+      labelStyle: styles.labelStyle,
+      shape: _shape,
+      label: vertexNode,
+      rx: radious,
+      ry: radious,
+      class: classStr,
+      style: styles.style,
+      id: vertex.id
+    });
+  });
+};
+/**
+ * Add edges to graph based on parsed graph defninition
+ * @param {Object} edges The edges to add to the graph
+ * @param {Object} g The graph object
+ */
+
+var addEdges = function addEdges(edges, g) {
+  var cnt = 0;
+  var defaultStyle;
+  var defaultLabelStyle;
+
+  if (typeof edges.defaultStyle !== 'undefined') {
+    var defaultStyles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(edges.defaultStyle);
+    defaultStyle = defaultStyles.style;
+    defaultLabelStyle = defaultStyles.labelStyle;
+  }
+
+  edges.forEach(function (edge) {
+    cnt++; // Identify Link
+
+    var linkId = 'L-' + edge.start + '-' + edge.end;
+    var linkNameStart = 'LS-' + edge.start;
+    var linkNameEnd = 'LE-' + edge.end;
+    var edgeData = {}; // Set link type for rendering
+
+    if (edge.type === 'arrow_open') {
+      edgeData.arrowhead = 'none';
+    } else {
+      edgeData.arrowhead = 'normal';
+    }
+
+    var style = '';
+    var labelStyle = '';
+
+    if (typeof edge.style !== 'undefined') {
+      var styles = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["getStylesFromArray"])(edge.style);
+      style = styles.style;
+      labelStyle = styles.labelStyle;
+    } else {
+      switch (edge.stroke) {
+        case 'normal':
+          style = 'fill:none';
+
+          if (typeof defaultStyle !== 'undefined') {
+            style = defaultStyle;
+          }
+
+          if (typeof defaultLabelStyle !== 'undefined') {
+            labelStyle = defaultLabelStyle;
+          }
+
+          break;
+
+        case 'dotted':
+          style = 'fill:none;stroke-width:2px;stroke-dasharray:3;';
+          break;
+
+        case 'thick':
+          style = ' stroke-width: 3.5px;fill:none';
+          break;
+      }
+    }
+
+    edgeData.style = style;
+    edgeData.labelStyle = labelStyle;
+
+    if (typeof edge.interpolate !== 'undefined') {
+      edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(edge.interpolate, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
+    } else if (typeof edges.defaultInterpolate !== 'undefined') {
+      edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(edges.defaultInterpolate, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
+    } else {
+      edgeData.curve = Object(_utils__WEBPACK_IMPORTED_MODULE_9__["interpolateToCurve"])(conf.curve, d3__WEBPACK_IMPORTED_MODULE_1__["curveLinear"]);
+    }
+
+    if (typeof edge.text === 'undefined') {
+      if (typeof edge.style !== 'undefined') {
+        edgeData.arrowheadStyle = 'fill: #333';
+      }
+    } else {
+      edgeData.arrowheadStyle = 'fill: #333';
+      edgeData.labelpos = 'c';
+
+      if (Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart.htmlLabels) {
+        edgeData.labelType = 'html';
+        edgeData.label = "<span id=\"L-".concat(linkId, "\" class=\"edgeLabel L-").concat(linkNameStart, "' L-").concat(linkNameEnd, "\">").concat(edge.text, "</span>");
+      } else {
+        edgeData.labelType = 'text';
+        edgeData.label = edge.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_8__["default"].lineBreakRegex, '\n');
+
+        if (typeof edge.style === 'undefined') {
+          edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none';
+        }
+
+        edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');
+      }
+    }
+
+    edgeData.id = linkId;
+    edgeData.class = linkNameStart + ' ' + linkNameEnd;
+    edgeData.minlen = edge.length || 1; // Add the edge to the graph
+
+    g.setEdge(edge.start, edge.end, edgeData, cnt);
+  });
+};
+/**
+ * Returns the all the styles from classDef statements in the graph definition.
+ * @returns {object} classDef styles
+ */
+
+var getClasses = function getClasses(text) {
+  _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Extracting classes');
+  _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
+
+  try {
+    var parser = _parser_flow__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
+    parser.yy = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
+
+    parser.parse(text);
+    return _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getClasses();
+  } catch (e) {
+    return;
+  }
+};
+/**
+ * Draws a flowchart in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+
+var draw = function draw(text, id) {
+  _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].info('Drawing flowchart');
+  _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
+  var parser = _parser_flow__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
+  parser.yy = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
+  // try {
+
+  parser.parse(text); // } catch (err) {
+  // logger.debug('Parsing failed');
+  // }
+  // Fetch the default direction, use TD if none was found
+
+  var dir = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getDirection();
+
+  if (typeof dir === 'undefined') {
+    dir = 'TD';
+  }
+
+  var conf = Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().flowchart;
+  var nodeSpacing = conf.nodeSpacing || 50;
+  var rankSpacing = conf.rankSpacing || 50; // Create the input mermaid.graph
+
+  var g = new graphlib__WEBPACK_IMPORTED_MODULE_0___default.a.Graph({
+    multigraph: true,
+    compound: true
+  }).setGraph({
+    rankdir: dir,
+    nodesep: nodeSpacing,
+    ranksep: rankSpacing,
+    marginx: 8,
+    marginy: 8
+  }).setDefaultEdgeLabel(function () {
+    return {};
+  });
+  var subG;
+  var subGraphs = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getSubGraphs();
+
+  for (var _i = subGraphs.length - 1; _i >= 0; _i--) {
+    subG = subGraphs[_i];
+    _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].addVertex(subG.id, subG.title, 'group', undefined, subG.classes);
+  } // Fetch the verices/nodes and edges/links from the parsed graph definition
+
+
+  var vert = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getVertices();
+  var edges = _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getEdges();
+  var i = 0;
+
+  for (i = subGraphs.length - 1; i >= 0; i--) {
+    subG = subGraphs[i];
+    Object(d3__WEBPACK_IMPORTED_MODULE_1__["selectAll"])('cluster').append('text');
+
+    for (var j = 0; j < subG.nodes.length; j++) {
+      g.setParent(subG.nodes[j], subG.id);
+    }
+  }
+
+  addVertices(vert, g, id);
+  addEdges(edges, g); // Create the renderer
+
+  var Render = dagre_d3__WEBPACK_IMPORTED_MODULE_5___default.a.render;
+  var render = new Render(); // Add custom shapes
+
+  _flowChartShapes__WEBPACK_IMPORTED_MODULE_10__["default"].addToRender(render); // Add our custom arrow - an empty arrowhead
+
+  render.arrows().none = function normal(parent, id, edge, type) {
+    var marker = parent.append('marker').attr('id', id).attr('viewBox', '0 0 10 10').attr('refX', 9).attr('refY', 5).attr('markerUnits', 'strokeWidth').attr('markerWidth', 8).attr('markerHeight', 6).attr('orient', 'auto');
+    var path = marker.append('path').attr('d', 'M 0 0 L 0 0 L 0 0 z');
+    dagre_d3__WEBPACK_IMPORTED_MODULE_5___default.a.util.applyStyle(path, edge[type + 'Style']);
+  }; // Override normal arrowhead defined in d3. Remove style & add class to allow css styling.
+
+
+  render.arrows().normal = function normal(parent, id) {
+    var marker = parent.append('marker').attr('id', id).attr('viewBox', '0 0 10 10').attr('refX', 9).attr('refY', 5).attr('markerUnits', 'strokeWidth').attr('markerWidth', 8).attr('markerHeight', 6).attr('orient', 'auto');
+    marker.append('path').attr('d', 'M 0 0 L 10 5 L 0 10 z').attr('class', 'arrowheadPath').style('stroke-width', 1).style('stroke-dasharray', '1,0');
+  }; // Set up an SVG group so that we can translate the final graph.
+
+
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(id, "\"]"));
+  svg.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink'); // Run the renderer. This is what draws the final graph.
+
+  var element = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' g');
+  render(element, g);
+  element.selectAll('g.node').attr('title', function () {
+    return _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].getTooltip(this.id);
+  });
+  var padding = conf.diagramPadding;
+  var svgBounds = svg.node().getBBox();
+  var width = svgBounds.width + padding * 2;
+  var height = svgBounds.height + padding * 2;
+
+  if (conf.useMaxWidth) {
+    svg.attr('width', '100%');
+    svg.attr('style', "max-width: ".concat(width, "px;"));
+  } else {
+    svg.attr('height', height);
+    svg.attr('width', width);
+  } // Ensure the viewBox includes the whole svgBounds area with extra space for padding
+
+
+  var vBox = "".concat(svgBounds.x - padding, " ").concat(svgBounds.y - padding, " ").concat(width, " ").concat(height);
+  _logger__WEBPACK_IMPORTED_MODULE_7__["logger"].debug("viewBox ".concat(vBox));
+  svg.attr('viewBox', vBox); // Index nodes
+
+  _flowDb__WEBPACK_IMPORTED_MODULE_2__["default"].indexNodes('subGraph' + i); // reposition labels
+
+  for (i = 0; i < subGraphs.length; i++) {
+    subG = subGraphs[i];
+
+    if (subG.title !== 'undefined') {
+      var clusterRects = document.querySelectorAll('#' + id + ' [id="' + subG.id + '"] rect');
+      var clusterEl = document.querySelectorAll('#' + id + ' [id="' + subG.id + '"]');
+      var xPos = clusterRects[0].x.baseVal.value;
+      var yPos = clusterRects[0].y.baseVal.value;
+      var _width = clusterRects[0].width.baseVal.value;
+      var cluster = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])(clusterEl[0]);
+      var te = cluster.select('.label');
+      te.attr('transform', "translate(".concat(xPos + _width / 2, ", ").concat(yPos + 14, ")"));
+      te.attr('id', id + 'Text');
+
+      for (var _j = 0; _j < subG.classes.length; _j++) {
+        clusterEl[0].classList.add(subG.classes[_j]);
+      }
+    }
+  } // Add label rects for non html labels
+
+
+  if (!conf.htmlLabels || true) {
+    // eslint-disable-line
+    var labels = document.querySelectorAll('[id="' + id + '"] .edgeLabel .label');
+
+    for (var k = 0; k < labels.length; k++) {
+      var label = labels[k]; // Get dimensions of label
+
+      var dim = label.getBBox();
+      var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
+      rect.setAttribute('rx', 0);
+      rect.setAttribute('ry', 0);
+      rect.setAttribute('width', dim.width);
+      rect.setAttribute('height', dim.height); // rect.setAttribute('style', 'fill:#e8e8e8;');
+
+      label.insertBefore(rect, label.firstChild);
+    }
+  } // If node has a link, wrap it in an anchor SVG object.
+
+
+  var keys = Object.keys(vert);
+  keys.forEach(function (key) {
+    var vertex = vert[key];
+
+    if (vertex.link) {
+      var node = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' [id="' + key + '"]');
+
+      if (node) {
+        var link = document.createElementNS('http://www.w3.org/2000/svg', 'a');
+        link.setAttributeNS('http://www.w3.org/2000/svg', 'class', vertex.classes.join(' '));
+        link.setAttributeNS('http://www.w3.org/2000/svg', 'href', vertex.link);
+        link.setAttributeNS('http://www.w3.org/2000/svg', 'rel', 'noopener');
+
+        if (vertex.linkTarget) {
+          link.setAttributeNS('http://www.w3.org/2000/svg', 'target', vertex.linkTarget);
+        }
+
+        var linkNode = node.insert(function () {
+          return link;
+        }, ':first-child');
+        var shape = node.select('.label-container');
+
+        if (shape) {
+          linkNode.append(function () {
+            return shape.node();
+          });
+        }
+
+        var _label = node.select('.label');
+
+        if (_label) {
+          linkNode.append(function () {
+            return _label.node();
+          });
+        }
+      }
+    }
+  });
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  addVertices: addVertices,
+  addEdges: addEdges,
+  getClasses: getClasses,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/flowchart/parser/flow.jison":
+/*!**************************************************!*\
+  !*** ./src/diagrams/flowchart/parser/flow.jison ***!
+  \**************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,9],$V1=[1,7],$V2=[1,6],$V3=[1,8],$V4=[1,20,21,22,23,38,46,75,76,77,78,79,80,91,92,95,96,97,99,100,106,107,108,109,110,111],$V5=[2,10],$V6=[1,20],$V7=[1,21],$V8=[1,22],$V9=[1,23],$Va=[1,30],$Vb=[1,54],$Vc=[1,32],$Vd=[1,33],$Ve=[1,34],$Vf=[1,35],$Vg=[1,36],$Vh=[1,48],$Vi=[1,43],$Vj=[1,45],$Vk=[1,40],$Vl=[1,44],$Vm=[1,47],$Vn=[1,51],$Vo=[1,52],$Vp=[1,53],$Vq=[1,42],$Vr=[1,46],$Vs=[1,49],$Vt=[1,50],$Vu=[1,41],$Vv=[1,57],$Vw=[1,62],$Vx=[1,20,21,22,23,38,42,46,75,76,77,78,79,80,91,92,95,96,97,99,100,106,107,108,109,110,111],$Vy=[1,66],$Vz=[1,65],$VA=[1,67],$VB=[20,21,23,69,70],$VC=[20,21,22,23,69,70],$VD=[20,21,22,23,47,69,70],$VE=[20,21,22,23,40,46,47,49,51,53,55,57,59,61,62,64,69,70,80,91,92,95,96,97,99,100,106,107,108,109,110,111],$VF=[20,21,23],$VG=[20,21,23,46,69,70,80,91,92,95,96,97,99,100,106,107,108,109,110,111],$VH=[1,12,20,21,22,23,24,38,42,46,75,76,77,78,79,80,91,92,95,96,97,99,100,106,107,108,109,110,111],$VI=[46,80,91,92,95,96,97,99,100,106,107,108,109,110,111],$VJ=[1,115],$VK=[1,136],$VL=[1,137],$VM=[1,138],$VN=[1,139],$VO=[1,119],$VP=[1,110],$VQ=[1,111],$VR=[1,107],$VS=[1,131],$VT=[1,132],$VU=[1,133],$VV=[1,134],$VW=[1,135],$VX=[1,140],$VY=[1,141],$VZ=[1,113],$V_=[1,121],$V$=[1,124],$V01=[1,122],$V11=[1,123],$V21=[1,116],$V31=[1,129],$V41=[1,128],$V51=[1,112],$V61=[1,109],$V71=[1,118],$V81=[1,120],$V91=[1,125],$Va1=[1,126],$Vb1=[1,127],$Vc1=[1,130],$Vd1=[20,21,22,23,38,42,46,75,76,77,78,79,80,91,92,95,96,97,99,100,106,107,108,109,110,111],$Ve1=[1,144],$Vf1=[1,148],$Vg1=[1,150],$Vh1=[1,151],$Vi1=[12,21,22,24],$Vj1=[20,21,22,23,24,26,38,40,41,42,46,50,52,54,56,58,60,61,63,65,69,70,71,75,76,77,78,79,80,81,84,91,92,95,96,97,99,100,101,102,106,107,108,109,110,111],$Vk1=[20,21,22,23,26,46,80,91,92,95,96,97,99,100,106,107,108,109,110,111],$Vl1=[22,92],$Vm1=[1,220],$Vn1=[1,224],$Vo1=[1,221],$Vp1=[1,218],$Vq1=[1,215],$Vr1=[1,216],$Vs1=[1,217],$Vt1=[1,219],$Vu1=[1,222],$Vv1=[1,223],$Vw1=[1,225],$Vx1=[1,241],$Vy1=[20,21,23,92],$Vz1=[20,21,22,23,75,88,91,92,95,96,97,98,99,100,101];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"mermaidDoc":4,"directive":5,"openDirective":6,"typeDirective":7,"closeDirective":8,"separator":9,":":10,"argDirective":11,"open_directive":12,"type_directive":13,"arg_directive":14,"close_directive":15,"graphConfig":16,"document":17,"line":18,"statement":19,"SEMI":20,"NEWLINE":21,"SPACE":22,"EOF":23,"GRAPH":24,"NODIR":25,"DIR":26,"FirstStmtSeperator":27,"ending":28,"endToken":29,"spaceList":30,"spaceListNewline":31,"verticeStatement":32,"styleStatement":33,"linkStyleStatement":34,"classDefStatement":35,"classStatement":36,"clickStatement":37,"subgraph":38,"text":39,"SQS":40,"SQE":41,"end":42,"link":43,"node":44,"vertex":45,"AMP":46,"STYLE_SEPARATOR":47,"idString":48,"PS":49,"PE":50,"(-":51,"-)":52,"STADIUMSTART":53,"STADIUMEND":54,"SUBROUTINESTART":55,"SUBROUTINEEND":56,"CYLINDERSTART":57,"CYLINDEREND":58,"DIAMOND_START":59,"DIAMOND_STOP":60,"TAGEND":61,"TRAPSTART":62,"TRAPEND":63,"INVTRAPSTART":64,"INVTRAPEND":65,"linkStatement":66,"arrowText":67,"TESTSTR":68,"START_LINK":69,"LINK":70,"PIPE":71,"textToken":72,"STR":73,"keywords":74,"STYLE":75,"LINKSTYLE":76,"CLASSDEF":77,"CLASS":78,"CLICK":79,"DOWN":80,"UP":81,"textNoTags":82,"textNoTagsToken":83,"DEFAULT":84,"stylesOpt":85,"alphaNum":86,"LINK_TARGET":87,"HEX":88,"numList":89,"INTERPOLATE":90,"NUM":91,"COMMA":92,"style":93,"styleComponent":94,"ALPHA":95,"COLON":96,"MINUS":97,"UNIT":98,"BRKT":99,"DOT":100,"PCT":101,"TAGSTART":102,"alphaNumToken":103,"idStringToken":104,"alphaNumStatement":105,"PUNCTUATION":106,"UNICODE_TEXT":107,"PLUS":108,"EQUALS":109,"MULT":110,"UNDERSCORE":111,"graphCodeTokens":112,"ARROW_CROSS":113,"ARROW_POINT":114,"ARROW_CIRCLE":115,"ARROW_OPEN":116,"QUOTE":117,"$accept":0,"$end":1},
+terminals_: {2:"error",10:":",12:"open_directive",13:"type_directive",14:"arg_directive",15:"close_directive",20:"SEMI",21:"NEWLINE",22:"SPACE",23:"EOF",24:"GRAPH",25:"NODIR",26:"DIR",38:"subgraph",40:"SQS",41:"SQE",42:"end",46:"AMP",47:"STYLE_SEPARATOR",49:"PS",50:"PE",51:"(-",52:"-)",53:"STADIUMSTART",54:"STADIUMEND",55:"SUBROUTINESTART",56:"SUBROUTINEEND",57:"CYLINDERSTART",58:"CYLINDEREND",59:"DIAMOND_START",60:"DIAMOND_STOP",61:"TAGEND",62:"TRAPSTART",63:"TRAPEND",64:"INVTRAPSTART",65:"INVTRAPEND",68:"TESTSTR",69:"START_LINK",70:"LINK",71:"PIPE",73:"STR",75:"STYLE",76:"LINKSTYLE",77:"CLASSDEF",78:"CLASS",79:"CLICK",80:"DOWN",81:"UP",84:"DEFAULT",87:"LINK_TARGET",88:"HEX",90:"INTERPOLATE",91:"NUM",92:"COMMA",95:"ALPHA",96:"COLON",97:"MINUS",98:"UNIT",99:"BRKT",100:"DOT",101:"PCT",102:"TAGSTART",106:"PUNCTUATION",107:"UNICODE_TEXT",108:"PLUS",109:"EQUALS",110:"MULT",111:"UNDERSCORE",113:"ARROW_CROSS",114:"ARROW_POINT",115:"ARROW_CIRCLE",116:"ARROW_OPEN",117:"QUOTE"},
+productions_: [0,[3,1],[3,2],[5,4],[5,6],[6,1],[7,1],[11,1],[8,1],[4,2],[17,0],[17,2],[18,1],[18,1],[18,1],[18,1],[18,1],[16,2],[16,2],[16,2],[16,3],[28,2],[28,1],[29,1],[29,1],[29,1],[27,1],[27,1],[27,2],[31,2],[31,2],[31,1],[31,1],[30,2],[30,1],[19,2],[19,2],[19,2],[19,2],[19,2],[19,2],[19,9],[19,6],[19,4],[9,1],[9,1],[9,1],[32,3],[32,4],[32,2],[32,1],[44,1],[44,5],[44,3],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[43,2],[43,3],[43,3],[43,1],[43,3],[66,1],[67,3],[39,1],[39,2],[39,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[82,1],[82,2],[35,5],[35,5],[36,5],[37,5],[37,7],[37,5],[37,7],[37,7],[37,9],[33,5],[33,5],[34,5],[34,5],[34,9],[34,9],[34,7],[34,7],[89,1],[89,3],[85,1],[85,3],[93,1],[93,2],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[94,1],[72,1],[72,1],[72,1],[72,1],[72,1],[72,1],[83,1],[83,1],[83,1],[83,1],[48,1],[48,2],[86,1],[86,2],[105,1],[105,1],[105,1],[105,1],[103,1],[103,1],[103,1],[103,1],[103,1],[103,1],[103,1],[103,1],[103,1],[103,1],[103,1],[103,1],[103,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[104,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1],[112,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 5:
+ yy.parseDirective('%%{', 'open_directive'); 
+break;
+case 6:
+ yy.parseDirective($$[$0], 'type_directive'); 
+break;
+case 7:
+ $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); 
+break;
+case 8:
+ yy.parseDirective('}%%', 'close_directive', 'flowchart'); 
+break;
+case 10:
+ this.$ = [];
+break;
+case 11:
+
+	    if($$[$0] !== []){
+	        $$[$0-1].push($$[$0]);
+	    }
+	    this.$=$$[$0-1];
+break;
+case 12: case 76: case 78: case 90: case 138: case 140: case 141:
+this.$=$$[$0];
+break;
+case 19:
+ yy.setDirection('TB');this.$ = 'TB';
+break;
+case 20:
+ yy.setDirection($$[$0-1]);this.$ = $$[$0-1];
+break;
+case 35:
+ /* console.warn('finat vs', $$[$0-1].nodes); */ this.$=$$[$0-1].nodes
+break;
+case 36: case 37: case 38: case 39: case 40:
+this.$=[];
+break;
+case 41:
+this.$=yy.addSubGraph($$[$0-6],$$[$0-1],$$[$0-4]);
+break;
+case 42:
+this.$=yy.addSubGraph($$[$0-3],$$[$0-1],$$[$0-3]);
+break;
+case 43:
+this.$=yy.addSubGraph(undefined,$$[$0-1],undefined);
+break;
+case 47:
+ /* console.warn('vs',$$[$0-2].stmt,$$[$0]); */ yy.addLink($$[$0-2].stmt,$$[$0],$$[$0-1]); this.$ = { stmt: $$[$0], nodes: $$[$0].concat($$[$0-2].nodes) } 
+break;
+case 48:
+ /* console.warn('vs',$$[$0-3].stmt,$$[$0-1]); */ yy.addLink($$[$0-3].stmt,$$[$0-1],$$[$0-2]); this.$ = { stmt: $$[$0-1], nodes: $$[$0-1].concat($$[$0-3].nodes) } 
+break;
+case 49:
+/*console.warn('noda', $$[$0-1]);*/ this.$ = {stmt: $$[$0-1], nodes:$$[$0-1] }
+break;
+case 50:
+ /*console.warn('noda', $$[$0]);*/ this.$ = {stmt: $$[$0], nodes:$$[$0] }
+break;
+case 51:
+ /* console.warn('nod', $$[$0]); */ this.$ = [$$[$0]];
+break;
+case 52:
+ this.$ = $$[$0-4].concat($$[$0]); /* console.warn('pip', $$[$0-4][0], $$[$0], this.$); */ 
+break;
+case 53:
+this.$ = [$$[$0-2]];yy.setClass($$[$0-2],$$[$0])
+break;
+case 54:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'square');
+break;
+case 55:
+this.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'circle');
+break;
+case 56:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'ellipse');
+break;
+case 57:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'stadium');
+break;
+case 58:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'subroutine');
+break;
+case 59:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'cylinder');
+break;
+case 60:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'round');
+break;
+case 61:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'diamond');
+break;
+case 62:
+this.$ = $$[$0-5];yy.addVertex($$[$0-5],$$[$0-2],'hexagon');
+break;
+case 63:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'odd');
+break;
+case 64:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'trapezoid');
+break;
+case 65:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'inv_trapezoid');
+break;
+case 66:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_right');
+break;
+case 67:
+this.$ = $$[$0-3];yy.addVertex($$[$0-3],$$[$0-1],'lean_left');
+break;
+case 68:
+ /*console.warn('h: ', $$[$0]);*/this.$ = $$[$0];yy.addVertex($$[$0]);
+break;
+case 69:
+$$[$0-1].text = $$[$0];this.$ = $$[$0-1];
+break;
+case 70: case 71:
+$$[$0-2].text = $$[$0-1];this.$ = $$[$0-2];
+break;
+case 72:
+this.$ = $$[$0];
+break;
+case 73:
+var inf = yy.destructLink($$[$0], $$[$0-2]); this.$ = {"type":inf.type,"stroke":inf.stroke,"length":inf.length,"text":$$[$0-1]};
+break;
+case 74:
+var inf = yy.destructLink($$[$0]);this.$ = {"type":inf.type,"stroke":inf.stroke,"length":inf.length};
+break;
+case 75:
+this.$ = $$[$0-1];
+break;
+case 77: case 91: case 139:
+this.$=$$[$0-1]+''+$$[$0];
+break;
+case 92: case 93:
+this.$ = $$[$0-4];yy.addClass($$[$0-2],$$[$0]);
+break;
+case 94:
+this.$ = $$[$0-4];yy.setClass($$[$0-2], $$[$0]);
+break;
+case 95:
+this.$ = $$[$0-4];yy.setClickEvent($$[$0-2], $$[$0], undefined);
+break;
+case 96:
+this.$ = $$[$0-6];yy.setClickEvent($$[$0-4], $$[$0-2], $$[$0])       ;
+break;
+case 97:
+this.$ = $$[$0-4];yy.setLink($$[$0-2], $$[$0], undefined, undefined);
+break;
+case 98:
+this.$ = $$[$0-6];yy.setLink($$[$0-4], $$[$0-2], $$[$0], undefined       );
+break;
+case 99:
+this.$ = $$[$0-6];yy.setLink($$[$0-4], $$[$0-2], undefined, $$[$0]       );
+break;
+case 100:
+this.$ = $$[$0-8];yy.setLink($$[$0-6], $$[$0-4], $$[$0-2], $$[$0]              );
+break;
+case 101:
+this.$ = $$[$0-4];yy.addVertex($$[$0-2],undefined,undefined,$$[$0]);
+break;
+case 102: case 104:
+this.$ = $$[$0-4];yy.updateLink($$[$0-2],$$[$0]);
+break;
+case 103:
+this.$ = $$[$0-4];yy.updateLink([$$[$0-2]],$$[$0]);
+break;
+case 105:
+this.$ = $$[$0-8];yy.updateLinkInterpolate([$$[$0-6]],$$[$0-2]);yy.updateLink([$$[$0-6]],$$[$0]);
+break;
+case 106:
+this.$ = $$[$0-8];yy.updateLinkInterpolate($$[$0-6],$$[$0-2]);yy.updateLink($$[$0-6],$$[$0]);
+break;
+case 107:
+this.$ = $$[$0-6];yy.updateLinkInterpolate([$$[$0-4]],$$[$0]);
+break;
+case 108:
+this.$ = $$[$0-6];yy.updateLinkInterpolate($$[$0-4],$$[$0]);
+break;
+case 109: case 111:
+this.$ = [$$[$0]]
+break;
+case 110: case 112:
+$$[$0-2].push($$[$0]);this.$ = $$[$0-2];
+break;
+case 114:
+this.$ = $$[$0-1] + $$[$0];
+break;
+case 136:
+this.$=$$[$0]
+break;
+case 137:
+this.$=$$[$0-1]+''+$$[$0]
+break;
+case 142:
+this.$='v';
+break;
+case 143:
+this.$='-';
+break;
+}
+},
+table: [{3:1,4:2,5:3,6:5,12:$V0,16:4,21:$V1,22:$V2,24:$V3},{1:[3]},{1:[2,1]},{3:10,4:2,5:3,6:5,12:$V0,16:4,21:$V1,22:$V2,24:$V3},o($V4,$V5,{17:11}),{7:12,13:[1,13]},{16:14,21:$V1,22:$V2,24:$V3},{16:15,21:$V1,22:$V2,24:$V3},{25:[1,16],26:[1,17]},{13:[2,5]},{1:[2,2]},{1:[2,9],18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,44:31,45:37,46:$Vb,48:38,75:$Vc,76:$Vd,77:$Ve,78:$Vf,79:$Vg,80:$Vh,91:$Vi,92:$Vj,95:$Vk,96:$Vl,97:$Vm,99:$Vn,100:$Vo,104:39,106:$Vp,107:$Vq,108:$Vr,109:$Vs,110:$Vt,111:$Vu},{8:55,10:[1,56],15:$Vv},o([10,15],[2,6]),o($V4,[2,17]),o($V4,[2,18]),o($V4,[2,19]),{20:[1,59],21:[1,60],22:$Vw,27:58,30:61},o($Vx,[2,11]),o($Vx,[2,12]),o($Vx,[2,13]),o($Vx,[2,14]),o($Vx,[2,15]),o($Vx,[2,16]),{9:63,20:$Vy,21:$Vz,23:$VA,43:64,66:68,69:[1,69],70:[1,70]},{9:71,20:$Vy,21:$Vz,23:$VA},{9:72,20:$Vy,21:$Vz,23:$VA},{9:73,20:$Vy,21:$Vz,23:$VA},{9:74,20:$Vy,21:$Vz,23:$VA},{9:75,20:$Vy,21:$Vz,23:$VA},{9:77,20:$Vy,21:$Vz,22:[1,76],23:$VA},o($VB,[2,50],{30:78,22:$Vw}),{22:[1,79]},{22:[1,80]},{22:[1,81]},{22:[1,82]},{22:[1,83]},o($VC,[2,51],{47:[1,84]}),o($VD,[2,68],{104:95,40:[1,85],46:$Vb,49:[1,86],51:[1,87],53:[1,88],55:[1,89],57:[1,90],59:[1,91],61:[1,92],62:[1,93],64:[1,94],80:$Vh,91:$Vi,92:$Vj,95:$Vk,96:$Vl,97:$Vm,99:$Vn,100:$Vo,106:$Vp,107:$Vq,108:$Vr,109:$Vs,110:$Vt,111:$Vu}),o($VE,[2,136]),o($VE,[2,157]),o($VE,[2,158]),o($VE,[2,159]),o($VE,[2,160]),o($VE,[2,161]),o($VE,[2,162]),o($VE,[2,163]),o($VE,[2,164]),o($VE,[2,165]),o($VE,[2,166]),o($VE,[2,167]),o($VE,[2,168]),o($VE,[2,169]),o($VE,[2,170]),o($VE,[2,171]),{9:96,20:$Vy,21:$Vz,23:$VA},{11:97,14:[1,98]},o($VF,[2,8]),o($V4,[2,20]),o($V4,[2,26]),o($V4,[2,27]),{21:[1,99]},o($VG,[2,34],{30:100,22:$Vw}),o($Vx,[2,35]),{44:101,45:37,46:$Vb,48:38,80:$Vh,91:$Vi,92:$Vj,95:$Vk,96:$Vl,97:$Vm,99:$Vn,100:$Vo,104:39,106:$Vp,107:$Vq,108:$Vr,109:$Vs,110:$Vt,111:$Vu},o($VH,[2,44]),o($VH,[2,45]),o($VH,[2,46]),o($VI,[2,72],{67:102,68:[1,103],71:[1,104]}),{22:$VJ,24:$VK,26:$VL,38:$VM,39:105,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o([46,68,71,80,91,92,95,96,97,99,100,106,107,108,109,110,111],[2,74]),o($Vx,[2,36]),o($Vx,[2,37]),o($Vx,[2,38]),o($Vx,[2,39]),o($Vx,[2,40]),{22:$VJ,24:$VK,26:$VL,38:$VM,39:142,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o($Vd1,$V5,{17:143}),o($VB,[2,49],{46:$Ve1}),{26:$Vf1,46:$VO,80:$Vg1,86:145,88:[1,146],91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:147,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{84:[1,152],89:153,91:[1,154]},{26:$Vf1,46:$VO,80:$Vg1,84:[1,155],86:156,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:147,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{26:$Vf1,46:$VO,80:$Vg1,86:157,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:147,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{26:$Vf1,46:$VO,80:$Vg1,86:158,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:147,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{46:$Vb,48:159,80:$Vh,91:$Vi,92:$Vj,95:$Vk,96:$Vl,97:$Vm,99:$Vn,100:$Vo,104:39,106:$Vp,107:$Vq,108:$Vr,109:$Vs,110:$Vt,111:$Vu},{22:$VJ,24:$VK,26:$VL,38:$VM,39:160,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:162,42:$VN,46:$VO,49:[1,161],61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:163,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:164,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:165,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:166,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:167,42:$VN,46:$VO,59:[1,168],61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:169,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:170,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:171,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o($VE,[2,137]),o($Vi1,[2,3]),{8:172,15:$Vv},{15:[2,7]},o($V4,[2,28]),o($VG,[2,33]),o($VB,[2,47],{30:173,22:$Vw}),o($VI,[2,69],{22:[1,174]}),{22:[1,175]},{22:$VJ,24:$VK,26:$VL,38:$VM,39:176,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,61:$VP,69:$VQ,70:[1,177],72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o($Vj1,[2,76]),o($Vj1,[2,78]),o($Vj1,[2,126]),o($Vj1,[2,127]),o($Vj1,[2,128]),o($Vj1,[2,129]),o($Vj1,[2,130]),o($Vj1,[2,131]),o($Vj1,[2,132]),o($Vj1,[2,133]),o($Vj1,[2,134]),o($Vj1,[2,135]),o($Vj1,[2,144]),o($Vj1,[2,145]),o($Vj1,[2,146]),o($Vj1,[2,147]),o($Vj1,[2,148]),o($Vj1,[2,149]),o($Vj1,[2,150]),o($Vj1,[2,151]),o($Vj1,[2,152]),o($Vj1,[2,153]),o($Vj1,[2,154]),o($Vj1,[2,155]),o($Vj1,[2,156]),o($Vj1,[2,79]),o($Vj1,[2,80]),o($Vj1,[2,81]),o($Vj1,[2,82]),o($Vj1,[2,83]),o($Vj1,[2,84]),o($Vj1,[2,85]),o($Vj1,[2,86]),o($Vj1,[2,87]),o($Vj1,[2,88]),o($Vj1,[2,89]),{9:180,20:$Vy,21:$Vz,22:$VJ,23:$VA,24:$VK,26:$VL,38:$VM,40:[1,179],42:$VN,46:$VO,61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,42:[1,181],44:31,45:37,46:$Vb,48:38,75:$Vc,76:$Vd,77:$Ve,78:$Vf,79:$Vg,80:$Vh,91:$Vi,92:$Vj,95:$Vk,96:$Vl,97:$Vm,99:$Vn,100:$Vo,104:39,106:$Vp,107:$Vq,108:$Vr,109:$Vs,110:$Vt,111:$Vu},{22:$Vw,30:182},{22:[1,183],26:$Vf1,46:$VO,80:$Vg1,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:184,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:[1,185]},o($Vk1,[2,138]),o($Vk1,[2,140]),o($Vk1,[2,141]),o($Vk1,[2,142]),o($Vk1,[2,143]),{22:[1,186]},{22:[1,187],92:[1,188]},o($Vl1,[2,109]),{22:[1,189]},{22:[1,190],26:$Vf1,46:$VO,80:$Vg1,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:184,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:[1,191],26:$Vf1,46:$VO,80:$Vg1,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:184,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:[1,192],26:$Vf1,46:$VO,80:$Vg1,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:184,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o($VC,[2,53],{104:95,46:$Vb,80:$Vh,91:$Vi,92:$Vj,95:$Vk,96:$Vl,97:$Vm,99:$Vn,100:$Vo,106:$Vp,107:$Vq,108:$Vr,109:$Vs,110:$Vt,111:$Vu}),{22:$VJ,24:$VK,26:$VL,38:$VM,41:[1,193],42:$VN,46:$VO,61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:194,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,50:[1,195],61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,52:[1,196],61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,54:[1,197],61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,56:[1,198],61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,58:[1,199],61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,60:[1,200],61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,39:201,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,41:[1,202],42:$VN,46:$VO,61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,61:$VP,63:[1,203],65:[1,204],69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,61:$VP,63:[1,206],65:[1,205],69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{9:207,20:$Vy,21:$Vz,23:$VA},o($VB,[2,48],{46:$Ve1}),o($VI,[2,71]),o($VI,[2,70]),{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,61:$VP,69:$VQ,71:[1,208],72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o($VI,[2,73]),o($Vj1,[2,77]),{22:$VJ,24:$VK,26:$VL,38:$VM,39:209,42:$VN,46:$VO,61:$VP,69:$VQ,72:106,73:$VR,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o($Vd1,$V5,{17:210}),o($Vx,[2,43]),{45:211,46:$Vb,48:38,80:$Vh,91:$Vi,92:$Vj,95:$Vk,96:$Vl,97:$Vm,99:$Vn,100:$Vo,104:39,106:$Vp,107:$Vq,108:$Vr,109:$Vs,110:$Vt,111:$Vu},{22:$Vm1,75:$Vn1,85:212,88:$Vo1,91:$Vp1,93:213,94:214,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1},o($Vk1,[2,139]),{22:$Vm1,75:$Vn1,85:226,88:$Vo1,91:$Vp1,93:213,94:214,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1},{22:$Vm1,75:$Vn1,85:227,88:$Vo1,90:[1,228],91:$Vp1,93:213,94:214,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1},{22:$Vm1,75:$Vn1,85:229,88:$Vo1,90:[1,230],91:$Vp1,93:213,94:214,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1},{91:[1,231]},{22:$Vm1,75:$Vn1,85:232,88:$Vo1,91:$Vp1,93:213,94:214,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1},{22:$Vm1,75:$Vn1,85:233,88:$Vo1,91:$Vp1,93:213,94:214,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1},{26:$Vf1,46:$VO,80:$Vg1,86:234,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:147,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{26:$Vf1,46:$VO,73:[1,236],80:$Vg1,86:235,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:147,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o($VD,[2,54]),{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,50:[1,237],61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o($VD,[2,60]),o($VD,[2,56]),o($VD,[2,57]),o($VD,[2,58]),o($VD,[2,59]),o($VD,[2,61]),{22:$VJ,24:$VK,26:$VL,38:$VM,42:$VN,46:$VO,60:[1,238],61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},o($VD,[2,63]),o($VD,[2,64]),o($VD,[2,66]),o($VD,[2,65]),o($VD,[2,67]),o($Vi1,[2,4]),o([22,46,80,91,92,95,96,97,99,100,106,107,108,109,110,111],[2,75]),{22:$VJ,24:$VK,26:$VL,38:$VM,41:[1,239],42:$VN,46:$VO,61:$VP,69:$VQ,72:178,74:117,75:$VS,76:$VT,77:$VU,78:$VV,79:$VW,80:$VX,81:$VY,83:108,84:$VZ,91:$V_,92:$V$,95:$V01,96:$V11,97:$V21,99:$V31,100:$V41,101:$V51,102:$V61,103:114,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,42:[1,240],44:31,45:37,46:$Vb,48:38,75:$Vc,76:$Vd,77:$Ve,78:$Vf,79:$Vg,80:$Vh,91:$Vi,92:$Vj,95:$Vk,96:$Vl,97:$Vm,99:$Vn,100:$Vo,104:39,106:$Vp,107:$Vq,108:$Vr,109:$Vs,110:$Vt,111:$Vu},o($VC,[2,52]),o($VF,[2,101],{92:$Vx1}),o($Vy1,[2,111],{94:242,22:$Vm1,75:$Vn1,88:$Vo1,91:$Vp1,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1}),o($Vz1,[2,113]),o($Vz1,[2,115]),o($Vz1,[2,116]),o($Vz1,[2,117]),o($Vz1,[2,118]),o($Vz1,[2,119]),o($Vz1,[2,120]),o($Vz1,[2,121]),o($Vz1,[2,122]),o($Vz1,[2,123]),o($Vz1,[2,124]),o($Vz1,[2,125]),o($VF,[2,102],{92:$Vx1}),o($VF,[2,103],{92:$Vx1}),{22:[1,243]},o($VF,[2,104],{92:$Vx1}),{22:[1,244]},o($Vl1,[2,110]),o($VF,[2,92],{92:$Vx1}),o($VF,[2,93],{92:$Vx1}),o($VF,[2,94],{103:149,105:184,26:$Vf1,46:$VO,80:$Vg1,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1}),o($VF,[2,95],{103:149,105:184,22:[1,245],26:$Vf1,46:$VO,80:$Vg1,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1}),o($VF,[2,97],{22:[1,246]}),{50:[1,247]},{60:[1,248]},{9:249,20:$Vy,21:$Vz,23:$VA},o($Vx,[2,42]),{22:$Vm1,75:$Vn1,88:$Vo1,91:$Vp1,93:250,94:214,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1},o($Vz1,[2,114]),{26:$Vf1,46:$VO,80:$Vg1,86:251,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:147,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{26:$Vf1,46:$VO,80:$Vg1,86:252,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,103:149,105:147,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1},{73:[1,253]},{73:[1,254],87:[1,255]},o($VD,[2,55]),o($VD,[2,62]),o($Vd1,$V5,{17:256}),o($Vy1,[2,112],{94:242,22:$Vm1,75:$Vn1,88:$Vo1,91:$Vp1,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1}),o($VF,[2,107],{103:149,105:184,22:[1,257],26:$Vf1,46:$VO,80:$Vg1,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1}),o($VF,[2,108],{103:149,105:184,22:[1,258],26:$Vf1,46:$VO,80:$Vg1,91:$V_,92:$V$,95:$V01,96:$V11,97:$Vh1,99:$V31,100:$V41,106:$V71,107:$V81,108:$V91,109:$Va1,110:$Vb1,111:$Vc1}),o($VF,[2,96]),o($VF,[2,98],{22:[1,259]}),o($VF,[2,99]),{18:18,19:19,20:$V6,21:$V7,22:$V8,23:$V9,32:24,33:25,34:26,35:27,36:28,37:29,38:$Va,42:[1,260],44:31,45:37,46:$Vb,48:38,75:$Vc,76:$Vd,77:$Ve,78:$Vf,79:$Vg,80:$Vh,91:$Vi,92:$Vj,95:$Vk,96:$Vl,97:$Vm,99:$Vn,100:$Vo,104:39,106:$Vp,107:$Vq,108:$Vr,109:$Vs,110:$Vt,111:$Vu},{22:$Vm1,75:$Vn1,85:261,88:$Vo1,91:$Vp1,93:213,94:214,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1},{22:$Vm1,75:$Vn1,85:262,88:$Vo1,91:$Vp1,93:213,94:214,95:$Vq1,96:$Vr1,97:$Vs1,98:$Vt1,99:$Vu1,100:$Vv1,101:$Vw1},{87:[1,263]},o($Vx,[2,41]),o($VF,[2,105],{92:$Vx1}),o($VF,[2,106],{92:$Vx1}),o($VF,[2,100])],
+defaultActions: {2:[2,1],9:[2,5],10:[2,2],98:[2,7]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0: this.begin('open_directive'); return 12; 
+break;
+case 1: this.begin('type_directive'); return 13; 
+break;
+case 2: this.popState(); this.begin('arg_directive'); return 10; 
+break;
+case 3: this.popState(); this.popState(); return 15; 
+break;
+case 4:return 14;
+break;
+case 5:/* skip comments */
+break;
+case 6:/* skip comments */
+break;
+case 7:this.begin("string");
+break;
+case 8:this.popState();
+break;
+case 9:return "STR";
+break;
+case 10:return 75;
+break;
+case 11:return 84;
+break;
+case 12:return 76;
+break;
+case 13:return 90;
+break;
+case 14:return 77;
+break;
+case 15:return 78;
+break;
+case 16:return 79;
+break;
+case 17:if(yy.lex.firstGraph()){this.begin("dir");}  return 24;
+break;
+case 18:if(yy.lex.firstGraph()){this.begin("dir");}  return 24;
+break;
+case 19:return 38;
+break;
+case 20:return 42;
+break;
+case 21:return 87;
+break;
+case 22:return 87;
+break;
+case 23:return 87;
+break;
+case 24:return 87;
+break;
+case 25:   this.popState();  return 25; 
+break;
+case 26:   this.popState();  return 26; 
+break;
+case 27:   this.popState();  return 26; 
+break;
+case 28:   this.popState();  return 26; 
+break;
+case 29:   this.popState();  return 26; 
+break;
+case 30:   this.popState();  return 26; 
+break;
+case 31:   this.popState();  return 26; 
+break;
+case 32:   this.popState();  return 26; 
+break;
+case 33:   this.popState();  return 26; 
+break;
+case 34:   this.popState();  return 26; 
+break;
+case 35:   this.popState();  return 26; 
+break;
+case 36: return 91;
+break;
+case 37:return 99;
+break;
+case 38:return 47;
+break;
+case 39:return 96;
+break;
+case 40:return 46;
+break;
+case 41:return 20;
+break;
+case 42:return 92;
+break;
+case 43:return 110;
+break;
+case 44:return 70;
+break;
+case 45:return 70;
+break;
+case 46:return 70;
+break;
+case 47:return 69;
+break;
+case 48:return 69;
+break;
+case 49:return 69;
+break;
+case 50:return 51;
+break;
+case 51:return 52;
+break;
+case 52:return 53;
+break;
+case 53:return 54;
+break;
+case 54:return 55;
+break;
+case 55:return 56;
+break;
+case 56:return 57;
+break;
+case 57:return 58;
+break;
+case 58:return 97;
+break;
+case 59:return 100;
+break;
+case 60:return 111;
+break;
+case 61:return 108;
+break;
+case 62:return 101;
+break;
+case 63:return 109;
+break;
+case 64:return 109;
+break;
+case 65:return 102;
+break;
+case 66:return 61;
+break;
+case 67:return 81;
+break;
+case 68:return 'SEP';
+break;
+case 69:return 80;
+break;
+case 70:return 95;
+break;
+case 71:return 63;
+break;
+case 72:return 62;
+break;
+case 73:return 65;
+break;
+case 74:return 64;
+break;
+case 75:return 106;
+break;
+case 76:return 107;
+break;
+case 77:return 71;
+break;
+case 78:return 49;
+break;
+case 79:return 50;
+break;
+case 80:return 40;
+break;
+case 81:return 41;
+break;
+case 82:return 59
+break;
+case 83:return 60
+break;
+case 84:return 117;
+break;
+case 85:return 21;
+break;
+case 86:return 22;
+break;
+case 87:return 23;
+break;
+}
+},
+rules: [/^(?:%%\{)/,/^(?:((?:(?!\}%%)[^:.])*))/,/^(?::)/,/^(?:\}%%)/,/^(?:((?:(?!\}%%).|\n)*))/,/^(?:%%(?!\{)[^\n]*)/,/^(?:[^\}]%%[^\n]*)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:click\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\[)/,/^(?:\]\))/,/^(?:\[\[)/,/^(?:\]\])/,/^(?:\[\()/,/^(?:\)\])/,/^(?:-)/,/^(?:\.)/,/^(?:[\_])/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:[A-Za-z]+)/,/^(?:\\\])/,/^(?:\[\/)/,/^(?:\/\])/,/^(?:\[\\)/,/^(?:[!"#$%&'*+,-.`?\\_/])/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\()/,/^(?:\))/,/^(?:\[)/,/^(?:\])/,/^(?:\{)/,/^(?:\})/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],
+conditions: {"close_directive":{"rules":[],"inclusive":false},"arg_directive":{"rules":[3,4],"inclusive":false},"type_directive":{"rules":[2,3],"inclusive":false},"open_directive":{"rules":[1],"inclusive":false},"vertex":{"rules":[],"inclusive":false},"dir":{"rules":[25,26,27,28,29,30,31,32,33,34,35],"inclusive":false},"string":{"rules":[8,9],"inclusive":false},"INITIAL":{"rules":[0,5,6,7,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/flowchart/styles.js":
+/*!******************************************!*\
+  !*** ./src/diagrams/flowchart/styles.js ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles(options) {
+  return ".label {\n    font-family: ".concat(options.fontFamily, ";\n    color: ").concat(options.nodeTextColor || options.textColor, ";\n  }\n\n  .label text {\n    fill: ").concat(options.nodeTextColor || options.textColor, ";\n  }\n\n  .node rect,\n  .node circle,\n  .node ellipse,\n  .node polygon,\n  .node path {\n    fill: ").concat(options.mainBkg, ";\n    stroke: ").concat(options.nodeBorder, ";\n    stroke-width: 1px;\n  }\n\n  .node .label {\n    text-align: center;\n  }\n  .node.clickable {\n    cursor: pointer;\n  }\n\n  .arrowheadPath {\n    fill: ").concat(options.arrowheadColor, ";\n  }\n\n  .edgePath .path {\n    stroke: ").concat(options.lineColor, ";\n    stroke-width: 1.5px;\n  }\n\n  .flowchart-link {\n    stroke: ").concat(options.lineColor, ";\n    fill: none;\n  }\n\n  .edgeLabel {\n    background-color: ").concat(options.edgeLabelBackground, ";\n    rect {\n      opacity: 0.5;\n      background-color: ").concat(options.edgeLabelBackground, ";\n      fill: ").concat(options.edgeLabelBackground, ";\n    }\n    text-align: center;\n  }\n\n  .cluster rect {\n    fill: ").concat(options.clusterBkg, ";\n    stroke: ").concat(options.clusterBorder, ";\n    stroke-width: 1px;\n  }\n\n  .cluster text {\n    fill: ").concat(options.titleColor, ";\n  }\n\n  div.mermaidTooltip {\n    position: absolute;\n    text-align: center;\n    max-width: 200px;\n    padding: 2px;\n    font-family: ").concat(options.fontFamily, ";\n    font-size: 12px;\n    background: ").concat(options.tertiaryColor, ";\n    border: 1px solid ").concat(options.border2, ";\n    border-radius: 2px;\n    pointer-events: none;\n    z-index: 100;\n  }\n");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/gantt/ganttDb.js":
+/*!***************************************!*\
+  !*** ./src/diagrams/gantt/ganttDb.js ***!
+  \***************************************/
+/*! exports provided: parseDirective, clear, setAxisFormat, getAxisFormat, setTodayMarker, getTodayMarker, setDateFormat, enableInclusiveEndDates, endDatesAreInclusive, getDateFormat, setExcludes, getExcludes, setTitle, getTitle, addSection, getSections, getTasks, addTask, findTaskById, addTaskOrg, setLink, setClass, setClickEvent, bindFunctions, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseDirective", function() { return parseDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setAxisFormat", function() { return setAxisFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAxisFormat", function() { return getAxisFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTodayMarker", function() { return setTodayMarker; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTodayMarker", function() { return getTodayMarker; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setDateFormat", function() { return setDateFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableInclusiveEndDates", function() { return enableInclusiveEndDates; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endDatesAreInclusive", function() { return endDatesAreInclusive; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDateFormat", function() { return getDateFormat; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setExcludes", function() { return setExcludes; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getExcludes", function() { return getExcludes; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTitle", function() { return setTitle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTitle", function() { return getTitle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSection", function() { return addSection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSections", function() { return getSections; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTasks", function() { return getTasks; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTask", function() { return addTask; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findTaskById", function() { return findTaskById; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTaskOrg", function() { return addTaskOrg; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLink", function() { return setLink; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClass", function() { return setClass; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setClickEvent", function() { return setClickEvent; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindFunctions", function() { return bindFunctions; });
+/* harmony import */ var moment_mini__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment-mini */ "./node_modules/moment-mini/moment.min.js");
+/* harmony import */ var moment_mini__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment_mini__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @braintree/sanitize-url */ "./node_modules/@braintree/sanitize-url/index.js");
+/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
+function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
+
+function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
+
+function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
+
+function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
+
+
+
+
+
+
+
+var dateFormat = '';
+var axisFormat = '';
+var todayMarker = '';
+var excludes = [];
+var title = '';
+var sections = [];
+var tasks = [];
+var currentSection = '';
+var tags = ['active', 'done', 'crit', 'milestone'];
+var funs = [];
+var inclusiveEndDates = false; // The serial order of the task in the script
+
+var lastOrder = 0;
+var parseDirective = function parseDirective(statement, context, type) {
+  _mermaidAPI__WEBPACK_IMPORTED_MODULE_5__["default"].parseDirective(this, statement, context, type);
+};
+var clear = function clear() {
+  sections = [];
+  tasks = [];
+  currentSection = '';
+  funs = [];
+  title = '';
+  taskCnt = 0;
+  lastTask = undefined;
+  lastTaskID = undefined;
+  rawTasks = [];
+  dateFormat = '';
+  axisFormat = '';
+  todayMarker = '';
+  excludes = [];
+  inclusiveEndDates = false;
+  lastOrder = 0;
+};
+var setAxisFormat = function setAxisFormat(txt) {
+  axisFormat = txt;
+};
+var getAxisFormat = function getAxisFormat() {
+  return axisFormat;
+};
+var setTodayMarker = function setTodayMarker(txt) {
+  todayMarker = txt;
+};
+var getTodayMarker = function getTodayMarker() {
+  return todayMarker;
+};
+var setDateFormat = function setDateFormat(txt) {
+  dateFormat = txt;
+};
+var enableInclusiveEndDates = function enableInclusiveEndDates() {
+  inclusiveEndDates = true;
+};
+var endDatesAreInclusive = function endDatesAreInclusive() {
+  return inclusiveEndDates;
+};
+var getDateFormat = function getDateFormat() {
+  return dateFormat;
+};
+var setExcludes = function setExcludes(txt) {
+  excludes = txt.toLowerCase().split(/[\s,]+/);
+};
+var getExcludes = function getExcludes() {
+  return excludes;
+};
+var setTitle = function setTitle(txt) {
+  title = txt;
+};
+var getTitle = function getTitle() {
+  return title;
+};
+var addSection = function addSection(txt) {
+  currentSection = txt;
+  sections.push(txt);
+};
+var getSections = function getSections() {
+  return sections;
+};
+var getTasks = function getTasks() {
+  var allItemsPricessed = compileTasks();
+  var maxDepth = 10;
+  var iterationCount = 0;
+
+  while (!allItemsPricessed && iterationCount < maxDepth) {
+    allItemsPricessed = compileTasks();
+    iterationCount++;
+  }
+
+  tasks = rawTasks;
+  return tasks;
+};
+
+var isInvalidDate = function isInvalidDate(date, dateFormat, excludes) {
+  if (date.isoWeekday() >= 6 && excludes.indexOf('weekends') >= 0) {
+    return true;
+  }
+
+  if (excludes.indexOf(date.format('dddd').toLowerCase()) >= 0) {
+    return true;
+  }
+
+  return excludes.indexOf(date.format(dateFormat.trim())) >= 0;
+};
+
+var checkTaskDates = function checkTaskDates(task, dateFormat, excludes) {
+  if (!excludes.length || task.manualEndTime) return;
+  var startTime = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(task.startTime, dateFormat, true);
+  startTime.add(1, 'd');
+  var endTime = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(task.endTime, dateFormat, true);
+  var renderEndTime = fixTaskDates(startTime, endTime, dateFormat, excludes);
+  task.endTime = endTime.toDate();
+  task.renderEndTime = renderEndTime;
+};
+
+var fixTaskDates = function fixTaskDates(startTime, endTime, dateFormat, excludes) {
+  var invalid = false;
+  var renderEndTime = null;
+
+  while (startTime <= endTime) {
+    if (!invalid) {
+      renderEndTime = endTime.toDate();
+    }
+
+    invalid = isInvalidDate(startTime, dateFormat, excludes);
+
+    if (invalid) {
+      endTime.add(1, 'd');
+    }
+
+    startTime.add(1, 'd');
+  }
+
+  return renderEndTime;
+};
+
+var getStartDate = function getStartDate(prevTime, dateFormat, str) {
+  str = str.trim(); // Test for after
+
+  var re = /^after\s+([\d\w- ]+)/;
+  var afterStatement = re.exec(str.trim());
+
+  if (afterStatement !== null) {
+    // check all after ids and take the latest
+    var latestEndingTask = null;
+    afterStatement[1].split(' ').forEach(function (id) {
+      var task = findTaskById(id);
+
+      if (typeof task !== 'undefined') {
+        if (!latestEndingTask) {
+          latestEndingTask = task;
+        } else {
+          if (task.endTime > latestEndingTask.endTime) {
+            latestEndingTask = task;
+          }
+        }
+      }
+    });
+
+    if (!latestEndingTask) {
+      var dt = new Date();
+      dt.setHours(0, 0, 0, 0);
+      return dt;
+    } else {
+      return latestEndingTask.endTime;
+    }
+  } // Check for actual date set
+
+
+  var mDate = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(str, dateFormat.trim(), true);
+
+  if (mDate.isValid()) {
+    return mDate.toDate();
+  } else {
+    _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Invalid date:' + str);
+    _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('With date format:' + dateFormat.trim());
+  } // Default date - now
+
+
+  return new Date();
+};
+
+var durationToDate = function durationToDate(durationStatement, relativeTime) {
+  if (durationStatement !== null) {
+    switch (durationStatement[2]) {
+      case 's':
+        relativeTime.add(durationStatement[1], 'seconds');
+        break;
+
+      case 'm':
+        relativeTime.add(durationStatement[1], 'minutes');
+        break;
+
+      case 'h':
+        relativeTime.add(durationStatement[1], 'hours');
+        break;
+
+      case 'd':
+        relativeTime.add(durationStatement[1], 'days');
+        break;
+
+      case 'w':
+        relativeTime.add(durationStatement[1], 'weeks');
+        break;
+    }
+  } // Default date - now
+
+
+  return relativeTime.toDate();
+};
+
+var getEndDate = function getEndDate(prevTime, dateFormat, str, inclusive) {
+  inclusive = inclusive || false;
+  str = str.trim(); // Check for actual date
+
+  var mDate = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(str, dateFormat.trim(), true);
+
+  if (mDate.isValid()) {
+    if (inclusive) {
+      mDate.add(1, 'd');
+    }
+
+    return mDate.toDate();
+  }
+
+  return durationToDate(/^([\d]+)([wdhms])/.exec(str.trim()), moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(prevTime));
+};
+
+var taskCnt = 0;
+
+var parseId = function parseId(idStr) {
+  if (typeof idStr === 'undefined') {
+    taskCnt = taskCnt + 1;
+    return 'task' + taskCnt;
+  }
+
+  return idStr;
+}; // id, startDate, endDate
+// id, startDate, length
+// id, after x, endDate
+// id, after x, length
+// startDate, endDate
+// startDate, length
+// after x, endDate
+// after x, length
+// endDate
+// length
+
+
+var compileData = function compileData(prevTask, dataStr) {
+  var ds;
+
+  if (dataStr.substr(0, 1) === ':') {
+    ds = dataStr.substr(1, dataStr.length);
+  } else {
+    ds = dataStr;
+  }
+
+  var data = ds.split(',');
+  var task = {}; // Get tags like active, done, crit and milestone
+
+  getTaskTags(data, task, tags);
+
+  for (var i = 0; i < data.length; i++) {
+    data[i] = data[i].trim();
+  }
+
+  var endTimeData = '';
+
+  switch (data.length) {
+    case 1:
+      task.id = parseId();
+      task.startTime = prevTask.endTime;
+      endTimeData = data[0];
+      break;
+
+    case 2:
+      task.id = parseId();
+      task.startTime = getStartDate(undefined, dateFormat, data[0]);
+      endTimeData = data[1];
+      break;
+
+    case 3:
+      task.id = parseId(data[0]);
+      task.startTime = getStartDate(undefined, dateFormat, data[1]);
+      endTimeData = data[2];
+      break;
+
+    default:
+  }
+
+  if (endTimeData) {
+    task.endTime = getEndDate(task.startTime, dateFormat, endTimeData, inclusiveEndDates);
+    task.manualEndTime = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(endTimeData, 'YYYY-MM-DD', true).isValid();
+    checkTaskDates(task, dateFormat, excludes);
+  }
+
+  return task;
+};
+
+var parseData = function parseData(prevTaskId, dataStr) {
+  var ds;
+
+  if (dataStr.substr(0, 1) === ':') {
+    ds = dataStr.substr(1, dataStr.length);
+  } else {
+    ds = dataStr;
+  }
+
+  var data = ds.split(',');
+  var task = {}; // Get tags like active, done, crit and milestone
+
+  getTaskTags(data, task, tags);
+
+  for (var i = 0; i < data.length; i++) {
+    data[i] = data[i].trim();
+  }
+
+  switch (data.length) {
+    case 1:
+      task.id = parseId();
+      task.startTime = {
+        type: 'prevTaskEnd',
+        id: prevTaskId
+      };
+      task.endTime = {
+        data: data[0]
+      };
+      break;
+
+    case 2:
+      task.id = parseId();
+      task.startTime = {
+        type: 'getStartDate',
+        startData: data[0]
+      };
+      task.endTime = {
+        data: data[1]
+      };
+      break;
+
+    case 3:
+      task.id = parseId(data[0]);
+      task.startTime = {
+        type: 'getStartDate',
+        startData: data[1]
+      };
+      task.endTime = {
+        data: data[2]
+      };
+      break;
+
+    default:
+  }
+
+  return task;
+};
+
+var lastTask;
+var lastTaskID;
+var rawTasks = [];
+var taskDb = {};
+var addTask = function addTask(descr, data) {
+  var rawTask = {
+    section: currentSection,
+    type: currentSection,
+    processed: false,
+    manualEndTime: false,
+    renderEndTime: null,
+    raw: {
+      data: data
+    },
+    task: descr,
+    classes: []
+  };
+  var taskInfo = parseData(lastTaskID, data);
+  rawTask.raw.startTime = taskInfo.startTime;
+  rawTask.raw.endTime = taskInfo.endTime;
+  rawTask.id = taskInfo.id;
+  rawTask.prevTaskId = lastTaskID;
+  rawTask.active = taskInfo.active;
+  rawTask.done = taskInfo.done;
+  rawTask.crit = taskInfo.crit;
+  rawTask.milestone = taskInfo.milestone;
+  rawTask.order = lastOrder;
+  lastOrder++;
+  var pos = rawTasks.push(rawTask);
+  lastTaskID = rawTask.id; // Store cross ref
+
+  taskDb[rawTask.id] = pos - 1;
+};
+var findTaskById = function findTaskById(id) {
+  var pos = taskDb[id];
+  return rawTasks[pos];
+};
+var addTaskOrg = function addTaskOrg(descr, data) {
+  var newTask = {
+    section: currentSection,
+    type: currentSection,
+    description: descr,
+    task: descr,
+    classes: []
+  };
+  var taskInfo = compileData(lastTask, data);
+  newTask.startTime = taskInfo.startTime;
+  newTask.endTime = taskInfo.endTime;
+  newTask.id = taskInfo.id;
+  newTask.active = taskInfo.active;
+  newTask.done = taskInfo.done;
+  newTask.crit = taskInfo.crit;
+  newTask.milestone = taskInfo.milestone;
+  lastTask = newTask;
+  tasks.push(newTask);
+};
+
+var compileTasks = function compileTasks() {
+  var compileTask = function compileTask(pos) {
+    var task = rawTasks[pos];
+    var startTime = '';
+
+    switch (rawTasks[pos].raw.startTime.type) {
+      case 'prevTaskEnd':
+        {
+          var prevTask = findTaskById(task.prevTaskId);
+          task.startTime = prevTask.endTime;
+          break;
+        }
+
+      case 'getStartDate':
+        startTime = getStartDate(undefined, dateFormat, rawTasks[pos].raw.startTime.startData);
+
+        if (startTime) {
+          rawTasks[pos].startTime = startTime;
+        }
+
+        break;
+    }
+
+    if (rawTasks[pos].startTime) {
+      rawTasks[pos].endTime = getEndDate(rawTasks[pos].startTime, dateFormat, rawTasks[pos].raw.endTime.data, inclusiveEndDates);
+
+      if (rawTasks[pos].endTime) {
+        rawTasks[pos].processed = true;
+        rawTasks[pos].manualEndTime = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()(rawTasks[pos].raw.endTime.data, 'YYYY-MM-DD', true).isValid();
+        checkTaskDates(rawTasks[pos], dateFormat, excludes);
+      }
+    }
+
+    return rawTasks[pos].processed;
+  };
+
+  var allProcessed = true;
+
+  for (var i = 0; i < rawTasks.length; i++) {
+    compileTask(i);
+    allProcessed = allProcessed && rawTasks[i].processed;
+  }
+
+  return allProcessed;
+};
+/**
+ * Called by parser when a link is found. Adds the URL to the vertex data.
+ * @param ids Comma separated list of ids
+ * @param linkStr URL to create a link for
+ */
+
+
+var setLink = function setLink(ids, _linkStr) {
+  var linkStr = _linkStr;
+
+  if (_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"]().securityLevel !== 'loose') {
+    linkStr = Object(_braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_1__["sanitizeUrl"])(_linkStr);
+  }
+
+  ids.split(',').forEach(function (id) {
+    var rawTask = findTaskById(id);
+
+    if (typeof rawTask !== 'undefined') {
+      pushFun(id, function () {
+        window.open(linkStr, '_self');
+      });
+    }
+  });
+  setClass(ids, 'clickable');
+};
+/**
+ * Called by parser when a special node is found, e.g. a clickable element.
+ * @param ids Comma separated list of ids
+ * @param className Class to add
+ */
+
+var setClass = function setClass(ids, className) {
+  ids.split(',').forEach(function (id) {
+    var rawTask = findTaskById(id);
+
+    if (typeof rawTask !== 'undefined') {
+      rawTask.classes.push(className);
+    }
+  });
+};
+
+var setClickFun = function setClickFun(id, functionName, functionArgs) {
+  if (_config__WEBPACK_IMPORTED_MODULE_3__["getConfig"]().securityLevel !== 'loose') {
+    return;
+  }
+
+  if (typeof functionName === 'undefined') {
+    return;
+  }
+
+  var argList = [];
+
+  if (typeof functionArgs === 'string') {
+    /* Splits functionArgs by ',', ignoring all ',' in double quoted strings */
+    argList = functionArgs.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);
+
+    for (var i = 0; i < argList.length; i++) {
+      var item = argList[i].trim();
+      /* Removes all double quotes at the start and end of an argument */
+
+      /* This preserves all starting and ending whitespace inside */
+
+      if (item.charAt(0) === '"' && item.charAt(item.length - 1) === '"') {
+        item = item.substr(1, item.length - 2);
+      }
+
+      argList[i] = item;
+    }
+  }
+  /* if no arguments passed into callback, default to passing in id */
+
+
+  if (argList.length === 0) {
+    argList.push(id);
+  }
+
+  var rawTask = findTaskById(id);
+
+  if (typeof rawTask !== 'undefined') {
+    pushFun(id, function () {
+      _utils__WEBPACK_IMPORTED_MODULE_4__["default"].runFunc.apply(_utils__WEBPACK_IMPORTED_MODULE_4__["default"], [functionName].concat(_toConsumableArray(argList)));
+    });
+  }
+};
+/**
+ * The callbackFunction is executed in a click event bound to the task with the specified id or the task's assigned text
+ * @param id The task's id
+ * @param callbackFunction A function to be executed when clicked on the task or the task's text
+ */
+
+
+var pushFun = function pushFun(id, callbackFunction) {
+  funs.push(function () {
+    // const elem = d3.select(element).select(`[id="${id}"]`)
+    var elem = document.querySelector("[id=\"".concat(id, "\"]"));
+
+    if (elem !== null) {
+      elem.addEventListener('click', function () {
+        callbackFunction();
+      });
+    }
+  });
+  funs.push(function () {
+    // const elem = d3.select(element).select(`[id="${id}-text"]`)
+    var elem = document.querySelector("[id=\"".concat(id, "-text\"]"));
+
+    if (elem !== null) {
+      elem.addEventListener('click', function () {
+        callbackFunction();
+      });
+    }
+  });
+};
+/**
+ * Called by parser when a click definition is found. Registers an event handler.
+ * @param ids Comma separated list of ids
+ * @param functionName Function to be called on click
+ * @param functionArgs Function args the function should be called with
+ */
+
+
+var setClickEvent = function setClickEvent(ids, functionName, functionArgs) {
+  ids.split(',').forEach(function (id) {
+    setClickFun(id, functionName, functionArgs);
+  });
+  setClass(ids, 'clickable');
+};
+/**
+ * Binds all functions previously added to fun (specified through click) to the element
+ * @param element
+ */
+
+var bindFunctions = function bindFunctions(element) {
+  funs.forEach(function (fun) {
+    fun(element);
+  });
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  parseDirective: parseDirective,
+  getConfig: function getConfig() {
+    return _config__WEBPACK_IMPORTED_MODULE_3__["getConfig"]().gantt;
+  },
+  clear: clear,
+  setDateFormat: setDateFormat,
+  getDateFormat: getDateFormat,
+  enableInclusiveEndDates: enableInclusiveEndDates,
+  endDatesAreInclusive: endDatesAreInclusive,
+  setAxisFormat: setAxisFormat,
+  getAxisFormat: getAxisFormat,
+  setTodayMarker: setTodayMarker,
+  getTodayMarker: getTodayMarker,
+  setTitle: setTitle,
+  getTitle: getTitle,
+  addSection: addSection,
+  getSections: getSections,
+  getTasks: getTasks,
+  addTask: addTask,
+  findTaskById: findTaskById,
+  addTaskOrg: addTaskOrg,
+  setExcludes: setExcludes,
+  getExcludes: getExcludes,
+  setClickEvent: setClickEvent,
+  setLink: setLink,
+  bindFunctions: bindFunctions,
+  durationToDate: durationToDate
+});
+
+function getTaskTags(data, task, tags) {
+  var matchFound = true;
+
+  while (matchFound) {
+    matchFound = false;
+    tags.forEach(function (t) {
+      var pattern = '^\\s*' + t + '\\s*$';
+      var regex = new RegExp(pattern);
+
+      if (data[0].match(regex)) {
+        task[t] = true;
+        data.shift(1);
+        matchFound = true;
+      }
+    });
+  }
+}
+
+/***/ }),
+
+/***/ "./src/diagrams/gantt/ganttRenderer.js":
+/*!*********************************************!*\
+  !*** ./src/diagrams/gantt/ganttRenderer.js ***!
+  \*********************************************/
+/*! exports provided: setConf, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _parser_gantt__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parser/gantt */ "./src/diagrams/gantt/parser/gantt.jison");
+/* harmony import */ var _parser_gantt__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_parser_gantt__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+/* harmony import */ var _ganttDb__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./ganttDb */ "./src/diagrams/gantt/ganttDb.js");
+
+
+
+
+_parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy = _ganttDb__WEBPACK_IMPORTED_MODULE_3__["default"];
+var conf = {
+  titleTopMargin: 25,
+  barHeight: 20,
+  barGap: 4,
+  topPadding: 50,
+  rightPadding: 75,
+  leftPadding: 75,
+  gridLineStartPadding: 35,
+  fontSize: 11,
+  fontFamily: '"Open-Sans", "sans-serif"'
+};
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+  keys.forEach(function (key) {
+    conf[key] = cnf[key];
+  });
+};
+var w;
+var draw = function draw(text, id) {
+  _parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.clear();
+  _parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].parse(text);
+  var elem = document.getElementById(id);
+  w = elem.parentElement.offsetWidth;
+
+  if (typeof w === 'undefined') {
+    w = 1200;
+  }
+
+  if (typeof conf.useWidth !== 'undefined') {
+    w = conf.useWidth;
+  }
+
+  var taskArray = _parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getTasks(); // Set height based on number of tasks
+
+  var h = taskArray.length * (conf.barHeight + conf.barGap) + 2 * conf.topPadding;
+  elem.setAttribute('height', '100%'); // Set viewBox
+
+  elem.setAttribute('viewBox', '0 0 ' + w + ' ' + h);
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id=\"".concat(id, "\"]")); // Set timescale
+
+  var timeScale = Object(d3__WEBPACK_IMPORTED_MODULE_0__["scaleTime"])().domain([Object(d3__WEBPACK_IMPORTED_MODULE_0__["min"])(taskArray, function (d) {
+    return d.startTime;
+  }), Object(d3__WEBPACK_IMPORTED_MODULE_0__["max"])(taskArray, function (d) {
+    return d.endTime;
+  })]).rangeRound([0, w - conf.leftPadding - conf.rightPadding]);
+  var categories = [];
+
+  for (var i = 0; i < taskArray.length; i++) {
+    categories.push(taskArray[i].type);
+  }
+
+  var catsUnfiltered = categories; // for vert labels
+
+  categories = checkUnique(categories);
+
+  function taskCompare(a, b) {
+    var taskA = a.startTime;
+    var taskB = b.startTime;
+    var result = 0;
+
+    if (taskA > taskB) {
+      result = 1;
+    } else if (taskA < taskB) {
+      result = -1;
+    }
+
+    return result;
+  } // Sort the task array using the above taskCompare() so that
+  // tasks are created based on their order of startTime
+
+
+  taskArray.sort(taskCompare);
+  makeGant(taskArray, w, h);
+
+  if (typeof conf.useWidth !== 'undefined') {
+    elem.setAttribute('width', w);
+  }
+
+  svg.append('text').text(_parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getTitle()).attr('x', w / 2).attr('y', conf.titleTopMargin).attr('class', 'titleText');
+
+  function makeGant(tasks, pageWidth, pageHeight) {
+    var barHeight = conf.barHeight;
+    var gap = barHeight + conf.barGap;
+    var topPadding = conf.topPadding;
+    var leftPadding = conf.leftPadding;
+    var colorScale = Object(d3__WEBPACK_IMPORTED_MODULE_0__["scaleLinear"])().domain([0, categories.length]).range(['#00B9FA', '#F95002']).interpolate(d3__WEBPACK_IMPORTED_MODULE_0__["interpolateHcl"]);
+    makeGrid(leftPadding, topPadding, pageWidth, pageHeight);
+    drawRects(tasks, gap, topPadding, leftPadding, barHeight, colorScale, pageWidth, pageHeight);
+    vertLabels(gap, topPadding, leftPadding, barHeight, colorScale);
+    drawToday(leftPadding, topPadding, pageWidth, pageHeight);
+  }
+
+  function drawRects(theArray, theGap, theTopPad, theSidePad, theBarHeight, theColorScale, w) {
+    // Draw background rects covering the entire width of the graph, these form the section rows.
+    svg.append('g').selectAll('rect').data(theArray).enter().append('rect').attr('x', 0).attr('y', function (d, i) {
+      // Ignore the incoming i value and use our order instead
+      i = d.order;
+      return i * theGap + theTopPad - 2;
+    }).attr('width', function () {
+      return w - conf.rightPadding / 2;
+    }).attr('height', theGap).attr('class', function (d) {
+      for (var _i = 0; _i < categories.length; _i++) {
+        if (d.type === categories[_i]) {
+          return 'section section' + _i % conf.numberSectionStyles;
+        }
+      }
+
+      return 'section section0';
+    }); // Draw the rects representing the tasks
+
+    var rectangles = svg.append('g').selectAll('rect').data(theArray).enter();
+    rectangles.append('rect').attr('id', function (d) {
+      return d.id;
+    }).attr('rx', 3).attr('ry', 3).attr('x', function (d) {
+      if (d.milestone) {
+        return timeScale(d.startTime) + theSidePad + 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight;
+      }
+
+      return timeScale(d.startTime) + theSidePad;
+    }).attr('y', function (d, i) {
+      // Ignore the incoming i value and use our order instead
+      i = d.order;
+      return i * theGap + theTopPad;
+    }).attr('width', function (d) {
+      if (d.milestone) {
+        return theBarHeight;
+      }
+
+      return timeScale(d.renderEndTime || d.endTime) - timeScale(d.startTime);
+    }).attr('height', theBarHeight).attr('transform-origin', function (d, i) {
+      return (timeScale(d.startTime) + theSidePad + 0.5 * (timeScale(d.endTime) - timeScale(d.startTime))).toString() + 'px ' + (i * theGap + theTopPad + 0.5 * theBarHeight).toString() + 'px';
+    }).attr('class', function (d) {
+      var res = 'task';
+      var classStr = '';
+
+      if (d.classes.length > 0) {
+        classStr = d.classes.join(' ');
+      }
+
+      var secNum = 0;
+
+      for (var _i2 = 0; _i2 < categories.length; _i2++) {
+        if (d.type === categories[_i2]) {
+          secNum = _i2 % conf.numberSectionStyles;
+        }
+      }
+
+      var taskClass = '';
+
+      if (d.active) {
+        if (d.crit) {
+          taskClass += ' activeCrit';
+        } else {
+          taskClass = ' active';
+        }
+      } else if (d.done) {
+        if (d.crit) {
+          taskClass = ' doneCrit';
+        } else {
+          taskClass = ' done';
+        }
+      } else {
+        if (d.crit) {
+          taskClass += ' crit';
+        }
+      }
+
+      if (taskClass.length === 0) {
+        taskClass = ' task';
+      }
+
+      if (d.milestone) {
+        taskClass = ' milestone ' + taskClass;
+      }
+
+      taskClass += secNum;
+      taskClass += ' ' + classStr;
+      return res + taskClass;
+    }); // Append task labels
+
+    rectangles.append('text').attr('id', function (d) {
+      return d.id + '-text';
+    }).text(function (d) {
+      return d.task;
+    }).attr('font-size', conf.fontSize).attr('x', function (d) {
+      var startX = timeScale(d.startTime);
+      var endX = timeScale(d.renderEndTime || d.endTime);
+
+      if (d.milestone) {
+        startX += 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight;
+      }
+
+      if (d.milestone) {
+        endX = startX + theBarHeight;
+      }
+
+      var textWidth = this.getBBox().width; // Check id text width > width of rectangle
+
+      if (textWidth > endX - startX) {
+        if (endX + textWidth + 1.5 * conf.leftPadding > w) {
+          return startX + theSidePad - 5;
+        } else {
+          return endX + theSidePad + 5;
+        }
+      } else {
+        return (endX - startX) / 2 + startX + theSidePad;
+      }
+    }).attr('y', function (d, i) {
+      // Ignore the incoming i value and use our order instead
+      i = d.order;
+      return i * theGap + conf.barHeight / 2 + (conf.fontSize / 2 - 2) + theTopPad;
+    }).attr('text-height', theBarHeight).attr('class', function (d) {
+      var startX = timeScale(d.startTime);
+      var endX = timeScale(d.endTime);
+
+      if (d.milestone) {
+        endX = startX + theBarHeight;
+      }
+
+      var textWidth = this.getBBox().width;
+      var classStr = '';
+
+      if (d.classes.length > 0) {
+        classStr = d.classes.join(' ');
+      }
+
+      var secNum = 0;
+      console.log(conf);
+
+      for (var _i3 = 0; _i3 < categories.length; _i3++) {
+        if (d.type === categories[_i3]) {
+          secNum = _i3 % conf.numberSectionStyles;
+        }
+      }
+
+      var taskType = '';
+
+      if (d.active) {
+        if (d.crit) {
+          taskType = 'activeCritText' + secNum;
+        } else {
+          taskType = 'activeText' + secNum;
+        }
+      }
+
+      if (d.done) {
+        if (d.crit) {
+          taskType = taskType + ' doneCritText' + secNum;
+        } else {
+          taskType = taskType + ' doneText' + secNum;
+        }
+      } else {
+        if (d.crit) {
+          taskType = taskType + ' critText' + secNum;
+        }
+      }
+
+      if (d.milestone) {
+        taskType += ' milestoneText';
+      } // Check id text width > width of rectangle
+
+
+      if (textWidth > endX - startX) {
+        if (endX + textWidth + 1.5 * conf.leftPadding > w) {
+          return classStr + ' taskTextOutsideLeft taskTextOutside' + secNum + ' ' + taskType;
+        } else {
+          return classStr + ' taskTextOutsideRight taskTextOutside' + secNum + ' ' + taskType + ' width-' + textWidth;
+        }
+      } else {
+        return classStr + ' taskText taskText' + secNum + ' ' + taskType + ' width-' + textWidth;
+      }
+    });
+  }
+
+  function makeGrid(theSidePad, theTopPad, w, h) {
+    var xAxis = Object(d3__WEBPACK_IMPORTED_MODULE_0__["axisBottom"])(timeScale).tickSize(-h + theTopPad + conf.gridLineStartPadding).tickFormat(Object(d3__WEBPACK_IMPORTED_MODULE_0__["timeFormat"])(_parser_gantt__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getAxisFormat() || conf.axisFormat || '%Y-%m-%d'));
+    svg.append('g').attr('class', 'grid').attr('transform', 'translate(' + theSidePad + ', ' + (h - 50) + ')').call(xAxis).selectAll('text').style('text-anchor', 'middle').attr('fill', '#000').attr('stroke', 'none').attr('font-size', 10).attr('dy', '1em');
+  }
+
+  function vertLabels(theGap, theTopPad) {
+    var numOccurances = [];
+    var prevGap = 0;
+
+    for (var _i4 = 0; _i4 < categories.length; _i4++) {
+      numOccurances[_i4] = [categories[_i4], getCount(categories[_i4], catsUnfiltered)];
+    }
+
+    svg.append('g') // without doing this, impossible to put grid lines behind text
+    .selectAll('text').data(numOccurances).enter().append(function (d) {
+      var rows = d[0].split(_common_common__WEBPACK_IMPORTED_MODULE_2__["default"].lineBreakRegex);
+      var dy = -(rows.length - 1) / 2;
+      var svgLabel = document.createElementNS('http://www.w3.org/2000/svg', 'text');
+      svgLabel.setAttribute('dy', dy + 'em');
+
+      for (var j = 0; j < rows.length; j++) {
+        var tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
+        tspan.setAttribute('alignment-baseline', 'central');
+        tspan.setAttribute('x', '10');
+        if (j > 0) tspan.setAttribute('dy', '1em');
+        tspan.textContent = rows[j];
+        svgLabel.appendChild(tspan);
+      }
+
+      return svgLabel;
+    }).attr('x', 10).attr('y', function (d, i) {
+      if (i > 0) {
+        for (var j = 0; j < i; j++) {
+          prevGap += numOccurances[i - 1][1];
+          return d[1] * theGap / 2 + prevGap * theGap + theTopPad;
+        }
+      } else {
+        return d[1] * theGap / 2 + theTopPad;
+      }
+    }).attr('class', function (d) {
+      for (var _i5 = 0; _i5 < categories.length; _i5++) {
+        if (d[0] === categories[_i5]) {
+          return 'sectionTitle sectionTitle' + _i5 % conf.numberSectionStyles;
+        }
+      }
+
+      return 'sectionTitle';
+    });
+  }
+
+  function drawToday(theSidePad, theTopPad, w, h) {
+    var todayMarker = _ganttDb__WEBPACK_IMPORTED_MODULE_3__["default"].getTodayMarker();
+
+    if (todayMarker === 'off') {
+      return;
+    }
+
+    var todayG = svg.append('g').attr('class', 'today');
+    var today = new Date();
+    var todayLine = todayG.append('line');
+    todayLine.attr('x1', timeScale(today) + theSidePad).attr('x2', timeScale(today) + theSidePad).attr('y1', conf.titleTopMargin).attr('y2', h - conf.titleTopMargin).attr('class', 'today');
+
+    if (todayMarker !== '') {
+      todayLine.attr('style', todayMarker.replace(/,/g, ';'));
+    }
+  } // from this stackexchange question: http://stackoverflow.com/questions/1890203/unique-for-arrays-in-javascript
+
+
+  function checkUnique(arr) {
+    var hash = {};
+    var result = [];
+
+    for (var _i6 = 0, l = arr.length; _i6 < l; ++_i6) {
+      if (!hash.hasOwnProperty(arr[_i6])) {
+        // eslint-disable-line
+        // it works with objects! in FF, at least
+        hash[arr[_i6]] = true;
+        result.push(arr[_i6]);
+      }
+    }
+
+    return result;
+  } // from this stackexchange question: http://stackoverflow.com/questions/14227981/count-how-many-strings-in-an-array-have-duplicates-in-the-same-array
+
+
+  function getCounts(arr) {
+    var i = arr.length; // const to loop over
+
+    var obj = {}; // obj to store results
+
+    while (i) {
+      obj[arr[--i]] = (obj[arr[i]] || 0) + 1; // count occurrences
+    }
+
+    return obj;
+  } // get specific from everything
+
+
+  function getCount(word, arr) {
+    return getCounts(arr)[word] || 0;
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/gantt/parser/gantt.jison":
+/*!***********************************************!*\
+  !*** ./src/diagrams/gantt/parser/gantt.jison ***!
+  \***********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,3],$V1=[1,5],$V2=[7,9,11,12,13,14,15,16,17,18,20,27,32],$V3=[1,15],$V4=[1,16],$V5=[1,17],$V6=[1,18],$V7=[1,19],$V8=[1,20],$V9=[1,21],$Va=[1,23],$Vb=[1,25],$Vc=[1,28],$Vd=[5,7,9,11,12,13,14,15,16,17,18,20,27,32];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"directive":4,"gantt":5,"document":6,"EOF":7,"line":8,"SPACE":9,"statement":10,"NL":11,"dateFormat":12,"inclusiveEndDates":13,"axisFormat":14,"excludes":15,"todayMarker":16,"title":17,"section":18,"clickStatement":19,"taskTxt":20,"taskData":21,"openDirective":22,"typeDirective":23,"closeDirective":24,":":25,"argDirective":26,"click":27,"callbackname":28,"callbackargs":29,"href":30,"clickStatementDebug":31,"open_directive":32,"type_directive":33,"arg_directive":34,"close_directive":35,"$accept":0,"$end":1},
+terminals_: {2:"error",5:"gantt",7:"EOF",9:"SPACE",11:"NL",12:"dateFormat",13:"inclusiveEndDates",14:"axisFormat",15:"excludes",16:"todayMarker",17:"title",18:"section",20:"taskTxt",21:"taskData",25:":",27:"click",28:"callbackname",29:"callbackargs",30:"href",32:"open_directive",33:"type_directive",34:"arg_directive",35:"close_directive"},
+productions_: [0,[3,2],[3,3],[6,0],[6,2],[8,2],[8,1],[8,1],[8,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,1],[4,4],[4,6],[19,2],[19,3],[19,3],[19,4],[19,3],[19,4],[19,2],[31,2],[31,3],[31,3],[31,4],[31,3],[31,4],[31,2],[22,1],[23,1],[26,1],[24,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 2:
+ return $$[$0-1]; 
+break;
+case 3:
+ this.$ = [] 
+break;
+case 4:
+$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
+break;
+case 5: case 6:
+ this.$ = $$[$0] 
+break;
+case 7: case 8:
+ this.$=[];
+break;
+case 9:
+yy.setDateFormat($$[$0].substr(11));this.$=$$[$0].substr(11);
+break;
+case 10:
+yy.enableInclusiveEndDates();this.$=$$[$0].substr(18);
+break;
+case 11:
+yy.setAxisFormat($$[$0].substr(11));this.$=$$[$0].substr(11);
+break;
+case 12:
+yy.setExcludes($$[$0].substr(9));this.$=$$[$0].substr(9);
+break;
+case 13:
+yy.setTodayMarker($$[$0].substr(12));this.$=$$[$0].substr(12);
+break;
+case 14:
+yy.setTitle($$[$0].substr(6));this.$=$$[$0].substr(6);
+break;
+case 15:
+yy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);
+break;
+case 17:
+yy.addTask($$[$0-1],$$[$0]);this.$='task';
+break;
+case 21:
+this.$ = $$[$0-1];yy.setClickEvent($$[$0-1], $$[$0], null);
+break;
+case 22:
+this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);
+break;
+case 23:
+this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], null);yy.setLink($$[$0-2],$$[$0]);
+break;
+case 24:
+this.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-2], $$[$0-1]);yy.setLink($$[$0-3],$$[$0]);
+break;
+case 25:
+this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0], null);yy.setLink($$[$0-2],$$[$0-1]);
+break;
+case 26:
+this.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-1], $$[$0]);yy.setLink($$[$0-3],$$[$0-2]);
+break;
+case 27:
+this.$ = $$[$0-1];yy.setLink($$[$0-1], $$[$0]);
+break;
+case 28: case 34:
+this.$=$$[$0-1] + ' ' + $$[$0];
+break;
+case 29: case 30: case 32:
+this.$=$$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];
+break;
+case 31: case 33:
+this.$=$$[$0-3] + ' ' + $$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];
+break;
+case 35:
+ yy.parseDirective('%%{', 'open_directive'); 
+break;
+case 36:
+ yy.parseDirective($$[$0], 'type_directive'); 
+break;
+case 37:
+ $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); 
+break;
+case 38:
+ yy.parseDirective('}%%', 'close_directive', 'gantt'); 
+break;
+}
+},
+table: [{3:1,4:2,5:$V0,22:4,32:$V1},{1:[3]},{3:6,4:2,5:$V0,22:4,32:$V1},o($V2,[2,3],{6:7}),{23:8,33:[1,9]},{33:[2,35]},{1:[2,1]},{4:24,7:[1,10],8:11,9:[1,12],10:13,11:[1,14],12:$V3,13:$V4,14:$V5,15:$V6,16:$V7,17:$V8,18:$V9,19:22,20:$Va,22:4,27:$Vb,32:$V1},{24:26,25:[1,27],35:$Vc},o([25,35],[2,36]),o($V2,[2,8],{1:[2,2]}),o($V2,[2,4]),{4:24,10:29,12:$V3,13:$V4,14:$V5,15:$V6,16:$V7,17:$V8,18:$V9,19:22,20:$Va,22:4,27:$Vb,32:$V1},o($V2,[2,6]),o($V2,[2,7]),o($V2,[2,9]),o($V2,[2,10]),o($V2,[2,11]),o($V2,[2,12]),o($V2,[2,13]),o($V2,[2,14]),o($V2,[2,15]),o($V2,[2,16]),{21:[1,30]},o($V2,[2,18]),{28:[1,31],30:[1,32]},{11:[1,33]},{26:34,34:[1,35]},{11:[2,38]},o($V2,[2,5]),o($V2,[2,17]),o($V2,[2,21],{29:[1,36],30:[1,37]}),o($V2,[2,27],{28:[1,38]}),o($Vd,[2,19]),{24:39,35:$Vc},{35:[2,37]},o($V2,[2,22],{30:[1,40]}),o($V2,[2,23]),o($V2,[2,25],{29:[1,41]}),{11:[1,42]},o($V2,[2,24]),o($V2,[2,26]),o($Vd,[2,20])],
+defaultActions: {5:[2,35],6:[2,1],28:[2,38],35:[2,37]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0: this.begin('open_directive'); return 32; 
+break;
+case 1: this.begin('type_directive'); return 33; 
+break;
+case 2: this.popState(); this.begin('arg_directive'); return 25; 
+break;
+case 3: this.popState(); this.popState(); return 35; 
+break;
+case 4:return 34;
+break;
+case 5:/* skip comments */
+break;
+case 6:/* skip comments */
+break;
+case 7:/* do nothing */
+break;
+case 8:return 11;
+break;
+case 9:/* skip whitespace */
+break;
+case 10:/* skip comments */
+break;
+case 11:/* skip comments */
+break;
+case 12:this.begin("href");
+break;
+case 13:this.popState();
+break;
+case 14:return 30;
+break;
+case 15:this.begin("callbackname");
+break;
+case 16:this.popState();
+break;
+case 17:this.popState(); this.begin("callbackargs");
+break;
+case 18:return 28;
+break;
+case 19:this.popState();
+break;
+case 20:return 29;
+break;
+case 21:this.begin("click");
+break;
+case 22:this.popState();
+break;
+case 23:return 27;
+break;
+case 24:return 5;
+break;
+case 25:return 12;
+break;
+case 26:return 13;
+break;
+case 27:return 14;
+break;
+case 28:return 15;
+break;
+case 29:return 16;
+break;
+case 30:return 'date';
+break;
+case 31:return 17;
+break;
+case 32:return 18;
+break;
+case 33:return 20;
+break;
+case 34:return 21;
+break;
+case 35:return 25;
+break;
+case 36:return 7;
+break;
+case 37:return 'INVALID';
+break;
+}
+},
+rules: [/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],
+conditions: {"close_directive":{"rules":[],"inclusive":false},"arg_directive":{"rules":[3,4],"inclusive":false},"type_directive":{"rules":[2,3],"inclusive":false},"open_directive":{"rules":[1],"inclusive":false},"callbackargs":{"rules":[19,20],"inclusive":false},"callbackname":{"rules":[16,17,18],"inclusive":false},"href":{"rules":[13,14],"inclusive":false},"click":{"rules":[22,23],"inclusive":false},"INITIAL":{"rules":[0,5,6,7,8,9,10,11,12,15,21,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/gantt/styles.js":
+/*!**************************************!*\
+  !*** ./src/diagrams/gantt/styles.js ***!
+  \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles(options) {
+  return "\n  .mermaid-main-font {\n    font-family: \"trebuchet ms\", verdana, arial;\n    font-family: var(--mermaid-font-family);\n  }\n\n  .section {\n    stroke: none;\n    opacity: 0.2;\n  }\n\n  .section0 {\n    fill: ".concat(options.sectionBkgColor, ";\n  }\n\n  .section2 {\n    fill: ").concat(options.sectionBkgColor2, ";\n  }\n\n  .section1,\n  .section3 {\n    fill: ").concat(options.altSectionBkgColor, ";\n    opacity: 0.2;\n  }\n\n  .sectionTitle0 {\n    fill: ").concat(options.titleColor, ";\n  }\n\n  .sectionTitle1 {\n    fill: ").concat(options.titleColor, ";\n  }\n\n  .sectionTitle2 {\n    fill: ").concat(options.titleColor, ";\n  }\n\n  .sectionTitle3 {\n    fill: ").concat(options.titleColor, ";\n  }\n\n  .sectionTitle {\n    text-anchor: start;\n    font-size: 11px;\n    text-height: 14px;\n    font-family: 'trebuchet ms', verdana, arial;\n    font-family: var(--mermaid-font-family);\n\n  }\n\n\n  /* Grid and axis */\n\n  .grid .tick {\n    stroke: ").concat(options.gridColor, ";\n    opacity: 0.8;\n    shape-rendering: crispEdges;\n    text {\n      font-family: ").concat(options.fontFamily, ";\n      fill: ").concat(options.textColor, ";\n    }\n  }\n\n  .grid path {\n    stroke-width: 0;\n  }\n\n\n  /* Today line */\n\n  .today {\n    fill: none;\n    stroke: ").concat(options.todayLineColor, ";\n    stroke-width: 2px;\n  }\n\n\n  /* Task styling */\n\n  /* Default task */\n\n  .task {\n    stroke-width: 2;\n  }\n\n  .taskText {\n    text-anchor: middle;\n    font-family: 'trebuchet ms', verdana, arial;\n    font-family: var(--mermaid-font-family);\n  }\n\n  .taskText:not([font-size]) {\n    font-size: 11px;\n  }\n\n  .taskTextOutsideRight {\n    fill: ").concat(options.taskTextDarkColor, ";\n    text-anchor: start;\n    font-size: 11px;\n    font-family: 'trebuchet ms', verdana, arial;\n    font-family: var(--mermaid-font-family);\n\n  }\n\n  .taskTextOutsideLeft {\n    fill: ").concat(options.taskTextDarkColor, ";\n    text-anchor: end;\n    font-size: 11px;\n  }\n\n  /* Special case clickable */\n  .task.clickable {\n    cursor: pointer;\n  }\n  .taskText.clickable {\n    cursor: pointer;\n    fill: ").concat(options.taskTextClickableColor, " !important;\n    font-weight: bold;\n  }\n\n  .taskTextOutsideLeft.clickable {\n    cursor: pointer;\n    fill: ").concat(options.taskTextClickableColor, " !important;\n    font-weight: bold;\n  }\n\n  .taskTextOutsideRight.clickable {\n    cursor: pointer;\n    fill: ").concat(options.taskTextClickableColor, " !important;\n    font-weight: bold;\n  }\n\n  /* Specific task settings for the sections*/\n\n  .taskText0,\n  .taskText1,\n  .taskText2,\n  .taskText3 {\n    fill: ").concat(options.taskTextColor, ";\n  }\n\n  .task0,\n  .task1,\n  .task2,\n  .task3 {\n    fill: ").concat(options.taskBkgColor, ";\n    stroke: ").concat(options.taskBorderColor, ";\n  }\n\n  .taskTextOutside0,\n  .taskTextOutside2\n  {\n    fill: ").concat(options.taskTextOutsideColor, ";\n  }\n\n  .taskTextOutside1,\n  .taskTextOutside3 {\n    fill: ").concat(options.taskTextOutsideColor, ";\n  }\n\n\n  /* Active task */\n\n  .active0,\n  .active1,\n  .active2,\n  .active3 {\n    fill: ").concat(options.activeTaskBkgColor, ";\n    stroke: ").concat(options.activeTaskBorderColor, ";\n  }\n\n  .activeText0,\n  .activeText1,\n  .activeText2,\n  .activeText3 {\n    fill: ").concat(options.taskTextDarkColor, " !important;\n  }\n\n\n  /* Completed task */\n\n  .done0,\n  .done1,\n  .done2,\n  .done3 {\n    stroke: ").concat(options.doneTaskBorderColor, ";\n    fill: ").concat(options.doneTaskBkgColor, ";\n    stroke-width: 2;\n  }\n\n  .doneText0,\n  .doneText1,\n  .doneText2,\n  .doneText3 {\n    fill: ").concat(options.taskTextDarkColor, " !important;\n  }\n\n\n  /* Tasks on the critical line */\n\n  .crit0,\n  .crit1,\n  .crit2,\n  .crit3 {\n    stroke: ").concat(options.critBorderColor, ";\n    fill: ").concat(options.critBkgColor, ";\n    stroke-width: 2;\n  }\n\n  .activeCrit0,\n  .activeCrit1,\n  .activeCrit2,\n  .activeCrit3 {\n    stroke: ").concat(options.critBorderColor, ";\n    fill: ").concat(options.activeTaskBkgColor, ";\n    stroke-width: 2;\n  }\n\n  .doneCrit0,\n  .doneCrit1,\n  .doneCrit2,\n  .doneCrit3 {\n    stroke: ").concat(options.critBorderColor, ";\n    fill: ").concat(options.doneTaskBkgColor, ";\n    stroke-width: 2;\n    cursor: pointer;\n    shape-rendering: crispEdges;\n  }\n\n  .milestone {\n    transform: rotate(45deg) scale(0.8,0.8);\n  }\n\n  .milestoneText {\n    font-style: italic;\n  }\n  .doneCritText0,\n  .doneCritText1,\n  .doneCritText2,\n  .doneCritText3 {\n    fill: ").concat(options.taskTextDarkColor, " !important;\n  }\n\n  .activeCritText0,\n  .activeCritText1,\n  .activeCritText2,\n  .activeCritText3 {\n    fill: ").concat(options.taskTextDarkColor, " !important;\n  }\n\n  .titleText {\n    text-anchor: middle;\n    font-size: 18px;\n    fill: ").concat(options.textColor, "    ;\n    font-family: 'trebuchet ms', verdana, arial;\n    font-family: var(--mermaid-font-family);\n  }\n");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/git/gitGraphAst.js":
+/*!*****************************************!*\
+  !*** ./src/diagrams/git/gitGraphAst.js ***!
+  \*****************************************/
+/*! exports provided: setDirection, setOptions, getOptions, commit, branch, merge, checkout, reset, prettyPrint, clear, getBranchesAsObjArray, getBranches, getCommits, getCommitsArray, getCurrentBranch, getDirection, getHead, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setDirection", function() { return setDirection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setOptions", function() { return setOptions; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getOptions", function() { return getOptions; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commit", function() { return commit; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "branch", function() { return branch; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkout", function() { return checkout; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reset", function() { return reset; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prettyPrint", function() { return prettyPrint; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBranchesAsObjArray", function() { return getBranchesAsObjArray; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBranches", function() { return getBranches; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCommits", function() { return getCommits; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCommitsArray", function() { return getCommitsArray; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCurrentBranch", function() { return getCurrentBranch; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDirection", function() { return getDirection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getHead", function() { return getHead; });
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+
+
+var commits = {};
+var head = null;
+var branches = {
+  master: head
+};
+var curBranch = 'master';
+var direction = 'LR';
+var seq = 0;
+
+function getId() {
+  return Object(_utils__WEBPACK_IMPORTED_MODULE_1__["random"])({
+    length: 7
+  });
+}
+
+function isfastforwardable(currentCommit, otherCommit) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Entering isfastforwardable:', currentCommit.id, otherCommit.id);
+
+  while (currentCommit.seq <= otherCommit.seq && currentCommit !== otherCommit) {
+    // only if other branch has more commits
+    if (otherCommit.parent == null) break;
+
+    if (Array.isArray(otherCommit.parent)) {
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('In merge commit:', otherCommit.parent);
+      return isfastforwardable(currentCommit, commits[otherCommit.parent[0]]) || isfastforwardable(currentCommit, commits[otherCommit.parent[1]]);
+    } else {
+      otherCommit = commits[otherCommit.parent];
+    }
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(currentCommit.id, otherCommit.id);
+  return currentCommit.id === otherCommit.id;
+}
+
+function isReachableFrom(currentCommit, otherCommit) {
+  var currentSeq = currentCommit.seq;
+  var otherSeq = otherCommit.seq;
+  if (currentSeq > otherSeq) return isfastforwardable(otherCommit, currentCommit);
+  return false;
+}
+
+function uniqBy(list, fn) {
+  var recordMap = Object.create(null);
+  return list.reduce(function (out, item) {
+    var key = fn(item);
+
+    if (!recordMap[key]) {
+      recordMap[key] = true;
+      out.push(item);
+    }
+
+    return out;
+  }, []);
+}
+
+var setDirection = function setDirection(dir) {
+  direction = dir;
+};
+var options = {};
+var setOptions = function setOptions(rawOptString) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('options str', rawOptString);
+  rawOptString = rawOptString && rawOptString.trim();
+  rawOptString = rawOptString || '{}';
+
+  try {
+    options = JSON.parse(rawOptString);
+  } catch (e) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error('error while parsing gitGraph options', e.message);
+  }
+};
+var getOptions = function getOptions() {
+  return options;
+};
+var commit = function commit(msg) {
+  var commit = {
+    id: getId(),
+    message: msg,
+    seq: seq++,
+    parent: head == null ? null : head.id
+  };
+  head = commit;
+  commits[commit.id] = commit;
+  branches[curBranch] = commit.id;
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in pushCommit ' + commit.id);
+};
+var branch = function branch(name) {
+  branches[name] = head != null ? head.id : null;
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in createBranch');
+};
+var merge = function merge(otherBranch) {
+  var currentCommit = commits[branches[curBranch]];
+  var otherCommit = commits[branches[otherBranch]];
+
+  if (isReachableFrom(currentCommit, otherCommit)) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Already merged');
+    return;
+  }
+
+  if (isfastforwardable(currentCommit, otherCommit)) {
+    branches[curBranch] = branches[otherBranch];
+    head = commits[branches[curBranch]];
+  } else {
+    // create merge commit
+    var _commit = {
+      id: getId(),
+      message: 'merged branch ' + otherBranch + ' into ' + curBranch,
+      seq: seq++,
+      parent: [head == null ? null : head.id, branches[otherBranch]]
+    };
+    head = _commit;
+    commits[_commit.id] = _commit;
+    branches[curBranch] = _commit.id;
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(branches);
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in mergeBranch');
+};
+var checkout = function checkout(branch) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in checkout');
+  curBranch = branch;
+  var id = branches[curBranch];
+  head = commits[id];
+};
+var reset = function reset(commitRef) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('in reset', commitRef);
+  var ref = commitRef.split(':')[0];
+  var parentCount = parseInt(commitRef.split(':')[1]);
+  var commit = ref === 'HEAD' ? head : commits[branches[ref]];
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(commit, parentCount);
+
+  while (parentCount > 0) {
+    commit = commits[commit.parent];
+    parentCount--;
+
+    if (!commit) {
+      var err = 'Critical error - unique parent commit not found during reset';
+      _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].error(err);
+      throw err;
+    }
+  }
+
+  head = commit;
+  branches[curBranch] = commit.id;
+};
+
+function upsert(arr, key, newval) {
+  var index = arr.indexOf(key);
+
+  if (index === -1) {
+    arr.push(newval);
+  } else {
+    arr.splice(index, 1, newval);
+  }
+}
+
+function prettyPrintCommitHistory(commitArr) {
+  var commit = commitArr.reduce(function (out, commit) {
+    if (out.seq > commit.seq) return out;
+    return commit;
+  }, commitArr[0]);
+  var line = '';
+  commitArr.forEach(function (c) {
+    if (c === commit) {
+      line += '\t*';
+    } else {
+      line += '\t|';
+    }
+  });
+  var label = [line, commit.id, commit.seq];
+
+  for (var _branch in branches) {
+    if (branches[_branch] === commit.id) label.push(_branch);
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(label.join(' '));
+
+  if (Array.isArray(commit.parent)) {
+    var newCommit = commits[commit.parent[0]];
+    upsert(commitArr, commit, newCommit);
+    commitArr.push(commits[commit.parent[1]]);
+  } else if (commit.parent == null) {
+    return;
+  } else {
+    var nextCommit = commits[commit.parent];
+    upsert(commitArr, commit, nextCommit);
+  }
+
+  commitArr = uniqBy(commitArr, function (c) {
+    return c.id;
+  });
+  prettyPrintCommitHistory(commitArr);
+}
+
+var prettyPrint = function prettyPrint() {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(commits);
+  var node = getCommitsArray()[0];
+  prettyPrintCommitHistory([node]);
+};
+var clear = function clear() {
+  commits = {};
+  head = null;
+  branches = {
+    master: head
+  };
+  curBranch = 'master';
+  seq = 0;
+};
+var getBranchesAsObjArray = function getBranchesAsObjArray() {
+  var branchArr = [];
+
+  for (var _branch2 in branches) {
+    branchArr.push({
+      name: _branch2,
+      commit: commits[branches[_branch2]]
+    });
+  }
+
+  return branchArr;
+};
+var getBranches = function getBranches() {
+  return branches;
+};
+var getCommits = function getCommits() {
+  return commits;
+};
+var getCommitsArray = function getCommitsArray() {
+  var commitArr = Object.keys(commits).map(function (key) {
+    return commits[key];
+  });
+  commitArr.forEach(function (o) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug(o.id);
+  });
+  commitArr.sort(function (a, b) {
+    return b.seq - a.seq;
+  });
+  return commitArr;
+};
+var getCurrentBranch = function getCurrentBranch() {
+  return curBranch;
+};
+var getDirection = function getDirection() {
+  return direction;
+};
+var getHead = function getHead() {
+  return head;
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setDirection: setDirection,
+  setOptions: setOptions,
+  getOptions: getOptions,
+  commit: commit,
+  branch: branch,
+  merge: merge,
+  checkout: checkout,
+  reset: reset,
+  prettyPrint: prettyPrint,
+  clear: clear,
+  getBranchesAsObjArray: getBranchesAsObjArray,
+  getBranches: getBranches,
+  getCommits: getCommits,
+  getCommitsArray: getCommitsArray,
+  getCurrentBranch: getCurrentBranch,
+  getDirection: getDirection,
+  getHead: getHead
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/git/gitGraphRenderer.js":
+/*!**********************************************!*\
+  !*** ./src/diagrams/git/gitGraphRenderer.js ***!
+  \**********************************************/
+/*! exports provided: setConf, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./gitGraphAst */ "./src/diagrams/git/gitGraphAst.js");
+/* harmony import */ var _parser_gitGraph__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./parser/gitGraph */ "./src/diagrams/git/parser/gitGraph.jison");
+/* harmony import */ var _parser_gitGraph__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_parser_gitGraph__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+
+
+
+
+
+var allCommitsDict = {};
+var branchNum;
+var config = {
+  nodeSpacing: 150,
+  nodeFillColor: 'yellow',
+  nodeStrokeWidth: 2,
+  nodeStrokeColor: 'grey',
+  lineStrokeWidth: 4,
+  branchOffset: 50,
+  lineColor: 'grey',
+  leftMargin: 50,
+  branchColors: ['#442f74', '#983351', '#609732', '#AA9A39'],
+  nodeRadius: 10,
+  nodeLabel: {
+    width: 75,
+    height: 100,
+    x: -25,
+    y: 0
+  }
+};
+var apiConfig = {};
+var setConf = function setConf(c) {
+  apiConfig = c;
+};
+
+function svgCreateDefs(svg) {
+  svg.append('defs').append('g').attr('id', 'def-commit').append('circle').attr('r', config.nodeRadius).attr('cx', 0).attr('cy', 0);
+  svg.select('#def-commit').append('foreignObject').attr('width', config.nodeLabel.width).attr('height', config.nodeLabel.height).attr('x', config.nodeLabel.x).attr('y', config.nodeLabel.y).attr('class', 'node-label').attr('requiredFeatures', 'http://www.w3.org/TR/SVG11/feature#Extensibility').append('p').html('');
+}
+
+function svgDrawLine(svg, points, colorIdx, interpolate) {
+  var curve = Object(_utils__WEBPACK_IMPORTED_MODULE_4__["interpolateToCurve"])(interpolate, d3__WEBPACK_IMPORTED_MODULE_0__["curveBasis"]);
+  var color = config.branchColors[colorIdx % config.branchColors.length];
+  var lineGen = Object(d3__WEBPACK_IMPORTED_MODULE_0__["line"])().x(function (d) {
+    return Math.round(d.x);
+  }).y(function (d) {
+    return Math.round(d.y);
+  }).curve(curve);
+  svg.append('svg:path').attr('d', lineGen(points)).style('stroke', color).style('stroke-width', config.lineStrokeWidth).style('fill', 'none');
+} // Pass in the element and its pre-transform coords
+
+
+function getElementCoords(element, coords) {
+  coords = coords || element.node().getBBox();
+  var ctm = element.node().getCTM();
+  var xn = ctm.e + coords.x * ctm.a;
+  var yn = ctm.f + coords.y * ctm.d;
+  return {
+    left: xn,
+    top: yn,
+    width: coords.width,
+    height: coords.height
+  };
+}
+
+function svgDrawLineForCommits(svg, fromId, toId, direction, color) {
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('svgDrawLineForCommits: ', fromId, toId);
+  var fromBbox = getElementCoords(svg.select('#node-' + fromId + ' circle'));
+  var toBbox = getElementCoords(svg.select('#node-' + toId + ' circle'));
+
+  switch (direction) {
+    case 'LR':
+      // (toBbox)
+      //  +--------
+      //          + (fromBbox)
+      if (fromBbox.left - toBbox.left > config.nodeSpacing) {
+        var lineStart = {
+          x: fromBbox.left - config.nodeSpacing,
+          y: toBbox.top + toBbox.height / 2
+        };
+        var lineEnd = {
+          x: toBbox.left + toBbox.width,
+          y: toBbox.top + toBbox.height / 2
+        };
+        svgDrawLine(svg, [lineStart, lineEnd], color, 'linear');
+        svgDrawLine(svg, [{
+          x: fromBbox.left,
+          y: fromBbox.top + fromBbox.height / 2
+        }, {
+          x: fromBbox.left - config.nodeSpacing / 2,
+          y: fromBbox.top + fromBbox.height / 2
+        }, {
+          x: fromBbox.left - config.nodeSpacing / 2,
+          y: lineStart.y
+        }, lineStart], color);
+      } else {
+        svgDrawLine(svg, [{
+          x: fromBbox.left,
+          y: fromBbox.top + fromBbox.height / 2
+        }, {
+          x: fromBbox.left - config.nodeSpacing / 2,
+          y: fromBbox.top + fromBbox.height / 2
+        }, {
+          x: fromBbox.left - config.nodeSpacing / 2,
+          y: toBbox.top + toBbox.height / 2
+        }, {
+          x: toBbox.left + toBbox.width,
+          y: toBbox.top + toBbox.height / 2
+        }], color);
+      }
+
+      break;
+
+    case 'BT':
+      //      +           (fromBbox)
+      //      |
+      //      |
+      //              +   (toBbox)
+      if (toBbox.top - fromBbox.top > config.nodeSpacing) {
+        var _lineStart = {
+          x: toBbox.left + toBbox.width / 2,
+          y: fromBbox.top + fromBbox.height + config.nodeSpacing
+        };
+        var _lineEnd = {
+          x: toBbox.left + toBbox.width / 2,
+          y: toBbox.top
+        };
+        svgDrawLine(svg, [_lineStart, _lineEnd], color, 'linear');
+        svgDrawLine(svg, [{
+          x: fromBbox.left + fromBbox.width / 2,
+          y: fromBbox.top + fromBbox.height
+        }, {
+          x: fromBbox.left + fromBbox.width / 2,
+          y: fromBbox.top + fromBbox.height + config.nodeSpacing / 2
+        }, {
+          x: toBbox.left + toBbox.width / 2,
+          y: _lineStart.y - config.nodeSpacing / 2
+        }, _lineStart], color);
+      } else {
+        svgDrawLine(svg, [{
+          x: fromBbox.left + fromBbox.width / 2,
+          y: fromBbox.top + fromBbox.height
+        }, {
+          x: fromBbox.left + fromBbox.width / 2,
+          y: fromBbox.top + config.nodeSpacing / 2
+        }, {
+          x: toBbox.left + toBbox.width / 2,
+          y: toBbox.top - config.nodeSpacing / 2
+        }, {
+          x: toBbox.left + toBbox.width / 2,
+          y: toBbox.top
+        }], color);
+      }
+
+      break;
+  }
+}
+
+function cloneNode(svg, selector) {
+  return svg.select(selector).node().cloneNode(true);
+}
+
+function renderCommitHistory(svg, commitid, branches, direction) {
+  var commit;
+  var numCommits = Object.keys(allCommitsDict).length;
+
+  if (typeof commitid === 'string') {
+    do {
+      commit = allCommitsDict[commitid];
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('in renderCommitHistory', commit.id, commit.seq);
+
+      if (svg.select('#node-' + commitid).size() > 0) {
+        return;
+      }
+
+      svg.append(function () {
+        return cloneNode(svg, '#def-commit');
+      }).attr('class', 'commit').attr('id', function () {
+        return 'node-' + commit.id;
+      }).attr('transform', function () {
+        switch (direction) {
+          case 'LR':
+            return 'translate(' + (commit.seq * config.nodeSpacing + config.leftMargin) + ', ' + branchNum * config.branchOffset + ')';
+
+          case 'BT':
+            return 'translate(' + (branchNum * config.branchOffset + config.leftMargin) + ', ' + (numCommits - commit.seq) * config.nodeSpacing + ')';
+        }
+      }).attr('fill', config.nodeFillColor).attr('stroke', config.nodeStrokeColor).attr('stroke-width', config.nodeStrokeWidth);
+      var branch = void 0;
+
+      for (var branchName in branches) {
+        if (branches[branchName].commit === commit) {
+          branch = branches[branchName];
+          break;
+        }
+      }
+
+      if (branch) {
+        _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('found branch ', branch.name);
+        svg.select('#node-' + commit.id + ' p').append('xhtml:span').attr('class', 'branch-label').text(branch.name + ', ');
+      }
+
+      svg.select('#node-' + commit.id + ' p').append('xhtml:span').attr('class', 'commit-id').text(commit.id);
+
+      if (commit.message !== '' && direction === 'BT') {
+        svg.select('#node-' + commit.id + ' p').append('xhtml:span').attr('class', 'commit-msg').text(', ' + commit.message);
+      }
+
+      commitid = commit.parent;
+    } while (commitid && allCommitsDict[commitid]);
+  }
+
+  if (Array.isArray(commitid)) {
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('found merge commmit', commitid);
+    renderCommitHistory(svg, commitid[0], branches, direction);
+    branchNum++;
+    renderCommitHistory(svg, commitid[1], branches, direction);
+    branchNum--;
+  }
+}
+
+function renderLines(svg, commit, direction, branchColor) {
+  branchColor = branchColor || 0;
+
+  while (commit.seq > 0 && !commit.lineDrawn) {
+    if (typeof commit.parent === 'string') {
+      svgDrawLineForCommits(svg, commit.id, commit.parent, direction, branchColor);
+      commit.lineDrawn = true;
+      commit = allCommitsDict[commit.parent];
+    } else if (Array.isArray(commit.parent)) {
+      svgDrawLineForCommits(svg, commit.id, commit.parent[0], direction, branchColor);
+      svgDrawLineForCommits(svg, commit.id, commit.parent[1], direction, branchColor + 1);
+      renderLines(svg, allCommitsDict[commit.parent[1]], direction, branchColor + 1);
+      commit.lineDrawn = true;
+      commit = allCommitsDict[commit.parent[0]];
+    }
+  }
+}
+
+var draw = function draw(txt, id, ver) {
+  try {
+    var parser = _parser_gitGraph__WEBPACK_IMPORTED_MODULE_2___default.a.parser;
+    parser.yy = _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"];
+    parser.yy.clear();
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('in gitgraph renderer', txt + '\n', 'id:', id, ver); // Parse the graph definition
+
+    parser.parse(txt + '\n');
+    config = Object.assign(config, apiConfig, _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"].getOptions());
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('effective options', config);
+    var direction = _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"].getDirection();
+    allCommitsDict = _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"].getCommits();
+    var branches = _gitGraphAst__WEBPACK_IMPORTED_MODULE_1__["default"].getBranchesAsObjArray();
+
+    if (direction === 'BT') {
+      config.nodeLabel.x = branches.length * config.branchOffset;
+      config.nodeLabel.width = '100%';
+      config.nodeLabel.y = -1 * 2 * config.nodeRadius;
+    }
+
+    var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id=\"".concat(id, "\"]"));
+    svgCreateDefs(svg);
+    branchNum = 1;
+
+    for (var branch in branches) {
+      var v = branches[branch];
+      renderCommitHistory(svg, v.commit.id, branches, direction);
+      renderLines(svg, v.commit, direction);
+      branchNum++;
+    }
+
+    svg.attr('height', function () {
+      if (direction === 'BT') return Object.keys(allCommitsDict).length * config.nodeSpacing;
+      return (branches.length + 1) * config.branchOffset;
+    });
+  } catch (e) {
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error('Error while rendering gitgraph');
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error(e.message);
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/git/parser/gitGraph.jison":
+/*!************************************************!*\
+  !*** ./src/diagrams/git/parser/gitGraph.jison ***!
+  \************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[2,3],$V1=[1,7],$V2=[7,12,15,17,19,20,21],$V3=[7,11,12,15,17,19,20,21],$V4=[2,20],$V5=[1,32];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"GG":4,":":5,"document":6,"EOF":7,"DIR":8,"options":9,"body":10,"OPT":11,"NL":12,"line":13,"statement":14,"COMMIT":15,"commit_arg":16,"BRANCH":17,"ID":18,"CHECKOUT":19,"MERGE":20,"RESET":21,"reset_arg":22,"STR":23,"HEAD":24,"reset_parents":25,"CARET":26,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"GG",5:":",7:"EOF",8:"DIR",11:"OPT",12:"NL",15:"COMMIT",17:"BRANCH",18:"ID",19:"CHECKOUT",20:"MERGE",21:"RESET",23:"STR",24:"HEAD",26:"CARET"},
+productions_: [0,[3,4],[3,5],[6,0],[6,2],[9,2],[9,1],[10,0],[10,2],[13,2],[13,1],[14,2],[14,2],[14,2],[14,2],[14,2],[16,0],[16,1],[22,2],[22,2],[25,0],[25,2]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1:
+ return $$[$0-1]; 
+break;
+case 2:
+yy.setDirection($$[$0-3]); return $$[$0-1];
+break;
+case 4:
+ yy.setOptions($$[$0-1]); this.$ = $$[$0]
+break;
+case 5:
+$$[$0-1] +=$$[$0]; this.$=$$[$0-1]
+break;
+case 7:
+this.$ = []
+break;
+case 8:
+$$[$0-1].push($$[$0]); this.$=$$[$0-1];
+break;
+case 9:
+this.$ =$$[$0-1]
+break;
+case 11:
+yy.commit($$[$0])
+break;
+case 12:
+yy.branch($$[$0])
+break;
+case 13:
+yy.checkout($$[$0])
+break;
+case 14:
+yy.merge($$[$0])
+break;
+case 15:
+yy.reset($$[$0])
+break;
+case 16:
+this.$ = ""
+break;
+case 17:
+this.$=$$[$0]
+break;
+case 18:
+this.$ = $$[$0-1]+ ":" + $$[$0] 
+break;
+case 19:
+this.$ = $$[$0-1]+ ":"  + yy.count; yy.count = 0
+break;
+case 20:
+yy.count = 0
+break;
+case 21:
+ yy.count += 1 
+break;
+}
+},
+table: [{3:1,4:[1,2]},{1:[3]},{5:[1,3],8:[1,4]},{6:5,7:$V0,9:6,12:$V1},{5:[1,8]},{7:[1,9]},o($V2,[2,7],{10:10,11:[1,11]}),o($V3,[2,6]),{6:12,7:$V0,9:6,12:$V1},{1:[2,1]},{7:[2,4],12:[1,15],13:13,14:14,15:[1,16],17:[1,17],19:[1,18],20:[1,19],21:[1,20]},o($V3,[2,5]),{7:[1,21]},o($V2,[2,8]),{12:[1,22]},o($V2,[2,10]),{12:[2,16],16:23,23:[1,24]},{18:[1,25]},{18:[1,26]},{18:[1,27]},{18:[1,30],22:28,24:[1,29]},{1:[2,2]},o($V2,[2,9]),{12:[2,11]},{12:[2,17]},{12:[2,12]},{12:[2,13]},{12:[2,14]},{12:[2,15]},{12:$V4,25:31,26:$V5},{12:$V4,25:33,26:$V5},{12:[2,18]},{12:$V4,25:34,26:$V5},{12:[2,19]},{12:[2,21]}],
+defaultActions: {9:[2,1],21:[2,2],23:[2,11],24:[2,17],25:[2,12],26:[2,13],27:[2,14],28:[2,15],31:[2,18],33:[2,19],34:[2,21]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:return 12;
+break;
+case 1:/* skip all whitespace */
+break;
+case 2:/* skip comments */
+break;
+case 3:/* skip comments */
+break;
+case 4:return 4;
+break;
+case 5:return 15;
+break;
+case 6:return 17;
+break;
+case 7:return 20;
+break;
+case 8:return 21;
+break;
+case 9:return 19;
+break;
+case 10:return 8;
+break;
+case 11:return 8;
+break;
+case 12:return 5;
+break;
+case 13:return 26
+break;
+case 14:this.begin("options");
+break;
+case 15:this.popState();
+break;
+case 16:return 11;
+break;
+case 17:this.begin("string");
+break;
+case 18:this.popState();
+break;
+case 19:return 23;
+break;
+case 20:return 18;
+break;
+case 21:return 7;
+break;
+}
+},
+rules: [/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit\b)/i,/^(?:branch\b)/i,/^(?:merge\b)/i,/^(?:reset\b)/i,/^(?:checkout\b)/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:end\r?\n)/i,/^(?:[^\n]+\r?\n)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[a-zA-Z][-_\.a-zA-Z0-9]*[-_a-zA-Z0-9])/i,/^(?:$)/i],
+conditions: {"options":{"rules":[15,16],"inclusive":false},"string":{"rules":[18,19],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,20,21],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/git/styles.js":
+/*!************************************!*\
+  !*** ./src/diagrams/git/styles.js ***!
+  \************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles() {
+  return "\n  .commit-id,\n  .commit-msg,\n  .branch-label {\n    fill: lightgrey;\n    color: lightgrey;\n    font-family: 'trebuchet ms', verdana, arial;\n    font-family: var(--mermaid-font-family);\n  }\n";
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/info/infoDb.js":
+/*!*************************************!*\
+  !*** ./src/diagrams/info/infoDb.js ***!
+  \*************************************/
+/*! exports provided: setMessage, getMessage, setInfo, getInfo, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setMessage", function() { return setMessage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMessage", function() { return getMessage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setInfo", function() { return setInfo; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getInfo", function() { return getInfo; });
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/**
+ * Created by knut on 15-01-14.
+ */
+
+var message = '';
+var info = false;
+var setMessage = function setMessage(txt) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Setting message to: ' + txt);
+  message = txt;
+};
+var getMessage = function getMessage() {
+  return message;
+};
+var setInfo = function setInfo(inf) {
+  info = inf;
+};
+var getInfo = function getInfo() {
+  return info;
+}; // export const parseError = (err, hash) => {
+//   global.mermaidAPI.parseError(err, hash)
+// }
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setMessage: setMessage,
+  getMessage: getMessage,
+  setInfo: setInfo,
+  getInfo: getInfo // parseError
+
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/info/infoRenderer.js":
+/*!*******************************************!*\
+  !*** ./src/diagrams/info/infoRenderer.js ***!
+  \*******************************************/
+/*! exports provided: setConf, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _infoDb__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./infoDb */ "./src/diagrams/info/infoDb.js");
+/* harmony import */ var _parser_info__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./parser/info */ "./src/diagrams/info/parser/info.jison");
+/* harmony import */ var _parser_info__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_parser_info__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/**
+ * Created by knut on 14-12-11.
+ */
+
+
+
+
+var conf = {};
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+  keys.forEach(function (key) {
+    conf[key] = cnf[key];
+  });
+};
+/**
+ * Draws a an info picture in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+
+var draw = function draw(txt, id, ver) {
+  try {
+    var parser = _parser_info__WEBPACK_IMPORTED_MODULE_2___default.a.parser;
+    parser.yy = _infoDb__WEBPACK_IMPORTED_MODULE_1__["default"];
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Renering info diagram\n' + txt); // Parse the graph definition
+
+    parser.parse(txt);
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Parsed info diagram'); // Fetch the default direction, use TD if none was found
+
+    var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + id);
+    var g = svg.append('g');
+    g.append('text') // text label for the x axis
+    .attr('x', 100).attr('y', 40).attr('class', 'version').attr('font-size', '32px').style('text-anchor', 'middle').text('v ' + ver);
+    svg.attr('height', 100);
+    svg.attr('width', 400); // svg.attr('viewBox', '0 0 300 150');
+  } catch (e) {
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error('Error while rendering info diagram');
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error(e.message);
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/info/parser/info.jison":
+/*!*********************************************!*\
+  !*** ./src/diagrams/info/parser/info.jison ***!
+  \*********************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[6,9,10];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"info":4,"document":5,"EOF":6,"line":7,"statement":8,"NL":9,"showInfo":10,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},
+productions_: [0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1:
+ return yy; 
+break;
+case 4:
+ 
+break;
+case 6:
+ yy.setInfo(true);  
+break;
+}
+},
+table: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},o($V0,[2,3]),o($V0,[2,4]),o($V0,[2,5]),o($V0,[2,6])],
+defaultActions: {4:[2,1]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+	// Pre-lexer code can go here
+
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:return 4    ;
+break;
+case 1:return 9      ;
+break;
+case 2:return 'space';
+break;
+case 3:return 10;
+break;
+case 4:return 6     ;
+break;
+case 5:return 'TXT' ;
+break;
+}
+},
+rules: [/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],
+conditions: {"INITIAL":{"rules":[0,1,2,3,4,5],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/info/styles.js":
+/*!*************************************!*\
+  !*** ./src/diagrams/info/styles.js ***!
+  \*************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles() {
+  return "";
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/pie/parser/pie.jison":
+/*!*******************************************!*\
+  !*** ./src/diagrams/pie/parser/pie.jison ***!
+  \*******************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,4],$V1=[1,5],$V2=[1,6],$V3=[1,7],$V4=[1,9],$V5=[1,10,12,19,20,21,22],$V6=[1,6,10,12,19,20,21,22],$V7=[19,20,21],$V8=[1,22],$V9=[6,19,20,21,22];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"eol":4,"directive":5,"PIE":6,"document":7,"line":8,"statement":9,"txt":10,"value":11,"title":12,"title_value":13,"openDirective":14,"typeDirective":15,"closeDirective":16,":":17,"argDirective":18,"NEWLINE":19,";":20,"EOF":21,"open_directive":22,"type_directive":23,"arg_directive":24,"close_directive":25,"$accept":0,"$end":1},
+terminals_: {2:"error",6:"PIE",10:"txt",11:"value",12:"title",13:"title_value",17:":",19:"NEWLINE",20:";",21:"EOF",22:"open_directive",23:"type_directive",24:"arg_directive",25:"close_directive"},
+productions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[9,0],[9,2],[9,2],[9,1],[5,3],[5,5],[4,1],[4,1],[4,1],[14,1],[15,1],[18,1],[16,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 6:
+ this.$ = $$[$0-1] 
+break;
+case 8:
+ yy.addSection($$[$0-1],yy.cleanupValue($$[$0])); 
+break;
+case 9:
+ this.$=$$[$0].trim();yy.setTitle(this.$); 
+break;
+case 16:
+ yy.parseDirective('%%{', 'open_directive'); 
+break;
+case 17:
+ yy.parseDirective($$[$0], 'type_directive'); 
+break;
+case 18:
+ $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); 
+break;
+case 19:
+ yy.parseDirective('}%%', 'close_directive', 'pie'); 
+break;
+}
+},
+table: [{3:1,4:2,5:3,6:$V0,14:8,19:$V1,20:$V2,21:$V3,22:$V4},{1:[3]},{3:10,4:2,5:3,6:$V0,14:8,19:$V1,20:$V2,21:$V3,22:$V4},{3:11,4:2,5:3,6:$V0,14:8,19:$V1,20:$V2,21:$V3,22:$V4},o($V5,[2,4],{7:12}),o($V6,[2,13]),o($V6,[2,14]),o($V6,[2,15]),{15:13,23:[1,14]},{23:[2,16]},{1:[2,1]},{1:[2,2]},o($V7,[2,7],{14:8,8:15,9:16,5:19,1:[2,3],10:[1,17],12:[1,18],22:$V4}),{16:20,17:[1,21],25:$V8},o([17,25],[2,17]),o($V5,[2,5]),{4:23,19:$V1,20:$V2,21:$V3},{11:[1,24]},{13:[1,25]},o($V7,[2,10]),o($V9,[2,11]),{18:26,24:[1,27]},o($V9,[2,19]),o($V5,[2,6]),o($V7,[2,8]),o($V7,[2,9]),{16:28,25:$V8},{25:[2,18]},o($V9,[2,12])],
+defaultActions: {9:[2,16],10:[2,1],11:[2,2],27:[2,18]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0: this.begin('open_directive'); return 22; 
+break;
+case 1: this.begin('type_directive'); return 23; 
+break;
+case 2: this.popState(); this.begin('arg_directive'); return 17; 
+break;
+case 3: this.popState(); this.popState(); return 25; 
+break;
+case 4:return 24;
+break;
+case 5:/* skip comments */
+break;
+case 6:/* skip comments */{ console.log('Crap after close'); }
+break;
+case 7:return 19;
+break;
+case 8:/* do nothing */
+break;
+case 9:/* ignore */
+break;
+case 10: this.begin("title");return 12; 
+break;
+case 11: this.popState(); return "title_value"; 
+break;
+case 12: this.begin("string"); 
+break;
+case 13: this.popState(); 
+break;
+case 14: return "txt"; 
+break;
+case 15:return 6;
+break;
+case 16:return "value";
+break;
+case 17:return 21;
+break;
+}
+},
+rules: [/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[\s]+)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:pie\b)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i],
+conditions: {"close_directive":{"rules":[],"inclusive":false},"arg_directive":{"rules":[3,4],"inclusive":false},"type_directive":{"rules":[2,3],"inclusive":false},"open_directive":{"rules":[1],"inclusive":false},"title":{"rules":[11],"inclusive":false},"string":{"rules":[13,14],"inclusive":false},"INITIAL":{"rules":[0,5,6,7,8,9,10,12,15,16,17],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/pie/pieDb.js":
+/*!***********************************!*\
+  !*** ./src/diagrams/pie/pieDb.js ***!
+  \***********************************/
+/*! exports provided: parseDirective, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseDirective", function() { return parseDirective; });
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/**
+ *
+ */
+
+
+
+var sections = {};
+var title = '';
+var parseDirective = function parseDirective(statement, context, type) {
+  _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].parseDirective(this, statement, context, type);
+};
+
+var addSection = function addSection(id, value) {
+  if (typeof sections[id] === 'undefined') {
+    sections[id] = value;
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].debug('Added new section :', id);
+  }
+};
+
+var getSections = function getSections() {
+  return sections;
+};
+
+var setTitle = function setTitle(txt) {
+  title = txt;
+};
+
+var getTitle = function getTitle() {
+  return title;
+};
+
+var cleanupValue = function cleanupValue(value) {
+  if (value.substring(0, 1) === ':') {
+    value = value.substring(1).trim();
+    return Number(value.trim());
+  } else {
+    return Number(value.trim());
+  }
+};
+
+var clear = function clear() {
+  sections = {};
+  title = '';
+}; // export const parseError = (err, hash) => {
+//   global.mermaidAPI.parseError(err, hash)
+// }
+
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  parseDirective: parseDirective,
+  getConfig: function getConfig() {
+    return _config__WEBPACK_IMPORTED_MODULE_2__["getConfig"]().pie;
+  },
+  addSection: addSection,
+  getSections: getSections,
+  cleanupValue: cleanupValue,
+  clear: clear,
+  setTitle: setTitle,
+  getTitle: getTitle // parseError
+
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/pie/pieRenderer.js":
+/*!*****************************************!*\
+  !*** ./src/diagrams/pie/pieRenderer.js ***!
+  \*****************************************/
+/*! exports provided: setConf, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _pieDb__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pieDb */ "./src/diagrams/pie/pieDb.js");
+/* harmony import */ var _parser_pie__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./parser/pie */ "./src/diagrams/pie/parser/pie.jison");
+/* harmony import */ var _parser_pie__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_parser_pie__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/**
+ * Created by AshishJ on 11-09-2019.
+ */
+
+
+
+
+var conf = {};
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+  keys.forEach(function (key) {
+    conf[key] = cnf[key];
+  });
+};
+/**
+ * Draws a Pie Chart with the data given in text.
+ * @param text
+ * @param id
+ */
+
+var w;
+var draw = function draw(txt, id) {
+  try {
+    var parser = _parser_pie__WEBPACK_IMPORTED_MODULE_2___default.a.parser;
+    parser.yy = _pieDb__WEBPACK_IMPORTED_MODULE_1__["default"];
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Rendering info diagram\n' + txt); // Parse the Pie Chart definition
+
+    parser.yy.clear();
+    parser.parse(txt);
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Parsed info diagram');
+    var elem = document.getElementById(id);
+    w = elem.parentElement.offsetWidth;
+
+    if (typeof w === 'undefined') {
+      w = 1200;
+    }
+
+    if (typeof conf.useWidth !== 'undefined') {
+      w = conf.useWidth;
+    }
+
+    var h = 450;
+    elem.setAttribute('height', '100%'); // Set viewBox
+
+    elem.setAttribute('viewBox', '0 0 ' + w + ' ' + h); // Fetch the default direction, use TD if none was found
+
+    var width = w; // 450
+
+    var height = 450;
+    var margin = 40;
+    var legendRectSize = 18;
+    var legendSpacing = 4;
+    var radius = Math.min(width, height) / 2 - margin;
+    var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + id).append('svg').attr('width', width).attr('height', height).append('g').attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');
+    var data = _pieDb__WEBPACK_IMPORTED_MODULE_1__["default"].getSections();
+    var sum = 0;
+    Object.keys(data).forEach(function (key) {
+      sum += data[key];
+    });
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].info(data); // set the color scale
+
+    var color = Object(d3__WEBPACK_IMPORTED_MODULE_0__["scaleOrdinal"])().domain(data).range(d3__WEBPACK_IMPORTED_MODULE_0__["schemeSet2"]); // Compute the position of each group on the pie:
+
+    var pie = Object(d3__WEBPACK_IMPORTED_MODULE_0__["pie"])().value(function (d) {
+      return d.value;
+    });
+    var dataReady = pie(Object(d3__WEBPACK_IMPORTED_MODULE_0__["entries"])(data)); // shape helper to build arcs:
+
+    var arcGenerator = Object(d3__WEBPACK_IMPORTED_MODULE_0__["arc"])().innerRadius(0).outerRadius(radius); // Build the pie chart: Basically, each part of the pie is a path that we build using the arc function.
+
+    svg.selectAll('mySlices').data(dataReady).enter().append('path').attr('d', arcGenerator).attr('fill', function (d) {
+      return color(d.data.key);
+    }).attr('stroke', 'black').style('stroke-width', '2px').style('opacity', 0.7); // Now add the Percentage. Use the centroid method to get the best coordinates
+
+    svg.selectAll('mySlices').data(dataReady).enter().append('text').text(function (d) {
+      return (d.data.value / sum * 100).toFixed(0) + '%';
+    }).attr('transform', function (d) {
+      return 'translate(' + arcGenerator.centroid(d) + ')';
+    }).style('text-anchor', 'middle').attr('class', 'slice').style('font-size', 17);
+    svg.append('text').text(parser.yy.getTitle()).attr('x', 0).attr('y', -(h - 50) / 2).attr('class', 'pieTitleText'); //Add the slegend/annotations for each section
+
+    var legend = svg.selectAll('.legend').data(color.domain()).enter().append('g').attr('class', 'legend').attr('transform', function (d, i) {
+      var height = legendRectSize + legendSpacing;
+      var offset = height * color.domain().length / 2;
+      var horz = 12 * legendRectSize;
+      var vert = i * height - offset;
+      return 'translate(' + horz + ',' + vert + ')';
+    });
+    legend.append('rect').attr('width', legendRectSize).attr('height', legendRectSize).style('fill', color).style('stroke', color);
+    legend.append('text').attr('x', legendRectSize + legendSpacing).attr('y', legendRectSize - legendSpacing).text(function (d) {
+      return d;
+    });
+  } catch (e) {
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error('Error while rendering info diagram');
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error(e);
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/pie/styles.js":
+/*!************************************!*\
+  !*** ./src/diagrams/pie/styles.js ***!
+  \************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles(options) {
+  return ".pieTitleText {\n    text-anchor: middle;\n    font-size: 25px;\n    fill: ".concat(options.taskTextDarkColor, ";\n    font-family: ").concat(options.fontFamily, ";\n  }\n  .slice {\n    font-family: ").concat(options.fontFamily, ";\n    fill: ").concat(options.textColor, ";\n    // fill: white;\n  }\n  .legend text {\n    fill: ").concat(options.taskTextDarkColor, ";\n    font-family: ").concat(options.fontFamily, ";\n    font-size: 17px;\n  }\n");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/sequence/parser/sequenceDiagram.jison":
+/*!************************************************************!*\
+  !*** ./src/diagrams/sequence/parser/sequenceDiagram.jison ***!
+  \************************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,5],$V3=[1,7],$V4=[2,5],$V5=[1,15],$V6=[1,17],$V7=[1,18],$V8=[1,20],$V9=[1,21],$Va=[1,22],$Vb=[1,24],$Vc=[1,25],$Vd=[1,26],$Ve=[1,27],$Vf=[1,28],$Vg=[1,29],$Vh=[1,32],$Vi=[1,33],$Vj=[1,36],$Vk=[1,4,5,16,21,22,23,25,27,28,29,30,31,33,35,36,37,48,56],$Vl=[1,44],$Vm=[4,5,16,21,22,23,25,27,28,29,30,31,33,37,48,56],$Vn=[4,5,16,21,22,23,25,27,28,29,30,31,33,36,37,48,56],$Vo=[4,5,16,21,22,23,25,27,28,29,30,31,33,35,37,48,56],$Vp=[46,47,48],$Vq=[1,4,5,7,16,21,22,23,25,27,28,29,30,31,33,35,36,37,48,56];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"SPACE":4,"NEWLINE":5,"directive":6,"SD":7,"document":8,"line":9,"statement":10,"openDirective":11,"typeDirective":12,"closeDirective":13,":":14,"argDirective":15,"participant":16,"actor":17,"AS":18,"restOfLine":19,"signal":20,"autonumber":21,"activate":22,"deactivate":23,"note_statement":24,"title":25,"text2":26,"loop":27,"end":28,"rect":29,"opt":30,"alt":31,"else_sections":32,"par":33,"par_sections":34,"and":35,"else":36,"note":37,"placement":38,"over":39,"actor_pair":40,"spaceList":41,",":42,"left_of":43,"right_of":44,"signaltype":45,"+":46,"-":47,"ACTOR":48,"SOLID_OPEN_ARROW":49,"DOTTED_OPEN_ARROW":50,"SOLID_ARROW":51,"DOTTED_ARROW":52,"SOLID_CROSS":53,"DOTTED_CROSS":54,"TXT":55,"open_directive":56,"type_directive":57,"arg_directive":58,"close_directive":59,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"SPACE",5:"NEWLINE",7:"SD",14:":",16:"participant",18:"AS",19:"restOfLine",21:"autonumber",22:"activate",23:"deactivate",25:"title",27:"loop",28:"end",29:"rect",30:"opt",31:"alt",33:"par",35:"and",36:"else",37:"note",39:"over",42:",",43:"left_of",44:"right_of",46:"+",47:"-",48:"ACTOR",49:"SOLID_OPEN_ARROW",50:"DOTTED_OPEN_ARROW",51:"SOLID_ARROW",52:"DOTTED_ARROW",53:"SOLID_CROSS",54:"DOTTED_CROSS",55:"TXT",56:"open_directive",57:"type_directive",58:"arg_directive",59:"close_directive"},
+productions_: [0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[6,4],[6,6],[10,5],[10,3],[10,2],[10,1],[10,3],[10,3],[10,2],[10,3],[10,4],[10,4],[10,4],[10,4],[10,4],[10,1],[34,1],[34,4],[32,1],[32,4],[24,4],[24,4],[41,2],[41,1],[40,3],[40,1],[38,1],[38,1],[20,5],[20,5],[20,4],[17,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[26,1],[11,1],[12,1],[15,1],[13,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 4:
+ yy.apply($$[$0]);return $$[$0]; 
+break;
+case 5:
+ this.$ = [] 
+break;
+case 6:
+$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
+break;
+case 7: case 8:
+ this.$ = $$[$0] 
+break;
+case 9:
+ this.$=[]; 
+break;
+case 12:
+$$[$0-3].description=yy.parseMessage($$[$0-1]); this.$=$$[$0-3];
+break;
+case 13:
+this.$=$$[$0-1];
+break;
+case 15:
+yy.enableSequenceNumbers()
+break;
+case 16:
+this.$={type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]};
+break;
+case 17:
+this.$={type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-1]};
+break;
+case 19:
+this.$=[{type:'setTitle', text:$$[$0-1]}]
+break;
+case 20:
+
+		$$[$0-1].unshift({type: 'loopStart', loopText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.LOOP_START});
+		$$[$0-1].push({type: 'loopEnd', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_END});
+		this.$=$$[$0-1];
+break;
+case 21:
+
+		$$[$0-1].unshift({type: 'rectStart', color:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.RECT_START });
+		$$[$0-1].push({type: 'rectEnd', color:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.RECT_END });
+		this.$=$$[$0-1];
+break;
+case 22:
+
+		$$[$0-1].unshift({type: 'optStart', optText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.OPT_START});
+		$$[$0-1].push({type: 'optEnd', optText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.OPT_END});
+		this.$=$$[$0-1];
+break;
+case 23:
+
+		// Alt start
+		$$[$0-1].unshift({type: 'altStart', altText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.ALT_START});
+		// Content in alt is already in $$[$0-1]
+		// End
+		$$[$0-1].push({type: 'altEnd', signalType: yy.LINETYPE.ALT_END});
+		this.$=$$[$0-1];
+break;
+case 24:
+
+		// Parallel start
+		$$[$0-1].unshift({type: 'parStart', parText:yy.parseMessage($$[$0-2]), signalType: yy.LINETYPE.PAR_START});
+		// Content in par is already in $$[$0-1]
+		// End
+		$$[$0-1].push({type: 'parEnd', signalType: yy.LINETYPE.PAR_END});
+		this.$=$$[$0-1];
+break;
+case 27:
+ this.$ = $$[$0-3].concat([{type: 'and', parText:yy.parseMessage($$[$0-1]), signalType: yy.LINETYPE.PAR_AND}, $$[$0]]); 
+break;
+case 29:
+ this.$ = $$[$0-3].concat([{type: 'else', altText:yy.parseMessage($$[$0-1]), signalType: yy.LINETYPE.ALT_ELSE}, $$[$0]]); 
+break;
+case 30:
+
+		this.$ = [$$[$0-1], {type:'addNote', placement:$$[$0-2], actor:$$[$0-1].actor, text:$$[$0]}];
+break;
+case 31:
+
+		// Coerce actor_pair into a [to, from, ...] array
+		$$[$0-2] = [].concat($$[$0-1], $$[$0-1]).slice(0, 2);
+		$$[$0-2][0] = $$[$0-2][0].actor;
+		$$[$0-2][1] = $$[$0-2][1].actor;
+		this.$ = [$$[$0-1], {type:'addNote', placement:yy.PLACEMENT.OVER, actor:$$[$0-2].slice(0, 2), text:$$[$0]}];
+break;
+case 34:
+ this.$ = [$$[$0-2], $$[$0]]; 
+break;
+case 35:
+ this.$ = $$[$0]; 
+break;
+case 36:
+ this.$ = yy.PLACEMENT.LEFTOF; 
+break;
+case 37:
+ this.$ = yy.PLACEMENT.RIGHTOF; 
+break;
+case 38:
+ this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},
+	              {type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]}
+	             ]
+break;
+case 39:
+ this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},
+	             {type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-4]}
+	             ]
+break;
+case 40:
+ this.$ = [$$[$0-3],$$[$0-1],{type: 'addMessage', from:$$[$0-3].actor, to:$$[$0-1].actor, signalType:$$[$0-2], msg:$$[$0]}]
+break;
+case 41:
+this.$={type: 'addActor', actor:$$[$0]}
+break;
+case 42:
+ this.$ = yy.LINETYPE.SOLID_OPEN; 
+break;
+case 43:
+ this.$ = yy.LINETYPE.DOTTED_OPEN; 
+break;
+case 44:
+ this.$ = yy.LINETYPE.SOLID; 
+break;
+case 45:
+ this.$ = yy.LINETYPE.DOTTED; 
+break;
+case 46:
+ this.$ = yy.LINETYPE.SOLID_CROSS; 
+break;
+case 47:
+ this.$ = yy.LINETYPE.DOTTED_CROSS; 
+break;
+case 48:
+this.$ = yy.parseMessage($$[$0].trim().substring(1)) 
+break;
+case 49:
+ yy.parseDirective('%%{', 'open_directive'); 
+break;
+case 50:
+ yy.parseDirective($$[$0], 'type_directive'); 
+break;
+case 51:
+ $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); 
+break;
+case 52:
+ yy.parseDirective('}%%', 'close_directive', 'sequence'); 
+break;
+}
+},
+table: [{3:1,4:$V0,5:$V1,6:4,7:$V2,11:6,56:$V3},{1:[3]},{3:8,4:$V0,5:$V1,6:4,7:$V2,11:6,56:$V3},{3:9,4:$V0,5:$V1,6:4,7:$V2,11:6,56:$V3},{3:10,4:$V0,5:$V1,6:4,7:$V2,11:6,56:$V3},o([1,4,5,16,21,22,23,25,27,29,30,31,33,37,48,56],$V4,{8:11}),{12:12,57:[1,13]},{57:[2,49]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,56:$V3},{13:34,14:[1,35],59:$Vj},o([14,59],[2,50]),o($Vk,[2,6]),{6:30,10:37,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,56:$V3},o($Vk,[2,8]),o($Vk,[2,9]),{17:38,48:$Vi},{5:[1,39]},o($Vk,[2,15]),{17:40,48:$Vi},{17:41,48:$Vi},{5:[1,42]},{26:43,55:$Vl},{19:[1,45]},{19:[1,46]},{19:[1,47]},{19:[1,48]},{19:[1,49]},o($Vk,[2,25]),{45:50,49:[1,51],50:[1,52],51:[1,53],52:[1,54],53:[1,55],54:[1,56]},{38:57,39:[1,58],43:[1,59],44:[1,60]},o([5,18,42,49,50,51,52,53,54,55],[2,41]),{5:[1,61]},{15:62,58:[1,63]},{5:[2,52]},o($Vk,[2,7]),{5:[1,65],18:[1,64]},o($Vk,[2,14]),{5:[1,66]},{5:[1,67]},o($Vk,[2,18]),{5:[1,68]},{5:[2,48]},o($Vm,$V4,{8:69}),o($Vm,$V4,{8:70}),o($Vm,$V4,{8:71}),o($Vn,$V4,{32:72,8:73}),o($Vo,$V4,{34:74,8:75}),{17:78,46:[1,76],47:[1,77],48:$Vi},o($Vp,[2,42]),o($Vp,[2,43]),o($Vp,[2,44]),o($Vp,[2,45]),o($Vp,[2,46]),o($Vp,[2,47]),{17:79,48:$Vi},{17:81,40:80,48:$Vi},{48:[2,36]},{48:[2,37]},o($Vq,[2,10]),{13:82,59:$Vj},{59:[2,51]},{19:[1,83]},o($Vk,[2,13]),o($Vk,[2,16]),o($Vk,[2,17]),o($Vk,[2,19]),{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[1,84],29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,56:$V3},{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[1,85],29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,56:$V3},{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[1,86],29:$Vd,30:$Ve,31:$Vf,33:$Vg,37:$Vh,48:$Vi,56:$V3},{28:[1,87]},{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[2,28],29:$Vd,30:$Ve,31:$Vf,33:$Vg,36:[1,88],37:$Vh,48:$Vi,56:$V3},{28:[1,89]},{4:$V5,5:$V6,6:30,9:14,10:16,11:6,16:$V7,17:31,20:19,21:$V8,22:$V9,23:$Va,24:23,25:$Vb,27:$Vc,28:[2,26],29:$Vd,30:$Ve,31:$Vf,33:$Vg,35:[1,90],37:$Vh,48:$Vi,56:$V3},{17:91,48:$Vi},{17:92,48:$Vi},{26:93,55:$Vl},{26:94,55:$Vl},{26:95,55:$Vl},{42:[1,96],55:[2,35]},{5:[1,97]},{5:[1,98]},o($Vk,[2,20]),o($Vk,[2,21]),o($Vk,[2,22]),o($Vk,[2,23]),{19:[1,99]},o($Vk,[2,24]),{19:[1,100]},{26:101,55:$Vl},{26:102,55:$Vl},{5:[2,40]},{5:[2,30]},{5:[2,31]},{17:103,48:$Vi},o($Vq,[2,11]),o($Vk,[2,12]),o($Vn,$V4,{8:73,32:104}),o($Vo,$V4,{8:75,34:105}),{5:[2,38]},{5:[2,39]},{55:[2,34]},{28:[2,29]},{28:[2,27]}],
+defaultActions: {7:[2,49],8:[2,1],9:[2,2],10:[2,3],36:[2,52],44:[2,48],59:[2,36],60:[2,37],63:[2,51],93:[2,40],94:[2,30],95:[2,31],101:[2,38],102:[2,39],103:[2,34],104:[2,29],105:[2,27]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0: this.begin('open_directive'); return 56; 
+break;
+case 1: this.begin('type_directive'); return 57; 
+break;
+case 2: this.popState(); this.begin('arg_directive'); return 14; 
+break;
+case 3: this.popState(); this.popState(); return 59; 
+break;
+case 4:return 58;
+break;
+case 5:return 5;
+break;
+case 6:/* skip all whitespace */
+break;
+case 7:/* skip same-line whitespace */
+break;
+case 8:/* skip comments */
+break;
+case 9:/* skip comments */
+break;
+case 10:/* skip comments */
+break;
+case 11: this.begin('ID'); return 16; 
+break;
+case 12: yy_.yytext = yy_.yytext.trim(); this.begin('ALIAS'); return 48; 
+break;
+case 13: this.popState(); this.popState(); this.begin('LINE'); return 18; 
+break;
+case 14: this.popState(); this.popState(); return 5; 
+break;
+case 15: this.begin('LINE'); return 27; 
+break;
+case 16: this.begin('LINE'); return 29; 
+break;
+case 17: this.begin('LINE'); return 30; 
+break;
+case 18: this.begin('LINE'); return 31; 
+break;
+case 19: this.begin('LINE'); return 36; 
+break;
+case 20: this.begin('LINE'); return 33; 
+break;
+case 21: this.begin('LINE'); return 35; 
+break;
+case 22: this.popState(); return 19; 
+break;
+case 23:return 28;
+break;
+case 24:return 43;
+break;
+case 25:return 44;
+break;
+case 26:return 39;
+break;
+case 27:return 37;
+break;
+case 28: this.begin('ID'); return 22; 
+break;
+case 29: this.begin('ID'); return 23; 
+break;
+case 30:return 25;
+break;
+case 31:return 7;
+break;
+case 32:return 21;
+break;
+case 33:return 42;
+break;
+case 34:return 5;
+break;
+case 35: yy_.yytext = yy_.yytext.trim(); return 48; 
+break;
+case 36:return 51;
+break;
+case 37:return 52;
+break;
+case 38:return 49;
+break;
+case 39:return 50;
+break;
+case 40:return 53;
+break;
+case 41:return 54;
+break;
+case 42:return 55;
+break;
+case 43:return 46;
+break;
+case 44:return 47;
+break;
+case 45:return 5;
+break;
+case 46:return 'INVALID';
+break;
+}
+},
+rules: [/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:participant\b)/i,/^(?:[^\->:\n,;]+?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\b)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+((?!(-x|--x))[\-]*[^\+\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],
+conditions: {"open_directive":{"rules":[1,8],"inclusive":false},"type_directive":{"rules":[2,3,8],"inclusive":false},"arg_directive":{"rules":[3,4,8],"inclusive":false},"ID":{"rules":[7,8,12],"inclusive":false},"ALIAS":{"rules":[7,8,13,14],"inclusive":false},"LINE":{"rules":[7,8,22],"inclusive":false},"INITIAL":{"rules":[0,5,6,8,9,10,11,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/sequence/sequenceDb.js":
+/*!*********************************************!*\
+  !*** ./src/diagrams/sequence/sequenceDb.js ***!
+  \*********************************************/
+/*! exports provided: parseDirective, addActor, addMessage, addSignal, getMessages, getActors, getActor, getActorKeys, getTitle, getTitleWrapped, enableSequenceNumbers, showSequenceNumbers, setWrap, autoWrap, clear, parseMessage, LINETYPE, ARROWTYPE, PLACEMENT, addNote, setTitle, apply, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseDirective", function() { return parseDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addActor", function() { return addActor; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addMessage", function() { return addMessage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSignal", function() { return addSignal; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMessages", function() { return getMessages; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActors", function() { return getActors; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActor", function() { return getActor; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActorKeys", function() { return getActorKeys; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTitle", function() { return getTitle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTitleWrapped", function() { return getTitleWrapped; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enableSequenceNumbers", function() { return enableSequenceNumbers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "showSequenceNumbers", function() { return showSequenceNumbers; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setWrap", function() { return setWrap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "autoWrap", function() { return autoWrap; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseMessage", function() { return parseMessage; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LINETYPE", function() { return LINETYPE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ARROWTYPE", function() { return ARROWTYPE; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "PLACEMENT", function() { return PLACEMENT; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addNote", function() { return addNote; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTitle", function() { return setTitle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "apply", function() { return apply; });
+/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+
+
+
+
+var prevActor = undefined;
+var actors = {};
+var messages = [];
+var notes = [];
+var title = '';
+var titleWrapped = false;
+var sequenceNumbersEnabled = false;
+var wrapEnabled = false;
+var parseDirective = function parseDirective(statement, context, type) {
+  _mermaidAPI__WEBPACK_IMPORTED_MODULE_0__["default"].parseDirective(this, statement, context, type);
+};
+var addActor = function addActor(id, name, description) {
+  // Don't allow description nulling
+  var old = actors[id];
+  if (old && name === old.name && description == null) return; // Don't allow null descriptions, either
+
+  if (description == null || description.text == null) {
+    description = {
+      text: name,
+      wrap: null
+    };
+  }
+
+  actors[id] = {
+    name: name,
+    description: description.text,
+    wrap: description.wrap === undefined && autoWrap() || !!description.wrap,
+    prevActor: prevActor
+  };
+
+  if (prevActor && actors[prevActor]) {
+    actors[prevActor].nextActor = id;
+  }
+
+  prevActor = id;
+};
+
+var activationCount = function activationCount(part) {
+  var i;
+  var count = 0;
+
+  for (i = 0; i < messages.length; i++) {
+    // console.warn(i, messages[i]);
+    if (messages[i].type === LINETYPE.ACTIVE_START) {
+      if (messages[i].from.actor === part) {
+        count++;
+      }
+    }
+
+    if (messages[i].type === LINETYPE.ACTIVE_END) {
+      if (messages[i].from.actor === part) {
+        count--;
+      }
+    }
+  }
+
+  return count;
+};
+
+var addMessage = function addMessage(idFrom, idTo, message, answer) {
+  messages.push({
+    from: idFrom,
+    to: idTo,
+    message: message.text,
+    wrap: message.wrap === undefined && autoWrap() || !!message.wrap,
+    answer: answer
+  });
+};
+var addSignal = function addSignal(idFrom, idTo) {
+  var message = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
+    text: undefined,
+    wrap: undefined
+  };
+  var messageType = arguments.length > 3 ? arguments[3] : undefined;
+
+  if (messageType === LINETYPE.ACTIVE_END) {
+    var cnt = activationCount(idFrom.actor);
+
+    if (cnt < 1) {
+      // Bail out as there is an activation signal from an inactive participant
+      var error = new Error('Trying to inactivate an inactive participant (' + idFrom.actor + ')');
+      error.hash = {
+        text: '->>-',
+        token: '->>-',
+        line: '1',
+        loc: {
+          first_line: 1,
+          last_line: 1,
+          first_column: 1,
+          last_column: 1
+        },
+        expected: ["'ACTIVE_PARTICIPANT'"]
+      };
+      throw error;
+    }
+  }
+
+  messages.push({
+    from: idFrom,
+    to: idTo,
+    message: message.text,
+    wrap: message.wrap === undefined && autoWrap() || !!message.wrap,
+    type: messageType
+  });
+  return true;
+};
+var getMessages = function getMessages() {
+  return messages;
+};
+var getActors = function getActors() {
+  return actors;
+};
+var getActor = function getActor(id) {
+  return actors[id];
+};
+var getActorKeys = function getActorKeys() {
+  return Object.keys(actors);
+};
+var getTitle = function getTitle() {
+  return title;
+};
+var getTitleWrapped = function getTitleWrapped() {
+  return titleWrapped;
+};
+var enableSequenceNumbers = function enableSequenceNumbers() {
+  sequenceNumbersEnabled = true;
+};
+var showSequenceNumbers = function showSequenceNumbers() {
+  return sequenceNumbersEnabled;
+};
+var setWrap = function setWrap(wrapSetting) {
+  wrapEnabled = wrapSetting;
+};
+var autoWrap = function autoWrap() {
+  return wrapEnabled;
+};
+var clear = function clear() {
+  actors = {};
+  messages = [];
+};
+var parseMessage = function parseMessage(str) {
+  var _str = str.trim();
+
+  var message = {
+    text: _str.replace(/^[:]?(?:no)?wrap:/, '').trim(),
+    wrap: _str.match(/^[:]?(?:no)?wrap:/) === null ? _common_common__WEBPACK_IMPORTED_MODULE_2__["default"].hasBreaks(_str) || undefined : _str.match(/^[:]?wrap:/) !== null ? true : _str.match(/^[:]?nowrap:/) !== null ? false : undefined
+  };
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('parseMessage:', message);
+  return message;
+};
+var LINETYPE = {
+  SOLID: 0,
+  DOTTED: 1,
+  NOTE: 2,
+  SOLID_CROSS: 3,
+  DOTTED_CROSS: 4,
+  SOLID_OPEN: 5,
+  DOTTED_OPEN: 6,
+  LOOP_START: 10,
+  LOOP_END: 11,
+  ALT_START: 12,
+  ALT_ELSE: 13,
+  ALT_END: 14,
+  OPT_START: 15,
+  OPT_END: 16,
+  ACTIVE_START: 17,
+  ACTIVE_END: 18,
+  PAR_START: 19,
+  PAR_AND: 20,
+  PAR_END: 21,
+  RECT_START: 22,
+  RECT_END: 23
+};
+var ARROWTYPE = {
+  FILLED: 0,
+  OPEN: 1
+};
+var PLACEMENT = {
+  LEFTOF: 0,
+  RIGHTOF: 1,
+  OVER: 2
+};
+var addNote = function addNote(actor, placement, message) {
+  var note = {
+    actor: actor,
+    placement: placement,
+    message: message.text,
+    wrap: message.wrap === undefined && autoWrap() || !!message.wrap
+  }; // Coerce actor into a [to, from, ...] array
+
+  var actors = [].concat(actor, actor);
+  notes.push(note);
+  messages.push({
+    from: actors[0],
+    to: actors[1],
+    message: message.text,
+    wrap: message.wrap === undefined && autoWrap() || !!message.wrap,
+    type: LINETYPE.NOTE,
+    placement: placement
+  });
+};
+var setTitle = function setTitle(titleWrap) {
+  title = titleWrap.text;
+  titleWrapped = titleWrap.wrap === undefined && autoWrap() || !!titleWrap.wrap;
+};
+var apply = function apply(param) {
+  if (param instanceof Array) {
+    param.forEach(function (item) {
+      apply(item);
+    });
+  } else {
+    switch (param.type) {
+      case 'addActor':
+        addActor(param.actor, param.actor, param.description);
+        break;
+
+      case 'activeStart':
+        addSignal(param.actor, undefined, undefined, param.signalType);
+        break;
+
+      case 'activeEnd':
+        addSignal(param.actor, undefined, undefined, param.signalType);
+        break;
+
+      case 'addNote':
+        addNote(param.actor, param.placement, param.text);
+        break;
+
+      case 'addMessage':
+        addSignal(param.from, param.to, param.msg, param.signalType);
+        break;
+
+      case 'loopStart':
+        addSignal(undefined, undefined, param.loopText, param.signalType);
+        break;
+
+      case 'loopEnd':
+        addSignal(undefined, undefined, undefined, param.signalType);
+        break;
+
+      case 'rectStart':
+        addSignal(undefined, undefined, param.color, param.signalType);
+        break;
+
+      case 'rectEnd':
+        addSignal(undefined, undefined, undefined, param.signalType);
+        break;
+
+      case 'optStart':
+        addSignal(undefined, undefined, param.optText, param.signalType);
+        break;
+
+      case 'optEnd':
+        addSignal(undefined, undefined, undefined, param.signalType);
+        break;
+
+      case 'altStart':
+        addSignal(undefined, undefined, param.altText, param.signalType);
+        break;
+
+      case 'else':
+        addSignal(undefined, undefined, param.altText, param.signalType);
+        break;
+
+      case 'altEnd':
+        addSignal(undefined, undefined, undefined, param.signalType);
+        break;
+
+      case 'setTitle':
+        setTitle(param.text);
+        break;
+
+      case 'parStart':
+        addSignal(undefined, undefined, param.parText, param.signalType);
+        break;
+
+      case 'and':
+        addSignal(undefined, undefined, param.parText, param.signalType);
+        break;
+
+      case 'parEnd':
+        addSignal(undefined, undefined, undefined, param.signalType);
+        break;
+    }
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  addActor: addActor,
+  addMessage: addMessage,
+  addSignal: addSignal,
+  autoWrap: autoWrap,
+  setWrap: setWrap,
+  enableSequenceNumbers: enableSequenceNumbers,
+  showSequenceNumbers: showSequenceNumbers,
+  getMessages: getMessages,
+  getActors: getActors,
+  getActor: getActor,
+  getActorKeys: getActorKeys,
+  getTitle: getTitle,
+  parseDirective: parseDirective,
+  getConfig: function getConfig() {
+    return _config__WEBPACK_IMPORTED_MODULE_1__["getConfig"]().sequence;
+  },
+  getTitleWrapped: getTitleWrapped,
+  clear: clear,
+  parseMessage: parseMessage,
+  LINETYPE: LINETYPE,
+  ARROWTYPE: ARROWTYPE,
+  PLACEMENT: PLACEMENT,
+  addNote: addNote,
+  setTitle: setTitle,
+  apply: apply
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/sequence/sequenceRenderer.js":
+/*!***************************************************!*\
+  !*** ./src/diagrams/sequence/sequenceRenderer.js ***!
+  \***************************************************/
+/*! exports provided: bounds, drawActors, setConf, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounds", function() { return bounds; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawActors", function() { return drawActors; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _svgDraw__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./svgDraw */ "./src/diagrams/sequence/svgDraw.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/sequenceDiagram */ "./src/diagrams/sequence/parser/sequenceDiagram.jison");
+/* harmony import */ var _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+/* harmony import */ var _sequenceDb__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sequenceDb */ "./src/diagrams/sequence/sequenceDb.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+
+
+
+
+
+
+
+
+_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy = _sequenceDb__WEBPACK_IMPORTED_MODULE_5__["default"];
+var conf = {};
+var bounds = {
+  data: {
+    startx: undefined,
+    stopx: undefined,
+    starty: undefined,
+    stopy: undefined
+  },
+  verticalPos: 0,
+  sequenceItems: [],
+  activations: [],
+  models: {
+    getHeight: function getHeight() {
+      return Math.max.apply(null, this.actors.length === 0 ? [0] : this.actors.map(function (actor) {
+        return actor.height || 0;
+      })) + (this.loops.length === 0 ? 0 : this.loops.map(function (it) {
+        return it.height || 0;
+      }).reduce(function (acc, h) {
+        return acc + h;
+      })) + (this.messages.length === 0 ? 0 : this.messages.map(function (it) {
+        return it.height || 0;
+      }).reduce(function (acc, h) {
+        return acc + h;
+      })) + (this.notes.length === 0 ? 0 : this.notes.map(function (it) {
+        return it.height || 0;
+      }).reduce(function (acc, h) {
+        return acc + h;
+      }));
+    },
+    clear: function clear() {
+      this.actors = [];
+      this.loops = [];
+      this.messages = [];
+      this.notes = [];
+    },
+    addActor: function addActor(actorModel) {
+      this.actors.push(actorModel);
+    },
+    addLoop: function addLoop(loopModel) {
+      this.loops.push(loopModel);
+    },
+    addMessage: function addMessage(msgModel) {
+      this.messages.push(msgModel);
+    },
+    addNote: function addNote(noteModel) {
+      this.notes.push(noteModel);
+    },
+    lastActor: function lastActor() {
+      return this.actors[this.actors.length - 1];
+    },
+    lastLoop: function lastLoop() {
+      return this.loops[this.loops.length - 1];
+    },
+    lastMessage: function lastMessage() {
+      return this.messages[this.messages.length - 1];
+    },
+    lastNote: function lastNote() {
+      return this.notes[this.notes.length - 1];
+    },
+    actors: [],
+    loops: [],
+    messages: [],
+    notes: []
+  },
+  init: function init() {
+    this.sequenceItems = [];
+    this.activations = [];
+    this.models.clear();
+    this.data = {
+      startx: undefined,
+      stopx: undefined,
+      starty: undefined,
+      stopy: undefined
+    };
+    this.verticalPos = 0;
+    setConf(_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getConfig());
+  },
+  updateVal: function updateVal(obj, key, val, fun) {
+    if (typeof obj[key] === 'undefined') {
+      obj[key] = val;
+    } else {
+      obj[key] = fun(val, obj[key]);
+    }
+  },
+  updateBounds: function updateBounds(startx, starty, stopx, stopy) {
+    var _self = this;
+
+    var cnt = 0;
+
+    function updateFn(type) {
+      return function updateItemBounds(item) {
+        cnt++; // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems
+
+        var n = _self.sequenceItems.length - cnt + 1;
+
+        _self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min);
+
+        _self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max);
+
+        _self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min);
+
+        _self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max);
+
+        if (!(type === 'activation')) {
+          _self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min);
+
+          _self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max);
+
+          _self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min);
+
+          _self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max);
+        }
+      };
+    }
+
+    this.sequenceItems.forEach(updateFn());
+    this.activations.forEach(updateFn('activation'));
+  },
+  insert: function insert(startx, starty, stopx, stopy) {
+    var _startx = Math.min(startx, stopx);
+
+    var _stopx = Math.max(startx, stopx);
+
+    var _starty = Math.min(starty, stopy);
+
+    var _stopy = Math.max(starty, stopy);
+
+    this.updateVal(bounds.data, 'startx', _startx, Math.min);
+    this.updateVal(bounds.data, 'starty', _starty, Math.min);
+    this.updateVal(bounds.data, 'stopx', _stopx, Math.max);
+    this.updateVal(bounds.data, 'stopy', _stopy, Math.max);
+    this.updateBounds(_startx, _starty, _stopx, _stopy);
+  },
+  newActivation: function newActivation(message, diagram, actors) {
+    var actorRect = actors[message.from.actor];
+    var stackedSize = actorActivations(message.from.actor).length || 0;
+    var x = actorRect.x + actorRect.width / 2 + (stackedSize - 1) * conf.activationWidth / 2;
+    this.activations.push({
+      startx: x,
+      starty: this.verticalPos + 2,
+      stopx: x + conf.activationWidth,
+      stopy: undefined,
+      actor: message.from.actor,
+      anchored: _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].anchorElement(diagram)
+    });
+  },
+  endActivation: function endActivation(message) {
+    // find most recent activation for given actor
+    var lastActorActivationIdx = this.activations.map(function (activation) {
+      return activation.actor;
+    }).lastIndexOf(message.from.actor);
+    return this.activations.splice(lastActorActivationIdx, 1)[0];
+  },
+  createLoop: function createLoop() {
+    var title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
+      message: undefined,
+      wrap: false,
+      width: undefined
+    };
+    var fill = arguments.length > 1 ? arguments[1] : undefined;
+    return {
+      startx: undefined,
+      starty: this.verticalPos,
+      stopx: undefined,
+      stopy: undefined,
+      title: title.message,
+      wrap: title.wrap,
+      width: title.width,
+      height: 0,
+      fill: fill
+    };
+  },
+  newLoop: function newLoop() {
+    var title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
+      message: undefined,
+      wrap: false,
+      width: undefined
+    };
+    var fill = arguments.length > 1 ? arguments[1] : undefined;
+    this.sequenceItems.push(this.createLoop(title, fill));
+  },
+  endLoop: function endLoop() {
+    return this.sequenceItems.pop();
+  },
+  addSectionToLoop: function addSectionToLoop(message) {
+    var loop = this.sequenceItems.pop();
+    loop.sections = loop.sections || [];
+    loop.sectionTitles = loop.sectionTitles || [];
+    loop.sections.push({
+      y: bounds.getVerticalPos(),
+      height: 0
+    });
+    loop.sectionTitles.push(message);
+    this.sequenceItems.push(loop);
+  },
+  bumpVerticalPos: function bumpVerticalPos(bump) {
+    this.verticalPos = this.verticalPos + bump;
+    this.data.stopy = this.verticalPos;
+  },
+  getVerticalPos: function getVerticalPos() {
+    return this.verticalPos;
+  },
+  getBounds: function getBounds() {
+    console.log('here', this.data);
+    return {
+      bounds: this.data,
+      models: this.models
+    };
+  }
+};
+/**
+ * Draws an note in the diagram with the attached line
+ * @param elem - The diagram to draw to.
+ * @param noteModel:{x: number, y: number, message: string, width: number} - startx: x axis start position, verticalPos: y axis position, messsage: the message to be shown, width: Set this with a custom width to override the default configured width.
+ */
+
+var drawNote = function drawNote(elem, noteModel) {
+  bounds.bumpVerticalPos(conf.boxMargin);
+  noteModel.height = conf.boxMargin;
+  noteModel.starty = bounds.getVerticalPos();
+  var rect = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].getNoteRect();
+  rect.x = noteModel.startx;
+  rect.y = noteModel.starty;
+  rect.width = noteModel.width || conf.width;
+  rect.class = 'note';
+  var g = elem.append('g');
+  var rectElem = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawRect(g, rect);
+  var textObj = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].getTextObj();
+  textObj.x = noteModel.startx;
+  textObj.y = noteModel.starty;
+  textObj.width = rect.width;
+  textObj.dy = '1em';
+  textObj.text = noteModel.message;
+  textObj.class = 'noteText';
+  textObj.fontFamily = conf.noteFontFamily;
+  textObj.fontSize = conf.noteFontSize;
+  textObj.fontWeight = conf.noteFontWeight;
+  textObj.anchor = conf.noteAlign;
+  textObj.textMargin = conf.noteMargin;
+  textObj.valign = conf.noteAlign;
+  textObj.wrap = true;
+  var textElem = Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
+  var textHeight = Math.round(textElem.map(function (te) {
+    return (te._groups || te)[0][0].getBBox().height;
+  }).reduce(function (acc, curr) {
+    return acc + curr;
+  }));
+  rectElem.attr('height', textHeight + 2 * conf.noteMargin);
+  noteModel.height += textHeight + 2 * conf.noteMargin;
+  bounds.bumpVerticalPos(textHeight + 2 * conf.noteMargin);
+  noteModel.stopy = noteModel.starty + textHeight + 2 * conf.noteMargin;
+  noteModel.stopx = noteModel.startx + rect.width;
+  bounds.insert(noteModel.startx, noteModel.starty, noteModel.stopx, noteModel.stopy);
+  bounds.models.addNote(noteModel);
+};
+
+var messageFont = function messageFont(cnf) {
+  return {
+    fontFamily: cnf.messageFontFamily,
+    fontSize: cnf.messageFontSize,
+    fontWeight: cnf.messageFontWeight
+  };
+};
+
+var noteFont = function noteFont(cnf) {
+  return {
+    fontFamily: cnf.noteFontFamily,
+    fontSize: cnf.noteFontSize,
+    fontWeight: cnf.noteFontWeight
+  };
+};
+
+var actorFont = function actorFont(cnf) {
+  return {
+    fontFamily: cnf.actorFontFamily,
+    fontSize: cnf.actorFontSize,
+    fontWeight: cnf.actorFontWeight
+  };
+};
+/**
+ * Draws a message
+ * @param g - the parent of the message element
+ * @param msgModel - the model containing fields describing a message
+ */
+
+
+var drawMessage = function drawMessage(g, msgModel) {
+  bounds.bumpVerticalPos(10);
+  var startx = msgModel.startx,
+      stopx = msgModel.stopx,
+      starty = msgModel.starty,
+      message = msgModel.message,
+      type = msgModel.type,
+      sequenceIndex = msgModel.sequenceIndex,
+      wrap = msgModel.wrap;
+  var lines = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].splitBreaks(message).length;
+  var textDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(message, messageFont(conf));
+  var lineHeight = textDims.height / lines;
+  msgModel.height += lineHeight;
+  bounds.bumpVerticalPos(lineHeight);
+  var textObj = _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].getTextObj();
+  textObj.x = startx;
+  textObj.y = starty + 10;
+  textObj.width = stopx - startx;
+  textObj.class = 'messageText';
+  textObj.dy = '1em';
+  textObj.text = message;
+  textObj.fontFamily = conf.messageFontFamily;
+  textObj.fontSize = conf.messageFontSize;
+  textObj.fontWeight = conf.messageFontWeight;
+  textObj.anchor = conf.messageAlign;
+  textObj.valign = conf.messageAlign;
+  textObj.textMargin = conf.wrapPadding;
+  textObj.tspan = false;
+  textObj.wrap = wrap;
+  Object(_svgDraw__WEBPACK_IMPORTED_MODULE_1__["drawText"])(g, textObj);
+  var totalOffset = textDims.height - 10;
+  var textWidth = textDims.width;
+  var line, lineStarty;
+
+  if (startx === stopx) {
+    lineStarty = bounds.getVerticalPos() + totalOffset;
+
+    if (conf.rightAngles) {
+      line = g.append('path').attr('d', "M  ".concat(startx, ",").concat(lineStarty, " H ").concat(startx + Math.max(conf.width / 2, textWidth / 2), " V ").concat(lineStarty + 25, " H ").concat(startx));
+    } else {
+      totalOffset += conf.boxMargin;
+      lineStarty = bounds.getVerticalPos() + totalOffset;
+      line = g.append('path').attr('d', 'M ' + startx + ',' + lineStarty + ' C ' + (startx + 60) + ',' + (lineStarty - 10) + ' ' + (startx + 60) + ',' + (lineStarty + 30) + ' ' + startx + ',' + (lineStarty + 20));
+    }
+
+    totalOffset += 30;
+    var dx = Math.max(textWidth / 2, conf.width / 2);
+    bounds.insert(startx - dx, bounds.getVerticalPos() - 10 + totalOffset, stopx + dx, bounds.getVerticalPos() + 30 + totalOffset);
+  } else {
+    totalOffset += conf.boxMargin;
+    lineStarty = bounds.getVerticalPos() + totalOffset;
+    line = g.append('line');
+    line.attr('x1', startx);
+    line.attr('y1', lineStarty);
+    line.attr('x2', stopx);
+    line.attr('y2', lineStarty);
+    bounds.insert(startx, lineStarty - 10, stopx, lineStarty);
+  } // Make an SVG Container
+  // Draw the line
+
+
+  if (type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED || type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_CROSS || type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_OPEN) {
+    line.style('stroke-dasharray', '3, 3');
+    line.attr('class', 'messageLine1');
+  } else {
+    line.attr('class', 'messageLine0');
+  }
+
+  var url = '';
+
+  if (conf.arrowMarkerAbsolute) {
+    url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
+    url = url.replace(/\(/g, '\\(');
+    url = url.replace(/\)/g, '\\)');
+  }
+
+  line.attr('stroke-width', 2);
+  line.attr('stroke', 'none'); // handled by theme/css anyway
+
+  line.style('fill', 'none'); // remove any fill colour
+
+  if (type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID || type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED) {
+    line.attr('marker-end', 'url(' + url + '#arrowhead)');
+  }
+
+  if (type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID_CROSS || type === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_CROSS) {
+    line.attr('marker-end', 'url(' + url + '#crosshead)');
+  } // add node number
+
+
+  if (_sequenceDb__WEBPACK_IMPORTED_MODULE_5__["default"].showSequenceNumbers() || conf.showSequenceNumbers) {
+    line.attr('marker-start', 'url(' + url + '#sequencenumber)');
+    g.append('text').attr('x', startx).attr('y', lineStarty + 4).attr('font-family', 'sans-serif').attr('font-size', '12px').attr('text-anchor', 'middle').attr('textLength', '16px').attr('class', 'sequenceNumber').text(sequenceIndex);
+  }
+
+  bounds.bumpVerticalPos(totalOffset);
+  msgModel.height += totalOffset;
+  msgModel.stopy = msgModel.starty + msgModel.height;
+  bounds.insert(msgModel.fromBounds, msgModel.starty, msgModel.toBounds, msgModel.stopy);
+};
+
+var drawActors = function drawActors(diagram, actors, actorKeys, verticalPos) {
+  // Draw the actors
+  var prevWidth = 0;
+  var prevMargin = 0;
+
+  for (var i = 0; i < actorKeys.length; i++) {
+    var actor = actors[actorKeys[i]]; // Add some rendering data to the object
+
+    actor.width = actor.width || conf.width;
+    actor.height = Math.max(actor.height || conf.height, conf.height);
+    actor.margin = actor.margin || conf.actorMargin;
+    actor.x = prevWidth + prevMargin;
+    actor.y = verticalPos; // Draw the box with the attached line
+
+    _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawActor(diagram, actor, conf);
+    bounds.insert(actor.x, verticalPos, actor.x + actor.width, actor.height);
+    prevWidth += actor.width;
+    prevMargin += actor.margin;
+    bounds.models.addActor(actor);
+  } // Add a margin between the actor boxes and the first arrow
+
+
+  bounds.bumpVerticalPos(conf.height);
+};
+var setConf = function setConf(cnf) {
+  Object(_utils__WEBPACK_IMPORTED_MODULE_7__["assignWithDepth"])(conf, cnf);
+
+  if (cnf.fontFamily) {
+    conf.actorFontFamily = conf.noteFontFamily = conf.messageFontFamily = cnf.fontFamily;
+  }
+
+  if (cnf.fontSize) {
+    conf.actorFontSize = conf.noteFontSize = conf.messageFontSize = cnf.fontSize;
+  }
+
+  if (cnf.fontWeight) {
+    conf.actorFontWeight = conf.noteFontWeight = conf.messageFontWeight = cnf.fontWeight;
+  }
+};
+
+var actorActivations = function actorActivations(actor) {
+  return bounds.activations.filter(function (activation) {
+    return activation.actor === actor;
+  });
+};
+
+var activationBounds = function activationBounds(actor, actors) {
+  // handle multiple stacked activations for same actor
+  var actorObj = actors[actor];
+  var activations = actorActivations(actor);
+  var left = activations.reduce(function (acc, activation) {
+    return Math.min(acc, activation.startx);
+  }, actorObj.x + actorObj.width / 2);
+  var right = activations.reduce(function (acc, activation) {
+    return Math.max(acc, activation.stopx);
+  }, actorObj.x + actorObj.width / 2);
+  return [left, right];
+};
+
+function adjustLoopHeightForWrap(loopWidths, msg, preMargin, postMargin, addLoopFn) {
+  bounds.bumpVerticalPos(preMargin);
+  var heightAdjust = postMargin;
+
+  if (msg.id && msg.message && loopWidths[msg.id]) {
+    var loopWidth = loopWidths[msg.id].width;
+    var textConf = messageFont(conf);
+    msg.message = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel("[".concat(msg.message, "]"), loopWidth - 2 * conf.wrapPadding, textConf);
+    msg.width = loopWidth;
+    msg.wrap = true; // const lines = common.splitBreaks(msg.message).length;
+
+    var textDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(msg.message, textConf);
+    var totalOffset = Math.max(textDims.height, conf.labelBoxHeight);
+    heightAdjust = postMargin + totalOffset;
+    _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug("".concat(totalOffset, " - ").concat(msg.message));
+  }
+
+  addLoopFn(msg);
+  bounds.bumpVerticalPos(heightAdjust);
+}
+/**
+ * Draws a sequenceDiagram in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+
+
+var draw = function draw(text, id) {
+  conf = _config__WEBPACK_IMPORTED_MODULE_6__["getConfig"]().sequence;
+  console.log('there ', conf);
+  _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.clear();
+  _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.setWrap(conf.wrap);
+  _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].parse(text + '\n');
+  bounds.init();
+  _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug("C:".concat(JSON.stringify(conf, null, 2)));
+  var diagram = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id=\"".concat(id, "\"]")); // Fetch data from the parsing
+
+  var actors = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getActors();
+  var actorKeys = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getActorKeys();
+  var messages = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getMessages();
+  var title = _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.getTitle();
+  var maxMessageWidthPerActor = getMaxMessageWidthPerActor(actors, messages);
+  conf.height = calculateActorMargins(actors, maxMessageWidthPerActor);
+  drawActors(diagram, actors, actorKeys, 0);
+  var loopWidths = calculateLoopBounds(messages, actors, maxMessageWidthPerActor); // The arrow head definition is attached to the svg once
+
+  _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].insertArrowHead(diagram);
+  _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].insertArrowCrossHead(diagram);
+  _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].insertSequenceNumber(diagram);
+
+  function activeEnd(msg, verticalPos) {
+    var activationData = bounds.endActivation(msg);
+
+    if (activationData.starty + 18 > verticalPos) {
+      activationData.starty = verticalPos - 6;
+      verticalPos += 12;
+    }
+
+    _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawActivation(diagram, activationData, verticalPos, conf, actorActivations(msg.from.actor).length);
+    bounds.insert(activationData.startx, verticalPos - 10, activationData.stopx, verticalPos);
+  } // Draw the messages/signals
+
+
+  var sequenceIndex = 1;
+  messages.forEach(function (msg) {
+    var loopModel, noteModel, msgModel;
+
+    switch (msg.type) {
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.NOTE:
+        noteModel = msg.noteModel;
+        drawNote(diagram, noteModel);
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ACTIVE_START:
+        bounds.newActivation(msg, diagram, actors);
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ACTIVE_END:
+        activeEnd(msg, bounds.getVerticalPos());
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.LOOP_START:
+        adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin, conf.boxMargin + conf.boxTextMargin, function (message) {
+          return bounds.newLoop(message);
+        });
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.LOOP_END:
+        loopModel = bounds.endLoop();
+        _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawLoop(diagram, loopModel, 'loop', conf);
+        bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
+        bounds.models.addLoop(loopModel);
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.RECT_START:
+        adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin, conf.boxMargin, function (message) {
+          return bounds.newLoop(undefined, message.message);
+        });
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.RECT_END:
+        loopModel = bounds.endLoop();
+        _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawBackgroundRect(diagram, loopModel);
+        bounds.models.addLoop(loopModel);
+        bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.OPT_START:
+        adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin, conf.boxMargin + conf.boxTextMargin, function (message) {
+          return bounds.newLoop(message);
+        });
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.OPT_END:
+        loopModel = bounds.endLoop();
+        _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawLoop(diagram, loopModel, 'opt', conf);
+        bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
+        bounds.models.addLoop(loopModel);
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ALT_START:
+        adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin, conf.boxMargin + conf.boxTextMargin, function (message) {
+          return bounds.newLoop(message);
+        });
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ALT_ELSE:
+        adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin + conf.boxTextMargin, conf.boxMargin, function (message) {
+          return bounds.addSectionToLoop(message);
+        });
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ALT_END:
+        loopModel = bounds.endLoop();
+        _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawLoop(diagram, loopModel, 'alt', conf);
+        bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
+        bounds.models.addLoop(loopModel);
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.PAR_START:
+        adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin, conf.boxMargin + conf.boxTextMargin, function (message) {
+          return bounds.newLoop(message);
+        });
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.PAR_AND:
+        adjustLoopHeightForWrap(loopWidths, msg, conf.boxMargin + conf.boxTextMargin, conf.boxMargin, function (message) {
+          return bounds.addSectionToLoop(message);
+        });
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.PAR_END:
+        loopModel = bounds.endLoop();
+        _svgDraw__WEBPACK_IMPORTED_MODULE_1__["default"].drawLoop(diagram, loopModel, 'par', conf);
+        bounds.bumpVerticalPos(loopModel.stopy - bounds.getVerticalPos());
+        bounds.models.addLoop(loopModel);
+        break;
+
+      default:
+        try {
+          // lastMsg = msg
+          msgModel = msg.msgModel;
+          msgModel.starty = bounds.getVerticalPos();
+          msgModel.sequenceIndex = sequenceIndex;
+          drawMessage(diagram, msgModel);
+          bounds.models.addMessage(msgModel);
+        } catch (e) {
+          _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].error('error while drawing message', e);
+        }
+
+    } // Increment sequence counter if msg.type is a line (and not another event like activation or note, etc)
+
+
+    if ([_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID_OPEN, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_OPEN, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID_CROSS, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_CROSS].includes(msg.type)) {
+      sequenceIndex++;
+    }
+  });
+
+  if (conf.mirrorActors) {
+    // Draw actors below diagram
+    bounds.bumpVerticalPos(conf.boxMargin * 2);
+    drawActors(diagram, actors, actorKeys, bounds.getVerticalPos());
+  }
+
+  var _bounds$getBounds = bounds.getBounds(),
+      box = _bounds$getBounds.bounds; // Adjust line height of actor lines now that the height of the diagram is known
+
+
+  _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('For line height fix Querying: #' + id + ' .actor-line');
+  var actorLines = Object(d3__WEBPACK_IMPORTED_MODULE_0__["selectAll"])('#' + id + ' .actor-line');
+  actorLines.attr('y2', box.stopy);
+  var height = box.stopy - box.starty + 2 * conf.diagramMarginY;
+
+  if (conf.mirrorActors) {
+    height = height - conf.boxMargin + conf.bottomMarginAdj;
+  }
+
+  var width = box.stopx - box.startx + 2 * conf.diagramMarginX;
+
+  if (title) {
+    diagram.append('text').text(title).attr('x', (box.stopx - box.startx) / 2 - 2 * conf.diagramMarginX).attr('y', -25);
+  }
+
+  if (conf.useMaxWidth) {
+    diagram.attr('height', '100%');
+    diagram.attr('width', '100%');
+    diagram.attr('style', 'max-width:' + width + 'px;'); // diagram.attr('style', 'max-width:100%;');
+  } else {
+    diagram.attr('height', height);
+    diagram.attr('width', width);
+  }
+
+  var extraVertForTitle = title ? 40 : 0;
+  diagram.attr('viewBox', box.startx - conf.diagramMarginX + ' -' + (conf.diagramMarginY + extraVertForTitle) + ' ' + width + ' ' + (height + extraVertForTitle));
+  _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug("models:", bounds.models);
+};
+/**
+ * Retrieves the max message width of each actor, supports signals (messages, loops)
+ * and notes.
+ *
+ * It will enumerate each given message, and will determine its text width, in relation
+ * to the actor it originates from, and destined to.
+ *
+ * @param actors - The actors map
+ * @param messages - A list of message objects to iterate
+ */
+
+var getMaxMessageWidthPerActor = function getMaxMessageWidthPerActor(actors, messages) {
+  var maxMessageWidthPerActor = {};
+  messages.forEach(function (msg) {
+    if (actors[msg.to] && actors[msg.from]) {
+      var actor = actors[msg.to]; // If this is the first actor, and the message is left of it, no need to calculate the margin
+
+      if (msg.placement === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.LEFTOF && !actor.prevActor) {
+        return;
+      } // If this is the last actor, and the message is right of it, no need to calculate the margin
+
+
+      if (msg.placement === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.RIGHTOF && !actor.nextActor) {
+        return;
+      }
+
+      var isNote = msg.placement !== undefined;
+      var isMessage = !isNote;
+      var textFont = isNote ? noteFont(conf) : messageFont(conf);
+      var wrappedMessage = msg.wrap ? _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(msg.message, conf.width - 2 * conf.wrapPadding, textFont) : msg.message;
+      var messageDimensions = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(wrappedMessage, textFont);
+      var messageWidth = messageDimensions.width + 2 * conf.wrapPadding;
+      /*
+       * The following scenarios should be supported:
+       *
+       * - There's a message (non-note) between fromActor and toActor
+       *   - If fromActor is on the right and toActor is on the left, we should
+       *     define the toActor's margin
+       *   - If fromActor is on the left and toActor is on the right, we should
+       *     define the fromActor's margin
+       * - There's a note, in which case fromActor == toActor
+       *   - If the note is to the left of the actor, we should define the previous actor
+       *     margin
+       *   - If the note is on the actor, we should define both the previous and next actor
+       *     margins, each being the half of the note size
+       *   - If the note is on the right of the actor, we should define the current actor
+       *     margin
+       */
+
+      if (isMessage && msg.from === actor.nextActor) {
+        maxMessageWidthPerActor[msg.to] = Math.max(maxMessageWidthPerActor[msg.to] || 0, messageWidth);
+      } else if (isMessage && msg.from === actor.prevActor) {
+        maxMessageWidthPerActor[msg.from] = Math.max(maxMessageWidthPerActor[msg.from] || 0, messageWidth);
+      } else if (isMessage && msg.from === msg.to) {
+        maxMessageWidthPerActor[msg.from] = Math.max(maxMessageWidthPerActor[msg.from] || 0, messageWidth / 2);
+        maxMessageWidthPerActor[msg.to] = Math.max(maxMessageWidthPerActor[msg.to] || 0, messageWidth / 2);
+      } else if (msg.placement === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.RIGHTOF) {
+        maxMessageWidthPerActor[msg.from] = Math.max(maxMessageWidthPerActor[msg.from] || 0, messageWidth);
+      } else if (msg.placement === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.LEFTOF) {
+        maxMessageWidthPerActor[actor.prevActor] = Math.max(maxMessageWidthPerActor[actor.prevActor] || 0, messageWidth);
+      } else if (msg.placement === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.OVER) {
+        if (actor.prevActor) {
+          maxMessageWidthPerActor[actor.prevActor] = Math.max(maxMessageWidthPerActor[actor.prevActor] || 0, messageWidth / 2);
+        }
+
+        if (actor.nextActor) {
+          maxMessageWidthPerActor[msg.from] = Math.max(maxMessageWidthPerActor[msg.from] || 0, messageWidth / 2);
+        }
+      }
+    }
+  });
+  _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('maxMessageWidthPerActor:', maxMessageWidthPerActor);
+  return maxMessageWidthPerActor;
+};
+/**
+ * This will calculate the optimal margin for each given actor, for a given
+ * actor->messageWidth map.
+ *
+ * An actor's margin is determined by the width of the actor, the width of the
+ * largest message that originates from it, and the configured conf.actorMargin.
+ *
+ * @param actors - The actors map to calculate margins for
+ * @param actorToMessageWidth - A map of actor key -> max message width it holds
+ */
+
+
+var calculateActorMargins = function calculateActorMargins(actors, actorToMessageWidth) {
+  var maxHeight = 0;
+  Object.keys(actors).forEach(function (prop) {
+    var actor = actors[prop];
+
+    if (actor.wrap) {
+      actor.description = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(actor.description, conf.width - 2 * conf.wrapPadding, actorFont(conf));
+    }
+
+    var actDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(actor.description, actorFont(conf));
+    actor.width = actor.wrap ? conf.width : Math.max(conf.width, actDims.width + 2 * conf.wrapPadding);
+    actor.height = actor.wrap ? Math.max(actDims.height, conf.height) : conf.height;
+    maxHeight = Math.max(maxHeight, actor.height);
+  });
+
+  for (var actorKey in actorToMessageWidth) {
+    var actor = actors[actorKey];
+
+    if (!actor) {
+      continue;
+    }
+
+    var nextActor = actors[actor.nextActor]; // No need to space out an actor that doesn't have a next link
+
+    if (!nextActor) {
+      continue;
+    }
+
+    var messageWidth = actorToMessageWidth[actorKey];
+    var actorWidth = messageWidth + conf.actorMargin - actor.width / 2 - nextActor.width / 2;
+    actor.margin = Math.max(actorWidth, conf.actorMargin);
+  }
+
+  return Math.max(maxHeight, conf.height);
+};
+
+var buildNoteModel = function buildNoteModel(msg, actors) {
+  var startx = actors[msg.from].x;
+  var stopx = actors[msg.to].x;
+  var shouldWrap = msg.wrap && msg.message;
+  var textDimensions = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(shouldWrap ? _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(msg.message, conf.width, noteFont(conf)) : msg.message, noteFont(conf));
+  var noteModel = {
+    width: shouldWrap ? conf.width : Math.max(conf.width, textDimensions.width + 2 * conf.noteMargin),
+    height: 0,
+    startx: actors[msg.from].x,
+    stopx: 0,
+    starty: 0,
+    stopy: 0,
+    message: msg.message
+  };
+
+  if (msg.placement === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.RIGHTOF) {
+    noteModel.width = shouldWrap ? Math.max(conf.width, textDimensions.width) : Math.max(actors[msg.from].width / 2 + actors[msg.to].width / 2, textDimensions.width + 2 * conf.noteMargin);
+    noteModel.startx = startx + (actors[msg.from].width + conf.actorMargin) / 2;
+  } else if (msg.placement === _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.PLACEMENT.LEFTOF) {
+    noteModel.width = shouldWrap ? Math.max(conf.width, textDimensions.width + 2 * conf.noteMargin) : Math.max(actors[msg.from].width / 2 + actors[msg.to].width / 2, textDimensions.width + 2 * conf.noteMargin);
+    noteModel.startx = startx - noteModel.width + (actors[msg.from].width - conf.actorMargin) / 2;
+  } else if (msg.to === msg.from) {
+    textDimensions = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(shouldWrap ? _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(msg.message, Math.max(conf.width, actors[msg.from].width), noteFont(conf)) : msg.message, noteFont(conf));
+    noteModel.width = shouldWrap ? Math.max(conf.width, actors[msg.from].width) : Math.max(actors[msg.from].width, conf.width, textDimensions.width + 2 * conf.noteMargin);
+    noteModel.startx = startx + (actors[msg.from].width - noteModel.width) / 2;
+  } else {
+    noteModel.width = Math.abs(startx + actors[msg.from].width / 2 - (stopx + actors[msg.to].width / 2)) + conf.actorMargin;
+    noteModel.startx = startx < stopx ? startx + actors[msg.from].width / 2 - conf.actorMargin / 2 : stopx + actors[msg.to].width / 2 - conf.actorMargin / 2;
+  }
+
+  if (shouldWrap) {
+    noteModel.message = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(msg.message, noteModel.width - 2 * conf.wrapPadding, noteFont(conf));
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug("NM:[".concat(noteModel.startx, ",").concat(noteModel.stopx, ",").concat(noteModel.starty, ",").concat(noteModel.stopy, ":").concat(noteModel.width, ",").concat(noteModel.height, "=").concat(msg.message, "]"));
+  return noteModel;
+};
+
+var buildMessageModel = function buildMessageModel(msg, actors) {
+  var process = false;
+
+  if ([_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID_OPEN, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_OPEN, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.SOLID_CROSS, _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.DOTTED_CROSS].includes(msg.type)) {
+    process = true;
+  }
+
+  if (!process) {
+    return {};
+  }
+
+  var fromBounds = activationBounds(msg.from, actors);
+  var toBounds = activationBounds(msg.to, actors);
+  var fromIdx = fromBounds[0] <= toBounds[0] ? 1 : 0;
+  var toIdx = fromBounds[0] < toBounds[0] ? 0 : 1;
+  var allBounds = fromBounds.concat(toBounds);
+  var boundedWidth = Math.abs(toBounds[toIdx] - fromBounds[fromIdx]);
+  var msgDims = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].calculateTextDimensions(msg.message, messageFont(conf));
+
+  if (msg.wrap && msg.message) {
+    msg.message = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].wrapLabel(msg.message, Math.max(boundedWidth + 2 * conf.wrapPadding, conf.width), messageFont(conf));
+  }
+
+  return {
+    width: Math.max(msg.wrap ? 0 : msgDims.width + 2 * conf.wrapPadding, boundedWidth + 2 * conf.wrapPadding, conf.width),
+    height: 0,
+    startx: fromBounds[fromIdx],
+    stopx: toBounds[toIdx],
+    starty: 0,
+    stopy: 0,
+    message: msg.message,
+    type: msg.type,
+    wrap: msg.wrap,
+    fromBounds: Math.min.apply(null, allBounds),
+    toBounds: Math.max.apply(null, allBounds)
+  };
+};
+
+var calculateLoopBounds = function calculateLoopBounds(messages, actors) {
+  var loops = {};
+  var stack = [];
+  var current, noteModel, msgModel;
+  messages.forEach(function (msg) {
+    msg.id = _utils__WEBPACK_IMPORTED_MODULE_7__["default"].random({
+      length: 10
+    });
+
+    switch (msg.type) {
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.LOOP_START:
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ALT_START:
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.OPT_START:
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.PAR_START:
+        stack.push({
+          id: msg.id,
+          msg: msg.message,
+          from: Number.MAX_SAFE_INTEGER,
+          to: Number.MIN_SAFE_INTEGER,
+          width: 0
+        });
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ALT_ELSE:
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.PAR_AND:
+        if (msg.message) {
+          current = stack.pop();
+          loops[current.id] = current;
+          loops[msg.id] = current;
+          stack.push(current);
+        }
+
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.LOOP_END:
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ALT_END:
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.OPT_END:
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.PAR_END:
+        current = stack.pop();
+        loops[current.id] = current;
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ACTIVE_START:
+        {
+          var actorRect = actors[msg.from ? msg.from.actor : msg.to.actor];
+          var stackedSize = actorActivations(msg.from ? msg.from.actor : msg.to.actor).length;
+          var x = actorRect.x + actorRect.width / 2 + (stackedSize - 1) * conf.activationWidth / 2;
+          var toAdd = {
+            startx: x,
+            stopx: x + conf.activationWidth,
+            actor: msg.from.actor,
+            enabled: true
+          };
+          bounds.activations.push(toAdd);
+        }
+        break;
+
+      case _parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_3__["parser"].yy.LINETYPE.ACTIVE_END:
+        {
+          var lastActorActivationIdx = bounds.activations.map(function (a) {
+            return a.actor;
+          }).lastIndexOf(msg.from.actor);
+          delete bounds.activations.splice(lastActorActivationIdx, 1)[0];
+        }
+        break;
+    }
+
+    var isNote = msg.placement !== undefined;
+
+    if (isNote) {
+      noteModel = buildNoteModel(msg, actors);
+      msg.noteModel = noteModel;
+      stack.forEach(function (stk) {
+        current = stk;
+        current.from = Math.min(current.from, noteModel.startx);
+        current.to = Math.max(current.to, noteModel.startx + noteModel.width);
+        current.width = Math.max(current.width, Math.abs(current.from - current.to)) - conf.labelBoxWidth;
+      });
+    } else {
+      msgModel = buildMessageModel(msg, actors);
+      msg.msgModel = msgModel;
+
+      if (msgModel.startx && msgModel.stopx && stack.length > 0) {
+        stack.forEach(function (stk) {
+          current = stk;
+
+          if (msgModel.startx === msgModel.stopx) {
+            var from = actors[msg.from];
+            var to = actors[msg.to];
+            current.from = Math.min(from.x - msgModel.width / 2, from.x - from.width / 2, current.from);
+            current.to = Math.max(to.x + msgModel.width / 2, to.x + from.width / 2, current.to);
+            current.width = Math.max(current.width, Math.abs(current.to - current.from)) - conf.labelBoxWidth;
+          } else {
+            current.from = Math.min(msgModel.startx, current.from);
+            current.to = Math.max(msgModel.stopx, current.to);
+            current.width = Math.max(current.width, msgModel.width) - conf.labelBoxWidth;
+          }
+        });
+      }
+    }
+  });
+  bounds.activations = [];
+  _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Loop type widths:', loops);
+  return loops;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  bounds: bounds,
+  drawActors: drawActors,
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/sequence/styles.js":
+/*!*****************************************!*\
+  !*** ./src/diagrams/sequence/styles.js ***!
+  \*****************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles(options) {
+  return ".actor {\n    stroke: ".concat(options.actorBorder, ";\n    fill: ").concat(options.actorBkg, ";\n  }\n\n  text.actor > tspan {\n    fill: ").concat(options.actorTextColor, ";\n    stroke: none;\n  }\n\n  .actor-line {\n    stroke: ").concat(options.actorLineColor, ";\n  }\n\n  .messageLine0 {\n    stroke-width: 1.5;\n    stroke-dasharray: none;\n    stroke: ").concat(options.signalColor, ";\n  }\n\n  .messageLine1 {\n    stroke-width: 1.5;\n    stroke-dasharray: 2, 2;\n    stroke: ").concat(options.signalColor, ";\n  }\n\n  #arrowhead path {\n    fill: ").concat(options.signalColor, ";\n    stroke: ").concat(options.signalColor, ";\n  }\n\n  .sequenceNumber {\n    fill: ").concat(options.sequenceNumberColor, ";\n  }\n\n  #sequencenumber {\n    fill: ").concat(options.signalColor, ";\n  }\n\n  #crosshead path {\n    fill: ").concat(options.signalColor, ";\n    stroke: ").concat(options.signalColor, ";\n  }\n\n  .messageText {\n    fill: ").concat(options.signalTextColor, ";\n    stroke: ").concat(options.signalTextColor, ";\n  }\n\n  .labelBox {\n    stroke: ").concat(options.labelBoxBorderColor, ";\n    fill: ").concat(options.labelBoxBkgColor, ";\n  }\n\n  .labelText, .labelText > tspan {\n    fill: ").concat(options.labelTextColor, ";\n    stroke: none;\n  }\n\n  .loopText, .loopText > tspan {\n    fill: ").concat(options.loopTextColor, ";\n    stroke: none;\n  }\n\n  .loopLine {\n    stroke-width: 2px;\n    stroke-dasharray: 2, 2;\n    stroke: ").concat(options.labelBoxBorderColor, ";\n    fill: ").concat(options.labelBoxBorderColor, ";\n  }\n\n  .note {\n    //stroke: #decc93;\n    stroke: ").concat(options.noteBorderColor, ";\n    fill: ").concat(options.noteBkgColor, ";\n  }\n\n  .noteText, .noteText > tspan {\n    fill: ").concat(options.noteTextColor, ";\n    stroke: none;\n  }\n\n  .activation0 {\n    fill: ").concat(options.activationBkgColor, ";\n    stroke: ").concat(options.activationBorderColor, ";\n  }\n\n  .activation1 {\n    fill: ").concat(options.activationBkgColor, ";\n    stroke: ").concat(options.activationBorderColor, ";\n  }\n\n  .activation2 {\n    fill: ").concat(options.activationBkgColor, ";\n    stroke: ").concat(options.activationBorderColor, ";\n  }\n");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/sequence/svgDraw.js":
+/*!******************************************!*\
+  !*** ./src/diagrams/sequence/svgDraw.js ***!
+  \******************************************/
+/*! exports provided: drawRect, drawText, drawLabel, drawActor, anchorElement, drawActivation, drawLoop, drawBackgroundRect, insertArrowHead, insertSequenceNumber, insertArrowCrossHead, getTextObj, getNoteRect, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawRect", function() { return drawRect; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawText", function() { return drawText; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawLabel", function() { return drawLabel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawActor", function() { return drawActor; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "anchorElement", function() { return anchorElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawActivation", function() { return drawActivation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawLoop", function() { return drawLoop; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawBackgroundRect", function() { return drawBackgroundRect; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertArrowHead", function() { return insertArrowHead; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertSequenceNumber", function() { return insertSequenceNumber; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "insertArrowCrossHead", function() { return insertArrowCrossHead; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTextObj", function() { return getTextObj; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNoteRect", function() { return getNoteRect; });
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+
+var drawRect = function drawRect(elem, rectData) {
+  var rectElem = elem.append('rect');
+  rectElem.attr('x', rectData.x);
+  rectElem.attr('y', rectData.y);
+  rectElem.attr('fill', rectData.fill);
+  rectElem.attr('stroke', rectData.stroke);
+  rectElem.attr('width', rectData.width);
+  rectElem.attr('height', rectData.height);
+  rectElem.attr('rx', rectData.rx);
+  rectElem.attr('ry', rectData.ry);
+
+  if (typeof rectData.class !== 'undefined') {
+    rectElem.attr('class', rectData.class);
+  }
+
+  return rectElem;
+};
+var drawText = function drawText(elem, textData) {
+  var prevTextHeight = 0,
+      textHeight = 0;
+  var lines = textData.wrap ? textData.text.split(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex) : [textData.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex, ' ')];
+  var textElems = [];
+  var dy = 0;
+
+  var yfunc = function yfunc() {
+    return textData.y;
+  };
+
+  if (typeof textData.valign !== 'undefined' && typeof textData.textMargin !== 'undefined' && textData.textMargin > 0) {
+    switch (textData.valign) {
+      case 'top':
+      case 'start':
+        yfunc = function yfunc() {
+          return Math.round(textData.y + textData.textMargin);
+        };
+
+        break;
+
+      case 'middle':
+      case 'center':
+        yfunc = function yfunc() {
+          return Math.round(textData.y + (prevTextHeight + textHeight + textData.textMargin) / 2);
+        };
+
+        break;
+
+      case 'bottom':
+      case 'end':
+        yfunc = function yfunc() {
+          return Math.round(textData.y + (prevTextHeight + textHeight + 2 * textData.textMargin) - textData.textMargin);
+        };
+
+        break;
+    }
+  }
+
+  if (typeof textData.anchor !== 'undefined' && typeof textData.textMargin !== 'undefined' && typeof textData.width !== 'undefined') {
+    switch (textData.anchor) {
+      case 'left':
+      case 'start':
+        textData.x = Math.round(textData.x + textData.textMargin);
+        textData.anchor = 'start';
+        textData.dominantBaseline = 'text-after-edge';
+        textData.alignmentBaseline = 'middle';
+        break;
+
+      case 'middle':
+      case 'center':
+        textData.x = Math.round(textData.x + textData.width / 2);
+        textData.anchor = 'middle';
+        textData.dominantBaseline = 'middle';
+        textData.alignmentBaseline = 'middle';
+        break;
+
+      case 'right':
+      case 'end':
+        textData.x = Math.round(textData.x + textData.width - textData.textMargin);
+        textData.anchor = 'end';
+        textData.dominantBaseline = 'text-before-edge';
+        textData.alignmentBaseline = 'middle';
+        break;
+    }
+  }
+
+  for (var i = 0; i < lines.length; i++) {
+    var line = lines[i];
+
+    if (typeof textData.textMargin !== 'undefined' && textData.textMargin === 0 && typeof textData.fontSize !== 'undefined') {
+      dy = i * textData.fontSize;
+    }
+
+    var textElem = elem.append('text');
+    textElem.attr('x', textData.x);
+    textElem.attr('y', yfunc());
+
+    if (typeof textData.anchor !== 'undefined') {
+      textElem.attr('text-anchor', textData.anchor).attr('dominant-baseline', textData.dominantBaseline).attr('alignment-baseline', textData.alignmentBaseline);
+    }
+
+    if (typeof textData.fontFamily !== 'undefined') {
+      textElem.style('font-family', textData.fontFamily);
+    }
+
+    if (typeof textData.fontSize !== 'undefined') {
+      textElem.style('font-size', textData.fontSize);
+    }
+
+    if (typeof textData.fontWeight !== 'undefined') {
+      textElem.style('font-weight', textData.fontWeight);
+    }
+
+    if (typeof textData.fill !== 'undefined') {
+      textElem.attr('fill', textData.fill);
+    }
+
+    if (typeof textData.class !== 'undefined') {
+      textElem.attr('class', textData.class);
+    }
+
+    if (typeof textData.dy !== 'undefined') {
+      textElem.attr('dy', textData.dy);
+    } else if (dy !== 0) {
+      textElem.attr('dy', dy);
+    }
+
+    if (textData.tspan) {
+      var span = textElem.append('tspan');
+      span.attr('x', textData.x);
+
+      if (typeof textData.fill !== 'undefined') {
+        span.attr('fill', textData.fill);
+      }
+
+      span.text(line);
+    } else {
+      textElem.text(line);
+    }
+
+    if (typeof textData.valign !== 'undefined' && typeof textData.textMargin !== 'undefined' && textData.textMargin > 0) {
+      textHeight += (textElem._groups || textElem)[0][0].getBBox().height;
+      prevTextHeight = textHeight;
+    }
+
+    textElems.push(textElem);
+  }
+
+  return textElems;
+};
+var drawLabel = function drawLabel(elem, txtObject) {
+  function genPoints(x, y, width, height, cut) {
+    return x + ',' + y + ' ' + (x + width) + ',' + y + ' ' + (x + width) + ',' + (y + height - cut) + ' ' + (x + width - cut * 1.2) + ',' + (y + height) + ' ' + x + ',' + (y + height);
+  }
+
+  var polygon = elem.append('polygon');
+  polygon.attr('points', genPoints(txtObject.x, txtObject.y, txtObject.width, txtObject.height, 7));
+  polygon.attr('class', 'labelBox');
+  txtObject.y = txtObject.y + txtObject.height / 2;
+  drawText(elem, txtObject);
+  return polygon;
+};
+var actorCnt = -1;
+/**
+ * Draws an actor in the diagram with the attached line
+ * @param elem - The diagram we'll draw to.
+ * @param actor - The actor to draw.
+ * @param conf - drawText implementation discriminator object
+ */
+
+var drawActor = function drawActor(elem, actor, conf) {
+  var center = actor.x + actor.width / 2;
+  var g = elem.append('g');
+
+  if (actor.y === 0) {
+    actorCnt++;
+    g.append('line').attr('id', 'actor' + actorCnt).attr('x1', center).attr('y1', 5).attr('x2', center).attr('y2', 2000).attr('class', 'actor-line').attr('stroke-width', '0.5px').attr('stroke', '#999');
+  }
+
+  var rect = getNoteRect();
+  rect.x = actor.x;
+  rect.y = actor.y;
+  rect.fill = '#eaeaea';
+  rect.width = actor.width;
+  rect.height = actor.height;
+  rect.class = 'actor';
+  rect.rx = 3;
+  rect.ry = 3;
+  drawRect(g, rect);
+
+  _drawTextCandidateFunc(conf)(actor.description, g, rect.x, rect.y, rect.width, rect.height, {
+    class: 'actor'
+  }, conf);
+};
+var anchorElement = function anchorElement(elem) {
+  return elem.append('g');
+};
+/**
+ * Draws an activation in the diagram
+ * @param elem - element to append activation rect.
+ * @param bounds - activation box bounds.
+ * @param verticalPos - precise y cooridnate of bottom activation box edge.
+ * @param conf - sequence diagram config object.
+ * @param actorActivations - number of activations on the actor.
+ */
+
+var drawActivation = function drawActivation(elem, bounds, verticalPos, conf, actorActivations) {
+  var rect = getNoteRect();
+  var g = bounds.anchored;
+  rect.x = bounds.startx;
+  rect.y = bounds.starty;
+  rect.class = 'activation' + actorActivations % 3; // Will evaluate to 0, 1 or 2
+
+  rect.width = bounds.stopx - bounds.startx;
+  rect.height = verticalPos - bounds.starty;
+  drawRect(g, rect);
+};
+/**
+ * Draws a loop in the diagram
+ * @param elem - elemenet to append the loop to.
+ * @param loopModel - loopModel of the given loop.
+ * @param labelText - Text within the loop.
+ * @param conf - diagrom configuration
+ */
+
+var drawLoop = function drawLoop(elem, loopModel, labelText, conf) {
+  var boxMargin = conf.boxMargin,
+      boxTextMargin = conf.boxTextMargin,
+      labelBoxHeight = conf.labelBoxHeight,
+      labelBoxWidth = conf.labelBoxWidth,
+      fontFamily = conf.messageFontFamily,
+      fontSize = conf.messageFontSize,
+      fontWeight = conf.messageFontWeight;
+  var g = elem.append('g');
+
+  var drawLoopLine = function drawLoopLine(startx, starty, stopx, stopy) {
+    return g.append('line').attr('x1', startx).attr('y1', starty).attr('x2', stopx).attr('y2', stopy).attr('class', 'loopLine');
+  };
+
+  drawLoopLine(loopModel.startx, loopModel.starty, loopModel.stopx, loopModel.starty);
+  drawLoopLine(loopModel.stopx, loopModel.starty, loopModel.stopx, loopModel.stopy);
+  drawLoopLine(loopModel.startx, loopModel.stopy, loopModel.stopx, loopModel.stopy);
+  drawLoopLine(loopModel.startx, loopModel.starty, loopModel.startx, loopModel.stopy);
+
+  if (typeof loopModel.sections !== 'undefined') {
+    loopModel.sections.forEach(function (item) {
+      drawLoopLine(loopModel.startx, item.y, loopModel.stopx, item.y).style('stroke-dasharray', '3, 3');
+    });
+  }
+
+  var txt = getTextObj();
+  txt.text = labelText;
+  txt.x = loopModel.startx;
+  txt.y = loopModel.starty;
+  txt.fontFamily = fontFamily;
+  txt.fontSize = fontSize;
+  txt.fontWeight = fontWeight;
+  txt.anchor = 'middle';
+  txt.valign = 'middle';
+  txt.tspan = false;
+  txt.width = labelBoxWidth || 50;
+  txt.height = labelBoxHeight || 20;
+  txt.textMargin = boxTextMargin;
+  txt.class = 'labelText';
+  drawLabel(g, txt);
+  txt = getTextObj();
+  txt.text = loopModel.title;
+  txt.x = loopModel.startx + labelBoxWidth / 2 + (loopModel.stopx - loopModel.startx) / 2;
+  txt.y = loopModel.starty + boxMargin + boxTextMargin;
+  txt.anchor = 'middle';
+  txt.valign = 'middle';
+  txt.textMargin = boxTextMargin;
+  txt.class = 'loopText';
+  txt.fontFamily = fontFamily;
+  txt.fontSize = fontSize;
+  txt.fontWeight = fontWeight;
+  txt.wrap = true;
+  var textElem = drawText(g, txt);
+
+  if (typeof loopModel.sectionTitles !== 'undefined') {
+    loopModel.sectionTitles.forEach(function (item, idx) {
+      if (item.message) {
+        txt.text = item.message;
+        txt.x = loopModel.startx + (loopModel.stopx - loopModel.startx) / 2;
+        txt.y = loopModel.sections[idx].y + boxMargin + boxTextMargin;
+        txt.class = 'loopText';
+        txt.anchor = 'middle';
+        txt.valign = 'middle';
+        txt.tspan = false;
+        txt.fontFamily = fontFamily;
+        txt.fontSize = fontSize;
+        txt.fontWeight = fontWeight;
+        txt.wrap = loopModel.wrap;
+        textElem = drawText(g, txt);
+        var sectionHeight = Math.round(textElem.map(function (te) {
+          return (te._groups || te)[0][0].getBBox().height;
+        }).reduce(function (acc, curr) {
+          return acc + curr;
+        }));
+        loopModel.sections[idx].height += sectionHeight - (boxMargin + boxTextMargin);
+      }
+    });
+  }
+
+  loopModel.height = Math.round(loopModel.stopy - loopModel.starty);
+  return g;
+};
+/**
+ * Draws a background rectangle
+ * @param elem diagram (reference for bounds)
+ * @param bounds shape of the rectangle
+ */
+
+var drawBackgroundRect = function drawBackgroundRect(elem, bounds) {
+  var rectElem = drawRect(elem, {
+    x: bounds.startx,
+    y: bounds.starty,
+    width: bounds.stopx - bounds.startx,
+    height: bounds.stopy - bounds.starty,
+    fill: bounds.fill,
+    class: 'rect'
+  });
+  rectElem.lower();
+};
+/**
+ * Setup arrow head and define the marker. The result is appended to the svg.
+ */
+
+var insertArrowHead = function insertArrowHead(elem) {
+  elem.append('defs').append('marker').attr('id', 'arrowhead').attr('refX', 5).attr('refY', 2).attr('markerWidth', 6).attr('markerHeight', 4).attr('orient', 'auto').append('path').attr('d', 'M 0,0 V 4 L6,2 Z'); // this is actual shape for arrowhead
+};
+/**
+ * Setup node number. The result is appended to the svg.
+ */
+
+var insertSequenceNumber = function insertSequenceNumber(elem) {
+  elem.append('defs').append('marker').attr('id', 'sequencenumber').attr('refX', 15).attr('refY', 15).attr('markerWidth', 60).attr('markerHeight', 40).attr('orient', 'auto').append('circle').attr('cx', 15).attr('cy', 15).attr('r', 6); // .style("fill", '#f00');
+};
+/**
+ * Setup arrow head and define the marker. The result is appended to the svg.
+ */
+
+var insertArrowCrossHead = function insertArrowCrossHead(elem) {
+  var defs = elem.append('defs');
+  var marker = defs.append('marker').attr('id', 'crosshead').attr('markerWidth', 15).attr('markerHeight', 8).attr('orient', 'auto').attr('refX', 16).attr('refY', 4); // The arrow
+
+  marker.append('path').attr('fill', 'black').attr('stroke', '#000000').style('stroke-dasharray', '0, 0').attr('stroke-width', '1px').attr('d', 'M 9,2 V 6 L16,4 Z'); // The cross
+
+  marker.append('path').attr('fill', 'none').attr('stroke', '#000000').style('stroke-dasharray', '0, 0').attr('stroke-width', '1px').attr('d', 'M 0,1 L 6,7 M 6,1 L 0,7'); // this is actual shape for arrowhead
+};
+var getTextObj = function getTextObj() {
+  return {
+    x: 0,
+    y: 0,
+    fill: undefined,
+    anchor: undefined,
+    style: '#666',
+    width: undefined,
+    height: undefined,
+    textMargin: 0,
+    rx: 0,
+    ry: 0,
+    tspan: true,
+    valign: undefined
+  };
+};
+var getNoteRect = function getNoteRect() {
+  return {
+    x: 0,
+    y: 0,
+    fill: '#EDF2AE',
+    stroke: '#666',
+    width: 100,
+    anchor: 'start',
+    height: 100,
+    rx: 0,
+    ry: 0
+  };
+};
+
+var _drawTextCandidateFunc = function () {
+  function byText(content, g, x, y, width, height, textAttrs) {
+    var text = g.append('text').attr('x', x + width / 2).attr('y', y + height / 2 + 5).style('text-anchor', 'middle').text(content);
+
+    _setTextAttrs(text, textAttrs);
+  }
+
+  function byTspan(content, g, x, y, width, height, textAttrs, conf) {
+    var actorFontSize = conf.actorFontSize,
+        actorFontFamily = conf.actorFontFamily,
+        actorFontWeight = conf.actorFontWeight;
+    var lines = content.split(_common_common__WEBPACK_IMPORTED_MODULE_0__["default"].lineBreakRegex);
+
+    for (var i = 0; i < lines.length; i++) {
+      var dy = i * actorFontSize - actorFontSize * (lines.length - 1) / 2;
+      var text = g.append('text').attr('x', x + width / 2).attr('y', y).style('text-anchor', 'middle').style('font-size', actorFontSize).style('font-weight', actorFontWeight).style('font-family', actorFontFamily);
+      text.append('tspan').attr('x', x + width / 2).attr('dy', dy).text(lines[i]);
+      text.attr('y', y + height / 2.0).attr('dominant-baseline', 'central').attr('alignment-baseline', 'central');
+
+      _setTextAttrs(text, textAttrs);
+    }
+  }
+
+  function byFo(content, g, x, y, width, height, textAttrs, conf) {
+    var s = g.append('switch');
+    var f = s.append('foreignObject').attr('x', x).attr('y', y).attr('width', width).attr('height', height);
+    var text = f.append('div').style('display', 'table').style('height', '100%').style('width', '100%');
+    text.append('div').style('display', 'table-cell').style('text-align', 'center').style('vertical-align', 'middle').text(content);
+    byTspan(content, s, x, y, width, height, textAttrs, conf);
+
+    _setTextAttrs(text, textAttrs);
+  }
+
+  function _setTextAttrs(toText, fromTextAttrsDict) {
+    for (var key in fromTextAttrsDict) {
+      if (fromTextAttrsDict.hasOwnProperty(key)) {
+        // eslint-disable-line
+        toText.attr(key, fromTextAttrsDict[key]);
+      }
+    }
+  }
+
+  return function (conf) {
+    return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;
+  };
+}();
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  drawRect: drawRect,
+  drawText: drawText,
+  drawLabel: drawLabel,
+  drawActor: drawActor,
+  anchorElement: anchorElement,
+  drawActivation: drawActivation,
+  drawLoop: drawLoop,
+  drawBackgroundRect: drawBackgroundRect,
+  insertArrowHead: insertArrowHead,
+  insertSequenceNumber: insertSequenceNumber,
+  insertArrowCrossHead: insertArrowCrossHead,
+  getTextObj: getTextObj,
+  getNoteRect: getNoteRect
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/state/id-cache.js":
+/*!****************************************!*\
+  !*** ./src/diagrams/state/id-cache.js ***!
+  \****************************************/
+/*! exports provided: set, get, keys, size, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "set", function() { return set; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "get", function() { return get; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "keys", function() { return keys; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "size", function() { return size; });
+var idCache = {};
+var set = function set(key, val) {
+  idCache[key] = val;
+};
+var get = function get(k) {
+  return idCache[k];
+};
+var keys = function keys() {
+  return Object.keys(idCache);
+};
+var size = function size() {
+  return keys().length;
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  get: get,
+  set: set,
+  keys: keys,
+  size: size
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/state/parser/stateDiagram.jison":
+/*!******************************************************!*\
+  !*** ./src/diagrams/state/parser/stateDiagram.jison ***!
+  \******************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,3],$V2=[1,5],$V3=[1,7],$V4=[2,5],$V5=[1,15],$V6=[1,17],$V7=[1,19],$V8=[1,20],$V9=[1,21],$Va=[1,22],$Vb=[1,28],$Vc=[1,23],$Vd=[1,24],$Ve=[1,25],$Vf=[1,26],$Vg=[1,29],$Vh=[1,32],$Vi=[1,4,5,14,15,17,19,20,22,23,24,25,26,36,39],$Vj=[1,4,5,12,13,14,15,17,19,20,22,23,24,25,26,36,39],$Vk=[1,4,5,7,14,15,17,19,20,22,23,24,25,26,36,39],$Vl=[4,5,14,15,17,19,20,22,23,24,25,26,36,39];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"SPACE":4,"NL":5,"directive":6,"SD":7,"document":8,"line":9,"statement":10,"idStatement":11,"DESCR":12,"-->":13,"HIDE_EMPTY":14,"scale":15,"WIDTH":16,"COMPOSIT_STATE":17,"STRUCT_START":18,"STRUCT_STOP":19,"STATE_DESCR":20,"AS":21,"ID":22,"FORK":23,"JOIN":24,"CONCURRENT":25,"note":26,"notePosition":27,"NOTE_TEXT":28,"openDirective":29,"typeDirective":30,"closeDirective":31,":":32,"argDirective":33,"eol":34,";":35,"EDGE_STATE":36,"left_of":37,"right_of":38,"open_directive":39,"type_directive":40,"arg_directive":41,"close_directive":42,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"SPACE",5:"NL",7:"SD",12:"DESCR",13:"-->",14:"HIDE_EMPTY",15:"scale",16:"WIDTH",17:"COMPOSIT_STATE",18:"STRUCT_START",19:"STRUCT_STOP",20:"STATE_DESCR",21:"AS",22:"ID",23:"FORK",24:"JOIN",25:"CONCURRENT",26:"note",28:"NOTE_TEXT",32:":",35:";",36:"EDGE_STATE",37:"left_of",38:"right_of",39:"open_directive",40:"type_directive",41:"arg_directive",42:"close_directive"},
+productions_: [0,[3,2],[3,2],[3,2],[3,2],[8,0],[8,2],[9,2],[9,1],[9,1],[10,1],[10,2],[10,3],[10,4],[10,1],[10,2],[10,1],[10,4],[10,3],[10,6],[10,1],[10,1],[10,1],[10,4],[10,4],[10,1],[6,3],[6,5],[34,1],[34,1],[11,1],[11,1],[27,1],[27,1],[29,1],[30,1],[33,1],[31,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 4:
+ /*console.warn('Root document', $$[$0]);*/ yy.setRootDoc($$[$0]);return $$[$0]; 
+break;
+case 5:
+ this.$ = [] 
+break;
+case 6:
+
+        if($$[$0]!='nl'){
+            $$[$0-1].push($$[$0]);this.$ = $$[$0-1]
+        }
+        // console.warn('Got document',$$[$0-1], $$[$0]);
+    
+break;
+case 7: case 8:
+ this.$ = $$[$0] 
+break;
+case 9:
+ this.$='nl';
+break;
+case 10:
+ /*console.warn('got id and descr', $$[$0]);*/this.$={ stmt: 'state', id: $$[$0], type: 'default', description: ''};
+break;
+case 11:
+ /*console.warn('got id and descr', $$[$0-1], $$[$0].trim());*/this.$={ stmt: 'state', id: $$[$0-1], type: 'default', description: yy.trimColon($$[$0])};
+break;
+case 12:
+
+        /*console.warn('got id', $$[$0-2]);yy.addRelation($$[$0-2], $$[$0]);*/
+        this.$={ stmt: 'relation', state1: { stmt: 'state', id: $$[$0-2], type: 'default', description: '' }, state2:{ stmt: 'state', id: $$[$0] ,type: 'default', description: ''}};
+    
+break;
+case 13:
+
+        /*yy.addRelation($$[$0-3], $$[$0-1], $$[$0].substr(1).trim());*/
+        this.$={ stmt: 'relation', state1: { stmt: 'state', id: $$[$0-3], type: 'default', description: '' }, state2:{ stmt: 'state', id: $$[$0-1] ,type: 'default', description: ''}, description: $$[$0].substr(1).trim()};
+    
+break;
+case 17:
+
+
+        /* console.warn('Adding document for state without id ', $$[$0-3]);*/
+        this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: '', doc: $$[$0-1] }
+    
+break;
+case 18:
+
+        var id=$$[$0];
+        var description = $$[$0-2].trim();
+        if($$[$0].match(':')){
+            var parts = $$[$0].split(':');
+            id=parts[0];
+            description = [description, parts[1]];
+        }
+        this.$={stmt: 'state', id: id, type: 'default', description: description};
+
+    
+break;
+case 19:
+
+         //console.warn('Adding document for state with id ', $$[$0-3], $$[$0-2]); yy.addDocument($$[$0-3]);
+         this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: $$[$0-5], doc: $$[$0-1] }
+    
+break;
+case 20:
+
+        this.$={ stmt: 'state', id: $$[$0], type: 'fork' }
+    
+break;
+case 21:
+
+        this.$={ stmt: 'state', id: $$[$0], type: 'join' }
+    
+break;
+case 22:
+
+        this.$={ stmt: 'state', id: yy.getDividerId(), type: 'divider' }
+    
+break;
+case 23:
+
+        /*console.warn('got NOTE, position: ', $$[$0-2].trim(), 'id = ', $$[$0-1].trim(), 'note: ', $$[$0]);*/
+        this.$={ stmt: 'state', id: $$[$0-1].trim(), note:{position: $$[$0-2].trim(), text: $$[$0].trim()}};
+    
+break;
+case 30: case 31:
+this.$=$$[$0];
+break;
+case 34:
+ yy.parseDirective('%%{', 'open_directive'); 
+break;
+case 35:
+ yy.parseDirective($$[$0], 'type_directive'); 
+break;
+case 36:
+ $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); 
+break;
+case 37:
+ yy.parseDirective('}%%', 'close_directive', 'state'); 
+break;
+}
+},
+table: [{3:1,4:$V0,5:$V1,6:4,7:$V2,29:6,39:$V3},{1:[3]},{3:8,4:$V0,5:$V1,6:4,7:$V2,29:6,39:$V3},{3:9,4:$V0,5:$V1,6:4,7:$V2,29:6,39:$V3},{3:10,4:$V0,5:$V1,6:4,7:$V2,29:6,39:$V3},o([1,4,5,14,15,17,20,22,23,24,25,26,36,39],$V4,{8:11}),{30:12,40:[1,13]},{40:[2,34]},{1:[2,1]},{1:[2,2]},{1:[2,3]},{1:[2,4],4:$V5,5:$V6,6:27,9:14,10:16,11:18,14:$V7,15:$V8,17:$V9,20:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,26:$Vf,29:6,36:$Vg,39:$V3},{31:30,32:[1,31],42:$Vh},o([32,42],[2,35]),o($Vi,[2,6]),{6:27,10:33,11:18,14:$V7,15:$V8,17:$V9,20:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,26:$Vf,29:6,36:$Vg,39:$V3},o($Vi,[2,8]),o($Vi,[2,9]),o($Vi,[2,10],{12:[1,34],13:[1,35]}),o($Vi,[2,14]),{16:[1,36]},o($Vi,[2,16],{18:[1,37]}),{21:[1,38]},o($Vi,[2,20]),o($Vi,[2,21]),o($Vi,[2,22]),{27:39,28:[1,40],37:[1,41],38:[1,42]},o($Vi,[2,25]),o($Vj,[2,30]),o($Vj,[2,31]),o($Vk,[2,26]),{33:43,41:[1,44]},o($Vk,[2,37]),o($Vi,[2,7]),o($Vi,[2,11]),{11:45,22:$Vb,36:$Vg},o($Vi,[2,15]),o($Vl,$V4,{8:46}),{22:[1,47]},{22:[1,48]},{21:[1,49]},{22:[2,32]},{22:[2,33]},{31:50,42:$Vh},{42:[2,36]},o($Vi,[2,12],{12:[1,51]}),{4:$V5,5:$V6,6:27,9:14,10:16,11:18,14:$V7,15:$V8,17:$V9,19:[1,52],20:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,26:$Vf,29:6,36:$Vg,39:$V3},o($Vi,[2,18],{18:[1,53]}),{28:[1,54]},{22:[1,55]},o($Vk,[2,27]),o($Vi,[2,13]),o($Vi,[2,17]),o($Vl,$V4,{8:56}),o($Vi,[2,23]),o($Vi,[2,24]),{4:$V5,5:$V6,6:27,9:14,10:16,11:18,14:$V7,15:$V8,17:$V9,19:[1,57],20:$Va,22:$Vb,23:$Vc,24:$Vd,25:$Ve,26:$Vf,29:6,36:$Vg,39:$V3},o($Vi,[2,19])],
+defaultActions: {7:[2,34],8:[2,1],9:[2,2],10:[2,3],41:[2,32],42:[2,33],44:[2,36]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0: this.begin('open_directive'); return 39; 
+break;
+case 1: this.begin('type_directive'); return 40; 
+break;
+case 2: this.popState(); this.begin('arg_directive'); return 32; 
+break;
+case 3: this.popState(); this.popState(); return 42; 
+break;
+case 4:return 41;
+break;
+case 5:/* skip comments */
+break;
+case 6:/* skip comments */{ console.log('Crap after close'); }
+break;
+case 7:return 5;
+break;
+case 8:/* skip all whitespace */
+break;
+case 9:/* skip same-line whitespace */
+break;
+case 10:/* skip comments */
+break;
+case 11:/* skip comments */
+break;
+case 12: this.pushState('SCALE'); /* console.log('Got scale', yy_.yytext);*/ return 15; 
+break;
+case 13:return 16;
+break;
+case 14:this.popState();
+break;
+case 15: this.pushState('STATE'); 
+break;
+case 16:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim(); /*console.warn('Fork Fork: ',yy_.yytext);*/return 23;
+break;
+case 17:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 24;
+break;
+case 18:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Fork: ',yy_.yytext);*/return 23;
+break;
+case 19:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 24;
+break;
+case 20:this.begin("STATE_STRING");
+break;
+case 21:this.popState();this.pushState('STATE_ID');return "AS";
+break;
+case 22:this.popState();/* console.log('STATE_ID', yy_.yytext);*/return "ID";
+break;
+case 23:this.popState();
+break;
+case 24: /*console.log('Long description:', yy_.yytext);*/return "STATE_DESCR";
+break;
+case 25:/*console.log('COMPOSIT_STATE', yy_.yytext);*/return 17;
+break;
+case 26:this.popState();
+break;
+case 27:this.popState();this.pushState('struct'); /*console.log('begin struct', yy_.yytext);*/return 18;
+break;
+case 28: /*console.log('Ending struct');*/ this.popState(); return 19;
+break;
+case 29:/* nothing */
+break;
+case 30: this.begin('NOTE'); return 26; 
+break;
+case 31: this.popState();this.pushState('NOTE_ID');return 37;
+break;
+case 32: this.popState();this.pushState('NOTE_ID');return 38;
+break;
+case 33: this.popState();this.pushState('FLOATING_NOTE');
+break;
+case 34:this.popState();this.pushState('FLOATING_NOTE_ID');return "AS";
+break;
+case 35:/**/
+break;
+case 36: /*console.log('Floating note text: ', yy_.yytext);*/return "NOTE_TEXT";
+break;
+case 37:this.popState();/*console.log('Floating note ID', yy_.yytext);*/return "ID";
+break;
+case 38: this.popState();this.pushState('NOTE_TEXT');/*console.log('Got ID for note', yy_.yytext);*/return 22;
+break;
+case 39: this.popState();/*console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.substr(2).trim();return 28;
+break;
+case 40: this.popState();/*console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.slice(0,-8).trim();return 28;
+break;
+case 41: /*console.log('Got state diagram', yy_.yytext,'#');*/return 7; 
+break;
+case 42: /*console.log('Got state diagram', yy_.yytext,'#');*/return 7; 
+break;
+case 43: /*console.log('HIDE_EMPTY', yy_.yytext,'#');*/return 14; 
+break;
+case 44: /*console.log('EDGE_STATE=',yy_.yytext);*/ return 36;
+break;
+case 45: /*console.log('=>ID=',yy_.yytext);*/ return 22;
+break;
+case 46: yy_.yytext = yy_.yytext.trim(); /*console.log('Descr = ', yy_.yytext);*/ return 12; 
+break;
+case 47:return 13;
+break;
+case 48:return 25;
+break;
+case 49:return 5;
+break;
+case 50:return 'INVALID';
+break;
+}
+},
+rules: [/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<<fork>>)/i,/^(?:.*<<join>>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:\s*[^:;]+end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?:$)/i,/^(?:.)/i],
+conditions: {"LINE":{"rules":[9,10],"inclusive":false},"close_directive":{"rules":[9,10],"inclusive":false},"arg_directive":{"rules":[3,4,9,10],"inclusive":false},"type_directive":{"rules":[2,3,9,10],"inclusive":false},"open_directive":{"rules":[1,9,10],"inclusive":false},"struct":{"rules":[9,10,15,28,29,30,44,45,46,47,48],"inclusive":false},"FLOATING_NOTE_ID":{"rules":[37],"inclusive":false},"FLOATING_NOTE":{"rules":[34,35,36],"inclusive":false},"NOTE_TEXT":{"rules":[39,40],"inclusive":false},"NOTE_ID":{"rules":[38],"inclusive":false},"NOTE":{"rules":[31,32,33],"inclusive":false},"SCALE":{"rules":[13,14],"inclusive":false},"ALIAS":{"rules":[],"inclusive":false},"STATE_ID":{"rules":[22],"inclusive":false},"STATE_STRING":{"rules":[23,24],"inclusive":false},"FORK_STATE":{"rules":[],"inclusive":false},"STATE":{"rules":[9,10,16,17,18,19,20,21,25,26,27],"inclusive":false},"ID":{"rules":[9,10],"inclusive":false},"INITIAL":{"rules":[0,5,6,7,8,10,11,12,15,27,30,41,42,43,44,45,46,47,49,50],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/state/shapes.js":
+/*!**************************************!*\
+  !*** ./src/diagrams/state/shapes.js ***!
+  \**************************************/
+/*! exports provided: drawStartState, drawDivider, drawSimpleState, drawDescrState, addTitleAndBox, drawText, drawNote, drawState, drawEdge */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawStartState", function() { return drawStartState; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawDivider", function() { return drawDivider; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawSimpleState", function() { return drawSimpleState; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawDescrState", function() { return drawDescrState; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTitleAndBox", function() { return addTitleAndBox; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawText", function() { return drawText; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawNote", function() { return drawNote; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawState", function() { return drawState; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawEdge", function() { return drawEdge; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _id_cache_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./id-cache.js */ "./src/diagrams/state/id-cache.js");
+/* harmony import */ var _stateDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stateDb */ "./src/diagrams/state/stateDb.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+
+
+
+
+
+
+ // let conf;
+
+/**
+ * Draws a start state as a black circle
+ */
+
+var drawStartState = function drawStartState(g) {
+  return g.append('circle') // .style('stroke', 'black')
+  // .style('fill', 'black')
+  .attr('class', 'start-state').attr('r', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit).attr('cx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit).attr('cy', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit);
+};
+/**
+ * Draws a start state as a black circle
+ */
+
+var drawDivider = function drawDivider(g) {
+  return g.append('line').style('stroke', 'grey').style('stroke-dasharray', '3').attr('x1', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight).attr('class', 'divider').attr('x2', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight * 2).attr('y1', 0).attr('y2', 0);
+};
+/**
+ * Draws a an end state as a black circle
+ */
+
+var drawSimpleState = function drawSimpleState(g, stateDef) {
+  var state = g.append('text').attr('x', 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('font-size', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.fontSize).attr('class', 'state-title').text(stateDef.id);
+  var classBox = state.node().getBBox();
+  g.insert('rect', ':first-child').attr('x', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('width', classBox.width + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('height', classBox.height + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('rx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.radius);
+  return state;
+};
+/**
+ * Draws a state with descriptions
+ * @param {*} g
+ * @param {*} stateDef
+ */
+
+var drawDescrState = function drawDescrState(g, stateDef) {
+  var addTspan = function addTspan(textEl, txt, isFirst) {
+    var tSpan = textEl.append('tspan').attr('x', 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).text(txt);
+
+    if (!isFirst) {
+      tSpan.attr('dy', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight);
+    }
+  };
+
+  var title = g.append('text').attr('x', 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight + 1.3 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('font-size', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.fontSize).attr('class', 'state-title').text(stateDef.descriptions[0]);
+  var titleBox = title.node().getBBox();
+  var titleHeight = titleBox.height;
+  var description = g.append('text') // text label for the x axis
+  .attr('x', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', titleHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding * 0.4 + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.dividerMargin + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight).attr('class', 'state-description');
+  var isFirst = true;
+  var isSecond = true;
+  stateDef.descriptions.forEach(function (descr) {
+    if (!isFirst) {
+      addTspan(description, descr, isSecond);
+      isSecond = false;
+    }
+
+    isFirst = false;
+  });
+  var descrLine = g.append('line') // text label for the x axis
+  .attr('x1', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y1', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + titleHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.dividerMargin / 2).attr('y2', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + titleHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.dividerMargin / 2).attr('class', 'descr-divider');
+  var descrBox = description.node().getBBox();
+  var width = Math.max(descrBox.width, titleBox.width);
+  descrLine.attr('x2', width + 3 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding); // const classBox = title.node().getBBox();
+
+  g.insert('rect', ':first-child').attr('x', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('width', width + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('height', descrBox.height + titleHeight + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('rx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.radius);
+  return g;
+};
+/**
+ * Adds the creates a box around the existing content and adds a
+ * panel for the id on top of the content.
+ */
+
+/**
+ * Function that creates an title row and a frame around a substate for a composit state diagram.
+ * The function returns a new d3 svg object with updated width and height properties;
+ * @param {*} g The d3 svg object for the substate to framed
+ * @param {*} stateDef The info about the
+ */
+
+var addTitleAndBox = function addTitleAndBox(g, stateDef, altBkg) {
+  var pad = Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding;
+  var dblPad = 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding;
+  var orgBox = g.node().getBBox();
+  var orgWidth = orgBox.width;
+  var orgX = orgBox.x;
+  var title = g.append('text').attr('x', 0).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.titleShift).attr('font-size', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.fontSize).attr('class', 'state-title').text(stateDef.id);
+  var titleBox = title.node().getBBox();
+  var titleWidth = titleBox.width + dblPad;
+  var width = Math.max(titleWidth, orgWidth); // + dblPad;
+
+  if (width === orgWidth) {
+    width = width + dblPad;
+  }
+
+  var startX; // const lineY = 1 - getConfig().state.textHeight;
+  // const descrLine = g
+  //   .append('line') // text label for the x axis
+  //   .attr('x1', 0)
+  //   .attr('y1', lineY)
+  //   .attr('y2', lineY)
+  //   .attr('class', 'descr-divider');
+
+  var graphBox = g.node().getBBox(); // console.warn(width / 2, titleWidth / 2, getConfig().state.padding, orgBox);
+  // descrLine.attr('x2', graphBox.width + getConfig().state.padding);
+
+  if (stateDef.doc) {// cnsole.warn(
+    //   stateDef.id,
+    //   'orgX: ',
+    //   orgX,
+    //   'width: ',
+    //   width,
+    //   'titleWidth: ',
+    //   titleWidth,
+    //   'orgWidth: ',
+    //   orgWidth,
+    //   'width',
+    //   width
+    // );
+  }
+
+  startX = orgX - pad;
+
+  if (titleWidth > orgWidth) {
+    startX = (orgWidth - width) / 2 + pad;
+  }
+
+  if (Math.abs(orgX - graphBox.x) < pad) {
+    if (titleWidth > orgWidth) {
+      startX = orgX - (titleWidth - orgWidth) / 2;
+    }
+  }
+
+  var lineY = 1 - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight; // White color
+
+  g.insert('rect', ':first-child').attr('x', startX).attr('y', lineY).attr('class', altBkg ? 'alt-composit' : 'composit').attr('width', width).attr('height', graphBox.height + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.titleShift + 1).attr('rx', '0');
+  title.attr('x', startX + pad);
+  if (titleWidth <= orgWidth) title.attr('x', orgX + (width - dblPad) / 2 - titleWidth / 2 + pad); // Title background
+
+  g.insert('rect', ':first-child').attr('x', startX).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.titleShift - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('width', width) // Just needs to be higher then the descr line, will be clipped by the white color box
+  .attr('height', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight * 3).attr('rx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.radius); // Full background
+
+  g.insert('rect', ':first-child').attr('x', startX).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.titleShift - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('width', width).attr('height', graphBox.height + 3 + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.textHeight).attr('rx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.radius);
+  return g;
+};
+
+var drawEndState = function drawEndState(g) {
+  g.append('circle') // .style('stroke', 'black')
+  // .style('fill', 'white')
+  .attr('class', 'end-state-outer').attr('r', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.miniPadding).attr('cx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.miniPadding).attr('cy', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.miniPadding);
+  return g.append('circle') // .style('stroke', 'black')
+  // .style('fill', 'black')
+  .attr('class', 'end-state-inner').attr('r', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit).attr('cx', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + 2).attr('cy', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.sizeUnit + 2);
+};
+
+var drawForkJoinState = function drawForkJoinState(g, stateDef) {
+  var width = Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.forkWidth;
+  var height = Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.forkHeight;
+
+  if (stateDef.parentId) {
+    var tmp = width;
+    width = height;
+    height = tmp;
+  }
+
+  return g.append('rect').style('stroke', 'black').style('fill', 'black').attr('width', width).attr('height', height).attr('x', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding);
+};
+
+var drawText = function drawText(elem, textData) {
+  // Remove and ignore br:s
+  var nText = textData.text.replace(_common_common__WEBPACK_IMPORTED_MODULE_4__["default"].lineBreakRegex, ' ');
+  var textElem = elem.append('text');
+  textElem.attr('x', textData.x);
+  textElem.attr('y', textData.y);
+  textElem.style('text-anchor', textData.anchor);
+  textElem.attr('fill', textData.fill);
+
+  if (typeof textData.class !== 'undefined') {
+    textElem.attr('class', textData.class);
+  }
+
+  var span = textElem.append('tspan');
+  span.attr('x', textData.x + textData.textMargin * 2);
+  span.attr('fill', textData.fill);
+  span.text(nText);
+  return textElem;
+};
+
+var _drawLongText = function _drawLongText(_text, x, y, g) {
+  var textHeight = 0;
+  var textElem = g.append('text');
+  textElem.style('text-anchor', 'start');
+  textElem.attr('class', 'noteText');
+
+  var text = _text.replace(/\r\n/g, '<br/>');
+
+  text = text.replace(/\n/g, '<br/>');
+  var lines = text.split(_common_common__WEBPACK_IMPORTED_MODULE_4__["default"].lineBreakRegex);
+  var tHeight = 1.25 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin;
+  var _iteratorNormalCompletion = true;
+  var _didIteratorError = false;
+  var _iteratorError = undefined;
+
+  try {
+    for (var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+      var _line = _step.value;
+
+      var txt = _line.trim();
+
+      if (txt.length > 0) {
+        var span = textElem.append('tspan');
+        span.text(txt);
+
+        if (tHeight === 0) {
+          var textBounds = span.node().getBBox();
+          tHeight += textBounds.height;
+        } // console.warn('textBounds', textBounds);
+
+
+        textHeight += tHeight;
+        span.attr('x', x + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin);
+        span.attr('y', y + textHeight + 1.25 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin);
+      }
+    }
+  } catch (err) {
+    _didIteratorError = true;
+    _iteratorError = err;
+  } finally {
+    try {
+      if (!_iteratorNormalCompletion && _iterator.return != null) {
+        _iterator.return();
+      }
+    } finally {
+      if (_didIteratorError) {
+        throw _iteratorError;
+      }
+    }
+  }
+
+  return {
+    textWidth: textElem.node().getBBox().width,
+    textHeight: textHeight
+  };
+};
+/**
+ * Draws a note to the diagram
+ * @param text - The text of the given note.
+ * @param g - The element the note is attached to.
+ */
+
+
+var drawNote = function drawNote(text, g) {
+  g.attr('class', 'state-note');
+  var note = g.append('rect').attr('x', 0).attr('y', Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding);
+  var rectElem = g.append('g');
+
+  var _drawLongText2 = _drawLongText(text, 0, 0, rectElem),
+      textWidth = _drawLongText2.textWidth,
+      textHeight = _drawLongText2.textHeight;
+
+  note.attr('height', textHeight + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin);
+  note.attr('width', textWidth + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.noteMargin * 2);
+  return note;
+};
+/**
+ * Starting point for drawing a state. The function finds out the specifics
+ * about the state and renders with approprtiate function.
+ * @param {*} elem
+ * @param {*} stateDef
+ */
+
+var drawState = function drawState(elem, stateDef) {
+  var id = stateDef.id;
+  var stateInfo = {
+    id: id,
+    label: stateDef.id,
+    width: 0,
+    height: 0
+  };
+  var g = elem.append('g').attr('id', id).attr('class', 'stateGroup');
+  if (stateDef.type === 'start') drawStartState(g);
+  if (stateDef.type === 'end') drawEndState(g);
+  if (stateDef.type === 'fork' || stateDef.type === 'join') drawForkJoinState(g, stateDef);
+  if (stateDef.type === 'note') drawNote(stateDef.note.text, g);
+  if (stateDef.type === 'divider') drawDivider(g);
+  if (stateDef.type === 'default' && stateDef.descriptions.length === 0) drawSimpleState(g, stateDef);
+  if (stateDef.type === 'default' && stateDef.descriptions.length > 0) drawDescrState(g, stateDef);
+  var stateBox = g.node().getBBox();
+  stateInfo.width = stateBox.width + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding;
+  stateInfo.height = stateBox.height + 2 * Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding;
+  _id_cache_js__WEBPACK_IMPORTED_MODULE_1__["default"].set(id, stateInfo); // stateCnt++;
+
+  return stateInfo;
+};
+var edgeCount = 0;
+var drawEdge = function drawEdge(elem, path, relation) {
+  var getRelationType = function getRelationType(type) {
+    switch (type) {
+      case _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.AGGREGATION:
+        return 'aggregation';
+
+      case _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.EXTENSION:
+        return 'extension';
+
+      case _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.COMPOSITION:
+        return 'composition';
+
+      case _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.DEPENDENCY:
+        return 'dependency';
+    }
+  };
+
+  path.points = path.points.filter(function (p) {
+    return !Number.isNaN(p.y);
+  }); // The data for our line
+
+  var lineData = path.points; // This is the accessor function we talked about above
+
+  var lineFunction = Object(d3__WEBPACK_IMPORTED_MODULE_0__["line"])().x(function (d) {
+    return d.x;
+  }).y(function (d) {
+    return d.y;
+  }).curve(d3__WEBPACK_IMPORTED_MODULE_0__["curveBasis"]);
+  var svgPath = elem.append('path').attr('d', lineFunction(lineData)).attr('id', 'edge' + edgeCount).attr('class', 'transition');
+  var url = '';
+
+  if (Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.arrowMarkerAbsolute) {
+    url = window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
+    url = url.replace(/\(/g, '\\(');
+    url = url.replace(/\)/g, '\\)');
+  }
+
+  svgPath.attr('marker-end', 'url(' + url + '#' + getRelationType(_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].relationType.DEPENDENCY) + 'End' + ')');
+
+  if (typeof relation.title !== 'undefined') {
+    var label = elem.append('g').attr('class', 'stateLabel');
+
+    var _utils$calcLabelPosit = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].calcLabelPosition(path.points),
+        x = _utils$calcLabelPosit.x,
+        y = _utils$calcLabelPosit.y;
+
+    var rows = _common_common__WEBPACK_IMPORTED_MODULE_4__["default"].getRows(relation.title); // console.warn(rows);
+
+    var titleHeight = 0;
+    var titleRows = [];
+    var maxWidth = 0;
+    var minX = 0;
+
+    for (var i = 0; i <= rows.length; i++) {
+      var title = label.append('text').attr('text-anchor', 'middle').text(rows[i]).attr('x', x).attr('y', y + titleHeight);
+      var boundstmp = title.node().getBBox();
+      maxWidth = Math.max(maxWidth, boundstmp.width);
+      minX = Math.min(minX, boundstmp.x);
+      _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info(boundstmp.x, x, y + titleHeight);
+
+      if (titleHeight === 0) {
+        var titleBox = title.node().getBBox();
+        titleHeight = titleBox.height;
+        _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Title height', titleHeight, y);
+      }
+
+      titleRows.push(title);
+    }
+
+    var boxHeight = titleHeight * rows.length;
+
+    if (rows.length > 1) {
+      var heightAdj = (rows.length - 1) * titleHeight * 0.5;
+      titleRows.forEach(function (title, i) {
+        return title.attr('y', y + i * titleHeight - heightAdj);
+      });
+      boxHeight = titleHeight * rows.length;
+    }
+
+    var bounds = label.node().getBBox();
+    label.insert('rect', ':first-child').attr('class', 'box').attr('x', x - maxWidth / 2 - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding / 2).attr('y', y - boxHeight / 2 - Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding / 2 - 3.5).attr('width', maxWidth + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding).attr('height', boxHeight + Object(_config__WEBPACK_IMPORTED_MODULE_5__["getConfig"])().state.padding);
+    _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info(bounds); //label.attr('transform', '0 -' + (bounds.y / 2));
+    // Debug points
+    // path.points.forEach(point => {
+    //   g.append('circle')
+    //     .style('stroke', 'red')
+    //     .style('fill', 'red')
+    //     .attr('r', 1)
+    //     .attr('cx', point.x)
+    //     .attr('cy', point.y);
+    // });
+    // g.append('circle')
+    //   .style('stroke', 'blue')
+    //   .style('fill', 'blue')
+    //   .attr('r', 1)
+    //   .attr('cx', x)
+    //   .attr('cy', y);
+  }
+
+  edgeCount++;
+};
+
+/***/ }),
+
+/***/ "./src/diagrams/state/stateDb.js":
+/*!***************************************!*\
+  !*** ./src/diagrams/state/stateDb.js ***!
+  \***************************************/
+/*! exports provided: parseDirective, addState, clear, getState, getStates, logDocuments, getRelations, addRelation, cleanupLabel, lineType, relationType, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseDirective", function() { return parseDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addState", function() { return addState; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getState", function() { return getState; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getStates", function() { return getStates; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logDocuments", function() { return logDocuments; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRelations", function() { return getRelations; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addRelation", function() { return addRelation; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cleanupLabel", function() { return cleanupLabel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lineType", function() { return lineType; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "relationType", function() { return relationType; });
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils */ "./src/utils.js");
+/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+
+
+
+
+
+var clone = function clone(o) {
+  return JSON.parse(JSON.stringify(o));
+};
+
+var rootDoc = [];
+var parseDirective = function parseDirective(statement, context, type) {
+  _mermaidAPI__WEBPACK_IMPORTED_MODULE_2__["default"].parseDirective(this, statement, context, type);
+};
+
+var setRootDoc = function setRootDoc(o) {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Setting root doc', o); // rootDoc = { id: 'root', doc: o };
+
+  rootDoc = o;
+};
+
+var getRootDoc = function getRootDoc() {
+  return rootDoc;
+};
+
+var docTranslator = function docTranslator(parent, node, first) {
+  if (node.stmt === 'relation') {
+    docTranslator(parent, node.state1, true);
+    docTranslator(parent, node.state2, false);
+  } else {
+    if (node.stmt === 'state') {
+      if (node.id === '[*]') {
+        node.id = first ? parent.id + '_start' : parent.id + '_end';
+        node.start = first;
+      }
+    }
+
+    if (node.doc) {
+      var doc = []; // Check for concurrency
+
+      var i = 0;
+      var currentDoc = [];
+
+      for (i = 0; i < node.doc.length; i++) {
+        if (node.doc[i].type === 'divider') {
+          // debugger;
+          var newNode = clone(node.doc[i]);
+          newNode.doc = clone(currentDoc);
+          doc.push(newNode);
+          currentDoc = [];
+        } else {
+          currentDoc.push(node.doc[i]);
+        }
+      } // If any divider was encountered
+
+
+      if (doc.length > 0 && currentDoc.length > 0) {
+        var _newNode = {
+          stmt: 'state',
+          id: Object(_utils__WEBPACK_IMPORTED_MODULE_1__["generateId"])(),
+          type: 'divider',
+          doc: clone(currentDoc)
+        };
+        doc.push(clone(_newNode));
+        node.doc = doc;
+      }
+
+      node.doc.forEach(function (docNode) {
+        return docTranslator(node, docNode, true);
+      });
+    }
+  }
+};
+
+var getRootDocV2 = function getRootDocV2() {
+  docTranslator({
+    id: 'root'
+  }, {
+    id: 'root',
+    doc: rootDoc
+  }, true);
+  return {
+    id: 'root',
+    doc: rootDoc
+  };
+};
+
+var extract = function extract(_doc) {
+  // const res = { states: [], relations: [] };
+  var doc;
+
+  if (_doc.doc) {
+    doc = _doc.doc;
+  } else {
+    doc = _doc;
+  } // let doc = root.doc;
+  // if (!doc) {
+  //   doc = root;
+  // }
+
+
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info(doc);
+  clear();
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Extract', doc);
+  doc.forEach(function (item) {
+    if (item.stmt === 'state') {
+      addState(item.id, item.type, item.doc, item.description, item.note);
+    }
+
+    if (item.stmt === 'relation') {
+      addRelation(item.state1.id, item.state2.id, item.description);
+    }
+  });
+};
+
+var newDoc = function newDoc() {
+  return {
+    relations: [],
+    states: {},
+    documents: {}
+  };
+};
+
+var documents = {
+  root: newDoc()
+};
+var currentDocument = documents.root;
+var startCnt = 0;
+var endCnt = 0; // eslint-disable-line
+// let stateCnt = 0;
+
+/**
+ * Function called by parser when a node definition has been found.
+ * @param id
+ * @param text
+ * @param type
+ * @param style
+ */
+
+var addState = function addState(id, type, doc, descr, note) {
+  if (typeof currentDocument.states[id] === 'undefined') {
+    currentDocument.states[id] = {
+      id: id,
+      descriptions: [],
+      type: type,
+      doc: doc,
+      note: note
+    };
+  } else {
+    if (!currentDocument.states[id].doc) {
+      currentDocument.states[id].doc = doc;
+    }
+
+    if (!currentDocument.states[id].type) {
+      currentDocument.states[id].type = type;
+    }
+  }
+
+  if (descr) {
+    _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Adding state ', id, descr);
+    if (typeof descr === 'string') addDescription(id, descr.trim());
+
+    if (_typeof(descr) === 'object') {
+      descr.forEach(function (des) {
+        return addDescription(id, des.trim());
+      });
+    }
+  }
+
+  if (note) currentDocument.states[id].note = note;
+};
+var clear = function clear() {
+  documents = {
+    root: newDoc()
+  };
+  currentDocument = documents.root;
+  currentDocument = documents.root;
+  startCnt = 0;
+  endCnt = 0; // eslint-disable-line
+
+  classes = [];
+};
+var getState = function getState(id) {
+  return currentDocument.states[id];
+};
+var getStates = function getStates() {
+  return currentDocument.states;
+};
+var logDocuments = function logDocuments() {
+  _logger__WEBPACK_IMPORTED_MODULE_0__["logger"].info('Documents = ', documents);
+};
+var getRelations = function getRelations() {
+  return currentDocument.relations;
+};
+var addRelation = function addRelation(_id1, _id2, title) {
+  var id1 = _id1;
+  var id2 = _id2;
+  var type1 = 'default';
+  var type2 = 'default';
+
+  if (_id1 === '[*]') {
+    startCnt++;
+    id1 = 'start' + startCnt;
+    type1 = 'start';
+  }
+
+  if (_id2 === '[*]') {
+    endCnt++;
+    id2 = 'end' + startCnt;
+    type2 = 'end';
+  }
+
+  addState(id1, type1);
+  addState(id2, type2);
+  currentDocument.relations.push({
+    id1: id1,
+    id2: id2,
+    title: title
+  });
+};
+
+var addDescription = function addDescription(id, _descr) {
+  var theState = currentDocument.states[id];
+  var descr = _descr;
+
+  if (descr[0] === ':') {
+    descr = descr.substr(1).trim();
+  }
+
+  theState.descriptions.push(descr);
+};
+
+var cleanupLabel = function cleanupLabel(label) {
+  if (label.substring(0, 1) === ':') {
+    return label.substr(2).trim();
+  } else {
+    return label.trim();
+  }
+};
+var lineType = {
+  LINE: 0,
+  DOTTED_LINE: 1
+};
+var dividerCnt = 0;
+
+var getDividerId = function getDividerId() {
+  dividerCnt++;
+  return 'divider-id-' + dividerCnt;
+};
+
+var classes = [];
+
+var getClasses = function getClasses() {
+  return classes;
+};
+
+var getDirection = function getDirection() {
+  return 'TB';
+};
+
+var relationType = {
+  AGGREGATION: 0,
+  EXTENSION: 1,
+  COMPOSITION: 2,
+  DEPENDENCY: 3
+};
+
+var trimColon = function trimColon(str) {
+  return str && str[0] === ':' ? str.substr(1).trim() : str.trim();
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  parseDirective: parseDirective,
+  getConfig: function getConfig() {
+    return _config__WEBPACK_IMPORTED_MODULE_3__["getConfig"]().state;
+  },
+  addState: addState,
+  clear: clear,
+  getState: getState,
+  getStates: getStates,
+  getRelations: getRelations,
+  getClasses: getClasses,
+  getDirection: getDirection,
+  addRelation: addRelation,
+  getDividerId: getDividerId,
+  // addDescription,
+  cleanupLabel: cleanupLabel,
+  lineType: lineType,
+  relationType: relationType,
+  logDocuments: logDocuments,
+  getRootDoc: getRootDoc,
+  setRootDoc: setRootDoc,
+  getRootDocV2: getRootDocV2,
+  extract: extract,
+  trimColon: trimColon
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/state/stateRenderer-v2.js":
+/*!************************************************!*\
+  !*** ./src/diagrams/state/stateRenderer-v2.js ***!
+  \************************************************/
+/*! exports provided: setConf, getClasses, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getClasses", function() { return getClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _stateDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./stateDb */ "./src/diagrams/state/stateDb.js");
+/* harmony import */ var _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./parser/stateDiagram */ "./src/diagrams/state/parser/stateDiagram.jison");
+/* harmony import */ var _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3__);
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+/* harmony import */ var _dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../dagre-wrapper/index.js */ "./src/dagre-wrapper/index.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+
+
+
+
+
+
+
+var conf = {};
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+
+  for (var i = 0; i < keys.length; i++) {
+    conf[keys[i]] = cnf[keys[i]];
+  }
+};
+var nodeDb = {};
+/**
+ * Returns the all the styles from classDef statements in the graph definition.
+ * @returns {object} classDef styles
+ */
+
+var getClasses = function getClasses(text) {
+  _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].trace('Extracting classes');
+  _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
+  var parser = _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
+  parser.yy = _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
+
+  parser.parse(text);
+  return _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getClasses();
+};
+
+var setupNode = function setupNode(g, parent, node, altFlag) {
+  // Add the node
+  if (node.id !== 'root') {
+    var shape = 'rect';
+
+    if (node.start === true) {
+      shape = 'start';
+    }
+
+    if (node.start === false) {
+      shape = 'end';
+    }
+
+    if (node.type !== 'default') {
+      shape = node.type;
+    }
+
+    if (!nodeDb[node.id]) {
+      nodeDb[node.id] = {
+        id: node.id,
+        shape: shape,
+        description: node.id,
+        classes: 'statediagram-state'
+      };
+    } // Build of the array of description strings accordinging
+
+
+    if (node.description) {
+      if (Array.isArray(nodeDb[node.id].description)) {
+        // There already is an array of strings,add to it
+        nodeDb[node.id].shape = 'rectWithTitle';
+        nodeDb[node.id].description.push(node.description);
+      } else {
+        if (nodeDb[node.id].description.length > 0) {
+          // if there is a description already transformit to an array
+          nodeDb[node.id].shape = 'rectWithTitle';
+
+          if (nodeDb[node.id].description === node.id) {
+            // If the previous description was the is, remove it
+            nodeDb[node.id].description = [node.description];
+          } else {
+            nodeDb[node.id].description = [nodeDb[node.id].description, node.description];
+          }
+        } else {
+          nodeDb[node.id].shape = 'rect';
+          nodeDb[node.id].description = node.description;
+        }
+      }
+    } // Save data for description and group so that for instance a statement without description overwrites
+    // one with description
+    // group
+
+
+    if (!nodeDb[node.id].type && node.doc) {
+      _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Setting cluser for ', node.id);
+      nodeDb[node.id].type = 'group';
+      nodeDb[node.id].shape = node.type === 'divider' ? 'divider' : 'roundedWithTitle';
+      nodeDb[node.id].classes = nodeDb[node.id].classes + ' ' + (altFlag ? 'statediagram-cluster statediagram-cluster-alt' : 'statediagram-cluster');
+    }
+
+    var nodeData = {
+      labelStyle: '',
+      shape: nodeDb[node.id].shape,
+      labelText: nodeDb[node.id].description,
+      classes: nodeDb[node.id].classes,
+      //classStr,
+      style: '',
+      //styles.style,
+      id: node.id,
+      type: nodeDb[node.id].type,
+      padding: 15 //getConfig().flowchart.padding
+
+    };
+
+    if (node.note) {
+      // Todo: set random id
+      var noteData = {
+        labelStyle: '',
+        shape: 'note',
+        labelText: node.note.text,
+        classes: 'statediagram-note',
+        //classStr,
+        style: '',
+        //styles.style,
+        id: node.id + '----note',
+        type: nodeDb[node.id].type,
+        padding: 15 //getConfig().flowchart.padding
+
+      };
+      var groupData = {
+        labelStyle: '',
+        shape: 'noteGroup',
+        labelText: node.note.text,
+        classes: nodeDb[node.id].classes,
+        //classStr,
+        style: '',
+        //styles.style,
+        id: node.id + '----parent',
+        type: 'group',
+        padding: 0 //getConfig().flowchart.padding
+
+      };
+      g.setNode(node.id + '----parent', groupData);
+      g.setNode(noteData.id, noteData);
+      g.setNode(node.id, nodeData);
+      g.setParent(node.id, node.id + '----parent');
+      g.setParent(noteData.id, node.id + '----parent');
+      var from = node.id;
+      var to = noteData.id;
+
+      if (node.note.position === 'left of') {
+        from = noteData.id;
+        to = node.id;
+      }
+
+      g.setEdge(from, to, {
+        arrowhead: 'none',
+        arrowType: '',
+        style: 'fill:none',
+        labelStyle: '',
+        classes: 'transition note-edge',
+        arrowheadStyle: 'fill: #333',
+        labelpos: 'c',
+        labelType: 'text',
+        thickness: 'normal'
+      });
+    } else {
+      g.setNode(node.id, nodeData);
+    }
+  }
+
+  if (parent) {
+    if (parent.id !== 'root') {
+      _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Setting node ', node.id, ' to be child of its parent ', parent.id);
+      g.setParent(node.id, parent.id);
+    }
+  }
+
+  if (node.doc) {
+    _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Adding nodes children ');
+    setupDoc(g, node, node.doc, !altFlag);
+  }
+};
+
+var cnt = 0;
+
+var setupDoc = function setupDoc(g, parent, doc, altFlag) {
+  _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].trace('items', doc);
+  doc.forEach(function (item) {
+    if (item.stmt === 'state' || item.stmt === 'default') {
+      setupNode(g, parent, item, altFlag);
+    } else if (item.stmt === 'relation') {
+      setupNode(g, parent, item.state1, altFlag);
+      setupNode(g, parent, item.state2, altFlag);
+      var edgeData = {
+        id: 'edge' + cnt,
+        arrowhead: 'normal',
+        arrowTypeEnd: 'arrow_barb',
+        style: 'fill:none',
+        labelStyle: '',
+        label: item.description,
+        arrowheadStyle: 'fill: #333',
+        labelpos: 'c',
+        labelType: 'text',
+        thickness: 'normal',
+        classes: 'transition'
+      };
+      var startId = item.state1.id;
+      var endId = item.state2.id;
+      g.setEdge(startId, endId, edgeData, cnt);
+      cnt++;
+    }
+  });
+};
+/**
+ * Draws a flowchart in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+
+
+var draw = function draw(text, id) {
+  _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info('Drawing state diagram (v2)', id);
+  _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].clear();
+  nodeDb = {};
+  var parser = _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_3___default.a.parser;
+  parser.yy = _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"]; // Parse the graph definition
+  // try {
+
+  parser.parse(text); // } catch (err) {
+  //   logger.error('Parsing failed', err);
+  // }
+  // Fetch the default direction, use TD if none was found
+
+  var dir = _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getDirection();
+
+  if (typeof dir === 'undefined') {
+    dir = 'LR';
+  }
+
+  var conf = Object(_config__WEBPACK_IMPORTED_MODULE_4__["getConfig"])().state;
+  var nodeSpacing = conf.nodeSpacing || 50;
+  var rankSpacing = conf.rankSpacing || 50; // Create the input mermaid.graph
+
+  var g = new graphlib__WEBPACK_IMPORTED_MODULE_0___default.a.Graph({
+    multigraph: true,
+    compound: true
+  }).setGraph({
+    rankdir: 'TB',
+    nodesep: nodeSpacing,
+    ranksep: rankSpacing,
+    marginx: 8,
+    marginy: 8
+  }).setDefaultEdgeLabel(function () {
+    return {};
+  });
+  _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info(_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRootDocV2());
+  _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].extract(_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRootDocV2());
+  _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].info(_stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRootDocV2());
+  setupNode(g, undefined, _stateDb__WEBPACK_IMPORTED_MODULE_2__["default"].getRootDocV2(), true); // Set up an SVG group so that we can translate the final graph.
+
+  var svg = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(id, "\"]")); // Run the renderer. This is what draws the final graph.
+
+  var element = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#' + id + ' g');
+  Object(_dagre_wrapper_index_js__WEBPACK_IMPORTED_MODULE_5__["render"])(element, g, ['barb'], 'statediagram', id);
+  var padding = 8; // const svgBounds = svg.node().getBBox();
+  // const width = svgBounds.width + padding * 2;
+  // const height = svgBounds.height + padding * 2;
+  // logger.debug(
+  //   `new ViewBox 0 0 ${width} ${height}`,
+  //   `translate(${padding + g._label.marginx}, ${padding + g._label.marginy})`
+  // );
+  // if (conf.useMaxWidth) {
+  //   svg.attr('width', '100%');
+  //   svg.attr('style', `max-width: ${width}px;`);
+  // } else {
+  //   svg.attr('height', height);
+  //   svg.attr('width', width);
+  // }
+  // svg.attr('viewBox', `0 0 ${width} ${height}`);
+  // svg
+  //   .select('g')
+  //   .attr('transform', `translate(${padding - g._label.marginx}, ${padding - svgBounds.y})`);
+
+  var bounds = svg.node().getBBox();
+  var width = bounds.width + padding * 2;
+  var height = bounds.height + padding * 2; // diagram.attr('height', '100%');
+  // diagram.attr('style', `width: ${bounds.width * 3 + conf.padding * 2};`);
+  // diagram.attr('height', height);
+  // Zoom in a bit
+
+  svg.attr('width', width * 1.75);
+  svg.attr('class', 'statediagram'); // diagram.attr('height', bounds.height * 3 + conf.padding * 2);
+  // svg.attr(
+  //   'viewBox',
+  //   `${bounds.x - conf.padding}  ${bounds.y - conf.padding} ` + width + ' ' + height
+  // );
+
+  var svgBounds = svg.node().getBBox();
+
+  if (conf.useMaxWidth) {
+    svg.attr('width', '100%');
+    svg.attr('style', "max-width: ".concat(width, "px;"));
+  } else {
+    svg.attr('height', height);
+    svg.attr('width', width);
+  } // Ensure the viewBox includes the whole svgBounds area with extra space for padding
+
+
+  var vBox = "".concat(svgBounds.x - padding, " ").concat(svgBounds.y - padding, " ").concat(width, " ").concat(height);
+  _logger__WEBPACK_IMPORTED_MODULE_6__["logger"].debug("viewBox ".concat(vBox));
+  svg.attr('viewBox', vBox); // Add label rects for non html labels
+
+  if (!conf.htmlLabels) {
+    var labels = document.querySelectorAll('[id="' + id + '"] .edgeLabel .label');
+
+    for (var k = 0; k < labels.length; k++) {
+      var label = labels[k]; // Get dimensions of label
+
+      var dim = label.getBBox();
+      var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
+      rect.setAttribute('rx', 0);
+      rect.setAttribute('ry', 0);
+      rect.setAttribute('width', dim.width);
+      rect.setAttribute('height', dim.height);
+      label.insertBefore(rect, label.firstChild);
+    }
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  getClasses: getClasses,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/state/stateRenderer.js":
+/*!*********************************************!*\
+  !*** ./src/diagrams/state/stateRenderer.js ***!
+  \*********************************************/
+/*! exports provided: setConf, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dagre */ "./node_modules/dagre/index.js");
+/* harmony import */ var dagre__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dagre__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! graphlib */ "./node_modules/graphlib/index.js");
+/* harmony import */ var graphlib__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(graphlib__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../logger */ "./src/logger.js");
+/* harmony import */ var _stateDb__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stateDb */ "./src/diagrams/state/stateDb.js");
+/* harmony import */ var _common_common__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../common/common */ "./src/diagrams/common/common.js");
+/* harmony import */ var _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./parser/stateDiagram */ "./src/diagrams/state/parser/stateDiagram.jison");
+/* harmony import */ var _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./shapes */ "./src/diagrams/state/shapes.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+
+
+
+
+
+
+ // import idCache from './id-cache';
+
+
+
+_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__["parser"].yy = _stateDb__WEBPACK_IMPORTED_MODULE_4__["default"]; // TODO Move conf object to main conf in mermaidAPI
+
+var conf;
+var transformationLog = {};
+var setConf = function setConf() {}; // Todo optimize
+
+/**
+ * Setup arrow head and define the marker. The result is appended to the svg.
+ */
+
+var insertMarkers = function insertMarkers(elem) {
+  elem.append('defs').append('marker').attr('id', 'dependencyEnd').attr('refX', 19).attr('refY', 7).attr('markerWidth', 20).attr('markerHeight', 28).attr('orient', 'auto').append('path').attr('d', 'M 19,7 L9,13 L14,7 L9,1 Z');
+};
+/**
+ * Draws a flowchart in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+
+
+var draw = function draw(text, id) {
+  conf = Object(_config__WEBPACK_IMPORTED_MODULE_8__["getConfig"])().state;
+  _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__["parser"].yy.clear();
+  _parser_stateDiagram__WEBPACK_IMPORTED_MODULE_6__["parser"].parse(text);
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Rendering diagram ' + text); // Fetch the default direction, use TD if none was found
+
+  var diagram = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])("[id='".concat(id, "']"));
+  insertMarkers(diagram); // Layout graph, Create a new directed graph
+
+  var graph = new graphlib__WEBPACK_IMPORTED_MODULE_2___default.a.Graph({
+    multigraph: true,
+    compound: true,
+    // acyclicer: 'greedy',
+    rankdir: 'RL' // ranksep: '20'
+
+  }); // Default to assigning a new object as a label for each new edge.
+
+  graph.setDefaultEdgeLabel(function () {
+    return {};
+  });
+  var rootDoc = _stateDb__WEBPACK_IMPORTED_MODULE_4__["default"].getRootDoc();
+  renderDoc(rootDoc, diagram, undefined, false);
+  var padding = conf.padding;
+  var bounds = diagram.node().getBBox();
+  var width = bounds.width + padding * 2;
+  var height = bounds.height + padding * 2;
+
+  if (conf.useMaxWidth) {
+    diagram.attr('width', '100%');
+    diagram.attr('style', "max-width: ".concat(width * 1.75, "px;"));
+  } else {
+    // Zoom in a bit
+    diagram.attr('width', width * 1.75);
+  } // diagram.attr('height', bounds.height * 3 + conf.padding * 2);
+
+
+  diagram.attr('viewBox', "".concat(bounds.x - conf.padding, "  ").concat(bounds.y - conf.padding, " ") + width + ' ' + height);
+};
+
+var getLabelWidth = function getLabelWidth(text) {
+  return text ? text.length * conf.fontSizeFactor : 1;
+};
+
+var renderDoc = function renderDoc(doc, diagram, parentId, altBkg) {
+  // // Layout graph, Create a new directed graph
+  var graph = new graphlib__WEBPACK_IMPORTED_MODULE_2___default.a.Graph({
+    compound: true,
+    multigraph: true
+  });
+  var i;
+  var edgeFreeDoc = true;
+
+  for (i = 0; i < doc.length; i++) {
+    if (doc[i].stmt === 'relation') {
+      edgeFreeDoc = false;
+      break;
+    }
+  } // Set an object for the graph label
+
+
+  if (parentId) graph.setGraph({
+    rankdir: 'LR',
+    multigraph: true,
+    compound: true,
+    // acyclicer: 'greedy',
+    ranker: 'tight-tree',
+    ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,
+    nodeSep: edgeFreeDoc ? 1 : 50,
+    isMultiGraph: true // ranksep: 5,
+    // nodesep: 1
+
+  });else {
+    graph.setGraph({
+      rankdir: 'TB',
+      multigraph: true,
+      compound: true,
+      // isCompound: true,
+      // acyclicer: 'greedy',
+      // ranker: 'longest-path'
+      ranksep: edgeFreeDoc ? 1 : conf.edgeLengthFactor,
+      nodeSep: edgeFreeDoc ? 1 : 50,
+      ranker: 'tight-tree',
+      // ranker: 'network-simplex'
+      isMultiGraph: true
+    });
+  } // Default to assigning a new object as a label for each new edge.
+
+  graph.setDefaultEdgeLabel(function () {
+    return {};
+  });
+  _stateDb__WEBPACK_IMPORTED_MODULE_4__["default"].extract(doc);
+  var states = _stateDb__WEBPACK_IMPORTED_MODULE_4__["default"].getStates();
+  var relations = _stateDb__WEBPACK_IMPORTED_MODULE_4__["default"].getRelations();
+  var keys = Object.keys(states);
+  var first = true;
+
+  for (var _i = 0; _i < keys.length; _i++) {
+    var stateDef = states[keys[_i]];
+
+    if (parentId) {
+      stateDef.parentId = parentId;
+    }
+
+    var node = void 0;
+
+    if (stateDef.doc) {
+      var sub = diagram.append('g').attr('id', stateDef.id).attr('class', 'stateGroup');
+      node = renderDoc(stateDef.doc, sub, stateDef.id, !altBkg);
+
+      if (first) {
+        // first = false;
+        sub = Object(_shapes__WEBPACK_IMPORTED_MODULE_7__["addTitleAndBox"])(sub, stateDef, altBkg);
+        var boxBounds = sub.node().getBBox();
+        node.width = boxBounds.width;
+        node.height = boxBounds.height + conf.padding / 2;
+        transformationLog[stateDef.id] = {
+          y: conf.compositTitleSize
+        };
+      } else {
+        // sub = addIdAndBox(sub, stateDef);
+        var _boxBounds = sub.node().getBBox();
+
+        node.width = _boxBounds.width;
+        node.height = _boxBounds.height; // transformationLog[stateDef.id] = { y: conf.compositTitleSize };
+      }
+    } else {
+      node = Object(_shapes__WEBPACK_IMPORTED_MODULE_7__["drawState"])(diagram, stateDef, graph);
+    }
+
+    if (stateDef.note) {
+      // Draw note note
+      var noteDef = {
+        descriptions: [],
+        id: stateDef.id + '-note',
+        note: stateDef.note,
+        type: 'note'
+      };
+      var note = Object(_shapes__WEBPACK_IMPORTED_MODULE_7__["drawState"])(diagram, noteDef, graph); // graph.setNode(node.id, node);
+
+      if (stateDef.note.position === 'left of') {
+        graph.setNode(node.id + '-note', note);
+        graph.setNode(node.id, node);
+      } else {
+        graph.setNode(node.id, node);
+        graph.setNode(node.id + '-note', note);
+      } // graph.setNode(node.id);
+
+
+      graph.setParent(node.id, node.id + '-group');
+      graph.setParent(node.id + '-note', node.id + '-group');
+    } else {
+      // Add nodes to the graph. The first argument is the node id. The second is
+      // metadata about the node. In this case we're going to add labels to each of
+      // our nodes.
+      graph.setNode(node.id, node);
+    }
+  }
+
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Count=', graph.nodeCount(), graph);
+  var cnt = 0;
+  relations.forEach(function (relation) {
+    cnt++;
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Setting edge', relation);
+    graph.setEdge(relation.id1, relation.id2, {
+      relation: relation,
+      width: getLabelWidth(relation.title),
+      height: conf.labelHeight * _common_common__WEBPACK_IMPORTED_MODULE_5__["default"].getRows(relation.title).length,
+      labelpos: 'c'
+    }, 'id' + cnt);
+  });
+  dagre__WEBPACK_IMPORTED_MODULE_1___default.a.layout(graph);
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Graph after layout', graph.nodes());
+  var svgElem = diagram.node();
+  graph.nodes().forEach(function (v) {
+    if (typeof v !== 'undefined' && typeof graph.node(v) !== 'undefined') {
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn('Node ' + v + ': ' + JSON.stringify(graph.node(v)));
+      Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + svgElem.id + ' #' + v).attr('transform', 'translate(' + (graph.node(v).x - graph.node(v).width / 2) + ',' + (graph.node(v).y + (transformationLog[v] ? transformationLog[v].y : 0) - graph.node(v).height / 2) + ' )');
+      Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + svgElem.id + ' #' + v).attr('data-x-shift', graph.node(v).x - graph.node(v).width / 2);
+      var dividers = document.querySelectorAll('#' + svgElem.id + ' #' + v + ' .divider');
+      dividers.forEach(function (divider) {
+        var parent = divider.parentElement;
+        var pWidth = 0;
+        var pShift = 0;
+
+        if (parent) {
+          if (parent.parentElement) pWidth = parent.parentElement.getBBox().width;
+          pShift = parseInt(parent.getAttribute('data-x-shift'), 10);
+
+          if (Number.isNaN(pShift)) {
+            pShift = 0;
+          }
+        }
+
+        divider.setAttribute('x1', 0 - pShift + 8);
+        divider.setAttribute('x2', pWidth - pShift - 8);
+      });
+    } else {
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('No Node ' + v + ': ' + JSON.stringify(graph.node(v)));
+    }
+  });
+  var stateBox = svgElem.getBBox();
+  graph.edges().forEach(function (e) {
+    if (typeof e !== 'undefined' && typeof graph.edge(e) !== 'undefined') {
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));
+      Object(_shapes__WEBPACK_IMPORTED_MODULE_7__["drawEdge"])(diagram, graph.edge(e), graph.edge(e).relation);
+    }
+  });
+  stateBox = svgElem.getBBox();
+  var stateInfo = {
+    id: parentId ? parentId : 'root',
+    label: parentId ? parentId : 'root',
+    width: 0,
+    height: 0
+  };
+  stateInfo.width = stateBox.width + 2 * conf.padding;
+  stateInfo.height = stateBox.height + 2 * conf.padding;
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Doc rendered', stateInfo, graph);
+  return stateInfo;
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/state/styles.js":
+/*!**************************************!*\
+  !*** ./src/diagrams/state/styles.js ***!
+  \**************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles(options) {
+  return "g.stateGroup text {\n  fill: ".concat(options.nodeBorder, ";\n  stroke: none;\n  font-size: 10px;\n}\ng.stateGroup text {\n  fill: ").concat(options.textColor, ";\n  stroke: none;\n  font-size: 10px;\n\n}\ng.stateGroup .state-title {\n  font-weight: bolder;\n  fill: ").concat(options.labelColor, ";\n}\n\ng.stateGroup rect {\n  fill: ").concat(options.mainBkg, ";\n  stroke: ").concat(options.nodeBorder, ";\n}\n\ng.stateGroup line {\n  stroke: ").concat(options.lineColor, ";\n  stroke-width: 1;\n}\n\n.transition {\n  stroke: ").concat(options.lineColor, ";\n  stroke-width: 1;\n  fill: none;\n}\n\n.stateGroup .composit {\n  fill: ").concat(options.background, ";\n  border-bottom: 1px\n}\n\n.stateGroup .alt-composit {\n  fill: #e0e0e0;\n  border-bottom: 1px\n}\n\n.state-note {\n  stroke: ").concat(options.noteBorderColor, ";\n  fill: ").concat(options.noteBkgColor, ";\n\n  text {\n    fill: black;\n    stroke: none;\n    font-size: 10px;\n  }\n}\n\n.stateLabel .box {\n  stroke: none;\n  stroke-width: 0;\n  fill: ").concat(options.mainBkg, ";\n  opacity: 0.5;\n}\n\n.edgeLabel .label rect {\n  fill: ").concat(options.tertiaryColor, ";\n  opacity: 0.5;\n}\n.edgeLabel .label text {\n  fill: ").concat(options.tertiaryTextColor, ";\n}\n.label div .edgeLabel {\n  color: ").concat(options.tertiaryTextColor, ";\n}\n\n.stateLabel text {\n  fill: ").concat(options.labelColor, ";\n  font-size: 10px;\n  font-weight: bold;\n}\n\n.node circle.state-start {\n  fill: ").concat(options.lineColor, ";\n  stroke: black;\n}\n.node circle.state-end {\n  fill: ").concat(options.primaryBorderColor, ";\n  stroke: ").concat(options.background, ";\n  stroke-width: 1.5\n}\n.end-state-inner {\n  fill: ").concat(options.background, ";\n  // stroke: ").concat(options.background, ";\n  stroke-width: 1.5\n}\n\n.node rect {\n  fill: ").concat(options.mainBkg, ";\n  stroke: ").concat(options.nodeBorder, ";\n  stroke-width: 1px;\n}\n#statediagram-barbEnd {\n  fill: ").concat(options.lineColor, ";\n}\n\n.statediagram-cluster rect {\n  fill: ").concat(options.mainBkg, ";\n  stroke: ").concat(options.nodeBorder, ";\n  stroke-width: 1px;\n}\n\n.cluster-label, .nodeLabel {\n  color: ").concat(options.textColor, ";\n}\n\n.statediagram-cluster rect.outer {\n  rx: 5px;\n  ry: 5px;\n}\n.statediagram-state .divider {\n  stroke: ").concat(options.nodeBorder, ";\n}\n\n.statediagram-state .title-state {\n  rx: 5px;\n  ry: 5px;\n}\n.statediagram-cluster.statediagram-cluster .inner {\n  fill: ").concat(options.background, ";\n}\n.statediagram-cluster.statediagram-cluster-alt .inner {\n  fill: #e0e0e0;\n}\n\n.statediagram-cluster .inner {\n  rx:0;\n  ry:0;\n}\n\n.statediagram-state rect.basic {\n  rx: 5px;\n  ry: 5px;\n}\n.statediagram-state rect.divider {\n  stroke-dasharray: 10,10;\n  fill: ").concat(options.altBackground ? options.altBackground : '#efefef', ";\n}\n\n.note-edge {\n  stroke-dasharray: 5;\n}\n\n.statediagram-note rect {\n  fill: ").concat(options.noteBkgColor, ";\n  stroke: ").concat(options.noteBorderColor, ";\n  stroke-width: 1px;\n  rx: 0;\n  ry: 0;\n}\n.statediagram-note rect {\n  fill: ").concat(options.noteBkgColor, ";\n  stroke: ").concat(options.noteBorderColor, ";\n  stroke-width: 1px;\n  rx: 0;\n  ry: 0;\n}\n\n.statediagram-note text {\n  fill: ").concat(options.noteTextColor, ";\n}\n\n.statediagram-note .nodeLabel {\n  color: ").concat(options.noteTextColor, ";\n}\n\n#dependencyStart, #dependencyEnd {\n  fill: ").concat(options.lineColor, ";\n  stroke: ").concat(options.lineColor, ";\n  stroke-width: 1;\n}\n");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/user-journey/journeyDb.js":
+/*!************************************************!*\
+  !*** ./src/diagrams/user-journey/journeyDb.js ***!
+  \************************************************/
+/*! exports provided: parseDirective, clear, setTitle, getTitle, addSection, getSections, getTasks, addTask, addTaskOrg, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "parseDirective", function() { return parseDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clear", function() { return clear; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setTitle", function() { return setTitle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTitle", function() { return getTitle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addSection", function() { return addSection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSections", function() { return getSections; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTasks", function() { return getTasks; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTask", function() { return addTask; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTaskOrg", function() { return addTaskOrg; });
+/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../mermaidAPI */ "./src/mermaidAPI.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../config */ "./src/config.js");
+function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
+
+function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
+
+function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
+
+function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
+
+
+
+var title = '';
+var currentSection = '';
+var sections = [];
+var tasks = [];
+var rawTasks = [];
+var parseDirective = function parseDirective(statement, context, type) {
+  _mermaidAPI__WEBPACK_IMPORTED_MODULE_0__["default"].parseDirective(this, statement, context, type);
+};
+var clear = function clear() {
+  sections.length = 0;
+  tasks.length = 0;
+  currentSection = '';
+  title = '';
+  rawTasks.length = 0;
+};
+var setTitle = function setTitle(txt) {
+  title = txt;
+};
+var getTitle = function getTitle() {
+  return title;
+};
+var addSection = function addSection(txt) {
+  currentSection = txt;
+  sections.push(txt);
+};
+var getSections = function getSections() {
+  return sections;
+};
+var getTasks = function getTasks() {
+  var allItemsProcessed = compileTasks();
+  var maxDepth = 100;
+  var iterationCount = 0;
+
+  while (!allItemsProcessed && iterationCount < maxDepth) {
+    allItemsProcessed = compileTasks();
+    iterationCount++;
+  }
+
+  tasks.push.apply(tasks, rawTasks);
+  return tasks;
+};
+
+var updateActors = function updateActors() {
+  var tempActors = [];
+  tasks.forEach(function (task) {
+    if (task.people) {
+      tempActors.push.apply(tempActors, _toConsumableArray(task.people));
+    }
+  });
+  var unique = new Set(tempActors);
+  return _toConsumableArray(unique).sort();
+};
+
+var addTask = function addTask(descr, taskData) {
+  var pieces = taskData.substr(1).split(':');
+  var score = 0;
+  var peeps = [];
+
+  if (pieces.length === 1) {
+    score = Number(pieces[0]);
+    peeps = [];
+  } else {
+    score = Number(pieces[0]);
+    peeps = pieces[1].split(',');
+  }
+
+  var peopleList = peeps.map(function (s) {
+    return s.trim();
+  });
+  var rawTask = {
+    section: currentSection,
+    type: currentSection,
+    people: peopleList,
+    task: descr,
+    score: score
+  };
+  rawTasks.push(rawTask);
+};
+var addTaskOrg = function addTaskOrg(descr) {
+  var newTask = {
+    section: currentSection,
+    type: currentSection,
+    description: descr,
+    task: descr,
+    classes: []
+  };
+  tasks.push(newTask);
+};
+
+var compileTasks = function compileTasks() {
+  var compileTask = function compileTask(pos) {
+    return rawTasks[pos].processed;
+  };
+
+  var allProcessed = true;
+
+  for (var i = 0; i < rawTasks.length; i++) {
+    compileTask(i);
+    allProcessed = allProcessed && rawTasks[i].processed;
+  }
+
+  return allProcessed;
+};
+
+var getActors = function getActors() {
+  return updateActors();
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  parseDirective: parseDirective,
+  getConfig: function getConfig() {
+    return _config__WEBPACK_IMPORTED_MODULE_1__["getConfig"]().journey;
+  },
+  clear: clear,
+  setTitle: setTitle,
+  getTitle: getTitle,
+  addSection: addSection,
+  getSections: getSections,
+  getTasks: getTasks,
+  addTask: addTask,
+  addTaskOrg: addTaskOrg,
+  getActors: getActors
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/user-journey/journeyRenderer.js":
+/*!******************************************************!*\
+  !*** ./src/diagrams/user-journey/journeyRenderer.js ***!
+  \******************************************************/
+/*! exports provided: setConf, draw, bounds, drawTasks, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bounds", function() { return bounds; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawTasks", function() { return drawTasks; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _parser_journey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./parser/journey */ "./src/diagrams/user-journey/parser/journey.jison");
+/* harmony import */ var _parser_journey__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_parser_journey__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _journeyDb__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./journeyDb */ "./src/diagrams/user-journey/journeyDb.js");
+/* harmony import */ var _svgDraw__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./svgDraw */ "./src/diagrams/user-journey/svgDraw.js");
+
+
+
+
+_parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy = _journeyDb__WEBPACK_IMPORTED_MODULE_2__["default"];
+var conf = {
+  leftMargin: 150,
+  diagramMarginX: 50,
+  diagramMarginY: 20,
+  // Margin between tasks
+  taskMargin: 50,
+  // Width of task boxes
+  width: 150,
+  // Height of task boxes
+  height: 50,
+  taskFontSize: 14,
+  taskFontFamily: '"Open-Sans", "sans-serif"',
+  // Margin around loop boxes
+  boxMargin: 10,
+  boxTextMargin: 5,
+  noteMargin: 10,
+  // Space between messages
+  messageMargin: 35,
+  // Multiline message alignment
+  messageAlign: 'center',
+  // Depending on css styling this might need adjustment
+  // Projects the edge of the diagram downwards
+  bottomMarginAdj: 1,
+  // width of activation box
+  activationWidth: 10,
+  // text placement as: tspan | fo | old only text as before
+  textPlacement: 'fo',
+  actorColours: ['#8FBC8F', '#7CFC00', '#00FFFF', '#20B2AA', '#B0E0E6', '#FFFFE0'],
+  sectionFills: ['#191970', '#8B008B', '#4B0082', '#2F4F4F', '#800000', '#8B4513', '#00008B'],
+  sectionColours: ['#fff']
+};
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+  keys.forEach(function (key) {
+    conf[key] = cnf[key];
+  });
+};
+var actors = {};
+
+function drawActorLegend(diagram) {
+  // Draw the actors
+  var yPos = 60;
+  Object.keys(actors).forEach(function (person) {
+    var colour = actors[person];
+    var circleData = {
+      cx: 20,
+      cy: yPos,
+      r: 7,
+      fill: colour,
+      stroke: '#000'
+    };
+    _svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].drawCircle(diagram, circleData);
+    var labelData = {
+      x: 40,
+      y: yPos + 7,
+      fill: '#666',
+      text: person,
+      textMargin: conf.boxTextMargin | 5
+    };
+    _svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].drawText(diagram, labelData);
+    yPos += 20;
+  });
+}
+
+var LEFT_MARGIN = conf.leftMargin;
+var draw = function draw(text, id) {
+  _parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.clear();
+  _parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].parse(text + '\n');
+  bounds.init();
+  var diagram = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + id);
+  diagram.attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');
+  _svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].initGraphics(diagram);
+  var tasks = _parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getTasks();
+  var title = _parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getTitle();
+  var actorNames = _parser_journey__WEBPACK_IMPORTED_MODULE_1__["parser"].yy.getActors();
+
+  for (var member in actors) {
+    delete actors[member];
+  }
+
+  var actorPos = 0;
+  actorNames.forEach(function (actorName) {
+    actors[actorName] = conf.actorColours[actorPos % conf.actorColours.length];
+    actorPos++;
+  });
+  drawActorLegend(diagram);
+  bounds.insert(0, 0, LEFT_MARGIN, Object.keys(actors).length * 50);
+  drawTasks(diagram, tasks, 0);
+  var box = bounds.getBounds();
+
+  if (title) {
+    diagram.append('text').text(title).attr('x', LEFT_MARGIN).attr('font-size', '4ex').attr('font-weight', 'bold').attr('y', 25);
+  }
+
+  var height = box.stopy - box.starty + 2 * conf.diagramMarginY;
+  var width = LEFT_MARGIN + box.stopx + 2 * conf.diagramMarginX;
+
+  if (conf.useMaxWidth) {
+    diagram.attr('height', '100%');
+    diagram.attr('width', '100%');
+    diagram.attr('style', 'max-width:' + width + 'px;');
+  } else {
+    diagram.attr('height', height);
+    diagram.attr('width', width);
+  } // Draw activity line
+
+
+  diagram.append('line').attr('x1', LEFT_MARGIN).attr('y1', conf.height * 4) // One section head + one task + margins
+  .attr('x2', width - LEFT_MARGIN - 4) // Subtract stroke width so arrow point is retained
+  .attr('y2', conf.height * 4).attr('stroke-width', 4).attr('stroke', 'black').attr('marker-end', 'url(#arrowhead)');
+  var extraVertForTitle = title ? 70 : 0;
+  diagram.attr('viewBox', "".concat(box.startx, " -25 ").concat(width, " ").concat(height + extraVertForTitle));
+  diagram.attr('preserveAspectRatio', 'xMinYMin meet');
+};
+var bounds = {
+  data: {
+    startx: undefined,
+    stopx: undefined,
+    starty: undefined,
+    stopy: undefined
+  },
+  verticalPos: 0,
+  sequenceItems: [],
+  init: function init() {
+    this.sequenceItems = [];
+    this.data = {
+      startx: undefined,
+      stopx: undefined,
+      starty: undefined,
+      stopy: undefined
+    };
+    this.verticalPos = 0;
+  },
+  updateVal: function updateVal(obj, key, val, fun) {
+    if (typeof obj[key] === 'undefined') {
+      obj[key] = val;
+    } else {
+      obj[key] = fun(val, obj[key]);
+    }
+  },
+  updateBounds: function updateBounds(startx, starty, stopx, stopy) {
+    var _self = this;
+
+    var cnt = 0;
+
+    function updateFn(type) {
+      return function updateItemBounds(item) {
+        cnt++; // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems
+
+        var n = _self.sequenceItems.length - cnt + 1;
+
+        _self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min);
+
+        _self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max);
+
+        _self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min);
+
+        _self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max);
+
+        if (!(type === 'activation')) {
+          _self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min);
+
+          _self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max);
+
+          _self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min);
+
+          _self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max);
+        }
+      };
+    }
+
+    this.sequenceItems.forEach(updateFn());
+  },
+  insert: function insert(startx, starty, stopx, stopy) {
+    var _startx = Math.min(startx, stopx);
+
+    var _stopx = Math.max(startx, stopx);
+
+    var _starty = Math.min(starty, stopy);
+
+    var _stopy = Math.max(starty, stopy);
+
+    this.updateVal(bounds.data, 'startx', _startx, Math.min);
+    this.updateVal(bounds.data, 'starty', _starty, Math.min);
+    this.updateVal(bounds.data, 'stopx', _stopx, Math.max);
+    this.updateVal(bounds.data, 'stopy', _stopy, Math.max);
+    this.updateBounds(_startx, _starty, _stopx, _stopy);
+  },
+  bumpVerticalPos: function bumpVerticalPos(bump) {
+    this.verticalPos = this.verticalPos + bump;
+    this.data.stopy = this.verticalPos;
+  },
+  getVerticalPos: function getVerticalPos() {
+    return this.verticalPos;
+  },
+  getBounds: function getBounds() {
+    return this.data;
+  }
+};
+var fills = conf.sectionFills;
+var textColours = conf.sectionColours;
+var drawTasks = function drawTasks(diagram, tasks, verticalPos) {
+  var lastSection = '';
+  var sectionVHeight = conf.height * 2 + conf.diagramMarginY;
+  var taskPos = verticalPos + sectionVHeight;
+  var sectionNumber = 0;
+  var fill = '#CCC';
+  var colour = 'black';
+  var num = 0; // Draw the tasks
+
+  for (var i = 0; i < tasks.length; i++) {
+    var task = tasks[i];
+
+    if (lastSection !== task.section) {
+      fill = fills[sectionNumber % fills.length];
+      num = sectionNumber % fills.length;
+      colour = textColours[sectionNumber % textColours.length];
+      var section = {
+        x: i * conf.taskMargin + i * conf.width + LEFT_MARGIN,
+        y: 50,
+        text: task.section,
+        fill: fill,
+        num: num,
+        colour: colour
+      };
+      _svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].drawSection(diagram, section, conf);
+      lastSection = task.section;
+      sectionNumber++;
+    } // Collect the actors involved in the task
+
+
+    var taskActors = task.people.reduce(function (acc, actorName) {
+      if (actors[actorName]) {
+        acc[actorName] = actors[actorName];
+      }
+
+      return acc;
+    }, {}); // Add some rendering data to the object
+
+    task.x = i * conf.taskMargin + i * conf.width + LEFT_MARGIN;
+    task.y = taskPos;
+    task.width = conf.diagramMarginX;
+    task.height = conf.diagramMarginY;
+    task.colour = colour;
+    task.fill = fill;
+    task.num = num;
+    task.actors = taskActors; // Draw the box with the attached line
+
+    _svgDraw__WEBPACK_IMPORTED_MODULE_3__["default"].drawTask(diagram, task, conf);
+    bounds.insert(task.x, task.y, task.x + task.width + conf.taskMargin, 300 + 5 * 30); // stopy is the length of the descenders.
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/diagrams/user-journey/parser/journey.jison":
+/*!********************************************************!*\
+  !*** ./src/diagrams/user-journey/parser/journey.jison ***!
+  \********************************************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(process, module) {/* parser generated by jison 0.4.18 */
+/*
+  Returns a Parser object of the following structure:
+
+  Parser: {
+    yy: {}
+  }
+
+  Parser.prototype: {
+    yy: {},
+    trace: function(),
+    symbols_: {associative list: name ==> number},
+    terminals_: {associative list: number ==> name},
+    productions_: [...],
+    performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+    table: [...],
+    defaultActions: {...},
+    parseError: function(str, hash),
+    parse: function(input),
+
+    lexer: {
+        EOF: 1,
+        parseError: function(str, hash),
+        setInput: function(input),
+        input: function(),
+        unput: function(str),
+        more: function(),
+        less: function(n),
+        pastInput: function(),
+        upcomingInput: function(),
+        showPosition: function(),
+        test_match: function(regex_match_array, rule_index),
+        next: function(),
+        lex: function(),
+        begin: function(condition),
+        popState: function(),
+        _currentRules: function(),
+        topState: function(),
+        pushState: function(condition),
+
+        options: {
+            ranges: boolean           (optional: true ==> token location info will include a .range[] member)
+            flex: boolean             (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+            backtrack_lexer: boolean  (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+        },
+
+        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+        rules: [...],
+        conditions: {associative list: name ==> set},
+    }
+  }
+
+
+  token location info (@$, _$, etc.): {
+    first_line: n,
+    last_line: n,
+    first_column: n,
+    last_column: n,
+    range: [start_number, end_number]       (where the numbers are indexes into the input string, regular zero-based)
+  }
+
+
+  the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+    text:        (matched text)
+    token:       (the produced terminal token, if any)
+    line:        (yylineno)
+  }
+  while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+    loc:         (yylloc)
+    expected:    (string describing the set of expected tokens)
+    recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+  }
+*/
+var parser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,2],$V1=[1,5],$V2=[6,9,11,17,18,19,21],$V3=[1,15],$V4=[1,16],$V5=[1,17],$V6=[1,21],$V7=[4,6,9,11,17,18,19,21];
+var parser = {trace: function trace () { },
+yy: {},
+symbols_: {"error":2,"start":3,"journey":4,"document":5,"EOF":6,"directive":7,"line":8,"SPACE":9,"statement":10,"NEWLINE":11,"openDirective":12,"typeDirective":13,"closeDirective":14,":":15,"argDirective":16,"title":17,"section":18,"taskName":19,"taskData":20,"open_directive":21,"type_directive":22,"arg_directive":23,"close_directive":24,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"journey",6:"EOF",9:"SPACE",11:"NEWLINE",15:":",17:"title",18:"section",19:"taskName",20:"taskData",21:"open_directive",22:"type_directive",23:"arg_directive",24:"close_directive"},
+productions_: [0,[3,3],[3,2],[5,0],[5,2],[8,2],[8,1],[8,1],[8,1],[7,4],[7,6],[10,1],[10,1],[10,2],[10,1],[12,1],[13,1],[16,1],[14,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1:
+ return $$[$0-1]; 
+break;
+case 3:
+ this.$ = [] 
+break;
+case 4:
+$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
+break;
+case 5: case 6:
+ this.$ = $$[$0] 
+break;
+case 7: case 8:
+ this.$=[];
+break;
+case 11:
+yy.setTitle($$[$0].substr(6));this.$=$$[$0].substr(6);
+break;
+case 12:
+yy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);
+break;
+case 13:
+yy.addTask($$[$0-1], $$[$0]);this.$='task';
+break;
+case 15:
+ yy.parseDirective('%%{', 'open_directive'); 
+break;
+case 16:
+ yy.parseDirective($$[$0], 'type_directive'); 
+break;
+case 17:
+ $$[$0] = $$[$0].trim().replace(/'/g, '"'); yy.parseDirective($$[$0], 'arg_directive'); 
+break;
+case 18:
+ yy.parseDirective('}%%', 'close_directive', 'journey'); 
+break;
+}
+},
+table: [{3:1,4:$V0,7:3,12:4,21:$V1},{1:[3]},o($V2,[2,3],{5:6}),{3:7,4:$V0,7:3,12:4,21:$V1},{13:8,22:[1,9]},{22:[2,15]},{6:[1,10],7:18,8:11,9:[1,12],10:13,11:[1,14],12:4,17:$V3,18:$V4,19:$V5,21:$V1},{1:[2,2]},{14:19,15:[1,20],24:$V6},o([15,24],[2,16]),o($V2,[2,8],{1:[2,1]}),o($V2,[2,4]),{7:18,10:22,12:4,17:$V3,18:$V4,19:$V5,21:$V1},o($V2,[2,6]),o($V2,[2,7]),o($V2,[2,11]),o($V2,[2,12]),{20:[1,23]},o($V2,[2,14]),{11:[1,24]},{16:25,23:[1,26]},{11:[2,18]},o($V2,[2,5]),o($V2,[2,13]),o($V7,[2,9]),{14:27,24:$V6},{24:[2,17]},{11:[1,28]},o($V7,[2,10])],
+defaultActions: {5:[2,15],7:[2,2],21:[2,18],26:[2,17]},
+parseError: function parseError (str, hash) {
+    if (hash.recoverable) {
+        this.trace(str);
+    } else {
+        var error = new Error(str);
+        error.hash = hash;
+        throw error;
+    }
+},
+parse: function parse(input) {
+    var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+    var args = lstack.slice.call(arguments, 1);
+    var lexer = Object.create(this.lexer);
+    var sharedState = { yy: {} };
+    for (var k in this.yy) {
+        if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+            sharedState.yy[k] = this.yy[k];
+        }
+    }
+    lexer.setInput(input, sharedState.yy);
+    sharedState.yy.lexer = lexer;
+    sharedState.yy.parser = this;
+    if (typeof lexer.yylloc == 'undefined') {
+        lexer.yylloc = {};
+    }
+    var yyloc = lexer.yylloc;
+    lstack.push(yyloc);
+    var ranges = lexer.options && lexer.options.ranges;
+    if (typeof sharedState.yy.parseError === 'function') {
+        this.parseError = sharedState.yy.parseError;
+    } else {
+        this.parseError = Object.getPrototypeOf(this).parseError;
+    }
+    function popStack(n) {
+        stack.length = stack.length - 2 * n;
+        vstack.length = vstack.length - n;
+        lstack.length = lstack.length - n;
+    }
+            function lex() {
+            var token;
+            token = tstack.pop() || lexer.lex() || EOF;
+            if (typeof token !== 'number') {
+                if (token instanceof Array) {
+                    tstack = token;
+                    token = tstack.pop();
+                }
+                token = self.symbols_[token] || token;
+            }
+            return token;
+        }
+    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+    while (true) {
+        state = stack[stack.length - 1];
+        if (this.defaultActions[state]) {
+            action = this.defaultActions[state];
+        } else {
+            if (symbol === null || typeof symbol == 'undefined') {
+                symbol = lex();
+            }
+            action = table[state] && table[state][symbol];
+        }
+        if (typeof action === 'undefined' || !action.length || !action[0]) {
+            var errStr = '';
+            expected = [];
+            for (p in table[state]) {
+                if (this.terminals_[p] && p > TERROR) {
+                    expected.push('\'' + this.terminals_[p] + '\'');
+                }
+            }
+            if (lexer.showPosition) {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+            } else {
+                errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+            }
+            this.parseError(errStr, {
+                text: lexer.match,
+                token: this.terminals_[symbol] || symbol,
+                line: lexer.yylineno,
+                loc: yyloc,
+                expected: expected
+            });
+        }
+        if (action[0] instanceof Array && action.length > 1) {
+            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+        }
+        switch (action[0]) {
+        case 1:
+            stack.push(symbol);
+            vstack.push(lexer.yytext);
+            lstack.push(lexer.yylloc);
+            stack.push(action[1]);
+            symbol = null;
+            if (!preErrorSymbol) {
+                yyleng = lexer.yyleng;
+                yytext = lexer.yytext;
+                yylineno = lexer.yylineno;
+                yyloc = lexer.yylloc;
+                if (recovering > 0) {
+                    recovering--;
+                }
+            } else {
+                symbol = preErrorSymbol;
+                preErrorSymbol = null;
+            }
+            break;
+        case 2:
+            len = this.productions_[action[1]][1];
+            yyval.$ = vstack[vstack.length - len];
+            yyval._$ = {
+                first_line: lstack[lstack.length - (len || 1)].first_line,
+                last_line: lstack[lstack.length - 1].last_line,
+                first_column: lstack[lstack.length - (len || 1)].first_column,
+                last_column: lstack[lstack.length - 1].last_column
+            };
+            if (ranges) {
+                yyval._$.range = [
+                    lstack[lstack.length - (len || 1)].range[0],
+                    lstack[lstack.length - 1].range[1]
+                ];
+            }
+            r = this.performAction.apply(yyval, [
+                yytext,
+                yyleng,
+                yylineno,
+                sharedState.yy,
+                action[1],
+                vstack,
+                lstack
+            ].concat(args));
+            if (typeof r !== 'undefined') {
+                return r;
+            }
+            if (len) {
+                stack = stack.slice(0, -1 * len * 2);
+                vstack = vstack.slice(0, -1 * len);
+                lstack = lstack.slice(0, -1 * len);
+            }
+            stack.push(this.productions_[action[1]][0]);
+            vstack.push(yyval.$);
+            lstack.push(yyval._$);
+            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+            stack.push(newState);
+            break;
+        case 3:
+            return true;
+        }
+    }
+    return true;
+}};
+
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+        if (this.yy.parser) {
+            this.yy.parser.parseError(str, hash);
+        } else {
+            throw new Error(str);
+        }
+    },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+        this.yy = yy || this.yy || {};
+        this._input = input;
+        this._more = this._backtrack = this.done = false;
+        this.yylineno = this.yyleng = 0;
+        this.yytext = this.matched = this.match = '';
+        this.conditionStack = ['INITIAL'];
+        this.yylloc = {
+            first_line: 1,
+            first_column: 0,
+            last_line: 1,
+            last_column: 0
+        };
+        if (this.options.ranges) {
+            this.yylloc.range = [0,0];
+        }
+        this.offset = 0;
+        return this;
+    },
+
+// consumes and returns one char from the input
+input:function () {
+        var ch = this._input[0];
+        this.yytext += ch;
+        this.yyleng++;
+        this.offset++;
+        this.match += ch;
+        this.matched += ch;
+        var lines = ch.match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno++;
+            this.yylloc.last_line++;
+        } else {
+            this.yylloc.last_column++;
+        }
+        if (this.options.ranges) {
+            this.yylloc.range[1]++;
+        }
+
+        this._input = this._input.slice(1);
+        return ch;
+    },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+        var len = ch.length;
+        var lines = ch.split(/(?:\r\n?|\n)/g);
+
+        this._input = ch + this._input;
+        this.yytext = this.yytext.substr(0, this.yytext.length - len);
+        //this.yyleng -= len;
+        this.offset -= len;
+        var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+        this.match = this.match.substr(0, this.match.length - 1);
+        this.matched = this.matched.substr(0, this.matched.length - 1);
+
+        if (lines.length - 1) {
+            this.yylineno -= lines.length - 1;
+        }
+        var r = this.yylloc.range;
+
+        this.yylloc = {
+            first_line: this.yylloc.first_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.first_column,
+            last_column: lines ?
+                (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+                 + oldLines[oldLines.length - lines.length].length - lines[0].length :
+              this.yylloc.first_column - len
+        };
+
+        if (this.options.ranges) {
+            this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+        }
+        this.yyleng = this.yytext.length;
+        return this;
+    },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+        this._more = true;
+        return this;
+    },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+        if (this.options.backtrack_lexer) {
+            this._backtrack = true;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+
+        }
+        return this;
+    },
+
+// retain first n characters of the match
+less:function (n) {
+        this.unput(this.match.slice(n));
+    },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+        var past = this.matched.substr(0, this.matched.length - this.match.length);
+        return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+    },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+        var next = this.match;
+        if (next.length < 20) {
+            next += this._input.substr(0, 20-next.length);
+        }
+        return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+    },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+        var pre = this.pastInput();
+        var c = new Array(pre.length + 1).join("-");
+        return pre + this.upcomingInput() + "\n" + c + "^";
+    },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function(match, indexed_rule) {
+        var token,
+            lines,
+            backup;
+
+        if (this.options.backtrack_lexer) {
+            // save context
+            backup = {
+                yylineno: this.yylineno,
+                yylloc: {
+                    first_line: this.yylloc.first_line,
+                    last_line: this.last_line,
+                    first_column: this.yylloc.first_column,
+                    last_column: this.yylloc.last_column
+                },
+                yytext: this.yytext,
+                match: this.match,
+                matches: this.matches,
+                matched: this.matched,
+                yyleng: this.yyleng,
+                offset: this.offset,
+                _more: this._more,
+                _input: this._input,
+                yy: this.yy,
+                conditionStack: this.conditionStack.slice(0),
+                done: this.done
+            };
+            if (this.options.ranges) {
+                backup.yylloc.range = this.yylloc.range.slice(0);
+            }
+        }
+
+        lines = match[0].match(/(?:\r\n?|\n).*/g);
+        if (lines) {
+            this.yylineno += lines.length;
+        }
+        this.yylloc = {
+            first_line: this.yylloc.last_line,
+            last_line: this.yylineno + 1,
+            first_column: this.yylloc.last_column,
+            last_column: lines ?
+                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+                         this.yylloc.last_column + match[0].length
+        };
+        this.yytext += match[0];
+        this.match += match[0];
+        this.matches = match;
+        this.yyleng = this.yytext.length;
+        if (this.options.ranges) {
+            this.yylloc.range = [this.offset, this.offset += this.yyleng];
+        }
+        this._more = false;
+        this._backtrack = false;
+        this._input = this._input.slice(match[0].length);
+        this.matched += match[0];
+        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+        if (this.done && this._input) {
+            this.done = false;
+        }
+        if (token) {
+            return token;
+        } else if (this._backtrack) {
+            // recover context
+            for (var k in backup) {
+                this[k] = backup[k];
+            }
+            return false; // rule action called reject() implying the next rule should be tested instead.
+        }
+        return false;
+    },
+
+// return next match in input
+next:function () {
+        if (this.done) {
+            return this.EOF;
+        }
+        if (!this._input) {
+            this.done = true;
+        }
+
+        var token,
+            match,
+            tempMatch,
+            index;
+        if (!this._more) {
+            this.yytext = '';
+            this.match = '';
+        }
+        var rules = this._currentRules();
+        for (var i = 0; i < rules.length; i++) {
+            tempMatch = this._input.match(this.rules[rules[i]]);
+            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+                match = tempMatch;
+                index = i;
+                if (this.options.backtrack_lexer) {
+                    token = this.test_match(tempMatch, rules[i]);
+                    if (token !== false) {
+                        return token;
+                    } else if (this._backtrack) {
+                        match = false;
+                        continue; // rule action called reject() implying a rule MISmatch.
+                    } else {
+                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+                        return false;
+                    }
+                } else if (!this.options.flex) {
+                    break;
+                }
+            }
+        }
+        if (match) {
+            token = this.test_match(match, rules[index]);
+            if (token !== false) {
+                return token;
+            }
+            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+            return false;
+        }
+        if (this._input === "") {
+            return this.EOF;
+        } else {
+            return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+                text: "",
+                token: null,
+                line: this.yylineno
+            });
+        }
+    },
+
+// return next match that has a token
+lex:function lex () {
+        var r = this.next();
+        if (r) {
+            return r;
+        } else {
+            return this.lex();
+        }
+    },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin (condition) {
+        this.conditionStack.push(condition);
+    },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState () {
+        var n = this.conditionStack.length - 1;
+        if (n > 0) {
+            return this.conditionStack.pop();
+        } else {
+            return this.conditionStack[0];
+        }
+    },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules () {
+        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+        } else {
+            return this.conditions["INITIAL"].rules;
+        }
+    },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState (n) {
+        n = this.conditionStack.length - 1 - Math.abs(n || 0);
+        if (n >= 0) {
+            return this.conditionStack[n];
+        } else {
+            return "INITIAL";
+        }
+    },
+
+// alias for begin(condition)
+pushState:function pushState (condition) {
+        this.begin(condition);
+    },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+        return this.conditionStack.length;
+    },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0: this.begin('open_directive'); return 21; 
+break;
+case 1: this.begin('type_directive'); return 22; 
+break;
+case 2: this.popState(); this.begin('arg_directive'); return 15; 
+break;
+case 3: this.popState(); this.popState(); return 24; 
+break;
+case 4:return 23;
+break;
+case 5:/* skip comments */
+break;
+case 6:/* skip comments */
+break;
+case 7:return 11;
+break;
+case 8:/* skip whitespace */
+break;
+case 9:/* skip comments */
+break;
+case 10:return 4;
+break;
+case 11:return 17;
+break;
+case 12:return 18;
+break;
+case 13:return 19;
+break;
+case 14:return 20;
+break;
+case 15:return 15;
+break;
+case 16:return 6;
+break;
+case 17:return 'INVALID';
+break;
+}
+},
+rules: [/^(?:%%\{)/i,/^(?:((?:(?!\}%%)[^:.])*))/i,/^(?::)/i,/^(?:\}%%)/i,/^(?:((?:(?!\}%%).|\n)*))/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],
+conditions: {"open_directive":{"rules":[1],"inclusive":false},"type_directive":{"rules":[2,3],"inclusive":false},"arg_directive":{"rules":[3,4],"inclusive":false},"INITIAL":{"rules":[0,5,6,7,8,9,10,11,12,13,14,15,16,17],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+  this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+
+if (true) {
+exports.parser = parser;
+exports.Parser = parser.Parser;
+exports.parse = function () { return parser.parse.apply(parser, arguments); };
+exports.main = function commonjsMain (args) {
+    if (!args[1]) {
+        console.log('Usage: '+args[0]+' FILE');
+        process.exit(1);
+    }
+    var source = __webpack_require__(/*! fs */ "./node_modules/node-libs-browser/mock/empty.js").readFileSync(__webpack_require__(/*! path */ "./node_modules/path-browserify/index.js").normalize(args[1]), "utf8");
+    return exports.parser.parse(source);
+};
+if ( true && __webpack_require__.c[__webpack_require__.s] === module) {
+  exports.main(process.argv.slice(1));
+}
+}
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/process/browser.js */ "./node_modules/process/browser.js"), __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js")(module)))
+
+/***/ }),
+
+/***/ "./src/diagrams/user-journey/styles.js":
+/*!*********************************************!*\
+  !*** ./src/diagrams/user-journey/styles.js ***!
+  \*********************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var getStyles = function getStyles(options) {
+  return ".label {\n    font-family: 'trebuchet ms', verdana, arial;\n    font-family: var(--mermaid-font-family);\n    color: ".concat(options.textColor, ";\n  }\n  .mouth {\n    stroke: #666;\n  }\n\n  line {\n    stroke: ").concat(options.textColor, "\n  }\n\n  .legend {\n    fill: ").concat(options.textColor, ";\n  }\n\n  .label text {\n    fill: #333;\n  }\n  .label {\n    color: ").concat(options.textColor, "\n  }\n\n  .face {\n    fill: #FFF8DC;\n    stroke: #999;\n  }\n\n  .node rect,\n  .node circle,\n  .node ellipse,\n  .node polygon,\n  .node path {\n    fill: ").concat(options.mainBkg, ";\n    stroke: ").concat(options.nodeBorder, ";\n    stroke-width: 1px;\n  }\n\n  .node .label {\n    text-align: center;\n  }\n  .node.clickable {\n    cursor: pointer;\n  }\n\n  .arrowheadPath {\n    fill: ").concat(options.arrowheadColor, ";\n  }\n\n  .edgePath .path {\n    stroke: ").concat(options.lineColor, ";\n    stroke-width: 1.5px;\n  }\n\n  .flowchart-link {\n    stroke: ").concat(options.lineColor, ";\n    fill: none;\n  }\n\n  .edgeLabel {\n    background-color: ").concat(options.edgeLabelBackground, ";\n    rect {\n      opacity: 0.5;\n    }\n    text-align: center;\n  }\n\n  .cluster rect {\n  }\n\n  .cluster text {\n    fill: ").concat(options.titleColor, ";\n  }\n\n  div.mermaidTooltip {\n    position: absolute;\n    text-align: center;\n    max-width: 200px;\n    padding: 2px;\n    font-family: 'trebuchet ms', verdana, arial;\n    font-family: var(--mermaid-font-family);\n    font-size: 12px;\n    background: ").concat(options.tertiaryColor, ";\n    border: 1px solid ").concat(options.border2, ";\n    border-radius: 2px;\n    pointer-events: none;\n    z-index: 100;\n  }\n\n  .task-type-0, .section-type-0  {\n    ").concat(options.fillType0 ? "fill: ".concat(options.fillType0) : '', ";\n  }\n  .task-type-1, .section-type-1  {\n    ").concat(options.fillType0 ? "fill: ".concat(options.fillType1) : '', ";\n  }\n  .task-type-2, .section-type-2  {\n    ").concat(options.fillType0 ? "fill: ".concat(options.fillType2) : '', ";\n  }\n  .task-type-3, .section-type-3  {\n    ").concat(options.fillType0 ? "fill: ".concat(options.fillType3) : '', ";\n  }\n  .task-type-4, .section-type-4  {\n    ").concat(options.fillType0 ? "fill: ".concat(options.fillType4) : '', ";\n  }\n  .task-type-5, .section-type-5  {\n    ").concat(options.fillType0 ? "fill: ".concat(options.fillType5) : '', ";\n  }\n  .task-type-6, .section-type-6  {\n    ").concat(options.fillType0 ? "fill: ".concat(options.fillType6) : '', ";\n  }\n  .task-type-7, .section-type-7  {\n    ").concat(options.fillType0 ? "fill: ".concat(options.fillType7) : '', ";\n  }\n");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/diagrams/user-journey/svgDraw.js":
+/*!**********************************************!*\
+  !*** ./src/diagrams/user-journey/svgDraw.js ***!
+  \**********************************************/
+/*! exports provided: drawRect, drawFace, drawCircle, drawText, drawLabel, drawSection, drawTask, drawBackgroundRect, getTextObj, getNoteRect, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawRect", function() { return drawRect; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawFace", function() { return drawFace; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawCircle", function() { return drawCircle; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawText", function() { return drawText; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawLabel", function() { return drawLabel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawSection", function() { return drawSection; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawTask", function() { return drawTask; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawBackgroundRect", function() { return drawBackgroundRect; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTextObj", function() { return getTextObj; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNoteRect", function() { return getNoteRect; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+
+var drawRect = function drawRect(elem, rectData) {
+  var rectElem = elem.append('rect');
+  rectElem.attr('x', rectData.x);
+  rectElem.attr('y', rectData.y);
+  rectElem.attr('fill', rectData.fill);
+  rectElem.attr('stroke', rectData.stroke);
+  rectElem.attr('width', rectData.width);
+  rectElem.attr('height', rectData.height);
+  rectElem.attr('rx', rectData.rx);
+  rectElem.attr('ry', rectData.ry);
+
+  if (typeof rectData.class !== 'undefined') {
+    rectElem.attr('class', rectData.class);
+  }
+
+  return rectElem;
+};
+var drawFace = function drawFace(element, faceData) {
+  var radius = 15;
+  var circleElement = element.append('circle').attr('cx', faceData.cx).attr('cy', faceData.cy).attr('class', 'face').attr('r', radius).attr('stroke-width', 2).attr('overflow', 'visible');
+  var face = element.append('g'); //left eye
+
+  face.append('circle').attr('cx', faceData.cx - radius / 3).attr('cy', faceData.cy - radius / 3).attr('r', 1.5).attr('stroke-width', 2).attr('fill', '#666').attr('stroke', '#666'); //right eye
+
+  face.append('circle').attr('cx', faceData.cx + radius / 3).attr('cy', faceData.cy - radius / 3).attr('r', 1.5).attr('stroke-width', 2).attr('fill', '#666').attr('stroke', '#666');
+
+  function smile(face) {
+    var arc = Object(d3__WEBPACK_IMPORTED_MODULE_0__["arc"])().startAngle(Math.PI / 2).endAngle(3 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); //mouth
+
+    face.append('path').attr('class', 'mouth').attr('d', arc).attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 2) + ')');
+  }
+
+  function sad(face) {
+    var arc = Object(d3__WEBPACK_IMPORTED_MODULE_0__["arc"])().startAngle(3 * Math.PI / 2).endAngle(5 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2); //mouth
+
+    face.append('path').attr('class', 'mouth').attr('d', arc).attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 7) + ')');
+  }
+
+  function ambivalent(face) {
+    face.append('line').attr('class', 'mouth').attr('stroke', 2).attr('x1', faceData.cx - 5).attr('y1', faceData.cy + 7).attr('x2', faceData.cx + 5).attr('y2', faceData.cy + 7).attr('class', 'mouth').attr('stroke-width', '1px').attr('stroke', '#666');
+  }
+
+  if (faceData.score > 3) {
+    smile(face);
+  } else if (faceData.score < 3) {
+    sad(face);
+  } else {
+    ambivalent(face);
+  }
+
+  return circleElement;
+};
+var drawCircle = function drawCircle(element, circleData) {
+  var circleElement = element.append('circle');
+  circleElement.attr('cx', circleData.cx);
+  circleElement.attr('cy', circleData.cy);
+  circleElement.attr('fill', circleData.fill);
+  circleElement.attr('stroke', circleData.stroke);
+  circleElement.attr('r', circleData.r);
+
+  if (typeof circleElement.class !== 'undefined') {
+    circleElement.attr('class', circleElement.class);
+  }
+
+  if (typeof circleData.title !== 'undefined') {
+    circleElement.append('title').text(circleData.title);
+  }
+
+  return circleElement;
+};
+var drawText = function drawText(elem, textData) {
+  // Remove and ignore br:s
+  var nText = textData.text.replace(/<br\s*\/?>/gi, ' ');
+  var textElem = elem.append('text');
+  textElem.attr('x', textData.x);
+  textElem.attr('y', textData.y);
+  textElem.attr('class', 'legend');
+  textElem.style('text-anchor', textData.anchor);
+
+  if (typeof textData.class !== 'undefined') {
+    textElem.attr('class', textData.class);
+  }
+
+  var span = textElem.append('tspan');
+  span.attr('x', textData.x + textData.textMargin * 2);
+  span.text(nText);
+  return textElem;
+};
+var drawLabel = function drawLabel(elem, txtObject) {
+  function genPoints(x, y, width, height, cut) {
+    return x + ',' + y + ' ' + (x + width) + ',' + y + ' ' + (x + width) + ',' + (y + height - cut) + ' ' + (x + width - cut * 1.2) + ',' + (y + height) + ' ' + x + ',' + (y + height);
+  }
+
+  var polygon = elem.append('polygon');
+  polygon.attr('points', genPoints(txtObject.x, txtObject.y, 50, 20, 7));
+  polygon.attr('class', 'labelBox');
+  txtObject.y = txtObject.y + txtObject.labelMargin;
+  txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin;
+  drawText(elem, txtObject);
+};
+var drawSection = function drawSection(elem, section, conf) {
+  var g = elem.append('g');
+  var rect = getNoteRect();
+  rect.x = section.x;
+  rect.y = section.y;
+  rect.fill = section.fill;
+  rect.width = conf.width;
+  rect.height = conf.height;
+  rect.class = 'journey-section section-type-' + section.num;
+  rect.rx = 3;
+  rect.ry = 3;
+  drawRect(g, rect);
+
+  _drawTextCandidateFunc(conf)(section.text, g, rect.x, rect.y, rect.width, rect.height, {
+    class: 'journey-section section-type-' + section.num
+  }, conf, section.colour);
+};
+var taskCount = -1;
+/**
+ * Draws an actor in the diagram with the attaced line
+ * @param elem The HTML element
+ * @param task The task to render
+ * @param conf The global configuration
+ */
+
+var drawTask = function drawTask(elem, task, conf) {
+  var center = task.x + conf.width / 2;
+  var g = elem.append('g');
+  taskCount++;
+  var maxHeight = 300 + 5 * 30;
+  g.append('line').attr('id', 'task' + taskCount).attr('x1', center).attr('y1', task.y).attr('x2', center).attr('y2', maxHeight).attr('class', 'task-line').attr('stroke-width', '1px').attr('stroke-dasharray', '4 2').attr('stroke', '#666');
+  drawFace(g, {
+    cx: center,
+    cy: 300 + (5 - task.score) * 30,
+    score: task.score
+  });
+  var rect = getNoteRect();
+  rect.x = task.x;
+  rect.y = task.y;
+  rect.fill = task.fill;
+  rect.width = conf.width;
+  rect.height = conf.height;
+  rect.class = 'task task-type-' + task.num;
+  rect.rx = 3;
+  rect.ry = 3;
+  drawRect(g, rect);
+  var xPos = task.x + 14;
+  task.people.forEach(function (person) {
+    var colour = task.actors[person];
+    var circle = {
+      cx: xPos,
+      cy: task.y,
+      r: 7,
+      fill: colour,
+      stroke: '#000',
+      title: person
+    };
+    drawCircle(g, circle);
+    xPos += 10;
+  });
+
+  _drawTextCandidateFunc(conf)(task.task, g, rect.x, rect.y, rect.width, rect.height, {
+    class: 'task'
+  }, conf, task.colour);
+};
+/**
+ * Draws a background rectangle
+ * @param elem The html element
+ * @param bounds The bounds of the drawing
+ */
+
+var drawBackgroundRect = function drawBackgroundRect(elem, bounds) {
+  var rectElem = drawRect(elem, {
+    x: bounds.startx,
+    y: bounds.starty,
+    width: bounds.stopx - bounds.startx,
+    height: bounds.stopy - bounds.starty,
+    fill: bounds.fill,
+    class: 'rect'
+  });
+  rectElem.lower();
+};
+var getTextObj = function getTextObj() {
+  return {
+    x: 0,
+    y: 0,
+    fill: undefined,
+    'text-anchor': 'start',
+    width: 100,
+    height: 100,
+    textMargin: 0,
+    rx: 0,
+    ry: 0
+  };
+};
+var getNoteRect = function getNoteRect() {
+  return {
+    x: 0,
+    y: 0,
+    width: 100,
+    anchor: 'start',
+    height: 100,
+    rx: 0,
+    ry: 0
+  };
+};
+
+var _drawTextCandidateFunc = function () {
+  function byText(content, g, x, y, width, height, textAttrs, colour) {
+    var text = g.append('text').attr('x', x + width / 2).attr('y', y + height / 2 + 5).style('font-color', colour).style('text-anchor', 'middle').text(content);
+
+    _setTextAttrs(text, textAttrs);
+  }
+
+  function byTspan(content, g, x, y, width, height, textAttrs, conf, colour) {
+    var taskFontSize = conf.taskFontSize,
+        taskFontFamily = conf.taskFontFamily;
+    var lines = content.split(/<br\s*\/?>/gi);
+
+    for (var i = 0; i < lines.length; i++) {
+      var dy = i * taskFontSize - taskFontSize * (lines.length - 1) / 2;
+      var text = g.append('text').attr('x', x + width / 2).attr('y', y).attr('fill', colour).style('text-anchor', 'middle').style('font-size', taskFontSize).style('font-family', taskFontFamily);
+      text.append('tspan').attr('x', x + width / 2).attr('dy', dy).text(lines[i]);
+      text.attr('y', y + height / 2.0).attr('dominant-baseline', 'central').attr('alignment-baseline', 'central');
+
+      _setTextAttrs(text, textAttrs);
+    }
+  }
+
+  function byFo(content, g, x, y, width, height, textAttrs, conf) {
+    var body = g.append('switch');
+    var f = body.append('foreignObject').attr('x', x).attr('y', y).attr('width', width).attr('height', height).attr('position', 'fixed');
+    var text = f.append('div').style('display', 'table').style('height', '100%').style('width', '100%');
+    text.append('div').attr('class', 'label').style('display', 'table-cell').style('text-align', 'center').style('vertical-align', 'middle') // .style('color', colour)
+    .text(content);
+    byTspan(content, body, x, y, width, height, textAttrs, conf);
+
+    _setTextAttrs(text, textAttrs);
+  }
+
+  function _setTextAttrs(toText, fromTextAttrsDict) {
+    for (var key in fromTextAttrsDict) {
+      if (key in fromTextAttrsDict) {
+        // eslint-disable-line
+        // noinspection JSUnfilteredForInLoop
+        toText.attr(key, fromTextAttrsDict[key]);
+      }
+    }
+  }
+
+  return function (conf) {
+    return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan;
+  };
+}();
+
+var initGraphics = function initGraphics(graphics) {
+  graphics.append('defs').append('marker').attr('id', 'arrowhead').attr('refX', 5).attr('refY', 2).attr('markerWidth', 6).attr('markerHeight', 4).attr('orient', 'auto').append('path').attr('d', 'M 0,0 V 4 L6,2 Z'); // this is actual shape for arrowhead
+};
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  drawRect: drawRect,
+  drawCircle: drawCircle,
+  drawSection: drawSection,
+  drawText: drawText,
+  drawLabel: drawLabel,
+  drawTask: drawTask,
+  drawBackgroundRect: drawBackgroundRect,
+  getTextObj: getTextObj,
+  getNoteRect: getNoteRect,
+  initGraphics: initGraphics
+});
+
+/***/ }),
+
+/***/ "./src/errorRenderer.js":
+/*!******************************!*\
+  !*** ./src/errorRenderer.js ***!
+  \******************************/
+/*! exports provided: setConf, draw, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setConf", function() { return setConf; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return draw; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logger */ "./src/logger.js");
+/**
+ * Created by knut on 14-12-11.
+ */
+
+
+var conf = {};
+var setConf = function setConf(cnf) {
+  var keys = Object.keys(cnf);
+  keys.forEach(function (key) {
+    conf[key] = cnf[key];
+  });
+};
+/**
+ * Draws a an info picture in the tag with id: id based on the graph definition in text.
+ * @param text
+ * @param id
+ */
+
+var draw = function draw(id, ver) {
+  try {
+    _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].debug('Renering svg for syntax error\n');
+    var svg = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('#' + id);
+    var g = svg.append('g');
+    g.append('path').attr('class', 'error-icon').attr('d', 'm411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z');
+    g.append('path').attr('class', 'error-icon').attr('d', 'm459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z');
+    g.append('path').attr('class', 'error-icon').attr('d', 'm340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z');
+    g.append('path').attr('class', 'error-icon').attr('d', 'm400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z');
+    g.append('path').attr('class', 'error-icon').attr('d', 'm496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z');
+    g.append('path').attr('class', 'error-icon').attr('d', 'm436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z');
+    g.append('text') // text label for the x axis
+    .attr('class', 'error-text').attr('x', 1240).attr('y', 250).attr('font-size', '150px').style('text-anchor', 'middle').text('Syntax error in graph');
+    g.append('text') // text label for the x axis
+    .attr('class', 'error-text').attr('x', 1050).attr('y', 400).attr('font-size', '100px').style('text-anchor', 'middle').text('mermaid version ' + ver);
+    svg.attr('height', 100);
+    svg.attr('width', 400);
+    svg.attr('viewBox', '768 0 512 512');
+  } catch (e) {
+    _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].error('Error while rendering info diagram');
+    _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].error(e.message);
+  }
+};
+/* harmony default export */ __webpack_exports__["default"] = ({
+  setConf: setConf,
+  draw: draw
+});
+
+/***/ }),
+
+/***/ "./src/logger.js":
+/*!***********************!*\
+  !*** ./src/logger.js ***!
+  \***********************/
+/*! exports provided: LEVELS, logger, setLogLevel */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "LEVELS", function() { return LEVELS; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "logger", function() { return logger; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLogLevel", function() { return setLogLevel; });
+/* harmony import */ var moment_mini__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! moment-mini */ "./node_modules/moment-mini/moment.min.js");
+/* harmony import */ var moment_mini__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(moment_mini__WEBPACK_IMPORTED_MODULE_0__);
+ //
+
+var LEVELS = {
+  debug: 1,
+  info: 2,
+  warn: 3,
+  error: 4,
+  fatal: 5
+};
+var logger = {
+  debug: function debug() {},
+  info: function info() {},
+  warn: function warn() {},
+  error: function error() {},
+  fatal: function fatal() {}
+};
+var setLogLevel = function setLogLevel() {
+  var level = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'fatal';
+
+  if (isNaN(level)) {
+    level = level.toLowerCase();
+
+    if (LEVELS[level] !== undefined) {
+      level = LEVELS[level];
+    }
+  }
+
+  logger.trace = function () {};
+
+  logger.debug = function () {};
+
+  logger.info = function () {};
+
+  logger.warn = function () {};
+
+  logger.error = function () {};
+
+  logger.fatal = function () {};
+
+  if (level <= LEVELS.fatal) {
+    logger.fatal = console.error ? console.error.bind(console, format('FATAL'), 'color: orange') : console.log.bind(console, '\x1b[35m', format('FATAL'));
+  }
+
+  if (level <= LEVELS.error) {
+    logger.error = console.error ? console.error.bind(console, format('ERROR'), 'color: orange') : console.log.bind(console, '\x1b[31m', format('ERROR'));
+  }
+
+  if (level <= LEVELS.warn) {
+    logger.warn = console.warn ? console.warn.bind(console, format('WARN'), 'color: orange') : console.log.bind(console, "\x1B[33m", format('WARN'));
+  }
+
+  if (level <= LEVELS.info) {
+    logger.info = console.info ? // ? console.info.bind(console, '\x1b[34m', format('INFO'), 'color: blue')
+    console.info.bind(console, format('INFO'), 'color: lightblue') : console.log.bind(console, '\x1b[34m', format('INFO'));
+  }
+
+  if (level <= LEVELS.debug) {
+    logger.debug = console.debug ? console.debug.bind(console, format('DEBUG'), 'color: lightgreen') : console.log.bind(console, '\x1b[32m', format('DEBUG'));
+  }
+};
+
+var format = function format(level) {
+  var time = moment_mini__WEBPACK_IMPORTED_MODULE_0___default()().format('ss.SSS');
+  return "%c".concat(time, " : ").concat(level, " : ");
+};
+
+/***/ }),
+
+/***/ "./src/mermaid.js":
+/*!************************!*\
+  !*** ./src/mermaid.js ***!
+  \************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var entity_decode_browser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! entity-decode/browser */ "./node_modules/entity-decode/browser.js");
+/* harmony import */ var _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mermaidAPI */ "./src/mermaidAPI.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./logger */ "./src/logger.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/utils.js");
+/**
+ * Web page integration module for the mermaid framework. It uses the mermaidAPI for mermaid functionality and to render
+ * the diagrams to svg code.
+ */
+// import { decode } from 'he';
+
+
+
+
+/**
+ * ## init
+ * Function that goes through the document to find the chart definitions in there and render them.
+ *
+ * The function tags the processed attributes with the attribute data-processed and ignores found elements with the
+ * attribute already set. This way the init function can be triggered several times.
+ *
+ * Optionally, `init` can accept in the second argument one of the following:
+ * - a DOM Node
+ * - an array of DOM nodes (as would come from a jQuery selector)
+ * - a W3C selector, a la `.mermaid`
+ *
+ * ```mermaid
+ * graph LR;
+ *  a(Find elements)-->b{Processed}
+ *  b-->|Yes|c(Leave element)
+ *  b-->|No |d(Transform)
+ * ```
+ * Renders the mermaid diagrams
+ * @param nodes a css selector or an array of nodes
+ */
+
+var init = function init() {
+  var _this = this;
+
+  var conf = _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].getConfig(); // console.log('Starting rendering diagrams (init) - mermaid.init', conf);
+
+  var nodes;
+
+  if (arguments.length >= 2) {
+    /*! sequence config was passed as #1 */
+    if (typeof arguments[0] !== 'undefined') {
+      mermaid.sequenceConfig = arguments[0];
+    }
+
+    nodes = arguments[1];
+  } else {
+    nodes = arguments[0];
+  } // if last argument is a function this is the callback function
+
+
+  var callback;
+
+  if (typeof arguments[arguments.length - 1] === 'function') {
+    callback = arguments[arguments.length - 1];
+    _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Callback function found');
+  } else {
+    if (typeof conf.mermaid !== 'undefined') {
+      if (typeof conf.mermaid.callback === 'function') {
+        callback = conf.mermaid.callback;
+        _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Callback function found');
+      } else {
+        _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('No Callback function found');
+      }
+    }
+  }
+
+  nodes = nodes === undefined ? document.querySelectorAll('.mermaid') : typeof nodes === 'string' ? document.querySelectorAll(nodes) : nodes instanceof window.Node ? [nodes] : nodes; // Last case  - sequence config was passed pick next
+
+  _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Start On Load before: ' + mermaid.startOnLoad);
+
+  if (typeof mermaid.startOnLoad !== 'undefined') {
+    _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Start On Load inner: ' + mermaid.startOnLoad);
+    _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].updateSiteConfig({
+      startOnLoad: mermaid.startOnLoad
+    });
+  }
+
+  if (typeof mermaid.ganttConfig !== 'undefined') {
+    _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].updateSiteConfig({
+      gantt: mermaid.ganttConfig
+    });
+  }
+
+  var txt;
+
+  var _loop = function _loop(i) {
+    var element = nodes[i];
+    /*! Check if previously processed */
+
+    if (!element.getAttribute('data-processed')) {
+      element.setAttribute('data-processed', true);
+    } else {
+      return "continue";
+    }
+
+    var id = "mermaid-".concat(Date.now()); // Fetch the graph definition including tags
+
+    txt = element.innerHTML; // transforms the html to pure text
+
+    txt = Object(entity_decode_browser__WEBPACK_IMPORTED_MODULE_0__["default"])(txt).trim().replace(/<br\s*\/?>/gi, '<br/>');
+    var init = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].detectInit(txt);
+
+    if (init) {
+      _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('Detected early reinit: ', init);
+    }
+
+    try {
+      _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].render(id, txt, function (svgCode, bindFunctions) {
+        element.innerHTML = svgCode;
+
+        if (typeof callback !== 'undefined') {
+          callback(id);
+        }
+
+        if (bindFunctions) bindFunctions(element);
+      }, element);
+    } catch (e) {
+      _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn('Syntax Error rendering');
+      _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].warn(e);
+
+      if (_this.parseError) {
+        _this.parseError(e);
+      }
+    }
+  };
+
+  for (var i = 0; i < nodes.length; i++) {
+    var _ret = _loop(i);
+
+    if (_ret === "continue") continue;
+  }
+};
+
+var initialize = function initialize(config) {
+  // mermaidAPI.reset();
+  if (typeof config.mermaid !== 'undefined') {
+    if (typeof config.mermaid.startOnLoad !== 'undefined') {
+      mermaid.startOnLoad = config.mermaid.startOnLoad;
+    }
+
+    if (typeof config.mermaid.htmlLabels !== 'undefined') {
+      mermaid.htmlLabels = config.mermaid.htmlLabels;
+    }
+  }
+
+  _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].initialize(config); // mermaidAPI.reset();
+};
+/**
+ * ##contentLoaded
+ * Callback function that is called when page is loaded. This functions fetches configuration for mermaid rendering and
+ * calls init for rendering the mermaid diagrams on the page.
+ */
+
+
+var contentLoaded = function contentLoaded() {
+  var config;
+
+  if (mermaid.startOnLoad) {
+    // No config found, do check API config
+    config = _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].getConfig();
+
+    if (config.startOnLoad) {
+      mermaid.init();
+    }
+  } else {
+    if (typeof mermaid.startOnLoad === 'undefined') {
+      _logger__WEBPACK_IMPORTED_MODULE_2__["logger"].debug('In start, no config');
+      config = _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].getConfig();
+
+      if (config.startOnLoad) {
+        mermaid.init();
+      }
+    }
+  }
+};
+
+if (typeof document !== 'undefined') {
+  /*!
+   * Wait for document loaded before starting the execution
+   */
+  window.addEventListener('load', function () {
+    contentLoaded();
+  }, false);
+}
+
+var mermaid = {
+  startOnLoad: true,
+  htmlLabels: true,
+  mermaidAPI: _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"],
+  parse: _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].parse,
+  render: _mermaidAPI__WEBPACK_IMPORTED_MODULE_1__["default"].render,
+  init: init,
+  initialize: initialize,
+  contentLoaded: contentLoaded
+};
+/* harmony default export */ __webpack_exports__["default"] = (mermaid);
+
+/***/ }),
+
+/***/ "./src/mermaidAPI.js":
+/*!***************************!*\
+  !*** ./src/mermaidAPI.js ***!
+  \***************************/
+/*! exports provided: encodeEntities, decodeEntities, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encodeEntities", function() { return encodeEntities; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decodeEntities", function() { return decodeEntities; });
+/* harmony import */ var stylis__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! stylis */ "./node_modules/stylis/stylis.js");
+/* harmony import */ var stylis__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(stylis__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../package.json */ "./package.json");
+var _package_json__WEBPACK_IMPORTED_MODULE_2___namespace = /*#__PURE__*/__webpack_require__.t(/*! ../package.json */ "./package.json", 1);
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./logger */ "./src/logger.js");
+/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/utils.js");
+/* harmony import */ var _diagrams_flowchart_flowRenderer__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./diagrams/flowchart/flowRenderer */ "./src/diagrams/flowchart/flowRenderer.js");
+/* harmony import */ var _diagrams_flowchart_flowRenderer_v2__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./diagrams/flowchart/flowRenderer-v2 */ "./src/diagrams/flowchart/flowRenderer-v2.js");
+/* harmony import */ var _diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./diagrams/flowchart/parser/flow */ "./src/diagrams/flowchart/parser/flow.jison");
+/* harmony import */ var _diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./diagrams/flowchart/flowDb */ "./src/diagrams/flowchart/flowDb.js");
+/* harmony import */ var _diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./diagrams/sequence/sequenceRenderer */ "./src/diagrams/sequence/sequenceRenderer.js");
+/* harmony import */ var _diagrams_sequence_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./diagrams/sequence/parser/sequenceDiagram */ "./src/diagrams/sequence/parser/sequenceDiagram.jison");
+/* harmony import */ var _diagrams_sequence_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_diagrams_sequence_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_10__);
+/* harmony import */ var _diagrams_sequence_sequenceDb__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./diagrams/sequence/sequenceDb */ "./src/diagrams/sequence/sequenceDb.js");
+/* harmony import */ var _diagrams_gantt_ganttRenderer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./diagrams/gantt/ganttRenderer */ "./src/diagrams/gantt/ganttRenderer.js");
+/* harmony import */ var _diagrams_gantt_parser_gantt__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./diagrams/gantt/parser/gantt */ "./src/diagrams/gantt/parser/gantt.jison");
+/* harmony import */ var _diagrams_gantt_parser_gantt__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(_diagrams_gantt_parser_gantt__WEBPACK_IMPORTED_MODULE_13__);
+/* harmony import */ var _diagrams_gantt_ganttDb__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./diagrams/gantt/ganttDb */ "./src/diagrams/gantt/ganttDb.js");
+/* harmony import */ var _diagrams_class_classRenderer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./diagrams/class/classRenderer */ "./src/diagrams/class/classRenderer.js");
+/* harmony import */ var _diagrams_class_classRenderer_v2__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./diagrams/class/classRenderer-v2 */ "./src/diagrams/class/classRenderer-v2.js");
+/* harmony import */ var _diagrams_class_parser_classDiagram__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./diagrams/class/parser/classDiagram */ "./src/diagrams/class/parser/classDiagram.jison");
+/* harmony import */ var _diagrams_class_parser_classDiagram__WEBPACK_IMPORTED_MODULE_17___default = /*#__PURE__*/__webpack_require__.n(_diagrams_class_parser_classDiagram__WEBPACK_IMPORTED_MODULE_17__);
+/* harmony import */ var _diagrams_class_classDb__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./diagrams/class/classDb */ "./src/diagrams/class/classDb.js");
+/* harmony import */ var _diagrams_state_stateRenderer__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./diagrams/state/stateRenderer */ "./src/diagrams/state/stateRenderer.js");
+/* harmony import */ var _diagrams_state_stateRenderer_v2__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./diagrams/state/stateRenderer-v2 */ "./src/diagrams/state/stateRenderer-v2.js");
+/* harmony import */ var _diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./diagrams/state/parser/stateDiagram */ "./src/diagrams/state/parser/stateDiagram.jison");
+/* harmony import */ var _diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21___default = /*#__PURE__*/__webpack_require__.n(_diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21__);
+/* harmony import */ var _diagrams_state_stateDb__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./diagrams/state/stateDb */ "./src/diagrams/state/stateDb.js");
+/* harmony import */ var _diagrams_git_gitGraphRenderer__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./diagrams/git/gitGraphRenderer */ "./src/diagrams/git/gitGraphRenderer.js");
+/* harmony import */ var _diagrams_git_parser_gitGraph__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./diagrams/git/parser/gitGraph */ "./src/diagrams/git/parser/gitGraph.jison");
+/* harmony import */ var _diagrams_git_parser_gitGraph__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(_diagrams_git_parser_gitGraph__WEBPACK_IMPORTED_MODULE_24__);
+/* harmony import */ var _diagrams_git_gitGraphAst__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./diagrams/git/gitGraphAst */ "./src/diagrams/git/gitGraphAst.js");
+/* harmony import */ var _diagrams_info_infoRenderer__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./diagrams/info/infoRenderer */ "./src/diagrams/info/infoRenderer.js");
+/* harmony import */ var _errorRenderer__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./errorRenderer */ "./src/errorRenderer.js");
+/* harmony import */ var _diagrams_info_parser_info__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./diagrams/info/parser/info */ "./src/diagrams/info/parser/info.jison");
+/* harmony import */ var _diagrams_info_parser_info__WEBPACK_IMPORTED_MODULE_28___default = /*#__PURE__*/__webpack_require__.n(_diagrams_info_parser_info__WEBPACK_IMPORTED_MODULE_28__);
+/* harmony import */ var _diagrams_info_infoDb__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./diagrams/info/infoDb */ "./src/diagrams/info/infoDb.js");
+/* harmony import */ var _diagrams_pie_pieRenderer__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./diagrams/pie/pieRenderer */ "./src/diagrams/pie/pieRenderer.js");
+/* harmony import */ var _diagrams_pie_parser_pie__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./diagrams/pie/parser/pie */ "./src/diagrams/pie/parser/pie.jison");
+/* harmony import */ var _diagrams_pie_parser_pie__WEBPACK_IMPORTED_MODULE_31___default = /*#__PURE__*/__webpack_require__.n(_diagrams_pie_parser_pie__WEBPACK_IMPORTED_MODULE_31__);
+/* harmony import */ var _diagrams_pie_pieDb__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./diagrams/pie/pieDb */ "./src/diagrams/pie/pieDb.js");
+/* harmony import */ var _diagrams_er_erDb__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./diagrams/er/erDb */ "./src/diagrams/er/erDb.js");
+/* harmony import */ var _diagrams_er_parser_erDiagram__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./diagrams/er/parser/erDiagram */ "./src/diagrams/er/parser/erDiagram.jison");
+/* harmony import */ var _diagrams_er_parser_erDiagram__WEBPACK_IMPORTED_MODULE_34___default = /*#__PURE__*/__webpack_require__.n(_diagrams_er_parser_erDiagram__WEBPACK_IMPORTED_MODULE_34__);
+/* harmony import */ var _diagrams_er_erRenderer__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./diagrams/er/erRenderer */ "./src/diagrams/er/erRenderer.js");
+/* harmony import */ var _diagrams_user_journey_parser_journey__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./diagrams/user-journey/parser/journey */ "./src/diagrams/user-journey/parser/journey.jison");
+/* harmony import */ var _diagrams_user_journey_parser_journey__WEBPACK_IMPORTED_MODULE_36___default = /*#__PURE__*/__webpack_require__.n(_diagrams_user_journey_parser_journey__WEBPACK_IMPORTED_MODULE_36__);
+/* harmony import */ var _diagrams_user_journey_journeyDb__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./diagrams/user-journey/journeyDb */ "./src/diagrams/user-journey/journeyDb.js");
+/* harmony import */ var _diagrams_user_journey_journeyRenderer__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./diagrams/user-journey/journeyRenderer */ "./src/diagrams/user-journey/journeyRenderer.js");
+/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./config */ "./src/config.js");
+/* harmony import */ var _styles__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./styles */ "./src/styles.js");
+/* harmony import */ var _themes__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./themes */ "./src/themes/index.js");
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+/**
+ * This is the api to be used when optionally handling the integration with the web page, instead of using the default integration provided by mermaid.js.
+ *
+ * The core of this api is the [**render**](Setup.md?id=render) function which, given a graph
+ * definition as text, renders the graph/diagram and returns an svg element for the graph.
+ *
+ * It is is then up to the user of the API to make use of the svg, either insert it somewhere in the page or do something completely different.
+ *
+ * In addition to the render function, a number of behavioral configuration options are available.
+ *
+ * @name mermaidAPI
+ */
+
+
+ // import * as configApi from './config';
+// // , {
+// //   setConfig,
+// //   configApi.getConfig,
+// //   configApi.updateSiteConfig,
+// //   configApi.setSiteConfig,
+// //   configApi.getSiteConfig,
+// //   configApi.defaultConfig
+// // }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+function parse(text) {
+  var graphInit = _utils__WEBPACK_IMPORTED_MODULE_4__["default"].detectInit(text);
+
+  if (graphInit) {
+    reinitialize(graphInit);
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('reinit ', graphInit);
+  }
+
+  var graphType = _utils__WEBPACK_IMPORTED_MODULE_4__["default"].detectType(text);
+  var parser;
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Type ' + graphType);
+
+  switch (graphType) {
+    case 'git':
+      parser = _diagrams_git_parser_gitGraph__WEBPACK_IMPORTED_MODULE_24___default.a;
+      parser.parser.yy = _diagrams_git_gitGraphAst__WEBPACK_IMPORTED_MODULE_25__["default"];
+      break;
+
+    case 'flowchart':
+      _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_8__["default"].clear();
+      parser = _diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_7___default.a;
+      parser.parser.yy = _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_8__["default"];
+      break;
+
+    case 'flowchart-v2':
+      _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_8__["default"].clear();
+      parser = _diagrams_flowchart_parser_flow__WEBPACK_IMPORTED_MODULE_7___default.a;
+      parser.parser.yy = _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_8__["default"];
+      break;
+
+    case 'sequence':
+      parser = _diagrams_sequence_parser_sequenceDiagram__WEBPACK_IMPORTED_MODULE_10___default.a;
+      parser.parser.yy = _diagrams_sequence_sequenceDb__WEBPACK_IMPORTED_MODULE_11__["default"];
+      break;
+
+    case 'gantt':
+      parser = _diagrams_gantt_parser_gantt__WEBPACK_IMPORTED_MODULE_13___default.a;
+      parser.parser.yy = _diagrams_gantt_ganttDb__WEBPACK_IMPORTED_MODULE_14__["default"];
+      break;
+
+    case 'class':
+      parser = _diagrams_class_parser_classDiagram__WEBPACK_IMPORTED_MODULE_17___default.a;
+      parser.parser.yy = _diagrams_class_classDb__WEBPACK_IMPORTED_MODULE_18__["default"];
+      break;
+
+    case 'classDiagram':
+      parser = _diagrams_class_parser_classDiagram__WEBPACK_IMPORTED_MODULE_17___default.a;
+      parser.parser.yy = _diagrams_class_classDb__WEBPACK_IMPORTED_MODULE_18__["default"];
+      break;
+
+    case 'state':
+      parser = _diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21___default.a;
+      parser.parser.yy = _diagrams_state_stateDb__WEBPACK_IMPORTED_MODULE_22__["default"];
+      break;
+
+    case 'stateDiagram':
+      parser = _diagrams_state_parser_stateDiagram__WEBPACK_IMPORTED_MODULE_21___default.a;
+      parser.parser.yy = _diagrams_state_stateDb__WEBPACK_IMPORTED_MODULE_22__["default"];
+      break;
+
+    case 'info':
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('info info info');
+      parser = _diagrams_info_parser_info__WEBPACK_IMPORTED_MODULE_28___default.a;
+      parser.parser.yy = _diagrams_info_infoDb__WEBPACK_IMPORTED_MODULE_29__["default"];
+      break;
+
+    case 'pie':
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('pie');
+      parser = _diagrams_pie_parser_pie__WEBPACK_IMPORTED_MODULE_31___default.a;
+      parser.parser.yy = _diagrams_pie_pieDb__WEBPACK_IMPORTED_MODULE_32__["default"];
+      break;
+
+    case 'er':
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('er');
+      parser = _diagrams_er_parser_erDiagram__WEBPACK_IMPORTED_MODULE_34___default.a;
+      parser.parser.yy = _diagrams_er_erDb__WEBPACK_IMPORTED_MODULE_33__["default"];
+      break;
+
+    case 'journey':
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('Journey');
+      parser = _diagrams_user_journey_parser_journey__WEBPACK_IMPORTED_MODULE_36___default.a;
+      parser.parser.yy = _diagrams_user_journey_journeyDb__WEBPACK_IMPORTED_MODULE_37__["default"];
+      break;
+  }
+
+  parser.parser.yy.graphType = graphType;
+
+  parser.parser.yy.parseError = function (str, hash) {
+    var error = {
+      str: str,
+      hash: hash
+    };
+    throw error;
+  };
+
+  parser.parse(text);
+  return parser;
+}
+
+var encodeEntities = function encodeEntities(text) {
+  var txt = text;
+  txt = txt.replace(/style.*:\S*#.*;/g, function (s) {
+    var innerTxt = s.substring(0, s.length - 1);
+    return innerTxt;
+  });
+  txt = txt.replace(/classDef.*:\S*#.*;/g, function (s) {
+    var innerTxt = s.substring(0, s.length - 1);
+    return innerTxt;
+  });
+  txt = txt.replace(/#\w+;/g, function (s) {
+    var innerTxt = s.substring(1, s.length - 1);
+    var isInt = /^\+?\d+$/.test(innerTxt);
+
+    if (isInt) {
+      return 'fl°°' + innerTxt + '¶ß';
+    } else {
+      return 'fl°' + innerTxt + '¶ß';
+    }
+  });
+  return txt;
+};
+var decodeEntities = function decodeEntities(text) {
+  var txt = text;
+  txt = txt.replace(/fl°°/g, function () {
+    return '&#';
+  });
+  txt = txt.replace(/fl°/g, function () {
+    return '&';
+  });
+  txt = txt.replace(/¶ß/g, function () {
+    return ';';
+  });
+  return txt;
+};
+/**
+ * Function that renders an svg with a graph from a chart definition. Usage example below.
+ *
+ * ```js
+ * mermaidAPI.initialize({
+ *      startOnLoad:true
+ *  });
+ *  $(function(){
+ *      const graphDefinition = 'graph TB\na-->b';
+ *      const cb = function(svgGraph){
+ *          console.log(svgGraph);
+ *      };
+ *      mermaidAPI.render('id1',graphDefinition,cb);
+ *  });
+ *```
+ * @param id the id of the element to be rendered
+ * @param _txt the graph definition
+ * @param cb callback which is called after rendering is finished with the svg code as inparam.
+ * @param container selector to element in which a div with the graph temporarily will be inserted. In one is
+ * provided a hidden div will be inserted in the body of the page instead. The element will be removed when rendering is
+ * completed.
+ */
+
+var render = function render(id, _txt, cb, container) {
+  _config__WEBPACK_IMPORTED_MODULE_39__["reset"]();
+  var txt = _txt;
+  var graphInit = _utils__WEBPACK_IMPORTED_MODULE_4__["default"].detectInit(txt);
+
+  if (graphInit) {
+    _config__WEBPACK_IMPORTED_MODULE_39__["addDirective"](graphInit);
+  } // else {
+  //   configApi.reset();
+  //   const siteConfig = configApi.getSiteConfig();
+  //   configApi.addDirective(siteConfig);
+  // }
+  // console.warn('Render fetching config');
+
+
+  var cnf = _config__WEBPACK_IMPORTED_MODULE_39__["getConfig"]();
+  console.warn('Render with config after adding new directives', cnf.sequence); // console.warn(
+  //   'Render with config after adding new directives',
+  //   cnf.fontFamily,
+  //   cnf.themeVariables.fontFamily
+  // );
+  // Check the maximum allowed text size
+
+  if (_txt.length > cnf.maxTextSize) {
+    txt = 'graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa';
+  }
+
+  if (typeof container !== 'undefined') {
+    container.innerHTML = '';
+    Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])(container).append('div').attr('id', 'd' + id).attr('style', 'font-family: ' + cnf.fontFamily).append('svg').attr('id', id).attr('width', '100%').attr('xmlns', 'http://www.w3.org/2000/svg').append('g');
+  } else {
+    var existingSvg = document.getElementById(id);
+
+    if (existingSvg) {
+      existingSvg.remove();
+    }
+
+    var _element = document.querySelector('#' + 'd' + id);
+
+    if (_element) {
+      _element.remove();
+    }
+
+    Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('body').append('div').attr('id', 'd' + id).append('svg').attr('id', id).attr('width', '100%').attr('xmlns', 'http://www.w3.org/2000/svg').append('g');
+  }
+
+  window.txt = txt;
+  txt = encodeEntities(txt);
+  var element = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#d' + id).node();
+  var graphType = _utils__WEBPACK_IMPORTED_MODULE_4__["default"].detectType(txt); // insert inline style into svg
+
+  var svg = element.firstChild;
+  var firstChild = svg.firstChild;
+  var userStyles = ''; // user provided theme CSS
+
+  if (cnf.themeCSS !== undefined) {
+    userStyles += "\n".concat(cnf.themeCSS);
+  } // user provided theme CSS
+
+
+  if (cnf.fontFamily !== undefined) {
+    userStyles += "\n:root { --mermaid-font-family: ".concat(cnf.fontFamily, "}");
+  } // user provided theme CSS
+
+
+  if (cnf.altFontFamily !== undefined) {
+    userStyles += "\n:root { --mermaid-alt-font-family: ".concat(cnf.altFontFamily, "}");
+  } // classDef
+
+
+  if (graphType === 'flowchart' || graphType === 'flowchart-v2' || graphType === 'graph') {
+    var classes = _diagrams_flowchart_flowRenderer__WEBPACK_IMPORTED_MODULE_5__["default"].getClasses(txt);
+
+    for (var className in classes) {
+      userStyles += "\n.".concat(className, " > * { ").concat(classes[className].styles.join(' !important; '), " !important; }");
+
+      if (classes[className].textStyles) {
+        userStyles += "\n.".concat(className, " tspan { ").concat(classes[className].textStyles.join(' !important; '), " !important; }");
+      }
+    }
+  } // logger.warn(cnf.themeVariables);
+
+
+  var stylis = new stylis__WEBPACK_IMPORTED_MODULE_0___default.a();
+  var rules = stylis("#".concat(id), Object(_styles__WEBPACK_IMPORTED_MODULE_40__["default"])(graphType, userStyles, cnf.themeVariables));
+  var style1 = document.createElement('style');
+  style1.innerHTML = rules;
+  svg.insertBefore(style1, firstChild); // Verify that the generated svgs are ok before removing this
+  // const style2 = document.createElement('style');
+  // const cs = window.getComputedStyle(svg);
+  // style2.innerHTML = `#d${id} * {
+  //   color: ${cs.color};
+  //   // font: ${cs.font};
+  //   // font-family: Arial;
+  //   // font-size: 24px;
+  // }`;
+  // svg.insertBefore(style2, firstChild);
+
+  try {
+    switch (graphType) {
+      case 'git':
+        cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_git_gitGraphRenderer__WEBPACK_IMPORTED_MODULE_23__["default"].setConf(cnf.git);
+        _diagrams_git_gitGraphRenderer__WEBPACK_IMPORTED_MODULE_23__["default"].draw(txt, id, false);
+        break;
+
+      case 'flowchart':
+        cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_flowchart_flowRenderer__WEBPACK_IMPORTED_MODULE_5__["default"].setConf(cnf.flowchart);
+        _diagrams_flowchart_flowRenderer__WEBPACK_IMPORTED_MODULE_5__["default"].draw(txt, id, false);
+        break;
+
+      case 'flowchart-v2':
+        cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_flowchart_flowRenderer_v2__WEBPACK_IMPORTED_MODULE_6__["default"].setConf(cnf.flowchart);
+        _diagrams_flowchart_flowRenderer_v2__WEBPACK_IMPORTED_MODULE_6__["default"].draw(txt, id, false);
+        break;
+
+      case 'sequence':
+        cnf.sequence.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+
+        if (cnf.sequenceDiagram) {
+          // backwards compatibility
+          _diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_9__["default"].setConf(Object.assign(cnf.sequence, cnf.sequenceDiagram));
+          console.error('`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.');
+        } else {
+          _diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_9__["default"].setConf(cnf.sequence);
+        }
+
+        _diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_9__["default"].draw(txt, id);
+        break;
+
+      case 'gantt':
+        cnf.gantt.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_gantt_ganttRenderer__WEBPACK_IMPORTED_MODULE_12__["default"].setConf(cnf.gantt);
+        _diagrams_gantt_ganttRenderer__WEBPACK_IMPORTED_MODULE_12__["default"].draw(txt, id);
+        break;
+
+      case 'class':
+        cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_class_classRenderer__WEBPACK_IMPORTED_MODULE_15__["default"].setConf(cnf.class);
+        _diagrams_class_classRenderer__WEBPACK_IMPORTED_MODULE_15__["default"].draw(txt, id);
+        break;
+
+      case 'classDiagram':
+        cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_class_classRenderer_v2__WEBPACK_IMPORTED_MODULE_16__["default"].setConf(cnf.class);
+        _diagrams_class_classRenderer_v2__WEBPACK_IMPORTED_MODULE_16__["default"].draw(txt, id);
+        break;
+
+      case 'state':
+        cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_state_stateRenderer__WEBPACK_IMPORTED_MODULE_19__["default"].setConf(cnf.state);
+        _diagrams_state_stateRenderer__WEBPACK_IMPORTED_MODULE_19__["default"].draw(txt, id);
+        break;
+
+      case 'stateDiagram':
+        cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_state_stateRenderer_v2__WEBPACK_IMPORTED_MODULE_20__["default"].setConf(cnf.state);
+        _diagrams_state_stateRenderer_v2__WEBPACK_IMPORTED_MODULE_20__["default"].draw(txt, id);
+        break;
+
+      case 'info':
+        cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_info_infoRenderer__WEBPACK_IMPORTED_MODULE_26__["default"].setConf(cnf.class);
+        _diagrams_info_infoRenderer__WEBPACK_IMPORTED_MODULE_26__["default"].draw(txt, id, _package_json__WEBPACK_IMPORTED_MODULE_2__.version);
+        break;
+
+      case 'pie':
+        cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
+        _diagrams_pie_pieRenderer__WEBPACK_IMPORTED_MODULE_30__["default"].setConf(cnf.class);
+        _diagrams_pie_pieRenderer__WEBPACK_IMPORTED_MODULE_30__["default"].draw(txt, id, _package_json__WEBPACK_IMPORTED_MODULE_2__.version);
+        break;
+
+      case 'er':
+        _diagrams_er_erRenderer__WEBPACK_IMPORTED_MODULE_35__["default"].setConf(cnf.er);
+        _diagrams_er_erRenderer__WEBPACK_IMPORTED_MODULE_35__["default"].draw(txt, id, _package_json__WEBPACK_IMPORTED_MODULE_2__.version);
+        break;
+
+      case 'journey':
+        _diagrams_user_journey_journeyRenderer__WEBPACK_IMPORTED_MODULE_38__["default"].setConf(cnf.journey);
+        _diagrams_user_journey_journeyRenderer__WEBPACK_IMPORTED_MODULE_38__["default"].draw(txt, id, _package_json__WEBPACK_IMPORTED_MODULE_2__.version);
+        break;
+    }
+  } catch (e) {
+    // errorRenderer.setConf(cnf.class);
+    _errorRenderer__WEBPACK_IMPORTED_MODULE_27__["default"].draw(id, _package_json__WEBPACK_IMPORTED_MODULE_2__.version);
+    throw e;
+  }
+
+  Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])("[id=\"".concat(id, "\"]")).selectAll('foreignobject > *').attr('xmlns', 'http://www.w3.org/1999/xhtml'); // if (cnf.arrowMarkerAbsolute) {
+  //   url =
+  //     window.location.protocol +
+  //     '//' +
+  //     window.location.host +
+  //     window.location.pathname +
+  //     window.location.search;
+  //   url = url.replace(/\(/g, '\\(');
+  //   url = url.replace(/\)/g, '\\)');
+  // }
+  // Fix for when the base tag is used
+
+  var svgCode = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#d' + id).node().innerHTML;
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('cnf.arrowMarkerAbsolute', cnf.arrowMarkerAbsolute);
+
+  if (!cnf.arrowMarkerAbsolute || cnf.arrowMarkerAbsolute === 'false') {
+    svgCode = svgCode.replace(/marker-end="url\(.*?#/g, 'marker-end="url(#', 'g');
+  }
+
+  svgCode = decodeEntities(svgCode);
+
+  if (typeof cb !== 'undefined') {
+    switch (graphType) {
+      case 'flowchart':
+      case 'flowchart-v2':
+        cb(svgCode, _diagrams_flowchart_flowDb__WEBPACK_IMPORTED_MODULE_8__["default"].bindFunctions);
+        break;
+
+      case 'gantt':
+        cb(svgCode, _diagrams_gantt_ganttDb__WEBPACK_IMPORTED_MODULE_14__["default"].bindFunctions);
+        break;
+
+      case 'class':
+        cb(svgCode, _diagrams_class_classDb__WEBPACK_IMPORTED_MODULE_18__["default"].bindFunctions);
+        break;
+
+      default:
+        cb(svgCode);
+    }
+  } else {
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug('CB = undefined!');
+  }
+
+  var node = Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#d' + id).node();
+
+  if (node !== null && typeof node.remove === 'function') {
+    Object(d3__WEBPACK_IMPORTED_MODULE_1__["select"])('#d' + id).node().remove();
+  }
+
+  return svgCode;
+};
+
+var currentDirective = {};
+
+var parseDirective = function parseDirective(p, statement, context, type) {
+  try {
+    if (statement !== undefined) {
+      statement = statement.trim();
+
+      switch (context) {
+        case 'open_directive':
+          currentDirective = {};
+          break;
+
+        case 'type_directive':
+          currentDirective.type = statement.toLowerCase();
+          break;
+
+        case 'arg_directive':
+          currentDirective.args = JSON.parse(statement);
+          break;
+
+        case 'close_directive':
+          handleDirective(p, currentDirective, type);
+          currentDirective = null;
+          break;
+      }
+    }
+  } catch (error) {
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error("Error while rendering sequenceDiagram directive: ".concat(statement, " jison context: ").concat(context));
+    _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].error(error.message);
+  }
+};
+
+var handleDirective = function handleDirective(p, directive, type) {
+  _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].debug("Directive type=".concat(directive.type, " with args:"), directive.args);
+
+  switch (directive.type) {
+    case 'init':
+    case 'initialize':
+      {
+        ['config'].forEach(function (prop) {
+          if (typeof directive.args[prop] !== 'undefined') {
+            if (type === 'flowchart-v2') {
+              type = 'flowchart';
+            }
+
+            directive.args[type] = directive.args[prop];
+            delete directive.args[prop];
+          }
+        });
+        reinitialize(directive.args);
+        _config__WEBPACK_IMPORTED_MODULE_39__["addDirective"](directive.args);
+        break;
+      }
+
+    case 'wrap':
+    case 'nowrap':
+      if (p && p['setWrap']) {
+        p.setWrap(directive.type === 'wrap');
+      }
+
+      break;
+
+    default:
+      _logger__WEBPACK_IMPORTED_MODULE_3__["logger"].warn("Unhandled directive: source: '%%{".concat(directive.type, ": ").concat(JSON.stringify(directive.args ? directive.args : {}), "}%%"), directive);
+      break;
+  }
+};
+
+function updateRendererConfigs(conf) {
+  _diagrams_git_gitGraphRenderer__WEBPACK_IMPORTED_MODULE_23__["default"].setConf(conf.git);
+  _diagrams_flowchart_flowRenderer__WEBPACK_IMPORTED_MODULE_5__["default"].setConf(conf.flowchart);
+  _diagrams_flowchart_flowRenderer_v2__WEBPACK_IMPORTED_MODULE_6__["default"].setConf(conf.flowchart);
+
+  if (typeof conf['sequenceDiagram'] !== 'undefined') {
+    _diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_9__["default"].setConf(Object(_utils__WEBPACK_IMPORTED_MODULE_4__["assignWithDepth"])(conf.sequence, conf['sequenceDiagram']));
+  }
+
+  _diagrams_sequence_sequenceRenderer__WEBPACK_IMPORTED_MODULE_9__["default"].setConf(conf.sequence);
+  _diagrams_gantt_ganttRenderer__WEBPACK_IMPORTED_MODULE_12__["default"].setConf(conf.gantt);
+  _diagrams_class_classRenderer__WEBPACK_IMPORTED_MODULE_15__["default"].setConf(conf.class);
+  _diagrams_state_stateRenderer__WEBPACK_IMPORTED_MODULE_19__["default"].setConf(conf.state);
+  _diagrams_state_stateRenderer_v2__WEBPACK_IMPORTED_MODULE_20__["default"].setConf(conf.state);
+  _diagrams_info_infoRenderer__WEBPACK_IMPORTED_MODULE_26__["default"].setConf(conf.class);
+  _diagrams_pie_pieRenderer__WEBPACK_IMPORTED_MODULE_30__["default"].setConf(conf.class);
+  _diagrams_er_erRenderer__WEBPACK_IMPORTED_MODULE_35__["default"].setConf(conf.er);
+  _diagrams_user_journey_journeyRenderer__WEBPACK_IMPORTED_MODULE_38__["default"].setConf(conf.journey);
+  _errorRenderer__WEBPACK_IMPORTED_MODULE_27__["default"].setConf(conf.class);
+}
+
+function reinitialize() {// `mermaidAPI.reinitialize: v${pkg.version}`,
+  //   JSON.stringify(options),
+  //   options.themeVariables.primaryColor;
+  // // if (options.theme && theme[options.theme]) {
+  // //   options.themeVariables = theme[options.theme].getThemeVariables(options.themeVariables);
+  // // }
+  // // Set default options
+  // const config =
+  //   typeof options === 'object' ? configApi.setConfig(options) : configApi.getSiteConfig();
+  // updateRendererConfigs(config);
+  // setLogLevel(config.logLevel);
+  // logger.debug('mermaidAPI.reinitialize: ', config);
+}
+
+function initialize(options) {
+  // console.warn(`mermaidAPI.initialize: v${pkg.version} `, options);
+  // Handle legacy location of font-family configuration
+  if (options && options.fontFamily) {
+    if (!options.themeVariables) {
+      options.themeVariables = {
+        fontFamily: options.fontFamily
+      };
+    } else {
+      if (!options.themeVariables.fontFamily) {
+        options.themeVariables = {
+          fontFamily: options.fontFamily
+        };
+      }
+    }
+  } // Set default options
+
+
+  _config__WEBPACK_IMPORTED_MODULE_39__["setSiteConfigDelta"](options);
+
+  if (options && options.theme && _themes__WEBPACK_IMPORTED_MODULE_41__["default"][options.theme]) {
+    // Todo merge with user options
+    options.themeVariables = _themes__WEBPACK_IMPORTED_MODULE_41__["default"][options.theme].getThemeVariables(options.themeVariables);
+  } else {
+    if (options) options.themeVariables = _themes__WEBPACK_IMPORTED_MODULE_41__["default"].default.getThemeVariables(options.themeVariables);
+  }
+
+  var config = _typeof(options) === 'object' ? _config__WEBPACK_IMPORTED_MODULE_39__["setSiteConfig"](options) : _config__WEBPACK_IMPORTED_MODULE_39__["getSiteConfig"]();
+  updateRendererConfigs(config);
+  Object(_logger__WEBPACK_IMPORTED_MODULE_3__["setLogLevel"])(config.logLevel); // logger.debug('mermaidAPI.initialize: ', config);
+}
+
+var mermaidAPI = Object.freeze({
+  render: render,
+  parse: parse,
+  parseDirective: parseDirective,
+  initialize: initialize,
+  reinitialize: reinitialize,
+  getConfig: _config__WEBPACK_IMPORTED_MODULE_39__["getConfig"],
+  setConfig: _config__WEBPACK_IMPORTED_MODULE_39__["setConfig"],
+  getSiteConfig: _config__WEBPACK_IMPORTED_MODULE_39__["getSiteConfig"],
+  updateSiteConfig: _config__WEBPACK_IMPORTED_MODULE_39__["updateSiteConfig"],
+  reset: function reset() {
+    // console.warn('reset');
+    _config__WEBPACK_IMPORTED_MODULE_39__["reset"](); // const siteConfig = configApi.getSiteConfig();
+    // updateRendererConfigs(siteConfig);
+  },
+  globalReset: function globalReset() {
+    _config__WEBPACK_IMPORTED_MODULE_39__["reset"](_config__WEBPACK_IMPORTED_MODULE_39__["defaultConfig"]);
+    updateRendererConfigs(_config__WEBPACK_IMPORTED_MODULE_39__["getConfig"]());
+  },
+  defaultConfig: _config__WEBPACK_IMPORTED_MODULE_39__["defaultConfig"]
+});
+Object(_logger__WEBPACK_IMPORTED_MODULE_3__["setLogLevel"])(_config__WEBPACK_IMPORTED_MODULE_39__["getConfig"]().logLevel);
+_config__WEBPACK_IMPORTED_MODULE_39__["reset"](_config__WEBPACK_IMPORTED_MODULE_39__["getConfig"]());
+/* harmony default export */ __webpack_exports__["default"] = (mermaidAPI);
+/**
+ * ## mermaidAPI configuration defaults
+ * <pre>
+ *
+ * &lt;script>
+ *   var config = {
+ *     theme:'default',
+ *     logLevel:'fatal',
+ *     securityLevel:'strict',
+ *     startOnLoad:true,
+ *     arrowMarkerAbsolute:false,
+ *
+ *     er:{
+ *       diagramPadding:20,
+ *       layoutDirection:'TB',
+ *       minEntityWidth:100,
+ *       minEntityHeight:75,
+ *       entityPadding:15,
+ *       stroke:'gray',
+ *       fill:'honeydew',
+ *       fontSize:12,
+ *       useMaxWidth:true,
+ *     },
+ *     flowchart:{
+ *       diagramPadding:8,
+ *       htmlLabels:true,
+ *       curve:'linear',
+ *     },
+ *     sequence:{
+ *       diagramMarginX:50,
+ *       diagramMarginY:10,
+ *       actorMargin:50,
+ *       width:150,
+ *       height:65,
+ *       boxMargin:10,
+ *       boxTextMargin:5,
+ *       noteMargin:10,
+ *       messageMargin:35,
+ *       messageAlign:'center',
+ *       mirrorActors:true,
+ *       bottomMarginAdj:1,
+ *       useMaxWidth:true,
+ *       rightAngles:false,
+ *       showSequenceNumbers:false,
+ *     },
+ *     gantt:{
+ *       titleTopMargin:25,
+ *       barHeight:20,
+ *       barGap:4,
+ *       topPadding:50,
+ *       leftPadding:75,
+ *       gridLineStartPadding:35,
+ *       fontSize:11,
+ *       fontFamily:'"Open-Sans", "sans-serif"',
+ *       numberSectionStyles:4,
+ *       axisFormat:'%Y-%m-%d',
+ *     }
+ *   };
+ *   mermaid.initialize(config);
+ * &lt;/script>
+ *</pre>
+ */
+
+/***/ }),
+
+/***/ "./src/styles.js":
+/*!***********************!*\
+  !*** ./src/styles.js ***!
+  \***********************/
+/*! exports provided: calcThemeVariables, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "calcThemeVariables", function() { return calcThemeVariables; });
+/* harmony import */ var _diagrams_class_styles__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./diagrams/class/styles */ "./src/diagrams/class/styles.js");
+/* harmony import */ var _diagrams_er_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./diagrams/er/styles */ "./src/diagrams/er/styles.js");
+/* harmony import */ var _diagrams_flowchart_styles__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./diagrams/flowchart/styles */ "./src/diagrams/flowchart/styles.js");
+/* harmony import */ var _diagrams_gantt_styles__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./diagrams/gantt/styles */ "./src/diagrams/gantt/styles.js");
+/* harmony import */ var _diagrams_git_styles__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./diagrams/git/styles */ "./src/diagrams/git/styles.js");
+/* harmony import */ var _diagrams_info_styles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./diagrams/info/styles */ "./src/diagrams/info/styles.js");
+/* harmony import */ var _diagrams_pie_styles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./diagrams/pie/styles */ "./src/diagrams/pie/styles.js");
+/* harmony import */ var _diagrams_sequence_styles__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./diagrams/sequence/styles */ "./src/diagrams/sequence/styles.js");
+/* harmony import */ var _diagrams_state_styles__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./diagrams/state/styles */ "./src/diagrams/state/styles.js");
+/* harmony import */ var _diagrams_user_journey_styles__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./diagrams/user-journey/styles */ "./src/diagrams/user-journey/styles.js");
+
+
+
+
+
+
+
+
+
+
+var themes = {
+  flowchart: _diagrams_flowchart_styles__WEBPACK_IMPORTED_MODULE_2__["default"],
+  'flowchart-v2': _diagrams_flowchart_styles__WEBPACK_IMPORTED_MODULE_2__["default"],
+  sequence: _diagrams_sequence_styles__WEBPACK_IMPORTED_MODULE_7__["default"],
+  gantt: _diagrams_gantt_styles__WEBPACK_IMPORTED_MODULE_3__["default"],
+  classDiagram: _diagrams_class_styles__WEBPACK_IMPORTED_MODULE_0__["default"],
+  'classDiagram-v2': _diagrams_class_styles__WEBPACK_IMPORTED_MODULE_0__["default"],
+  class: _diagrams_class_styles__WEBPACK_IMPORTED_MODULE_0__["default"],
+  stateDiagram: _diagrams_state_styles__WEBPACK_IMPORTED_MODULE_8__["default"],
+  state: _diagrams_state_styles__WEBPACK_IMPORTED_MODULE_8__["default"],
+  git: _diagrams_git_styles__WEBPACK_IMPORTED_MODULE_4__["default"],
+  info: _diagrams_info_styles__WEBPACK_IMPORTED_MODULE_5__["default"],
+  pie: _diagrams_pie_styles__WEBPACK_IMPORTED_MODULE_6__["default"],
+  er: _diagrams_er_styles__WEBPACK_IMPORTED_MODULE_1__["default"],
+  journey: _diagrams_user_journey_styles__WEBPACK_IMPORTED_MODULE_9__["default"]
+};
+var calcThemeVariables = function calcThemeVariables(theme, userOverRides) {
+  return theme.calcColors(userOverRides);
+};
+
+var getStyles = function getStyles(type, userStyles, options) {
+  //console.warn('options in styles: ', options);
+  return " {\n    font-family: ".concat(options.fontFamily, ";\n    font-size: ").concat(options.fontSize, ";\n    fill: ").concat(options.textColor, "\n  }\n\n  /* Classes common for multiple diagrams */\n\n  .error-icon {\n    fill: ").concat(options.errorBkgColor, ";\n  }\n  .error-text {\n    fill: ").concat(options.errorTextColor, ";\n    stroke: ").concat(options.errorTextColor, ";\n  }\n\n  .edge-thickness-normal {\n    stroke-width: 2px;\n  }\n  .edge-thickness-thick {\n    stroke-width: 3.5px\n  }\n  .edge-pattern-solid {\n    stroke-dasharray: 0;\n  }\n\n  .edge-pattern-dashed{\n    stroke-dasharray: 3;\n  }\n  .edge-pattern-dotted {\n    stroke-dasharray: 2;\n  }\n\n  .marker {\n    fill: ").concat(options.lineColor, ";\n  }\n  .marker.cross {\n    stroke: ").concat(options.lineColor, ";\n  }\n\n  svg {\n    font-family: ").concat(options.fontFamily, ";\n    font-size: ").concat(options.fontSize, ";\n  }\n\n  ").concat(themes[type](options), "\n\n  ").concat(userStyles, "\n\n  ").concat(type, " { fill: apa;}\n");
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (getStyles);
+
+/***/ }),
+
+/***/ "./src/themes/index.js":
+/*!*****************************!*\
+  !*** ./src/themes/index.js ***!
+  \*****************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _theme_base__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./theme-base */ "./src/themes/theme-base.js");
+/* harmony import */ var _theme_dark__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./theme-dark */ "./src/themes/theme-dark.js");
+/* harmony import */ var _theme_default__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./theme-default */ "./src/themes/theme-default.js");
+/* harmony import */ var _theme_forest__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./theme-forest */ "./src/themes/theme-forest.js");
+/* harmony import */ var _theme_neutral__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./theme-neutral */ "./src/themes/theme-neutral.js");
+
+
+
+
+
+/* harmony default export */ __webpack_exports__["default"] = ({
+  base: {
+    getThemeVariables: _theme_base__WEBPACK_IMPORTED_MODULE_0__["getThemeVariables"]
+  },
+  dark: {
+    getThemeVariables: _theme_dark__WEBPACK_IMPORTED_MODULE_1__["getThemeVariables"]
+  },
+  default: {
+    getThemeVariables: _theme_default__WEBPACK_IMPORTED_MODULE_2__["getThemeVariables"]
+  },
+  forest: {
+    getThemeVariables: _theme_forest__WEBPACK_IMPORTED_MODULE_3__["getThemeVariables"]
+  },
+  neutral: {
+    getThemeVariables: _theme_neutral__WEBPACK_IMPORTED_MODULE_4__["getThemeVariables"]
+  }
+});
+
+/***/ }),
+
+/***/ "./src/themes/theme-base.js":
+/*!**********************************!*\
+  !*** ./src/themes/theme-base.js ***!
+  \**********************************/
+/*! exports provided: getThemeVariables */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getThemeVariables", function() { return getThemeVariables; });
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! khroma */ "./node_modules/khroma/dist/index.js");
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(khroma__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _theme_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./theme-helpers */ "./src/themes/theme-helpers.js");
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var Theme =
+/*#__PURE__*/
+function () {
+  function Theme() {
+    _classCallCheck(this, Theme);
+
+    /** # Base variables */
+
+    /** * background - used to know what the background color is of the diagram. This is used for deducing colors for istance line color. Defaulr value is #f4f4f4. */
+    this.background = '#f4f4f4';
+    this.darkMode = false; // this.background = '#0c0c0c';
+    // this.darkMode = true;
+
+    this.primaryColor = '#fff4dd'; // this.background = '#0c0c0c';
+    // this.primaryColor = '#1f1f00';
+
+    this.noteBkgColor = '#fff5ad';
+    this.noteTextColor = '#333'; // dark
+    // this.primaryColor = '#034694';
+    // this.primaryColor = '#f2ee7e';
+    // this.primaryColor = '#9f33be';
+    // this.primaryColor = '#f0fff0';
+    // this.primaryColor = '#fa255e';
+    // this.primaryColor = '#ECECFF';
+    // this.secondaryColor = '#c39ea0';
+    // this.tertiaryColor = '#f8e5e5';
+    // this.secondaryColor = '#dfdfde';
+    // this.tertiaryColor = '#CCCCFF';
+
+    this.fontFamily = '"trebuchet ms", verdana, arial';
+    this.fontSize = '16px'; // this.updateColors();
+  }
+
+  _createClass(Theme, [{
+    key: "updateColors",
+    value: function updateColors() {
+      // The || is to make sure that if the variable has been defiend by a user override that value is to be used
+
+      /* Main */
+      this.primaryTextColor = this.primaryTextColor || (this.darkMode ? '#ddd' : '#333'); // invert(this.primaryColor);
+
+      this.secondaryColor = this.secondaryColor || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: -120
+      });
+      this.tertiaryColor = this.tertiaryColor || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 180,
+        l: 5
+      });
+      this.primaryBorderColor = this.primaryBorderColor || Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.primaryColor, this.darkMode);
+      this.secondaryBorderColor = this.secondaryBorderColor || Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.secondaryColor, this.darkMode);
+      this.tertiaryBorderColor = this.tertiaryBorderColor || Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.tertiaryColor, this.darkMode);
+      this.noteBorderColor = this.noteBorderColor || Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.noteBkgColor, this.darkMode);
+      this.secondaryTextColor = this.secondaryTextColor || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.secondaryColor);
+      this.tertiaryTextColor = this.tertiaryTextColor || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.tertiaryColor);
+      this.lineColor = this.lineColor || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.background);
+      this.textColor = this.textColor || this.primaryTextColor;
+      /* Flowchart variables */
+
+      this.nodeBkg = this.nodeBkg || this.primaryColor;
+      this.mainBkg = this.mainBkg || this.primaryColor;
+      this.nodeBorder = this.nodeBorder || this.primaryBorderColor;
+      this.clusterBkg = this.clusterBkg || this.tertiaryColor;
+      this.clusterBorder = this.clusterBorder || this.tertiaryBorderColor;
+      this.defaultLinkColor = this.defaultLinkColor || this.lineColor;
+      this.titleColor = this.titleColor || this.tertiaryTextColor;
+      this.edgeLabelBackground = this.edgeLabelBackground || this.darkMode ? Object(khroma__WEBPACK_IMPORTED_MODULE_0__["darken"])(this.secondaryColor, 30) : this.secondaryColor;
+      this.nodeTextColor = this.nodeTextColor || this.primaryTextColor;
+      /* Sequence Diagram variables */
+      // this.actorBorder = lighten(this.border1, 0.5);
+
+      this.actorBorder = this.actorBorder || this.primaryBorderColor;
+      this.actorBkg = this.actorBkg || this.mainBkg;
+      this.actorTextColor = this.actorTextColor || this.primaryTextColor;
+      this.actorLineColor = this.actorLineColor || 'grey';
+      this.labelBoxBkgColor = this.labelBoxBkgColor || this.actorBkg;
+      this.signalColor = this.signalColor || this.textColor;
+      this.signalTextColor = this.signalTextColor || this.textColor;
+      this.labelBoxBorderColor = this.labelBoxBorderColor || this.actorBorder;
+      this.labelTextColor = this.labelTextColor || this.actorTextColor;
+      this.loopTextColor = this.loopTextColor || this.actorTextColor;
+      this.activationBorderColor = this.activationBorderColor || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["darken"])(this.secondaryColor, 10);
+      this.activationBkgColor = this.activationBkgColor || this.secondaryColor;
+      this.sequenceNumberColor = this.sequenceNumberColor || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.lineColor);
+      /* Gantt chart variables */
+
+      this.sectionBkgColor = this.sectionBkgColor || this.tertiaryColor;
+      this.altSectionBkgColor = this.altSectionBkgColor || 'white';
+      this.sectionBkgColor = this.sectionBkgColor || this.secondaryColor;
+      this.sectionBkgColor2 = this.sectionBkgColor2 || this.primaryColor;
+      this.taskBorderColor = this.taskBorderColor || this.primaryBorderColor;
+      this.taskBkgColor = this.taskBkgColor || this.primaryColor;
+      this.activeTaskBorderColor = this.activeTaskBorderColor || this.primaryColor;
+      this.activeTaskBkgColor = this.activeTaskBkgColor || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.primaryColor, 23);
+      this.gridColor = this.gridColor || 'lightgrey';
+      this.doneTaskBkgColor = this.doneTaskBkgColor || 'lightgrey';
+      this.doneTaskBorderColor = this.doneTaskBorderColor || 'grey';
+      this.critBorderColor = this.critBorderColor || '#ff8888';
+      this.critBkgColor = this.critBkgColor || 'red';
+      this.todayLineColor = this.todayLineColor || 'red';
+      this.taskTextColor = this.taskTextColor || this.textColor;
+      this.taskTextOutsideColor = this.taskTextOutsideColor || this.textColor;
+      this.taskTextLightColor = this.taskTextLightColor || this.textColor;
+      this.taskTextColor = this.taskTextColor || this.primaryTextColor;
+      this.taskTextDarkColor = this.taskTextDarkColor || this.textColor;
+      this.taskTextClickableColor = this.taskTextClickableColor || '#003163';
+      /* state colors */
+
+      this.labelColor = this.labelColor || this.primaryTextColor;
+      this.altBackground = this.altBackground || this.tertiaryColor;
+      this.errorBkgColor = this.errorBkgColor || this.tertiaryColor;
+      this.errorTextColor = this.errorTextColor || this.tertiaryTextColor;
+      /* class */
+
+      this.classText = this.classText || this.textColor;
+      /* user-journey */
+
+      this.fillType0 = this.fillType0 || this.primaryColor;
+      this.fillType1 = this.fillType1 || this.secondaryColor;
+      this.fillType2 = this.fillType2 || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 64
+      });
+      this.fillType3 = this.fillType3 || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 64
+      });
+      this.fillType4 = this.fillType4 || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: -64
+      });
+      this.fillType5 = this.fillType5 || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: -64
+      });
+      this.fillType6 = this.fillType6 || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 128
+      });
+      this.fillType7 = this.fillType7 || Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 128
+      });
+    }
+  }, {
+    key: "calculate",
+    value: function calculate(overrides) {
+      var _this = this;
+
+      if (_typeof(overrides) !== 'object') {
+        // Calculate colors form base colors
+        this.updateColors();
+        return;
+      }
+
+      var keys = Object.keys(overrides); // Copy values from overrides, this is mainly for base colors
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      }); // Calculate colors form base colors
+
+      this.updateColors(); // Copy values from overrides again in case of an override of derived value
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      });
+    }
+  }]);
+
+  return Theme;
+}();
+
+var getThemeVariables = function getThemeVariables(userOverrides) {
+  var theme = new Theme();
+  theme.calculate(userOverrides);
+  return theme;
+};
+
+/***/ }),
+
+/***/ "./src/themes/theme-dark.js":
+/*!**********************************!*\
+  !*** ./src/themes/theme-dark.js ***!
+  \**********************************/
+/*! exports provided: getThemeVariables */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getThemeVariables", function() { return getThemeVariables; });
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! khroma */ "./node_modules/khroma/dist/index.js");
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(khroma__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _theme_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./theme-helpers */ "./src/themes/theme-helpers.js");
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var Theme =
+/*#__PURE__*/
+function () {
+  function Theme() {
+    _classCallCheck(this, Theme);
+
+    this.background = '#333';
+    this.primaryColor = '#1f2020';
+    this.secondaryColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.primaryColor, 16);
+    this.tertiaryColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+      h: -160
+    });
+    this.primaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.primaryColor, this.darkMode);
+    this.secondaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.secondaryColor, this.darkMode);
+    this.tertiaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.tertiaryColor, this.darkMode);
+    this.primaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.primaryColor);
+    this.secondaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.secondaryColor);
+    this.tertiaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.tertiaryColor);
+    this.lineColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.background);
+    this.textColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.background);
+    this.mainBkg = '#1f2020';
+    this.secondBkg = 'calculated';
+    this.mainContrastColor = 'lightgrey';
+    this.darkTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])('#323D47'), 10);
+    this.lineColor = 'calculated';
+    this.border1 = '#81B1DB';
+    this.border2 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["rgba"])(255, 255, 255, 0.25);
+    this.arrowheadColor = 'calculated';
+    this.fontFamily = '"trebuchet ms", verdana, arial';
+    this.fontSize = '16px';
+    this.labelBackground = '#181818';
+    this.textColor = '#ccc';
+    /* Flowchart variables */
+
+    this.nodeBkg = 'calculated';
+    this.nodeBorder = 'calculated';
+    this.clusterBkg = 'calculated';
+    this.clusterBorder = 'calculated';
+    this.defaultLinkColor = 'calculated';
+    this.titleColor = '#F9FFFE';
+    this.edgeLabelBackground = 'calculated';
+    /* Sequence Diagram variables */
+
+    this.actorBorder = 'calculated';
+    this.actorBkg = 'calculated';
+    this.actorTextColor = 'calculated';
+    this.actorLineColor = 'calculated';
+    this.signalColor = 'calculated';
+    this.signalTextColor = 'calculated';
+    this.labelBoxBkgColor = 'calculated';
+    this.labelBoxBorderColor = 'calculated';
+    this.labelTextColor = 'calculated';
+    this.loopTextColor = 'calculated';
+    this.noteBorderColor = 'calculated';
+    this.noteBkgColor = '#fff5ad';
+    this.noteTextColor = 'calculated';
+    this.activationBorderColor = 'calculated';
+    this.activationBkgColor = 'calculated';
+    this.sequenceNumberColor = 'black';
+    /* Gantt chart variables */
+
+    this.sectionBkgColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["darken"])('#EAE8D9', 30);
+    this.altSectionBkgColor = 'calculated';
+    this.sectionBkgColor2 = '#EAE8D9';
+    this.taskBorderColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["rgba"])(255, 255, 255, 70);
+    this.taskBkgColor = 'calculated';
+    this.taskTextColor = 'calculated';
+    this.taskTextLightColor = 'calculated';
+    this.taskTextOutsideColor = 'calculated';
+    this.taskTextClickableColor = '#003163';
+    this.activeTaskBorderColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["rgba"])(255, 255, 255, 50);
+    this.activeTaskBkgColor = '#81B1DB';
+    this.gridColor = 'calculated';
+    this.doneTaskBkgColor = 'calculated';
+    this.doneTaskBorderColor = 'grey';
+    this.critBorderColor = '#E83737';
+    this.critBkgColor = '#E83737';
+    this.taskTextDarkColor = 'calculated';
+    this.todayLineColor = '#DB5757';
+    /* state colors */
+
+    this.labelColor = 'calculated';
+    this.errorBkgColor = '#a44141';
+    this.errorTextColor = '#ddd';
+  }
+
+  _createClass(Theme, [{
+    key: "updateColors",
+    value: function updateColors() {
+      this.secondBkg = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.mainBkg, 16);
+      this.lineColor = this.mainContrastColor;
+      this.arrowheadColor = this.mainContrastColor;
+      /* Flowchart variables */
+
+      this.nodeBkg = this.mainBkg;
+      this.nodeBorder = this.border1;
+      this.clusterBkg = this.secondBkg;
+      this.clusterBorder = this.border2;
+      this.defaultLinkColor = this.lineColor;
+      this.edgeLabelBackground = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.labelBackground, 25);
+      /* Sequence Diagram variables */
+
+      this.actorBorder = this.border1;
+      this.actorBkg = this.mainBkg;
+      this.actorTextColor = this.mainContrastColor;
+      this.actorLineColor = this.mainContrastColor;
+      this.signalColor = this.mainContrastColor;
+      this.signalTextColor = this.mainContrastColor;
+      this.labelBoxBkgColor = this.actorBkg;
+      this.labelBoxBorderColor = this.actorBorder;
+      this.labelTextColor = this.mainContrastColor;
+      this.loopTextColor = this.mainContrastColor;
+      this.noteBorderColor = this.border2;
+      this.noteTextColor = this.mainBkg;
+      this.activationBorderColor = this.border1;
+      this.activationBkgColor = this.secondBkg;
+      /* Gantt chart variables */
+
+      this.altSectionBkgColor = this.background;
+      this.taskBkgColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.mainBkg, 23);
+      this.taskTextColor = this.darkTextColor;
+      this.taskTextLightColor = this.mainContrastColor;
+      this.taskTextOutsideColor = this.taskTextLightColor;
+      this.gridColor = this.mainContrastColor;
+      this.doneTaskBkgColor = this.mainContrastColor;
+      this.taskTextDarkColor = this.darkTextColor;
+      /* state colors */
+
+      this.labelColor = this.textColor;
+      this.altBackground = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.background, 20);
+      this.fillType0 = this.primaryColor;
+      this.fillType1 = this.secondaryColor;
+      this.fillType2 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 64
+      });
+      this.fillType3 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 64
+      });
+      this.fillType4 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: -64
+      });
+      this.fillType5 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: -64
+      });
+      this.fillType6 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 128
+      });
+      this.fillType7 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 128
+      });
+      /* class */
+
+      this.classText = this.primaryTextColor;
+    }
+  }, {
+    key: "calculate",
+    value: function calculate(overrides) {
+      var _this = this;
+
+      if (_typeof(overrides) !== 'object') {
+        // Calculate colors form base colors
+        this.updateColors();
+        return;
+      }
+
+      var keys = Object.keys(overrides); // Copy values from overrides, this is mainly for base colors
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      }); // Calculate colors form base colors
+
+      this.updateColors(); // Copy values from overrides again in case of an override of derived value
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      });
+    }
+  }]);
+
+  return Theme;
+}();
+
+var getThemeVariables = function getThemeVariables(userOverrides) {
+  var theme = new Theme();
+  theme.calculate(userOverrides);
+  console.info('Theme(dark)', {
+    userOverrides: userOverrides,
+    theme: theme
+  });
+  return theme;
+};
+
+/***/ }),
+
+/***/ "./src/themes/theme-default.js":
+/*!*************************************!*\
+  !*** ./src/themes/theme-default.js ***!
+  \*************************************/
+/*! exports provided: getThemeVariables */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getThemeVariables", function() { return getThemeVariables; });
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! khroma */ "./node_modules/khroma/dist/index.js");
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(khroma__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _theme_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./theme-helpers */ "./src/themes/theme-helpers.js");
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var Theme =
+/*#__PURE__*/
+function () {
+  function Theme() {
+    _classCallCheck(this, Theme);
+
+    /* Base variables */
+    this.background = '#f4f4f4';
+    this.primaryColor = '#ECECFF';
+    this.secondaryColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+      h: 120
+    });
+    this.secondaryColor = '#ffffde';
+    this.tertiaryColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+      h: -160
+    });
+    this.primaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.primaryColor, this.darkMode);
+    this.secondaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.secondaryColor, this.darkMode);
+    this.tertiaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.tertiaryColor, this.darkMode); // this.noteBorderColor = mkBorder(this.noteBkgColor, this.darkMode);
+
+    this.primaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.primaryColor);
+    this.secondaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.secondaryColor);
+    this.tertiaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.tertiaryColor);
+    this.lineColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.background);
+    this.textColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.background);
+    this.background = 'white';
+    this.mainBkg = '#ECECFF';
+    this.secondBkg = '#ffffde';
+    this.lineColor = '#333333';
+    this.border1 = '#9370DB';
+    this.border2 = '#aaaa33';
+    this.arrowheadColor = '#333333';
+    this.fontFamily = '"trebuchet ms", verdana, arial';
+    this.fontSize = '16px';
+    this.labelBackground = '#e8e8e8';
+    this.textColor = '#333';
+    /* Flowchart variables */
+
+    this.nodeBkg = 'calculated';
+    this.nodeBorder = 'calculated';
+    this.clusterBkg = 'calculated';
+    this.clusterBorder = 'calculated';
+    this.defaultLinkColor = 'calculated';
+    this.titleColor = 'calculated';
+    this.edgeLabelBackground = 'calculated';
+    /* Sequence Diagram variables */
+
+    this.actorBorder = 'calculated';
+    this.actorBkg = 'calculated';
+    this.actorTextColor = 'black';
+    this.actorLineColor = 'grey';
+    this.signalColor = 'calculated';
+    this.signalTextColor = 'calculated';
+    this.labelBoxBkgColor = 'calculated';
+    this.labelBoxBorderColor = 'calculated';
+    this.labelTextColor = 'calculated';
+    this.loopTextColor = 'calculated';
+    this.noteBorderColor = 'calculated';
+    this.noteBkgColor = '#fff5ad';
+    this.noteTextColor = 'calculated';
+    this.activationBorderColor = '#666';
+    this.activationBkgColor = '#f4f4f4';
+    this.sequenceNumberColor = 'white';
+    /* Gantt chart variables */
+
+    this.sectionBkgColor = 'calculated';
+    this.altSectionBkgColor = 'calculated';
+    this.sectionBkgColor2 = 'calculated';
+    this.taskBorderColor = 'calculated';
+    this.taskBkgColor = 'calculated';
+    this.taskTextLightColor = 'calculated';
+    this.taskTextColor = this.taskTextLightColor;
+    this.taskTextDarkColor = 'calculated';
+    this.taskTextOutsideColor = this.taskTextDarkColor;
+    this.taskTextClickableColor = 'calculated';
+    this.activeTaskBorderColor = 'calculated';
+    this.activeTaskBkgColor = 'calculated';
+    this.gridColor = 'calculated';
+    this.doneTaskBkgColor = 'calculated';
+    this.doneTaskBorderColor = 'calculated';
+    this.critBorderColor = 'calculated';
+    this.critBkgColor = 'calculated';
+    this.todayLineColor = 'calculated';
+    this.sectionBkgColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["rgba"])(102, 102, 255, 0.49);
+    this.altSectionBkgColor = 'white';
+    this.sectionBkgColor2 = '#fff400';
+    this.taskBorderColor = '#534fbc';
+    this.taskBkgColor = '#8a90dd';
+    this.taskTextLightColor = 'white';
+    this.taskTextColor = 'calculated';
+    this.taskTextDarkColor = 'black';
+    this.taskTextOutsideColor = 'calculated';
+    this.taskTextClickableColor = '#003163';
+    this.activeTaskBorderColor = '#534fbc';
+    this.activeTaskBkgColor = '#bfc7ff';
+    this.gridColor = 'lightgrey';
+    this.doneTaskBkgColor = 'lightgrey';
+    this.doneTaskBorderColor = 'grey';
+    this.critBorderColor = '#ff8888';
+    this.critBkgColor = 'red';
+    this.todayLineColor = 'red';
+    /* state colors */
+
+    this.labelColor = 'black';
+    this.errorBkgColor = '#552222';
+    this.errorTextColor = '#552222';
+    this.updateColors();
+  }
+
+  _createClass(Theme, [{
+    key: "updateColors",
+    value: function updateColors() {
+      /* Flowchart variables */
+      this.nodeBkg = this.mainBkg;
+      this.nodeBorder = this.border1; // border 1
+
+      this.clusterBkg = this.secondBkg;
+      this.clusterBorder = this.border2;
+      this.defaultLinkColor = this.lineColor;
+      this.titleColor = this.textColor;
+      this.edgeLabelBackground = this.labelBackground;
+      /* Sequence Diagram variables */
+      // this.actorBorder = lighten(this.border1, 0.5);
+
+      this.actorBorder = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.border1, 23);
+      this.actorBkg = this.mainBkg;
+      this.labelBoxBkgColor = this.actorBkg;
+      this.signalColor = this.textColor;
+      this.signalTextColor = this.textColor;
+      this.labelBoxBorderColor = this.actorBorder;
+      this.labelTextColor = this.actorTextColor;
+      this.loopTextColor = this.actorTextColor;
+      this.noteBorderColor = this.border2;
+      this.noteTextColor = this.actorTextColor;
+      /* Gantt chart variables */
+
+      this.taskTextColor = this.taskTextLightColor;
+      this.taskTextOutsideColor = this.taskTextDarkColor;
+      /* state colors */
+
+      /* class */
+
+      this.classText = this.primaryTextColor;
+      /* journey */
+
+      this.fillType0 = this.primaryColor;
+      this.fillType1 = this.secondaryColor;
+      this.fillType2 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 64
+      });
+      this.fillType3 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 64
+      });
+      this.fillType4 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: -64
+      });
+      this.fillType5 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: -64
+      });
+      this.fillType6 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 128
+      });
+      this.fillType7 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 128
+      });
+    }
+  }, {
+    key: "calculate",
+    value: function calculate(overrides) {
+      var _this = this;
+
+      if (_typeof(overrides) !== 'object') {
+        // Calculate colors form base colors
+        this.updateColors();
+        return;
+      }
+
+      var keys = Object.keys(overrides); // Copy values from overrides, this is mainly for base colors
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      }); // Calculate colors form base colors
+
+      this.updateColors(); // Copy values from overrides again in case of an override of derived value
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      });
+    }
+  }]);
+
+  return Theme;
+}();
+
+var getThemeVariables = function getThemeVariables(userOverrides) {
+  var theme = new Theme();
+  theme.calculate(userOverrides); // console.info('Theme(default)', { userOverrides, theme });
+
+  return theme;
+};
+
+/***/ }),
+
+/***/ "./src/themes/theme-forest.js":
+/*!************************************!*\
+  !*** ./src/themes/theme-forest.js ***!
+  \************************************/
+/*! exports provided: getThemeVariables */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getThemeVariables", function() { return getThemeVariables; });
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! khroma */ "./node_modules/khroma/dist/index.js");
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(khroma__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _theme_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./theme-helpers */ "./src/themes/theme-helpers.js");
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var Theme =
+/*#__PURE__*/
+function () {
+  function Theme() {
+    _classCallCheck(this, Theme);
+
+    /* Base vales */
+    this.background = '#f4f4f4';
+    this.primaryColor = '#cde498';
+    this.secondaryColor = '#cdffb2';
+    this.background = 'white';
+    this.mainBkg = '#cde498';
+    this.secondBkg = '#cdffb2';
+    this.lineColor = 'green';
+    this.border1 = '#13540c';
+    this.border2 = '#6eaa49';
+    this.arrowheadColor = 'green';
+    this.fontFamily = '"trebuchet ms", verdana, arial';
+    this.fontSize = '16px';
+    this.tertiaryColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])('#cde498', 10);
+    this.primaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.primaryColor, this.darkMode);
+    this.secondaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.secondaryColor, this.darkMode);
+    this.tertiaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.tertiaryColor, this.darkMode);
+    this.primaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.primaryColor);
+    this.secondaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.secondaryColor);
+    this.tertiaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.primaryColor);
+    this.lineColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.background);
+    this.textColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.background);
+    /* Flowchart variables */
+
+    this.nodeBkg = 'calculated';
+    this.nodeBorder = 'calculated';
+    this.clusterBkg = 'calculated';
+    this.clusterBorder = 'calculated';
+    this.defaultLinkColor = 'calculated';
+    this.titleColor = '#333';
+    this.edgeLabelBackground = '#e8e8e8';
+    /* Sequence Diagram variables */
+
+    this.actorBorder = 'calculated';
+    this.actorBkg = 'calculated';
+    this.actorTextColor = 'black';
+    this.actorLineColor = 'grey';
+    this.signalColor = '#333';
+    this.signalTextColor = '#333';
+    this.labelBoxBkgColor = 'calculated';
+    this.labelBoxBorderColor = '#326932';
+    this.labelTextColor = 'calculated';
+    this.loopTextColor = 'calculated';
+    this.noteBorderColor = 'calculated';
+    this.noteBkgColor = '#fff5ad';
+    this.noteTextColor = 'calculated';
+    this.activationBorderColor = '#666';
+    this.activationBkgColor = '#f4f4f4';
+    this.sequenceNumberColor = 'white';
+    /* Gantt chart variables */
+
+    this.sectionBkgColor = '#6eaa49';
+    this.altSectionBkgColor = 'white';
+    this.sectionBkgColor2 = '#6eaa49';
+    this.taskBorderColor = 'calculated';
+    this.taskBkgColor = '#487e3a';
+    this.taskTextLightColor = 'white';
+    this.taskTextColor = 'calculated';
+    this.taskTextDarkColor = 'black';
+    this.taskTextOutsideColor = 'calculated';
+    this.taskTextClickableColor = '#003163';
+    this.activeTaskBorderColor = 'calculated';
+    this.activeTaskBkgColor = 'calculated';
+    this.gridColor = 'lightgrey';
+    this.doneTaskBkgColor = 'lightgrey';
+    this.doneTaskBorderColor = 'grey';
+    this.critBorderColor = '#ff8888';
+    this.critBkgColor = 'red';
+    this.todayLineColor = 'red';
+    /* state colors */
+
+    this.labelColor = 'black';
+    this.errorBkgColor = '#552222';
+    this.errorTextColor = '#552222';
+  }
+
+  _createClass(Theme, [{
+    key: "updateColors",
+    value: function updateColors() {
+      /* Flowchart variables */
+      this.nodeBkg = this.mainBkg;
+      this.nodeBorder = this.border1;
+      this.clusterBkg = this.secondBkg;
+      this.clusterBorder = this.border2;
+      this.defaultLinkColor = this.lineColor;
+      /* Sequence Diagram variables */
+
+      this.actorBorder = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["darken"])(this.mainBkg, 20);
+      this.actorBkg = this.mainBkg;
+      this.labelBoxBkgColor = this.actorBkg;
+      this.labelTextColor = this.actorTextColor;
+      this.loopTextColor = this.actorTextColor;
+      this.noteBorderColor = this.border2;
+      this.noteTextColor = this.actorTextColor;
+      /* Gantt chart variables */
+
+      this.taskBorderColor = this.border1;
+      this.taskTextColor = this.taskTextLightColor;
+      this.taskTextOutsideColor = this.taskTextDarkColor;
+      this.activeTaskBorderColor = this.taskBorderColor;
+      this.activeTaskBkgColor = this.mainBkg;
+      /* state colors */
+
+      /* class */
+
+      this.classText = this.primaryTextColor;
+      /* journey */
+
+      this.fillType0 = this.primaryColor;
+      this.fillType1 = this.secondaryColor;
+      this.fillType2 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 64
+      });
+      this.fillType3 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 64
+      });
+      this.fillType4 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: -64
+      });
+      this.fillType5 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: -64
+      });
+      this.fillType6 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 128
+      });
+      this.fillType7 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 128
+      });
+    }
+  }, {
+    key: "calculate",
+    value: function calculate(overrides) {
+      var _this = this;
+
+      if (_typeof(overrides) !== 'object') {
+        // Calculate colors form base colors
+        this.updateColors();
+        return;
+      }
+
+      var keys = Object.keys(overrides); // Copy values from overrides, this is mainly for base colors
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      }); // Calculate colors form base colors
+
+      this.updateColors(); // Copy values from overrides again in case of an override of derived value
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      });
+    }
+  }]);
+
+  return Theme;
+}();
+
+var getThemeVariables = function getThemeVariables(userOverrides) {
+  var theme = new Theme();
+  theme.calculate(userOverrides);
+  console.info('Theme(forest)', {
+    userOverrides: userOverrides,
+    theme: theme
+  });
+  return theme;
+};
+
+/***/ }),
+
+/***/ "./src/themes/theme-helpers.js":
+/*!*************************************!*\
+  !*** ./src/themes/theme-helpers.js ***!
+  \*************************************/
+/*! exports provided: mkBorder */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mkBorder", function() { return mkBorder; });
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! khroma */ "./node_modules/khroma/dist/index.js");
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(khroma__WEBPACK_IMPORTED_MODULE_0__);
+
+var mkBorder = function mkBorder(col, darkMode) {
+  return darkMode ? Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(col, {
+    s: -40,
+    l: 10
+  }) : Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(col, {
+    s: -40,
+    l: -10
+  });
+};
+
+/***/ }),
+
+/***/ "./src/themes/theme-neutral.js":
+/*!*************************************!*\
+  !*** ./src/themes/theme-neutral.js ***!
+  \*************************************/
+/*! exports provided: getThemeVariables */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getThemeVariables", function() { return getThemeVariables; });
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! khroma */ "./node_modules/khroma/dist/index.js");
+/* harmony import */ var khroma__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(khroma__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _theme_helpers__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./theme-helpers */ "./src/themes/theme-helpers.js");
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+
+ // const Color = require ( 'khroma/dist/color' ).default
+// Color.format.hex.stringify(Color.parse('hsl(210, 66.6666666667%, 95%)')); // => "#EAF2FB"
+
+var Theme =
+/*#__PURE__*/
+function () {
+  function Theme() {
+    _classCallCheck(this, Theme);
+
+    this.primaryColor = '#eee';
+    this.contrast = '#26a';
+    this.secondaryColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.contrast, 55);
+    this.background = '#ffffff'; // this.secondaryColor = adjust(this.primaryColor, { h: 120 });
+
+    this.tertiaryColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+      h: -160
+    }); // console.log('primary color', this.primaryColor, 'tertiary - color', this.tertiaryColor);
+
+    this.primaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.primaryColor, this.darkMode);
+    this.secondaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.secondaryColor, this.darkMode);
+    this.tertiaryBorderColor = Object(_theme_helpers__WEBPACK_IMPORTED_MODULE_1__["mkBorder"])(this.tertiaryColor, this.darkMode); // this.noteBorderColor = mkBorder(this.noteBkgColor, this.darkMode);
+
+    this.primaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.primaryColor);
+    this.secondaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.secondaryColor);
+    this.tertiaryTextColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.tertiaryColor);
+    this.lineColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.background);
+    this.textColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["invert"])(this.background);
+    this.altBackground = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.contrast, 55);
+    this.mainBkg = '#eee';
+    this.secondBkg = 'calculated';
+    this.lineColor = '#666';
+    this.border1 = '#999';
+    this.border2 = 'calculated';
+    this.note = '#ffa';
+    this.text = '#333';
+    this.critical = '#d42';
+    this.done = '#bbb';
+    this.arrowheadColor = '#333333';
+    this.fontFamily = '"trebuchet ms", verdana, arial';
+    this.fontSize = '16px';
+    /* Flowchart variables */
+
+    this.nodeBkg = 'calculated';
+    this.nodeBorder = 'calculated';
+    this.clusterBkg = 'calculated';
+    this.clusterBorder = 'calculated';
+    this.defaultLinkColor = 'calculated';
+    this.titleColor = 'calculated';
+    this.edgeLabelBackground = 'white';
+    /* Sequence Diagram variables */
+
+    this.actorBorder = 'calculated';
+    this.actorBkg = 'calculated';
+    this.actorTextColor = 'calculated';
+    this.actorLineColor = 'calculated';
+    this.signalColor = 'calculated';
+    this.signalTextColor = 'calculated';
+    this.labelBoxBkgColor = 'calculated';
+    this.labelBoxBorderColor = 'calculated';
+    this.labelTextColor = 'calculated';
+    this.loopTextColor = 'calculated';
+    this.noteBorderColor = 'calculated';
+    this.noteBkgColor = 'calculated';
+    this.noteTextColor = 'calculated';
+    this.activationBorderColor = '#666';
+    this.activationBkgColor = '#f4f4f4';
+    this.sequenceNumberColor = 'white';
+    /* Gantt chart variables */
+
+    this.sectionBkgColor = 'calculated';
+    this.altSectionBkgColor = 'white';
+    this.sectionBkgColor2 = 'calculated';
+    this.taskBorderColor = 'calculated';
+    this.taskBkgColor = 'calculated';
+    this.taskTextLightColor = 'white';
+    this.taskTextColor = 'calculated';
+    this.taskTextDarkColor = 'calculated';
+    this.taskTextOutsideColor = 'calculated';
+    this.taskTextClickableColor = '#003163';
+    this.activeTaskBorderColor = 'calculated';
+    this.activeTaskBkgColor = 'calculated';
+    this.gridColor = 'calculated';
+    this.doneTaskBkgColor = 'calculated';
+    this.doneTaskBorderColor = 'calculated';
+    this.critBkgColor = 'calculated';
+    this.critBorderColor = 'calculated';
+    this.todayLineColor = 'calculated';
+    /* state colors */
+
+    this.labelColor = 'black';
+    this.errorBkgColor = '#552222';
+    this.errorTextColor = '#552222';
+  }
+
+  _createClass(Theme, [{
+    key: "updateColors",
+    value: function updateColors() {
+      this.secondBkg = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.contrast, 55);
+      this.border2 = this.contrast;
+      /* Flowchart variables */
+
+      this.nodeBkg = this.mainBkg;
+      this.nodeBorder = this.border1;
+      this.clusterBkg = this.secondBkg;
+      this.clusterBorder = this.border2;
+      this.defaultLinkColor = this.lineColor;
+      this.titleColor = this.text;
+      /* Sequence Diagram variables */
+
+      this.actorBorder = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.border1, 23);
+      this.actorBkg = this.mainBkg;
+      this.actorTextColor = this.text;
+      this.actorLineColor = this.lineColor;
+      this.signalColor = this.text;
+      this.signalTextColor = this.text;
+      this.labelBoxBkgColor = this.actorBkg;
+      this.labelBoxBorderColor = this.actorBorder;
+      this.labelTextColor = this.text;
+      this.loopTextColor = this.text;
+      this.noteBorderColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["darken"])(this.note, 60);
+      this.noteBkgColor = this.note;
+      this.noteTextColor = this.actorTextColor;
+      /* Gantt chart variables */
+
+      this.sectionBkgColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.contrast, 30);
+      this.sectionBkgColor2 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.contrast, 30);
+      this.taskBorderColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["darken"])(this.contrast, 10);
+      this.taskBkgColor = this.contrast;
+      this.taskTextColor = this.taskTextLightColor;
+      this.taskTextDarkColor = this.text;
+      this.taskTextOutsideColor = this.taskTextDarkColor;
+      this.activeTaskBorderColor = this.taskBorderColor;
+      this.activeTaskBkgColor = this.mainBkg;
+      this.gridColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["lighten"])(this.border1, 30);
+      this.doneTaskBkgColor = this.done;
+      this.doneTaskBorderColor = this.lineColor;
+      this.critBkgColor = this.critical;
+      this.critBorderColor = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["darken"])(this.critBkgColor, 10);
+      this.todayLineColor = this.critBkgColor;
+      /* state colors */
+
+      /* class */
+
+      this.classText = this.primaryTextColor;
+      /* journey */
+
+      this.fillType0 = this.primaryColor;
+      this.fillType1 = this.secondaryColor;
+      this.fillType2 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 64
+      });
+      this.fillType3 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 64
+      });
+      this.fillType4 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: -64
+      });
+      this.fillType5 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: -64
+      });
+      this.fillType6 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.primaryColor, {
+        h: 128
+      });
+      this.fillType7 = Object(khroma__WEBPACK_IMPORTED_MODULE_0__["adjust"])(this.secondaryColor, {
+        h: 128
+      });
+    }
+  }, {
+    key: "calculate",
+    value: function calculate(overrides) {
+      var _this = this;
+
+      if (_typeof(overrides) !== 'object') {
+        // Calculate colors form base colors
+        this.updateColors();
+        return;
+      }
+
+      var keys = Object.keys(overrides); // Copy values from overrides, this is mainly for base colors
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      }); // Calculate colors form base colors
+
+      this.updateColors(); // Copy values from overrides again in case of an override of derived value
+
+      keys.forEach(function (k) {
+        _this[k] = overrides[k];
+      });
+    }
+  }]);
+
+  return Theme;
+}();
+
+var getThemeVariables = function getThemeVariables(userOverrides) {
+  var theme = new Theme();
+  theme.calculate(userOverrides);
+  console.info('Theme(neutral)', {
+    userOverrides: userOverrides,
+    theme: theme
+  });
+  return theme;
+};
+
+/***/ }),
+
+/***/ "./src/utils.js":
+/*!**********************!*\
+  !*** ./src/utils.js ***!
+  \**********************/
+/*! exports provided: detectInit, detectDirective, detectType, isSubstringInArray, interpolateToCurve, formatUrl, runFunc, getStylesFromArray, generateId, random, assignWithDepth, getTextObj, drawSimpleText, wrapLabel, calculateTextHeight, calculateTextWidth, calculateTextDimensions, default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "detectInit", function() { return detectInit; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "detectDirective", function() { return detectDirective; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "detectType", function() { return detectType; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSubstringInArray", function() { return isSubstringInArray; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interpolateToCurve", function() { return interpolateToCurve; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "formatUrl", function() { return formatUrl; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runFunc", function() { return runFunc; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getStylesFromArray", function() { return getStylesFromArray; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generateId", function() { return generateId; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "random", function() { return random; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "assignWithDepth", function() { return assignWithDepth; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTextObj", function() { return getTextObj; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawSimpleText", function() { return drawSimpleText; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wrapLabel", function() { return wrapLabel; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "calculateTextHeight", function() { return calculateTextHeight; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "calculateTextWidth", function() { return calculateTextWidth; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "calculateTextDimensions", function() { return calculateTextDimensions; });
+/* harmony import */ var d3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3 */ "./node_modules/d3/index.js");
+/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logger */ "./src/logger.js");
+/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @braintree/sanitize-url */ "./node_modules/@braintree/sanitize-url/index.js");
+/* harmony import */ var _braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2__);
+/* harmony import */ var _diagrams_common_common__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./diagrams/common/common */ "./src/diagrams/common/common.js");
+var _this = undefined;
+
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }
+
+function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); }
+
+function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); }
+
+function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }
+
+
+
+
+ // import cryptoRandomString from 'crypto-random-string';
+// Effectively an enum of the supported curve types, accessible by name
+
+var d3CurveTypes = {
+  curveBasis: d3__WEBPACK_IMPORTED_MODULE_0__["curveBasis"],
+  curveBasisClosed: d3__WEBPACK_IMPORTED_MODULE_0__["curveBasisClosed"],
+  curveBasisOpen: d3__WEBPACK_IMPORTED_MODULE_0__["curveBasisOpen"],
+  curveLinear: d3__WEBPACK_IMPORTED_MODULE_0__["curveLinear"],
+  curveLinearClosed: d3__WEBPACK_IMPORTED_MODULE_0__["curveLinearClosed"],
+  curveMonotoneX: d3__WEBPACK_IMPORTED_MODULE_0__["curveMonotoneX"],
+  curveMonotoneY: d3__WEBPACK_IMPORTED_MODULE_0__["curveMonotoneY"],
+  curveNatural: d3__WEBPACK_IMPORTED_MODULE_0__["curveNatural"],
+  curveStep: d3__WEBPACK_IMPORTED_MODULE_0__["curveStep"],
+  curveStepAfter: d3__WEBPACK_IMPORTED_MODULE_0__["curveStepAfter"],
+  curveStepBefore: d3__WEBPACK_IMPORTED_MODULE_0__["curveStepBefore"]
+};
+var directive = /[%]{2}[{]\s*(?:(?:(\w+)\s*:|(\w+))\s*(?:(?:(\w+))|((?:(?![}][%]{2}).|\r?\n)*))?\s*)(?:[}][%]{2})?/gi;
+var directiveWithoutOpen = /\s*(?:(?:(\w+)(?=:):|(\w+))\s*(?:(?:(\w+))|((?:(?![}][%]{2}).|\r?\n)*))?\s*)(?:[}][%]{2})?/gi;
+var anyComment = /\s*%%.*\n/gm;
+/**
+ * @function detectInit
+ * Detects the init config object from the text
+ * ```mermaid
+ * %%{init: {"theme": "debug", "logLevel": 1 }}%%
+ * graph LR
+ *  a-->b
+ *  b-->c
+ *  c-->d
+ *  d-->e
+ *  e-->f
+ *  f-->g
+ *  g-->h
+ * ```
+ * or
+ * ```mermaid
+ * %%{initialize: {"theme": "dark", logLevel: "debug" }}%%
+ * graph LR
+ *  a-->b
+ *  b-->c
+ *  c-->d
+ *  d-->e
+ *  e-->f
+ *  f-->g
+ *  g-->h
+ * ```
+ *
+ * @param {string} text The text defining the graph
+ * @returns {object} the json object representing the init passed to mermaid.initialize()
+ */
+
+var detectInit = function detectInit(text) {
+  var inits = detectDirective(text, /(?:init\b)|(?:initialize\b)/);
+  var results = {};
+
+  if (Array.isArray(inits)) {
+    var args = inits.map(function (init) {
+      return init.args;
+    });
+    results = assignWithDepth(results, _toConsumableArray(args));
+  } else {
+    results = inits.args;
+  }
+
+  if (results) {
+    var type = detectType(text);
+    ['config'].forEach(function (prop) {
+      if (typeof results[prop] !== 'undefined') {
+        if (type === 'flowchart-v2') {
+          type = 'flowchart';
+        }
+
+        results[type] = results[prop];
+        delete results[prop];
+      }
+    });
+  }
+
+  return results;
+};
+/**
+ * @function detectDirective
+ * Detects the directive from the text. Text can be single line or multiline. If type is null or omitted
+ * the first directive encountered in text will be returned
+ * ```mermaid
+ * graph LR
+ *  %%{somedirective}%%
+ *  a-->b
+ *  b-->c
+ *  c-->d
+ *  d-->e
+ *  e-->f
+ *  f-->g
+ *  g-->h
+ * ```
+ *
+ * @param {string} text The text defining the graph
+ * @param {string|RegExp} type The directive to return (default: null)
+ * @returns {object | Array} An object or Array representing the directive(s): { type: string, args: object|null } matched by the input type
+ *          if a single directive was found, that directive object will be returned.
+ */
+
+var detectDirective = function detectDirective(text) {
+  var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+
+  try {
+    var commentWithoutDirectives = new RegExp("[%]{2}(?![{]".concat(directiveWithoutOpen.source, ")(?=[}][%]{2}).*\n"), 'ig');
+    text = text.trim().replace(commentWithoutDirectives, '').replace(/'/gm, '"');
+    _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].debug("Detecting diagram directive".concat(type !== null ? ' type:' + type : '', " based on the text:").concat(text));
+    var match,
+        result = [];
+
+    while ((match = directive.exec(text)) !== null) {
+      // This is necessary to avoid infinite loops with zero-width matches
+      if (match.index === directive.lastIndex) {
+        directive.lastIndex++;
+      }
+
+      if (match && !type || type && match[1] && match[1].match(type) || type && match[2] && match[2].match(type)) {
+        var _type = match[1] ? match[1] : match[2];
+
+        var args = match[3] ? match[3].trim() : match[4] ? JSON.parse(match[4].trim()) : null;
+        result.push({
+          type: _type,
+          args: args
+        });
+      }
+    }
+
+    if (result.length === 0) {
+      result.push({
+        type: text,
+        args: null
+      });
+    }
+
+    return result.length === 1 ? result[0] : result;
+  } catch (error) {
+    _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].error("ERROR: ".concat(error.message, " - Unable to parse directive").concat(type !== null ? ' type:' + type : '', " based on the text:").concat(text));
+    return {
+      type: null,
+      args: null
+    };
+  }
+};
+/**
+ * @function detectType
+ * Detects the type of the graph text. Takes into consideration the possible existence of an %%init
+ * directive
+ * ```mermaid
+ * %%{initialize: {"startOnLoad": true, logLevel: "fatal" }}%%
+ * graph LR
+ *  a-->b
+ *  b-->c
+ *  c-->d
+ *  d-->e
+ *  e-->f
+ *  f-->g
+ *  g-->h
+ * ```
+ *
+ * @param {string} text The text defining the graph
+ * @returns {string} A graph definition key
+ */
+
+var detectType = function detectType(text) {
+  text = text.replace(directive, '').replace(anyComment, '\n');
+  _logger__WEBPACK_IMPORTED_MODULE_1__["logger"].debug('Detecting diagram type based on the text ' + text);
+
+  if (text.match(/^\s*sequenceDiagram/)) {
+    return 'sequence';
+  }
+
+  if (text.match(/^\s*gantt/)) {
+    return 'gantt';
+  }
+
+  if (text.match(/^\s*classDiagram-v2/)) {
+    return 'classDiagram';
+  }
+
+  if (text.match(/^\s*classDiagram/)) {
+    return 'class';
+  }
+
+  if (text.match(/^\s*stateDiagram-v2/)) {
+    return 'stateDiagram';
+  }
+
+  if (text.match(/^\s*stateDiagram/)) {
+    return 'state';
+  }
+
+  if (text.match(/^\s*gitGraph/)) {
+    return 'git';
+  }
+
+  if (text.match(/^\s*flowchart/)) {
+    return 'flowchart-v2';
+  }
+
+  if (text.match(/^\s*info/)) {
+    return 'info';
+  }
+
+  if (text.match(/^\s*pie/)) {
+    return 'pie';
+  }
+
+  if (text.match(/^\s*erDiagram/)) {
+    return 'er';
+  }
+
+  if (text.match(/^\s*journey/)) {
+    return 'journey';
+  }
+
+  return 'flowchart';
+};
+
+var memoize = function memoize(fn, resolver) {
+  var cache = {};
+  return function () {
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    var n = resolver ? resolver.apply(_this, args) : args[0];
+
+    if (n in cache) {
+      return cache[n];
+    } else {
+      var result = fn.apply(void 0, args);
+      cache[n] = result;
+      return result;
+    }
+  };
+};
+/**
+ * @function isSubstringInArray
+ * Detects whether a substring in present in a given array
+ * @param {string} str The substring to detect
+ * @param {array} arr The array to search
+ * @returns {number} the array index containing the substring or -1 if not present
+ **/
+
+
+var isSubstringInArray = function isSubstringInArray(str, arr) {
+  for (var i = 0; i < arr.length; i++) {
+    if (arr[i].match(str)) return i;
+  }
+
+  return -1;
+};
+var interpolateToCurve = function interpolateToCurve(interpolate, defaultCurve) {
+  if (!interpolate) {
+    return defaultCurve;
+  }
+
+  var curveName = "curve".concat(interpolate.charAt(0).toUpperCase() + interpolate.slice(1));
+  return d3CurveTypes[curveName] || defaultCurve;
+};
+var formatUrl = function formatUrl(linkStr, config) {
+  var url = linkStr.trim();
+
+  if (url) {
+    if (config.securityLevel !== 'loose') {
+      return Object(_braintree_sanitize_url__WEBPACK_IMPORTED_MODULE_2__["sanitizeUrl"])(url);
+    }
+
+    return url;
+  }
+};
+var runFunc = function runFunc(functionName) {
+  var _obj;
+
+  var arrPaths = functionName.split('.');
+  var len = arrPaths.length - 1;
+  var fnName = arrPaths[len];
+  var obj = window;
+
+  for (var i = 0; i < len; i++) {
+    obj = obj[arrPaths[i]];
+    if (!obj) return;
+  }
+
+  for (var _len2 = arguments.length, params = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+    params[_key2 - 1] = arguments[_key2];
+  }
+
+  (_obj = obj)[fnName].apply(_obj, params);
+};
+
+var distance = function distance(p1, p2) {
+  return p1 && p2 ? Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2)) : 0;
+};
+
+var traverseEdge = function traverseEdge(points) {
+  var prevPoint;
+  var totalDistance = 0;
+  points.forEach(function (point) {
+    totalDistance += distance(point, prevPoint);
+    prevPoint = point;
+  }); // Traverse half of total distance along points
+
+  var remainingDistance = totalDistance / 2;
+  var center = undefined;
+  prevPoint = undefined;
+  points.forEach(function (point) {
+    if (prevPoint && !center) {
+      var vectorDistance = distance(point, prevPoint);
+
+      if (vectorDistance < remainingDistance) {
+        remainingDistance -= vectorDistance;
+      } else {
+        // The point is remainingDistance from prevPoint in the vector between prevPoint and point
+        // Calculate the coordinates
+        var distanceRatio = remainingDistance / vectorDistance;
+        if (distanceRatio <= 0) center = prevPoint;
+        if (distanceRatio >= 1) center = {
+          x: point.x,
+          y: point.y
+        };
+
+        if (distanceRatio > 0 && distanceRatio < 1) {
+          center = {
+            x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,
+            y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y
+          };
+        }
+      }
+    }
+
+    prevPoint = point;
+  });
+  return center;
+};
+
+var calcLabelPosition = function calcLabelPosition(points) {
+  return traverseEdge(points);
+};
+
+var calcCardinalityPosition = function calcCardinalityPosition(isRelationTypePresent, points, initialPosition) {
+  var prevPoint;
+  var totalDistance = 0; // eslint-disable-line
+
+  if (points[0] !== initialPosition) {
+    points = points.reverse();
+  }
+
+  points.forEach(function (point) {
+    totalDistance += distance(point, prevPoint);
+    prevPoint = point;
+  }); // Traverse only 25 total distance along points to find cardinality point
+
+  var distanceToCardinalityPoint = 25;
+  var remainingDistance = distanceToCardinalityPoint;
+  var center;
+  prevPoint = undefined;
+  points.forEach(function (point) {
+    if (prevPoint && !center) {
+      var vectorDistance = distance(point, prevPoint);
+
+      if (vectorDistance < remainingDistance) {
+        remainingDistance -= vectorDistance;
+      } else {
+        // The point is remainingDistance from prevPoint in the vector between prevPoint and point
+        // Calculate the coordinates
+        var distanceRatio = remainingDistance / vectorDistance;
+        if (distanceRatio <= 0) center = prevPoint;
+        if (distanceRatio >= 1) center = {
+          x: point.x,
+          y: point.y
+        };
+
+        if (distanceRatio > 0 && distanceRatio < 1) {
+          center = {
+            x: (1 - distanceRatio) * prevPoint.x + distanceRatio * point.x,
+            y: (1 - distanceRatio) * prevPoint.y + distanceRatio * point.y
+          };
+        }
+      }
+    }
+
+    prevPoint = point;
+  }); // if relation is present (Arrows will be added), change cardinality point off-set distance (d)
+
+  var d = isRelationTypePresent ? 10 : 5; //Calculate Angle for x and y axis
+
+  var angle = Math.atan2(points[0].y - center.y, points[0].x - center.x);
+  var cardinalityPosition = {
+    x: 0,
+    y: 0
+  }; //Calculation cardinality position using angle, center point on the line/curve but pendicular and with offset-distance
+
+  cardinalityPosition.x = Math.sin(angle) * d + (points[0].x + center.x) / 2;
+  cardinalityPosition.y = -Math.cos(angle) * d + (points[0].y + center.y) / 2;
+  return cardinalityPosition;
+};
+
+var getStylesFromArray = function getStylesFromArray(arr) {
+  var style = '';
+  var labelStyle = '';
+
+  for (var i = 0; i < arr.length; i++) {
+    if (typeof arr[i] !== 'undefined') {
+      // add text properties to label style definition
+      if (arr[i].startsWith('color:') || arr[i].startsWith('text-align:')) {
+        labelStyle = labelStyle + arr[i] + ';';
+      } else {
+        style = style + arr[i] + ';';
+      }
+    }
+  }
+
+  return {
+    style: style,
+    labelStyle: labelStyle
+  };
+};
+var cnt = 0;
+var generateId = function generateId() {
+  cnt++;
+  return 'id-' + Math.random().toString(36).substr(2, 12) + '-' + cnt;
+};
+
+function makeid(length) {
+  var result = '';
+  var characters = '0123456789abcdef';
+  var charactersLength = characters.length;
+
+  for (var i = 0; i < length; i++) {
+    result += characters.charAt(Math.floor(Math.random() * charactersLength));
+  }
+
+  return result;
+}
+
+var random = function random(options) {
+  return makeid(options.length);
+};
+/**
+ * @function assignWithDepth
+ * Extends the functionality of {@link ObjectConstructor.assign} with the ability to merge arbitrary-depth objects
+ * For each key in src with path `k` (recursively) performs an Object.assign(dst[`k`], src[`k`]) with
+ * a slight change from the typical handling of undefined for dst[`k`]: instead of raising an error,
+ * dst[`k`] is auto-initialized to {} and effectively merged with src[`k`]
+ * <p>
+ * Additionally, dissimilar types will not clobber unless the config.clobber parameter === true. Example:
+ * ```
+ * let config_0 = { foo: { bar: 'bar' }, bar: 'foo' };
+ * let config_1 = { foo: 'foo', bar: 'bar' };
+ * let result = assignWithDepth(config_0, config_1);
+ * console.log(result);
+ * //-> result: { foo: { bar: 'bar' }, bar: 'bar' }
+ * ```
+ * <p>
+ * Traditional Object.assign would have clobbered foo in config_0 with foo in config_1.
+ * <p>
+ * If src is a destructured array of objects and dst is not an array, assignWithDepth will apply each element of src to dst
+ * in order.
+ * @param dst:any - the destination of the merge
+ * @param src:any - the source object(s) to merge into destination
+ * @param config:{ depth: number, clobber: boolean } - depth: depth to traverse within src and dst for merging -
+ * clobber: should dissimilar types clobber (default: { depth: 2, clobber: false })
+ * @returns {*}
+ */
+
+var assignWithDepth = function assignWithDepth(dst, src, config) {
+  var _Object$assign = Object.assign({
+    depth: 2,
+    clobber: false
+  }, config),
+      depth = _Object$assign.depth,
+      clobber = _Object$assign.clobber;
+
+  if (Array.isArray(src) && !Array.isArray(dst)) {
+    src.forEach(function (s) {
+      return assignWithDepth(dst, s, config);
+    });
+    return dst;
+  } else if (Array.isArray(src) && Array.isArray(dst)) {
+    src.forEach(function (s) {
+      if (dst.indexOf(s) === -1) {
+        dst.push(s);
+      }
+    });
+    return dst;
+  }
+
+  if (typeof dst === 'undefined' || depth <= 0) {
+    if (dst !== undefined && dst !== null && _typeof(dst) === 'object' && _typeof(src) === 'object') {
+      return Object.assign(dst, src);
+    } else {
+      return src;
+    }
+  }
+
+  if (typeof src !== 'undefined' && _typeof(dst) === 'object' && _typeof(src) === 'object') {
+    Object.keys(src).forEach(function (key) {
+      if (_typeof(src[key]) === 'object' && (dst[key] === undefined || _typeof(dst[key]) === 'object')) {
+        if (dst[key] === undefined) {
+          dst[key] = Array.isArray(src[key]) ? [] : {};
+        }
+
+        dst[key] = assignWithDepth(dst[key], src[key], {
+          depth: depth - 1,
+          clobber: clobber
+        });
+      } else if (clobber || _typeof(dst[key]) !== 'object' && _typeof(src[key]) !== 'object') {
+        dst[key] = src[key];
+      }
+    });
+  }
+
+  return dst;
+};
+var getTextObj = function getTextObj() {
+  return {
+    x: 0,
+    y: 0,
+    fill: undefined,
+    anchor: 'start',
+    style: '#666',
+    width: 100,
+    height: 100,
+    textMargin: 0,
+    rx: 0,
+    ry: 0,
+    valign: undefined
+  };
+};
+var drawSimpleText = function drawSimpleText(elem, textData) {
+  // Remove and ignore br:s
+  var nText = textData.text.replace(_diagrams_common_common__WEBPACK_IMPORTED_MODULE_3__["default"].lineBreakRegex, ' ');
+  var textElem = elem.append('text');
+  textElem.attr('x', textData.x);
+  textElem.attr('y', textData.y);
+  textElem.style('text-anchor', textData.anchor);
+  textElem.style('font-family', textData.fontFamily);
+  textElem.style('font-size', textData.fontSize);
+  textElem.style('font-weight', textData.fontWeight);
+  textElem.attr('fill', textData.fill);
+
+  if (typeof textData.class !== 'undefined') {
+    textElem.attr('class', textData.class);
+  }
+
+  var span = textElem.append('tspan');
+  span.attr('x', textData.x + textData.textMargin * 2);
+  span.attr('fill', textData.fill);
+  span.text(nText);
+  return textElem;
+};
+var wrapLabel = memoize(function (label, maxWidth, config) {
+  if (!label) {
+    return label;
+  }
+
+  config = Object.assign({
+    fontSize: 12,
+    fontWeight: 400,
+    fontFamily: 'Arial',
+    joinWith: '<br/>'
+  }, config);
+
+  if (_diagrams_common_common__WEBPACK_IMPORTED_MODULE_3__["default"].lineBreakRegex.test(label)) {
+    return label;
+  }
+
+  var words = label.split(' ');
+  var completedLines = [];
+  var nextLine = '';
+  words.forEach(function (word, index) {
+    var wordLength = calculateTextWidth("".concat(word, " "), config);
+    var nextLineLength = calculateTextWidth(nextLine, config);
+
+    if (wordLength > maxWidth) {
+      var _breakString = breakString(word, maxWidth, '-', config),
+          hyphenatedStrings = _breakString.hyphenatedStrings,
+          remainingWord = _breakString.remainingWord;
+
+      completedLines.push.apply(completedLines, [nextLine].concat(_toConsumableArray(hyphenatedStrings)));
+      nextLine = remainingWord;
+    } else if (nextLineLength + wordLength >= maxWidth) {
+      completedLines.push(nextLine);
+      nextLine = word;
+    } else {
+      nextLine = [nextLine, word].filter(Boolean).join(' ');
+    }
+
+    var currentWord = index + 1;
+    var isLastWord = currentWord === words.length;
+
+    if (isLastWord) {
+      completedLines.push(nextLine);
+    }
+  });
+  return completedLines.filter(function (line) {
+    return line !== '';
+  }).join(config.joinWith);
+}, function (label, maxWidth, config) {
+  return "".concat(label, "-").concat(maxWidth, "-").concat(config.fontSize, "-").concat(config.fontWeight, "-").concat(config.fontFamily, "-").concat(config.joinWith);
+});
+var breakString = memoize(function (word, maxWidth) {
+  var hyphenCharacter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '-';
+  var config = arguments.length > 3 ? arguments[3] : undefined;
+  config = Object.assign({
+    fontSize: 12,
+    fontWeight: 400,
+    fontFamily: 'Arial',
+    margin: 0
+  }, config);
+  var characters = word.split('');
+  var lines = [];
+  var currentLine = '';
+  characters.forEach(function (character, index) {
+    var nextLine = "".concat(currentLine).concat(character);
+    var lineWidth = calculateTextWidth(nextLine, config);
+
+    if (lineWidth >= maxWidth) {
+      var currentCharacter = index + 1;
+      var isLastLine = characters.length === currentCharacter;
+      var hyphenatedNextLine = "".concat(nextLine).concat(hyphenCharacter);
+      lines.push(isLastLine ? nextLine : hyphenatedNextLine);
+      currentLine = '';
+    } else {
+      currentLine = nextLine;
+    }
+  });
+  return {
+    hyphenatedStrings: lines,
+    remainingWord: currentLine
+  };
+}, function (word, maxWidth) {
+  var hyphenCharacter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '-';
+  var config = arguments.length > 3 ? arguments[3] : undefined;
+  return "".concat(word, "-").concat(maxWidth, "-").concat(hyphenCharacter, "-").concat(config.fontSize, "-").concat(config.fontWeight, "-").concat(config.fontFamily);
+});
+/**
+ * This calculates the text's height, taking into account the wrap breaks and
+ * both the statically configured height, width, and the length of the text (in pixels).
+ *
+ * If the wrapped text text has greater height, we extend the height, so it's
+ * value won't overflow.
+ *
+ * @return - The height for the given text
+ * @param text the text to measure
+ * @param config - the config for fontSize, fontFamily, and fontWeight all impacting the resulting size
+ */
+
+var calculateTextHeight = function calculateTextHeight(text, config) {
+  config = Object.assign({
+    fontSize: 12,
+    fontWeight: 400,
+    fontFamily: 'Arial',
+    margin: 15
+  }, config);
+  return calculateTextDimensions(text, config).height;
+};
+/**
+ * This calculates the width of the given text, font size and family.
+ *
+ * @return - The width for the given text
+ * @param text - The text to calculate the width of
+ * @param config - the config for fontSize, fontFamily, and fontWeight all impacting the resulting size
+ */
+
+var calculateTextWidth = function calculateTextWidth(text, config) {
+  config = Object.assign({
+    fontSize: 12,
+    fontWeight: 400,
+    fontFamily: 'Arial'
+  }, config);
+  return calculateTextDimensions(text, config).width;
+};
+/**
+ * This calculates the dimensions of the given text, font size, font family, font weight, and margins.
+ *
+ * @return - The width for the given text
+ * @param text - The text to calculate the width of
+ * @param config - the config for fontSize, fontFamily, fontWeight, and margin all impacting the resulting size
+ */
+
+var calculateTextDimensions = memoize(function (text, config) {
+  config = Object.assign({
+    fontSize: 12,
+    fontWeight: 400,
+    fontFamily: 'Arial'
+  }, config);
+  var _config = config,
+      fontSize = _config.fontSize,
+      fontFamily = _config.fontFamily,
+      fontWeight = _config.fontWeight;
+
+  if (!text) {
+    return {
+      width: 0,
+      height: 0
+    };
+  } // We can't really know if the user supplied font family will render on the user agent;
+  // thus, we'll take the max width between the user supplied font family, and a default
+  // of sans-serif.
+
+
+  var fontFamilies = ['sans-serif', fontFamily];
+  var lines = text.split(_diagrams_common_common__WEBPACK_IMPORTED_MODULE_3__["default"].lineBreakRegex);
+  var dims = [];
+  var body = Object(d3__WEBPACK_IMPORTED_MODULE_0__["select"])('body'); // We don't want to leak DOM elements - if a removal operation isn't available
+  // for any reason, do not continue.
+
+  if (!body.remove) {
+    return {
+      width: 0,
+      height: 0,
+      lineHeight: 0
+    };
+  }
+
+  var g = body.append('svg');
+
+  for (var _i = 0, _fontFamilies = fontFamilies; _i < _fontFamilies.length; _i++) {
+    var _fontFamily = _fontFamilies[_i];
+    var cheight = 0;
+    var dim = {
+      width: 0,
+      height: 0,
+      lineHeight: 0
+    };
+    var _iteratorNormalCompletion = true;
+    var _didIteratorError = false;
+    var _iteratorError = undefined;
+
+    try {
+      for (var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+        var line = _step.value;
+        var textObj = getTextObj();
+        textObj.text = line;
+        var textElem = drawSimpleText(g, textObj).style('font-size', fontSize).style('font-weight', fontWeight).style('font-family', _fontFamily);
+        var bBox = (textElem._groups || textElem)[0][0].getBBox();
+        dim.width = Math.round(Math.max(dim.width, bBox.width));
+        cheight = Math.round(bBox.height);
+        dim.height += cheight;
+        dim.lineHeight = Math.round(Math.max(dim.lineHeight, cheight));
+      }
+    } catch (err) {
+      _didIteratorError = true;
+      _iteratorError = err;
+    } finally {
+      try {
+        if (!_iteratorNormalCompletion && _iterator.return != null) {
+          _iterator.return();
+        }
+      } finally {
+        if (_didIteratorError) {
+          throw _iteratorError;
+        }
+      }
+    }
+
+    dims.push(dim);
+  }
+
+  g.remove();
+  var index = isNaN(dims[1].height) || isNaN(dims[1].width) || isNaN(dims[1].lineHeight) || dims[0].height > dims[1].height && dims[0].width > dims[1].width && dims[0].lineHeight > dims[1].lineHeight ? 0 : 1;
+  return dims[index];
+}, function (text, config) {
+  return "".concat(text, "-").concat(config.fontSize, "-").concat(config.fontWeight, "-").concat(config.fontFamily);
+});
+/* harmony default export */ __webpack_exports__["default"] = ({
+  assignWithDepth: assignWithDepth,
+  wrapLabel: wrapLabel,
+  calculateTextHeight: calculateTextHeight,
+  calculateTextWidth: calculateTextWidth,
+  calculateTextDimensions: calculateTextDimensions,
+  detectInit: detectInit,
+  detectDirective: detectDirective,
+  detectType: detectType,
+  isSubstringInArray: isSubstringInArray,
+  interpolateToCurve: interpolateToCurve,
+  calcLabelPosition: calcLabelPosition,
+  calcCardinalityPosition: calcCardinalityPosition,
+  formatUrl: formatUrl,
+  getStylesFromArray: getStylesFromArray,
+  generateId: generateId,
+  random: random,
+  memoize: memoize,
+  runFunc: runFunc
+});
+
+/***/ })
+
+/******/ })["default"];
+});
+//# sourceMappingURL=mermaid.js.map
diff --git a/assignments/accessibility-img/1.png b/assignments/accessibility-img/1.png
deleted file mode 100644
index 3fe614231cd6230ba6a3b991586b395deb8c716f..0000000000000000000000000000000000000000
Binary files a/assignments/accessibility-img/1.png and /dev/null differ
diff --git a/assignments/accessibility-img/androidview.png b/assignments/accessibility-img/androidview.png
deleted file mode 100644
index 5c2a96411489346986a080ee71da78784200b448..0000000000000000000000000000000000000000
Binary files a/assignments/accessibility-img/androidview.png and /dev/null differ
diff --git a/assignments/accessibility-img/avd.png b/assignments/accessibility-img/avd.png
deleted file mode 100644
index e05be3735ec7e19965d73551c612437f1a51b4bc..0000000000000000000000000000000000000000
Binary files a/assignments/accessibility-img/avd.png and /dev/null differ
diff --git a/assignments/accessibility-img/mdnavigator1.png b/assignments/accessibility-img/mdnavigator1.png
deleted file mode 100644
index 950525e2567ba10111a4f26a564fd0efeb6ad358..0000000000000000000000000000000000000000
Binary files a/assignments/accessibility-img/mdnavigator1.png and /dev/null differ
diff --git a/assignments/accessibility-img/mdnavigator2.png b/assignments/accessibility-img/mdnavigator2.png
deleted file mode 100644
index 4ab68f1b37bd4822de70d661c760c7953029fd0d..0000000000000000000000000000000000000000
Binary files a/assignments/accessibility-img/mdnavigator2.png and /dev/null differ
diff --git a/assignments/accessibility-img/mdnavigator3.png b/assignments/accessibility-img/mdnavigator3.png
deleted file mode 100644
index 8e2d0cac78c497137515a7c6b54c94f8f70c2e06..0000000000000000000000000000000000000000
Binary files a/assignments/accessibility-img/mdnavigator3.png and /dev/null differ
diff --git a/assignments/accessibility-img/mdnavigator4.png b/assignments/accessibility-img/mdnavigator4.png
deleted file mode 100644
index 1d4bbb09575e89bf589c6aed75c7ace4413d92ec..0000000000000000000000000000000000000000
Binary files a/assignments/accessibility-img/mdnavigator4.png and /dev/null differ
diff --git a/assignments/accessibility-img/playstoreemulator.png b/assignments/accessibility-img/playstoreemulator.png
deleted file mode 100644
index d94e82b70f54006c3dbef22db91a64d19c2e111b..0000000000000000000000000000000000000000
Binary files a/assignments/accessibility-img/playstoreemulator.png and /dev/null differ
diff --git a/assignments/accessibility-img/projectview.png b/assignments/accessibility-img/projectview.png
deleted file mode 100644
index 79c64e5fa0e56b3b431e5f1e41e352c0ea8d4b73..0000000000000000000000000000000000000000
Binary files a/assignments/accessibility-img/projectview.png and /dev/null differ
diff --git a/assignments/accessibility.md b/assignments/accessibility.md
deleted file mode 100644
index 69630ce781f9f84a5a04346db6367370e91e3144..0000000000000000000000000000000000000000
--- a/assignments/accessibility.md
+++ /dev/null
@@ -1,232 +0,0 @@
----
-layout: assignment
-published: true
-
-title: Accessibility
-code: as3
-
-assigned: April 22, 2020
-due:
- - <strong>Due</strong> April 30, 2020, 10:00pm
- - <strong>Lock</strong> May 2, 2020, 10:00pm
-
-revised: 10:00 PM Tuesday, April 21st, 2020
-
-objective: Identify and repair app accessibility issues.
-
-android_goals:
-  - Basics of Android assistive tools
-hci_goals:
-  - Explore App accessibility
-  - Understanding the impact of different accessibility issues
-  - Simple repairs to accessibility issues
-  - Write up a report on accessiblity issues
----
-
-* TOC
-{:toc}
-
-This assignment has two parts that are inter-related. Part 1 of this assignment involves finding
-all the accessibility problems in the code base for our toy camera app, a  and documenting them,
-while in Part 2 of the assignment you will fix these problems. It will be important to iterate on this find/fix cycles as
-fixing one problem may uncover new ones. You will use a number of tools to find these issues,
-including but not limited to the Google Accessibility Scanner and TalkBack. It will be important
-for you to experience the app through the use of a screen reader to find all of the problems
-a user might encounter.
-
-# GitGrade links
-
-**Classroom** [Summary](https://gitgrade.cs.washington.edu/student/summary/8723)
-
-**Links:** [Accept the Assignment](https://gitgrade.cs.washington.edu/student/assignment/122) / [Turn-in the Assignment](https://gitgrade.cs.washington.edu/student/assignment/122/turnin)
-
-# Part 1
-
-Tasks:
-- Learn different categories of app accessibility issues
-- Identify accessibility issues in our example app
-- Write a detailed report as a communication tool to developers who need to make the app accessible
-
-Accessibility is an important part of any app. Whether you are developing a new app or adding features
-to an existing one, it is important to consider the accessibility of your app's components.
-
-For some background you will want to do the following:
-
-- Start by watching this [quick video](https://youtu.be/1by5J7c5Vz4) to learn how visually-impaired
-users interact with Android applications. The video also offers some tips on ensuring your app is
-compatible with assistive tools.
-- Next read the list of errors that are found by Google's accessibility Scanner which is
-show in Table 2 on the 8th page of the PDF (which is numbered page 9) of
-[Epidemiology as a Framework for Large-Scale Mobile Application Accessibility Assessment](https://xiaoyizhang.me/assets/Paper/ASSETS_2017_Epidemiology.pdf).
-- Finally, because it is important to write succinct and yet descriptive alt text (content descriptions), you
-should read about [proper alt text writing](https://webaim.org/techniques/alttext/).
-
-For example, consider this view of the Layout Inspector of the layout app that we recently completed.
-(You will not be using your layout code for this assignment, we are using it for illustrative
-purposes here.) The selected image in the upper left of the screen does not have
-`contentDescription` property. **Google's Accessibility Scanner** will classify this as
-"Item Label" error (defined in the paper above), which will also mean a screen reader cannot
-read the alternative text of the image to people with visual impairments.
-
-![Screenshot of an image without contentDescription property in layout editor](accessibility-img/1.png){:width="500px"}
-
-The goal of Part 1 of the assignment is to identify **at least 10** accessibility issues in the app
-you will be given, **at least one** can't be found with the Accessibility Scanner. All of
-the issues listed in the ASSETS/Epidemiology paper may NOT be represented in the app, but you should be aware
-that they could be found in other apps. For your reference, we identified at least 12 errors in the app.
-
-## Setup
-In order to proceed you will need to setup your device and your Android Studio IDE.
-
-### Adding Markdown Viewing in Android Studio
-You will be writing your report in "Markdown." Markdown is a a text markup language that
-allows for simple formatting using plain text files. We have provided you with a `Part1.md` starter
-file that is in the root directory of your the repository you received when you accessed the
-assignment.
-
-You can edit your markdown file in any text editor, including Android Studio. We recommend you install
-the [Markdown Navigator](https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced) to help
-you preview your edits. (Click on the pictures to see a larger version)
-
-[![Screenshot of the first step of installing the markdown navigator](accessibility-img/mdnavigator1.png){:width="250px"}](accessibility-img/mdnavigator1.png)
-[![Screenshot of the second step of installing the markdown navigator](accessibility-img/mdnavigator2.png){:width="250px"}](accessibility-img/mdnavigator2.png)
-[![Screenshot of the third step of installing the markdown navigator](accessibility-img/mdnavigator3.png){:width="250px"}](accessibility-img/mdnavigator3.png)
-
-Once you have the Markdown Navigator installed, open up `Part1.md` and click the button pointed to
-by the arrow in the following image to bring up the Markdown Preview pane.
-
-![Screenshot preview pane of the Markdown navigator](accessibility-img/mdnavigator4.png){:width="500px"}
-
-### Installing Accessibility Scanner
-
-You must first install the Accessibility scanner on your Android Device or in your Emulator using the
-Google Play store. IMPORTANT: The Pixel 2 XL Emulator does NOT have the Google Play store on it,
-so you have to start by installing the Pixel 2 or other Emulator where you can also install the Play Store
-using the *Tools-&gt;AVD Manager*. The best way to determine if the Emulator has the Play Store
-is to look for the icon under the Play Store column in the AVD Manager.
-
-![Screenshot of the AVD Manager with an emulator that has the play store and one that does not](accessibility-img/avd.png){:width="300px"}
-
-To create another emulator, press the *Create Virtual Device* button, then find an emulator that has
-the Play Store icon in the Play Store column. Click Next and follow the instructions for the rest of the installation.
-
-![Creating a new device with the play store using the AVD Manager ](accessibility-img/playstoreemulator.png){:width="500px"}
-
-Note that you will have to specifically choose this new emulator (as opposed to the one you were
-using before) when you are running your application on the emulator through Android Studio.
-
-To install the Accessibility Scanner, search for it in the Play Store and install it on your device or emulator.
-The installation process will be the same for a physical phone or the emulator equipt with the Play Store.
-Follow the instructions on the
-[Getting started with Google Accessibility Scanner](https://support.google.com/accessibility/android/answer/6376570?hl=en&ref_topic=6376582)
-page to get the scanner working on your device.
-
-Another option is to install the Android Accessibility Suite which contains both the Accessibility
-Scanner and TalkBack if it has not been installed before.
-
-### Installing TalkBack
-
-You will need to have a good understanding of how to set up and use
-[Talkback](https://support.google.com/accessibility/android/answer/6283677?hl=en) one
-of the assistive tools built-in to you Android.  You may want to try using
-talk back on another application before you use it on the app you are given for this assignment.
-
-
-### Other Tools
-
-Another built-in assistive tool is [Switch Access](https://support.google.com/accessibility/android/answer/6122836?hl=en),
-which you may choose to set up and use.
-
-## Writing the report.
-
-Use the Accessibility Scanner, Talkback, and perhaps other tools to detect defects in our toy camera app.
-The Accessibility Scanner is decent with suggested fixes to problems it finds, however, some solutions
-are not obvious for each screen element type, so you will have to do some research to
-find all of the attributes that help to make an application more accessible. It may also help
-to use other tools (such as the Layout Inspector in Android) to help you track down the location
-of the issue the Accessibility tools find.
-
-As you find issues in the app, write them up in your report. Your report structure will contain
-two sections, an Overview in which you will describe your experience using assistive tools while testing the
-accessibility of the app before and after fixing issues, and a "table" of issues you found
-and how you fixed them. The outline of this report is given to you in `Part1.md` which remember is
-in the root directory of your the repository you received when you accessed the
-assignment. To open this file you can either use the _File-&gt;Open_ menu item, or change the _Android_
-drop down above the `app` folder to say _Project_ and double click on `Part1.md` from there.
-
-
-![Viewing the project as an android project you can't see Part1.md](accessibility-img/androidview.png){:width="200px"} &nbsp; &nbsp; 
-![Viewing the project as just a project you can see Part1.md](accessibility-img/projectview.png){:width="200px"}
-
-
-For each issue you identify within the app, document the following details:
-- The XML id of the item that needs to be fixed. If there is no id you can describe it briefly (~3 words)
-- The issue type as drawn from the list in ASSETS/Epidemiology paper.
-- The fix should provide a brief description (1 sentence or so) of what you did. If the fix involves
-changing or adding alt text, you should include the alt text you added for each inaccessible UI element in your
-fix description.
-- The file or files in which you fixed this issue
-- The line number(s) where you fixed this issue
-
-An example issue is shown in the `Part1.md` file. *Please* retain the two spaces at the end
-of every line so the line breaks will be maintained
-([examples](https://gist.github.com/shaunlebron/746476e6e7a4d698b373)). This will help the staff
-in grading your assignment.
-
------- Sample Issue ------  
-*Id*: @+id/edit  
-*Issue*: Item Type Label contains unnecessary text  
-*Fix*: Remove the word "button" from the text description  
-*File*: string.xml  
-*Line number*: 11
-
-**Resources**
-
-- [Android Accessibility Overview](https://developer.android.com/guide/topics/ui/accessibility/)
-- [Android Accessibility Guides](https://developer.android.com/guide/topics/ui/accessibility/apps)
-- [Material Design: Assistive Technology](https://material.io/design/usability/accessibility.html#assistive-technology)
-
-
-# Part 2
-
-Tasks:
-
-- Repair accessibility issues you identified in part 1, including the sample issue
-
-For each issue that you identified in the app, please repair it by modifying code or XML layout file.
-You must also repair the sample issue that we have identified but not yet fixed in the code.
-For reference, in the sample solution we ran the app through the Accessibility Scanner and
-identified and fixed at least 12 issues (including the one we identified).
-
-For any repairs involving strings, please add a new entry for the fix into the strings.xml file,
-and then reference it (thereby retaining the old entry in the file). Recall that you can reference
-a string by changing the `contentDescription` property in the
-layout editor, or calling the equivalent method (`imageView.setContentDescription(...)`)
-
-All of these changes only require modifying existing XML attributes or adding new ones;
-or changing a line or two of code.
-
-# Turn-in
-
-## Submission Instructions
-
-You will turn in both Part 1 and Part 2 via GitGrade. The files you will need to include are:
-
-```
-- Part1.md
-- MainActivity.java
-- app_bar_main.xml
-- content_main.xml
-- nav_header_main.xml
-- strings.xml
-- colors.xml
-```
-
-## Grading (25pts)
-
-- Part 1
-  - Description of the experience using assistive tools to test the app (Accessibility Scanner, TalkBack etc.): 3 pts
-  - Correctly documents all 10 or more accessibility issues including location of the fix: 10 pts
-- Part 2
-  - Fixes the issues identified in part 1 by modifying / adding new attributes to the xml tags: 10 pts
-  - Updated content descriptions are correct per Webaim's guidelines: 2 pts
diff --git a/assignments/colorpicker-img/1.png b/assignments/colorpicker-img/1.png
deleted file mode 100644
index b34a0f5c049fd18795bbb93ab224100f1945d277..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/1.png and /dev/null differ
diff --git a/assignments/colorpicker-img/2.png b/assignments/colorpicker-img/2.png
deleted file mode 100644
index b5b03dcd14635f68272108dc4f05252c752a2946..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/2.png and /dev/null differ
diff --git a/assignments/colorpicker-img/Destroy_Activities.png b/assignments/colorpicker-img/Destroy_Activities.png
deleted file mode 100644
index d871eafc70fecd331b9554cfd7eab7dd6f6a8fed..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/Destroy_Activities.png and /dev/null differ
diff --git a/assignments/colorpicker-img/FSM.key b/assignments/colorpicker-img/FSM.key
deleted file mode 100755
index 381251d8e1e958bf5d29e5b7175be232ce7969a5..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/FSM.key and /dev/null differ
diff --git a/assignments/colorpicker-img/doorlocked.jpg b/assignments/colorpicker-img/doorlocked.jpg
deleted file mode 100644
index ef3df3e3168002966bde98ecce44e43ea12b7138..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/doorlocked.jpg and /dev/null differ
diff --git a/assignments/colorpicker-img/doorunlocked.jpg b/assignments/colorpicker-img/doorunlocked.jpg
deleted file mode 100644
index 26ef94f9ee783c460bcc1534003363465542af02..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/doorunlocked.jpg and /dev/null differ
diff --git a/assignments/colorpicker-img/fsm.png b/assignments/colorpicker-img/fsm.png
deleted file mode 100644
index e848395aea631596b14fbe7f51726da13aee70d4..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/fsm.png and /dev/null differ
diff --git a/assignments/colorpicker-img/logcat_diagram.png b/assignments/colorpicker-img/logcat_diagram.png
deleted file mode 100644
index e48b6b6f18bfac73a59b13a34f834aea1e689ec6..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/logcat_diagram.png and /dev/null differ
diff --git a/assignments/colorpicker-img/oven.mp4 b/assignments/colorpicker-img/oven.mp4
deleted file mode 100644
index 5eb6c0f8a58e9f9b9ec31158405d20d9be8eae97..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/oven.mp4 and /dev/null differ
diff --git a/assignments/colorpicker-img/thumb_diagrams.jpg b/assignments/colorpicker-img/thumb_diagrams.jpg
deleted file mode 100644
index d4ff332324ad8475585b2649b8916f7c47153056..0000000000000000000000000000000000000000
Binary files a/assignments/colorpicker-img/thumb_diagrams.jpg and /dev/null differ
diff --git a/assignments/colorpicker.md b/assignments/colorpicker.md
deleted file mode 100644
index 2dee3c91f2b25d3b9bdb9b77228686e8d0ad6198..0000000000000000000000000000000000000000
--- a/assignments/colorpicker.md
+++ /dev/null
@@ -1,530 +0,0 @@
----
-layout: assignment
-published: true
-
-title: Color Picker
-code: as4
-
-assigned: May 1st, 2020
-due:
- - <strong>Due</strong> May 11th, 2020, 10:00pm (including reflection)
- - <strong>Lock</strong> May 13th, 2020, 10:00pm
-revised: 11:00pm Thursday,  April 30th, 2020
-
-objective: Create an RGB color picker which lets you choose a color on a rainbow circle (color wheel).
-
-android_goals:
-  - Understand Android event handling APIs
-  - Handle touch input properly
-  - Understand app lifecycle
-  - Save app state in Bundle
-hci_goals:
-  - Create non-rectangle interactor
-  - Propositional Production System
-  - Event handlers and event bubbling
-  - Callbacks
----
-
-* TOC
-{:toc}
-
-# GitGrade links
-
-**Classroom** [Summary](https://gitgrade.cs.washington.edu/student/summary/8723)
-
-**ColorPicker:** [Accept the Assignment](https://gitgrade.cs.washington.edu/student/assignment/124) / [Turn-in the Assignment](https://gitgrade.cs.washington.edu/student/assignment/124/turnin)
-
-
-# Goal
-
-There are two parts to this assignment, creating an RGB color picker interactor which lets you choose a color on a rainbow circle (color wheel), then using it in an application.
-
-__Important definition__: The term `wheel` used throughout the spec refers to the dial **and** inner circle; it is the larger circle that contains all interface you will be drawing.
-
-The RGB color picker works as follows: There is a small white "thumb" that marks the color currently indicated on the dial (the outer rim of the color picker), and that indicated color is displayed in the inner circle of the color wheel. The user interacts with this thumb by pressing down on it, then rotating it around the wheel. While the thumb is moving it is 50% opaque, and it will return to 100% opaque as soon as the user lifts their pointer from the screen and a new color is selected.
-
-When the user has completed the selection of a new color using the RGB color picker interactor, the application will change the color displayed on the screen behind the wheel.
-
-A video of how this interactor works in the application can be found
-[here](https://courses.cs.washington.edu/courses/cse340/videos/colorpicker_su19.webm).
-
-
-You will play two developer roles in this assignment
-- You will be a __Component Developer__ as you implement the RBG Color Picker interactor.
-- You will be an __Interface Programmer__ as you use this new interactor in your App.
-
-## Component Developer Role
-Your primary goal in this assignment is to create
-`ColorPickerView.java`. This is your _custom interactor_ and it must
-be implemented so it can be used by any application. `ColorPickerView.java` inherits from
-`AbstractColorPickerView.java` which must remain **untouched**.
-
-Tasks for `ColorPickerView`
-
-- Handle different input events in `onTouchEvent`
-- Initialize properties during `onLayout`
-- Draw the rainbow colored wheel and thumb in `onDraw`
-- Save/restore view state locally
-
-## Interface Programmer Role
-
-You will also edit `MainActivity.java`. This is your
-_application_ which will _use_ your custom color picker interactor. `MainActivity`
-inherits from `AbstractMainActivity` which must remain **untouched**.
-
-Tasks for `MainActivity`
-
-- Register callbacks
-- Save application state in bundle
-- Restore activity state from bundle
-
-You will be turning in  `ColorPickerView.java` and `MainActivity.java` so make sure that any variables/fields you create/modify are in these files. **Do NOT modify any other files in this project.**
-
-<span style="color:red">Note: We will be asking you to re-use your color picker (`ColorPickerView`
-which inherits from `AbstractColorPickerView`) in a later assignment so it is important that you understand
-how the custom interactor communicates with an application.</span>
-
-# Getting Started
-
-You will be editing `ColorPickerView.java` and `MainActivity.java`. As such it is important to understand the inheritance chains of these two files, as you will be using **a lot** of variables and functions defined in parent classes.
-
-**Read the abstract base classes, including all of the comments in `AbstractColorPicker.java` and `AbstractMainActivity.java` before you begin**. Where applicable, you **must** use the inherited variables and functions (do not overload the inherited functions).
-
-The structure of the code is represented by the
-[Unified Modeling Language](https://en.wikipedia.org/wiki/Unified_Modeling_Language) (UML)
-diagram shown below. The symbols can be read as follows: + is a public field or method, #
-is protected, and - is private. Any method that is in _italics_ is an abstract method, meaning
-is must be overridden in the child class.
-
-<div class="mermaid">
-classDiagram
-  AppCompatActivity <|-- AbstractMainActivity
-  AbstractMainActivity <|-- MainActivity
-  AppCompatImageView <|-- AbstractColorPickerView
-  AbstractColorPickerView <|-- ColorPickerView
-  class AbstractMainActivity{
-    #ColorPicker mColorPicker
-    +colorToString()
-    #setStartingColor()*
-  }
-  class MainActivity{
-    -mColorView
-    -mLabelView
-    +onColorSelected()
-    #setStartingColor()
-    +onSaveInstanceState()
-    +onRestoreInstanceState()
-  }
-  class AbstractColorPickerView{
-    +DEFAULT_COLOR
-    +RADIUS_TO_THUMB_RATIO
-    #mCenterX
-    #mCenterY
-    #mRadius
-    #mState
-    -mColorChangeListeners
-    +setColor()*
-    +addColorChangeListener()
-    +removeColorChangeListener()
-    #invokeColorChangeListeners()
-    #essentialGeometry()*
-    #getTouchAngle()
-    +getColorFromAngle()
-  }
-  class ColorPickerView{
-    #mCurrentColor
-    +setColor()
-    -updateModel()
-    +onDraw()
-    +onLayout()
-    #essentialGeometry()
-    +onTouchEvent()
-    +getAngleFromColor()
-  }
-
-</div>
-
-
-_Related Readings_:
-It will be helpful to read
-[Android/Custom-Drawing](https://developer.android.com/training/custom-views/custom-drawing)
-and
-[Android/UI-Events](https://developer.android.com/guide/topics/ui/ui-events)
-to understand parts of the assignment that seem tricky.
-
-# Part 1: Creating your interactor
-
-Implementing your color picker interactor will require you to support input handling, maintaining and mutating state, and drawing to the screen in `ColorPickerView.java`.
-
-## Drawing
-
-Drawing is implemented in `ColorPickerView#onDraw(Canvas)`. You will need to draw the thumb and the color in the center of the circle. We provide a color
-dial in the drawable folder and it is already being drawn by `AbstractColorPickerView#onDraw(Canvas)`
-which is called because `ColorPickerView` inherits from `AbstractColorPickerView`.
-
-The height and width of the of the dial determined by the bounding box of the `ColorPickerView`. The
-the radius of the actual ColorPicker interactor is the half the smaller of the width or the height of that
-that bounding box.
-
-![Screenshot of color picker, original](colorpicker-img/1.png){:width="49%"}
-![Screenshot of color picker, after moving to a new color](colorpicker-img/2.png){:width="49%"}
-
-### Important Variables
-
-- Some parts of your drawing code will require you to know the size of the view you are drawing in.
-The protected variables `mRadius` (the radius of both dial and inner circle), `mCenterX`, and `mCenterY`
-in  `AbstractColorPickerView.java` must be calculated in your `onLayout` method.
-- The ColorPicker displays the last selected color on the wheel when it is made visible on the screen.
-The ColorPicker saves its internal state in the ColorPicker model which, for the purposes
-of this assignment, is stored in the protected `mCurrentColor` variable accessible through the
-public `setColor` method. The ColorPicker interactor will need to be redrawn when the model changes.
-
-_Related APIs_:
-[View#onLayout](<https://developer.android.com/reference/android/view/View.html#onLayout(boolean,%20int,%20int,%20int,%20int)>)
-
-### Thumb
-
-In the screenshots above there is a visible thumb (the white circle) that marks the selected color
-on the dial. The thumb is drawn in `ColorPickerView#onDraw(Canvas)`. It must move around as a user
-interacts with the color picker.
-
-The thumb must be constrained to move along a circular track that places it within the dial. It must move along that track even when the user is dragging their finger inside the inner circle.
-
-Visually, the thumb's radius is `0.085` times the outer-radius of the dial (center of circle to outside edge of color). This value is provided to you as a constant in `AbstractColorPickerView`. Positioning the thumb is similar to `AbstractColorPickerView#getTouchAngle(float, float)` but instead of finding the angle based on the thumb location, you're finding the thumb location based on the angle, additionally constraining the thumb to stay within the color band.
-
-The PPS specification (found below) uses a float [0,1] to represent alpha, but Paint expects an int
-[0, 255]. Be sure to make the correct conversion (multiply by 255, then cast the result to `int`).
-
-### Center Circle
-
-Inside the multi-color dial is a circle whose color is the same as the live selected color.
-It must be centered on the center of the wheel, and use up all available space up to the dial.
-The color of the inner circle, which represents the RGB Color Picker model, must update while you
-drag the thumb. In contrast, the colored box and text, which represent the application’s model
-(remember the Model View Controller (MVC)), must update only when the mouse is released.
-
-## Touch Input Events
-
-<div class="mermaid">
-graph LR
-S((.)) --> A((Start))
-A -- "Press:insideWheel? A" --> I((Inside))
-I -- "Release:B" --> E[End]
-I -- "Drag:insideWheel? C" --> I
-I -- "Drag:outsideWheel? D" --> I
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-class S invisible
-class A start
-class E finish
-class I normal
-
-</div>
-
-Where
-- A is updateModel();invalidate()
-- B is invokeColorChangeListeners();invalidate()
-- C is updateModel();invalidate()
-- D is doNothing()
-
-Note that the End state only exists to show the lifetime of a _single_ interaction. Because the user can interact with the color picker any number of times, we would actually return to the Start state when the thumb is released. For some examples of single interactions, see the images below.
-
-We'll handle touch input by implementing `ColorPickerView#onTouchEvent(MotionEvent)`. This is the event handler that will be called when a touch occurs in this view. Feedback is needed when the user is interacting with the color picker, so you will have to ensure that the view is _redrawn_. Recall that we want to use `invalidate()` to do this and even though `invalidate()` does not directly trigger redraws and may have no impact, you still do not want to call it more than needed. In other words, it is considered good code quality to only call `invalidate()` when necessary.
-In fact we **will be taking off points** for unnecessary `invalidate()` calls. Follow the PPS spec and don't call aything it doesn't specify. You should never need to call `onDraw()`.
-
-As you write the PPS, make sure to utilize proper coding style to ensure that the code is readable to someone not familiar with the project. For an example of how to translate PPS into code, see the [PPS page]({{site.baseurl}}/docs/pps).
-
-_Related APIs_:
-[View](https://developer.android.com/reference/android/view/View) (see documentation on Drawing)
-
-![Diagrams of single interactions](colorpicker-img/thumb_diagrams.jpg)
-
-### Transitioning out of the Start State
-
-As shown in the state diagram, when in the Start state (before interaction begins), we ignore any touches that are outside of the wheel. These events must be _rejected_ by your `ColorPickerView` so that other interactors can use them if they want. Specifically, views that may lie underneath our `ColorPickerView` must be able to react to events outside the wheel, but within the square of the `ColorPickerView`. Only transition out of the start state when the user presses on or inside the wheel. When you transition out of the start state, color is updated, thumb transparency is changed (alpha becomes `0.5f`), and thumb position is updated.
-
-The starter code already has some built-in functionality to help you test whether or not you are
-correctly rejecting input. When you click outside the wheel, there will be a Toast (a pop up message)
-that says "You have clicked outside the wheel!". If this message does not appear when you
-click outside the wheel, then you are not correctly rejecting input.
-
-### Transitions within the Inside State
-
-Once interaction with the wheel begins, you must only update the ColorPickerView's local model
-when the user is dragging their finger inside the wheel.
-
-- When a finger drags on screen inside the wheel, the thumb will follow the angle the finger is at,
-and the color of the center circle will update to reflect the change in the local model for the Color Picker.
-- When a finger drags on screen outside the wheel, the thumb will stay at the most recent angle
-within the wheel. If the finger re-enters the wheel at a different angle, the thumb must jump to
-that angle and the color within the wheel must display the corresponding color.
-
-Use the `x` and `y` coordinates of the touch event to calculate the angle (in radians) of the touch
-on the wheel with `AbstractColorPickerView#getTouchAngle(float, float)`. It is difficult to do this
-mapping in traditional RGB color space. The HSV color space discussed during class fits this task well.
-You can read more about the HSV color space [here](https://en.wikipedia.org/wiki/HSL_and_HSV). Since
-we're just adjusting color, we only want to modify hue while leaving saturation and value constant.
-You may see detailed instruction in code comments under `AbstractColorPickerView#getColorFromAngle(double)`,
- which we provide you. Use this implementation to guide your work on `ColorPickerView#getAngleFromColor(int)`, which does the opposite operation.
-
-Notice that our color dial is rotated `90°` from just the hue value converted to radians - our
-red color is at the top, but in the HSV model, the red color is to the right. This adjustment is
-applied in `AbstractColorPickerView#getColorFromAngle(double)`. You will also have to apply this
- when implementing `ColorPickerView#getAngleFromColor(int)`. For information about why colors are
- being stored as `int` values, see the [Misc.](#misc) section below.
-
-Here are some test values to help test your implementation of `ColorPickerView#getAngleFromColor(int)`:
-- angle: 2.5769272, color: -16774401 (blue)
-- angle: -1.5461564, color: -64000 (red)
-- angle: 0.42093232, color: -15073536 (green)
-
-### Transition to the end state.
-
-When the user finishes interacting with the wheel, you must update the UI to reflect the new selected color, by calling the `onColorSelected` method in the `ColorChangeListener` with our newly selected color. In addition, the thumb transparency must be reset to an alpha of `1f` (fully opaque).
-
-### Essential Geometry
-
-When a motion event occurs, we must change the coordinates into the form consumed by the state
-machine queries. The `essentialGeometry` method translates these coordinates into an ENUM which
-represents whether or not the motion event was inside of the dial. This is important because the
-state machine only relies on whether or not the motion event is within the color wheel and
-must not be interpreting "raw" coordinates.
-
-_Related APIs_:
-[MotionEvent](https://developer.android.com/reference/android/view/MotionEvent) / [Color](https://developer.android.com/reference/android/graphics/Color) / [ColorUtils](https://developer.android.com/reference/android/support/v4/graphics/ColorUtils) / [View#onTouchEvent](<https://developer.android.com/reference/android/view/View.html#onTouchEvent(android.view.MotionEvent)>) / [EssentialGeometry](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)
-
-# Part 2: Implementing the application layer
-
-Your application is to make use of your color picker. The application needs to be notified from the `ColorPickerView` when the color changes. In our case, it will use the information to display the newly chosen color in a rectangle at the bottom of the screen and update the application model, though other applications might do something different. Examples of other applications that use their own implementation of a color picker include Photoshop, MS Paint, etc.
-
-## Setting up the Application
-
-The code you will write for the application is in `MainActivity` which inherits from `AbstractMainActivity`. An important variable stored in `AbstractMainActivity` is the `ColorPickerView` named `colorPicker`.
-
-The application layer must set the default color of `colorPicker` using
-`MainActivity#setStartingColor(int)`. We provide this default as `AbstractColorPickerView.DEFAULT_VALUE`
-(it's red). `MainActivity#setStartingColor(int)` must also trigger `onColorSelected` to
-ensure that the default color value is shown on the screen.
-
-## Managing Application State with Listeners
-
-To find out about color changes, the application needs to register a callback by calling
-`AbstractColorPickerView.addColorListener(ColorChangeListener)`. This callback
-must update the application's `colorView` and `colorTextView` whenever `onColorSelected`
-is called to demonstrate that the application correctly retrieved a color from `colorPickerView`.
-This means you are **prohibited** from leveraging publicly accessible
-fields/functions on the color picker to observe the `ColorPickerView` state.
-
-As good practice, you should always unregister listeners when they are no longer relevant. This must
-done in `MainActivity.java#onDestroy()` which is called when the application is killed.
-
-You may notice that `AbstractColorPickerView.java` keeps a `List` of `ColorChangeListeners`. This allows for our interactor to be more flexible because it can register many listeners that will all be notified when a new color is selected. For more on custom listeners, see [CodePath's guide to creating custom listeners](https://guides.codepath.com/android/Creating-Custom-Listeners). For more information about Fragments, see the [Android Fragment API](https://developer.android.com/guide/components/fragments).
-
-# Part 3: Save and Restore Application Model using Bundle
-
-You are to also save application model (i.e. the current color as known by the application) in the
-`onSaveInstanceState` bundle object. When user switches focus to some other app, Android kills our Activity.
-We will use the bundle to get the saved state back.
-
-We want to manage the state at the application level (`MainActivity.java`) versus at the interactor level. Thus you will need to set the state of the color picker in the application layer when the bundle is loaded.
-
-Notice from the documentation that `onRestoreInstanceState` is called after `onCreate` if a bundle
-exists. This is where you will access the information we saved in `onSaveInstanceState` to restore
-the current color with the color we had before our Activity was killed.
-
-<span style="color:red">We will kill your application during our testing process to ensure the state
-is properly saved. To simulate our tests, you can use the adb to test killing it, or in your phone's Developer options set Apps -> Don't keep activity.</span>
-
-![Clicking 'Don't Keep Activites' Android Developer Settings, 50%](colorpicker-img/Destroy_Activities.png){:width="30%"}
-
-If you do not already have developer options enabled follow the guide [here.]({{site.baseurl}}/docs/dev_mode)
-
-
-
-## Wheel default state and bundle interaction
-
-The best way to test this functionality is to enable the setting referenced above, and then press
-home, then return to the app. The color that was selected when you killed the app should still be
-restored when the app is restarted. **Quitting the app from multitasking (i.e. when the app is open,
-click on the square) will destroy the bundle.** Steps to test this is working correctly are as follows:
-
-Using the bundle:
-
-1. User opens app for first time. The wheel is invisible and color in the box is red (the default).
-2. User clicks on box to show wheel and changes color to blue.
-3. User leaves app (via home button) while wheel is still visible.
-4. User returns to app. The color in the box is blue and the wheel is invisible.
-5. User clicks in the color box and the wheel becomes visible with blue as the selected color.
-
-No bundle exists when app is unloaded:
-
-1. User opens app for first time. The wheel is invisible and color in the box is red (the default).
-2. User clicks on box to show wheel and changes color to blue.
-3. User leaves app (via home button).
-4. User unloads the app completely from memory.  
-5. User returns to app. The color in the box is red and the wheel is not visible. Clicking
-on the color box brings up the Color Picker with red as the selected color.
-
-Note that you do not have to do anything to handle the logic for displaying the wheel.
-The wheel is invisible by default when the activity is created,
-and its visible/invisible state is NOT stored in the bundle.
-
-
-
-_Related APIs_:
-[Saving and Restoring State](https://developer.android.com/guide/components/activities/activity-lifecycle.html#saras)
-| [Android Developer Options](https://developer.android.com/studio/debug/dev-options) | [Explanations for how to use Bundle](https://stackoverflow.com/questions/6525698/how-to-use-onsavedinstancestate-example-please)
-
-# Part 4: Reflection
-
-For this part, you will submit your reflection on this assignment to Gradescope. Create a MS Word, Google or other type of document and copy the following questions (in italics below) into that document. Add your responses below each question. You can have more than one answer per page, but if you can, please try to avoid page breaks in the middle of a question. Insert page breaks between questions as needed.
-
-- _The ColorPicker app as it is written is not accessible._
-  - _Without actually running the
-Accessibility Scanner, describe at least two issues that you think you would find with that tool.
-Why would these issues be an impediment to some users? How would you fix them?_
-  - _After you responded to the above, run accessibility scanner. Were you surprised by any of
-  the results?_
-
-- _The GE Oven/Microwave combo has a REALLY annoying knob for changing the time on a timer. You can see
-a [video](colorpicker-img/oven.mp4) of how this works in action but the gist is this:_  
-  _1. Start: Timer mode has been selected and your cursor is on the Minutes/Seconds menu item_
-  _2. Press the rotating dial button (hopefully not rotating at the same time, which will switch you back to Hours/Minutes mode) to
-  switch to "change minutes" mode._  
-  _3. Rotate the dial clockwise to add a minute._  
-  _4. Rotate the dial counter clockwise to subtract a minute._  
-  _5. Press the button to switch to "change seconds" mode._  
-  _6. Rotate the dial clockwise to add a second._  
-  _7. Rotate the dial counter clockwise to subtract a second._  
-  _8. Press the button to "end" the setting and start the timer._  
-
-  _Draw the PPS for this interactor. To help you with this problem you can use the following:_
-
-  - _EssentialGeometry: Clockwise, Counterclockwise_
-  - _The following events: Press, Rotate_
-  - _And the following methods or actions: `initTimer()`, `subMinute()`, `addMinute()`
-   `switchToSeconds()`, `addSecond()`, `subSecond()`, `startTimer()`_
-
-- _On our side, we've learned a lot about ourselves by quickly trying to transition this course
-online and at a distance. What do you think you are learning about yourself and your study habits so far this quarter?"_
-
-
-
-
-# Debugging tips and tricks
-
-Logging output is especially useful for testing the functionality of sections of code such as `getAngleFromColor` and other methods. Much like `System.out.print` in Java, Android provides its own class for producing output: `Log`. We suggest that you use `Log.i` and create your own custom tag so that you can filter the output for the information you want. Below is an example of how to use the `Log.i` function.
-
-```java
-private static final String TAG = "ColorPicker MainActivity";
-
-Log.i(TAG, "Hello world!");
-```
-
-To make full use of Logcat, make sure to configure the priority level (in this case, the "i" in `Log.i` stands for "Info") and use the correct tag (in this case, "ColorPicker MainActivity"). It's also good to check that you have the correct device/emulator selected.
-
-__Note__: Remember to take your `Log.i` debugging calls out of your code before turning it in.
-
-![Logcat diagram](colorpicker-img/logcat_diagram.png)
-
-_Related APIs_:
-[Android Log.\*](https://developer.android.com/reference/android/util/Log.html) | [Using Logcat](https://developer.android.com/studio/debug/am-logcat)
-
-# Misc.
-
-
-This assignment does require doing some math, and you are welcome to use the Java Math functions.
-**Hint:** Remember that the `y` direction is positive pointing down the canvas, not pointing up
-like a traditional cartesian coordinate system. This may impact the
-values returned from trigonometric functions.
-
-_Related APIs_:
-[Java Math.\*](https://docs.oracle.com/javase/7/docs/api/java/lang/Math.html)
-
-## Integer representations of RGB colors
-
-Colors on computer screens are often thought of as R, G, B, (and alpha) values ranging from 0 to 255, using
-hexidecimal representations (`#00` to `#FF`) of those numbers for each value. For example the
-hexidecimal representation of the color #FF0410 would be
-
-FF <- red value = 255 in decimal  
-04 <- green value = 4 in decimal  
-10 <- blue value  =  16 in decimal  
-
-But the real `int` representation of this RGB  value is
-
-`255 * 256 ^ 2 + 04 * 256 + 16 * 1` = 16712720.
-
-
-
-# Turn-in
-
-## Submission Instructions
-
-### Part 1-3:
-
-Remember to continually commit your changes to Gitlab (`git add`/`git commit`/`git push`), and then turn in your code using the GitGrade link at the top of this page.
-
-Note: we will ONLY be using your code in the following files:
-
-```
- - ColorPickerView.java
- - MainActivity.java
-```
-
-### Part 4:
-
-You are to turn in Part 4 to Gradescope.
-
-## Grading (40pts)
-
-### Code (31 pts)
-
-This code portion of this homework will be out of 31 points and will roughly (subject to small adjustments) be distributed as:
-
-- Code quality(4 pts)
-  - Code compiles and runs
-  - Does not re-write helper methods in stub code
-  - Does not duplicate inherited instance variables
-  - Utilizes callback and MVC correctly
-- Event Handling (`onTouchEvent`, etc) : (9 pts)
-  - Correctly determines essential geometry
-  - Implement PPS properly
-  - Implements circular interaction properly
-- Feedback (onDraw)  (6pts)
-- Responds to callback in Application (3 pts)
-- Layout Management (2 pts)
-- View Model Management (2 pts)
-- Correctly calls `invalidate` when `setColor` is called (1pt)
-- Correctly update model in the view whenever internal state changes (1 pt)
-- Application model management (2 pts)
-- Application/View Resilience (3 pts)
-
-### Reflection (9pts)
-
-For this part, you will submit your reflection on this assignment to Gradescope. Create a MS Word,
-Google or other type of document and copy the following questions (in italics below) into that document.
-Add your responses below each question. You can have more than one answer per page, but if you can,
-please try to avoid page breaks in the middle of a question. Insert page breaks between questions as needed.
-
-Each of the 3 reflection questions is worth 3 points. Remember that the grading for these reflection
-questions is based on the following rubric:
-
-- Student gives at least a minimum answer to all parts of the guiding question.
-- Clear/concise but descriptive examples are given throughout the response. An uninformed reader
-can create a mental picture of the situation being described. Abstract concepts are explained accurately.
-- Student elaborates on the significance and meaning of the examples; why they are important.
-- Occasionally a student will be given extra credit for an particularly insightful reflection.
-
-## IDE Errors/Warnings you can ignore
-
-<span style="color:red;">**NOTE:**</span> An error/warning that can be ignored for this assignment **cannot** be ignored for every assignment. Check IDE notices against specs on per assignment basis.
-
-- `onTouchEvent`
-  - Custom view ColorPickerView overrides `onTouchEvent` but not `performClick`
-- Anonymous Class Replaced with Lambda
-  - "anonymous new `AbstractColorPickerView.ColorListener()` can be replaced with lambda"
diff --git a/assignments/consent.md b/assignments/consent.md
deleted file mode 100644
index 0d0ed84f2eb04c86327323c99608f8790b9fb91b..0000000000000000000000000000000000000000
--- a/assignments/consent.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-layout: default
----
-
-# Consent Form for CSE340
-
-Contact information for person running study: _[Fill in]_
-
-# Introduction and Purpose of study (Beneficience)
-
-_[Fill in: Write 1-2 sentences about what this study is about]_
-
-# Requirements for participation (Respect for Persons)
-
-To participate in this study you must be _[Fill in: Requirements (only age:
-must be 18 or older)]_
-
-# Study procedures (Respect for Persons)
-You will complete a series of menu selections during this study. You
-will need to click on 108 menus to complete the session as
-mentioned above. You should expect this to take approximately _[Fill
-in: X Minutes]_
-
-_[Fill in: Tell the participant if they will be compensated or not]_
-
-# Voluntary nature of Study (Respect for Persons)
-Your participation is voluntary and you can stop at any time without
-penalty. Your decision not to participate will not have an impact on _[Fill
-in: What might be coercive to the participant]_
-
-# Benefits of Study (Beneficience)
-This study will not directly benefit you. However, it will help us to
-understand _[Fill in]_  
-
-# Contact (of IRB typically; Me in this case)
-If you have any concerns about this study, you can reach out to the
-Professor in charge, {{site.author.name}}, bricker [at] uw.edu
-
-# Written Consent
-
-To affirm your consent to participate in this study, please fill out the following form
-[https://bit.ly/20sp-Menus-Consent](https://bit.ly/20sp-Menus-Consent).
diff --git a/assignments/contextaware.md b/assignments/contextaware.md
deleted file mode 100644
index 49ff953a608a897aa9601c6154c890a3a723d427..0000000000000000000000000000000000000000
--- a/assignments/contextaware.md
+++ /dev/null
@@ -1,161 +0,0 @@
----
-layout: assignment
-title: Context Awareness
-code: A3
-published: draft
-assigned: <!-- Tuesday, May 28, 2019 -->
-due: <!-- 11:59 PM Friday, June 7, 2019 -->
-revised: <!-- 9 pm Friday, June 8, 2019 -->
-
-objective: Build a context aware application.
-
-hci_goals:
-  - Create an app that uses implicit data
-  - Make a usable app as defined by the <a href="https://www.usability.gov/how-to-and-tools/methods/system-usability-scale.html">SUS
-    </a> when evaluated by a TA 
-  - Make an accessible app
----
-
-- TOC
-{:toc}
-
-# Task for Assignment
-
-You have learned many things this quarter. Now is your chance to use
-  them to create something larger than any one assignment we did. In
-  this assignment, that could include an existing interface but must
-  *also* use context somehow.
-
-## Kinds of Context
-
-There are 3 kinds of context aware applications, which function in the
-following ways:
-- Attach context information for retrieval later (e.g., Leave a note
-  while at CSE; when come back to CSE the day after, user can see the
-  note again) 
-- Automatically execute things (e.g., Automatically suggest a new
-  navigation route when a driver exits from a wrong ramp.) 
-- Present info based on context (e.g., Send a notification of bus
-  schedule when user is at bus station) 
-
-You may build an utility app or game, and you should use at least two
-fences (**one of them must be location**). 
-
-If you want to start with an existing app, you could think about how
-  to extend the drawing app to be context aware. For example, you
-  could support loading of drawings based on location (you could store
-  them in the bundle and only provide access to drawings that were
-  created in the current location).  Or, you could
-  automatically undo the last action whenever the user runs, and redo
-  it when they walk and do nothing when they hold still. Finally, the
-  colors available could change depending upon what location you are
-  in (maybe purple is only available on the UW campus!). 
-
-# Important Assessment goals 
-We will be looking for whether you app is accessible and
-    usable. Although there isn't a simple scale available for
-    assessing context-aware applications, we have modified the
-     system usability scale (
-    [SUS](https://www.usability.gov/how-to-and-tools/methods/system-usability-scale.html))
-    as follows and will use it to assess your app (each rated from
-    Strongly Agree to Strongly Disagree on a 5 point scale)
-	
-1) I think that I would like to keep using this app.
-
-2) I found the system unnecessarily complex.
-
-3) I thought the system was easy to use.
-
-4) I found the use of implicit and explicit data in this app to be well integrated.
-
-5) I thought there was too much inconsistency in this system.
-
-6) I would imagine that most people would learn to use this system very quickly.
-
-7) I found the system very cumbersome to use.
-
-8) I felt very confident using the system.
-
-# Group Project
-This is a **group project**. We will assign you to groups to make sure
-every group has an android phone. 
-
-We will also assess the group experience as part of the grade.  This
-will be based on a survey at the end asking you to describe your
-contributions, your group members' contributions and mention any
-issues. We expect everyone to get full credit for this point, but will
-be using this to check for any problems.
-
-# Video
-The video for this project should be about 2 minutes long (+/- 30
-secs). It can be made with slides/photos + video clips for the
-visuals, and you can either use text (shown in the video) or spoken
-audio to provide the information listed below. It should
-have the following structure:
-
-## Opening slide
-Should use text, not voiceover for this.
-
-Title for the project 
-Names of team members
-
-## Story
-Brief (30 second) introduction to what you created. Should cover the
-following
-- What is the need (e.g. "Remembering not to be late for class")
-- Why is this hard (e.g. "I tend to sleep late")
-- What is the solution (e.g. "Calculate distance to class an hour
-  before class starts and set an alarm to go off with enough time to
-  walk there")
-  
-## Demonstration
-Pick 1-3 use scenarios and show clips of someone using the application
-with explanations
-
-## Credits
-End with credits saying who did what in the project
-
-# Turn-in
-Turn in your code, an apk file and a video.
-
-This video will serve as the demonstration
-for the modified SUS assessment. You can use captions or voice-over to
-explain your application. 
-
-## Submission Instructions
-
-You submit this assignment <a href="https://canvas.uw.edu/courses/1317447/assignments/4723261">on canvas</a>:
-
-- Files to turn in:
-  - `src.zip`: a ZIP file containing your source
-  - `video.mp4`: your video (other filetypes also work) unless using a
-    video hosting website such as YouTube
-  - `context.apk`: Your apk 
-- Then, make a comment on your submission with:
-  - A link to your repository. Make sure that we have access to it by
-    giving access to the `cse340` if visible to you, otherwise `rfrowe`
-  - Brief notes on anything you wish to tell us about your assignment
-    - These will be visible to all group members
-  - Link to your hosted video (unless you turned in a video file)
-
-- **In Addition**: *every* member of your group should fill
-out [this group participation survey](https://forms.gle/79xCgpa99nBXbq7W6)
-
-## Grading (5pts)
-
-- Part 1: App (3 pts)
-  - Use location and another sensor: 1pt
-  - App is context-aware: 1pt
-  - App is accessible: 1 pt
-  - You score well on the modified
-    [SUS](https://www.usability.gov/how-to-and-tools/methods/system-usability-scale.html)
-    when evaluated by a TA 
-- Group participation: 1pt 
-
-In peer grading survey,
-- We will ask what type of context is used
-- Ask if the app is enjoyable, in a Likert scale
-- Prompt to write a paragraph feedback
-
-Late policy: Since context uses half days, all group members must have
-at least 1/2 day left to get a free late day 
diff --git a/assignments/doodle.md b/assignments/doodle.md
index 3adc0cd6d98f7d89136f9b25d8a61ad749b584de..5f3a011708c7259b4eaf7a1c6c0f33547151827d 100644
--- a/assignments/doodle.md
+++ b/assignments/doodle.md
@@ -2,57 +2,38 @@
 layout: assignment
 published: true
 
-title: Doodle
+title: Sample Assignment
 code: AS1
 
-assigned: Wednesday, April 1, 2020
+assigned: Date Assigned
 due:
 - <strong>Code</strong><br>
-  Due 10:00pm, Thursday, April 9, 2020<br>
-  Lock 10:00pm Saturday, April 11, 2020
+  Due 10:00pm, Date<br>
+  Lock 10:00pm Date
 - <strong>Peer evaluation</strong><br>
   Out late Saturday night or Sunday morning<br>
-  Due 10:00pm, Tuesday April 14, 2020
+  Due 10:00PM Date
 - <strong>Reflection</strong><br>
-  Due 10:00PM Wednesday April 15, 2020<br>
+  Due 10:00PM Date<br>
 revised: 10:30 PM Tuesday, March 31, 2020
 
-objective: Create an Android app that draws a doodle consisting of a text, a line, and a set of images on the main canvas.
+objective: Objective
 
 hci_goals:
-  - Use abstractions to draw on screen
-  - Create animations
-  - Use coordinate transformation
-  - Try to create something appealing
+  - Goal 1...
 android_goals:
-  - Get familiar with Android Studio
-  - Understand XML and View
-  - Load image and drawable resources
-  - Learn Activity Lifecycle
+  - Goal 2...
 ---
 
 ## GitGrade Turn-in links
 
-- [Accept the Assignment](https://gitgrade.cs.washington.edu/student/assignment/116)
-- [Turn-in the Assignment](https://gitgrade.cs.washington.edu/student/assignment/116/turnin)
-- [Review your Submissions](https://gitgrade.cs.washington.edu/student/summary/8723)
+- [Accept the Assignment](https://gitgrade.cs.washington.edu/student/assignment/xxx)
+- [Turn-in the Assignment](https://gitgrade.cs.washington.edu/student/assignment/xxx/turnin)
+- [Review your Submissions](https://gitgrade.cs.washington.edu/student/summary/xxx)
 
 # Assignment Description
 
-For this assignment, you will be creating an activity class which will allow you to create
-"Doodles" consisting of images, lines, and text.
-
-This assignment will take about 6 - 8 hours to complete. You should expect this amount of workload
-on most assignments this quarter, so make sure to build good habits when completing it.
-
-If you find yourself taking additional time on this submission, we strongly suggest that you
-get in touch with the course staff on Ed or in person.
-
-The assignment is broken into four parts
-- Part 1: Demonstrate that you can build an app in Android studio that includes images, text, lines and an animation.
-- Part 2: Create an interesting and creative Doodle of your own.
-- Part 3: Review three of your peers Doodles.
-- Part 4: Reflect on what you learned in the assignment and from the peer reviews you receive.
+For this assignment, you will be creating an activity class which will allow ....
 
 * TOC
 {:toc}
@@ -62,21 +43,11 @@ The assignment is broken into four parts
 
 **Tasks**:
 
-* Get your development environment ready
-  * Download and install Android development environment and git if you do not already have it
-  * Accept the Doodle assignment from [Gitgrade](https://gitgrade.cs.washington.edu/student/assignment/116)
-  * Successfully clone our starter code to your computer
-* Open our skeleton code in Android Studio, read through and understand it
-* Implement three methods: `addImage`, `addText`, `addLine`
-* Call the methods you implemented and compare your app screen with our screenshot
-* Animate `UW` so it slides from left to right when the app opens.
+* task1...
+* task2...
 
 ## Prepping your development environment
 
-Instructions for downloading and installing the Android development environment are on our
-[schedule](../schedule) page and have been sent out through our Ed discussion platform.
-Please come to our first section or office hours if you are having any trouble with your machine set up.
-
 Use GitGrade to accept the assignment and receive the starter code. See the
 [instructions](../docs/gitgrade) for more details.  
 
@@ -86,177 +57,35 @@ We have provided you with the shell of an application which has the following cl
 
 <div class="mermaid">
 classDiagram
-  AppCompatActivity --> TabActivity
-  TabActivity --> Doodler
-  Doodler --> Part1
-  Part1 --> Part1Activity
-  Part1 --> Part2Activity
+  Aclass --> Bclass
+  Bclass --> Cclass
 
-  View --> ImageView
-  View --> TextView
-  View --> LineView
+  Dclass --> Eclass
 
-  class Doodler {
+  class Dclass {
     &lt;&lt;abstract&gt;&gt;
     +addImage()
     +addText()
     +addLine()
     +doodle()
   }
-  class Part1 {
-    +addImage()
-    +addText()
-    +addLine()
-  }
-  class LineView {
-    - endPoint
-    - brush
-  }
-
-  class Part1Activity {
-    +doodle()
-  }
 
-  class Part2Activity {
+class Cclass {
     +doodle()
   }
 
 </div>
 
 
-`AppCompatActivity` is an Android class that we subclassed in `TabActivity` so we can switch back and
-forth between your Part 1 and Part 2 code using the blue navigation bar at the bottom of the screen.
-You should not edit this part of the code but if you are curious, this tabbing functionality is
-controlled by the code in the `Part1Activity#onCreate(Bundle)` and `Part2Activity#onCreate(Bundle)` methods.
-We are using a View called BottomNavigationView that gives the functionality of a navigation bar -
-the switch statement in each of the `onCreate` methods tells the program when to show which activity.
-
-**Note:** The notation such as `Part1Activity#onCreate(Bundle)` is a common shortcut to demonstrate a specific
-method in a specific class (here the `onCreate` method which takes a `Bundle` as parameter
-in the `Part1Activity` class).
-
+`Aclass` is an Android class that we subclassed in `Bclass` so we can...
 
 ## Your Tasks...
 
-This task involves implementing three methods in `Part1.java`. Each method is named here but
-detailed doc comments can be found in `Part1`'s superclass, `Doodler`, which also defines some
-nice helper methods. It also defines the `onCreate` behavior of the Activity which calls the
-method `Doodler#doodle(FrameLayout)`.
-
-In `Part1`, you'll find missing implementations for three methods: `addImage`, `addText`, and `addLine`.
-
-Subclasses of `Part1` will have access to these methods once they are implemented. Take a look at
-an example of this in `Part1Activity`. It extends `Part1` and uses the three methods to
-draw the following image on the screen:
-
 ![A screenshot with a heart on it made up of smaller pictures. There's an "I" in the upper left and a "UW" in the middle left](doodle-img/screenshot_no_animation.png){:width="25%"}
 
-You'll notice in `doodle` in `Part1` that we use `scaleX` and `scaleY` around our coordinates
-(and size for images). These allow us to ensure the doodle still looks good on smaller screen sizes.
-**If you use _any_ pixel coordinates in your solutions, remember to wrap them in these scaling methods**.
-These will scale coordinates from the Pixel 2 XL to the dimensions of your device's screen.
-We'd recommend that you use a Pixel 2 XL emulator to compare the finished doodle against our
-screenshot to be sure you're implementing everything right.
-
-### Specification for addImage
-
-```java
-ImageView addImage(FrameLayout doodleView, String imageName, float x, float y, int size);
-```
-
-Most of this method is implemented for you. Please read through it to understand how it works,
-then try to set the size and location of ImageView added in this method. Critically, the images are
-going to be squished into a square, so only one `size` parameter is given.
-
-In order to implement this correctly you need to properly position the bounding box of the view:
-the `x` and `y` location relative to the parents are passed in as parameters and the `size` parameter
-is used for both the width and height. Setting the width and height will be done using the  
-`getLayoutParams()` and `setLayoutParams()`.
-
-If you implement it correctly, you'll see the image below if you run:
-
-```java
-addImage(doodleView, "food_3", scaleX(300), scaleY(300), scaleX(300));
-```
-
-![An image of a sushi bowl in the middle of the screen.](doodle-img/add_image_sample.png){:width="25%"}
-
-
-Remember that this is covered in section (😉).
-
-*Related APIs*:
-[ImageView](https://developer.android.com/reference/android/widget/ImageView.html)
-
-### Specification for addText
-
-```java
-TextView addText(FrameLayout doodleView, String text, float x, float y, int fontSize, int color);
-```
-This does not need to have it's bounding box adjusted.
-
-You may find the comments and the implementation of `addImage` useful. Make sure you are not
-editing the `xml`, `addText` is an abstracted function for adding text to a canvas, not
-specific to the contents in Part1. The font-family is the default one, no need to do anything
-special here.
-
-If you implement it correctly, you'll see the image below if you run:
-
-```java
-addText(doodleView, "CSE340", scaleX(550), scaleY(200), 60, Color.rgb(51,0,111));
-```
-
-![A purple text "CSE340" shows at the top right of the screenshot.](doodle-img/add_text_sample.png){:width="25%"}
-
-*Related APIs*: [TextView](https://developer.android.com/reference/android/widget/TextView.html)
-
-### Specification for addLine
-
-```java
-LineView addLine(FrameLayout doodleView, float startX, float startY, float endX, float endY,
-                int lineWidth, int color);
-```
-
-There are several ways to draw a line. The Android Code snippets blog has
-[a good example](https://android--code.blogspot.com/2015/11/android-how-to-draw-line-on-canvas.html).
-
-For this method, you will be using a class called `LineView` whose job is to draw a line onto the
-canvas. Parameters passed into `addLine` should also be passed into the `LineView` constructor to create a line
-of the appropriate color. You will be implementing both the constructor and `onDraw` methods in `LineView`.
-To this end, we have provided some blank stub code for you to
-fill in. Each `LineView` should draw a single line onto the canvas.
-
-By default, the size of the `LineView` will start out as the size of it's parent, i.e. the Canvas.
-In order to implement `addLine` correctly you need to adjust the size of this view (the bounding box)
-to be _ONLY_ from the from `startx`, `starty`, to `endx` and `endy`, and ensure that it is correctly
-located at `startx` `starty`. To do this you will use the method we discussed in
-class (`getLayoutParams()` and `setLayoutParams()` and `setX()` `setY()`).
-
-If you implement it correctly, you'll see the image below if you run:
-
-```java
-addLine(doodleView, scaleX(100), scaleY(250), scaleX(700), scaleY(1200), 15, Color.rgb(200,0,0));
-addLine(doodleView, scaleX(400), scaleY(1500), scaleX(250), scaleY(100), 20, Color.rgb(0,0,255));
-```
 
 ![A red line starts from top left to the center of the screenshot. A blue line also is present](doodle-img/add_line_sample.png){:width="25%"}
 
-**Updated Note for 2020:** You only have to handle lines that have a negative, 0, or infinite slope. In other words,
-you do not need to handle a line that draws from the lower left to upper right OR the upper right to the
-lower left.
-
-### Animating Text
-
-Once you've implemented the three methods defined above, your doodle should match. For the last part,
- you will need to figure out how to animate text. In `Part1Activity#doodle(FrameLayout)`,
- use animations to move the `TextView` variable `uw` from `(50f, 1650f)` to `(1050f, 1650f)`. Remember to apply
- `scaleX` and `scaleY` to these animations. The animation should last `1000ms` (milliseconds not seconds).
-
-Once you've finished your animation, your doodle should match this screenshot:
-
-![A screenshot with a heart on it made up of smaller pictures. There's an "I" in the upper left and a "UW" in the middle right](doodle-img/screenshot.png){:width="25%"}
-
-A gif  of this animation is shown below but you can also see a higher resolution
-[.webm version](doodle-img/part1playback.webm) of this file as well.
 
 ![An animation with a heart on it made up of smaller pictures. There's an "I" in the upper left and a "UW" in the middle left](doodle-img/part1playback.gif){:width="25%"}
 
@@ -268,165 +97,11 @@ A gif  of this animation is shown below but you can also see a higher resolution
 
 
 
-### Important note for Windows Users
-
-In the past we have had issues with the app crashing because of the
-line endings in the `.csv` file on Windows machines. When you
-clone the repository onto your Windows machine, all the line endings are automatically converted to
-carriage returns (`“\r\n”`) instead of the usual new line character (`“\n”`). This will prevent the
-`.csv` from being parsed correctly due to the regular expression (regex) we use. There are 2 ways to fix this:
-
-- Changing the line endings to “LF” in the bottom right hand corner of Android Studio
-(should initially say “CRLF”). See this animated [.gif](doodle-img/csverror.gif) for more details.
-- Replacing the `scan.useDelimiter(“[\n]”)` line in `Doodler.java` with
-`scan.useDelimiter("[,]|\\r\\n|[\\n\\r\\u2028\\u2029\\u0085]")`
-
-
-# Part 2: Custom Doodle
-
-***
-
-**Tasks**:
-
-* Design a beautiful doodle of your own.
-* Implement your design in Android.
-* Create a video of your Animation
-
-This is where your creativity comes into play. We've created a blank slate for you in `Part2Activity`.
-In here you must use all three methods implemented in [Part 1](#part-1-learning-by-doing) to draw your own doodle,
-and your doodle should have an animation incorporated into it. You are also
-welcome to implement new methods in `Part2Activity` to make a more creative and beautiful doodle.
-
-To start you must spend 5-15 minutes sketching out your idea. Here you should you think about how
-to incorporate lines, text, and images, and how these will be moved around the screen. Storyboarding
-is a good way to sketch out how this animation will progress. For more information about
-[storyboarding](https://en.wikipedia.org/wiki/Storyboard)
-watch at least the first 1:30 of this [video](https://www.youtube.com/watch?v=m2JJxRlxV2s). This storyboard
-does not have to be very complex - even 2-3 frames will give you an idea of how to progress. **This
-storyboard will be turned in as part of your reflection.**
-
-To ensure your peer reviewers see your Custom Doodle once you've completed it, take a video of the
-running doodle to submit through
-[this web form](https://docs.google.com/forms/d/e/1FAIpQLSd8sN1aB7JZIS_POZWVdtTsL7e0ZVGkjS_WBINo_cKLv6OH_w/viewform).
-
-* To see how to capture a your running animation on the emulator,  
-watch this [video](doodle-img/recordingvideo.mp4).
-* To capture your doodle on your phone
-(tethered to Android Studio), do [this](https://developer.android.com/studio/debug/am-video), but you
-have to put your phone into [Developer mode](https://developer.android.com/studio/debug/dev-options) first.
-
-
-**Tips**:
-
-* Aim for complexity similar to [Part 1](#part-1-learning-by-doing) (images, text, and shapes) though you don't need
-to use as many images. Try to be creative - your work will be evaluated by your peers.
-* You may use the attractive home-cooked food images ([photo credit](https://www.XiaoyiZhang.me))
-we include in `res/drawable` or use your own images.
-* If your animation is  slow, laggy, or not visibly showing (particularly ) on the emulator), try the following
-  * Reduce the number of images you put on canvas or reduce the file size of images
-  (e.g., convert png to jpg, reduce resolution of image file).
-  * Check the duration of the animation. Recall that the parameter to the method if in milliseconds, not
-  seconds. It may be worth inflating the number you pass in during testing.
-  * Ensure that your animation `propertyName` is set correctly for your intended animation
-  * Ensure that your animation starts and ends in different locations if necessary (translating in place is not visibly discernible)
-  * Recall that `Path` and `onFloat` take absolute coordinates unless otherwise specified
-  * Ensure that animations have not been turned off in the settings app of the phone/emulator
-* Recall that "Child views are drawn in a stack, with the most recently added child on top."
-(from the [FrameLayout](https://developer.android.com/reference/android/widget/FrameLayout) documentation).
-You can add a child at a specific index in the child list,
-see the documentation of the [ViewGroup](https://developer.android.com/reference/android/view/ViewGroup)
-documentation for more about how to add and remove children.
-* You can switch between the activities by using the navigation bar at the bottom of the screen.
-* **Make sure that your doodle depends on _nothing_ outside of the files described in [Turn-in](#turn-in).**
-
-
-*Related APIs*:
-[Android Animation](https://developer.android.com/training/animation/reposition-view) /
-[View Animation](https://developer.android.com/guide/topics/graphics/view-animation.html) /
-[Property Animation](https://developer.android.com/guide/topics/graphics/prop-animation.html) /
-[Vogella Tutorials - Android Animation](http://www.vogella.com/tutorials/AndroidAnimation/article.html)
-
-## Commenting your code
-
-Most of the starter code has been fairly well commented for you. However there are some places you
-should add comments as you are completing your solution:
-1.  If you have any significantly complicated code for your custom doodle, add comments that might
-help your TA effectively grade your awesome work!
-2.  If you received significant help from a source on any part of your code, be sure to
-add a comment referencing their help.  See the
-[Collaboration Policies](../academic-conduct#collaboration-policies)
-portion of our syllabus for more details.
-3.  If you add and use an image that requires copyright, you may add the attribution in your
-source code where you add the image to the screen. See the
-[Application Content](../academic-conduct#application-content)
-portion of our syllabus for more details.
-
-# Part 3: Peer Review
-
-The Custom Doodle will be peer reviewed as part of the grading process. We will use these
-peer reviews to ensure that you have implemented all of the parts required for [Part 2](#part-2-custom-doodle)
-
-Peer grading will take place once everyone has turned in their assignments. You will receive an
-email with links to three other students' `.apk` files (and associated videos) and a link to a form to fill
-out for each student you have been assigned to peer grade. You will load these files into the
-emulator via Android Studio or onto a physical phone, view and review their
-custom doodles for Part 2, then fill out the survey to give them your feedback. **Note:** you *must*
-evaluate the a given doodle based on the `.apk`, using the video only as a backup, for instance, if
-the animation does not run on your emulator or phone when you load it.
-
-Additionally, you will have a chance to nominate the most creative doodles! The winners will be
-shown off in class later this term.
-
-# Part 4: Reflection
-
-Each assignment this quarter will have a reflection component as it is a vital part of your
-work as a Programmer, Computer Scientist, and/or Engineer.  Your reflections do not have to be long
-(please no more than a paragraph or two in length). Details on what a well
-written reflection includes can be found [here](reflection). You will be graded on your answers to
-these reflection questions based on the following
-
-* Student gives at least a minimum answer to all parts of the guiding question.
-* Clear/concise but descriptive examples are given throughout the response. An uninformed
-reader can create a mental picture of the situation being described. Abstract concepts are explained accurately.
-* Student elaborates on the significance and meaning of the examples; why they are important.
-* Occasionally a student will be given extra credit for an particularly insightful reflection.  
-
-Create a MS Word, Google or other type of document and copy the following questions (in italics below) into
-that document. Add your your responses below each question. You can have
-more than one answer per page, but if you can, please try to avoid page breaks in the middle of
-a question. Insert page breaks between questions as needed.
-
-You will need to submit your write up as a PDF file. If you are new to Gradescope, see this
-[document](https://gradescope-static-assets.s3-us-west-2.amazonaws.com/help/submitting_hw_guide.pdf)
-for instructions on how to scan and submit hand-written solutions.
-
-Gradescope accounts will be created on the first (or second) day of the quarter for all
-registered students. You will receive an email message from Gradescope with a link that you can
-use to create an account and submit your solution. Your Gradescope username will be your UW
-email address. If you are not registered for the course before the assignment is due, please
-email the instructor with your name, your UW ID number, and your
-UW email address (uwnetid@uw.edu) so we can set up a Gradescope account for you.
-
-For this assignment, your reflection should cover the following:
-
-* _Include the sketches and storyboard you made as part of your design work for [Part 2](#part-2-custom-doodle) and
-a screen capture of your beautiful Doodle._
-
-* _In looking at your design sketches from [Part 2](#part-2-custom-doodle), what changed when you did your
-actual implementation? Why did you make those changes from your original design vision?_
-
-* _Why is be better to animate a `View`, rather than invalidate/redraw its contents?_
-
-* _At the moment, other than the bottomNavigationBar, our application does not respond to the user at all.
-Think of at least two ways that you would go about adding interactivity to this application._
-
-* _What did you learn from reading the peer evaluation about the user experience of your doodle?_
-
 # Turn-in
 
 ## Part 1 and Part 2: Code
 
-You will turn in the following files on GitGrade [here](https://gitgrade.cs.washington.edu/student/assignment/116/turnin).
+You will turn in the following files on GitGrade [here](https://gitgrade.cs.washington.edu/student/assignment/XXX/turnin).
 
 Make sure you only edited the following files for turn in:
 
@@ -438,20 +113,7 @@ Make sure you only edited the following files for turn in:
 - part2.csv (optional)
 ```
 
-Do not edit any of the other files with one exception: if you are on a Windows machine and need
-to modify the `scan.useDelimiter(“[\n]”)` call in `Doodler#addAllImagesFromData(FrameLayout)`.
-
-If you use your own images in [Part 2](#part-2-custom-doodle), please make sure to add and commit them to
-your repository in the `res/drawable` directory. If your images are not there, your custom doodle
-will not work for others and you will NOT get credit for the work you did.
-
-If you're positioning a large number of images for [Part 2](#part-2-custom-doodle), it is best to use a
-CSV similar to `data.csv` which is used for the heart in [Part 1](#part-1-learning-by-doing). Include this as
-`part2.csv` if necessary. Remember, the CSV coordinates are on a Pixel 2 XL and scaled to the
-current screen in `Doodler#addAllImagesFromData(FrameLayout)`.
-
-Remember to submit a video of your custom doodle animation through [this web form](https://docs.google.com/forms/d/e/1FAIpQLSd8sN1aB7JZIS_POZWVdtTsL7e0ZVGkjS_WBINo_cKLv6OH_w/viewform) at the same time you submit your code.
-
+Remember to submit a video of your custom doodle animation through [this web form]({{site.baseurl}}/404.html) at the same time you submit your code.
 
 **Follow these instructions to submit to GitGrade**
 
@@ -461,33 +123,11 @@ Remember to submit a video of your custom doodle animation through [this web for
 - Go to the turn in link
 - Check the box and click "Turn in"
 
-## Part 3: Peer Evaluation
-
-You will receive more details about this step of the assignment in our second lab. We will
-send out the emails to your uw.edu email account. Make sure to reach out on our discussion board
-if you do not receive the emails when it is announced that they were sent out (but check your
-  spam folder first!)
-
 ## Part 4: Reflection
 
 The reflection will be turned in to Gradescope.
 
-### Grading (40pts)
-
-This HW will be out of 40 points and will roughly (subject to small adjustments) be distributed as:
-
-* Part 1
-  * `addImage`: 2 pts
-  * `addText`: 3 pts
-  * `addLine`: 8 pts
-  * `UW` Animation: 4 pts
-* Part 2
-  * Static verification of custom Doodle (1pt)
-  * Active custom Doodle as verified through Peer Evaluation
-    * Using each of the three methods at least once: 3 pts
-    * Using an animation: 1 pt
-* Part 1 & 2 Code quality (2 pts)
-* Part 3: Complete assigned peer evaluations: 3 pt
-* Part 4: Reflection
-  * Sketch for part 2 is turned in with reflection (1pt)
-  * Each of the 4 question is worth 3 points (12 pts total)
+### Grading (XX pts)
+
+This HW will be out of XX points and will roughly (subject to small adjustments) be distributed as:
+
diff --git a/assignments/index.md b/assignments/index.md
index 2850793df46e3fef711978b204f4a067df6799fd..1296d2770e692bfd6ad62bdf5a3e36d8d2c32b0c 100644
--- a/assignments/index.md
+++ b/assignments/index.md
@@ -19,11 +19,4 @@ on public repositories such as Github.
 
 | Assignment                                                  | out    | due    | lock    | Peer Eval        | Reflection |
 |-------------------------------------------------------------|--------|--------|---------|------------------|------------|
-| [Doodle]({{site.baseurl}}/assignments/doodle)               | 1-Apr  | 9-Apr  | 11-Apr  | 12 Apr -- 14 Apr | 15-Apr     |
-| [Layout]({{site.baseurl}}/assignments/layout)  parts 1-2    | 10-Apr | 17-Apr | N/A     | N/A              | N/A        |
-| [Layout]({{site.baseurl}}/assignments/layout)  parts 3-4    |        | 24-Apr | 25-Apr  | N/A              | 24-Apr     |
-| [Accessibility]({{site.baseurl}}/assignments/accessibility) | 22-Apr | 30-Apr | 2-May   | N/A              | N/A        |
-| [Color Picker]({{site.baseurl}}/assignments/colorpicker)    | 1-May  | 11-May | 13-May  | N/A              | 11-May     |
-| [Menus]({{site.baseurl}}/assignments/menus) parts 1-4       | 12-May | 21-May | 22-May  | N/A              | N/A        |
-| [Menus]({{site.baseurl}}/assignments/menus) parts 5-6       | 20-May | 25-May | 27-May  | N/A              | 25-May     |
-| [Undo]({{site.baseurl}}/assignments/undo)                   | 22-May | 1-Jun  | 3-Jun   | 3-Jun -- 5-Jun   | 8-Jun      |
+| [Doodle]({{site.baseurl}}/assignments/doodle)               |   |  |  | |     |
diff --git a/assignments/layout-img/1_landscape.png b/assignments/layout-img/1_landscape.png
deleted file mode 100644
index 81910a74050cea8f28e3bec26cc10fa97d08d473..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/1_landscape.png and /dev/null differ
diff --git a/assignments/layout-img/1_portrait.png b/assignments/layout-img/1_portrait.png
deleted file mode 100644
index 9bd05c02c72702aa248ba15346a46bf1e9ae0036..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/1_portrait.png and /dev/null differ
diff --git a/assignments/layout-img/3_landscape.png b/assignments/layout-img/3_landscape.png
deleted file mode 100644
index 2b35654bbbaf23c88394da72f780ac675447e613..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/3_landscape.png and /dev/null differ
diff --git a/assignments/layout-img/3_landscape_scrolled.png b/assignments/layout-img/3_landscape_scrolled.png
deleted file mode 100644
index ed704982bc17697e0f2cc8f9674659dfe4a42214..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/3_landscape_scrolled.png and /dev/null differ
diff --git a/assignments/layout-img/3_portrait.png b/assignments/layout-img/3_portrait.png
deleted file mode 100644
index 5c0b44bfdbd1e87ec6765a0fa67022f85285c41e..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/3_portrait.png and /dev/null differ
diff --git a/assignments/layout-img/3_portrait_measured.png b/assignments/layout-img/3_portrait_measured.png
deleted file mode 100644
index 1a6d04655cb7a7c78c82a637839b436c0d4ea2ac..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/3_portrait_measured.png and /dev/null differ
diff --git a/assignments/layout-img/3_portrait_measured_bottom.png b/assignments/layout-img/3_portrait_measured_bottom.png
deleted file mode 100644
index c27b5bd3f31446224bf9546815c57d62da83929a..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/3_portrait_measured_bottom.png and /dev/null differ
diff --git a/assignments/layout-img/3_portrait_scrolled.png b/assignments/layout-img/3_portrait_scrolled.png
deleted file mode 100644
index 75dea3cc77afe1a7de03d4b62e7bf48eff82c9f4..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/3_portrait_scrolled.png and /dev/null differ
diff --git a/assignments/layout-img/LayoutSpec.pdf b/assignments/layout-img/LayoutSpec.pdf
deleted file mode 100644
index b1a9bf3628f70c46e6aec4bae7413274d9319097..0000000000000000000000000000000000000000
--- a/assignments/layout-img/LayoutSpec.pdf
+++ /dev/null
@@ -1,966 +0,0 @@
-%PDF-1.5
%âãÏÓ
-1 0 obj
<</Metadata 2 0 R/OCProperties<</D<</OFF[9 0 R]/ON[10 0 R 11 0 R 12 0 R]/Order 13 0 R/RBGroups[]>>/OCGs[9 0 R 10 0 R 11 0 R 12 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 54424/Subtype/XML/Type/Metadata>>stream
-<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
-<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c145 79.163499, 2018/08/13-16:40:22        ">
-   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
-      <rdf:Description rdf:about=""
-            xmlns:dc="http://purl.org/dc/elements/1.1/"
-            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
-            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
-            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
-            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
-            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
-            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"
-            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
-            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
-            xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"
-            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
-            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
-         <dc:format>application/pdf</dc:format>
-         <dc:title>
-            <rdf:Alt>
-               <rdf:li xml:lang="x-default">LayoutSpec</rdf:li>
-            </rdf:Alt>
-         </dc:title>
-         <xmp:MetadataDate>2019-09-09T01:26:12-07:00</xmp:MetadataDate>
-         <xmp:ModifyDate>2019-09-09T01:26:12-07:00</xmp:ModifyDate>
-         <xmp:CreateDate>2019-09-09T01:26:12-07:00</xmp:CreateDate>
-         <xmp:CreatorTool>Adobe Illustrator CC 23.0 (Windows)</xmp:CreatorTool>
-         <xmp:Thumbnails>
-            <rdf:Alt>
-               <rdf:li rdf:parseType="Resource">
-                  <xmpGImg:width>256</xmpGImg:width>
-                  <xmpGImg:height>160</xmpGImg:height>
-                  <xmpGImg:format>JPEG</xmpGImg:format>
-                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAoAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUv8w6hLp2hX99CAZbaCSSMHpyVSVr9OKvm6&#xA;7vLq8uHubqV555DV5JCWYn5nJIUsVdirsVdirsVZ7+UWt6hD5hXSxKzWN0khaFiSquilg6jsdqHA&#xA;Ve04EuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVJfOv/ACiWr/8A&#xA;MLL/AMRxVfJpWl/odm+pwcvq5NfTSteHyxVif1Gy/wCWeL/gF/phQvvDoUUMcci26uu7SOsadR9n&#xA;enT3xVSluvLTRRQxvaSSDq/7oHf9gdzTFURJBpUlvEsUEUhG5lCJ/wACKDcDFUZoGnae+oqGtYmH&#xA;Ftiint8sVRepWdpb+bfLxt4I4S31zl6aqtaQjrQDFLXkPzTfa/pOo3t9HHG9nqV/ZItur0MVpO0a&#xA;EqWclyq7079BgVLrv82tJsYbiXUdI1Sw9C3S+9K5igSRrN51t2ueHrFkWNnUyLIFkUb8MVRV3+Zm&#xA;jRapcaVa2d7qOoRXS2EEFqkRFxObf6zIsUkssUdIYiDIzsoFabnFW9M/M3y9qN1b2tvFciea2vbp&#xA;43RAYTp0qw3EMo5njKrvsBUHx6Yql3lz8zLzX/N1pYWekXA0K+0a21aC8k+rrIn1l3+KQC5Y+n8I&#xA;j4qhbnX9ijYql+sfmV5gtvMmrabC2mWk+nTxx6domocoLrVIikbPJbXcs8FulTIQo4PuN6Yqncv5&#xA;paRDe3UMum6gllY6imk32qmOH6rDcy+mI+RE3qlWaZV5KhoT8VBTFVVPzO0Br1I2guo9MluLiyg1&#xA;t0j+pSXNosjTRKRIZtvRejNGFYqeJOKo3yx5yi8wFWh0rUbK2mgW7sry8hRYbiB2oro8by8SwowS&#xA;Xg/E140xVjWlfmdqr3mtT6rpksGn2mpDRtIsYYoXurm82/d+qLtk5EVYho0RV39Q7gKpk35qaT6l&#xA;raRaXqE+rXN5PpzaTGtubiG5t4fXdJS06wgGMhg4kK074q35m8x+Z4/OWg+XNGks7MaraXl1cXF9&#xA;bSXbIbUxcUVIbm1G/qmvxHFUu0z83AfK8Ot6no160MaTyalfWUaGyhjt7qS2MokmkjZw3pF+EfNw&#xA;u5FKEqorW/zOMVh5rbRdIu7258swzGa6YWwtPWS3WdN2uIpHTi/JuArQHuV5KusfzSWRbW2m0HU5&#xA;dUNjDqGo2tqltK1vDOxRJeCXDvIrlSyrD6jhftAHbFUX+aXmfzJ5Y8pXetaFZ2t1JZxvNcveSOqR&#xA;ogrURxjlIWO1Oa/PFUf5t8yXOieSr7X4YUmntLUXAjavCpAqxA+Iha8qDc0oMVa8h+YL7X9AGo3Y&#xA;jes80dteQRyQQ3UEchWO5iilaR0SRRUVc+IJBGKpRp/mvzbF5r0jStcgs4RriXksWmwBjdWSWtCj&#xA;TzCaWKYOpAJVEAY03xVnGKuxV2KuxV2KpL51/wCUS1f/AJhZf+I4qgz5fvF8vJCdd1FliiSTkTbc&#xA;39OknB3EAYq3Hi2+67Yq8l1545/NN/ba/e3iaQYeFrb2bcODlVKuRVVfv9qvXJISVvIfkW4eJofM&#xA;01opB9Zbi0eV+XYgpwXfwrgVSg/LzypxRrjzWinn+8VLOY/B7Enr/sT/AFVTWy0f8uNJjmeG6v76&#xA;5cj0XUvBwAHYoYatU9TX5DFWaflpb6rqOmwpdapdJJFO7w3kZjErxR0IRzIsgZSahqjfEpZReabP&#xA;b+dtBuJdRubv1EuoxDP6IjThETyVYo4vibnQk+AxVDeX/I3mfRIr+xttdtf0VqF5eXkiiwlW8j+u&#xA;yNIwjuRecAyFvhb0T8sCpLpf5Sp5e+t6iYYNaeTR5dHuNN0+zhsZr0Tyxs0889xcsskzBDzZ236i&#xA;n2SqiPLX5Xanpnlby0sWorZ+adHklvLi8njN7FLPeIUuY5l9SBnHFgqsrrTiMVVIfyluLOS2u9O1&#xA;kQ6nw1KPU7qa19VZzq0yzzvHGJo/RdXUcN3AHUHFUf5Z/Lu78vX2i3NrqkcqadpEOiX0cts1biK3&#xA;ZnjkiYTD0W5ua1D7be+KrfMn5e6xrVtrOltr5/QOuSepdWd3bG6ngBVQyWc5mRYUPCoDRPxJJWmK&#xA;pPY/lr5hvJ9dsr++Fl5dvdeTURYiJZZ7iG3W3eIrcrN+7V5IAHV4y3w7UrhVEWX5LaVa6rJMGsTp&#xA;0k13OVGmW51FvrnOsbajIZH4RmU8OKK9KDlTbArJPKPlvzDokMFnfa4uo6bY2qWdjbJaLbsFjICS&#xA;TyepKZJAi8fg4KevGuKpdcflw72t36Gpelfvrh8w6fctBzSGcqE9OSL1F9VOHJTR0O+1KYqs0v8A&#xA;LM2mv2Wv3GoifU49QutT1BkgMcc8lzZ/U1jiQyyGJIkoRVnJ7nfFUd5l/L3SPMfmjSdZ1aO3vbTS&#xA;7e6gOmXVslxHI1yYyJKyEqpT0/5D17YqkPnn8m7fzNcXRjvLa1tLiwTT4La4sVuhZGMsVlsf3sKQ&#xA;M3IB/gJIGxXFU7svy+ig07zVYTXplh80NIZCsfAwrJZpaED4m5bR8q7daYqkWt/lNrGtabZ2Ooa1&#xA;YS/VrWO0Fz+iU9eH0Wqs9lMbgzW8xXYsXda7qq9MVZd5y8s/4k8o6l5e+tG1/SFubf62U9UpWnxF&#xA;OScun8wxVT81eUhr2g2+mC5EEtpNbXNvLJEJ4WltXDoJoCyepGSu68h89sVSvyL+XcnlfVtS1F76&#xA;G6OpJGn1eG2e3it/Tkkk9O2DTz+nCWmZvT3+I15U2CrflbyV5k0rzFe61qes2erT6gSLiY6fLDcr&#xA;CAfSt4JTeSxxQxtvxEXxftGu+KszxV2KuxV2KuxVJfOv/KJav/zCy/8AEcVRsn/HFb/mGP8AybxV&#xA;5T5z8uSahEt5aLyuoRxeMdXTrt7jJIeesrKxVgQwNCDsQRirWKo7R9GvNVuhBbr8I/vZSPhRfEn9&#xA;QxV7R5Qs4bKeC1gFIoYyq+PTcn3J3wFUw1r/AJSzy5/0e/8AJkYpTbUtV07TLf6xf3MdtDWgeRgK&#xA;nwHcn5YFST/lZHkn/q6J/wABL/zRhpXf8rI8k/8AV0T/AICX/mjGld/ysjyT/wBXRP8AgJf+aMaV&#xA;3/KyPJP/AFdE/wCAl/5oxpXf8rI8k/8AV0T/AICX/mjGld/ysjyT/wBXRP8AgJf+aMaVE6f538qa&#xA;hcrbWupRPO5oiNyQsT0C8wtT7YKVPMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqS+df+US&#xA;1f8A5hZf+I4qj+DSaRwQVdrfio8SUoMVY3+htT/3wfvX+uFCXaj5Fi1Budzp/KX/AH6pCN9JUiv0&#xA;4qlGnfl/ot1NdLBbSzNYzG2uUdnULKEWSm/Dl8Mi7rUY2rI7by3dWsQht7MRRjoicQPwOKppoum3&#xA;sF8JJoiiBWFSR3+RxS7Wv+Us8uf9Hv8AyZGKvL/zdvrmfzY9tI5MFpFGsKdhzUOx+ZJxCGE4Vdir&#xA;sVaxVvFXYq4Eggg0I6HFX0d5Ovbi+8r6ZdXLc55IF9Rz1Yr8NT7mm+RSnGKuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KpL51/5RLV/+YWX/iOKplDKsWnJK1SscIYgdaBa4qgf8TWH++5fuX/mrDSu&#xA;/wATWH++5fuX/mrGlS/S9dWK61SS5gKLcXYktvTYOWiFvDGGevDi3KNvhFfniqYf4msP99y/cv8A&#xA;zVjSq9nrVrdziGNHDEE1YADb5E4FS7Wv+Us8uf8AR7/yZGFVLQ/+U28z/wCpp/8AyakxVkuBXYq7&#xA;FUg8oHS+Os/o/hxGq3f1rhX/AHo5D1a178uuKp/irsVUrz/eSf8A4xt/xE4qkvkD/lDdK/4wD/iR&#xA;xKp/irsVdiqje31lYWkt5fXEdraQKXnuJ3WONFHVndiFUfPFWJ3mgaf50079I2usSXGi6n6c9qi8&#xA;zDwERSqDkmztxbp2P8xxdro+0/AoxgOIdevO+73j+wIh/KmuLZFRrM1xeRiQ25aSeCPlKy15+nI5&#xA;ZVRSFBrStRQ74EjX4uL+7AiavaJO18rA68+/qut/KOqK8EsmsS+pGtoJSnq85PqqcWV5DLVw5Zju&#xA;OpqQcUT7QxkEDGKPF3bcXcOHatvkm+g+YtC8wWC6hot9DqFmxK+tA4cBh1VgN1Yd1bcYXVJjirsV&#xA;dirsVdirsVdiqS+df+US1f8A5hZf+I4qjZP+OK3/ADDH/k3irEMKETPFGkETIOQfdpa96fZp2pir&#xA;p4o0giKDlz3aWvem607UxV08UaQRFBy57tLXvT7FO1MVRXl7/jpL/qt+rEpROtf8pZ5c/wCj3/ky&#xA;MVUtD/5TbzP/AKmn/wDJqTFVXzR/eW/yb9YxCpHihfJFJHxDjiWHIA9ae+KuMLpGrleKuTx7V7k/&#xA;jirhFJ6Rlp8ANOR7k+GKrMVZvef7yT/8Y2/4icCUl8gf8obpX/GAf8SOJVP8VdirsVYf+Z/5XeX/&#xA;AMxNCXStYluIPQZpbSe2lZPTlIoGaP8Au5B7MvyIrirDtD/5xb/LG00i0tdTtpb+/hjVLi9WeeES&#xA;uu3P01kIWvgMVR3/AELL+UH/AFapv+ku4/5rxW3f9Cy/lB/1apv+ku4/5rxW0R+U35FeXvy7ludQ&#xA;gvLm/wBavQRdXTu0UPEsW4Jbo3Cm43csa9CMVel4q7FXYq7FXYq7FXYqkvnX/lEtX/5hZf8AiOKo&#xA;Y+bvKr6EsiazZMksKxRMLiIhnkAjRV+Lcs7BRTqcVYfrHm3y9pDtHf3iRzKOTQqGkkAPQlUDFa17&#xA;4UJFdfnR5W4rGkd1JGmwEUSAVpu3xupxVTk/O3y1IiR/VbxY06KI4qV7k/veuKpha/mv5WvgsQea&#xA;BI6bNC5Wv8zGP1OvicVZXoHmHQkkgv31C3SymJiiuHlRY2kbYIGJA5bdMUo291rR77zpoFvZX1vd&#xA;TxLdySxQypIyo8VFYhSaAlTiqvof/KbeZ/8AU0//AJNSYqq+aP7y3+TfrGIVJYywkUru1RxHvXbF&#xA;CtfBfWqPtkVlAPIBu4BxVdebpEz7TkUZQa/CAOJPgfbFXSb2UZkorLtDQ7lSTWq/PviqFxVm95/v&#xA;JP8A8Y2/4icCUl8gf8obpX/GAf8AEjiVT/FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUl86/8&#xA;olq//MLL/wARxVFyRx/oNl4jiLeoWgpUJUH798VeI61NceX/ADdd6lBBFK+oQem/1hPUR4mCh0IP&#xA;ulPlkkIObX9DuJY5LnyxphaMEKIYzEtD24gsPl4dsVU01LylEqiHyrZjg3qJ6jyS/FWvxc6ll/yS&#xA;aYqjx5/vIIJ7fTdNsNOhuDWZLaHhzNKVahHL/ZVxVmX5SaWlnYRKYwq3DSXCx02FacTT/Y8hgKsr&#xA;1lV/xf5dag5EXgLdyBCKD8cUpZZ6hqFt+YOvRW+lzX0EsVmZ7iGSBREUibgpWaSNm58j9npTftir&#xA;XmTWrtfrE99pk9la2URkilkeCQzrx5OESKSQqykU+KlaineiFedjzn541TSm1Xy/oKy2SzNASxea&#xA;UMgBLGNPT+H4tyK074oY7e+dfzRiuJIJLN7eaNfUeNbQkhCKhviDfD74qhYfP/5kTJFNErzRSvwi&#xA;dbUMrv8AyKQu59hillei6n+b9zK6zaREsUIq8t3G8CnelEYN8RB68Qad8UJ5oPmq4v8AU73SL2xa&#xA;11KwXlIEbnE42+yzBOvIEV+/FWeXeva8dDknPlq8F4YiXs/Xsfhrsw9T1+Jou+BK/wAgf8obpX/G&#xA;Af8AEjiVT/FXYq7FWE6n+aljpd9c2t9oWsxx27yJ9eW05Wr8JlhUpLzH94XBWoFfuqqtl/Na0WBp&#xA;U8u68/BRIyfUHDcP3RagLblVmrx6niwxVq4/NSOOVUj8ta5KjOiFxZstAW4uaE/s7H3xVMrnzyIt&#xA;KtdSi0PVZorlVdoRbUmiVmZaSRluQYcK08KYhztHohn/AI4Q/rGlSTzrCtz9Wj0u/lnUr6kawgso&#xA;ZZGUkBv2vS2r4jBbYOzDw8RnAD3+7y82R4XWuxV2KuxV2KuxV2KpL51/5RLV/wDmFl/4jiqNk/44&#xA;rf8AMMf+TeKvPte0O31ez9GQ8Jkq0E1KlW/oe+FDzfUtA1XTnIuIG9MdJkBaM/7IfxwqgY45JGCR&#xA;qXc9FUEn7hirKfL3km6nlS41NDDbLuIW2d/Yj9kePfFXqPlxQuoIqgBQjAAdAKYClFa1/wApZ5c/&#xA;6Pf+TIxVS0P/AJTbzP8A6mn/APJqTFXedLZLqBbZ/sTRSRt8mAGIV4cLzWtIuJLaK6mtZIno6RyM&#xA;g5Kag0BHzGFCMi87eaYiCt+7FSWBdY5DyPUnmrVO/fFVR/P3m114tfk7ca+lDWn+twr7fLbFUJP5&#xA;q8yTsWk1O5LGlSJGXoKD7JGKsk8gWEzfWdUnLM0v7qNmJJYA1c1PuAMVe0Xn+8k//GNv+InIpSXy&#xA;B/yhulf8YB/xI4lU/wAVdirF/wAx9NivPLvqPNqcL2UyTw/oZ3S7Z2BhCjhuV/e1Pyrirzl9SM9q&#xA;Ldk87vE13FeC5IZZUaISELQKP3bAhjGduQUUpU4VUdQmuZYkgh1PzrbNHMITfXEIAjYpFGrCvpq3&#xA;qgmh5bMxqO2KEZ5pk006sbjVbrzjavpkxihkt6pbN6LRW4kV14owndUk+Lqa7b7qXfWg+j2U8Vx5&#xA;4DXtxzlk9Phcxrpq8SZY6UC3JkUdKtTsARiqisbyT3wivvPDJbxwzAvUOHeUWZMIdCWYJMXZa9Fr&#xA;Su+KvUvJgr5fgnE2oSrdM86jVhxu0DsfgdSBxAP2R2GBU8xV2KuxV2KuxV2KpL51/wCUS1f/AJhZ&#xA;f+I4qqWuv+XzZxK2pWhBjUMpmj/l6H4sVb/S3lT/AJbLH/kZD/XFXfpbyp/y2WP/ACMh/riqT6Dq&#xA;vlH65rhS8tuJ1D/dso6i1gDcPUP2OVacfh8MVTj9LeVP+Wyx/wCRkP8AXFW01nywjckvrJW8VliB&#xA;/A4qld/qWnXnm3y8LS6huCn1zmIpFelYRSvEmmFV+h/8pt5n/wBTT/8Ak1Jiqr5o/vLf5N+sYhWC&#xA;eZvKsWrD14CIr5RQMfsuB0DU/XhQwC/0jUrByt1bvGB+3SqH5MNsVQscckjBI1LseiqCT9wxVkmh&#xA;+Sb+7kSW+U21r1KttIw8Av7P04q9BgghghSGFAkUYCog6ADArOrz/eSf/jG3/ETgSkvkD/lDdK/4&#xA;wD/iRxKp/irsVdiqRaz5UTU72K8/Sd/ZyRGqpbTlI9wFPwUI3Axc/Ta84oGPBCQPfHf5rYPKky3p&#xA;uJtXvZY1YNFD6rCgUR7MamtTGeXGleRFMFMp68GHCIQHnXv/AF7c+SSW35Vta2/oW3mzX4o1DCIf&#xA;XeXAMgTbkjdKVHgdxvhdciYPy8uYr03b+adamf0bmBI3uE9NRdV+IKIx8UWxjPagxVdo35eS6XqZ&#xA;vh5l1m7DTC4ktbm6EkLOAwIKlfssrAcRt8IpirL8VdirsVdirsVdirsVSXzr/wAolq//ADCy/wDE&#xA;cVfG/lNhYeY7C9vYK2kEnOZZYPWRlAPwlGR68ulaVHUUIrhVKfqd5/viT/gG/pirJLuy0yPyLaCO&#xA;KGbW5rotJ6aTi4hhUOKSFl4NzPH7P2aDqWNFUp0K14axZSXkfp2qTI8rTQvLHRTWjoFcsppQ/Cfk&#xA;emKq/mpLe58wXs2lWrJp7OBbhIiilVULy4hI6ciK/YX/AFV6BVHeX18v2/l3Xl1C2nfXbiFYtK5W&#xA;vqwqPUQuVYuCkpFfiK/CoNDU0xVmX/OOcM0fnsepGyVienIEV/dv44q9+0P/AJTbzP8A6mn/APJq&#xA;TFU01XSmvmjIkEfpgjcVrWnvgVAf4Xk/5aB/wJ/rhtXf4Xk/5aB/wJ/rjaoDR9Iu70XnrKLQ213N&#xA;boKh/USMjjL8J25g/ZO4xVH/AOF5P+Wgf8Cf642rv8Lyf8tA/wCBP9cbVO7z/eSf/jG3/ETgVJfI&#xA;H/KG6V/xgH/EjiVT/FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUv8w6fLqOhX9jCQJbmCSOOv&#xA;TkykLX6cVfN13aXVncPbXUTQTxmjxOCrA/I5JClirsVdirsVdirPfyi0W/m8wrqgjZbK1SQNMwIV&#xA;ndSgVT3O9TgKvRND/wCU28z/AOpp/wDyakxSmuqat9QaMel6nqAn7XGlKexwKgf8U/8ALr/w/wDz&#xA;bhpXf4p/5df+H/5txpUv0fW720F59bjjmNxdzTw+lyjCRORwRuXPk4A+JhQHwGKph/in/l1/4f8A&#xA;5txpXf4p/wCXX/h/+bcaVObz/eSf/jG3/ETgVJfIH/KG6V/xgH/EjiVT/FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYqskhhkp6kavTpyAP68VW/U7T/AHxH/wACv9MVd9TtP98R/wDAr/TFXfU7&#xA;T/fEf/Ar/TFXfU7T/fEf/Ar/AExV31O0/wB8R/8AAr/TFVUAAAAUA2AGKsa0P/lNvM/+pp//ACak&#xA;wqq+aP7y3+TfrGIVJFALAE0BIBJ7YoVruNY5fTVCoUUqerf5W22Kt3MSRJGFUnkORl7NXsKeGKua&#xA;JFtFcKWaQ7v2WhPw/M4qh8VZvef7yT/8Y2/4icCWG6brx0H8r7PU1jEskUCrFGdgXd+Ir7CtThVK&#xA;vI/mzzb5ovbqB76G0ECCQFbdXryalN2GKE11TU/MunyzibWYVhg3eZ7ZEUClSSS9BirC9Q/OoWhI&#xA;i1g3hG1YLJeNf9aR0H3Yqks//OQHmAV9Aep4c440/VzxSoH/AJyC829oYvuX/mjFXD/nIPzZ3hi+&#xA;gL/zRiqNtvz+1Rj/AKS7xDxjt4pP1vHirJNF/NGTWJUgtdfiS5fZbea0Ebk+Aq3Fj7A4oZlpS+ar&#xA;6ORjrEcfAgUFohrUf64xSw6f8z/MGkeZp7C/aK8sbadoZmEfpuUVqF14k796Y0h61gS7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYqxrQ/wDlNvM/+pp//JqTCqr5o/vLf5N+sYhWO3F/YWlGvLiOBO5kdU2+&#xA;bEYoS+889+UuYrqlqqJ8KKkgcAdeq8sVWSfmD5OkVIo9TgRF6VY7saAkkjFUZb+avLtzEsFpqNrI&#xA;7GrhZkLsQTT4a1p9GKo0EEVG4OKs3vP95J/+Mbf8ROBLzXWP/JMWn+pB/wAnsKEB+SX/AB1tS/4w&#xA;J/xPEqmP5pWZu9M1OHcpVGkUd1UqT93XEKwPyxrOhaX5em0DUdKGoWNxMZ5Wkep5bAUUcaEBdmVl&#xA;PvTbFUXexflHqkEccmlXWmPG4IktCinhQVDE+py38Vr/AJWKqE3lr8nriWGWOa+tEjY+rbjkRIoN&#xA;RUsJivzB+gdcVVotI/Ju31BLsQXkyIpH1VyxgL/ssUJ5n5erT27YqmOmeafIuivJdaTofoajKnFp&#xA;YwV4n/IkMrMAe4VV964qkfmLU183eZdNvDa+hdQenBEwkaRmCvVS5PEfCSTsB13wq9w8sf3E/wDr&#xA;D9WApeGedP8AlLdX/wCYuX/iZwofRuRS7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqwuz0Szv/zA166n&#xA;e4WW2is1jEFzPApEsTcuaxOgb7AoW6dupwqoeb9FTTrW+udPmufrd3buay3E8/FokIUxLK7hDv26&#xA;7V6DEK8f0vSfJdxphi8wG+l1RpzK2oQMvIxkAcCX9TwrupNT18VCtJ5D/LuaZ5IPMk9tCy1jt5bZ&#xA;5HRvAyARq/y4r/rYqpRfl75J9CNpvNLeqG/eqlpJTj4Dc0/1t/8AVxVNLPRPyk06SWRkvdUBUBI5&#xA;W2G+5UiODf8A1gf44qj/ACPHAPMGqLphnh0OWPlBYyPyETEqNiO5+Lp28aVwq9Uu/JmkDQ5NPE+o&#xA;CBIqKf0he86J8Q+Mzcu3XrkUsT1j/wAkxaf6kH/J7ChKPybso7jWr13eVfSgFFjleNTyYD4ghXlS&#xA;m1cSll+p2MMVzdWpLyxOzlvWdpWIlqzLycs3EcqAV2Gw2xQ8h13R59Kv3t3BMRJaCTsydvpHfCqX&#xA;Yq7FXYq7FWY+Q9DdpTqs60jQFbYHux2Zvo6Yq9R8vadDNJLctJOGUCP00mlSOleXIorBeX+V1wFL&#xA;xHzVbrbeZNSt1d3WK4kQPK7SSEK1Ks7Esx8ScKH0lkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvDv&#xA;zK/NPV/InnnUF0+0t7r9IR25l+sc/h9GMU48GXr6hwqxjUfz68532lrq0mlacLOOYWtVkYv6jqXA&#xA;MfqFwKIdyKYqwCbz5evK7raQxqzEhByotT0FT0GNqi9Q17zDp9vb3F1ZQJDdVELLIr7qiSMrBHYo&#xA;wWZCVah3xVBx+ddSkdY0tomdyFVRy3J2HfG1RWqeYte0udIL20t0eRPUjMcizIyFitVeJ3Q/EpHX&#xA;FUy8tfmtr1iwstP0y3uLm7kVVFJC7sfhRAFYdztirLNW/wCckPPFld3emXujafFdW7vb3MYaR+Lq&#xA;SjryWRlND4HFXoOsf+SYtP8AUg/5PYoQH5Jf8dbUv+MCf8TxKsv1n/jpz/Mf8RGKpNqmlWep2pt7&#xA;par1Rxsyt4qcVYDqvkrV7N2a3T63B+y0Y+OnunX7q4VSKWCaI8ZY2jbwYEH8cVVrXTdQumAtraSW&#xA;vdVJH0npirKtD8hSFln1UgINxaoak/67Dp9H34qzZESNFRFCooAVQKAAdABgVkflj+4n/wBYfqxK&#xA;XhnnT/lLdX/5i5f+JnCh9G5FLsVdirsVdirsVdirsVdirsVdirsVdir5v/PXQH1XzzMyzCL0o4xu&#xA;vKvKNPceGFDBD5WvTpa6aLqP0BObkt6bcy5QJQnlSgA227nFUJ/gWf8A5a1/4A/1xpKZax5fudSW&#xA;2SttZxWkfpQw26TBAvUmkksnxE7k9SeuKEDa+S54LmKczwzCJ1cxSRsyPxNeLgMKqeh3xpKN17Qt&#xA;U1u/+vXl2nrCOOEUEr/DEgRavLJJIxoOrMfuxQ1oWg6roepR6jY3cBuIwy0nt0nQq44upSXkPiUk&#xA;HvTGlUtU8q3up6ldajc3cYuLuV55RHCETnIxY8VU0AqcaV75rH/kmLT/AFIP+T2Ksb/LLzT5e8vX&#xA;97PrV9FYxTxKkTykgMwapAoD2xKvQ7v8xvy0i9KW71O0j+soJoZJY2HqRklQ6lk+JaqRUeGKVD/l&#xA;Z/5S/wDV40//AIH/AJtxVefzJ/KpYllOq2IiclUkKHiStKgHhTauKpbrn5lflPLYBF1W2kPr2xKW&#xA;zNFJRbiMk819M8QBVvi3WoNRtiqZL+ZP5VNG8q6rYmKMgO4QlVLV41PHatNsVWf8rP8Ayl/6vGn/&#xA;APA/824qq235i/lddTCG21OznmIZhHHGXYhFLMaKhOygk+2KtRfmx+VsQIi12yjB6harX7lwK8e8&#xA;y39nqHmDUb6zlWe0ubiSWCZfsujMSGHzySH0pkUuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvOvzI/L&#xA;y/1m9XVdJ4vclBHcWzMEL8fssrNRa02NThBVgX/KufOv/Vrk/wCDj/5qwod/yrnzr/1a5P8Ag4/+&#xA;asVd/wAq586/9WuT/g4/+asVd/yrnzr/ANWuT/g4/wDmrFXf8q586/8AVrk/4OP/AJqxV3/KufOv&#xA;/Vrk/wCDj/5qxVFad+VnnC7uVjmtRZwk/HPM6EKPZVLMT9GC1eqa55QS78mHy9ZSemYo41t3foWi&#xA;Ib46fzEb0wJeIeZvyW/MLUooorewjrE5JZ7iEAilNviJwqlN9+RX5r3kVnFLY2wWxg+rQ8bmOpT1&#xA;Hl+IljvylP0bYqhP+hePzP8A+WKD/pJi/riqaXn5Lfmvc6FYaP8Ao63SCxeWTkLtWLtKa1IZiF47&#xA;0C0G5PUmqqV/9C8fmf8A8sUH/STF/XFU0tvyX/Nm38v3eix6baiG9lSWaY3KepSOhCD4+IHJQem/&#xA;foKKpX/0Lx+Z/wDyxQf9JMX9cVTXQPyc/OPQprmXT7O0DXdvLaT+pLBJWOZSpoW3UivIUPUCtRti&#xA;qVf9C8fmf/yxQf8ASTF/XFWdeWfye83gWVnqUCWlvEqLcT+rG/wr9rgEZiT4VAxtD3rAl2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV//9k=</xmpGImg:image>
-               </rdf:li>
-            </rdf:Alt>
-         </xmp:Thumbnails>
-         <xmpMM:InstanceID>uuid:559e743a-28e7-4925-88aa-a149edfbb1ef</xmpMM:InstanceID>
-         <xmpMM:DocumentID>xmp.did:578294d2-d6b0-344f-b159-7628ac6a8f47</xmpMM:DocumentID>
-         <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID>
-         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
-         <xmpMM:DerivedFrom rdf:parseType="Resource">
-            <stRef:instanceID>uuid:fee9adc9-99ff-4f50-b2e9-7f830b63b763</stRef:instanceID>
-            <stRef:documentID>xmp.did:cc21c36f-daca-5d4d-86ed-0422dbc64d3a</stRef:documentID>
-            <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID>
-            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
-         </xmpMM:DerivedFrom>
-         <xmpMM:History>
-            <rdf:Seq>
-               <rdf:li rdf:parseType="Resource">
-                  <stEvt:action>saved</stEvt:action>
-                  <stEvt:instanceID>xmp.iid:cc21c36f-daca-5d4d-86ed-0422dbc64d3a</stEvt:instanceID>
-                  <stEvt:when>2019-08-04T17:05:28-07:00</stEvt:when>
-                  <stEvt:softwareAgent>Adobe Illustrator CC 23.0 (Windows)</stEvt:softwareAgent>
-                  <stEvt:changed>/</stEvt:changed>
-               </rdf:li>
-               <rdf:li rdf:parseType="Resource">
-                  <stEvt:action>saved</stEvt:action>
-                  <stEvt:instanceID>xmp.iid:578294d2-d6b0-344f-b159-7628ac6a8f47</stEvt:instanceID>
-                  <stEvt:when>2019-09-09T01:25:58-07:00</stEvt:when>
-                  <stEvt:softwareAgent>Adobe Illustrator CC 23.0 (Windows)</stEvt:softwareAgent>
-                  <stEvt:changed>/</stEvt:changed>
-               </rdf:li>
-            </rdf:Seq>
-         </xmpMM:History>
-         <illustrator:StartupProfile>Print</illustrator:StartupProfile>
-         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
-         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
-         <xmpTPg:NPages>1</xmpTPg:NPages>
-         <xmpTPg:MaxPageSize rdf:parseType="Resource">
-            <stDim:w>8.500000</stDim:w>
-            <stDim:h>8.017512</stDim:h>
-            <stDim:unit>Inches</stDim:unit>
-         </xmpTPg:MaxPageSize>
-         <xmpTPg:Fonts>
-            <rdf:Bag>
-               <rdf:li rdf:parseType="Resource">
-                  <stFnt:fontName>AcuminVariableConcept</stFnt:fontName>
-                  <stFnt:fontFamily>Acumin Variable Concept</stFnt:fontFamily>
-                  <stFnt:fontFace>Default</stFnt:fontFace>
-                  <stFnt:fontType>Open Type</stFnt:fontType>
-                  <stFnt:versionString>Version 1.020;hotconv 1.0.108;makeotfexe 2.5.65593</stFnt:versionString>
-                  <stFnt:composite>False</stFnt:composite>
-                  <stFnt:fontFileName>AcuminVariableConcept.otf</stFnt:fontFileName>
-               </rdf:li>
-               <rdf:li rdf:parseType="Resource">
-                  <stFnt:fontName>AktivGrotesk-Medium</stFnt:fontName>
-                  <stFnt:fontFamily>Aktiv Grotesk</stFnt:fontFamily>
-                  <stFnt:fontFace>Medium</stFnt:fontFace>
-                  <stFnt:fontType>Open Type</stFnt:fontType>
-                  <stFnt:versionString>Version 3.002</stFnt:versionString>
-                  <stFnt:composite>False</stFnt:composite>
-                  <stFnt:fontFileName>14038</stFnt:fontFileName>
-               </rdf:li>
-               <rdf:li rdf:parseType="Resource">
-                  <stFnt:fontName>RobotoMono-BoldItalic</stFnt:fontName>
-                  <stFnt:fontFamily>Roboto Mono</stFnt:fontFamily>
-                  <stFnt:fontFace>Bold Italic</stFnt:fontFace>
-                  <stFnt:fontType>TrueType</stFnt:fontType>
-                  <stFnt:versionString>Version 2.000985; 2015; ttfautohint (v1.3)</stFnt:versionString>
-                  <stFnt:composite>False</stFnt:composite>
-                  <stFnt:fontFileName>RobotoMono-BoldItalic.ttf</stFnt:fontFileName>
-               </rdf:li>
-               <rdf:li rdf:parseType="Resource">
-                  <stFnt:fontName>RobotoMono-Italic</stFnt:fontName>
-                  <stFnt:fontFamily>Roboto Mono</stFnt:fontFamily>
-                  <stFnt:fontFace>Italic</stFnt:fontFace>
-                  <stFnt:fontType>TrueType</stFnt:fontType>
-                  <stFnt:versionString>Version 2.000985; 2015; ttfautohint (v1.3)</stFnt:versionString>
-                  <stFnt:composite>False</stFnt:composite>
-                  <stFnt:fontFileName>RobotoMono-Italic.ttf</stFnt:fontFileName>
-               </rdf:li>
-            </rdf:Bag>
-         </xmpTPg:Fonts>
-         <xmpTPg:PlateNames>
-            <rdf:Seq>
-               <rdf:li>Cyan</rdf:li>
-               <rdf:li>Magenta</rdf:li>
-               <rdf:li>Yellow</rdf:li>
-               <rdf:li>Black</rdf:li>
-            </rdf:Seq>
-         </xmpTPg:PlateNames>
-         <xmpTPg:SwatchGroups>
-            <rdf:Seq>
-               <rdf:li rdf:parseType="Resource">
-                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
-                  <xmpG:groupType>0</xmpG:groupType>
-                  <xmpG:Colorants>
-                     <rdf:Seq>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>White</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>Black</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>100.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>CMYK Red</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>CMYK Yellow</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>CMYK Green</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>100.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>CMYK Cyan</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>100.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>CMYK Blue</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>100.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>CMYK Magenta</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>15.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>90.000000</xmpG:yellow>
-                           <xmpG:black>10.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>90.000000</xmpG:magenta>
-                           <xmpG:yellow>85.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>80.000000</xmpG:magenta>
-                           <xmpG:yellow>95.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>50.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>35.000000</xmpG:magenta>
-                           <xmpG:yellow>85.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>5.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>90.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>20.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>50.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>75.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>85.000000</xmpG:cyan>
-                           <xmpG:magenta>10.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>10.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>90.000000</xmpG:cyan>
-                           <xmpG:magenta>30.000000</xmpG:magenta>
-                           <xmpG:yellow>95.000000</xmpG:yellow>
-                           <xmpG:black>30.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>75.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>75.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>80.000000</xmpG:cyan>
-                           <xmpG:magenta>10.000000</xmpG:magenta>
-                           <xmpG:yellow>45.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>70.000000</xmpG:cyan>
-                           <xmpG:magenta>15.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>85.000000</xmpG:cyan>
-                           <xmpG:magenta>50.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>100.000000</xmpG:cyan>
-                           <xmpG:magenta>95.000000</xmpG:magenta>
-                           <xmpG:yellow>5.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>100.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>25.000000</xmpG:yellow>
-                           <xmpG:black>25.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>75.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>50.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>35.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>35.000000</xmpG:yellow>
-                           <xmpG:black>10.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>10.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>50.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>95.000000</xmpG:magenta>
-                           <xmpG:yellow>20.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>25.000000</xmpG:cyan>
-                           <xmpG:magenta>25.000000</xmpG:magenta>
-                           <xmpG:yellow>40.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>40.000000</xmpG:cyan>
-                           <xmpG:magenta>45.000000</xmpG:magenta>
-                           <xmpG:yellow>50.000000</xmpG:yellow>
-                           <xmpG:black>5.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>50.000000</xmpG:cyan>
-                           <xmpG:magenta>50.000000</xmpG:magenta>
-                           <xmpG:yellow>60.000000</xmpG:yellow>
-                           <xmpG:black>25.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>55.000000</xmpG:cyan>
-                           <xmpG:magenta>60.000000</xmpG:magenta>
-                           <xmpG:yellow>65.000000</xmpG:yellow>
-                           <xmpG:black>40.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>25.000000</xmpG:cyan>
-                           <xmpG:magenta>40.000000</xmpG:magenta>
-                           <xmpG:yellow>65.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>30.000000</xmpG:cyan>
-                           <xmpG:magenta>50.000000</xmpG:magenta>
-                           <xmpG:yellow>75.000000</xmpG:yellow>
-                           <xmpG:black>10.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>35.000000</xmpG:cyan>
-                           <xmpG:magenta>60.000000</xmpG:magenta>
-                           <xmpG:yellow>80.000000</xmpG:yellow>
-                           <xmpG:black>25.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>40.000000</xmpG:cyan>
-                           <xmpG:magenta>65.000000</xmpG:magenta>
-                           <xmpG:yellow>90.000000</xmpG:yellow>
-                           <xmpG:black>35.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>40.000000</xmpG:cyan>
-                           <xmpG:magenta>70.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>50.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>50.000000</xmpG:cyan>
-                           <xmpG:magenta>70.000000</xmpG:magenta>
-                           <xmpG:yellow>80.000000</xmpG:yellow>
-                           <xmpG:black>70.000000</xmpG:black>
-                        </rdf:li>
-                     </rdf:Seq>
-                  </xmpG:Colorants>
-               </rdf:li>
-               <rdf:li rdf:parseType="Resource">
-                  <xmpG:groupName>Grays</xmpG:groupName>
-                  <xmpG:groupType>1</xmpG:groupType>
-                  <xmpG:Colorants>
-                     <rdf:Seq>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>100.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>89.999400</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>79.998800</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>69.999700</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>59.999100</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>50.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>39.999400</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>29.998800</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>19.999700</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>9.999100</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>0.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>4.998800</xmpG:black>
-                        </rdf:li>
-                     </rdf:Seq>
-                  </xmpG:Colorants>
-               </rdf:li>
-               <rdf:li rdf:parseType="Resource">
-                  <xmpG:groupName>Brights</xmpG:groupName>
-                  <xmpG:groupType>1</xmpG:groupType>
-                  <xmpG:Colorants>
-                     <rdf:Seq>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>100.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>75.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>0.000000</xmpG:cyan>
-                           <xmpG:magenta>10.000000</xmpG:magenta>
-                           <xmpG:yellow>95.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>85.000000</xmpG:cyan>
-                           <xmpG:magenta>10.000000</xmpG:magenta>
-                           <xmpG:yellow>100.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>100.000000</xmpG:cyan>
-                           <xmpG:magenta>90.000000</xmpG:magenta>
-                           <xmpG:yellow>0.000000</xmpG:yellow>
-                           <xmpG:black>0.000000</xmpG:black>
-                        </rdf:li>
-                        <rdf:li rdf:parseType="Resource">
-                           <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName>
-                           <xmpG:mode>CMYK</xmpG:mode>
-                           <xmpG:type>PROCESS</xmpG:type>
-                           <xmpG:cyan>60.000000</xmpG:cyan>
-                           <xmpG:magenta>90.000000</xmpG:magenta>
-                           <xmpG:yellow>0.003100</xmpG:yellow>
-                           <xmpG:black>0.003100</xmpG:black>
-                        </rdf:li>
-                     </rdf:Seq>
-                  </xmpG:Colorants>
-               </rdf:li>
-            </rdf:Seq>
-         </xmpTPg:SwatchGroups>
-         <pdf:Producer>Adobe PDF library 15.00</pdf:Producer>
-      </rdf:Description>
-   </rdf:RDF>
-</x:xmpmeta>
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                                                                                                    
-                           
-<?xpacket end="w"?>
-endstream
endobj
3 0 obj
<</Count 1/Kids[14 0 R]/Type/Pages>>
endobj
14 0 obj
<</ArtBox[23.5835 0.0 592.654 555.137]/BleedBox[0.0 0.0 612.0 577.261]/Contents 15 0 R/CropBox[0.0 0.0 612.0 577.261]/MediaBox[0.0 0.0 612.0 577.261]/Parent 3 0 R/Resources<</ExtGState<</GS0 16 0 R>>/Font<</T1_0 6 0 R/TT0 5 0 R/TT1 7 0 R/TT2 8 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 9 0 R/MC1 10 0 R/MC2 11 0 R/MC3 12 0 R>>>>/Thumb 17 0 R/TrimBox[0.0 0.0 612.0 577.261]/Type/Page>>
endobj
15 0 obj
<</Filter/FlateDecode/Length 20803>>stream
-H‰\WInl¹Üëu½ÏäÌ­Û†W
£á… x�\ß@Û÷%Õ#zñ›¡zIæùã/¿<~üúKzü᏿<ÞÒCÿ]©=þýöãÏMþï­Î«Æ�^¢^+꣖¸FôÇÿþö·?ýŠï~ØJÜ­dÉ¥ÀZ~ä:®Õûã=z½æ¨Ïeäw|ÓƸrGüxÿ<à¯{üçËb‡Åß¡S<æºJžñ(¥_)Çãã§~øóí½_-Uüï{ÄU*níWøg]kÁz”k´õøx{/W�ð¸RÆ#·k®õxþá!Wžãóôñ¶h¤|ž#÷+hz%_­×ã×WÌÏË#¯+
Æ12~
-K	?ú¼ÿíË¿yó/çÓ­ÂÁtÕTÊ·‡pm\£à­ÈEŽ†k땯ëëˆÅç>FšWÎãû'QÖUkþ2ñyNúõ>àotf«Oë—õ}d�}ý’?K2EÇ~Cjcµ«-¦)_áÿ	$óg÷ã+y	±~>HíµÒ` äùHýˆ÷-XÀ9!ãIY¨Ì˜ásEõÁƁÐF»-ÈúZ¸w"]Ÿ?(8:I¼"UY¸4(í. ÓÀXˆÅÐ3â£_™~ãœ+èD`c”«ô*
HŒÀcš^‚ÁEÑCL¨%Ú¸#°¤ÌÂ{™|Óžr‡`teòŽ¬ò‡¡
´¶¬"3Ý‰`Û(îùê}ß1Ž¡
ÔB›B$Úº«—Îg´åÔq l0q`¡•«§.¤1¢-“Šh°L8Ö×ô(2-ܘ¨k›@¶*’�öÒ+ãšH;:öê¹í³rr 4Qý,,}<ʱj¥*ž¾1+!w€ßÇ…
-׳+『êÅ~vö
-èª×f¿ËyŠ;z+Žh3Ð*+;Ú‹&Ðò²^A^x;˜�ßdU<Ι—&_3çÍ^YLMn
 ³«»ðªI/2JËáìFRU- CºŠ™wâ0²û…µðzwC¸¶Ȧa¤³A賸	g¥MŒ™i"ˆew6Àas÷T'y%Æp§£WpFÔëþ{U>„6Êáªþ]k,w2
-ç$߯Ò<Ú`4šx® Ëm‹AA$g­®iA–szÞ¼OI<Š•ö�­†X4+œ‹ó4dnj\ÝÎOž[Ÿ:sXâëÄܐtã8ÅeK#Ÿß|ˆ·&�UôX ¹f²« 8S79æÙøý ûHLrPË`Èðé/É!íËÝ^×g_§¡„[ŒŽoPŒÅ%ºÂç¹ÜŒ#œÊ;âràùMÞ§e…µls1ÜÖ$>,ÊÁáç#;EœêrÔ±Ëú¡	¼aØæX4æ±E¿Ð*«l‚îêïÙ͵LS˜â´'6¹„å“)çäȁЮíx:;“Ï@1ôá_°Ú©i&ÝѪzü@ÌTEl‡îÇ¿Qê×yÎ.¶«
-'KÙl÷ŠÐŠH,ÅƒdÌÒíÛªä\[õ­©6‘î1ëNeÞõ,Ú®eahË'óOŸsùbþoÄÃcð^!œ?±RvÄ4Žúò³’¹ÿ@<Âf÷8a4Ü=Žº,v$ÜÑ¥í!øŠÐnLJ‰st&G‡Ì9›¦/•…Ûù©ÉÜ”£$¾ål/i:ËíN5—têxJb´ìP–º,J†/¢-±;hªÀï�- ?kQ=OÖ3Ϋx:up…ÐÊזF¯m@íe÷UMòji8°£©ñ í‡¹ /â@žÒlsù"}âÛÝE“£�ªpÊ3,.ŠyJ}îižiÚ5†ikð«h,tF„&ªœÒ\CÅó<’É•Ä\-¤!!›¡
.³LÂfe-Jqó1†INáùÚ•\=€'�ø,þ’™ÌÈæǹ •3Æ"—)ò»Ây�´€!\l“t‘Áœ~|RCÍëïœ1ECðDl#/O-0±ney9ÀΓ 	ýç,Í|�´€
-ÏͼµHÑkÐU¾
-ƒ7Ñ»LÜÚ@N§W’FyÅYœuÔú€X—ùuüx;�fcH
~|ùT÷±ð|èçEšÒ‘ú©’¨|¦átY!æ>]cÒœUKËÇÛ‰ðPÛÕ̲8v¸$%+ø¤œÚ6S».„íQüI_íÀû³1Ë•ˆªY6Õ¥wÀ
–gßìÅ%ŠÚÆ{CãTt܃-…w ;b²À²ÁpÅ`ÓZ³BЏ´—øIé8S–
-
ÌM’àÄîä9–Io0:1 Ÿóf½W„¼	}.žÄ_(&À›­Úé„;Q¦öÄ­›þÄ;ÐæÒY¹{ar˜Š'¿u­B¢fKÿÙDâ	å30c2¹&K„¶ •<ØÜe'²Å\©†ó¢T„¡òÒà+>öõ5
-¿‘½‘¢ô‰· ÆñJ‹C[PÉûʺöôŠ<5£—“T¸†r¨í‰2 ïóÖjbq!›éah
")¼L3Õiöièb‘ÓÓ÷Ã=Hé¢4*¡Tå;uáÜB額"ªRÒZU¾ò>Ϫ['H|ŸM¤½_¡o%ñ¬=÷«+Ú^\árQ…ˆ•g'ÒV6Ç·ÔJ,þµ…‚Äï
 öâ;>¢ƒðäZµ²…jŒj¹„ÕËp‰ÈSª<Ç–#Z… ’ª÷L¯F Ë‹bnÖñwä©å xØ7®>hÒáy	Žã^“½j­>¼Š¼ZeòðR˜‘'gÙ;á@$×#¯™I£ð�ð=ÉJÔË}•Ü«5:“†³zx‹å¶¥EêÐÕ\\Ñ8NÍItÔ÷¤â˜K2ßÏøšåè€6¬
EËuËvSAe5s݁xœ›æ£M“ö(ÌÃaÚÖEBè÷åžHØ(
-'iå¡Â*ÉMT‡Êà@žZ‹FÛNYÔ~y··–¢5Ì|´2qGh	^?(y^á¾ãFò¨oŠŽ½½"n+ÎÐÔäÆ"‰JÇÐÂjí”|âÊçÖ~EL™£Ï£¸á¤jc÷uSNå UäÇxj'ZُÊLHk5ÏzVKݦj2Ͻ"^€Bcý9Š¸’£On1¸ Rè=Ê=q"^€:ãË8Ï*ÆÖ(ìµ\#Èñ¥ùìeî@<7æ¬ñÔf±M¢Ù—:!ÂñéO-çËD»ÒöŒìÛšÇÁéÝðŽÐ
-›
F†¦'¢¹{š1ǝ	N@Y{zEžšÌI9@©†0ËÕ2¡ŠŽŽ€×,{r O©m {­Kº/­Ý’Èñ̳‰î@hÜ»³X8¯Ý»”=<úÅS/*+÷•–0p8—¼Ñš‡3hrnX{”¢Ï„6‹îÛû5@ïqÿÐû&õ%…ŽÊ‡6îÈSʳnõQ½îŒ><‘³7™éÍñ’R½#´€M)Yñ¡b)•kì…*‰íšM§Ãýq Öëµì]pm;=mN®C;€P4qöòrG¼7Œa„Aàb1ç4o¯¡mfÕØ;ª·—ÿs]Yv1p¯Sø~ÃyfKÝë
-à˜Ý+‰5Ÿ` Â‰ hpéyƒJ&5[ÆøUUÊexSò¸WhÓbÔ”^@ëÚÉ*1
‹Y[ûÍPäQ$R$z³w@vÓ5Òv"Rº¡ÓIïi|§ÁݽŽ¹–Nt.§C°ì?<ñÚ~þ\�¯u«1Ð¥M§^zò;òüè…:íx&óW)—––Z¨~D§¤jÈf³íùú,õç…<BR	OgŠ~-Í„“ÚR.Êam»ê…pN¦}Ô‡æd•àÍÚnúÉ{¹GÑhö—Ô‡æu2èb’šÍ„bÛ¹mÛ/ÄlÑöÓæŠOªWJÕesԲϼ³–­?b_Af«@¢gü(ù^Þû�¤NêZÒõgn¨	’TšÊx?À
-À
-´©!©¼ÖÁldl	hP|«HM5¸·KyH†™â2¥KEdÈ5©Â<ÊDI2^i©lª—½)HŸ\™žGˆáq-' QWT¬Ž@Ÿs‰ôAÞ´cÝÛ(¯ØÖ–7ÈiÅÆwxƒ/b{±ö{z[†$
k2OïÖlJŒ3бÉÉ\YoÊ@I¦’Þ‘Œ–¢ª̉°ÆVÒ€NbgÑjmùKÓ‰á[ßÞË…<òo-;U¦f׬GóŽÎ×Þ¹·.ľÓ3²°I8×ðÏô
-ƒ	fj5ò
-Õ	æDì~[˜Æ>ùNGú±eÉJA5üY»„ƒþ"2ÍÚ^šS©'­pÔC¶>ìrq9ž¦‚½Ìt
ÆD8xc8ã„•€Óº$=–#ÌP„¡¯¡x1A{ÁÌ'3/Še¨x$§À‚ÁÅS'ÏŸIðKDW}ü”¿¤¾¼MÜÁ&:^tIÝv®N¶Áù¬­çeRk89†¿.~µ¦{†÷ª“û>úÞ<�<Læ!,E¸q
-¨ÕÏ39€žk`¼†éa×¢¶Í£;óR[•éÁ­]u!2Ñ”»j®ÎÜÙ–¼nwsZÞYÊ9ºù‹°2¨ò
-ÓÇÐDä°ä-
-'¯6­“V˜5NÄCÕMm£y.ÁDxf2Úšíž°,l`éDo„³áV€´VÅ)SÝœtõäœ"ƒuNA_Ä<åiG—‘²ƒh·²;»Š¤€nZbÜqJÛ¤SG]&©,û{DªZÖ¿)èpšôùØÈÄ\‘´58‰½ÙÌû#žMbé(ôz§Jlä9Þš>Vº€:Ú^ˆõË!‘+ïJA½¯ØY–ΐ§fÒ¾Ç ?OP*”Ø¡Yz$_€:ôBœ‚–º×Èóƒ”ON*¯™Ý63“¯}YG/ä‘ÃhÅ5d×'­¤Uq”¦DSÔõEþççύ°ÆøPšÍ<ÑåÓÜ)isÛr’o/„þ*£5í*o…igyrÈÌ:)&©l{´yäÚÆ´ïàÌ=J‹Æd¿j]#EÜÈ£xSº—^€0mTöªJ7#ŒaQ¸Ö�Ù8cÕ=åœë°§­2ÞÚæÖpØx�[÷^³ø¸W¹ý©Œáb(–š¹BN€ þœ~°e<­]ôXؤÕArW™ÿaŽð/¢täžP³•‡×Òs™]Ï;/Õ8‘GUw².1_•—@!j©g=§fUœÕ5NäQ:ÚKÈ?Ü×äâ¯59á•ìÀ1â(NäÑáä¹CYY£‰š%¬¸56…"žþÜk`”Nßwp1ÓÉ23Åœ¹çG/dZª“Tp9L¥'°Rßj«¢$Ô#]`ú"Mˆ[sš eQ)ta“€!ó³›±Ùv,q":GÙ‚=É­i£À1‰NצGìD<bÙœEGÏT”»McÁp®ÍqOf	kpN1KÎAîu‹yô1´ëHfš1[ÍÜ-¦Áy½l
EjåÔsW[ÞYsŠ/ˆ/láÐ#igöø‚Á…˜we·±.Ñ,µÒ§ú’ÿÞVèì˼g‚%öÜ
-@$B~d2À@”:â­7¶#}‘2v*ºžsÅT´UNÅp“™ôœC¿ˆCД€©NAl;ÖLÃ)¨ÏøjSЉ”ßµWÉzž%öVe
WÎÝ[P/ÄîÂ>?É~åŠlAFâw–Ä‘Kö A_Ä&gLßëbˆ,°ÿÍKb¦-*Ñ+=½Fé‹8%77l¶è¤ù0(­Ø"1•lÝÊ…<2p}†Y`›g²q‰¶ÇÍ’I·Ÿ§]ãØxÖå4WpÓÈ‹ÿVËXç ãjÆ°Xô±ÿelÑdƒ¶pvµá#%ÓSmçÕ/ä¡1o1ûò¤BázHo*Š 'ð0´f93B¤dú[[Ss¸Zm;Á|¼‚*K’…ë�m­!×Ak®¶3GôVñ¯Ó؉lQµgîá=ØÒ ôµÃ Ü®#^GÅ	‘†—)°d½~xžA‹/0¯ávª[;£cq-ÛGw<ëÜ3Í�ª8w¸ÕÉ¡f0¥©ÁsÛ¯'ÂÛçÂÝùƒIýÑx>üÅT?e®_ˆ:‘GqhtgˆAïDŨÁ`e¨‹ÓòßíNO€]Œ›/Þ‡£Pó2;ó.SûÆ?Ësp�ž$<–_9Ið"‚ímœL†þ.qhÃÆ%bR¨J>
Æ·‰Hª¾ÒÙ¤™EêÆã®â„15É«rÊèD|ZzõÃÉg/<Ga
�í­©IˆÕµ5nêÃé¨]#ú|gŸÁ>ã昘}Tj„MçF¢ñ¬Î¸KFãQÁ¤:d•,Ž>3MÔŠq!V®½ß¥oEŸ½cg.ä×êÞËÍâw"ÔϤ¤ä‰B@ûŠÞTäjË;èZÆ…<Rå>†/’´
-—n5÷'d_ÎÏÿ/òÈ^4ÚöIêÖÂÚ}ðo‰ŽÜºØa
üOŠÊxÉ+Ôq+2æE¯S¡œ�•m£'+ËRíøIŽ«Í³é'Â>Z
8[’ü'J˜>PÚh%À©åD嘔ü]º\¦˜V<ñ
-`Ûs+ë:a¨L§\‚I¸€Þº™h—˜÷èµá‹RWwf•ÔƒúqÍ;+´æŠs+3\kl%%ñ7|S…Q¥.…¿äNQ3e°av!‡ëöVÀ^i,)
-•E—çCۻĸ‚ø/Û¯ñ•´AIkU	ªé›¶+NP_äQR¦bQ}5áŽ,„d1¦#ß¾‘•ä.Äi°.këÆœ‘†ÖQ01<qYèxþùs#¬Xõ󺧇<ëžÏÀó£7F¶a˜è³¿Ê¹5†.ºg÷PºôÛJv‘;9ˆ{tΰg]©iW쪎Dc„™µ6^È£PT·y•á(CüÁ“úE¦ÿG$êÛϳ8ÈãX4mÅ+¿»è�l9y¡á‚íC£/„ı~Éf'“MA´LVLGÝRV=nbÛ"‚*ïÀç$ë@§È4c#Ö,
-¬q"äQ–l–ùQ:’È¢㐏‰Ÿ ‰&žˆ©87ër¬æQ$7ÜJb¸íÎüû*#$á‹PU0-’»&ïDÝéœ7|…šO¥Ê’2Fq:‹Û”ú3)Må¡)¶NJ”Ã*™¡—Ù!_„"Ë5ï@¦DV]Êš\ҏø‰_Moú"jù…*Ï8T¶u»³;~¬Tt¥‘†þì8Ü-4¤[.…$ÍŠaX5ôŸ¯�Ú)ãs"6>­Æ²¨HCeVmd)Ù0¸hýlž¾kP——Êž„ó$àê™"~ê´¹*v>b—²
WC6°›:RJAìf7U‡zôBlF{Èîf�úù*É‘#9‚÷~E} ˆØ—/H'A= ¡Á�S`tÑ÷e‹Wwf@:k@€dXezFx¸››q2فfn‹­œÜ ÝRò@,‰s´[‚ŽÍ8·5R‘¬î+hÀ­r /
-õ2fèÀAT—7ÅÛ#>˜‹-HË„—@ž¤&;´¡´)÷¶ørÔ0%WÀžfØ0`¥²Ã¢ì°LšyÙ®ò¾ÆÛœþøcóm6 ÷clª{ª’6í¨®À‹­‰&1ì(rÓYZ¤fÊ×xÑ$ÕùE!u»æ7.
-¹,}ƒtûÉ+ð"•G«†«X©˜°+ÈŽ¹z¨ZÌðþÑŒî†J1ƒkïÅô’»*ªøñ黿®_òG+œGe31mÅTÌÙÎ’
!ÉQë¾�lðÚôŽ7ª"¿õ…v«-–|J‘
-dˆ;âV*Ág{µß†Ú+T]UÝ)Â@º£¯ˆYôEI±	;”1êùÄ$݁i¦&ŠßÊû@ÌNE<‘UôC–¼`v4ÝÏÖò‹Þ¾×|¥©ìfS}eI
K¾&…,g’sx¡+bŠÝÕ'KÕ^ˆ2±H2˜êêWëL8,²üŠ�Œî^ɏë]¥®¢8­1ãB”æcñvú––TZ’ÜNÎnÇéœmiÅæ¢éÙͳh˜^ä¥iܱ]n{•­ñ=¨´Ù!’˜EK?¼;@..ù
-‘dA€>xÐáÌÖ‡'b1³£«Äv“íµ2w±8«Ý½(BQ…ôúj:šœ4º[ZÀŽ7à%¶¤ìh>°	PVZÛÌûíñû´¹#/YšÔb~ñ l­´5&–ßm¬²dÿ TÆõíÜ©ÎÎ"ÎÂÄ“2”¤hå·Ü¾ ŒÖd¥fz[’ùjüœ$¹hpÖˆ7fUŒ;bë 1»åé-öò¶äè ¸o©o»;†ÉŸíhx®'Ó%?¥e•¹C$‡qÖg–œØ ±?¬vU-~ö&nÀKžh€†ÆE[ạiˆv|`e9ÊyEn¦>ÊYÂlÎTcr”…ÐKÊà됥Šç1ÆålÈÜô`w§óùñÇïéá?¿}üñÈúÞ,r@8
õÇîçO=È¿ŸtNûñ¬ Ulû‰yAÙô[Dý^~<³ªa~?Bmøò;Ä{ôt,ð[{|½«WÛWôXâñø|�ɯ%…úåãoøóöÚA�*s âŸïÅ¿þy=8òñ׏þø7Îý—Ç%	RwšÍ\î¾$—!Ïáºnÿçíou¬—n­ôýŸÒ$'>ƒ¹Ý+^¼/ 79ðï<Ç÷Ž0ºhàO³#’c¦Zøÿî¨`²'˜LΫ'ÞšMæl ôqå¿|]ø¸Õ:ôceqtÃtîï<ñ…Äšzæ¬y
-`‚Ÿ[Â詆ïªÅ9xâz'7;{N¶]Cí¡Iç×Rr›³ø
ÐïÀÌ}½NÕÒG»Ä§n¡ÞˆïS
-%pv_ð(B±èUٿϸþ{?çŠ9’)üîýëtígxŽ[?s}ô³¹ö3Cü¯~æñ/
S¾64—·†&â½{GÃD…3E!G~!™ÙªRPýSÓà eq,ò¾™ÀÔ<H¯kŽbnƒR2íÁeJ[K>Àѝ¤üh±b–_��ɶ!€â7¯*Oèš:¤ÓM""KŠ+ÂY>‹È¢¢˜žÀ¬t;uý—š@UÂ]Æ0¥ÓÞÞT¡>›¨ˆQ-¢{Qˆ;B}†áRÎ…F	ïb¨»9l±Â<¤¸¡,÷&„ ˆ¢ ¡¤äōw2xœ¥/`|*ƱÎ,}»ÆqÁT¢]…‹¦—VÌ;–F¼.)sÑîç\Ïj©zgø^ÈpL6Ô›6p Ôë;B Â˜ü¶ð/7Ôi됨ÖæåЄ!Ðd´nzeJòe֍Ÿ$Át^ºuêØ6d:·^m=mO¦|°šO^TÙòmŒ^\šÉÕ±‹³“–ñžª³ßwX¨+BÆRÜÞYŽêX¾cß-È«FXªc`F;DcƒÃë•ö}é$±’|‰¥(ÂìtíY†R·‚#É
B
Ú[:¾Þ”^šÒ
-5定<>X}wo–’UYÙ«Eî�€ÁT×4š<;ä×d±Ë8A ·fuëO±anb*háÆ!º÷ð6q_Z§QÄPÅŒs Œ‘eëDæH,
•®™Št=0^vörË”À‹@ZÜnrœÊø;ªNc,B¥oÅëwàE@.�Ê’/lRg0.¢Ñßr™
-‹ê�ðþ Âèâó¨pfQ¥oÚ�'}óîkž>¹3¨Ø3ÌÆpg´äŽéJí»F¯ˆo¡ðÎY‚¼âĽ¹ÛRÎZ/â(Ù•ÔÂçvÏ&F‡xß.ûÅt ºzv•Ó±žî+—_‚„yÈÐÉ\âòÅ}0jTõaŒebDÔÍ­c½¦ÆÍNqÓO=Çw$º‹LÂRô"·ÉÆíÚÊ8k™{VƒÞ�FÀW»{›¹À݈éðÀ*¾[é?¼7ºr f«ºÌ’M#*pE~“˳•ÓåÍxW„1ŠÅìDÿGÖ¬ªáÛèMæÙÝu fÞU¶ÇÎ{71^Qý›ï§×fÞñ™škDpþšk$lk._mÊǁx–­áÓ%ήæ#ñhdOL¾É:ãáû{^†À­d“ô¦âÀ0]É)®M¶iûÞGaÈK#š*˜[ŸÑ1äköE³‰H½<LñJÆxIite§ýhœ\Ô&ËEµ8z)ƒ³ïh/ÝɁ0Fsƒ¼ûkOÐ
-i×jf…Dº"Œ±|@z²ÈÚÛëTð$DXŽÙ¬Nä%éæA6I¸Õݲ÷ÉŠ6\Q±CÔy"/éO=‹˜´”¯yyŸ›²qön='9Æ@n«»J2kv#H¡è/ô®Èíz A*ìn2¶Ð¦`òAW–Dõ±µì"ñy)È}-Íwh¹ªvÕ@ü¸ŠCöäw„1V(û¶’v¨ë†áÍË"£Fzí�¡&ÎS~£j8Y••4$츮º“a|­8èÀ/Ó¡IŽS¿­Oš’ßh©+ÆaÜëòe‡q&ó:1b‹ù¶@÷úóãDx'Ô —WBWrlsyw>Ÿz¾Æ	K÷S…ѲG#'½JgYLWò;‹}ÏÙP]w„»È’_´‹‚íÙ¬’ùï"Å3„uҁ°M–œÊ¾è?ÊŒ‚Ìæˆ[¹¸î³ò¦2º€•4ýÕGT>“·ìNÄÖÕïwÄœQc:ʾ‰ÞMæÂ䀇¦ø i1Æ1w

5Î>¦G’)Âþ¸cÝL–°á/„§ÆùÊ'= q“ThUð‰¬V;›¢)"Bw²]ÌP6Éš×I@Ëí£HŒ“æ™>øÎû+RåpB;yˆµÚÃ]‘kÒåP2<¼ÑÔð„™ÔxeÉæXϯÑø„9Ò5$Ó#¡DL¦V¨ÛÖz˜£+òÒÐÞËùh$SŽùé|Œhíú„„c©pE,7²õ‡è#‡Ø@†wÐqñÅcIòÜkž¾Wä'Ì[‹îåúEJ̲éŠ0…hTC÷/-ÇÝwg¥ÖSÙ8Æ€ ®n¯ÊÒƒaÑ&Ï–ÉÖ{¥Z‰Þ+Ñž|†Éwá}ú›Ç5hvGÌÚt–± VawkðlÕG°-:G°l	Å·rHêð’N׌aÈdeßB¨©r*þ³ÓªüŽ¼äŠïM’ÍâTL/ì‰NGNÍ9mM.k9›Ò=XI ÏÊÖÀÛZK‰JÄ<�Þ/á0AW¨ñíR‘3iôI©‡"™ÃÆê
-È—ý‡ëêH’]ǁû:ÌzsžÚj4¨~WÌjQ"¤É²ÛK£°‡§J¤‡ç§½ýñÖóo�Ïã¹°ñ¼<ÖbÛȶåræé&©}?7âh¹²Ù“T<•$@¦U*£B˜Îáù٣ɇZggnòZK®[2F²ßÈ£¨4«é+Ã[°=IpZ¥Ýý{1I\÷€€iA|Ì$X{•˜0$J­äiÓî…Ä`©AAUú>|Us¤jÃ:!‰5 ‡ó˜$ŠN°¬hÌiÈ4\î­¾üã
<JJñòvk÷¬uØÉM–;7Ó€3Qž~@Z²Ìõ$_.­=hŠ‡êB‰äºx,ñ<£ZUIC–'i]~¼ ÖŽµ~HU$êËÅLÍz$Ì·Ö‘èD¨aÍÅ㧓;È;j1h8:Ä¿mÞús!ÜcûBÈÒÔThi™fmʤv¸ø¥F ú·~$ÎiT}ö`ù“ˆ9wàŠÍÓðT±Áyd3jlQÙ^0&2Îl3ÒÍl§Únîá=*‘§±Þ4JŒede„”b€ÌùB“…º†j6êØ"xȈI•ü¨²º‘á-ü#˜ÂøåiÙÚr~8b±DŽ¥¹G´éµÕl¿«ƒ&•™¼maHseè3.„{@s²©²É~} tA&µN­×þÙﱃ§½[oE Q
Ù9BAŽà6‹2ÀpŒ˜šTŒ<´œAC„Gþž[áfÔœÚá`á
-õÂUAóþ‹ÿM¿vS]×÷s#Þ¡ÑU’ErÓ;•¯¬`ŠO3~Þå¨äQ>Ú›CMJê–üŠ¢BìmM¹E%NÄÙp;™løÖr’ÓX+¦¶¿õ÷s#¼R\Cÿ÷Œ.Œ­…uæ”\éç«'ìá › ¼ÿ)÷:0È)BYp›MÖŽï–Ùr¤z#T=h‰í€n-º3éñˆ0».Æ<ŠG)›C2­ðŠL#‚_JGu™±³®õF$y*Òµu1KXc;Gx®È)Ô®ã~"¦Œž½G㍓Tš­y⼑†Š…±‹Ã߀‰KSF%åeM¶ëÐ:‹;—ÓYæô ¿!Ò¬P
-A8ªÛJR’é4Õ¯pz#܇f!)©ì~0ø RR§U ñº±îÖı’T2¥œ¡5á
-2{âTÆŠÏRs]È£x”x„Ì&ÃÚŽ5òå¸È0ZçÅq䜿g`ÄXYía(D3¾ãB"íøöÈB¹Æɦ³†Ï>Â!œˆ-ÆZaJ¦g*u«šÜ5þ±ù’¶Sî…ØçDkùÇé¦â=ó@Ì]¾öµZ8¥à¸ÝÑTÓÿŒ^a32â“öT5/„ŽGöœ%o´VK­Qëd»ß7`×Ù¶gfP=Hž)Íβs`Lù~.ÀÞ·†c”ýw–°0YüÇ&lÙþùDeš³^ØšXÛÇ’ø&]½“ãà]ÀÃ\ ñE‰8iU8 3‰h”ÔœaŽµ"L·fUôÈÎSQêæ²Æ2)Ã]ÀC ém8øê|àp‘‡ ô‘\•!ßků>}¸°umöãA.oA_r# sgwJcZ[:¯]ÖbÙ
º¥+¹\€ßM+œDC8£…Jr‹O_Ýà`Øê¦ÞÌháQå¡›.±¿?׏RÐŒ`B—ó1’M„Ù"·ð¶g´ï‰p‡á/§Ý~qÎægLžŒ'áÐÕ™çD<C]e#Åôd2ÞVº¹éóê/^Gï“å­áì¶U{ôäÌS¨oxG-3Bω˜’F7»&ù“J—%>áß
-EO&ÊnJºŸ´¼…Ì`AÉ4‹9’‰a¥ÉçâäcÉ«‘tКŠ£}eS<]?×L0žl¶wÜ¥â~ã#.ÄbÕ÷ø÷áˆ=lY¬Hð¦$ò¯âسÓQ@ˆ¦¼§ê‹#CT«z·Ë2}?7âì³z‰{¬ï¹ú¿{°Ê$u‚õÿ<2òÝì§a'E¿±GáR\®¡˜øýÜ÷Àä‡%àë'Ú|õÈ`´%Û‚ÌÁ¨ÞâÐP4zŒ=º’‡ŸZŠX“bbjwôy#\ڐî¢Ö´užrξì)‰P?Å…x”b
-«Æùo2§£öH»KFCŒd„ù~n„[`3åB•'çÙ£…f–Ïnü6¬÷já³OÄV½w³ðW¯Ö|~Ý•{­jlnñF¸ÅÒGä¬ÐQ’C
?`§ÎwîªÜòF˜[ê½Ð½p­v Žà¬\W^L¹”çFíºëÑ2>íjiÛ´NN±Ã¹~ÇØÔ2ªO@·Í¥8Wde†LÒ÷s#j“9©RS†FtM±ª°„ÂyýýÜ÷€æÆgûÈÒ²$VùŠ9_=ñËÿù?¥ÛŸïX,ë¦Íò�”åf›ËížÌ:âþôt¥1MóÁ&?íOtª¸;ü�8!4˜æ‹MEª"qtU‡IhØï,ιONL†g‘„2]æ¨Ò1c´5o™—žcØOÄ|1‚/åÂÀ(Y¹¥ÙbN+YŠnœ{¼óÖ̦þÁeRèÈbi2]oSëÞ~Üw"äÏ¡#œ²Ï’]aDQHÑ…;û€ØÕ¨tºƒDPuŽF#ÖßÛç*ù|NÄZ"]§{`ý|¶*ŽYÕùï«W)‘|N$$MY(yÀ|
-©ëBno#öLšËâ‰DòÙ;áä#÷•œ-™szÔ7ÿ%Ÿ‰ä“ãÓ³ô=KÒp´<åVµbÌÂ#œˆmFÏnÑÊBÕdËVc¢vx,Ni‰äs"v;ä2~V3]ôâK-<2‰Ô?÷òK>À
ÀSÑJ3â„"Aþiœª|K•ÿ~näùØÅúZç´ðÇÔ„{cŸCr!¶ŸµÛîJ\ÓŠ‰ó°ìiXŸ8šE
~!6Àøz8k-ÙÑ ›¾ŠÔÖýM-÷x#myótIà±.e!WAïz	’êlŠx
-t I¨*8lOgÂ]”_fr¶\;òË	ày˜ðÈZ˜HØJA¬¸[òYrVۍ¯¿€‡@a;1ïÁc9I»l.ï%‹¯ò”¾dúQ{wlûwÔ„|¬9¤êðá×ÏÂ.—²à,¨DWW!]-Å¡ºÌhòDïµê.ˆuG1-»VÑCiuÛ7iøðöiÜùcwuLÊlÄÑQiÛ.f5áx‰†®_&‡•<ѹùcSwßOÌa÷ ٝ€òdO­°ŠI߀¯lÛAêxš¦z3ÑìÉT,|°úYÖ§iݶ&òBL•‚$˧lÙhž‘[ƒh¤ÈXnä
˜šÊ6gŠ)‘€ªRˆe;îuv»îþϦ–D–E$ÚŒB<U¬û⥭D:� R=ÏU–ó&žŠq>‡®–Ëe–~#V¥=bÅ)QL%äIåá+k °fYÅðÕhV柕Hœ€·cY…pk‡@ÝÄ7,k­3•³/ï8)ƒ]ïWnyªy$Ɲ)–È*C½û4Qf„qϾðîT{!|Eë~f“àD’ Ù)Ù,‹Cöo„{Ì8š®aÒUEÃsdý¢Ig—7BW…±ÞÂL¸èí<ý]¸®¶GL¦üB¸Ç÷‚ñf-AvÕ"Æv“™ƒä_À£8c™ƒõçׁË[±`‘û{
Ó9.„{l‡ŠV/òÊêkpöÛ¢lêá·O„~N¤Z2z[J<k.“vYÊMëÂ+Úã8:”fj
-ML<åÐE¹kÃ$Ù¸�F—rŒNÆœsâ)‹;ÀWëéîû¹ïQ9ªÔ²2ôÖ*CRT-¦Fäï}E„:‘G‘¨ê½Øu32ýŸù*Éq%7¢{¢. ‡àt{exáºaÀÙÚ_ßo TJ^ |CÊH2ñ†mFi9Ñs…3ÛüÄèCµ¸Gì#û½ò“Ý¢K9;”[Ây¯¿g„)Ш”/ïgØ;ΑÑê§áùÖ}kþN¤NFEV¨›–î„Ò¯«Û¦Ùk[{Àý)ògGS_WߤDÙ#vÞšÖ”xD.Y¢(Æç€.Æ98¢¾ñxX)‘KžHóÀ»!ÚÍ°RÇNÕ#B ~Dˆ`ÚaB[Å8£M0ÝŽh˜¾ªz㌻$SÓ0‘aªi¾q?ƒXÚµ.š“3B–Ù‰µü¢!*<,S]:.Kºq£Æ1ç
¡I0\\ÊÄaZ"6"¿Ÿ‘7|FH(ͼŽHg¡À8W«Ö¢(q6LÑ>Žˆim¨„]ÌDG3Oy¢¡IÖÚ¢ýˆ[þu?CR¹®Ø)ÅÎ@xö_šb{ Ïˆù9o¾å„Ò	My4™" YxÍínô±Ò$+!EÂ5ç»Ê:ˆ¿­3ŽˆÅNd_äö@…wC(8ÐL}=mGÄ.¨Ñz!R©ƒ�}mø`eëyߘÄ︤␡¶>Ò_¤Uö`o	0¬ûîëÏØNlY±ÔeNË»kûF€6l_î‹`ˆ‘T(ç è»U“êÁ/Ó˜·ºG.JóR¼ó—·Æ�’–
-o‡Ê¼ËÃÜ2‰ˆ¨K�•š0‡êpÑ„”d_×£Ù„|lb$#»Ä⤘2¶bîÀúK_b0¥âÀÅ�ß#xóñäeÂñ|;RÒ—,ÔÇú¢#‹að¹È�ì�68Kìêځ‹®¨ï©Ûè›| fâµ,ÉPò6Ÿ‹UŒr}Ê€
-ŒÝ
-‹†nkÙ®âÝl�È™í~ªÆ¬Y®ñ¢‚a‹ˆÏÑlƒî‘KÆh殺×aÊY£æýõ˜»•?#¨špÒ5}=mµ=³¾ÍY=nزrÜ#¶A™ýž^ršØ†‹¢S=–jØÆ:Í—
úŒ2)|Éåæ †½‰74ÙÒ#°m ¶–¡
"ÞJ¦…mj…þ³‡9"ÌÁÛ­à"ŒLT<Ù¦Ç,•J<#ÆY9'žŒ
¬ž2JPÃN(dŒ(IòÆûÏ)ª*ïÈ2Í̹sr‚[˜áùV刘ºú.Ð"
6(ž´F’k8[1VMßë!…ðL3œ2hš( å…–®T^^è3r‰–Ûð5Nj¹»­èy¼ÐUÑ#B=ÙÎÑÃ’¤ø ‰½›C$ñ¶B÷ˆeÍ*{:ñĿː±	arô)ûesP\ð£mC6d|zµ7åÍÐã,3Ýr-ŽÈ%ÅæÎÀ&ä[òîxà%qˆÔ_Ýt#rÉÙ¤¹·N° ¯	“ÙÄ[¨fûv¼öcg„¢]UeMif"íí�Uv³Ýš[3ß#Lħ®x´f¹_ú͍:�m59{ߏ3b1ö{£WِT½¯…·ð´Ä­ç°
¹G˜Ã¢Sû(Ì1U‚XÔ¡uˆòÐ	É9îç °“Ć_›D$T¯U‹¥ï§MÙ=rÉÍ9¶ßdŽ²™­Jw)Ò‰¥Y9î;ÕìP‰9,é¨Û±Ö&wYÓÏÚîò3âk1¿žÁˆìu–+»™ŸïÇ?¾þýH_þ÷¯Ç_Y¡ ©€ ‰Âfûwýÿ?1]8þ³f
è“·&}vêÚü^?žÒ\@¶÷O¨ñ¥x­“~½üŽÏì‡õl~§ßKü~¿Ò~.)Ùo¿áßØmˆ›â|¾ÿùõóè°_}´¯ÿâäùú(ƒZQÚ½Q›„Ê€«¬£ns¬†éZKôó½>
-*Ç’¾À`]
-œ¿»/úöç)~ö¦h"ñÿd?„ÉLíýgNÜx¢)À-ù-qÙ¿½¯ºßúØA6‰ÌñÑæO�?„@R§Ô&;—LM¢Ù'¨2öÑ1¡xž‹|MÉ"-)|öñŽ Þïçó€0ÊùãyPÏÔ×rŸ"cl¿C{Ôª~ÿ§:þuÈy;dƒ”êƒD3pþB?ò1Ì(3§Žü‚(fëgÉᄬ魿À«o,È~þµö$ïÅë»ýì=÷;õ~µ×i?tã ú¦×CuÈ/¿#‚:ÑM\2¤Z@ÿKnáŒr>`VIµÛÞ~?ÎÈõ€–Õ
-‰’Œ©
-t§Ðè]$&>¹oÜQdöäa²öÑCÌ8z¢'Ó/°DH+azUŠ{) N
-•6¶‘€çŸTlØhÂc0¥µSäèl䬬dÀg¥ŠÇ¶ ¦‚ôV²›||F˜õ)•W ïCjÆ' 'EºnI/ž¤hæF:ôr@ƒN	GêH®c’†rÜ#ÌQlÄ°
-²Š†UßcÐÐ oÐBÕZÆî C CY
-@I Á
-ÝI§³À.*'©jW¡ZÜÈPqËç¨à¨´Eš9¸¬–¨Zª·ŽS¤_Ú~›ÆjGȉµ/Pü¦Æ:"HP¨2,º*
-•ý>ë�ŠÎÕuiÉ9îä ÈÉ~f@%Ðku×
dj.¾”Þa
-‚Ì.
v•BüãI= 8BߦL°º¯ñ8í[ñ󼓠»ÓŽ
--D$b­Dïªä¹w¨!Œ”u
Ëh´ø\5
-S<ÅmPæ@iŠÁ³ÀüTˆs@¢~Q@•j¾9gpG�&m\Ó.”�û󄹫 ŸAÕˆõ9#H1¨ì/ìð
-#“Ø4ØD€3êàHn„ôŸæÀ
-Ñ^€¬
-·´Ö+q@°ˆò-í㈠q¦ó”	w)Cw›z(Ĺ½� 9#—"D¼©Gd*K J,Jpðù|
-E
-ËÇA›ò²ŽÕÔ&`K‰…3ÂR`3c©ÀLÅÒôjH‰¥Aái5;ýDUŽ{„9ÍíÞôZބшޭ™ûîÞU}#÷è"C­ÄcŽ"g«•p3”ãˆ0ÇB{ºç;—ë9fm±¥é[òûûahæe0¬Iêo,¯°…¶QP­9"{Î^FÚ¡MäèÔ;Ù0‘–¼Î2 g„ã¾0­ÿBBœTR.~°ð² V߯Hš³3BÀARJnl,‘wè]c0H§µM1Ƭ{„ÐIG[,PÈ(¨Ç/iBc\‘¶5_„zD¿«x됸BðĆ¥5¸"~IÅë›>#¦‘ŠxE‚§gåL¸¿€.Êaõ\MGÄdÖ9¬Ü{"™‡Â�ÜØ/–×ÍzD˜í»†Ø)5t³¸-ò(7û¥Ë¤ü¹&%“6†¯‘·[UÎ"Ŧw¹’dù¹¤7¢9GH‘ G÷ųFPšÍw6šºëˆ0Çr…9Zì…A)å®Ï”ƒ5¬iZÞBé3B±(¿%p'@�¿¥Šñ(Æz³
-êYÕ8"—$\ß²O	˜Ç./°!搲ã×]q ÁÚ×LܯczS¸õ é÷ˆKŽS c·ì¨jŠ>-BЉ÷\¯Íçˆ\†ùŠ°Šøl¤æ1ôÖ¬%mF-qp˜S.¸DnŒ7ú5¬ÚÓ‚Ú÷ã;FŠ#‚�€Zš"DÆõ,&¸Y¼®œnàÿ”r=#—²N–·
i€ÞLh51¸cùûU•âàI0ÝÓn"CZ‚rh¦Õh<ùm?àZÜ—ŠSÃ4[‡Š9	(Ã6¯%²C¼×ÌpðJQxBòŽèÊúfnt÷ၾõ@“á”u¹"0\²?™ÿãºL²åÖq :÷*j	lÀn=žjÿãŠé/qä#<'ER@D\*ú¦–ªî>5-3~O*úVÜœcZO©îä¦A»Â¤*òíåPBÉVÞº+œìNH§#²º×(d…ow×’_Nêù§t“ï…9K18EX+xÓÇcwBªsU¬J¯hñ%Ñɸ«½¥A¥¥J…nôªX·&£ûJ¡¢¤ÂÿHMMçÐËñBï¶ö½+ÔÏ­ïÃJ9ÖÏ)·A¯ó$ø÷4;ÇÚ-±è]±—º¤¹›Éy0€Û±*ƒ9T²¨Ñ
- w%½Dî²B�£Ñ½f×l$€ã}í‘dô®ØÓ˜(*ö³øeFGwŠ†‡B™„V>ÿ|ñ]1…ü•ò֪ѥ§±}é¥l+ÓÑ»òÈ°wZäÇ_}ØExE(hóðsfLxWœ4¦>%¢‡ƒâ´¦ÖÔ°@%ú´}ï\ã[qà™Ä}0ì½`­ðǯ{*4¡-õ<L¼W…k`³¥Ôæ¡ë`.Ç•–ä:F‘mHúVÅ9	ÎÂÖb�œÃ£h—Ž1ŸÍ|YûQ�üV˜B±Æ6½m|Z!˜Ž#âÆÿ åt•&´øœ…kuXi‡+`t«nµ©|½‰]4ý©]\•G!½¶ßªMTT«wU!CŒý{:Ú’Ðþþ¹+`!(çLÐø
-¤]§ì³fâ1†‰ñ[ ŸDÒöGèÄ؇"7Ú6=×’+š¯
-×Àw­cŠ!ÿG×É(ÊøFŒDËádMÊU1«UíŒÈr’ïœ<xÔ·²,pÇK|+¼&E+kE›ñrfõ PÏÉM»¸í©tÿÜ•G :•q8"#>Òl‘ƒ ’]²]	Ç]ao@”gx­vOŠUä¦Uý
-Cç·ðˆ›Æq„ä�M%åBéð­]¬nö¶»Â1	ñETh5Š(³˜´‹-ÛÓ‰Zߊ'M®ñ¢s'yepŽ8ñP‚ÎËC]žò-X3ªî¦hò¨*ÌvX ˜ä Cƒé/I8ߊ¥«é¥hKÈJGiÚfC~¡Ø1ÍÊqþÉß»bJ0Ý´“‹ßr0$Ñ"S?n±[†¿SÒ’Ï“5HVÛÿ#ˆÕ”ÄáåóX?JzUì(ÁUeŠ’&s×Ä ‘‰B^XÕ•¦¤wÅÎväSØAàä–èdÚ¼ðLßOqª¿*¦$S"Æ“²‹Õ‹¤¼k¢HEkù!	½+|{žªõ…÷²U}”BÅØv¹ŽÖ9ß
-ÇHSÆëÍE£¦¿29Í_×SÚÌZß
-“SIÖâh‘“`(=çy0I±K¦ÉìzU¸îGÃûñ5HA<‘Ìq1ÁA_"Á!ðS`lâî¢Ã¤bÓ¼}㊀GúÎ?7§«Â(
-Mí~)U—qV°?éFžíØyªV¸*\£ìrRfê.lj…pZ-¥¹ž_,U˜ì1}ÛÀOcò¯NÔ”’cÕ¿9×
-f‹&Å+qpÒI)αBY¹h	Mþ{"Ù,­¢·u’
’[x3ì<ý]èiûûç®p
̨ÿbòÑMÐS›÷%žŠ¡¿ór“°^•GÀ´ô¤½F²ƒt-›]oÄÄžæwy
ߊiqŸ|oYºÈž¦;¿Ew§çóß?w…k€RÆû7Uƒ%ã¦þ\DôW¿°E2Òö
¡I(·è™QÜúWK„ªÕ¾t”Å¿wåžÎ|3"ÔN!m8 ©(á9ns‰oå2µã)§p˜ÖtHÓÀ´gäš²‘«ò™Öð>*„‹ÀTç‡)Iæ?ïҐ¿Ÿ-g9vOî›Bҏe•{⥆¤)äÈWÁZuàå°{ßd‚•’W‰?S½µîU Zâg<Rp]«åÊŸC8‚ÎQäêú˜wÅXt˜ôè¥4Bì}¤�˹4G
-ÏMáæ®Pø»×àih/´H¾…²NCj̨Ü×’ä^›˜’Dib=lL×S åcü|ð]1M†gýdˆŠZ^W¢"mŠ—3Š^…d"Ž-÷f¢#¤*°®“ÇÎPð®d°÷@° V{ØÁZaÐ�hÛD6‡“o%óMñwlü‚.ß
ú\	il×–é]áè•È^àY Ë+ÏV“.g¦o*Ü•Gٍ"¡›Çi/
Ýigœ9çd`|Wœ9ÛvÐ¥AB°0+¿ …}lÎk†„¶[¿'_‡ç&!îœS=ÕhÊÎÍ©Ëéæ*<ŠãÑz†½.ê¹Kö}¶÷Ú›–øVaÁ,–Ù7=Í]ÚA6±ÀWy°yæ]1Ï0
-ÈK'©ŠÙ¥™aó£˜Ê5Ußʣʘvð…µ¸†òã®ò=#~Ï%¾•G¬VUè(¸¯r26„Ž6t8À֍^®ÔUšiÂbJ_Å`óŠkqD/»'d¾+*�¶äœKu(=q_²ÇƒQª`âªp
xP¶y!›13‘ÿ£©Ýúöó–'Þ¶=8#8¹
-_ÖÙ*×á<3Ùch>N	L¶Xý*ØU4J;L¿
-3¡t«ì0ˆûP˜hšö¦?ãzúoÚßN;˜j«½
-ˆêZCOþ©’:˜äYIDï
-…+DÜÅ¢)W
-°·ÉLE©«©¦Ý
-|ULDe¨P·õ³S?x°•@´–^Z­[W%èø(;šDœN…ILJ5
‚	Ÿ#}àU°“œ’¿ “¾ËoEææ ‹†ßY"qè]±£MŽw>«phïê“møíd58zOS|è«è¦á»@B’¯Zq>&G‰¿àyW¹õªùiÍÛŒÁ¯\8{დ̷€ÚhÛ½Dœ[ô¡ƒñzaÆÊf4^Æ|Õ–3E;Çœª5É[1éôõo€”Þ®±•Lè¤ã~	‹Ð•¨S­Ë<õ-0«¡ç‡±—!80´'|átÏ€ó4bÿ>Í2ßÊ£ ʐ«Ñgìd~Û›Éfö*‘Sáªpü2‘Œþ@ØÙéíÁ·´¶$Ì|
-ñ7V6Ö&ílŠà`ªÌÀûÔÄaÿB˜Àåt£boG�"!%®v>T¾£VCÍ·‚5Z±Ibº¹
<n^ø t=÷îŒ?—¶qU-ª@=‹ô{Ô­èM{£i’¤Ø&‡H´zqÒ궷E°"òyALÁÿMÌázAh®Šápq2é”»¤–-vñ:áq¢I?ÿýsW¸ÄPôýï7=—Dýïæ®Ü­L±	¦î~vÔGì7¥á¹Õf‘ãÓ-YW…}5}.vs,1T™·L~$¤ji8Ç­ù)p>°'
-%ùh1“ãyï0-‡ãq4èWå!ÍâœÙ5c%-aÃ29øЮbiH.»*%b¬zÊ‘ÀD´ÔÖ&ZB¼«›j¾•G˜Ôö–‚÷ÆßLÐwŠ·À+ÓV(ûé:ËUá©0¨LLÅsQ’‚™gÓ4ùmš¾ê/Tí¬jvË躱`萞 Rà®iߊÄß!4ôšP„T“ø@B³ï<[K6zWÒÑȶt2ñº‚g#E…=q²õÜpô®$1è7]¾joæšÛt$Ÿý·«b>Zò°Ü;ü=¦Ïf:ªuæÙÛ/ ¼*²{^àuJ›.xŽZZ¹ä[pЉ~ò32¡Íæøï3c6‹²È–Þ£Q	Ÿ‹	š¾ŽOÕI$˜_;
ï0”ؾ•GnDæÜ"3ßFOßJ5Ýñ]aìÄd:¹"= vþÄa”(hV€)žøœ}Kq†;ÂÊŠGÄ37åDÇña~þVÎÞøbxÕ¸†vÁÑg®/Ìù*D±À·ò˜¦ÍæB¾Ð¨Á6á'B”XF>¤J­ñ­kšã* È†§¥cªuŸWåQ¥µÿ“^-;rGð>_±GíaVõ~\Eûbƒ0/àƒmÆÚôkH@„aÿ¾#"³{º‹K‰!@œÊíʪÌÊŒŒ0I§í™Ñ9G“¸ŠÙ`¹i°®–›$[Ú"Ÿ‰hZ#­4EVºÓ@Í÷ÕB(
«Œ£éÄál$%8eãîªz”³Å%f+ûYM¯FÇCŠ.éYò¶…U×b¡<`2¼#Ñcõô7šLdÀ\çõM*i¸Äèà‹ÔHÅydfqN)XcéJÄba$	NÅÅ=ÒI†|©sMe­;5XW‹õY§W V)U½9ɧ€ˆ•£šìškò1¶ûÙb¡GÍìÙ$ix*~1ª0ˆM
|m<­
²Ê4°%Õ+±zb9õ¤`=£Û )šîga3BPNR7YÙs™)“*Dw¸i¢ûÚ³’ÊKéïUy%Öwâ×i:ú-Dÿ¡Ia{¦4Q#	¢O
-F¼‰œß¹&:[8É€òe»65Pu¨`XSÓ0oag†ç)@;O]Ó<í5zjáÍÞhL}ÍY,7Miâ½�昪?.Z…D SðùÄ/–›GÊf©Ó4P®Ã‹Œkè-”a4Mt¶æPuN+æJ
„‹v§
-± ýj·É6LÑ,Ò-Šk)ÀvT¡ÖA£
aªŽ”ÌÊ[Á«ÉDÆ0ÁÅn'ËšÙÈ:¯—Œ0ž-7±Ð@ã©mªQÊLòÍ)I‘Á‘6÷ž-dÎhñbøÈÖ&sÎÕ–T¦st““pq	*”?ë²w.”hFÖД8[LDLAÕTPeðƒ2õÊ5!EÝ\r²PÉœ-C„Þª[°Ø¹žq>*nÆ•òrY-ò¡i•AC+:¾5“#˜ºéãßú«å&q¤¦¥ÇÎÐ1£‹MÑ®TàNÃÎH©+g‹	CÒpZ�aRKö÷LZ&Eik“–G߃T3ö�÷ÉØ8—åêQû¼èû6ŒÖpN¼—âÍÓeE°:ªNšÑ­TKAk4ÿT‹…¥I²n$/)(êZqUâØVkÞ°¢ÝgD$ÓЫGöŽ G²_¶+ú%ž¢x‹á&u4‚µ|‡˜eÿ…nl¸Ã^:(£ü´[,‰"À×½9:�#Éo%ä&Ù†ÂÃpæd0¨šä5ݐ—q‰ÒvÖ:ê9V= 3#Ca/uQT¤kUº(ù¬(bV«Å07Ì®k•BÜø� ú­4‘H]5ËM:ÍgÖÄQnpJC¶8‘²v !l’/›bp“óQ‰—g´i„F-“T7œ„g}°'6‹é -?÷£ê™ò‰S³Ë ƒAóØ„£#Q³&‹ª&Ó@>ZÀf6
t°¡ ™¤¥ÿ°i×èIˆ>ÞÅ1W‹Qš˜ýN¼F  œ
-¢±¼ÑƒU­8%ÚVܜϫ¦äO¢>âsÊNÅ©ût1»³á&š6RqjÐEì\†ÔÅ
ã´ªï397<ZŒ^v×–U™5û¢¾¨ƒw
-ôÄ‚êb1†Û“õt˜ÜÃ*5®P‹±äЊ+ލ%-7q¾'á'w³{aˆ½—bL¼UùX,7I€ÁžãGŠ)"f1¡†ÜA‡`®–Mù‰ç.Ó.9˜D- Ü‘Ž¬*ÒÄucS•ŽÅr“…DŸó›ˆ-Dr]+I¥lücÖéêh¹I—¥d2`PÈ¥§l0<0ë5")=ìb¡̍hH#÷àVÓ ¢É�9uçkC>Ζ›f«Vpô•Ô‹5K€r(O³b«Þõdà³";äZ¬q‰.$<Uë ®j딟<@$qµ°BIÓ‰)&1ò4Ñ@åš1/¤‡H í‹…}•+06íDAԝƒ£
-ó$ï3|ÁôÏÙbú'†.´byN2jž¤QØÙA×æ`ìÞëGûmÂîO¤wUøR¢ùà„'þT¬.€W@[Ј
T@Cg ïI!xfŠZ5üj1
$ô'l’cÒc¡†JUãŠG¦ªK,–›p8q!Ž9Š€»²UrB
-Œ¤%f[ëîà´Ø�!­¤¥H`Ae","#Ö¸ˆú—Cèlá «‚9ݽQ:5Ö”"…EhJÌ­>
-ŽSì” %³‹§“mÇüN®‘_›jÁåÙ@œIY·
-x*õÆ|j˜q]Ÿ’Ç•ªfÈb!1@­P]tŽ¡©CZ§Bý'gjÔÕB~SEU5
ùŒh»Ú½•;}â‰\¬…)eºXȳPmÒ€äxTAðžm:†JDÅ``³žu±ÜDÞŠ÷?}‘ý¥a<I÷àÀÊÖþÍ2ºXn"¡$âšr€\J›¤ŠÅDÈQÒ¦OãƒÕÉóÙBU<³!`@’<SIa%ñïMð^-Æ๕–Y«X?Ù^¥²õ¤Ù°a‰€³….@¦IÑÚMŒˆuâV³PÜ æ`;j®#gÅ`ϵé5¯‰<®iÜà¾üó$`>E“e‹Å\ˆË–!ÄCb´uÆ
-Åÿ^\S-ôAÅå5LfcŠq]ŠI=#èÍÅÕr³5sŠ[D#“ºEª˜U#ÏÖ&0z�àôØöàÕªRNÏÒ8k —Ëï>\ƒý÷¯ËQ¿¨'çÞ#­%ñË{}Èÿ_§R}E9
‹+ž`{e-ß—/—+ÇqCÛ‘˾[}ì‹ío¾÷ì{wíGÛ:ø¦ Oï.ß_~ùöÍÃåÛß¼yøöí›ôðÝ/°úþò®Ž&ÒƇ©uÝÿzÌÃSC&€Æ¨|פ©®	5€Fš×à=Ø’HWbvDT/e£ØDqÀçÜ
ðˆDÊæK
-Ö.’b`hš¢þH
^1Þý,_½ì·qÃí‚t=õýóDîÂ9b¾¶¥…íÛßý2·»Åoëþ¶XÖè™÷Œrcr"X4Ûú½˜ñ˜ðJ*Š¬m߈�u&m&c$‡uD¦çP_lÀ)Y`^`ólO`ûûiÑx„Ê$OØ
	ûˆûÛ×~"²á»Óm_“*b¿»ËQs`;ΗèK¿€_Ø
[<æí?Óx,Þ¼/ˆeemâ	‚cj{–XWä2…@µµìé‡s\»1¾¼në¿«gîŽ2»
-cüSGËƳ[sÜɯ/é`…hE%¯£ß½ö‰·ËoO÷P¯¾:¢HÍøy!ý�Î'å—„æ0C€2ëæà‹ÒSY’Ä××ÝðÉÃLH!Ê'¾Ö­‹kó4–Á‚–ë殧ƒ»¿ŒøJ8[‘‘õÒ¯¯-²O}Á‹|¦´ä‹ðÅ•õÕaì•õ³âx¥²¾8†X˜äÒÐDzSxwœój=ùî|bÆz8Yû¸(v=/_uC^Ǫ*¡Ž#c@dXŸ
!ŒRûjñÃgO—'Ötóµ(ÎAüX	<és1|÷L;U'TŠ¸Ó·ÏÏtñüî’ñOœ£ @Æ͸x~ùæ?oÿüñoÿøðøüÏ,¹=þÉ÷ÇdV ÚpP~f°ZˆÌÈý¿ÿæèÙÇ+4'µÇ+¦4UØìWÁ/¨ßùñ
-¸ã¯„_]¿â#FÏnú°§˜5õÍSj´êWݾLô¾û‘…gÄûyà¤ö×?>ÿê•4E“ýOÎöü—ŸN	#Hà
^ð=SöpRT¸ËÕ™˜ý"nBè×xx¿òv}IiËf;Ì_[ê^ÙÅÓA¸ì¬´ßd9ÿÓÓ³þ»¼Ï-&è»xÞÛýþ{¤Q�ÕwÑ=Cìþpø.åýæ}?GÆw×rz5è…SºcÞ¶ßÓqÿ¥Còáùtôù²ý|ÁCeUM/ãø÷ãµæc†ï.Uø÷Rú‡:”~[^8ݳýÿâIåŸ^­Šm�(Æy¯éŸìÜOZÇd?}éƒ{O;@¼VÝéþu«-·ÝkóP×öÕÿX¯¶Õ†aú+~ä!&¾Hµ?`o{¬?PÊú4ØØ:Jÿ~G²§cƒB$ùXŠtÎw\ãÎÕ$ÀÔ×£m†ÅK)ˆšea¡4´¤×{äÿª©ý<›§7}ñ|4§ÁÉ»wó8HRFš»ó"ܯï÷³†ËMÃ1&3:ZgÑpÈÊŠbäTû¸þÖ©a³?Jn°^Œ:ŸJ[¯Ï”mJÙ›]�ÑbÖÎî<êùëB Me1™0wÆYÉmÀÅö$Ajñu½@™�„VE}8H’‘1³€²ÿ³^�±÷
-—)/i)l³ŸTuÛ~h67Ý’’ª]3×ÛâÅu<N]!WŒÏ	Jq9~„)æ{O!ú-¹ª‹<9^j„«Ä}iÛ±í7„´(Sºá©³\ûÝøâÄՏŸT®b¸!xg½ÿÙGñ¯((fòoP¨\ý`�|zi2
-endstream
endobj
17 0 obj
<</BitsPerComponent 8/ColorSpace 18 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 72/Length 938/Width 76>>stream
-8;Z\7bE7E2%+U>,Eq@jL:+:o5[LT3fU^jf=P5IV/NVVY>1HR+J!#oE4`3Z%$r3qk*
-3_^dQ<;!]IcB$gKOS7B.!<SDd;Fu"FPJTKDMV8Y`S$Z\qEm,Peb@;CkcNYQ;"t29+
-4f!P;0)%[QWm8Oa=KiZJLb"LE['X<kmkG/R-]J(kCgJ1+QCf45<6gK2h!'qqs$^0>
-6Js'=HfFuU`uZj3"%2#gY4$Qd/M9u.Hsc5.#o10]1a$sr3f>M4OFb4)jR1?M0mS<B
-\q_g"aT1+0gc]h_K8Z>()2*ne9=j_YNAL=_GF[0j^Su2:U&)9B/E,Ro8\sK6KWE;"
-D-M!CQ!_Rs?O_p'Y4q^6%$uh(AR(*kEQkUR\E72B-!V*th@s\BH2a7rF7U3R(>`n8
-d7839er,jgb@V-u[58d[?fotX7u$:\^M^]ZnD<)\D+;4aY;XjRp_E(S!`\5!>g_U.
-KO7In2u(@!NcJlp'M$C&0"gqWY3-*t3,>l*q.jYi4g(/9c!T<la^8ia_gHq:=1*I)
-gr$OgQ%RERf:G1oj#X9&#B66\a.p0@qDd9&j^N1/IH3q5I2qWdRsgaS7nd6/V-0c5
-]HTngd[-*`ki5r,RLs2-#ZVTbQ/BbsF=1AufA->*@D-]k]Ik[_4Yj2>?Ct-k'6>7T
-bGh8Sjh@,)F:)+#7i_p+XH/Ul!%*L@qu7K\"MU2,BQ$D_TgU,ieNHE+RNT+bs4:2L
-UfMTh`![[3_OD:TKPt.&8Q;to3@TA5Z1.[+PcEg&L0pGH=SNUiqA=[8O_J'+%CN^%
-!gndoktK!m1\o0HiLYm,iM5BKc!IWJ3i8+[V,^Km\K7mg:I-H->$QLa@-WQ5?\dWP
-XSiU.hf50QaF0chi*.\GL)H3<*$Q3"\2IAkEotXc_l\")'-gb,'NYb"0T2!d=l"Re
-5AECb!:p^i])~>
-endstream
endobj
18 0 obj
[/Indexed/DeviceRGB 255 19 0 R]
endobj
19 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
-8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
-b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
-E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
-6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
-VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
-PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
-l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
-endstream
endobj
9 0 obj
<</Intent 20 0 R/Name(Layer 3)/Type/OCG/Usage 21 0 R>>
endobj
10 0 obj
<</Intent 22 0 R/Name(Layer 2)/Type/OCG/Usage 23 0 R>>
endobj
11 0 obj
<</Intent 24 0 R/Name(Layer 1)/Type/OCG/Usage 25 0 R>>
endobj
12 0 obj
<</Intent 26 0 R/Name(Layer 4)/Type/OCG/Usage 27 0 R>>
endobj
26 0 obj
[/View/Design]
endobj
27 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 23.0)/Subtype/Artwork>>>>
endobj
24 0 obj
[/View/Design]
endobj
25 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 23.0)/Subtype/Artwork>>>>
endobj
22 0 obj
[/View/Design]
endobj
23 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 23.0)/Subtype/Artwork>>>>
endobj
20 0 obj
[/View/Design]
endobj
21 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 23.0)/Subtype/Artwork>>>>
endobj
6 0 obj
<</BaseFont/GDVRAG+AcuminVariableConcept/Encoding 28 0 R/FirstChar 9/FontDescriptor 29 0 R/LastChar 31/Subtype/Type1/Type/Font/Widths[168 455 641 170 548 484 214 289 324 251 550 550 214 538 529 548 260 444 502 546 508 829 250]>>
endobj
5 0 obj
<</BaseFont/MMXBGU+RobotoMono-BoldItalic/Encoding/WinAnsiEncoding/FirstChar 77/FontDescriptor 30 0 R/LastChar 118/Subtype/TrueType/Type/Font/Widths[587 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 587 0 0 0 0 0 587 0 587 0 0 0 0 587 0 0 0 587 0 0 0 587]>>
endobj
7 0 obj
<</BaseFont/YRUVSW+RobotoMono-Italic/Encoding/WinAnsiEncoding/FirstChar 49/FontDescriptor 31 0 R/LastChar 118/Subtype/TrueType/Type/Font/Widths[587 587 587 587 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 587 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 587 0 0 0 0 0 587 0 587 0 0 0 0 587 0 0 0 587 0 0 0 587]>>
endobj
8 0 obj
<</BaseFont/QATZKM+AktivGrotesk-Medium/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 32 0 R/LastChar 121/Subtype/TrueType/Type/Font/Widths[223 0 0 0 0 0 653 0 0 0 0 0 0 0 0 0 0 592 592 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 573 0 0 0 633 0 0 644 0 0 0 0 0 0 0 0 0 0 0 0 0 549 0 564 0 580 356 0 0 0 0 0 0 0 0 609 610 0 393 530 363 574 0 0 0 545]>>
endobj
32 0 obj
<</Ascent 1160/CapHeight 714/Descent -831/Flags 32/FontBBox[-454 -831 2384 1160]/FontFamily(Aktiv Grotesk Medium)/FontFile2 33 0 R/FontName/QATZKM+AktivGrotesk-Medium/FontStretch/Normal/FontWeight 500/ItalicAngle 0/StemV 116/Type/FontDescriptor/XHeight 520>>
endobj
33 0 obj
<</Filter/FlateDecode/Length 13710/Length1 41868>>stream
-H‰|ÖyTGðouÏ´4ˆ€Š’(}Íô¨hÐàDAÐõƒw¢Ü¨„‘QQñŠ¼¬îF¢nÄãÓ¼‘¸QŒTŒD#k<׃M¦™gg³y/š5šUGè­	›vû½š©_uuUwÕçõ¯A�„¢,RǧõŒkë‹‹¡-ßÑ’‘mÏtœ½û÷(€$�á]³I/ØV9€Ù”ç˜eîy§?Ða6ÀÝ™U°$/ößËÑC€ ë³s3sB·…Þlát¼~³iCÈæ°4Ncël{Qq‡šÌjçñ»
-³3±ÒZ
-d¶¡q…=³ØQô5°õí/ÍÍ´çšÃ†çÒ˜ŽiJs.(2ÊÀònþóŽù¹ŽyãÎ×Óx$À&ÃÄ"`FSÍÐQQüâŸlÅ›xdfBÌ&Ƙ\¨4®ÁðÑ>]iAJÒØ$Ô�F#S×ä&Q¦Jò¡bÀ1uþÙè¸4€ý€ötýhÀ1Áþ‚æ3ÿ=íÍjþÿñâJ&:‡V`„ 5Ý©6C8"Ðí謑耎ˆÂKxÐÑ Ò{“¡À+TØÐ…>S7Ä ;zàÄ¢'záUÄ¡7ú /ú¡?` â1	x
ƒ1‰HÂP$#Ã0¿ÃŒÄ(ŒÆŒÅ8ŒG*&àu¤a"&a2¦`*¦a:Þ «:3‘ŽdÒû߁Ø½øŸãÎà4Îâ]Õ/Q‹ø
-ñ5êp	Áe\Á5\ÅuÜÄ
ÜÁmÜE=faVàm¬Â|lD5Þð°šT`Ž’=XOö“Jj·Œl#ŸíäÙ‹?b3)ÇyÜÂ6,Dz9dùïâ#äa>F9ÃŽ%X€"80sQˆ¿’O©ù¥Ä, ˜ü™Äl|€lä"Ÿ`¶£{P‰Oq�ûqUô	âÇ1†9Xˆµ$›ä\l"³HÉ„©
•ÀÄÑÍ¢«
º‡¡tÞÆÒ“¼JF‘4’N2Éb²’l eÄ`:1"ÓŸ™Æ,gʘÓÌEæs›q2
Ì}–°,˳ÖÆ.d—²o³¥ìZöv[ÁbO±5ì%ö
-{ƒ½Ãê¦tS¶i¡é©Y5_4ÿ`~ı\$׉¹xn7‰›ÉÍáìÜ-î÷”3ZÙy–oÏGóqü@>™˧òSøt>‹ÏåùÅüJBQP…$aŠ-Ø…ÕÂFa«°]ø—ð³ðTŒ£ÅaâXqŠ8M|Cœ!®ˆµâMñ[ñøHl’ …H‘’ )’MŠ•zI½¥¾R¼4XJ‘FIi‰´RZ#­—vKû¤ÒAéˆtRª–!3²Yn%‡ÈmåvrYÙ*ÛäX¹¯<UN—7ÉÉ{å
-ù¨\-×È·(¼¢„)í”H¥£ò²¢(ªÒ]‰Uú)	Ê%Y¦ŒTF+Ó”,%W)P(+”5Êe›²G9¯èÊ}c	¶DXdKŒ%É2ÝjU¬C­µ*TFm­†«íÕ(µ³jU{¨}ÔÕ¡–¨«ÔwÕµêFu‡z@ý\ýB=©žVÏ©µêõ²zU­W½6³-ÌÖÖ–`K´
µeزmy¶·ºŒŠQcbbòö¾÷8äqÄ/çŸDû_W_7_?_‚o°/É—âï«òýÓg4i|Øø¬ñyÓs£Ñÿ¦_ŽßŒDÍî%½HM&’’EŠI	5³‘‰b„3§˜3wfÐb¦(`f5³žÝÄîb÷³Ul5{Ž­c¯³·Ø¿™`Ê2Í7•š­æCækæŸ8p!ÔŒÀÉ\"7š›Ìepùœƒ»ÏýÄ=k•ÊÞÌGòß›ÄãÇó“ù©ÔLŸÇ;ø%#‚`…ÉB†/”e3åÂCá‘1J”Äbj³™t±D<&^o‹Nñ¡ø5C¤ÖRGI¢fb¨™8jf ”Ðl¦HZ*•H¥Ò.j¦RúŒš9þ3Árj&Rîø3©òtù}ys‹™3ò5j†	˜‰˜yI‰¦fºP3}ZÌŒ˜ÉPr”|e®²H)Q6Ì|©¸šÍ„[$K·3‰ÿÓLj‹™÷ÕrµR=¬£fªÕš€™:jænÀLj&¾ÅL®-¿ÅLéãVC©øˆ/šš‰ñ
 f}ɾá¾TßMßóÆÁÍfJfˆñÔxlxŒ{Æ·†ÓÐŒšÃ4Züù|yÓ
,3’1ÃèJ3cüèÖ´Å8AÏW»Œ2cƒ±ÝXmüž& È?èïW´¬#kéï*ZÞ¡åCZ6ÒŒb£9Çdèô}}u”Ö¡9uù¯¹Û\óׄÆJ¬ükÙÇš™íL3Éy*<;=ežõž"O†gªçu÷÷žXOê±º—{ïBïï<o¡×î-ð¾åÍ÷ÎñÎòæys½ÙÞ,o†7ý^ñ½N/Fu%z'ºâÝÏÜO÷Ïz÷÷:q5¹O¸ž¸º·º·æCË8w²{¨;Ñ=Äýš{«öÐ0ÑÝÛµÔ5Émñ÷Ò¿Ñ/ëgõZý¸~X¯Òwêy´­¨áO@Ã:=¿~?è4»é3ô©zš>A§¥ÑH~!5ÓcõWôîz7]Ð;ëí]O\ßÑq«]G]‡\;][]«]ö†S
ûJxíŠöV«ÓÎh§´ãZ•V©íÒ¶ik´¥Úb­H›§ÍÕ²´éÚ$-M› ¥jã´1Úh@KÑ´^Z[-XrêNÍétÖ8Ï8O;Oº~¬O©O¬7Ï\Ѻ´õدòð¨Š$ÞýÞ¼ùU¿~|V]•	!!	„ÓÈÉ@¸“˜@BÂ}¬Ü‡‚@ ¢ ‡+÷A¹pE„¹D`¹‚ nf{&€DØoñóÛÿ¬ï«~UÕUõªÞÑýë(Ö1&WɃr¥\!—Ëer©\Rò¤Ì"ó	Ó(3B!¨û0Šïý8W/áû檕Xµ°ßØý¨IRá—"Ç*n¡8þyšhqjL×2µ)êúŽâUÚ}¤úRFêãõmú.ÿWsB¿ ÿb³~³ÙlåîÏö{I?¢_Ò¹G¿ñ@¯ÓúY5ž½?º”¶_?ù€ØÃ%nkÊC?_jþ̽óÿ?ÒÇÿ.o÷}–DÛ£¶è;š-Ê7òPÆÃyu…b"xM?’êÁ)ì”Ä“y{žÂSyO×&s·z·ÝÂñ£"Þ•
à¹F£‹á6:­Œ®Fk£ÑÖH4’Œt£¢á0ùZ¾Úˆ7ÚÉF{#ÅH5:ò÷h£±Ñ„¯1ÒŒL#Ãè`t2ºݍžr„-ÇÈñr(EÈQ2_–½eÙWö“ýé9€j¡xO⯨Š(4ÀÛ¨‡šCZ¡bÑyȁhQŽAèOeÐoàuLÅDŒÃr,„óè)™MOËÙUæÑÙ]ö pªN5¨UÀjC£d/IÓéUš‚õ4–Ð|šƒM4›¶ÒFZGïÑJúÛhvÒ:J‡é /èÁn:E'¨ˆ®Òeº€O„%„°‘—~QA<Ny¢¬¨ƒÏE
QMTqøJaµ(…Ø2E
-‹D…Û¨·‡Ú³Ä1F¼ˆ£b¨˜%¦á¤˜‚ïpqEÌoŠ•b™X,ˆ¹bŠÄz±VxÄN±7ñ3ÕE±8,‰bŸØ+ÊAâšÙS\2sÅ9qÚhöÇM»ÉE±øYÜ4+šOš™¦4#ÍÚfu3Ĭl¶5[˜.3Úl`¦˜I–féòˆ<!¿•'å)ùü^ž“çå¿äyQ^’—e‘¼"¯ZÉV{+ÅJµÒ­+Óª-oÈ£V€UÖª$oÉŸ¤×â–iÙ-i…Zu¬+LþhՐ‡å!yL—×åòš<#ÏZ9VW+×Ê“ßXݬîö¡öaöáözU=Xña|›W¯æÇø]ôP?ÞÏQ'‹<u¦P8ß¾YoÌ:\obhl­·±ó©|†žÁÇð±¼€Oä“Ôø
-Çóùx>AÏäoéCžÆßÖ‡ë#ô‘êÜ1WIÍê/+Œ•«ÕóÕ
-6A/à‹øb}_¢ÏÐgòå¶rö!¾SÞC!-¦´ˆb#>À|H[hm¦h<¥|G³èušI3°kð>ÖbþÏð©A"XT¥´”–Ó2*¤Uä¡w±a6ÓnÚIÓ.ú’öÓAúŠ>§}؁íØ‹=ø»p�_àKìÇ×8ˆâÂù=EoÑK´ÍEKÑGð"ŠÁbNãÎáÎâ{|‹c8ãø7ðn‰…ùÒEšX*–ˆb¹X$ÒTñ¡ø@¼!f‹ùbžØ!¶ŠíbVa%®ã\ÃU¢"žÁS¨€'Pã1Á‰*¨ŒFhˆúxÏ!oáMÔE-ÔAmD 5P¡F5„ ­ÑmÐqhæh
-bÐÑx¹èŠld¡:£2ѐŽ¤!ÉHDÚá%ŒÀ‹‰aŒ¡‚øàôCoôEôD7ô@wÌÆÌÂLLÇ«˜†×ð
-&a
-&£�ù˜€ñ‹Ñƒ—±‹±K°�óñ.V`.æàüt²‘AvqÒ´½Œ—ÓV³¿hÄÞº¤øŠïêòi>„6揬óAI,]­ÔürÞmþ•úß¾¦³x–Éþ;e³6ŠDnu‡¾*^‘–­¥ùmêoã¯ù¥�ï•Û~q,šµ+™Ãj±dæÒØïR´ÖÐodÕXM¯òõ¾ðP2>‚Åë…Å·xxñ¿õ•ZÕc-V‹ÂŽ±`Ì“Ù:-Us³ŽÊsÿÚ÷ôµ½wb5ÎÖðx.øë­T¼©øˆ·¾²*4éÝXªæ‹÷G¬f%XÄ¡êŒ`X*ßÍ,ïuÖZõ˜ûpÿ1ÒÚªÁò^ÖŽy£î»³fj?NQ¨¾&ë睧-U7gÙDöˆzGÒŸô?I›®x"sj}øMoßâËų¼õ½	ÞYÅ‘Þ
ŽÁÞáÊÉî½Q|ëÁI,_­!½XK6˜MÓ—¨sbÛÎÚD7uwêØ!3#=59©]bB|Û6­[µlÑ<®YSWlL“ÆÑÏG5jØ þs‘ÏÖ«[£zxXpP•ÊÎJË?Z6à‘2Ò»aÓÕOær6u;<An-ÈîӝYʐuÁíq(SÓÒ>‡Ûïæ(í­<»þÆ3ºÄ3ú®'p4d
ÃÃ.§Ãói¬Ó±ž§'¤*yr¬3Íá¹è—[ûe[_)£”À@áp•Ï‹ux¸Ûáò4˜WàrǪ|…ÒŒqÆä˜áa¬Ð”J”Jò;ûòà(î´`WýBQßm=zWV¶'>!Õ[!00Íoc1þ\{Œþ\Žn¾šÙDGaØ–‚IëXgw¨•íÌÎÊLõèY*¨@wä{ʆzBœ±ž¡§Ë«–s<aÎX—'Ô©’µL¼{î1ª8ELï¼x¡´%ë¶Å^% ˆùD_‹w“š¿#3U›ªPõè«eâúhÖY)žÿð]­¿‰\WüÎ`0€=f<3×€1æ5cÀÆ`l¼¶µÆ¼ñ?XÛU÷áí*U£$u¢(ÝRU»ê‡¶êCé_Ðâô‘Dm¥¨Rû!RÔ¨Š*µê‡|m%G‘"%ŸÖî¹€Ýõj[k<sï=çžó;¿sÎeæ¨\í̴ͽÔH°Ö¢ëDòþ¹„]'’£sÉÅö:IªŠõîõâ¾»u´-„Ɓýöå…äBKã«oïì“çV£‰gf:¼­U[êÔ­n¬Åãhô·êÄ¡¡\mEð½–ç;
-° ¬VÛ[ºÛZŽBÕwº»Z‘âÁ%›õ™@b—«ï!åì“ã	û•‚&Pàh9_±YݽÕ®s»PŸ·„*'¶ÔÐWÃÕFd	[[OÀØöØÞ±=£}®L"×yõB•æ45’-Xfá†óX!]í)Éh>#T)«—®]²·P""
ÙZ(qbMìüýH\S¯·¥Ê–.0uüüOhm( 3O¼d´·°kíù8iÂE×1ìГt–ÎE/t.¬Ñ`¦½D²èZhY¨â®a¨!u¹Jb#\·ó»°ŠÊÕv¶»U²viÖ‘O^Ⱥ£]€œ
rç9mÏçÚó‹iéñü¹XhêñÂj“XÆ]ƒHh甬
-Í9i›èöï,oxvVa¶¹õîÙÑvóXU›÷Šõý)bÏï6ñj5õá­T_á^"îlhZXˇÆáðÉcêaùX¥®nT߳»Îõê1Måk¤úÝû vEa—órm¿Y¯‘ÒFN .ªEá,jÑ8{LÑZSË€ù–çÉzŽ¬ç:ëZ²®ƒ´PNê<œÕê»gï_ŠçùQ>_¹mC}V™¬
--¡\¼õÁ…l¬VpFÖl‚´	kÄÞS2"^1õGúS¤A:Ôÿk-¥C”û0òa4¦0"㇙z,Ÿ~LúÄ&ÓÍ'/‚¦xöý=ú#x%ãÐ,’UnÖ`¶2š˜ªÁ7Ãõu…sWf††(§('²œ;Ù´¥"6WÊ–ÊEcTVŸða‰uð´K§Õ’§"'’.­Ka:>‘¥“>y(²Óåt°fÎ•H$­VçÂoõ8Í£Òb¿Õzœ
-ŽM9ÒÒÙ…í´k0˜ôpáÁpÞ¿p¾^ÜÞØÀÌFj’<·ß ~ßç’XßèŠ]ò¸ûn³WƇ¢’cÀQàý#SW}£¹˜áW¢8˜Oë­zabL²ãYö^ä[ˆBUàëûðò¬E¶wzLH«¥4=$FF¸ìþ¤Â`¦)ÿm÷õ÷µ7Ÿ,Ñ2ì‰Á‰‹þ3ò jF!“ÑÈ™ô{L/ʝä€Åz"GcÉ.-Z?«ÈY‡™†ïN1>¹øÚf<­d³–Û}bº’½û xín‘JšO#µÂÁf-¿ÏYFç“âáÍôæÆV®1nÁ­¾zQÿo¨R²Ë�Jl2¢¶-§ôOÞ:�º­]†‘’êR–’É„úõƒ%²«‘ìTdž&¨0f°]ÎB¦Â0f¿,dÜî+û×^ÿÆá´ÔoÆéЫô#™kÁðZÎ{úu×&†=|ˆ·~	ÈDøv¹AÿÅQDu÷Ëâ˜[sUöðˆxÄ»å>ñª[Óq›ŠD6 ‡I1¶Pät*]¿~XÓ)RD>àÍØœ.—³M–|þŸè×ד’Ù08.ÝH¬¥<ÒÎÔÕݬ ½o..SØ¢¨;‡_g…ïüTÿYÕÆ\Œ8Äj›S”Ee@J–ü¶Ì”…ÃöH*®ñ•ÐRJüú7áìsê_´™PÅÕááÈD™®céwÄщâ$N²W|º~}Å
-p¢äN:AH'›P0^³ CéÇãO×~ò¼‰6ã¦bJN2ÇJ´g-ãU#\t©]J…ãŠ~ß|§ž-Gí·?×XD»ä[œæßÆa»/=š(ø,t3‘Œ‹³ÂäRøôw@rØÀ1òª›=ŠULc;¶kœ•~PѬçP`þÛe¶;mK
‡¹Í,/MßÌ$å!í¡>÷É|¿™—G&ºßnøKlvo~ÔS13>%(yÉ?ó$à‘Àq7Fªøh˜¾nCn«ûžû#wÏcÛÏm´Ûæ¶i†*F{ݦõd³‹ÏweER%‰d²Ã"m1ßÙ{ù5oas2S:ý.=SL$ú´™|.ßûãríÑë…ý9/ˆSò\uÌÿ3õêBH‚ßê6ýWÄ"^µ:öu«Ö`ªôé(´®Ñp®ÁºÇ•ød
-x,«°Ð[åòÆr<Äð¼wôÕWïS¿ØàW6Ìë}£~qãt¥u¢6¹`}G[qèPÅÔ‰
"‚’h£'ýThPØT´T(”J…éù—ÞÄùú•l}Zôo.î\_ßÞY[ß}áñÙ[¥Ñ@©‘™Ù›OêìOäGœj¶›+6‹q¤B÷êàËA ä"íÍv®Û?,¶·SÜmt@£ÞVÉ•$'¤×âcËøþ¡Óㆢ#‡®\£õ¥`ˆä:·7ï‚O¨?(…Q«c|VVŠAÛòuàux}@[‘9UcÐ_ÑQ=ÇDzŒŒ6
-çE•Á‰úKn1ȸŒýÆA³™CZ¿§é}
ÍJAçé_h=–Î>£þ
a&Ђäzl‚à(G%8ö¡éG&ºf:0ѦÿíÀt-p lo%fä+¬®M<“‚Ö´‘[
-níÚOò¥Œç70vñÐÃíþð?Ò8Åñ”<ÍÞT!u-’Y–u·L±”86ЧgG¸é‰bÀúµ;¡Õ|@óÖ èÐIâàˆÞèÀÉÈH:àt%x³ßg²9ŒÓlè5öý‡ò2®ê*ãøwÏ}	$l¬	”¬„	I ,²“Ob!«•—¶£ÅZÒB‹¤,µÚÃÌÔ:í h+vhµEqtPé‚L­U»0¥¥RlD@Á²<ßyçÅç#)ôÎüçî¹çžåÛÏȱSòšÛ3‚3*8bjøœ×Áw(™$-m@{zfJÿù	‰Cç<x"b•ˆ‹¬°vh£‰Uý##µíëkÖäåfä¤e”W.hÄ&7n\tùT°00?}áB/‘%ª‘âeä9õ¤¤Ú3R&''Z;!{Thú‰ÁäºÉÏËxº¸dø„¢áwÜ^xCùg±‚ËÏ×—g族ò¦\:*/ùübo!s÷ó˜{0f801‰ŒÔ>8#59±¿ãÔå†Eœ×¯4¨ÂOõÕ›³rGå§
z«ëáµ÷ÊÌ
N
f—dÝ”t]p¢wîòoù¥3¥3˳ú©ÊÚ«¸ïæ´ªKŠœyíÎuË,ßÓøÔåiÔXÏkΡ€@r8™ŽÖËÓÎw'µÚÞ˜'u§wVK%žw.Jƒ×)£M«ùþnÉ3Ižì•Ñ^–”‚þÞ£’Å·jù@
-½uROõ¾(ýè+7‚	 ä‚é`*(qß‹u¼þK{˜ê¼’æ¿&åæiI1÷IȐIæÏp;¨¯òþ²„¼tÚ·ÈH³®–?þàû]p¼–¾.öÝÁvK½Ù…¼žcÞÍ’dî–¦EFx“¤E÷'³~)rÓ$OšÑ칃&I™Y¥y¤ÛvN~Nêä\øSdÛ
~'cé·ß;¤”yxÏ”|ï6IeïÕ&ÙœY+5ß—\oŠd!ëYpë«,2äˆrø¨×%…þ÷é’¡`þ;fqÎäUʘÀx®«G¤0¶x«X—3¨]0þ6ÿÉ´{¨”,?{ãÜN¿õ*oP&꺠	äè~L:j’‡ü~2ÞÛ)ù&YÆèwÕ³wÙ4ÉVïäþ½íÈm»L¶rk`Þ’©ºå}ýSù0gÎò·Ë0‡ÉÞiúTǽ [½·;½;xéáÃè}2ü&8eþ†ÎãÁ¾"¶ z…êû0si«Ž{/<)¢óX ï—Ðõøp,j–ã¡ö¬¬zz7K¤Á²žW׌g=»®ß«?èÜzþ¯À*ŸÆk`õÅÃø•=χÌ;G|d|sî‡ÏÀ§ˆF ‡L…ú¡Ú¿úƒ7:ú6…_ZßPßÄ?,ª­ŸLV_åÛ¿"Œ`ï~8$ÉÞ81ªO»‡x~L<ÛvïV·ì9žÕç­ßYŸsïclÀ®`bƒõÏxV[Q}]#Û¸¢¾­ö¥ºÕØ‚dz|ÄYãÖ¶²j’7Õ¿Õ¯ÀwA7x¼
-æGççèzÒákÙ`,¨å Âùf©û65ê« ¨×q¯Ë(ÿa™èü´4ꯠÄôk_н×ôÒ¯}å1ýÁ˜9J5§˜ïs†¤ÅÌ”ló¾¨Ïè9lìè”ñ¼÷j8_$.Îuy¢Î\Ol:@,^ôÿð÷E`çúš´ó7Ø8WäýUF™2ŽµFÓ§í)6•ÑÖ|Ôbå–#•Qñ5ÊrPoãÐÛL°|	ü¨ž¿6‚
à¸{ÜAû_�‡5vÆà¨Í­Ñ¼«1˜œ¥y26i.Ñ<¢¹!6hì·ñ^c8qØÆÞ[Å7籟6–h\L1á‹æ÷RäÅ—îˆÄ.c–!ÏÅœg¹üF¹Ît#·è§&¼ÏÄ؝äÕ¥žü¢J&¿†L1õC%ÿ°ÏÃêÇá_!{ë·äæÉæR( ÝÄ:§mL´>ÆâAÎ<Â[IÌQ_Ü £¾iŽ1n%~÷.öóíg°¥ÎßÞÃÏÚ%©#²½ãœiº­—!f€3YÌ1Ÿ¼­ùöxQ’µÎIH–PàyÐÌžž$o”sŽô—Òþ%¨b›5÷à¯{â͵Ɖ™®¦‰‰ó´pØæš·˜ëö˜8‰›…WÄ6Îƹ|	)nÏ1qy†ÌŽÿÅÈøuzæ‰ÄùѺ'ïÛè9yß~æâOÛÀÒ8,ÎnßpP»¾< îrháýe°Ì�
 Ññë›îß®8V¬R0×ÏÁ‹`»­	µ.‹æÀ(SÚúÌå0­mMv—_wÕ¸Ÿýb™ÝgnŽ°w•ïWç«çì8«¯ïä]êO©rù·®¯|è8§ÏïίÆWØsÔ¯ÆÑ|Ç6.EãÓ§©G?;¨Y[ánp�l‰ÜNl¼[gk*[ŸË{®æÝ,p>~Þ`†Hš~óÞ•TbïD‡iž±bÛ½ô“òÌ<©O¸•<4OÔ¶ø|ž9$•ÔËùÈh¬>é’4ÓLli!Ö£Ãvts’xúœ´iìûœu“´S+ýœñ(ûýïÐW'ÿ,eÌv¬t×Ðn!϶È?c¸ÐñƒË­½œ$~wÛ»SµËƒsù¶Ïý¼
1ó(þÃÙÊö^ÓLì~!gÚƼ‘»˜bš­ã7Ùû\	ëµéš`ˆi“{éíЦð^á<ó¤Ò¢•:¥Õ¾çÁã4——òoUÏ~—Ê,íõ=yœÔڱ̊ƒîk¬ãq1ï¥î>ÙçõŠ“ä‚'ˆAŠèœ]Ò앐§#g›î”½À÷asZWDæk�æ«2ž…ê{ÚEÓêIÑv,ÇCvG¾)+ÂÜ·Ÿ¼¿gޏiÇ=yAõ¹Lwø©ƒ¶Ë¦Ç ¬è}°Ü!:ß.ó6~.ÔÀlEv[ñÅÛö.;Ï| Íp™Í]V'Ap½ùõÜqlÉÝÿüî¨Ciÿ‘ØÅX}öÈ}#0AR™ŒÉ­?ÈÛæ&	P_†¬i£¹Cÿ?*ýu¾@?I¢¿ÀŽUèÇd€æÍ#6Fþ‚¶æ½{iýÁœ~ÙÌ¿¿¥ÿüìÆž¥ýºô'φ̽6äÀãCEÄûNüw¼Ôz{°÷vb	1Ü/"ŽÄ'«éS³ÙKøFmÍk3-×꽏º-ÃÆп#»tê¬&úG!×)Rë7Ðnãß³pL“bÿSðxl8z‡]B|Üc¿•iÔ¼¡÷X­'üvtô9¾1ÆîC÷£kéú³±ó¬Ý!~OÞèL¿,‰Ô.!ö\ke?ó¨#¾cóq-ó‡ìZ%Ô¥¿aÜ&úÇJm ]’ü1¶î,°g‚þlÆ=sócêöIäã3¬×Â|Gè¿™ó×ó²^Æûö±šs¨^ÍãÝüÉ/‰=¼=!+¿9¬äû™Hmän0‘½Ñ_¤^XÅyvIB”Õ¶Ô>¬Žcº3ÿá›ÊXkÕz7*3lÀêáÞÿ$uú¯µ¹"—ï‹bj½h×xÞ,¢Ü³VT.Zë]âüj—ªÇ}Þ{±7Õ¹µyÕ[<»=Z½ü„yÔF±•ÀläyÜúi–½“µŠÆƒ\d²šº2d>ÃØìþG裆x~ß)d?¸ç-¥~ßÆÚ9ä3íÿ!gÕÚ}±³m¯¶”K»‘e	vÝ"UpÿVq—ÿ’_®ÁUUW�^çœ{áÒH" �žAB(Â,´¬Vb§*´°m-EA:¶ˆcku T ŽŠµáUKÐ†"Êé·÷Ù79	'á"üèL|³ö^g?×Y{ïµ´*EϦ²±Xôüi[ªx˜±õ¹T±m¶öŸMr}6ùçѳé(¿ÝMù>â5ÿH|¸­dYgä!è»ZÄ¥(+û¨6ÚOf?Eò
»5wXgîK|¦;ozÞ–t÷ªÓDúâ‹*îìAžÐÓyž|ïÀ=äl¦¾Xzêu,Bªù™Sͧæ²2Ür8bO¢?cFÑã
‘7M¼\‡à(9_{èkÏfm*Ïù»6—°n›Íº÷`Ûľ?ÇžwK¢€ï¬Ã9jþºxŸ�çÖý",…UÐ×C¯=�§
ßÛIO|¶§sŽC)í•]ëÀyšv?¡ßC0	FÂýè>óðlD\–áþÙp	N£kþJ›˜ç�lu°
z”]p~æí/ố¡0–ö¾„3œ~ŸÓöNä!à?ÕÉJÚ¬¥ý|
©ÐݏJ»GmiìÂÞj_Œ®ÙçÚ7nõ?Þâ¹á¾wÐæÉö„:ûà´¥gJׇÈûÚHX›×=‘ñÕ|×;‡&÷›K`¾óOãCGÿf\‹³Z®°›xg—¶Å°@õ¹ÎÔ] ˆÖÕ»¢Î÷<ï¬;CtÿBہö9I;u7¼ê^(åŽ÷ÎûûÎ5þ„Îc3þ_h+삆×�oþOø;ð0´ðÆ?K�Ÿ
‡$Îæ×UlŠcÎyÒ‚<à<S`‚OÂ8h,â~3a.L1õm†xÎè¢í”<­r4ýý^ùýSɍ–­íR`úv….Ё¸h™½ˆx†<Ìz™w?‡xé))°’³Í¥\¢c³|«ßR©"FLGî@B:èvÛ‰;ŸÁ_&£L"G*&—kɽ==/§¬úUðý-îÄ•”2Öi$—É'×J¦“Íý©ÆPßÓݵšToZ²&=Z󪵰öÇÕÌÑÝ™!ÖÒÔY"Ngië4¤Lä„‘»SÍíGí7JÍ} F{÷Xíù.¤Ïj¿Ñ½F÷°GµV×ª~ªÍPìáMð^Dˆ=#ÄBîñA’Ú!):¯Œ°†ï„|-B,!ÏŠ0vDr¡›!MKŽÖ&Þ‡|*÷Þ‘6ÖÞǦ’k}Ì”Ⱦ"’n¥_^’–
-Þt'hзB—ª ü5dœÂ*‘d…ó¤YEîE+ݽÈ=Ÿ¦Y ÍíÔ{ÁÊàÌçÿ™vÄ™OwÝÙºjíôÚÊ<¬%Ø|€6K±“þrÀüA:Þ–4‡ºÓÀ½J–4Mn=ºbtCÑ=@ý`mÎ>l<“¹úÒf
û�ûQ읃n”PVèœ,Iq²¼5à—)š�9n•í»bwÅsè§SÅ”‹µ=ªÚåÒ”õú²ªìlÿž¶fÍÄe)šáèÓ<ˆCÕ8çç\å¿öù
-y@¦nÏÜNcTïWÍGø§ÊâuøF5]àõýw¿ýoô/œ|ûßI}g°NÙŽxÅ£
q[toj¯Ñýš}Z—%Ñšè–è}út•åsă×ÛòL¥-÷Òö÷€Â_öÍ~O:×/"w˜ÈžŸ‚šrjõzx¯d†ÞfîîEÙȺʐân€uF*öù4¼hÊ;§ê-Ùäë³Á×Ç/Â°=ª³;Jg9MŒ|^25eÄ÷W¹SÆò΍•õqu²6Ûô‘×a?̂֐)¦ohieIkºŒ²>áÍŸ)}¸G;óN··;Iª}$k
-u®Us¼!f¼<ÿxRŽõçŽ9 ½É¥:“‹öÂŽ™ü÷<îåfš‰z<Õ_½[9Ö‡ä7Aþ5?øLEõøÉEcχá�<{Œ|Ç°ÂÙi­µ¾ÇšŠ$O“î^–Kî
-Êç‘ÿRž!åc‡Ñ­òÝÍþóê+ÇzNùíÉ›>«· œã+Üùµ¾1”k»_bj¿Â½b
†|÷?Ö2âÚAbk|mnåí¹]ïQÐ;´® ·"ðĪóÞ£sܽç*ý*à>u@ö@÷ºRÊ¥Áï–é»ÜÎv—×u¿½ƒF·ÝNŸ?_÷†¾«Þk˜wÍuóf¼5ÙÕßšÊñ¢o΍tu¬¥–3۵ܷ«lÞ¿R,¡tA÷TPü¤òçXÏT­ç¹ö»HÇA7}/ā뙌mÚ»§7çÆzÞbEuA1f€®ŽË;[ÕuÞÙ7ºjÿ#êŸýk4ÿyt確î”ö3£»áÿî§†4÷Ây'Wqƒ7òè¶Æô–V÷‰ä|þxî¸çýoÊÆ7ÝoªÞoc{‰©o†W}²v½×ï ´/ÃA‰ #ÈVÈVÈ4d2ot+ìËpÐ=Ž<îë•õ‘õ‘-MÿîÈîÈD[Åð^¿Xû·èëü­j™?°(Ní?Îç» ¿ZýÄ-öÿ¿­£¯ñåOOÖ@éŸ51ý“©Üh!,Ð}OKtµÓÉ6r‡ÏÀ·—Äð=Œ€·a1ó1³B$'Rï§"‘®ÜSÍEê“54Cl·o=ùö1d¼ôåS?Ê÷é´½DÛuòü�F@*´7²-Üah}Œ>² Gå:_áŽRw•¾£÷ªºã{÷œ~¢w•9§ìo½Ù;+rß…Õ†™zžÉC÷™Üg7|ÇÈ{T¿3öò¬1ò]˜ß„
-Ó FB!9_oë0ë¾ÊšËÉÑ&KòÁ¾vcl¿%÷ڍˆ%šI.m'úÁ(;A²í2†7e ÝTî"ço·³òí«V~è‰c_«¬.ŒsŸ°ÚÉ$G$NJä[3ΣÁrÝ
-¥·?ô$ï{…ý7˜\Õ¯&ÑñØïoß¹v
-9’a<ô1|‹oŸ#ÇÂpx~ìqí×ðŸ,—àUÒ=l%°ÞÛC+áÚ_ Oå“ dŽ¡©÷2¨q2”½œ"l4–Âc°®@ßâá‡2Ì~zXY0.Á�Ø,Cìä³´›eÆBïä#»Á1ô+³™s—‡ý'ø�®Ãà$3†}eUsë±gÝœßÕœƒáûøŃÈ?Â(0$ûÈ«Áë^xÁ³‡õ+c°*à‚'í8$ìrêåö‰ ïVƒ=ž­,Õ{WRèQi¿Y¾oGh»ùKØ	üë¼YËR³ž3p·a¯GàþÞ†é|¿™´·K|ä™yÂï˜wº†f­[$N×)•$õÝiG]­m
|VÁjc«åÆfݝ(7wÙ£Üñü³Õü¯
-Ù]ã?/5>Xfþ³ò=eß\XTÃßæ!çÕîoÚÏ”o=‚/¨µœ…„ëý*êO¡mÀüN¢$ÙëÑAhõeÆwFWù‘ƒ_8¯Á) ³¶zõÐ\$¾zz@#·¢ÞxoÞ0÷Qß
-=œ†œŠ,…— 7uµê¡%^ûP1zìCûášÑ³ïðEÖò²$9$)Ô:RþT’ƒø–ÊœM€¶õøבöèþN¿}ÞÞÿË~ùÇVu–qüýu퀖¹èÜ°;‡%ÄqnR	cŽØŸ”e]×z”–°zÆ9´wmïiî½mW6èÀÒ°éɲÉÜ A£[âZÊ4$»D£F¦Œˆ8'q‰&ŸábŒõûþ0mpf“?–˜¼7ùœçy¿ïó<ïsΕíBîõ›Ð7{ÇÄgAtø‘¿Ž¶%(¿­mÅ¿ä¾®èsðoëz|ÌqßD…ö¡²ËymÃœ_Xð'÷Sti¿ó¿jª‘±ä ‰O[Á¶Î}ÐQ/p.!m±Ü¡})V‚�ŸÏa¾¿kĵإcJ VÄ48½ û²:ôÿuUÞbtÜqqÈ3lœGžAÉÏCVëØE0 QåÏ�Ü!q¸MÛUÈ÷Ó6p«Ž5gÖÈã&–žÕ¶Rvy
œ5ö}SÇ¥ƒ¾bôg ß4>’wê2ˆQ'mç£_àÐo&›ùoÌÚ¯cZÔ›Ø~Ô¬7>çâHÌ­róYÅU¿]ßA±,‹‘~yñ†9øOôžø˜ŽG€ÐÏAn…Džá/ë;äÀöŽ«ï2Cß'¸àÈcü‡hcðÞØûåyígù¾àO¡îgúÞ¨\�{ˆæ^NB_ù°¶…ºK2^¿kbvv°ñ[}ÿʸRÆÍW
¿@y¹Î/Òæï.þ{Ž<ç ñëJm±	v¸Kaé·cü^“'kßÜy._€<
-Y£c—Ô÷Güö|ý#è;Í<SÞs‚›Ø‘÷�óŠ�¶t®ƒD®ØGÈóÃæn'¤ÌØ‹ø5֐÷è—fN™Ó^¼QŸ‰Ë|ø+•s—
-Ø€¿òROå~ÅÔý:|ÎŽC¾¨û‹µ_¤¯ÔûÜèâsXç)“¿ù*$rÖœ÷ˆÉ™À-‡”ç—¶û9¸ˆ±›Ì¹d¼¼¢ý sº´…sƒö“À{ÏÙmì#óðí¶YßK^¡óˆúÙmú®«¸HužU9z\çÊ«ó¤Óir‹ÌGßC¹F÷U1$çBž'áwä&¶*‘9ß
-޵ΘFžI~ÿ|gyÿçN³Îmâ]¿ß2>~ÇøVî¥à[Cô—yùšËº;ç®ý[ÿáЪÿœÿx`¥W18ßt¼§cßöΏÀðï.o8ƒvø¾/¹ô_ÅY‹Åb±X,‹Åb±X,‹Åb±X,‹Åb±X,‹Åb±X,‹Åb±X,‹Åb±X,–ÿ{(!e/Ñu¤–<IJ#ËÈZÂêÜsÄ•­d	yFIù{h“›QÒº€~Üè.ôÓF_D¶’sèIE)†}‚®2:%ëٝFg¤Œ¥Fç¨ßktý„Ñ]è—Œ¾ˆ|ƒßԐŒä³Ý=E¿ºjÝ¿1ê+¦9¿%Šºý{Šñ¿®¯ÏWí?Ÿ’üP‚ÊöžlÁߝæŠ~4âçÒ¢ÿ@âcd’Ob?›ó£Üˆ?Œ–ál±',úùlš÷’|¶PÈbþt÷¬ÔV×ÞÙÜ’©ë-f‡¶äÓbRè]Ý’ÄÙÁþkiQU¾©«\¸X%v£¢%ò£|‚CugzãÅ|'ýQ¾·ðAû#
$%d„äI–t“R$>©&UdÙ�­®îC]Jr(µ ¡—OîA]LÖ@«C{äüø‚*%	䞺g;Z³ªu·šO®ÔùF s¨‘åÐÛ7k&j–å¬Z=ÂSö6c†Q_Äœ)TcÔR<¥.G÷«õ
-ªVΐbå?SÎÔN:I3Ú2Ð{QŸÅ9¶`ÆTí«€ºÕh•»Ëbõ~„q‚91o„^×2ÃÇ5f¾—U¿Êÿj›JcýØôõ¾:ib|Ý­,½ÐgEh´Dù8ùÙ\ç’¹Ðó~'JkO±=S·¬h:ÍbCâ±ýlhÊ÷f^c£Hµlôä-·6ÕÔÝΆQ\Æúe½$`$dBn'!j{ˆª�dz›¼ß¶¤¶KMöe<ØN<ã9dÛNŒ‘ZÛARÀhãɆUÞÑÐ;¥é¹/zûTÍÞ)ºa
-Mߧëiµª­žª_îÕ-¦
$ •$¤k!WC®‘åÚ¹ðý¿­òþx)öþ2ë{—Á%Œ~û­Ø{î?
ßÞ
ÿü)|zÍ…Ö£¦/ï]º÷‘À{xOàó±—ǘ\ìå0æÐxàMÏŒ³ƒc±7†Šî$ötØÅ^„ò—ÂØ›ø"
|o[[ìµÕûÞÝwÅÞ](75ÆÞf”Am}ÉõMÞ«tä¡ÀûJðhx 
÷ûš}ti°$tz‚^³bNðiAG•*›ÓbFðQqX°VÑ%z•eáâàºpQà†4 á‘2Z[F/—Ñcµû¡º+V5º´Ë¥5.JŸº©iÆ¥.=ìÒÔ¥­.-wiI9¡3ä"™%ü(™ ¬ÅÖ:Kæ›&±ÐJ(:•%!XXÎè»Èf?Ê&ëb)ckesŒM3:Êh+£èÄOSù†ràÈ#¤=Ó|Š¿³µy²ä¾“ôÐäÊmòYÛÖ9éš$açŽí'(}²ãàOŠúæÉŠmÛ§ø±cõÍ“±Ô	ª;
-òWÄo0“™×ïWj!=#«2™ùVÙQ•©|’L†ÊgAõœ×Q¯úê²þ½ ',êed/ÙïÓ÷ÿK€�^£*±
-endstream
endobj
31 0 obj
<</Ascent 1056/CapHeight 711/Descent -271/Flags 34/FontBBox[-416 -271 987 1056]/FontFamily(Roboto Mono)/FontFile2 34 0 R/FontName/YRUVSW+RobotoMono-Italic/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 528>>
endobj
34 0 obj
<</Filter/FlateDecode/Length 6503/Length1 13987>>stream
-H‰”Up”Õ>CH	вÌzw—Jv! <ÝMx”¤Ý…Vv³IH"©R:¶øjJ­ÂX§L-Pìt:"ÞPµêtZ”§’�ò°Ù’ðR*åµÙž“"tt¦½3ßýï9÷ÜsÏwþ{Ï€4x|³æŽÈûèH{¾hN	‚áªPuÃ
-w+�N�Hò…Ÿ^ªnï›ÐcÌÿ®¢zQU´_Àä¡�©¯/Z¼¢bP¤÷p€Ìí¢Ë­,•ÝÌÎÈ�°^û‚JQôºÆ§e‰<¸²jéò¿_ñ†È3�Òÿ°xI8ô[\? §Cöh®
--¯¶¼›¦�FÕ‰½z"TU^Ò¸zŸÈâ[ª—<µ4^•ô@þs¾úÉòê1?/{ç%òV`c¾�ËzË(Yñ@×—BÁÝ­(žjéÅ”«W<ùHfâ±äÒ˜øN.¥¸a–èŒB‹NØ™™CÉ›ùíFRQÂѳAô”¼Úa%l„-ð6l‡]P-p:1û`Á\œ‹q®ÄU¸7¡Æ+'+¡�ývÓ^:MW™¹'§³“kx
¯åM¬ùCÞËø5²ŒF±1Ë(5–ËŒŒÆ1#j|eAK†%Ó†¶É¶çm_Ø®Ún<ð°JUý•M9T¶ÊU£T¡š ŠÔRµJ½©þ¤¶Ø-öLû�»ÃžmnÌAŽ$Gº£¯c ÃæÈqLwåYû®íìŒÇcñx"i]8„á&a¸vÀn¨‡V¸qÌÀ¾˜Cq$>ŠA¬L0܈ïÛt7Ã]Âð¸0„;Ÿ†/ó:Þ̵üïãƒÂŒl#טjøŒ°Qm,7^2êŒãF“qÍB–>6°M²=kÛhûÒöOa*Sݧ”ʆyj܆›…á[÷0\ÐÍ°Ï]˺ކȸ%.ç(Þ„Ùñ80.ç
-ÓÉC@øõpMp#Þ?Ν×:Ûp¬©êwz *v4öÇØ®X­ôoÆ6ÄÖÇ^oÓâSM‹X¹}ëöu€Ûï¶
-66ÈꞐñ4€s®æÍo4ïoÙ¼÷l4êˆÎŠ>õ6]ŽoêˆæE¹ñ†¼Ã‚e7V6þ0òjãœÆìÈê3Ž,‹<YY	FŠ"îÈ°†])h¾Þx¢¿ëÔNv³³Ý…àÝwKq1|KÃùÝ+¥ÿM·N˜¡äˆÄMÌ´nþ·ºôM~éLþÆ|?ÃX‡õxÁ*Ü‹§ñF°£Ø$÷ôgx›ñ¶`+üVãylÃvìÀxžƒçñ:ÞÀ›xoc^€±Sî&ÁK¸‡wÂ/pÔÀ/a
¤<E£áW”Or¶ÇÒ8*¤ñ4^†_ÓDšD“i
-=HòÂ+ð*Q1M¥i4fÀZXG~¹
? Çh!q?~Š‡ñ-§ôSz†¾Gߧù´�Þ‚-ToS=¤Cr×Þ¡t’@Ó):
µt†"°á/…w©‰ÎÂ{ÔïÃ_éµP+§6j§º�§KtþAa'|ŸH]Ú
{`/]}°ŸGÐ5¨£A=]§t“nÁA8‡)ƹÔ	ŸSŽÈ}E8ÊÇäôœ`¦Ûp’
¶p÷àd¹É)ÐÀ©Ü‹Ó¤ÞµÂyhãÞÐpÓá"\’x…3àîÃ}áK΄«ÜGrèäçûø~þD@Db+çñ d4ÐÂ'yÆLì‡ýq�çsT˜!áF>ÁÇ¥Ö|‡a7ð)t¡›óç<†Çò'¼‡ã>Íg¤âŽäݼópŽÆ|,À1<Ž¥šîãñ<[ù<ïçOq,ŽãÏø�âxœÀÇp"Nâ#|”'ò$žŒ“q
-Ÿã|=å&®ãz>ËÍèå‡x—ðL~˜áYX„ÅRÁq—ãTœÆ¼ˆÛ¸§s%wðøq,Ãr¾ÈpŒÏüÏgû5xÍ|ƒŒB©Aó…²ìŠ·¾xGçô®÷êk‹6
-ãíw¬Ú-»Å®[¾Ç®éoí"›v3vy§Á¥4Ìó”*ù�zÏ.ÑIsçûõh«V¨šy~MY¡“!Âag©Õn×Ðàum“jã
zÜ]Z+Üš\ªLé>mdÏß6S¼Åáâ9üv§ÝZãWÚçóÛõ”€Ué±æhl  j»ŒBez¨¨º%¥sÍù\Ór‡Ï¯$ˆšÒ)>P4ÊœK1Gæ¨ h
«Æœ@À©Áç/Üš]JüY!	ÈâõùµÅéÑIN„ÐtkÃ唸TY­¥Ô£Ì™®ÍÍ^Áâ°æavÑ{Uªßµ¹–,¡5ÛôYCs~g@f§ÌõË”Õ$Õ½³[[\º‡7g›<¢‰Ô$‰èô8%ÅNOHSi…Æ°ì¯-Ãܺ‡K™A¦zÃPªLzJ0`š‹A&»¶õHo±g˜ýN²{ºîM~J—Ì‘$ô¬ *®q†Ì‘ÈXÍlje• ÿ¥æ,g¨¨k‹ÔoY®Ë*°~MíîE½\	BÛRS¸Øo·:íav·NsÕë²P‘[÷v‰¡Rº—÷!s¹œž€N3¥9"¥‰äÖéâ&#‘%˾º·7¨j‚J÷–¤¹u†«äQ­QV¬ÓʝËݺ«d¶¿dn—Òj}fBß×UéÞyþÚôt¯ÆG§ç˜‡TŽ®§¶—Ùý›õj‹i#;Ã眹Ø&ØØ2Î`˜±16Ø\¾a;`BŒ;ÎÅH–\!—ÒÕfwu·»¥iµ©V©Ô¨RÚJ›>TÛqúPUÚ>4í[Ui¥>µo•ªmÕ§>Tmôÿǘ°	ٍVEÈÿwÎ|sþû?3µð£Q+d‚sfóex_ô¢ÚN‡·U±½roÚǝx’ûÓ°ûùT½ exY–!Z	?€§çʬ’2aÉ©¼¶[ŽKImeõ—J ~µ¾ž’:¯”Ê{DE»®Ø@˜,à›Yñhj™¢´BœQÚÔ2‡²I-ó(÷ªee³ZQÚÕ²å>µlDÙ¢–M(;TÉ«Ñ­SKMÑÁÖª­Vù
-6î[ál	lDé�Q�QÊ`#Ê6°¥lDéQºÁF”í`#JU•Âz©yTP[_’ŸRBO´ŠõæU5¢y “º ˆÓÒ2!ÏôÉ8ƾ¥äÑ|[é¡V­«³,ÐÆdÆ:ؽ=2Ï_ö«R¯no�x4ù¼è°•ã>±>ÒGöÈ°ÜWöÓFð¨üƒw¶
-{¦Ï£õª^[Ø£¿Œ
-E8ô¤„X’WJcóB(GWVÒrº=cÆ"ttÒFèïƒ)c…¢™ÊüŠW–¤ð
-œÕÿô²ä­œ¡ñp&°$­„ýÌ?d'Ù2×\ˆã4Â4•u¶œ‚îK<ÛJ%œC•aÏ¥9Yã3sp™%fì€K8ƒž½gL‚Á,§ ‡2hH_ t-pÞJäÊ´ã¡Á!ö”ðÜ©p"zäԍ€ßleÊ=Õ)ÀÀ'‰&¸6c ‡!4ƒú¶f„摤”œFe˜­°2t`3¢d*ï•ÂðlD‹77%´¥rÑ	«ÑíOßJ¢vªàÍÌÈXÆC›$ª©)áãùY«©VeÉ‹QKÁ`¼e/µ@F¶¶³Û·£Ÿgïȉ©ZŸ²ã¡qUëWV@1Xû<ÒâÕ¼@MlUX5ºX\2”ºš¤rÜ
˜á_¡Óÿ¯êCóq¾„e!Ûòí(lÚ˜Ä`TýO¡ÿy3�›~l¹œ—+Í	OwèC³Wë^<ø‚ýQ˜¹ÔbÖz©ZD£–„¸J)x”Uã4®b9j€‡Ô0g�L� «¨¾“ ïL"'	 ‡¯"ÁrL#'àrE‚<r“�p9ŠÈAp9N 'à$rœB‚rÌ 'à4rÌ"ÁrÌ«ÚÀV˜ÏàBtVG@¯éõ‹(,Tmp‹}:û¼Ž}AGH½¨já-ê%\èÔË:Bꢎº¤jC[Ô+¸Ð©Wu„Ôk:Bêuõ¡‰gÕ—§¸¢ç5®-ûõê3Åyn†oÝ·á^$æh½À1Ž„gį§ÆF¨"³rØû«Ÿn\“˜ßÌòAùÞ
-wÃD³ð[ÒFÚ£Nø®å)ãá<®H8n$Cxž*5·Y”zÁ¸Wq8Bð
-z™ÛUÇ†aÎÖÊê8up¯ÍXYsÇÉÜ Q´s½éK“~Ó£š#ï—ç|ïlALœZê݈³O¾ÃvuÏ,Š#Œ)‡/ÇéÜýåcý¯ÝκõÖ¢#öu=ù¿ì‹’d4.Q¡c`%¡Œ,Á qÌ3Ä0»ÍjQä‹`z’{|]JG›¥]2›jó³l×Ý^.d[™ÍºÉqÓ{ËCKÇÀ™=ÉþÁ¹Cþš‡5Ó߸_<v{¶Ë(ø2'{£J=oš~O›=vg¡OxÄÛûóý±‹¹ƒ¡5Z
-ßâºÙØL,XŒ;m‹Ÿè§'€GÙà‡Åð|.j³&ŽÌç|e±…Ó¾ãqeîÑ…èðÉèð¾쐥�d·^¦ÜѶZJx:&PÂQ=
®†3„±!6Þ°§¡¡¡^46+4`9ÙÉ
-P‡ÙÀ]zÜüxpupýF#·ÿwkÿ ¿xÇM?ûþÆÇ4·Ìýu­Ÿ}:€ñvƒ¦_ƒ¦:â*5Ê1=âp…ÑEg„„3 •Ñqˆ{©3›öˆX3
€:3•w1ÙLŸœ¥_ûËšvæÚÆ狳ں ­w²?þ'Ë&XjrüúOÖz™yòw~7Ÿ%^(²htÈPÉ1Ê8
-¥HDŠ³àžÒtÆ@Ay’Œûºz]C¾¡6‹³ÓiÄÚtõ„Dó8,lÏæ™E›Ái
†Bî°™fkF.}fäõB7ÏwOœ¹úFø÷µ¢½o²[y5é¯Y5åoþ`,÷ÝùÓ”‰Ö²¦ÒG}7/M«o¤u 52Ψš½r0ua²OÞM&‚û(µtÆ<4÷zÖM™ïÄ7n˜B—‚
·XqüO´NÍ%”¸§	óêÙÈñ9~’($B¿ÑlÙ|Ô\CE¢‚è ¼ÐdcϏÙõ]úÌn!£½7HPí¤H¡NÒ"•ÂÏ@°"-ÆÆí­þKy£:oÏKžg}Éól/yžxmп‘ŒN&_tfËKqñÜ—;²Pù‹Ö8=n·Óì2íŠyX°Y­¶P€Ó‡‚;œ	zm	¡€hiålPGf—K¯¯·MÎðä¹›Ó·}òGê¦ßýùBð\)·ÿl×Í©äÒt­%r§˜¾x8`
„WZü£=ÇÞõOï;?1ucÚ_Ãö'¾õÖ…¬ÊX"½üß?Ïÿt9ÆÑf_Òs9‘e¬cüBìT$ÎX÷äùå7ÛóS‡Û+¤é?ÓYƼ~û ÖÒqx|&<&&b#žh'x-Áá§3<¢7.+T…KnÀIÞÂÜv!‡ÙAƒÁP°•5ZDƒè¢M¬ù=Ú²öA{gã.½Kþ&wËî°¯kˆX;sïû7ý¥/Âhý¾ö&°~h×(LVþ0̬ñUÔGÇ*ù5ƒ^RÔGHº:BìQ›@y>’ѯ‘mW
-ÑZXÚ‰½ÑÙèÔçKµ‡esµ«ÒÚùÓÁâÑ½¦««WÅ]ÊD¸kz,foõWüàÚG|{)Yº“[Ÿd?LuPº×i[û?�¶þý2­ªˆâø™÷æ½¾.´Öbm´±„E V± õQ‹´b¡”­
ÝØ+¡à—ŠKÆÄ%Ñ€"‚‘T U‹DT¬Æ%¢Aq'"òAѸQ®ÿ3sn{½RZýÖ7ùõ̝;wæÌ9gÎL[ k%rOͶÁšˆé)E|°ëø)(Oå¶ÃÙ)š´«°–ìMG8a
üF«öåÑEÉ=’#8•UZ(ÒsB ÅqЄYû¡XSp}NEvvNÅ%w¾4ò–m»Îï7¥b.Q‰©/%&+µìÆÖ"=¢apáÐ^Ðw3ô}Dçá~ß+šC!7óaæ†ÑRSÓ‚‘sqÆqÎÏRÃI¡>jãžÖM+Oþ¹Y%Œ^üW³Ïˆ#fT胵ÎLù+%FÌ¿”{¦f³üpù‹ÓN4´~w(²ýâÿðU¤ªõc¢øš
¿¿wÈŒãù¿ÖM¶ÆÒ¢ÖBžnËÁÕº)Ðí×¢þ4؃×õ‹ôÚWËó]¨ów)àbÐ<–‚WA=x}PWù¨¯w‚Yx>òÝ䄼
-Ô€lP&€
-	¢VÓ§ô‚ÙÒo:&ýšh.x<Š±Aîi˜/Ü‚úŸà{ÐkÌ‚¬£Dçe käï‡ÈÜ7�î—oëÎÏÒýœßä›±Ý^°
-l÷‚0ú|y%æ¾ÄPo½QgÝoñà,0mXŸÓ"ö…m¯k·€9Ö¦šíÜj<X�ÛyTp¬]ÕW 폁çÀ`¾Ãáùï†äqF€<±Ó�“>¼®>²vØÉ9y=*ml¯ë�ÖDl×RÈ�˜)þ˜+vP`%Þïê5ð2l¿"¨sìµkV):¯uøô�GuÞ‰] }WZ{r­Ÿ=Ö÷Îې}·kPbmîü9ò$ä0MÞq\Á¼ò~°õŸDwŽ!ØŽnSåy˜Øå5‰½g´‰}g'd:Ø):�g;Ø*qÌÏïˆ
®�©Â&‰)¶ÿ8ˆ¾j³/h8(Â3üæ¬G}¼´Aç#;æ™á}[F‚§À9 ,’ñ/—µ‡ðí—òŒ8wöJß«¥õný ¿³¶ß²}q46åXp¾C[¶ûq¦ÔŶÈt¾õ‘ÙÃçIÜäÉ+ÀO	*,¡„@)ØB	'¿Àí™÷Ù‰ÁBa¬Ä[Tü±A|–¸c#¦Ì^'º,›?êÀ±e9¸VÆ
Šm¼»*™—ýÂû{¶€ûƒ= ±þ5~
j»w—Û÷œçL¾céá\Àûî8â6
-d`¾L›[Õƒà¼\ìËûûyHŽoÎ3؏
-9H
Ö&®ö„*ý÷è&m÷Á+ Éö¡{À›àfm÷êËb;äU‡sEƒø+L3´ÍUl?ÞœÇ_°º;Gõû&ÿÀ¼°³bŸ�‰}¥Cä
ç-²6±m|Às»9¾èÁ~©’¶I¢;û)KtàyyÏb\zãþ¨m>Ÿês{^)ÎÝ?€O¬¿ç±ã6ÿø\µ‚YÃtYkµYŸoûp&Ìœ|¦ìµçTG˜uúˆúpÏ,?s}ì[uŸSµ>nð!çÓ¿XõOøl2´cû¥Y×ÒÓÈìP¡9ÿ
-EÎ$ë0ä4Ò=ïÝs÷t’sï{¾pÎ(“wmºY¹ÚÈ=~ðÊst{®òK>[DÎð<ó¹p{¤ÄŽ‘ëÚêŒtÏÈÎä<‘¸Ï˜;Å~¹SȽ†ï~Ég<ŸéæŒç¼ò©…uà½Øf–û˜ïÃÝ—~î÷ÑtŠ±]ŠN1Sã!ûsûó„—I¼zey˜áÃÍ'§âa»7¿¸8CétXªt3Ý9’χ#žûl¡øÍinóß]_“>ìS>‹87
³ã™»ß½8ù¼Û,Ò}W!r˜ÌéÞ…Ý}Äû$OæWýÆHÿ\Ñ+SôÊÝjD¿яóïááºýî»Tb1,ïد÷nʲz™>nüú¥Ä³ùcm|ª·zòÈzñ}»-…<:»ºÜ+ëuï7ãu{Žb›®±¶0g÷z©ûsžì™¶\Å÷‚•–¶ïܱsenWºù½¹rœøR‰
ü’yJ·Å§™Ÿm¹ÌÞ1ø¾×Qnþ¯d—swGÒŸ›;Ê¥I÷‡ÎdWó¦_zò¦G÷ߝxðÊŸrì¯õøÄõ•+yÿybý_²øÿ¢ÁB’¹/7ã]3çbÊ¥á”	úSoçç#ÚOkœc¦§…¦~ªžºúëMµô“ê{ÆezËgí%¨PF·•'¥·Egt—îÒ]ºKwé.Ý¥óBŠ(xŒÖP:=@!
-P	UÐÍ8Ó¿H|œ‚ü–âi±‘èH|10uz†Ôèåpo§T(u…֍RP2}"õ Ú¿•º¦ÕSêaÔÊK'O™8uPi¬*V+Ž-Œ
)ª«¬W}¦ít
ÅhÝ
-íçÑšKu¸ï\Š™/ÁÝ'“Æàmíµ4OE´ª)µQh©…,mûj‰yš9c-Ãßô,GÛdÜ”&ÒT„zŒª@(ÁŒZG•mÆææÐR<Ub”3ýúÿî´9g>ÖæzØû»Þ.-kTjuùVµ#Bª^ÔHáüm4fèš.âz4¡Xˆô‹ôŒÓiGáœpŸiHÈߝVŸ¼'~O(
-¯Ç£%97ÆŽšbZ‚TÐØW­˜P¶5º¢¬1XSÐ؏ŸvFêÑՓʸK9~<öÈÈ€HzœNºh»rîÛªW5ðy¨¦ào�Ž¢ï©
-endstream
endobj
30 0 obj
<</Ascent 1064/CapHeight 711/Descent -271/Flags 34/FontBBox[-758 -271 1016 1064]/FontFamily(Roboto Mono)/FontFile2 35 0 R/FontName/MMXBGU+RobotoMono-BoldItalic/FontStretch/Normal/FontWeight 700/ItalicAngle 0/StemV 136/Type/FontDescriptor/XHeight 528>>
endobj
35 0 obj
<</Filter/FlateDecode/Length 6069/Length1 13295>>stream
-H‰”Up”Õ>CH	PYg¹»K&»^!›ð”ÄîB«»y"©¢@Z|5¥Va¦Î8í�EÛéx“ªÕ–hQž
-ä`³!HxD¨È#›íù7C§Î´wæûÿ{Î=÷Üóÿžó@¬ïÌ9ò·bË¢9%”T«ê—¹Ïà8€8oÉ‹‹U`[j/€«eýwåU*ÃýêÛ�â‡$¾½`á²rﶺ¿¤n°x+Ê‚¥ßþ1Åð@²ØçVˆ"á…žn‘‹D\Q¹xéƒïÑz‘ŸHþÃÂE%Á“×ëw<”(g4U—VY>LuUìÕ³ÁʲAW½	0\üQߪEÏ/ŽVÆ}c7׫ž+«õÂX9;g’È[€Í´,Ë;–a1¨óÍ¡œ ûh�Š¦€šoz1åªeÏ=â3‰/Ž~Å”©�×Í”ly³33‡’7óÝŒ¸Â˜£•™ô”¼Úa9¬‡M°¶ÁN8�Íp:0û`Á,œƒOá\Ž+p
n@m%+"?m¥]´‡NÓuFfîÉÉìäj^Íkxkþ”÷ð~>ÄG4c˜QdÌ4ŠEÆãUc¿qÌßXÐ’bIµ¡m¢íÛ׶ë¶[ƒU‰ª¿²)‡JWY*Gå©qªP-V+Ô»êOj“ÝbOµ°;ìéö‡íO:ÈçHvôutØ™Ž©Ž€£,mïÑh$%­“¡‡0Ü ·ÀvØupÚ Š)ØÓq(ÇÇ1€1†ëñax›îïb¸S†p—áËÂð
^˹†ÿÆ{ù 0#ÝÈ2&^£Ä¨2–¯ŒãF£qÃB–>6°M°­´­·]³ýK‚JU÷)¥Ò„a¶s—áFaøþ=çw1ìӍaiÃvaˆ|‰›£ßÈhÄôèv•{…I‚x! ˆ}z¸!¸íåŽq´©ê(é(€ÊÈÑÈ{‘‘y¾Yy'òšx›lZDzÈ|Hûö›�í¶6
-ÖÉîŸ
-ž•ù€s®¦KM¿oÚ×4¼iÏÙpØž~,<#ìi¼ÛØÎsÃ-¹x‡Kži¨høIè­†Ù
é¡UgþZz1´(´0†Ü¡Œú	ûi-¾ÝxlïVu‚“]ìlÝè^+XŒáÎë²X.Ïßvé„JŽH<Q¾`†à¨ Ypû?=Еÿæ—ÎtâÿÌmø%îÇX‡ñ¬À=xÏ`0ŒR§?dz؄ç°ÏÃ/`^À‹Ø‚­x	/ÃËð
-ÞÄ[xï`;FàUx
;¤6^Çݼ~‰{¡~«i8eS€_ÓHÊ•»=šÆP¥qðü†ÆÓšHù4‰
-ÈoÂ[THE4™¦ÐTšk`-ù¤~LOÒSÀ}øÆ+´”–ÑÏè%z‚~Dóh>¼›è�l¦::H‡¤Ö> t’êAÓ):
5t†BPK
ð
-ÇÔHgá#j‚á¯tŽšé<] ‹ÔB­t	þAWè*ü“.Ãø>—¾´vÃjƒ½°‡Ñ
8@ßBݤ[t›îÀA8‡)ÂYÔ_QŽH½"e‚cr{N0S;œdƒ-Ç=8^*9ê9‘{q’ô»óp.rohV¸ÄÉp®Hlãøšûp_¸Æ©pûñpî<�¢|ßÏð@D$¶r6?ˆŒZø$çðLÅ~ØðHΕ3„CÜÀ'ø¸ôš‡03¹žO¡Ý|˜¿âQ<š?çø0ãÓ|F:îpÞÅ»1spŽÄ\Åc8Oºé^Ëãø<_à}üŽÆ1ü%ïÇ<‹ãøŽÇ	|„òxžÀq"æó9nÆIXÀanä\Çg¹	=üOãé<ƒåÇx&b‘t°C\Êe8§p9/à‹Ü‚S¹‚[ùi~K±Œ/ó%\ÆŸáKÿóÝAÈüyÒ'æʲ+ÚbÌŠ¶vLíü_}ocÑF^´¥Ëjg´Å²Ûð~'ßcw­›7Óîšøk阳ˆl
.¥a®¯È¯ÔôO ÷¬é:nÎ<ŸaÕCýrU=ק)-øi<ÄCI‰³Øj·kðkð8k¥Ûxn.­ånM.Uªôv¯6ÒçÕÅOQIÑìù>»Ón­ö)íõúì:ßoUz´9í÷«šN£`©*ª.Ié,s=Ë´Üîõ)	¢:¨t‚׍2×ÌY®9Ë
X~¿ßª1ÓïwjðúÊü~·f—?FZP²x¼>mqè8g„ï×pkÃ唸Ti¥¸@™+‡›OmŠJ4gØEïQÕªZ|×dYÒ„Ö,_Àk
Îöûœ~YÍŸã“%«Iªëd·¶¸tOf­üDc©‰ÑYà”;‚šŠË5–ÈùÚ’áÖ=\Ê2ÑSò‰ÅÊô ó~Ó$P2ÞUÛ#<Eö»Éîéº7ù	^0SBÐÓª¨Ú4?D,S`5³©•U‚ü.JÍiÎ`aç‰?°]–]`ýžZ÷M½\1Bµ‰	\ä³[v†Ý­“\5DEº4XèÖ½]b¨”îåyÄÜ.g_'™Òl‘’Drëdq“K‰’”ȹº·' ªJ÷–¤¹uŠkúã¾£´Ð?X'•9—ºu×ôY¾és:•V»èScú¾®HöÌõÕ$'{4tr¦yIÿÍzÕƶu•ásν×vÒæËNì|´Éunl'ñµÛ|ÔNÛqâ8nâ4MÒv‹›~$éÇÚnëÇhhYÙ&Œ`B“@HAÙŸê:¥BüAiâÇB¢ÚŸVˆ²Äåy¯í4kS&¢¼~Ÿ{ÎsÏy?Ͻ¥;œÛJ?ø1¸™<S³9
-¼^FziÛN·†ÛJ¸©0O· öi$OÒ°?ÑO§ê)	ÌáeYC´’‹¯àÀ3såÐYŽ‰ÔþY£JVSÆe¹†zVç±ý­êjÎ*Ùððò|ÎnñKþ¦V„©¾9ü£NÏqÒNÄ™´KÏI¤ëõœLºAÏ)¤õœ…t“ž³’Þ¦çl¤·ë¹2Òº4øá€Ñi‚Ão‚—F³ÎŒ
-ÿg°±66cm6’vÃFÒ­°‘´I·ÁFÒØHÚIû`#évØHZ×Õ¨YjÛVÏ«Iäg>i¦í£S½u#à7è¤(â´ú”Lh}cÿ•R
-;×ÓÝƎΜÂëR³8†ÈÁ®‘yrº[Ww™öö€ÇSOn‚ÛtsgΟ™GöH\ëËuó:xÔÿaðæö¢°úÆ.=芌Ðÿ¢¢FJ˜Ó£Õ45/B9¶¼œÖÒèöYë8ÑÑ!Îëj±N'ÿ&Å(KúO,5U.c­þGÓj°°†!cM°Tcžú=1={S¨’ÚtSx¥Æì06œ¦šÉÖFÑ}ÉÇ[ižÎ¡Âa/’óÇ5CJ.Ç´H.4ÏÓôø=0	³6ŠjØa~A™»`½M6Ñ
-§ŒGì”òĪX‘<ò˜FàwªpÊ=Ú)PðIb(Þb´(B3`64ªŽjiÚŒ²5CF#ÊöÏÕ(ždqqP%[J!·xp5¶ñé[HÔf\ÌŒFe+Z,¥fžϏ»XJe\×Ô Ems4Ìy-pp}xjãpâÓìM9CºÑçßtÑaÝè÷/cc*Xû$i	AP“ëVŠ.—†R¢I
-ˍàÐÀþJ1ýÿª>2ŸÎ—¨†#dC¾ÝÙ¢)
-FÉÿQòß­PôcÝå4\®+4'žîèCGÐèE/î~ÊøÎ\^ë0vëF*CQK!®ê(e¥8MèTŽFp¾‚s`€Ø«¯psd
-À™&N
-`†8ö‡À~â8@œ!€gˆCàYâ˜%,q’�‰C`Ž8‡ÀaâŒ!£Ä!0OÄX$cÄ!pœ8NèFd=Ì'éˆ=g¢A Sf=á"‹Óº1°Î>C&ûyûõE݈®SÏÒ…I=g"¢ž7Q/èFlú]˜ÔÏ™ˆ¨MDÔ%ýf™,J/OÃ~Ãvڦ.—ž)¼ÝÙñ!ð>^á+™?Ñ^nåø.ãã_©YEŒE3^+b|ŽJVépÔØ-¶z?w8Ü’æppm‹ÐbÞûO>»¶ºç‹ù¿~=vfluM1Öþ"Zþ=ÅßW×~ ž[;œ?Dß	‚E~$7ÉSLgì[Ã>5{Ÿƒ>Þ­@gÍÁD;“¾ßøyØhµpë1Ø$Ï1YNgʸÅÂæl
-ÌK±‰¦„þtª+J¬x3éÙ„3`¬§+0€þ6»§ÓSnkð»½Þ°ÅâJá¸Òã
-‡‚ÂçµX•¸äjƇ©Åâ²zœ¡pØ×Z)¬–f!nÛ$>xmväÊ\·$uMúü+±ïWXj:â¾Ñ#•ùû–ƒW<}à­sýe™²²:ž—Ó¯Z¯M†¬rukWcWãÀ çé‹»wŸ	cѤ/îwq‘L‰ƒ¯ðqÑ}ô›‡ó;®Dìï‰xèÜÞ1ÒÛl®¦(6æ÷ÉWE?dßÉ
˜³œ[X!tsY©ç’Œµ$e¼ÉœàONd·©ŒbÃ9céS3n©“$1‡0	Ä·
ÇÁ`†cøZ6Qî	ø|‡×jkò;âŠËét…]R¥„ˆú¸pÆEØ°v[,Í’Ñtx½>/âyÂæÎ<ÿúä䁶+Õ‹×Þ=:³ø¬ûË™ÈâDïÖÊþ¯Nï>7½k»ÅÂk$a«õöw$OvÌÔ?9žôYEóÈò«/ìõIœæŸÜ={ãRLâ.}Èÿ“ȐîÁl_"|çô™K¯F[Ò©Á®.úzøïB݂ǿЏ¨žbLº«ü•±í,è„ÇÊœgà,ËÂ÷A³D.ÇÄD»§Õä/wKn«;ìv¸yo\ô„šE]m¥Ð,AÁÛDìßÞ¾zÝÇý/æïðsõþ~·Ú×ÙPß1µYý释%þqk_‡‹×zCî@A«èÏ$2íbÍ„ÝÂþŒºZæ¥,:¨cçÌŽM—:¶)áR¸,#s4Ç6Ìd¸t1—ÃS§™íl
…Ì*w;ŠeÄoO\?}äʨ³ì\þþY¥LêIžñ-ï¶<ðÖäQ!Æ_þÞ¾µ“â»;öô©œ÷w¯æåƒÍ7`ó›°ÙÎNfÌÛR‰e2G›¢ Í+©p•-ì(16'ì/D…‹ò‚õ4#óGÙDg[·”Û,ÌÎ튭ÖÏQ^•ÙÝcKÒ{½'zÆ{O…Þ?!ÿö궶™#§å)^U‘ÿ¨¢Š‹•µ%9²¢ïÚNö^ƒ½7å¼ýlK4pSù8~˜¹9âUSãl.?w…¹›k’G4ˆm<˵µßæÿÎ+øÐØ´¸ÿÉoäîcԝCK¶o¿}´*ú¶Åf¾rÿú^Mô¾|sîÁ½µ;6Õö&¡Î„9»l‹kw+;þà^ÞaSÍu6üIÈ+Dº |/´rò2¤cÿ‚D€¹™…üc
-dxr	r"Az!Èä�äÈ äMðAlÀW!‹äcH‡¼òðt-dRñBÚ‹ëWuºÈŸÙ‹ãcEÍ9!ý7 GŠö¾†µý4|a÷a×
-šýÂå¡BGŠ{Î…lÒ¡ùS­ƒ‡Çƒ‡††oìFÑ~ºï"ää<æïcÛyä$偺C/AÊÁ{½cÃÀ‚¾Œk`ƒþ!„üHákówwÿ‡ýª­²
-ãϹ÷Üy7ÝÄ’©¥9¥fmhS)æGcÎá’±©7]w6ÝÆüX»CW"Aɬa¥!iHF$^k0†å},(ÂĬˆ!R¢/ÍN¿çœç½÷åõΙTÝ{øí9ï{Î{Îsžç÷<ç™c¿©“øæWÈ�Ÿq<pÀÚ$g6`)æòþëÅî·:¿™_ ‡ÍÀw.ó•ø|”œyP
-ð¦ˆíïv¾WSÄÆ
î{j;ÎŽü„9Û€=°9ì¦~ÿŸGsÔ}ðJpNüë\yò
�vê	ÈiÎî¦WÎÁ¶Î„…Sí¢8ƒÚÀr€*e¬B8´8…qÏ.໐ñ{µ@#0`:€ˆ|_™£Àô_p\bòšæ9á
-t2Ç€Ë2þ9úß;Ðːg…·3ˆ!³Nø[Ðd<ïÞ=øŒcÝžVïÜÌ÷IÒã?�ß9?šßd-æt7§e¿%ΆV÷"ùvœpþ3߬ãàœ€Ïò…¬õ©vqÈöªq|¤½�|LwȾŸ‹„ÿlɲŸsKyW^vRÞ_{G(ïÒ.Êûã‚㖍­RáY‘Èq²ÇÇ|ÌùÌùÙœt6䘴߬“ý‘¯ˆc~¸v1~Ÿè\*kNvëÐb±+s¼@Æçj—ºMÀ7ŽæMà¸Ø<¢d¿ýŽV?ú‡˜íô☁;!øZM ‹B+Ž¡×€íÀmx朼Gü‰¸Q.î™×
-|P%èkíòd›ã=¥m®!¶ïãÀ'Úå⇁·µË³ð©á=žw|³9}ðò!±/ûúEírt7çõGvŸ÷E×
è÷:©á,ÐÇìÓ.°íˤÏg®þòúœ7§ÊØñï5O|× üB^µ1×í¸jó#ÖUÇ]ÎS½â+äQBÞR|fpDÁ§!F5úˆU-öäýJd²÷Û€ùÑÁê×ãöà|9lî/ €wg±"€~±Í`ðî(?âÈýtºþÙ3̾ZÚs-¿†¹ßÊbÑ#“lð=³n¹†)ºÇä™äj®	ØwœÓ9ßÞ%sRº9¹ÃJoí€4ïˆê3HŽ¯ý"ô=Ï%™;¯‹Ü–êiå
-ñÁõJ¾Ë:…¤ÓuÍèò]w§[?ò}þ’ëÀ±8l|Î`y�^\ÑÀ+ÖöP–aF…“2ìÌ~ÌðÁ¯—?&ðòI&t»3xùŃÙ)4#…””ëæžOè6gòÕ³Å⯆åwÁÚµGüØ'súEÖÊ|¾_åLõ®Îã¼këJo¬^ä9#s{–N玓áÅeŸ~E2?Ð+_tóø[+úq>X&ã^íËþ чÇ&Ëw£qñóX7'Åß >Ûÿ7嶨&çO¾í}ôµ//}àÓÙÓ…ï\®Ó¼úƒsÁÎQý²WÌÕf¶¦ŠeÈy3©\ÅuÁF‡ÔwÞÚa®;óu:_xµ'¹î«’®–\Úºí¬«×ØÎÖ–Ë¥Þ::xnþ·ä5s÷õÈ`n,—%½ÿ†’Á¼èý¯1”ôåMŸ€­lmÊ1Âœ©ÓµuÏ'â«””ú1Å
¯¾ä÷\ÿ:ð·¦ù¡`ž†)ŸF7QÄ3G©Ÿž4}æ"՚è‰ñSMô_ÿʯ³N7Õƒ6àµP‰´niû²-Û²-Û²-Û²mèFŠ(|‘öP!m¡…h15ÑFÜÍg†ïB€QÊ¥õVb"çÂÀö5ú㥟ƒ^9ÏÖ¹xZAK¥¯ðö ôCT@ç¥Æûߥ¯©\•I?ýÕuuñªše¥±ÄªDW¢.Ñ‘˜Z•hoYص²}MóŽÑ|JP'mÂIÖP­¦.*¢TFÓéôj0šÀûvjÅÓBê fš†Þ<¼i‡Œ¥¾Ú`ŸZ![±ÖcøÛ‚™uhqªÂ:˨ã	Ztu@0£	¬Õ‚Õ»h%zk°¯ÔFâi%V»ÑUþïï®x3kñÞcƒÿWÛG'cñ¤R;¨CQŠRsg’rªz©fæDM%ܯ̫S³£ÅÑÑÃtT^ÔSuNY΄ˆ}‘WuøæÍGrD*Á\¼)¨:Œµ+m³oÂT¼]m]?P¹5ž·T'‹ù©?º\ªÜÚ¼4ÎSñãµçFïŒÓ#Jú”yú€ÞžáóHKõß�hŽc8
-endstream
endobj
28 0 obj
<</BaseEncoding/WinAnsiEncoding/Differences[9/gid00164/gid00052/gid00002/gid00163/gid00041/gid00030/gid00036/gid00047/gid00045/gid00033/gid00029/gid00031/gid00039/gid00048/gid00042/gid00035/gid00001/gid00046/gid00032/gid00034/gid00028/gid00040/gid00010]/Type/Encoding>>
endobj
29 0 obj
<</Ascent 1035/CapHeight 700/CharSet(/gid00164/gid00052/gid00002/gid00163/gid00041/gid00030/gid00036/gid00047/gid00045/gid00033/gid00029/gid00031/gid00039/gid00048/gid00042/gid00035/gid00001/gid00046/gid00032/gid00034/gid00028/gid00040/gid00010)/Descent -262/Flags 32/FontBBox[-162 -262 1179 1035]/FontFamily(Acumin Variable Concept)/FontFile3 36 0 R/FontName/GDVRAG+AcuminVariableConcept/FontStretch/Normal/FontWeight 275/ItalicAngle 0/StemV 48/Type/FontDescriptor/XHeight 500>>
endobj
36 0 obj
<</Filter/FlateDecode/Length 3419/Subtype/Type1C>>stream
-H‰|VkP”ç>»áWÇ]À|jmq*Ër‰ÁÖI¡²&5]±¬€ ¬BÃeÝ],Ng¬¹8Auë­ØhA4
¨­Ø¦fYcC§i%¦Õ]´–L∩ÁeB:DÛqdOŸó±ÎôWÿ|—÷ýÞóžóœçyÞOCQZÒh4ó
-Öç~3¿ª©¾¶a]¥£¶rSmEcC•ÍîR?eiBÙSõãKÇ17êõ¯Ú£Cžé¡C3‚sgÚfR2‚P<Í dšO‹)“–Q>­¤Õ´ž*©–¶Òvz‰vÓÏè( n:O½š­š[j«M¦Ì¥9êÝôTÖäݔϞ|ÏÉœ¼g›"÷¥‘ñ§#÷§"ã‘ï³–EÞ¯‹¼çäFî‘}²#ëL‘ïr"q³ÏGòÊz¼.²¦IÉ2eæ(ùՍ›lÊšíN—­Þ©¬l¨jtØ•.[µQɯ«SŠk·Ô¸œJ±ÍislSUl•Z§b«uÕØJ¥â°m©Åz‡­Zq9*«mõ•Ž•F™ùŸ×Íÿg+KYÛP+ok\t*•
ÕˆÒ¨îRÕØÔàrÔÚœÆËšl·Û”\¥Ú¶™ÐÕ×”$[M¿ÒìдYÚ‘'Þzb8jôüèK1ïÅöÇÞŽ;¿&~8~tÊâ©Ê´–„ N§Ë4¹£B-_ZµLXcî¥êÇŸyx0úa0fü™ñƒÑÝåú‡òþè@¬:>^:Þ§Ž<”Ùñ`L}è]½<«_‡Ä&pxß’\¦âkƒÌ{­z¦lgSai“â*aª	63Å*˜6MqÌÇ´™1ÌãÆæwËš™ï»íÌ]˜ç+.skY0.ùhzS<4†!½Ô≱ĖhæžCÌw
¸Ü“ Ÿv¶0ÿ‘=sÊìeþ"ÑÚʤqw1?ðéR™Ï–{b™'0@³°é
C{˜¦›Çæ0½Ø[ÃôuŸIó$œmìHu3½åÛÉÚ™
-w
-óqSr>ŸÞÇëÅåcîG)c’úe·=nfHì¬@ó�r%wióïöìgާ÷G’_ŠI`z֐Ë¢•éraêZiÁ‚\¯5š©Þ‘†0d.bí÷
-ݹq(ÆÍü¤Œ'Vº$B›WôÅ0YòÕõX”\êgz¡À„PY>/Ó‘Â8¦o¸‡˜œÿ1¦å½ƒq­X2½9¼oIcZ((·wö1}‡€‘µ x‡_½ÖÁtÜ›d`:Š¹mãVæÍ#ýh0¦· ѲfÌmZbgÎ¬CĪ…iê¥ürÓz
jzVR˜ƒ	¾j41_Æ¥pøÏØzr¡Å§‹eÚÊà^îÄS;’âv”Á7¥gs)ò„FÍ^TL‚•š}X:˜%9«½Lèa°ãÔXL+ó`°H
Ú6Îæð+ÆÁØ…5;GÐÍãΠMêLBÀ�vº%ŝˆ×?™‹À™³þÌ~pˆŠÊQèÝ¶š2ÀŠ•ELk“LÀS
-8Á7ÓC“õÑ”@[*SÅ°pä%‚†_kPp½N¸RÓdÇ[Ð
>ÛŠ_Ѹ!€RË¥üµB–£®~¦ýHv!ú¶€U,âyA
-Ÿ…Àš¢‘ù¬­kÊÕOIö J?~ݾ¤övDqX+ÍP1†\D”¡% À“è²æ7Ó°lqÃèeÅiaÇp”oœû×0€Pjï „#ÛÆI†`3ð/J·B=DŸ÷%ý!&3tÂÿîìCu>ÝO™¡dÊ(۞ʚùIˆR/ù<¿r<�¼é ÔŒ|™ë„Ý҈󧊄\ÉvJ}J„\tß©ÑËà<åƒ(”iñ?`ÒR.r©ðJ.gÊò@Iè=Ñßõ`ó°�Iü…ÒË‚®,fOäiš¯*n'¡Ir¿#Ô áÛ?T{Çïoö
-o8|Ãô/®Tì@téZË1Ð’²-m ±å$ô2SØ?·v—%õOƒÑ�ÍaÙcB@œR–‡ÄWŸ°Çî‹À†ŸJUZyuyæŒG1(œ>‡žsG†Ö_„`çDÀˆÉŠ~…WHnüņ1-¦Óâµ|ÙUâ.Þ£Þ±M¹£j�M“²Õ§dp–’,i³As�BÉ2“&Dþ'¶ kY|Ð#æµJZÿ‘ÂQ€B‡Å(ÎËëÈпaƺ{PU¬xïHYÚ¾¨p’’<ñWUåwEq¯;®!ɶ{øô6zŽ³ª–{l�8_?*$7Ðk¥.c«•Ù+q0Ø]�8¯Âù÷â	ÝnJüE¬9öjo•åé9üù=éÉIø~ ¢
-ô–“¥;=‚:D~ÝrRàxb®21WC¬d:ÇY.ÅRs–L¤¨O­I§R#lù\r0ù#§4OÆî;PAù]Sg'†QàÎpwÍfíóæ10uÞˆ‡Ãªúk€Ï“Lâ^ÐAäç~$ì퐲@ä½f¼þVôñ~)$Ð’m 3mË@sÄ
-à"´ÎçO8£÷Ôú#°/èì‹MXÇšœœ“‡¦:þ«¢ß%Þ‚Àùš›pÞŠÇ÷@ùü™~ßßÎøSX³LàúåÆe>�¨ìD~ô}"$—õH’VeLGÍ�’æIBO#Jæþ”\ŸøÇ`Éw|º½rºw¦Þ$äÀ¼ù†®Iÿ |Ù4ÓU2
ý¼Ö$q	kãÕÌm(žß”ƒ¤UÈV#íÜ"ò*a@¸_žA%tL,k­pôÇb܇ÄlÚ¥¯brµb[ÉM‹ß+÷ ?lÅç™âÇäObŸDôHVWE‚ð÷ÂoîÁX·Às%ˆÚ¾‡>R½ôCÈD&¹Êi±¾É.tEU•“t”VDÜx–¯Ĭv/<‰T—‹ÄÖK¤B9^$‚r
-þº´Gåùs¨ô¢fóN,<$tI
-F\øDçå'g@HtSžþ.²öéк´&»Ús1±3#
-;P€S*Eö<¨Âú†<N•Mò¤QaËÔR0xµ�šÃrø”HsŸS›)&‘#†½I„ºÈX4O	ìzT9*ÇdakÒlœ!b„³D@©r¸|W°~NtmÀo»ïˆ·Çˆ#Sùîù3ürò¼X%âo¶ø¡Ýf�Ljlß¼-d÷	ÛæÉÞ°Z:ìÄÄGî!hµ´	PŒˆ“%Ê’Ï„í×ÍE0¾"²»÷éq¯xÓÄeÅÅè¿<—khSgÇOÚÔK¬ØÚhä¤b½0´kééö¡³K[ð²B]gº7Š©à‡¢n[HÕ–îC{„-MµTôCTÆ0Rñ
-&µdlƒ7ÅL&„¡˜!ãÝÿwâÖ~:á¼ç}ßçyþMÞ%ê½êß(S¨x?P’Ê§6j‰7�è¥0«�ð]BÂG-#*^ÇKãJÁ£„©Fõ§v? 1µ¤µÞÃåTŠ,Ì„U°C…;ØΗܩ‹c|F­®Œ«Výà¼1ô‚Íf®tŒ|1F+:£»[yì’t¬&¾º8^ °¶æ$¸_ v–<eáOzÉ\½¶—ÔCA¤%ÀV�Û5sE	™Ÿã­/ç=ûC'tì:\ÍMïÓéP¸Uµ´ÉøÒ6™Ÿy	rÿ ¯ÙLXÏÏ9?-ÿ%âý5¬#ëÄ2kµ÷W$¥oÁ|PwðÎçÄ©n<ÂyŽÑ¨:èëi±A ß8àŸPUùyÉ$™ü4ø=ýIŠ>„ZS@œU8²–S®†¤¼þ¯*¿Þ>ûì‘
-2…?xùÚz¶ž ÝÅ"¥‚ð"u3¼ý¹»4·§›ŒçäÒrUaöÀ§Ð°"±ùšÞôˆÊ^£A¹ý*¡šš»€ó6·öˆÖäñ6el;'Ñw^Sç[XÞýÃiã	ÇÚ¡‡ï&!BùzY´us�º¹Î:MNþ†áßý1èýODkðD¯(dùÀj5§Ý_pMªø£¹OlœÉ¬ÕÕ²†¡è9¹úW7;ÏÆû…Í>^› ݃§ˆêW |o^¦rGX7ç\Cß"U“iåÁ"SÌãHâ´HÊ+ô¼È%tȝ
-ÉZ⫍õ	J"gm²\ÊŒÕ	ßíe2§I”ìŽT—ÕÿLT<47ÀwGZÅŽõ¤†fúP=–€ðŸ¶È9‹)§¦çv”a¡)à3ž9éÿƒew³rð²Ð	•ižáê÷=¿üi›%h¶Hn#‹””§è‹aÖTùeŝ˜Ø
-Ú]#k¶sˆ-4õ
-Lé&¼Éiá	ï(7ží=ÕZØO!¯
-R«^¡ß\"^@2iúT0Óèôq(oCYñçO¢F:čxñû$ƒJ+˜q-}ÈÇr¡|ð͈äçüî`´’lçÆ^_²M¨Š1"eCyF$pœ©jWÜ=YŒ»÷4ÐZ]R+Sg¥;iŠ·•A÷¹Ô×ëØíŽwø c/n*ùбWœoÙtܱWNVõû·ŠØP‰qJ{ÂçÕr'®ïëýN™k·,™_?Ïî‹ïÞ`æÚ#c‘΃óìšÆѶã…ß+ÿ`�OèÍ
-endstream
endobj
16 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>
endobj
13 0 obj
[12 0 R 11 0 R 10 0 R 9 0 R]
endobj
37 0 obj
<</CreationDate(D:20190909012612-07'00')/Creator(Adobe Illustrator CC 23.0 \(Windows\))/ModDate(D:20190909012612-07'00')/Producer(Adobe PDF library 15.00)/Title(LayoutSpec)>>
endobj
xref
-0 38
-0000000000 65535 f
-0000000016 00000 n
-0000000192 00000 n
-0000054694 00000 n
-0000000000 00000 f
-0000078655 00000 n
-0000078411 00000 n
-0000078919 00000 n
-0000079243 00000 n
-0000077664 00000 n
-0000077734 00000 n
-0000077805 00000 n
-0000077876 00000 n
-0000111366 00000 n
-0000054746 00000 n
-0000055147 00000 n
-0000111253 00000 n
-0000076022 00000 n
-0000077102 00000 n
-0000077150 00000 n
-0000078295 00000 n
-0000078326 00000 n
-0000078179 00000 n
-0000078210 00000 n
-0000078063 00000 n
-0000078094 00000 n
-0000077947 00000 n
-0000077978 00000 n
-0000106966 00000 n
-0000107252 00000 n
-0000100544 00000 n
-0000093694 00000 n
-0000079623 00000 n
-0000079898 00000 n
-0000093956 00000 n
-0000100812 00000 n
-0000107748 00000 n
-0000111411 00000 n
-trailer
-<</Size 38/Root 1 0 R/Info 37 0 R/ID[<97D202C4A94B874591B5BE50E1DF05AF><C5803DC1F035234DB619BA5F88CA5DE0>]>>
-startxref
-111602
-%%EOF
diff --git a/assignments/layout-img/LayoutSpec.png b/assignments/layout-img/LayoutSpec.png
deleted file mode 100644
index d35a62e29abba453847a525fc4eba2956e1d34d2..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/LayoutSpec.png and /dev/null differ
diff --git a/assignments/layout-img/rotations.png b/assignments/layout-img/rotations.png
deleted file mode 100644
index ffb63c5918e3a30b458bc244acdc88a3c7689782..0000000000000000000000000000000000000000
Binary files a/assignments/layout-img/rotations.png and /dev/null differ
diff --git a/assignments/layout-peer-review.md b/assignments/layout-peer-review.md
deleted file mode 100644
index ca6f59b669bd85d031274b45698200baae0c2854..0000000000000000000000000000000000000000
--- a/assignments/layout-peer-review.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-layout: default
----
-
-* TOC
-{:toc}
-
-# Layout Peer Review
-
-- For peer review, you will be looking at the *Part 4* submissions for the layout assignment. In particular, you will be evaluating the extent to which a student faithfully reproduces their chosen application layout.
-
-- First, you should check the wireframe to see what layout the student was attempting to create. If you have the app, or have quick access to it, it's also good to download and run that app alongside the student submission for comparison.
-
-# Layout Criteria
-
-## External Criteria
-
-- Layout wireframe is present and filled out.
-
-- Wireframe is representative of both the chosen application, and the running submission.
-
-- Layout is responsive to orientation. If using the emulator, click the device rotation buttons to check this criteria.
-
-- Layout is able to scroll in some clear way.
-
-## Additional Feedback
-
-This is your chance to evaluate the success of the submission. Feel free to offer feedback wherever you think it is relevant -- this is your chance to help out your peers!
diff --git a/assignments/layout.md b/assignments/layout.md
deleted file mode 100644
index 24e014193fdc62143a83454f625ca6126fbfc82b..0000000000000000000000000000000000000000
--- a/assignments/layout.md
+++ /dev/null
@@ -1,423 +0,0 @@
----
-layout: assignment
-published: true
-
-title: Layout
-code: as2
-
-assigned: April 10th, 2020
-due:
- - <strong>Part1-2</strong> April 17th, 2020, 10:00pm
- - <strong>Part3-5</strong> <del>April 23rd</del> April 24, 2020, 10:00pm
- - <strong>Part3-5 Lock</strong> April 25th 2020, 10:00pm
-
-revised: 10:00 AM Thursday, April 23th, 2020
-
-objective: Use XML and programmatic constraints to replicate three layouts.
-
-android_goals:
-  - Create a generalizable, reusable layout for any number of images
-  - Understand Android layout GUI and XML
-  - Familiarize with Android programmatic layout API
-  - Understand Android constraints implementation
-  - Handle portrait and landscape orientation correctly
-  - Handle fixed- and variable-size container views
-  - Learn about Inflators
-hci_goals:
-  - Make use of interactor hierarchy
-  - Use constraints to create responsive layouts
-  - Make use of complex built-in layouts
-  - Implement reusable layouts
-  - Understand how scrolling works
-  - Understand how sizes influence layout
----
-
-* TOC
-{:toc}
-
-# GitGrade links
-
-**Classroom** [Summary](https://gitgrade.cs.washington.edu/student/summary/8723)
-
-<span class="note">Note:</span> this is a 2 part assignment. You will work in the same repo for both, but you must accept part 1-2, turn in part 1-2, then accept part 3-4, then turn in part 3-4
-
-**Part 1-2:** [Accept the Assignment](https://gitgrade.cs.washington.edu/student/assignment/119) / [Turn in the Assignment](https://gitgrade.cs.washington.edu/student/assignment/119/turnin)
-
-**Part 3-4:** [Accept the Assignment](https://gitgrade.cs.washington.edu/student/assignment/120) / [Turn in the Assignment](https://gitgrade.cs.washington.edu/student/assignment/120/turnin)
-
-# Assignment Description
-
-This is the assignment spec for Layout. Scroll down below [Part 5](#part-5-reflection) for some development strategies and tips curated from past students!
-
-On average, students spent about 10 - 12 hours on average on this assignment. It has been modified
-somewhat since then, but make sure you get started early, as this can quickly become one of the more
-time-consuming assignments of the quarter.  
-
-Also an important <span class="note">note</span> : Part 1-2 and Part 3-5 are NOT equivalent in difficulty. Part 1-2 should
-take significantly less time than Parts 3-5. Once you have completed part 1-2, turn it in and
-continue to work on the rest of the assignment. The checkpoint will help you at the end of your
-development cycle to ensure your code is working correctly.
-
-# Introduction to Parts 1 and 2
-
-For parts 1 and 2, you will be building the same layout twice. It must show at least five images,
-be scrollable, and look equally nice horizontally and vertically. Additionally, you must
-use constraints to achieve this, using the  `ConstraintLayout` we provide in `part1.xml`.
-`part1.xml` can be found in the `res/layout` directory in Android Studio once the `layout` project has been opened.
-
-The results should look like this:
-
-![Portrait screenshot for parts 1 and 2](layout-img/1_portrait.png){:width="25%"}
-![Landscape screenshot for parts 1 and 2](layout-img/1_landscape.png){:width="50%"}
-
-
-For part 1, you will use Android Studio's built-in layout editor to create the desired layout, using a combination of XML and the GUI.
-
-For part 2, you will create the same layout programatically, using Java code to construct view
-objects and add them to our activity. In this way you will demonstrate how to make a
-generalizable layout class that can be reused for an arbitrary number of images.
-
-The important part of the interactor hierarchy for parts 1 and 2 is shown below:
-
-<div class="mermaid greenlarge" >
-graph LR
-W(LinearLayout) --> Status[StatusBar]
-W --> R[RelativeLayout]
-R --> S[ScrollView]
-S --> C[ConstraintLayout]
-C --> I1[ImageView: borders: vMargin]
-C --> I2[ImageView: borders: vMargin]
-C --> I3[ImageView: borders: vMargin]
-C --> I4[ImageView: borders: vMargin]
-C --> I5[ImageView: borders: vMargin]
-R --> B[BottomNav]
-
-classDef greenlarge fill:#dbf0db,stroke:#333,stroke-width:2px,font-size:16px,padding:0px,height:50px,top:1px;
-classDef bluelarge fill:#99ccff,stroke:#333,stroke-width:4px,font-size:16px,padding:0px,height:50px,top:1px;
-
-class Status,W,S,R,B greenlarge
-class C,I1,I2,I3,I4,I5 bluelarge
-</div>{:font-size=14px}
-
-We can represent this same interactor hierarchy visually in an _Layout Wireframe_ shown below.
- Note that you will only be adding things inside the ConstraintLayout.
-
-![Reference image for parts 1 and 2 showing how each image is staked vertically with vMargin space on every side; below; above; and between images](layout-img/LayoutSpec.png){:width="40%"}
-
-You will only be configuring the ImageViews as they relate to ConstraintLayout (shown in blue).
- Also this is simplified from what you would see in the Layout Inspector
-
-And this video shows parts 1 and 2 in action:
-
-<iframe width="560" height="315" src="https://www.youtube.com/embed/gf5__gtVhY0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-
-You may find the following link helpful when working with constraint layouts:
-["Building a Responsive UI with Constraint Layout"](https://developer.android.com/training/constraint-layout) (pay particular attention to the "Set Size as a ratio" section).
-
-## Further details on Part 1
-
-**Tasks**:
-
-* Use the tools provided by Android Studio to build a layout that vertically stacks images.
-
-When it comes to layout, working directly with XML can be a pain, especially when there are several attributes to keep track of on each element. Luckily, Android Studio provides a visual editor that you can use to build your app layout.
-
-For `part1.xml`, you will accomplish the following:
-
-* Familiarize yourself with [how to reference images in res/drawable](https://developer.android.com/guide/topics/graphics/drawables).
-* Use the Visual and XML editor to construct a single, scrollable column of images.
-* You must place a `vMargin` gap between images and their container, as well as between consecutive images. You do not have to ensure that the bottom image has `vMargin` space between it and its parent's bottom. `vMargin` is defined in `res/values/dimens.xml`
-* Your layout must have enough images that you need to scroll (use `animal_0` through `animal_4`)
-* Each image must be scaled so it fits horizontally and is centered *while maintaining its aspect ratio*. This requires you to set some attributes specific to ImageViews (not inherited) which are mentioned in the [ImageView Documentation](https://developer.android.com/reference/android/widget/ImageView)
-* You must use constraints to ensure that an image is adjacent to the previous image (`Top_toBottomOf`) and that its left and right side are constrained to the parent container.
-
-_Related APIs_:
-* [ConstraintLayout](https://developer.android.com/training/constraint-layout)
-* [Linear Layouts](https://developer.android.com/guide/topics/ui/layout/linear)
-* [ImageView](https://developer.android.com/reference/android/widget/ImageView)
-* [ViewGroup.LayoutParams#MATCH_PARENT](https://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#MATCH_PARENT)
-* [ViewGroup.LayoutParams#WRAP_CONTENT](https://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html#WRAP_CONTENT)
-
-## Further details on Part 2
-
-The `Part2View` starter code can be found in the `cse340.layout` directory in Android Studio.
-
-In `Part2View` we have set up the basic scaffolding necessary to complete the given layout. For this section you will be instantiating the view objects from Part 1 programmatically.
-
-**Tasks**:
-
-* Create the layout from `Part1View` without using an XML file that vertically stacks an
-arbitrary number of images.  That is, you must accomplish
-the layout requirements from Part 1 programmatically, creating Views in Java to accomplish your
-desired layout. Part 2, however, will allow for an arbitrary number of images, not just the ones specified in an XML file.
-
-It may be useful to view the interactor hierarchy using Layout Inspector when Part 1 is
-running to understand how to structure the views you are creating programatically.
-
-# Part 3
-
-<span class="note">Note:</span>  Remember to accept the as-layout-part-3-4 [assignment](https://gitgrade.cs.washington.edu/student/assignment/120) and [turn in the assignment](https://gitgrade.cs.washington.edu/student/assignment/120/turnin) when you are done.
-
-The `Part3View` starter code can be found in the `cse340.layout` directory in Android Studio. We will create a custom Layout in Part3 that can organize an arbitrary series of Views into a Pinterest-like layout. Pinterest is a great example of a high-profile app that can be built with relatively simple layout instructions. For instance, one could imagine breaking the layout into two large vertical columns, then assigning various elements to each one. You will also need to ensure the columns never differ by more than the height of one image.
-
-![Screenshot of pinterest layout](https://newsroom.pinterest.com/sites/default/files/inline-images/2014112502.jpg){:width="50%"}
-
-To determine which column a photo should go in, we will use "pinterest" ordering. You must track
-the height of the images in each column and add the next image to the shorter column (or the
-*left* column if equal). For 20sp we will accept one of two methods for determining the Pinterest order.
-
-- Using the intrinsic height of the `drawables` image to determine which column to make this determination.
-(Please see the explanation on our discussion board for why this is so.) The screen shots for the
-Pinterest order in portrait and landscape are shown below.
-
-![Screenshot of part 3](layout-img/3_portrait.png){:width="30%"} &nbsp;&nbsp; ![Screenshot of part 3 scrolled](layout-img/3_portrait_scrolled.png){:width="30%"}
-
-![Screenshot of part 3, landscape](layout-img/3_landscape.png){:width="45%"} &nbsp;
-![Screenshot of part 3, landscape, scrolled down](layout-img/3_landscape_scrolled.png){:width="45%"}
-
-- NOT using the height of the `drawables` directly, instead you will need to get the *displayed*
-(or measured) height of the image. To do this you need get the measured width of a column, then
-use that to measure the height of each image. It will help to take a look at
-[How Android Draws Views](https://developer.android.com/guide/topics/ui/how-android-draws)
-[View.Measure](https://developer.android.com/reference/android/view/View#measure(int,%20int)) and
-[MeasureSpec](https://developer.android.com/reference/android/view/View.MeasureSpec) for this version
-
-![Screenshot of part 3](layout-img/3_portrait_measured.png){:width="30%"} &nbsp;&nbsp; ![Screenshot of part 3 scrolled](layout-img/3_portrait_measured_bottom.png){:width="30%"}
-
-
-Note that two photos with different resolutions but the same aspect ratio (width to height ratio)
-will both affect the column height identically because they will be scaled to have the same size on-screen.
-
-
-Keep in mind that similar to Part 1 and Part 2, your Part 3 layout should be responsive to device orientation. When rotated your layout should maintain the proper positioning (vMargins, spacing, and aspect ratios should remain the same while images scale to fill the extra space.)
-
-
-Our Pinterest style layout will be achieved both by using Layout Inflation (using a LayoutInflater with a valid XML file).
-A [LayoutInflater](https://developer.android.com/reference/android/view/LayoutInflater.html)
-allows us to accept a valid XML file specifying part of an interactor hierarchy and convert it
-into a View object that can be added to the interactor hierarchy you are constructing.
-This can be seen in practice in the `R.id.action_part_1` case in MainActivity#onCreate(Bundle).
-The XML/visual editor makes it much easier to build our app layouts, so we can use that to create new
-layouts, then use an inflater to convert the XML into an object before programmatically
-appending it to our current app layout.
-
-The interactor hierarchy for Part 3 is shown below. The elements marked in light green must be
-created using inflation (and the `part3_grid.xml` file must do this). The elements shown in
-blue must be created programmatically. Note the switch to `LinearLayout` to hold the images.
-
-<div class="mermaid greenlarge" >
-graph LR
-C[ViewGroup:ConstraintLayout]
-C --> Column1[ViewGroup:LinearLayout]
-C --> Column2[ViewGroup:LinearLayout]
-Column1 --> V1[ImageView:Gumball]
-Column1 --> V2[ImageView:Fox]
-Column1 --> V3[...]
-Column2 --> V4[ImageView:Duckling]
-Column2 --> V5[...]
-
-classDef greenlarge fill:#dbf0db,stroke:#333,stroke-width:2px,font-size:12px,padding:0px,height:50px,top:1px;
-classDef bluelarge fill:#99ccff,stroke:#333,stroke-width:4px,font-size:12px,padding:0px,height:50px,top:1px;
-
-class C,Column1,Column2 greenlarge
-class V1,V2,V3,V4,V5 bluelarge
-</div>{:font-size=14px}
-
-
-**Tasks**:
-
-* Before getting started on this section, try constructing a [LayoutInflater](https://developer.android.com/reference/android/view/LayoutInflater.html) and passing in your `part1.xml` file.
-* Once you are comfortable with inflation, use inflation  to make use of the ConstraintLayout we have provided for you (`cse340.layout.R.layout.part3_grid`)
-* Programmatically create ImageViews based on the information passed in:
-  * Add each image to the bottom of one of the two columns.
-  * Which column an image is added to will depend on the current length of both columns (the image will be added to the bottom of the currently shorter column).
-  * Each image must be `vMargin` from the previous image vertically (or from the top of the column **if it is the first image in that column**).
-  * There must be a `vMargin` gap between the left image and the left side of the screen,
-  between the right image and the right side of the screen, and between the two columns. The
-  center of the `vMargin` gap between the two columns must be in the exact center of the screen.
-  All images must be horizontally scaled to to be wide enough to meet these margins exactly.
-  * The heights of the images must be scaled proportionally based on the constrained width.
-  * The bottom of the last image in the longer column must be flush with the bottom of that
-  column. If the other column is shorter, then of course it will show more margin.
-* Write code that evenly distributes ImageViews between a given set of columns based on the scaled height they will be on screen, not the dimensions from the drawable resource.
-* Note that all of this code must be in the contructor of the `Part3View` (or in a
-  private method called by the constructor.)
-
-*Related APIs:*
-[LayoutInflater](https://developer.android.com/reference/android/view/LayoutInflater.html)
-
-
-# Part 4
-
-The `Part4View` starter code can be found in the `cse340.layout` directory in Android Studio.
-
-For part 4, feel free to explore anything pertaining to layout that we have discussed over
-the last few weeks. You are not limited to only using the types of layout covered in class. Your task is to sketch (wireframe) and re-create an interface from another
-popular app. For instance: Twitter, Facebook, Instagram, etc. (not Pinterest!)
-
-Your layout must meet the following requirements:
-* Your layout must implement a scroll view in some fashion, allowing the user to scroll through
-content on your application.
-* Your layout must be responsive to device orientation. If the user rotates their device, then
-your application must adjust to fit the new orientation.
-* Your interface should be sufficiently similar to the one you're emulating. Don't leave out things like icons & text.
-
-**Tasks**:
-
-* Before you start, sketch the interface you've chosen to mock up as a Layout Wireframe *on a
-piece of paper or using a tablet pen*. This sketch will be turned in as part of your reflection
-in [Part 5](#part-5-reflection).
-* Also draw out the Interactor Hierarchy for the interface. Your Interactor Hierarchy may
-be done with a computer program.
-* Using XML and programatic means, create your version of this interface.
-* Make sure that you create a Part4.xml file and add/commit/push it to your GitLab repository
- (a similar process to using your own pictures.)
-
-
-# Part 5 (Reflection)
-
-For this part, you will submit your reflection on this assignment to Gradescope. Create a MS
-Word, Google or other type of document and copy the following questions (in italics below) into
-that document. Add your responses below each question. You can have
-more than one answer per page, but if you can, please try to avoid page breaks in the middle of
-a question. Insert page breaks between questions as needed.
-
-1. _Diagrams and images_
-  - _The Layout Wireframe you drew for Part 4._
-  - _The interactor hierarchy you drew for part 4. (Do not turn in a screen shot of the
-    layout inspector for this)._
-  - _A screen shot of your final interface and the the interface you are emulating, both in
-  portrait and landscape mode._
-2. _For every interface there may be multiple ways of laying it out, particularly if they are complicated.
-As you reflect on your design and implementation of part 4, think of another way you could
-wireframe the same interface using different ViewGroups/Layouts._
-3. _This class is part theory, part implementation. As such, lecture and section may not have
-provided you all of the information necessary to complete the layout program. How did you
-approach the independent learning required to complete this assignment? List at least one
-resource you used in your learning that would recommend to a friend taking this class in the
-future._
-4. _Why are responsive designs important, in user interfaces, software development and software engineering, and real life applications?_
-
-# Development Strategies
-
-* You may run into issues when rotating the device. Note, when rotating the emulated device or your personal Android device, that the layout must adjust accordingly. You do not need to readjust the layout of your images when rotating the device, as this must remain the same.
-
-![Rotation buttons on emulated android device](layout-img/rotations.png)
-<p style="text-align: center; color:#808080; font-style: italic; font-size: 10pt;">These buttons will allow you to rotate the emulated device clockwise/counter-clockwise.</p>
-
-* When dealing with the Android documentation: ask as many questions as necessary! The android documentation can be painful to read through, as there are many potential options to choose from. If you need any help parsing it, feel free to ask anyone on the course staff for advice. Additionally, we suggest that you read through the following resources as you develop your apps, to better understand the tools you are utilizing (these are referenced in their respective parts as well):
-  * [An explanation of the ImageView ScaleType attribute](https://thoughtbot.com/blog/android-imageview-scaletype-a-visual-guide) (Part 1)
-  * [Building a Responsive UI with Constraint Layout](https://developer.android.com/training/constraint-layout) (Part 3) Note the "Set Size as a ratio" section here
-  * [What's new in Constraint Layout 1.1.0](https://android.jlelse.eu/whats-new-in-constraint-layout-1-1-0-acfe30cfc7be) (Part 4)
-  * [Adjusting the view size](https://developer.android.com/training/constraint-layout#adjust-the-view-size)
-
-
-# Debugging tips and tricks
-
-* Recall that you can use the Layout Inspector to see where your views are placed in the parent.
-The Layout Inspector is can be found under the _Tools_ menu.
-* If your application stops running (the device displays an alert that says
-  "<application name> has stopped"), you likely have a serious runtime error. Make sure
-  to look at the _Run_ tab at the bottom of the screen. For more
-  information on runtime crashes, see
-  [Crashes](https://developer.android.com/topic/performance/vitals/crash).
-* Your application may crash while inflating if there is a problem with your .xml file.
-* Logging output is especially useful for testing the functionality of sections of code such as `Layout#MainActivity#OnCreate` and other methods. Much like `System.out.print` in Java, Andriod provides its own class for producing output: `Log`. We suggest that you use `Log.i` and create your own custom tag so that you can filter the output for the information you want. Below is an example of how to use the `Log.i` function.
-
-```java
-private static final String TAG = "Layout";
-
-Log.i(TAG, "Hello world!");
-```
-
-  To make full use of Logcat, make sure to configure the priority level (in this case, "Info") and use the correct tag (in this case, "Layout MainActivity"). It's also good to check that you have the correct device/emulator selected.
-
-<span class="note">Note:</span>  Remember to take your `Log.i` debugging calls out of your code before turning it in.
-
-_Related APIs_:
-[Android Log.\*](https://developer.android.com/reference/android/util/Log.html) | [Using Logcat](https://developer.android.com/studio/debug/am-logcat)
-
-
-
-# Turn in
-
-## Code Submission Instructions
-
-<span style="color:red;">We will test layout on emulators with different screen sizes. Please use constraint correctly. Don't just try to match pixels in our sample screenshots.</span>
-
-You will turn in the following files on GitGrade
-- [Part 1-2](https://gitgrade.cs.washington.edu/student/assignment/119/turnin).
-- Make sure you have accepted [Part3-4](https://gitgrade.cs.washington.edu/student/assignment/120) before turning that part in.
-- Continue to work in your same repo
-- [Part 3-4](https://gitgrade.cs.washington.edu/student/assignment/120/turnin).
-
-We are allowing you to turn in Part 1-2 early for a checkpoint to see how closely you match our
-pixel tests. You will get 1 point for turning in code that compiles and passes up to half of the
-tests. If you pass more than half the tests, we will award you 2 points.
-
-Make sure you only edited the following files for submission:
-
-```txt
-─ Part1.java
-- Part2View.java
-─ Part3View.java
-─ Part4View.java
-- res/drawable
-- res/layout/part1.xml
-- res/layout/part3_grid.xml
-- res/layout/part4.xml (optional, or other .xml files for part 4)
-- res/values/strings.xml
-```
-
-Do not edit any of the other files that we have given you, do not delete any of the images in the
- `res/drawable` folder, and do not delete any existing strings in `res/values/strings.xml`
- (you may add bitmaps and strings of course.)
-
-If you add your own images in [Part 4](#part-4), please make sure to add and commit them to
-your repository in the `res/drawable` directory before turning in your assignment.
-If your images are not there, your custom layout will not work for others and you will
-NOT get credit for the work you did.
-
-<span class="note">Note:</span>  Large images can be problematic both for running your app and for committing to your
-gitlab repository (there are size limit imposed on school resources). Please make sure to resize
-your high resolution images before using them in your creative application.
-
-## Reflection submission
-
-The reflection will be turned in to Gradescope.
-
-
-# Grading (40pts)
-
-The Layout assignment will be out of 40 points and will roughly (subject to small adjustments) be distributed as:
-
-Part 1-2 checkpoint (2pts)
-<span class="note">Note:</span>  this MUST be turned in on time to receive points. No late assignment
-for part 1-2 will be accepted.
-* Turned in and compiles: 1 pt
-* Passed >1/2 of tests: 1 pt
-
-Final checkpoint (38 pts)
-- Part 3-4 code (26 pts)
-  - Part 1 (6 pts)
-  - Part 2 (7 pts)
-  - Part 3 (9 pts)
-  - Part 4 (4 pts)
-- Reflection (12 pts)
-  - Layout Wireframe, Interactor Hierarchy, and screenshots of part 4 (3 pts total)
-  - Each of the 3 reflection questions is worth 3 points (9 pts total)
-
-
-
-
-
-## IDE Errors/Warnings you can ignore
-
-<span class="note">Note:</span>  DO NOT assume that because an error/warning can be ignored for this assignment, it can be ignored for all assignments. ALWAYS check the spec for each assignment before deciding what is OK to ignore.
-
-* `Button`
-  * Hardcoded Strings
-* `TextView`
-  * Hardcoded Strings
-* `ImageView`
-  * Missing `contentDescription`
diff --git a/assignments/menu-report.md b/assignments/menu-report.md
deleted file mode 100644
index c770fd20a687897ad37ed98e038f99827607e883..0000000000000000000000000000000000000000
--- a/assignments/menu-report.md
+++ /dev/null
@@ -1,73 +0,0 @@
----
-layout: default
----
-# Report on Menus Assignment
-
-*Comments about what should be in your report can be found in italics. **Please remove the comments
-and replace them with your own words**.*
-
-## Introduction
-*Write two sentences describing the purpose of the experiment. This
-can be the same text you use in your [consent form](consent) under
-`Introduction and Purpose of study (Beneficience)`*
-
-## Method
-
-**Menus:** *Mention that there are three types of menus, Pie, Linear
-and Custom. Then describe your custom menu and include
-an screenshots of your custom menu in both a selected and unselected
-state. Describe some of the design choices you made when you were
-conceiving your custom menu and how your final product match (or didn't)
-your original vision? Be sure to explain clearly how your custom menu
-works and how a user interacts with it?*
-
-**Tasks:** *Describe the 9 conditions of the study. Explain how many
-items were selected per menu, and how many times each item was
-repeated. Describe how many trials each participant completed. This
-should be at most one paragraph*
-
-**Setting:** *What device was used? Was it an emulator? Did they use a
-mouse or a finger? Where did the experiment take place?*
-
-**Participants:** *Describe your participants (without identifying
-them). How were they recruited? How many were there? Were
-they consented? You should also add
-some optional information such as: What was there average age? What
-genders were present? How experienced were they with android?*
-
-**Data Collected:** *What information was collected (time, errors,
-etc)*
-
-## Results
-
-*To analyze your data, you should copy the following [spreadsheet](https://docs.google.com/spreadsheets/d/1JqfKhHugIF-kebs_bVztCnkUe0CizXN8PU_Ar3kXtK4/edit?usp=sharing)
-and paste your data into the `Raw Data` subsheet, replacing the
-contents/data that we placed there. To use this spreadsheet look at
-the `Example Chart` sheet to see a chart of your data (you can click on
-the hamburger menu in the chart to download it as an image).  You can
-also create your own charts if you are
-comfortable working in a spreadsheet.*
-
-The results will be broken into two parts. The first will describe the
-overall data, including how many erroneous selections took place, and
-how fast the user was in each condition.
-
-## Speed Results
-
-*Describe your thoughts about overall speed in different
-conditions. Use at least one chart to illustrate what you say. Here is
- an example chart generated using our data, when you paste your data
-into the spreadsheet you'll see that it updates to reflect your data*
-
-![Picture of histogram chart showing relative performance of each condition](menus-img/time-chart.png)
-
-
-## Error Results
-
-*Describe what happened in terms of errors -- provide at least one chart showing
-what you learned about errors in different conditions*
-
-# Conclusions
-
-*Describe your conclusions. Do you think we should use pie menus more? normal menus more? or your custom menu?
-What can we conclude from your data?*
diff --git a/assignments/menus-img/atan2math.png b/assignments/menus-img/atan2math.png
deleted file mode 100644
index 56b796497409477f99dd0a84272a2e9998f45925..0000000000000000000000000000000000000000
Binary files a/assignments/menus-img/atan2math.png and /dev/null differ
diff --git a/assignments/menus-img/device-file-explorer.png b/assignments/menus-img/device-file-explorer.png
deleted file mode 100644
index a1910ffdebd8067dafe6aed3aa0dc74ddd16593a..0000000000000000000000000000000000000000
Binary files a/assignments/menus-img/device-file-explorer.png and /dev/null differ
diff --git a/assignments/menus-img/linear.png b/assignments/menus-img/linear.png
deleted file mode 100644
index 4b5b1fcd68a6d803cea91564521d2127a1018adf..0000000000000000000000000000000000000000
Binary files a/assignments/menus-img/linear.png and /dev/null differ
diff --git a/assignments/menus-img/math_a20.gif b/assignments/menus-img/math_a20.gif
deleted file mode 100644
index fc36674d716687db4f25e44f50affd813abe87a2..0000000000000000000000000000000000000000
Binary files a/assignments/menus-img/math_a20.gif and /dev/null differ
diff --git a/assignments/menus-img/menus-stats.png b/assignments/menus-img/menus-stats.png
deleted file mode 100644
index a150bde99badc764037bffb103e8fc281b64edff..0000000000000000000000000000000000000000
Binary files a/assignments/menus-img/menus-stats.png and /dev/null differ
diff --git a/assignments/menus-img/pie.png b/assignments/menus-img/pie.png
deleted file mode 100644
index 19bb3cea94cceca2d283eceafb0f580812c433f4..0000000000000000000000000000000000000000
Binary files a/assignments/menus-img/pie.png and /dev/null differ
diff --git a/assignments/menus-img/time-chart.png b/assignments/menus-img/time-chart.png
deleted file mode 100644
index 555aa23251015ac371dee7a373980d5e5abd7929..0000000000000000000000000000000000000000
Binary files a/assignments/menus-img/time-chart.png and /dev/null differ
diff --git a/assignments/menus.md b/assignments/menus.md
deleted file mode 100644
index e22f3fb93687af7070e681f2d15dca2a53808422..0000000000000000000000000000000000000000
--- a/assignments/menus.md
+++ /dev/null
@@ -1,682 +0,0 @@
----
-layout: assignment
-published: true
-
-title: Menus
-code: as5
-
-assigned: May 12th, 2020
-due:
-- Part 1-4 (programming part) <BR>
-  -  <strong>Due</strong> May 21th, 2020<BR>
-  -  <strong>Lock</strong> May 22th, 2020
-- Part 5-6 (analysis part)<BR>
-  -  <strong>Due</strong> May 25th, 2020<BR>
-  -  <strong>Lock</strong> May 27th, 2020
-revised: 9:00pm, Sunday, May 10th, 2020
-
-objective: Build and test custom interactors
-
-android_goals:
-  - Further practice using callbacks; `onDraw()`
-  - Further practice with translate
-  - Gain more experience working with callbacks.
-  - Further practice with state machines and event handling
-hci_goals:
-  - Record user study data
-  - Produce plausible experiment results (within expected ranges)
-  - Understand pie menus
-  - Design your own interactor
-  - Collect, parse, and interpret results collected from a study.
-
----
-
-* TOC
-{:toc}
-
-
-# GitGrade links
-
-[Accept the Assignment](https://gitgrade.cs.washington.edu/student/assignment/126) /
-[Turn-in the Assignment](https://gitgrade.cs.washington.edu/student/assignment/126/turnin) /
-[Review your Submissions](https://gitgrade.cs.washington.edu/student/summary/8723)
-
-
-# Overview of assignment
-
-This assignment has two main components.
-
-First you will be creating three menus -- a linear menu, a pie menu, and a custom menu that you
-design.  The programming re-uses many concepts from [ColorPicker](colorpicker.html), but will
-have more pieces to it. Please start early, and reach out if you find you are spending more than 10
-hours.
-
-After your application is turned in, you will test these menus in an experiment with others. The
-user study will include the following:
-- Write your consent form using our [template](consent). Print it out for participants you see in person, or
-be ready to email it to remote participants;
-- Recruit and consent at least 3 participants to test your app;
-- Send your app (APK) to your participants so they can run the tests;
-- Collect the data from participants who tested your app. If participants do the test on your device or
-emulator you will download the data yourself. If participants test your application remotely they will
-have to download and send you the data they collect for you (details for how to do this are in
-[Part 5](#part-5-conduct-and-write-up-user-study)
-- Import the data into the spreadsheet we provide;
-- Turn in a copy of this data (so we can create a very large data set);
-- Analyze the data and write the report.
-
-**Note:** If you are unable to finish parts 1-4, ~~you can borrow a phone with working code
-installed~~ we will send you an APK after the lock date to finish parts 5-6.
-
-
-## Video of completed assignment
-
-_Note the Toasts (pop up messages) are missing a space between the word "Selected" and the item
-that was selected. This has been fixed in the current version of the code, but the rest of
-the app works substantively the same._
-
-<iframe width="560" height="315" src="https://www.youtube.com/embed/4o_4TAsSe8E" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-
-# Part 1: Overview
-
-**Tasks**
-
-- Read this spec thoroughly
-- Read through the code of the classes listed below. Note any variables or methods you will be
-using or overriding from parent class.
-- Read and understand the experiment design.
-
-You will be implementing a class that can display a pie menu, a class
-that can display a linear menu, and a custom menu of your design, for
-use in an experiment comparing which is faster for the user to select
-menu items from. By *menu items* we mean the individual items in a
-menu, such as the number 1 in the sample video.
-
-
-## Overview of code structure
-
-**Files that you will be changing**
-* MainActivity.java
-  * Activity that displays the option to navigate between sessions. Also adds the corresponding menu view to the view hierarchy.
-* MenuExperimentView.java
-  * View that can displays and handle input for a menu. This is where you implement the state machine that will work for
-  all of your menus. This is the parent class of `NormalMenuView` and `PieMenuView`
-* PieMenuView.java
-  * View that implements pie menus. This knows how to draw a pie menu, and figure out where input is in it. It inherits from `MenuExperimentView`
-* NormalMenuView.java
-  * View that implements normal linear menus. Similar to `PieMenuView`
-* CustomMenuView.java
-  * View that implements normal linear menus. Similar to `PieMenuView`
-
-**Classes that have functions and fields you may need (your classes inherit from them)**
-* AbstractMenuExperimentView
-  * A lot of very handy helper methods (accessors and mutators) for the menus, as well as the Listener methods.
-  Most of the other methods in this class are abstract and overridden in the child classes.
-* AbstractMainActivity
-  * Methods to handle app creation, switching modes (from test to experiment), and starting experiments.
-* TrialListener
-  * Definition of a listener (callback) interface that is called when a trial is finished.
-
-The structure of this code is represented by the
-[Unified Modeling Language](https://en.wikipedia.org/wiki/Unified_Modeling_Language) (UML)
-diagram shown below.
-
-<div class="mermaid">
-classDiagram
-
-class MenuExperimentView {
-  onTouchEvent()
-  startSelection()
-  endSelection()
-  updateModel()
-  onDraw()
-}
-
-
-AbstractMenuExperimentView <|-- MenuExperimentView
-
-AbstractMainActivity <|-- MainActivity
-AbstractMainActivity <|-- TestActivity
-MenuExperimentView <|-- PieMenuView
-MenuExperimentView <|-- NormalMenuView
-MenuExperimentView <|-- CustomMenuView
-
-class TaskType {
-  LINEAR
-  RELATIVE
-  UNCLASS
-}
-
-class State {
-  START
-  SELECTING
-}
-
-class MenuType {
-  NORMAL
-  PIE
-  CUSTOM
-}
-</div>
-
-**Other files you may want to look at**
-* ExperimentSession.java
-  * Class that sets up all the conditions for the experiment and creates an iterator with all the trials.
-* ExperimentTrial.java
-  * Class that stores all the data for a single trial.
-* TestActivity.java
-  * Activity that app starts out in. Lets you test your menus before running the experiment
-
-
-
-## Overview of Experiment
-
-In this experiment we will have 9 conditions, each of which will include
-the number of trials (where totalTrials = `NUM_REPEATS * ITEM_MAX` trials).
-You can think of this as a three dimensional array
-
-|            | Menus       |             |             |
-|------------|-------------|-------------|-------------|
-| **Tasks**  | `PIE`       | `NORMAL`    | `CUSTOM`    |
-| `LINEAR`   | totalTrials | totalTrials | totalTrials |
-| `RELATIVE` | totalTrials | totalTrials | totalTrials |
-| `UNCLASS`  | totalTrials | totalTrials | totalTrials |
-
-<br>
-The three *menu types* (specified in an `Enum` in the code) are `PIE`
-(round), `NORMAL` (linear) and `CUSTOM` (your custom menu).
-
-The three *task types* (also an `Enum`) are `LINEAR` (menu items
-that have a natural order such as 1,2,4,8,16,32,64,128); `RELATIVE`
-(menu items that have a relationship to each other, such as
-Up/UpRight/Right/Down/etc...); and `UNCLASS` (menu items that
-have no relationship or ordering, such as Print/Cast/Bookmark/etc);
-
-The *trials* are specific combinations of menu item, task type,
-and menu type. So for example, one trial might involve showing the
-user a pie menu, with the numbers 1..128 in it, and asking them to
-select number 4. The participant can select any option, no matter what
-as soon as they complete a selection, the result is recorded and the
-next trial begins.
-
-For any given *session* (one user's worth of trials), each combination
-of menu type, task type, and menu item, will be repeated `NUM_REPEATS`
-times (`NUM_REPEATS` is specified in `ExperimentSession.java`). In
-addition, for any specific combination of menu type and task type, at
-most `ITEM_MAX` items (a total of `ITEM_MAX*NUM_REPEATS` trials) will
-be shown to the user. If you set both of these to 1 for testing, you
-can test all your conditions very quickly. Make sure to set them to
-the required values for user testing:
-`ITEM_MAX` must be at least 4 and `NUM_REPEATS` must be 3.
-
-After the code for this project is submitted, you will recruit at least 3
-family, friends, or other students and have them complete one session each. Thus, you
-will have a total of 3 (participant sessions) * 9 (conditions) *
-`ITEM_MAX * NUM_REPEATS`, or at least 324, data points when you have completed
-this assignment. You will analyze the data from this experiment in
-[Part 5](#part-5-conduct-and-write-up-user-study) of this project.
-
-
-We have implemented in `ExperimentSession` the code for you to generate
-all of the trials from a setup file called `menuContents.csv` found in
-the assets directory. Make sure that you understand the `createTrials()` method
-provided in `ExperimentSession.java` which sets up conditions for the
-whole experiment.  `ExperimentSession` is an iterator, so to run the
-trials for a given session you just use `session.next()` as long as
-`session.getNext()` is true.
-
-**Note:** that we give the user feedback two ways.
-- For updates that the user can ignore, throughout the code, we use something called a `Toast` - a widget
-that appears at the bottom of the screen and shows some announcement text. Toasts are temporarily
-displayed and then disappear. See [Toast](https://developer.android.com/guide/topics/ui/notifiers/toasts)
-and for an example of how it is used look in `AbstractMainActivity.java`
-- For critical experimental information (i.e. what to select in a trial), we give the user
-instructions by changing the contents of the `TextView` at the bottom of the screen (by changing
-the contents of `R.id.instructionTextView`). This is a permanent change that will be visible
-until they finish the trial, so a Toast is not an appropriate choice.
-
-
-
-# Part 2: Implement MenuExperimentView and MainActivity
-
-**Tasks**
-- Implement `onTouchEvent()` in `MenuExperimentView` including
-  - `startSelection()`
-  - `endSelection()`
-  - `updateModel()`
-  - `reset()`
-- Implement `onDraw()` in `MenuExperimentView`
-- Implement `showMenuForTrial()` in `MainActivity` (and set up and implement a `TrialListener`)
-
-For this part, you will be working in `MenuExperimentView.java` and `MainActivity.java`.
-This section will entail defining the functions which power your menu experiment.
-The `MenuExperimentView` class includes several methods that you will need to implement. You
-will implement the state machine logic in `onTouchEvent` (similar to what you've done in ColorPicker).
-
-One tricky thing about context menus -- they can appear anywhere in
-your user interface. To support this, we set things up so that the
-menu view is going to `MATCH_PARENT` width and height (i.e. its
-bounding box is the whole screen). However, the menu itself should
-show up right where the user presses down. To make this easier for your
-menus, you will translate the canvas so that they can draw themselves in
-a logical location given where the finger pressed in `onDraw()`. Then you
-will call `drawMenu()` with this translated canvas, which is what each
-specific menu implements to draw itself properly.
-
-**Handling Touch Events**
-
-You will handle touch input by implementing the `onTouchEvent` method.
-This is the event handler that is invoked when a touch occurs in this
-view. The state machine defined in `onTouchEvent` should work, without
-changes, for every menu you implement. The only menu-specific code is
-in `essentialGeometry()` (it finds the current index). Thus
-`onTouchEvent()` is implemented in the parent class,
-`MenuExperimentView` and *is not changed* in the child classes.
-
-`MenuExperimentView`'s implementation of onTouchEvent makes
-use of your menu's `essentialGeometry()` function to determine the
-relative position of the user's finger. Essential geometry will be
-passed the finger's position relative to the menu's `(0,0)`, i.e.
-where the user pressed. You must implement your linear menu
-so this is its top left corner, and your pie menu so that the user's finger is in
-the center of the pie.
-
-You **MUST NOT** perform any assignments within `essentialGeometry()`, as it violates the utility
-of that method. Instead, `essentialGeometry()` will return the index associated with the desired
-view, allowing the calling method to act on that value.
-
-You need to keep track of two main states: `START` and
-`SELECTING`. When in the `SELECTING` state you need to distinguish
-between the event type to determine if the user has selected an option
-or if they are still in the middle of making a choice.
-
-Relevant touch events include `ACTION_DOWN`, `ACTION_MOVE`, and
-`ACTION_UP`; think about how these touch events relate to the change
-and how the UI must respond to these events.
-
-More details about `essentialGeometry()`, specific to each menu, are in descriptions for those
-menus in [Part 3](#part-3-implement-pie-and-normal-menus).
-
-<div class="mermaid">
-graph LR
-S((.)) --> A((Start))
-A -- "Press:startSelection()" --> I(Selecting)
-I -- "Release:endSelection()" --> E[End]
-I -- "Drag:updateModel()" --> I
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-class S invisible
-class A start
-class E finish
-class I normal
-</div>
-
-Details for `startSelection()`, `endSelection()` and `updateModel()` can be found in
-`MenuExperimentView`. Note that there are no guards (boolean logic regarding the essential geometry)
-on these transitions -- any click inside the `MenuExperimentView` causes a menu to appear, and once
-a menu appears, dragging causes `updateModel()` to be called no matter where the finger is.
-Similarly, the menu must be removed when selection ends, and the trial recorded, no matter
-where the finger is. You do not need to check whether the user clicked on the
-correct menu item when you call `endTrial()`. This data will be recorded automatically
-by `ExperimentSession`.
-
-**Drawing your Menu**
-
-Your menu must **ONLY BE VISIBLE** when you are in the `SELECTING` state. You can check this in
-`onDraw()`. In addition, it needs to redraw whenever something important changes (like the selected
-item). Be sure to call `invalidate()` in the appropriate methods of the state machine to make this happen.
-
-For `onDraw()`, your will do some setup that will allow your
-subclasses to draw properly. First, you will need to check if you are
-in the proper state to draw (you must only draw when in the `SELECTING`
-state).
-
-Next, you really want to draw from the `(0,0)` location of the menu,
-rather than the `(0,0)` of the parent. But remember that your width and
-height are set using `MATCH_PARENT`. To fix this, we need to translate
-the coordinate system of the canvas so that `(0,0)` is at the
-`startPoint` for this interaction.
-
-Finally, since this is an abstract class, we need to call the *real*
-drawing method, which our children will implement. This is called
-`drawMenu()` and must be overridden by `PieMenuView`,
-`NormalMenuView`, and `CustomMenuView`.  Therefore, your `onDraw()` implementation in
-`MenuExperimentView.java` will be pretty short.
-
-**Implementing MainActivity**
-
-In `MainActivity` you will implement part of the method
-`showMenuForTrial(ExperimentTrial trial)`. Your main job is to
-register a callback with it that knows what to do when a trial is
-completed.
-
-`MainActivity` also needs to implement the code to respond to
-`onTrialCompleted()`, a method of the TrialListener interface. In
-particular, this code must always remove the current menu being
-shown. Then it must check if the session is over (remember the
-session is an iterator), and if not call `showMenuForTrial()` with the
-next trial. If the session is over, it must update text of
-`InstructionTextView` to say that the session is completed, and also display a
-`Toast` to the same effect. We have provided a method that you may use to announce
-this message (`AbstractMenuExperimentView#announce(String)`), or you may use the `Toast`
-class directly.
-
-**Note:** This means that until the next session is started, the system should not display
-any menus if the user clicks.
-
-**Related APIs**
-* [Toast](https://developer.android.com/reference/android/widget/Toast)
-
-# Part 3: Implement Pie and Normal Menus
-
-**Tasks**
-
-- `NormalMenuView`: Implement `essentialGeometry()` and `drawMenu()`
-- `PieMenuView`: Implement `essentialGeometry()` and `drawMenu()`
-
-Both `PieMenuView` and `NormalMenuView` extend `MenuExperimentView`. You
-will implement `essentialGeometry()` for each and determine what menu item the
-touch event maps to. You'll have to come up with the math logic to map
-from touch event to an item index.
-
-You will also implement `drawMenu()` which at a minimum draws the menus as shown in
-the screenshots. If you want to do something different, you may, as
-long as the size and position of each menu item does not change. For
-example, you can  override the paint properties defined in
-`MenuExperimentView`, position the text differently, or draw more
-decorations on the menus.
-
-Be sure to check the `AbstractMenuExperimentView` starter code for any additional
-values that you must use when creating your menus. Also make sure you are not "shadowing"
-variables (redefining variables already defined in super class).
-
-## NormalMenuView
-
-The Normal Menu will appear where the user touches the screen (as the top/left corner of the menu)
-and extend down and to the right.
-
-For the `NormalMenuView`, `essentialGeometry()` will return -1 if the
-pointer is outside the bounds of the menu in any direction or has
-moved less than `MIN_DIST` (inherited from
-`AbstractMenuExperimentView`) since interaction started. Otherwise
-it must return the "item number" (position in the list) corresponding to
-the menu item that the pointer is currently inside of.
-
-The width of each item in the normal menu is `CELL_WIDTH` and the height is
-`CELL_HEIGHT`.
-
-**Some additional hints for the normal menu**
-- The menu should display on the screen when the user first touches the screen.
-- The indication of the selected menu item should be drawn after entire menu has been drawn. 
-
-## PieMenuView
-
-The Pie Menu will appear centered where the user touches the screen.
-
-For the `PieMenuView`, `essentialGeometry()` will return -1 if the pointer
-has moved less than `MIN_DIST` since selection started, and
-otherwise it will return the  "item number" (position in the list) corresponding to
-the menu item currently being selected. In the case of the Pie menu, the item number is the
-menu item that a ray from the center of the menu to the pointer intersects, with the first
-item being at the top of the pie and increasing as you go clockwise around the circle.
-The pie menu has no maximum diameter, so anything
-outside of the radius `MIN_DIST` around the finger will return a selection.
-
-For PieMenuView, the given `RADIUS` corresponds to the outer radius. The inner radius
-is defined by `RADIUS - TEXT_SIZE * 2`.
-
-**Some additional hints for the pie menu**
-- The menu should display on the screen when the user first touches the screen.
-- The indication of the selected menu item should be drawn after entire menu has been drawn.
-- `drawArc()` will draw a pizza-pie shaped arc, so you can do things
-  like highlight a menu item with a single method call.
-- You will need a rotational offset to ensure the top menu item is at
-  the top of the pie (both when drawing and in essential geometry)
-  because angle is traditionally measured from cardinal east. You can
-  add this in radians before converting from angle to index.
-- Just as in ColorPicker, you should look at the `atan` or `atan2` function to help you calculate
-  your pie menu's `essentialGeometry()` function.
-  - Remember that `atan`/`atan2` return a value between 0..Math.PI or 0 .. -Math.PI. 0
-  being cardinal east and Math.PI or -Math.PI at cardinal west. Also remember that the `y`
-  direction is positive pointing down the canvas, not pointing up
-  like a traditional cartesian coordinate system. This may impact the
-  values returned from trigonometric functions.
-
-  ![:img clarification of atan2](menus-img/math_a20.gif) &nbsp; ![:img clarification of atan2](menus-img/atan2math.png)
-- Your pie menu text does not need to be centered -- as long as it
-  is contained within the outer ring of the pie menu, you are fine.
-
-
-**Related APIs**
-* [Canvas](https://developer.android.com/reference/android/graphics/Canvas): See documentation on `drawArc()` and `drawText()`.
-* [Path](https://developer.android.com/reference/android/graphics/Path): For adding text along a curve
-* [atan2](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/Math.html#atan2(double,double))
-
-
-# Part 4: Implement a Custom Menu
-
-Create a new menu! Working off of the provided `MenuExperimentView` interface, build your
-own third menu. This menu must be different from the Pie/Normal menus. You are encouraged to
-explore user interactions here, and you will receive credit as long as your code shows
-significant effort. Your menu does not have to be great here -- if you choose, you can
-aim to create the "worst menu ever" for this submission. Alternatively, you can aim to
-outcompete our provided menu views!
-
-Be sure to make use of the same abstractions (`essentialGeometry()` and a state machine)
-in this implementation.
-
-# Part 5: Conduct and Write Up User Study
-
-_(not due at the same time as the code portion)_
-
-**Tasks**
-- Conduct user study
-  - Run a trial on yourself
-  - Create a final consent form from [this sample](consent)
-  - Recruit 3 participants
-  - Consent the participants, including having them sign your consent form
-  - Send your APK to any participants who are testing your app remotely
-  - Have them complete a session with `ITEM_MAX` set to at least 4 and
-   `NUM_REPEATS` set to 3.
-  - Download the recorded data
-- Analyze recorded data
-- Write a report
-
-**Conduct User Study**
-
-Start by testing your own program as a participant so you know how long it takes to run a session
-(this information is needed for your consent form). This is also a good time to double check that
-your data is not lost when you download it.
-
-Make a copy of the [consent form](consent) form template and modify it in all of the places marked as
-such (in italics). The language used in your consent form is key, so ensure that it does not come
-off as forceful or coercive.
-
-
-**Recruit participants and have them sign your consent form**
-
-Recruit your 3 participants from family and friends who can safely use your
-app on your device or your emulator in person (co-present), or from the
-random group you have been assigned from class. Please see
-[this document](https://docs.google.com/document/d/11nsEWs3TubV5Zy0zOIGguqZJohkS34uizIrDv-bgnYs/edit)
-for your group members.
-
-Consenting your participants will be very similar whether they are co-present or remote. First, set up
-a time when can speak to your participant (in person, over the phone, or over a Zoom or other
-video conferencing call).
-
-- For a co-present tester: print out two copies of the consent form for each
-participant -- one for them and one for you. Hand them a copy of the consent form before describing the
-study.
-- For remote testers: send a copy of the consent form to the participant prior to your phone call
-or video meeting.
-
-Briefly explain what your user study is about, and ensure they understand
-their participation in the study is voluntary. Do not *coerce* anyone into participating in your
-study. Make sure they know they have a choice, and have read the consent form.
-
-Your participants must acknowledge their consent by "signing" via the Google form (linked
-at the bottom of the consent form template). This form should send you an anonymized copy of their
-consent in email, which you can save and turn in with the rest of your report and reflection.
-
-**Collect data**
-
-Once your participant has been consented, allow them to test the app.
-
-Our implementation uses the ExperimentSession object to create, manage, and record experiment data
-to a `.csv` file that is stored on the phone or emulator. If you are interested, check out the
-`recordResult` function `ExperimentSession.java` to understand how this is being stored.
-
-Testing can happen on either a phone or other native Android device or on an emulator. If on an
-emulator, the participant may use a mouse, trackpad or touch display to interact with the app.
-When collecting data, you should inform users that all interactions
-will begin with tapping on the center of the screen. This should help
-avoid cases where your menu is unusable due to the screen format.
-
-
-_Co-present Testing_
-
-- Use the hamburger menu to select `Clear Result CSV`
-before starting your study so any prior sample testing data does not contaminate your results.
-**Make sure that you do not clear the results between submissions for a co-present study!**
-This will erase your trial data.
-- Ensure the app is in Experiment mode and a new session has started.
-- You will likely want to point out what they are to select is written at the bottom of the screen.
-- If you are doing 3 co-present tests in a row, the app will move to the next session automatically and
-store all of the data sequentially in the `TestResults.csv` file saved to your device. However, this
-data will be erased if you switch back to test mode, so be sure to download any data before you do that.
-
-_Remote Testing_
-- Send your APK to the participant so they can load it onto their own device or into their own
-emulator (as we did with Doodle earlier this quarter). In your
-menu project in Android Studio, select the *Build -> Build Bundle(s)/APK(s) -> Build APK(s)* menu item.
-When the *Build APK(s)* message popup appears in the lower right hand corner, click the *locate* link
-to find the `app-debug.apk`.
-- Send the APK to your participant. Unfortunately you can't email your APK through UW's servers,
-instead we recommend you upload the APK to your Google Drive or One Drive and send your participant
-a link to download it for testing.
-- Have your participant use the hamburger menu to select `Clear Result CSV` before starting
-your study so any prior sample testing data does not contaminate your results, then run one
-experiment session.
-- Once the user study is complete, your participant will need to download their study data from their device
-and send it back to you for analysis.
-- Combine the three participants' data into one common .csv file.
-
-
-Once *all* participants are done and you have one `.csv` file with all of the data,
-it should have at least `ITEM_MAX * NUM_REPARTS * NUM_PARTICIPANTS` (324) data points.
-You will be turning in this file (through Canvas) as part of your final report.
-
-
-*Downloading user testing data*
-
-You can use the Android Studio
-[Device File Explorer](https://developer.android.com/studio/debug/device-file-explorer) to access the file.
-This allows you to directly access the files on your Android device (emulated or physical) through a
-GUI window. Detailed instructions on getting the data off your device can be found on
-[this page](../docs/android_files/).
-
-The data will likely be in `/storage/emulated/0/CSE340_Menus/TestResult.csv`
-or `/sdcard/CSE340_Menus/TestResult.csv`.
-
-Note that each user is given a participant ID when the session is running. These are randomly
-generated numbers from 0-9999. You may renumber these to identify your participants by the order
-in which they tested (1, 2, 3) when you retrieve the downloaded `.csv` file(s).
-
-**Write a Report**
-
-Complete the user study by writing up brief report. We have provided a
-[template](menu-report) for you to use here. Please reference this template as
-necessary, but the information in the report must be your own descriptions.
-
-Your report will require you to attach screen captures of your menu in both an unselected and
-selected state. You can capture a screenshot of the menu in action in one of two ways:
-- On a phone: Touch the screen to display a custom menu with one hand. With your other hand
- [capture a screenshot](https://support.google.com/android/answer/9075928?hl=en). How you do this
- may depend on the device. The resulting screenshot will be stored in the File Manger on your phone.
-- On the emulator: Touch the screen to display a custom menu with one hand. With your other hand
-press the control-S (for Windows) or command-s (for Mac). The resulting screenshot should be found
-on your desktop.
-
-# Part 6: Reflection
-
-Your reflection should be done as Microsoft Word, Google or other type of document.
-Copy the following questions (in italics below) into your refelction document and add
-your responses below each question. You can have more than one answer per page, but if
-you can, please try to avoid page breaks in the middle of
-a question. Insert page breaks between questions as needed.
-
-1. _Attach two screenshots of your custom menu, one where it is in a selected state and one where
-it is in an unselected state. These images may be the same as the ones you included in this report.
-Then re-read our Properties of People Design Tips for [Vision](../slides/wk02/people-vision.html#71)
-and [Motor](../slides/wk06/people-motor.html#65). Which of these design tips did you employ/not employ
-when creating your Custom menu? List at least one Visual design tip and one Motor design tip and be
-specific in describing what part(s) of your menu's operation utilized these tips._
-
-2. _Given the structure of our Pie/Normal menus, how would you create an accessible menu when
-working with the MenuExperimentView class? What could make ensuring the menu is accessible
-difficult? (Rephrasing that last question: "If you were trying to ensure that your
-menu is accessible, what aspects would be difficult?")_
-
-3. _As written, these menus can potentially appear all or partially off the phone screen.
-When would this case happen, how might that appear, and how could you account or prevent this
-from occurring? Would your solution work for all three types of menus?_
-
-# Submission Instructions
-
-You will change ONLY the following files. These will be submitted to GitGrade.
-
-Part 1-4:
-- MainActivity.java
-- MenuExperimentView.java
-- NormalMenuView.java
-- CustomMenuView.java
-- PieMenuView.java
-
-Part 5-6:
-
-Your reflection and report will be uploaded to Gradescope. This will include:
-
-- TestResult.csv
-- Sample consent form
-- Evidence of three "signed" consent forms (either three scanned forms with the "sun signature" or
-copies of the three auto reply emails you get from the google form consent acknowledgement.)
-- Report
-- Reflection
-
-Your participants must also fill out the on line (Google)
-[consent form](CSE 340 20sp Menus User Study Consent) acknowledging that they agree to
-be a participant and identifying you as a tester.
-
-You must also turn in your combined csv file so we can create one large data set.
-This .csv will be turned in through Canvas and *NOT* be put turned in with the rest of your report.
-
-## Grading Rubric
-
-This HW will be out of 68-70 points and will roughly (subject to small adjustments) be distributed as:
-
-Code portion (33-35 points)
-- State machine implementation works: (12 pts)
-- Normal menu draws correctly (3 pts)
-- Pie menu draws correctly (3 pts)
-- Normal & Pie menus correctly implement essential geometry (5 pts)
-- Custom menu works (2 pts)
-- Trials & callbacks handled correctly (4 pts)
-- onDraw translates correctly (1 pt)
-- Code quality (3 pts)
-
-Experiment Portion (35 points)
-- Reasonable CSV output: 1pt
-- Consent form: 2pt
-- Three participants consented via form: 1pt
-- Report:
-  - Introduction: 1pt
-  - Description of study process: 6 pts
-  - Demonstrate understanding of results: 5pts
-  - Makes appropriate/good use of charts: 4pts
-  - Draw appropriate conclusions about linear vs. pie menu vs custom menu: 5pts
-- Reflection (10pts)
diff --git a/assignments/reflection.md b/assignments/reflection.md
deleted file mode 100644
index 6c1f666860944635bdd06b6e54ade5eff4121bd6..0000000000000000000000000000000000000000
--- a/assignments/reflection.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-layout: default
----
-
-# What is a Reflection
-
-
-A running theme in this course will be reflecting on our work and our work practices.
-
-**Reflection** is a way to examine the present while critically looking at the past in order to
-inform the future. It is also a vital part of the engineering process, and will be a vital part of
-you honing your skill as a Programmer, Computer Scientist, and/or Engineer.
-
-In general, what does it mean to reflect well:
-
-- First and foremost, the reflection answers any guiding questions given.
-- Specific details of the experience(s) being reflected upon are described clearly and
-concisely and in such a way that a non-expert (in this field) reader can understand. This does not
-mean you must explain it so that a novice reader can understand the problem deeply, just a
-non-expert (someone who knows the field but is not an expert in the field.) **Note** that a
-reflection is NOT just a factual recounting of a situation or situation(s).
-- There is a “depth” to the reflection. There are a number of ways to make a reflection deep, thoughtful and thorough.
-  - The reflection elaborates what the significance and meaning are of the given examples and why they are particularly important.
-  - The reflection includes a personal reaction to the events or examples described. Reactions are
-   open and honest and indicate the writer's ability to appraise what is presented.
-  - The reflection describes connections between these details and other events,
-  examples, ideas or concepts from the past or present.
-  - The reflection may raise questions or have implications on future work.
diff --git a/assignments/sensing.md b/assignments/sensing.md
deleted file mode 100644
index 9673a2d86b42a00243dada6cf399df68bf36c9bd..0000000000000000000000000000000000000000
--- a/assignments/sensing.md
+++ /dev/null
@@ -1,300 +0,0 @@
----
-layout: assignment
-published: draft
-
-title: Sensing
-code: EX5
-
-assigned: <!-- Tuesday, May 28, 2019 -->
-due: <!-- 11:59 PM Friday, May 31, 2019 -->
-revised: <!-- 10:08 PM Thursday, May 30, 2019 -->
-
-objective: Access Android sensors as the preparation to build context aware application.
-
-android_goals:
-  - Learn Android Awareness APIs
-  - Load sensor data
-  - Understand how and when to use Snapshot or Fence
----
-
-- TOC
-{:toc}
-
-This is part 1 of a group assignment. You should get this working on
-your own, but then work as a group to make an app that uses sensed
-data. Every group will have one person with an android phone, or
-access to an android phone, and you should work together to make sure
-individual group members can all test their part 1 code using the
-group phone.
-
-Tasks:
-- Add snapshot support for the following sensors:
-  - Headphone
-  - Location
-  - User Activity
-- Use fence support to listen for changes to the following sensors:
-  - Location (detect whether in CSE)
-  - Activity (detect whether walking)
-- Create an app that responds to implicit data (i.e. reacts to a change in context)
-
-Context awareness capabilities enable mobile phones to sense their physical environment and adapt their behavior accordingly. You can practice how to load and react to data from different sensors in this exercise, as the preparation to build context aware app in the final assignment.
-
-According to Google, "[The Awareness API](https://developers.google.com/awareness/) unifies 7 location and context signals in a single API, enabling you to create powerful context-based features with minimal impact on system resources."
-
-It supports combining and working with 7 signals including time, location, places, beacons, headphones, activity and weather.
-
-There are two ways to get context from sensors: `Snapshot` and `Fence`
-- Snapshot will return the most recent (may not be realtime) information from sensor.
-- Fence will be triggered when the sensor data changes (based on the signal conditions you set). You may also combine multiple conditions to create a smarter fence.
-
-We already provide example code to get weather, using snapshot, and headphone state, using fence. Your job will be to add additional sensors
-
-# Preparing to run the app
-You will need to set some things up
-
-## 1) Get your API Key and put it in the app Manifest.xml
-
-Follow the ["Quick Guide"](https://developers.google.com/places/web-service/get-api-key)
-To use this guide, you will be asked at some point about whether you want to create a new app (the answer is yes, name it something like cse340-LaughingChipmunks, or whatever your repository name is, the names have to be unique).
-
-You'll be asked to set up a billing account. However, for the minor use in this class, it shouldn't cost you anything. If this is a problem at all (e.g. you don't have a credit card), please reach out privately on Ed.
-
-When the interface gives you your API key **copy it and don't lose it**. That is the only time you'll ever see it for security reasons, you'll have to create a new app if you lose it.
-
-When you have your API key, go to your android manifest and paste it in between the quotation marks labeled `YOUR_KEY_HERE`.
-
-```xml
-        <meta-data
-            android:name="com.google.android.awareness.API_KEY"
-            android:value="YOUR_KEY_HERE"/>
-        <meta-data
-            android:name="com.google.android.geo.API_KEY"
-            android:value="YOUR_KEY_HERE"/>
-```
-
-If you have a hard time with this, contact us on Piazza, and we will
-provide you with a key. However it should be used for this assignment
-only, not for future android programming, and not shared with anyone
-else.
-
-## 2) Prepare a virtual device that is based on Oreo (API v. 26)
-
-## 3) Run your app and update things
-
-1) Allow location permissions
-
-<!-- TODO: Why do these use px dimensions? They should use [:img alt, XX%] for better mobile support -->
-![Screenshot of enabling sensing](sensing/enable-sensing.png){:width="200px"}
-
-2) Click on 'User Activity Snapshot'. This will cause an error telling
-you that play needs to be enabled as shown here. If it goes away (it's
-a notification), just click the same button again.
-
-![Screenshot of enabling play request](sensing/enable-play.png){:width="200px"}
-
-3) When you click on the notification, it will take you to a sign in
-screen for play store. Sign in using your google account. Agree to the
-terms of service; you don't have to agree to back up to google drive
-though (just turn that off by moving the slider and then press agree)
-
-4) When it sends you back to your app, press on the square button at
-the bottom of the screen and switch back to google play services.
-
-![Screenshot of switching](sensing/switching.png){:width="200px"}
-
-Android will show a big 'Update' button or you can just wait and it will
-download and update, as shown here:
-
-![Screenshot of play updating](sensing/play-updating.png){:width="200px"}
-
-5) Switch back to your app again and press 'User Activity
-Snapshot'. Wait patiently. Rejoice when you see the following (or
-something similar)
-
-![Screenshot of activity results](sensing/activity.png){:width="200px"}
-
-## For advanced awareness things (optional)
-
-You'll need to enable one more API than the automated quick guide does for you. This is the *awareness api*. To enable it, search for it in the search bar as shown here:
-
-![Screenshot of awareness search](sensing/apisearch.png)
-
-Click on the search result, and select **Enable.** You'll then need to click on the **Create Credentials** button and create credentials. Again, you'll get an API string which you'll need to add to your manifest, in the other API KEY meta data (just below the geo one).
-
-
-## What the app looks liken
-
-Here are sample screenshots for sensor results:
-
-<span style="color: red;">Note: the weather screenshots display `&#x2103` where they should display °</span>
-
-![Screenshot of sensor list](sensing/1.png){:width="200px"}
-![Screenshot of headphone snapshot](sensing/2.png){:width="200px"}
-![Screenshot of location snapshot](sensing/3.png){:width="200px"}
-![Screenshot of weather snapshot](sensing/5.png){:width="200px"}
-![Screenshot of detected activity snapshot](sensing/6.png){:width="200px"}
-![Screenshot of headphone fence](sensing/7.png){:width="200px"}
-![Screenshot of location fence](sensing/8.png){:width="200px"}
-![Screenshot of detected activity fence](sensing/9.png){:width="200px"}
-
-Here is a [link to a video of it in
-use](https://youtu.be/oF0i2lL4EUE).
-
-<span style="color: red;">Note: the video does not exhibit the updated behavior of fences prepending text to the beginning of the existing text</span>
-
-## Simulating input if using an emulator
-Although we ask that the group member with the phone donate phone time
-for testing, you should start by testing your code with the emulator,
-and should be able to  reproduce this video.
-
-To test your app, first use the
-[simulation
-capabilities](https://developer.android.com/studio/run/emulator#extended)
-built into the emulator. You bring it up by clicking on the "..."
-shown in red in the bottom right of the below image. Note that this is
-buggy -- it doesn't always work, sometimes it is slow, and it doesn't
-always update when you want. According to the [Awareness Fence Troubleshooting
-page](https://developer.android.com/training/location/geofencing#Troubleshooting),
-
-*Alerts can be late. The geofence service doesn't continuously
-query for location, so expect some latency when receiving
-alerts. Usually the latency is less than 2 minutes, even less when the
-device has been moving. If Background Location Limits are in effect,
-the latency is about 2-3 minutes on average. If the device has been
-stationary for a significant period of time, the latency may increase
-(up to 6 minutes).*{:.quote}
-
-Location changes are generally only
-registered if you switch to maps in the emulator, and then back to
-your app. Otherwise you will get a timeout error for location, and
-weather (which depends upon location).
-
-Despite all this, the emulator is still useful because it can help you make sure your code
-doesn't crash.
-
-### Location Simulation
-![Screenshot of emulator with simulator running](sensing/simulator.png){:width="400px"}
-
-### Headphone Simulation
-![Screenshot of emulator with simulator running](sensing/headphone.png){:width="400px"}
-
-### Weather Simulation
-![Screenshot of emulator with simulator running](sensing/weather.png){:width="400px"}
-
-Using this you can in principal simulate location, either current location or a
-whole route. To simulate a route, you can upload gps traces to
-simulate motion over time. [Here](sensing/Test.gpx) is one that moves in and out of CSE. A good place to download sample traces is
-[OpenStreetMap's traces
-page](https://www.openstreetmap.org/traces/). If you want to double
-check the results of location, here are [instructions on how to find a
-place in google maps using
-lat/long](https://support.google.com/maps/answer/18539?co=GENIE.Platform%3DDesktop&hl=en)
-You can also create your own route by modifing the lat/long in a trace
-(or making your own from scratch using the [GPS exchange
-format](https://en.wikipedia.org/wiki/GPS_Exchange_Format) **HOWEVER**
-we were not able to get this working with the Sensing app and suspect
-a bug in the emulator.
-
-You can also simulate weather (find it in the 'Virtual sensors' part
-of the simulator). **HOWEVER** again this doesn't seem to be reflected
-in the sensing app, potentially due to a bug.
-
-You can simulate headphones in the 'Microphone' tab of the
-simulator. **GOOD NEWS** this should work both for testing your
-headphones snapshot and headphones fence.
-
-We have not found a way to simulate activity.
-
-# Files provided
-The files provided are
-
-```
-Snapshot:
-ActivitySnapshotListener.java
-
-Fence:
-ActivityFenceListener.java
-FenceBroadcastReceiver.java
-```
-
-The files you will implement are:
-
-```
-Snapshot:
-HeadphoneSnapshotListener.java
-LocationSnapshotListener.java
-WeatherSnapshotListener.java
-
-Fence:
-HeadphoneFenceListener.java
-LocationFenceListener.java
-
-MainActivity.java
-```
-
-### Snapshot implementation
-All SnapshotListeners should implement
-ContextActivity.SnapshotListener. They should
-respond to the input received via `onSnapshot(Response response)`,
-by drawing text on the screen in the update
-`TextView`.
-
-The `Response` object will contain the specific information to
-display.
-
-### Fence implementattion
-For fences to work, you will need to implement
-`setupFenceListeners()` in `MainActivity.java`. In addition, you will
-need to complete the implementation of the two `FenceListener`
-classes, `HeadphoneFenceListener.java` and `LocationFenceListener.java`
-
-All fences should inherit from `FenceBroadcastReceiver.java` and
-implement
-`FenceBroadcastReceiver.FenceActivityListener`. They will need to
-implement three methods that respond to fence updates:
-`during(FenceState state)`,
-`starting(FenceState state)` and `stopping(FenceState state)` by updating text on the screen in
-the update `TextView`.
-
-The information to display will depend on the fence state. You will
-have to interpret this based on your knowledge of what you did to set
-up the fence. For instance, the locations given for the location fence
-will result in `state = FenceState.TRUE` in when `duringFence()` is
-called while the user is inside of the CSE building.
-
-There are detailed comments in the code files you will implement that will direct you through the assignment.
-
-# Turn-in
-
-## Submission Instructions
-
-You will turn in the following files [here](https://gitgrade.cs.washington.edu/student/assignment/64/turnin):
-
-```
-- HeadphoneSnapshotListener.java
-- LocationSnapshotListener.java
-- WeatherSnapshotListener.java
-- HeadphoneFenceListener.java
-- LocationFenceListener.java
-- MainActivity.java
-```
-
-You may also change:
-```
-- strings.xml
-- activity_main.xml
-- Any class you create that did not previously exist
-```
-
-## Grading (5pts)
-
-- Get API Keys: 1pt
-- Snapshots all work:
- - Location: .5pt
- - Headphone: .5pt
- - Weather: .5pt
-- Fences all work:
- - Headphone .5pt
- - Location .5pt
-- MainActivity sets things up correctly: .5pt
-- Code Organization and Style: 1 pt
diff --git a/assignments/sensing/1.png b/assignments/sensing/1.png
deleted file mode 100644
index aa18e9e8127d10337b85787f4c3183c6e260749f..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/1.png and /dev/null differ
diff --git a/assignments/sensing/2.png b/assignments/sensing/2.png
deleted file mode 100644
index a856b5246a0993c1989a78ab3674615d17c9f52d..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/2.png and /dev/null differ
diff --git a/assignments/sensing/3.png b/assignments/sensing/3.png
deleted file mode 100644
index f60092155f8f517cff64f3ff0cfb0df7ff6f0504..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/3.png and /dev/null differ
diff --git a/assignments/sensing/5.png b/assignments/sensing/5.png
deleted file mode 100644
index 90cb3d48a591e2f3ea7ba579bfff1e613135efa6..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/5.png and /dev/null differ
diff --git a/assignments/sensing/6.png b/assignments/sensing/6.png
deleted file mode 100644
index 9ab549f2a54e145edc1c79e91b68afa59e543eb5..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/6.png and /dev/null differ
diff --git a/assignments/sensing/7.png b/assignments/sensing/7.png
deleted file mode 100644
index 010d628641b10befffdd380ad95f066051d32800..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/7.png and /dev/null differ
diff --git a/assignments/sensing/8.png b/assignments/sensing/8.png
deleted file mode 100644
index 86efe8c08321b408604e60b492a6f403159a5d3a..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/8.png and /dev/null differ
diff --git a/assignments/sensing/9.png b/assignments/sensing/9.png
deleted file mode 100644
index 3aaa5c17f5ab1b139f6828dafbd284e4c1c67342..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/9.png and /dev/null differ
diff --git a/assignments/sensing/Test.gpx b/assignments/sensing/Test.gpx
deleted file mode 100644
index f7b004877a0c5b8da71e0e55d7c8bb68dfeb2fc9..0000000000000000000000000000000000000000
--- a/assignments/sensing/Test.gpx
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0"?>
-<gpx version="1.1" creator="gpxgenerator.com">
-<wpt lat="47.65379706591215" lon="-122.30192147338511">
-    <ele>15.01</ele>
-    <time>2018-11-14T04:23:56Z</time>
-</wpt>
-<wpt lat="47.653464621123724" lon="-122.30413161361338">
-    <ele>32.43</ele>
-    <time>2018-11-14T04:24:24Z</time>
-</wpt>
-<wpt lat="47.653464621123724" lon="-122.30477534377695">
-    <ele>36.13</ele>
-    <time>2018-11-14T04:24:32Z</time>
-</wpt>
-<wpt lat="47.65352243776071" lon="-122.30546198928477">
-    <ele>36.91</ele>
-    <time>2018-11-14T04:24:40Z</time>
-</wpt>
-<wpt lat="47.6531610827294" lon="-122.30582676971079">
-    <ele>32.73</ele>
-    <time>2018-11-14T04:24:48Z</time>
-</wpt>
-<wpt lat="47.653377896048234" lon="-122.30627738082529">
-    <ele>36.88</ele>
-    <time>2018-11-14T04:24:54Z</time>
-</wpt>
-<wpt lat="47.65395606049759" lon="-122.30653487289072">
-    <ele>38.36</ele>
-    <time>2018-11-14T04:25:05Z</time>
-</wpt>
-<wpt lat="47.65469321088665" lon="-122.30735026443125">
-    <ele>39.41</ele>
-    <time>2018-11-14T04:25:22Z</time>
-</wpt>
-<wpt lat="47.654620941700756" lon="-122.30784379088999">
-    <ele>40.08</ele>
-    <time>2018-11-14T04:25:28Z</time>
-</wpt>
-<wpt lat="47.65453421854566" lon="-122.30876647079111">
-    <ele>42.10</ele>
-    <time>2018-11-14T04:25:39Z</time>
-</wpt>
-<wpt lat="47.65483774895839" lon="-122.30936728561045">
-    <ele>42.50</ele>
-    <time>2018-11-14T04:25:48Z</time>
-</wpt>
-<wpt lat="47.65584950425836" lon="-122.30971060836436">
-    <ele>47.10</ele>
-    <time>2018-11-14T04:26:07Z</time>
-</wpt>
-<wpt lat="47.65648486332888" lon="-122.31038331985474">
-    <ele>47.17</ele>
-    <time>2018-11-14T04:26:21Z</time>
-</wpt>
-</gpx>
\ No newline at end of file
diff --git a/assignments/sensing/activity.png b/assignments/sensing/activity.png
deleted file mode 100644
index ceb064ea369c2852230d480971aea80905b32561..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/activity.png and /dev/null differ
diff --git a/assignments/sensing/apisearch.png b/assignments/sensing/apisearch.png
deleted file mode 100644
index 5189183ebcd008ceefb3981814c528b76490fc70..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/apisearch.png and /dev/null differ
diff --git a/assignments/sensing/emulator.png b/assignments/sensing/emulator.png
deleted file mode 100644
index 4c13f382bc29aedb06572d3c6f4071787719a33a..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/emulator.png and /dev/null differ
diff --git a/assignments/sensing/enable-play.png b/assignments/sensing/enable-play.png
deleted file mode 100644
index a1fba336913b18a4e208b828c57c85d5f08e2966..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/enable-play.png and /dev/null differ
diff --git a/assignments/sensing/enable-sensing.png b/assignments/sensing/enable-sensing.png
deleted file mode 100644
index ab41fa31392e7b1ca74e9c2c1911d513f245ff68..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/enable-sensing.png and /dev/null differ
diff --git a/assignments/sensing/headphone.png b/assignments/sensing/headphone.png
deleted file mode 100644
index 0dcb029d150a4045a1ade3a280260a568521a75f..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/headphone.png and /dev/null differ
diff --git a/assignments/sensing/play-updating.png b/assignments/sensing/play-updating.png
deleted file mode 100644
index 82aea37305ecdbcddb0c26416ec6a5e742d5a166..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/play-updating.png and /dev/null differ
diff --git a/assignments/sensing/play.png b/assignments/sensing/play.png
deleted file mode 100644
index 0170d1cd14c5988a3b6bda438badd5c7a27d3314..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/play.png and /dev/null differ
diff --git a/assignments/sensing/simulator.png b/assignments/sensing/simulator.png
deleted file mode 100644
index 54a4caf41a187e65ea66aa2d09868f8f12eceeb4..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/simulator.png and /dev/null differ
diff --git a/assignments/sensing/switching.png b/assignments/sensing/switching.png
deleted file mode 100644
index 33ba754479e653b824d319dd4aa1f7888191aa69..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/switching.png and /dev/null differ
diff --git a/assignments/sensing/weather.png b/assignments/sensing/weather.png
deleted file mode 100644
index 636bfb397f68d178ff671cc5e24fc26e816cf5f2..0000000000000000000000000000000000000000
Binary files a/assignments/sensing/weather.png and /dev/null differ
diff --git a/assignments/undo-img/1stroke.png b/assignments/undo-img/1stroke.png
deleted file mode 100644
index 74f5c3b15d18628f20ebe94dbfd5653e06c563b6..0000000000000000000000000000000000000000
Binary files a/assignments/undo-img/1stroke.png and /dev/null differ
diff --git a/assignments/undo-img/blank.png b/assignments/undo-img/blank.png
deleted file mode 100644
index 3b6866045aa154932680bd93a76a35dc684da912..0000000000000000000000000000000000000000
Binary files a/assignments/undo-img/blank.png and /dev/null differ
diff --git a/assignments/undo-img/start-recording.png b/assignments/undo-img/start-recording.png
deleted file mode 100644
index 74071876de4b175e0924d17b137b47c4dcfe8a46..0000000000000000000000000000000000000000
Binary files a/assignments/undo-img/start-recording.png and /dev/null differ
diff --git a/assignments/undo-img/tab-of-options.png b/assignments/undo-img/tab-of-options.png
deleted file mode 100644
index 7ae27b1907727b38c63253e1fed5c6c7f7b37956..0000000000000000000000000000000000000000
Binary files a/assignments/undo-img/tab-of-options.png and /dev/null differ
diff --git a/assignments/undo-report.md b/assignments/undo-report.md
deleted file mode 100644
index 670d72aade8b9cac005c25b86b63b09d47507041..0000000000000000000000000000000000000000
--- a/assignments/undo-report.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-layout: default
----
-# Report on Undo Assignment
-
-*Comments about what should be in your report can be found in italics.
-**Please remove the comments and replace them with your own words**.*
-
-## Introduction
-*Write two sentences describing the Undo drawing app and its core features
-(drawing strokes with different thickness and color, undo and redo).*
-
-*Include a picture of your improvement*
-
-*Write a paragraph describing the additional features that you added to the app. Fully
-explain the improvement, justify why the improvement is based on the principles presented
-in class, and describe how accessibility was addressed (maybe include quoted code that addresses the
-accessibility issue).*
-
-## Report on Heuristic Evaluation of application
-
-*Describe the purpose of the experiment. What do you expect to learn from conducting a Heuristic Evaluation?*
-
-### Tasks
-*Describe the tasks that are being tested in your heuristic evaluation.
-This should summarize all of the steps that are being done for your video*.
-
-### Data
-*How many people provided feedback to you?*
-
-
-*Group like issues; Write up a summary as described in lecture*
-
-*Provide a table of issues and severity. You can group like issues, even though they may be labeled under different issues if it truly is the same thing.*
-
-| Priority | Issue | Good/Bad | Step | Heuristic(s) | Severity: F | B | P | Overall |
-|------|-------|----------|------|---------------|--------------|--------------|--------------|--------------------|
-| |       |          |      |               |              |              |              |                    |
-| |       |          |      |               |              |              |              |                    |
-| |       |          |      |               |              |              |              |                    |
-
-## Overview of what you learned
-
-*Highlight the biggest problem or problems with your interface*
diff --git a/assignments/undo.md b/assignments/undo.md
deleted file mode 100644
index 9cedfe4d340c7cf85a082802591dc278a5606787..0000000000000000000000000000000000000000
--- a/assignments/undo.md
+++ /dev/null
@@ -1,665 +0,0 @@
----
-layout: assignment
-published: true
-
-title: Undo
-code: as6
-
-assigned: May 22nd
-due:
-- Programming <br>
-  - <strong>Due</strong> June <del>1</del> 3, 2020, 10:00pm<br>
-  - <strong>Lock</strong> June 3, 2020, 10:00pm
-- Heuristic Evaluation <br>
-  - <strong>Due</strong> June 5, 2020, 10:00pm (no leeway)
-- Reflection <br>
-  - <strong>Due</strong> June 8, 2020, 10:00pm
-
-revised: 9:00pm, Wednesday, May 20th, 2020
-
-objective: Understand Undo Abstractions, practice Heuristic Evaluation
-
-android_goals:
-  - Be able to understand and modify an existing user interface
-  - Learn about floating action buttons
-  - Implement core data structure for Undo
-hci_goals:
-  - Modify and existing app in a consistent fashion
-  - Make your modifications accessible
-  - Make your modifications usable
-  - Use heuristic evaluation to assess an app
----
-
-* TOC
-{:toc}
-
-# GitGrade links
-
-[Accept the Assignment](https://gitgrade.cs.washington.edu/student/assignment/128) / [Turn-in the Assignment](https://gitgrade.cs.washington.edu/student/assignment/128/turnin) / [Review your Submissions](https://gitgrade.cs.washington.edu/student/summary/8723)
-
-# Overview of assignment
-
-- Handle undo/redo operations (required)
-- Add a new thickness (0) to your app (required)
-- Replace the color menu with a ColorPickerView (required)
-- Make sure the button you add is accessible (required)
-- Improve your app by adding a feature (not thickness, required)
-- Make sure your change is accessible (required)
-- Try to identify at least one usability problem and address it
-  (optional)
-- Provide Heuristic Evaluation feedback to others (required)
-- Reflect on the Heuristic Evaluation feedback you recieved from others in your report (required)
-- Think about how course concepts apply to Undo in your reflection (required)
-
-
-Demo of our solution:
-
-<iframe width="560" height="315" src="https://www.youtube.com/embed/ClIx2wacu8M" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-
-# Explanation of Codebase
-
-This is one of the more complex programs we are giving you in terms of
-code. Moreover the starter code is already has a couple of fully functional features that
-you will be modifying as part of this assignment.
-
-The initial interactor hierarchy at instantiation is shown below
-(shown at the side is a legend for the visibility status of different
-interactors). Hidden means on screen and drawn but hidden behind
-something else.
-
-The Floating Action Button (FAB) subtrees are the
-menus at the top of the screen (for undo and redo) and bottom (for
-color and thickness), made up of one or more floating
-action buttons. The `DrawingView` is the place where drawing takes
-place. Each new stroke is saved as a separate, new `StrokeView` added
-to the `DrawingView`.
-
-The FABs in this assignment refer to [Floating Action
-Buttons](https://developer.android.com/reference/com/google/android/material/floatingactionbutton/FloatingActionButton.html).
-
-<div class="mermaid">
-graph TD
-M[ReversibleDrawingActivity] --> D[DrawingView]
-M --> FUndo[FAB:Undo]
-M --> FRedo[FAB:Redo]
-M --> FColor[FAB:Color]
-M --> FThick[FAB:Thickness]
-FColor --> Red[Red]
-FColor --> Green[Green]
-FColor --> Blue[Blue]
-FThick --> Thin[Thin]
-FThick --> Med[Med]
-FThick --> Thick[Thick]
-
-Vis[Visible] --> In[Invisible]
-In --> Hid[Hidden]
-
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-
-class M,D,FColor,FThick,Vis start
-class Red,Green,Blue,Thin,Med,Thick,Hid normal
-
-</div>
-
-When the user draws on screen (by clicking and dragging inside the
-`DrawingView`, this adds a new `StrokeView` to the interface. Notice
-that the `Undo` button is now visible instead of invisible because there
-is an action to undo.
-
-<div class="mermaid">
-graph TD
-M[ReversibleDrawingActivity] --> D[DrawingView]
-D --> Stroke1[StrokeView]
-M --> FUndo[FAB:Undo]
-M --> FRedo[FAB:Redo]
-M --> FColor[FAB:Color]
-M --> FThick[FAB:Thickness]
-FColor --> Red[Red]
-FColor --> Green[Green]
-FColor --> Blue[Blue]
-FThick --> Thin[Thin]
-FThick --> Med[Med]
-FThick --> Thick[Thick]
-Vis[Visible] --> In[Invisible]
-In --> Hid[Hidden]
-
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-
-class M,D,Stroke1,FUndo,FColor,FThick,Vis start
-class Red,Green,Blue,Thin,Med,Thick,Hid normal
-
-</div>
-
-The sequence in the interface:
-
-<img src="undo-img/blank.png" alt="Empty drawing program window" height="400">
-<img src="undo-img/1stroke.png" alt="Drawing program window with one red stroke and undo button visible" height="400">
-
-You can play around with the interface to change color and
-thickness. Each new stroke you add adds another `StrokeView` to the interface.
-
-# Codebase Structure
-
-This is a complete codebase for a drawing program. It is designed to
-be as modular as possible and includes support for _Command Objects_ which
-encapsulate changes to the application model.
-
-## Actions
-
-Actions are Command Objects, which encapsulate changes to the
-application model. An `AbstractAction` has a single method, `doAction(view)` which,
-when called, will apply the action to the view (our provided implementation is incomplete)
-
-`AbstractReversibleAction` extends `AbstractAction` to add `undoAction(view)` which,
-when called, reverses the action.
-
-
-<div class="mermaid">
-classDiagram
-
-AbstractAction <|.. AbstractReversibleAction
-AbstractReversibleAction <|.. ChangeColorAction
-AbstractReversibleAction <|.. ChangeThicknessAction
-AbstractReversibleAction <|.. AbstractReversibleViewAction
-AbstractReversibleViewAction <|.. StrokeAction
-
-class AbstractAction {
-  doAction()
-}
-
-class AbstractReversibleAction {
-  +boolean done
-  +undoAction
-}
-
-class AbstractReversibleViewAction  {
-  +invalidate
-}
-
-
-</div>
-
-As with events, `AbstractActions` are part of an inheritance
-hierarchy. `AbstractReversibleAction` has three subclasses --
-`ChangeThicknessAction`, `ChangeColorAction` and `StrokeAction`.
-All of them modify properties of the `DrawingView`
-class. `ChangeThicknessAction` modifies the stroke width, `ChangeColorAction`
-will modify current color of the stroke, and the , and `StrokeAction.`represents
-the creation of a child view object that encapsulates a painted stroke (a `StrokeView`
-that is added to the `DrawingView`).
-
-## Application Code (`/app`)
-
-We've mentioned a `DrawingView` (which is the main canvas for the
-drawing application) and `StrokeView` (which encapsulates a specific
-stroke for the drawing application).
-
-<div class="mermaid">
-classDiagram
-
-AbstractDrawingActivity <|.. AbstractReversibleDrawingActivity
-AbstractReversibleDrawingActivity <|.. ReversibleDrawingActivity
-class AbstractDrawingActivity {
-  DrawingView: "Canvas the user draws on"
-  addMenu()
-  addCollapsableMenu()
-  doAction()
-}
-
-class AbstractReversibleDrawingActivity {
-  +AbstractStackHistory
-  +doAction()
-  +undo()
-  +redo()
-}
-
-class ReversibleDrawingActivity {
-  +onAction()
-  +onColorSelected()
-  +onThicknessSelected()
-}
-
-class StrokeView {
-   Path
-   onDraw()
-}
-</div>
-
-- `AbstractDrawingActivity` is an abstract class for an app that supports
-  drawing without support for Undo. If you changed the manifest to use
-  it (you would need to make it not abstract first), you would see
-  blank canvas that you can draw on with no thickness or color options.
-  *NOTE: if you do this experiment, remember to make it abstract again when you're done!*
-- `AbstractReversibleDrawingActivity` extends `AbstractDrawingActivity` and adds
-  support for undo to it, including both the undo/redo buttons and the
-  history. You can try changing the manifest to use this as well (not
-  abstract). *NOTE: if you do this experiment, remember to make it abstract again when you're done!*
-- `ReversibleDrawingActivity` inherits from
-  `AbstractReversibleDrawingActivity`. It adds support for thickness and color
-  to the undo/redo support in `AbstractReversibleDrawingActivity`. It also
-  adds menus to show them. You can make a drawing application without
-  support for history by changing `ReversibleDrawingActivity` to inherit from
-  `AbstractDrawingActivity` instead.
-- `DrawingView` is the canvas on which drawing takes place. Drawings
-  are made up of `StrokeView` classes which are added to the
-  `DrawingView`. This class also implements a PPS (shown below) which
-  responds to `onTouchEvent()` by creating `StrokeViews`.
-- `StrokeView` is a single stroke. A stroke has a `path` and `paint`
-  object which define it.
-
-<div class="mermaid">
-graph LR
-S((.)) --> A((Start))
-A -- "Press:onDrawStart()" --> I(Drawing)
-I -- "Release:onDrawEnd()" --> E[End]
-I -- "Cancel:onDrawCancel()" --> E[End]
-I -- "Move:onDrawMove()" --> I
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-class S invisible
-class A start
-class E finish
-class I normal
-
-</div>
-
-# Parts 1-5: Programming requirements
-
-There are five parts for the programming portion of this assignment:
-- Part 1: Implement `ChangeThicknessAction`
-- Part 2: Implement history
-- Part 3: Add a thickness 0 FAB to the thickness menu
-- Part 4: Integrate `ColorPickerView`
-- Part 5: Add a new feature to your app. Make sure it is accessible
-
-You can also (optionally) work on improving the usability
-
-## Part 1: Implement `ChangeThicknessAction`
-
-In order to familiarize yourself with Actions and reversible logic, implement
-`ChangeThicknessAction`. This will be very similar to `ChangeColorAction`, you should read and
- understand that code before implementing your `ChangeThicknessAction`.
-
-## Part 2: History
-
-`Actions` are the objects that are used in the history. An
-`AbstractHistory` simply allows an `AbstractReversibleAction` to be added and supports `undo()`
-and `redo()`. We subclass this with a stack-based history class called `StackHistory` to support
-`undo()` and `redo()`. You will implement the methods to support these features in this `StackHistory` class.
-
-A `StackHistory` has a `capacity` (a max number of actions that it can
-store), a `undoStack` (the history) and a `redoStack` (actions that
-have been undone and can be re-applied). It also supports specific capabilities you must implement (see comments in the code
-for specifically what to do):
-
-- `addAction()` adds an action to the history stack
-- `undo()` undo the top action in the history stack
-- `redo()` redo the top action in the redo stack.
-- `clear()` reset everything
-
-<div class="mermaid">
-classDiagram
-
-AbstractStackHistory <|.. StackHistory
-class AbstractStackHistory {
-  addAction(AbstractReversibleAction action)
-  undo()
-  redo()
-  canUndo()
-  canRedo()
-}
-
-class StackHistory {
-   +capacity: "Max stack size"
-}
-
-
-</div>
-
-__Related APIs__
-
-[Deque](https://developer.android.com/reference/java/util/Deque)
-
-### Undo/Redo behavior
-
-Here is a scenario where the user draws a stroke in the default
-color/thickness (1), changes the color (2), changes the thickness (3), and draws
-another stroke (4) in the original thickness and color, with various
-undos and redos mixed in.
-
-| Action               | Undo Stack | Redo Stack | Interface state |
-| -------------------- | ---------- | ---------- | --------------- |
-| drawstroke (1)       | 1          |            | 1               |
-| change color (2)     | 1,2        |            | 1,2             |
-| undo                 | 1          | 2          | 1               |
-| redo                 | 1, 2       |            | 1, 2            |
-| change thickness (3) | 1, 2, 3    |            | 1, 2, 3         |
-| undo                 | 1, 2       | 3          | 1, 2            |
-| undo                 | 1          | 3, 2       | 1               |
-| drawstroke (4)       | 1, 4       | CLEARED    | 1, 4            |
-| undo                 | 1          | 4          | 1               |
-
-## Requirement 3: Adding a thickness 0 FAB to the thickness menu
-
-There are two main things you will need to do to add one.
-
-First, you find the right place in `thickness_menu.xml` to
-modify. For example, this is the XML in that file for the thickest FAB
-Action Button:
-
-```XML
-<android.support.design.widget.FloatingActionButton
-        android:id="@+id/fab_thickness_30"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="bottom|center"
-        android:layout_marginBottom="@dimen/fab_label_margin"
-        android:alpha="0"
-        android:clickable="false"
-        android:contentDescription="@string/thickness_desc"
-        app:fabSize="mini"
-        app:srcCompat="@drawable/ic_thickness_30" />
-```
-
-You must use the `@string` notation for your `android:contentDescription`, meaning you'll
-need to add a string definition to `values/strings.xml`.
-
-Next, you will need to update `onThicknessSelected` to respond when
-your FAB is pressed. It must change the stroke width to 0.
-
-Finally, you will need to make sure that `ReversibleDrawingActivity` is updated to account
-for your new menu item, since all mentions of thickness are currently hard coded to assume there is no 0 thickness.
-
-## Part 4: Integrating color picker
-In addition to adding a thickness, we want to be able to draw strokes of _any_ color instead of
-being limited to 3. You may recall that we have already made a custom interactor that allows
-users to choose any color on the color spectrum in a previous assignment. It is time to wire up a
-`ColorPickerView` into this application! To do this, you'll need to:
-
-1. Copy over the `ColorPickerView.java` file from your color picker assignment. Put this file
-in the same directory as your `ReversibleDrawingActivity.java`
-file. Also be sure to change the package at the top from `cse340.colorpicker`
-to `cse340.undo.app` in your `ColorPickerView.java` file.
-
-2. Add your color picker to your layout. One way to do this is to add xml for your
-`ColorPickerView` to  `drawing_activity.xml`. Be sure it is neither visible
-nor focusable until the user clicks on the color FAB. Be sure to use the correct package name here too.
-
-3. Change the behavior of the color FAB so that, when clicked, it opens up the color picking
-interface instead of opening the collapsible color menu. For reference on how to do this,
-take a look at `ReversibleDrawingActivity.java#onCreate` (**hint:** make sure to take a look at
-what interfaces `ReversibleDrawingActivity.java` implements).
-
-4. Modify `onDraw()` to leave the center circle blank.
-
-When users have the color picker interactor open, they _must not_ be able to access any other
-FABs (undo, redo,  thickness change) so be sure to disable them when you show the color picker
-and visually indicate to the user that they are disabled. This behavior should be very similar
-to the what happens when you try to change the thickness using the collapsible menu. If a color
-change is undone or redone, the color picker must reflect the correct color. Once you set up
-all the listeners to respond correctly, your color picker interactor must allow users to pick
-any stroke color they want!
-
-Finally, you will need to modify `ColorPickerView` so that it only accepts input inside the thin color
-ring. We have provided an AbstractColorPickerView class for you with an
-updated EssentialGeometry enum whose values are now `WHEEL` and `OFFWHEEL` to indicate this change,
-so you will have to update `ColorPickerView#essentialGeometry(MotionEvent)` method to reflect
-this change.
-
-The behavior of the ColorPickerView is must also be modified slightly.
-
-- If the user brings up the interactor, then immediately presses inside the center of the ring
-(which was colored in the ColorPicker app but is blank now), or outside it, you must not leave the start state.
-- If the users brings up the interactor and presses (then moves) inside of the ring, the
-state will leave the the start state and will move to the inside state. The thumb will
-track in the same way it did for the ColorPicker as the user moves around the ring.
-- If the user releases ON the ring, the new color will be chosen and the ColorPicker will become
-invisible.
-- If the user releases when not on the ring you should exit the state machine
-AND not consume the input. To the user this will appear as though the color "snaps back" to the
-previous state (with an opaque thumb) but the color picker stays visible on the screen.
-
-The following PPS diagram describes this new behavior.
-
-<div class="mermaid">
-graph LR
-S((.)) --> A((Start))
-A -- "Press:WHEEL-A" --> I((Inside))
-I -- "Release:WHEEL-B" --> E[End]
-I -- "Release:OFFWHEEL-E" --> E[End]
-I -- "Drag:WHEEL-C" --> I
-I -- "Drag:OFFWHEEL-D" --> I
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-class S invisible
-class A start
-class E finish
-class I normal
-
-</div>
-
-where
-- A is updateModel();invalidate()
-- B is invokeColorChangeListeners();invalidate()
-- C is updateModel();invalidate()
-- D is doNothing() // although not really a method
-- E is resetColor();invalidate()
-
-To implement the new `ColorPickerView#resetColor()` method you will need to store the current color
-of the wheel before you change it using `updateModel()`. You can use this stored color to reset
-the wheel if the user releases when not in the ring.
-
-NOTE: You **do not need to use bundler** to change the starting color or to store your model for this assignment.
-
-_Related APIs_:
-[View#using-views](https://developer.android.com/reference/android/view/View#using-views)
-
-## Part 5: Improve the application
-
-Create an interesting way the user can interact with the application that **can be undone and redone**. This means that whatever interaction you
-add must have a custom undo and redo function (it might help to take a look at `AbstractReversibleAction#doAction` and `AbstractReversibleAction#undoAction(DrawingView)`).
-
-Whatever you choose to implement, make sure to describe your addition in your report.
-In addition, make sure that the action you add is accessible.
-
-Demo of a new feature: Clear Screen. Note that this solution does not use the ColorPicker, nor
-did it implement undo on this features (but you must do both).
-
-<iframe width="560" height="315" src="https://www.youtube.com/embed/NhUE7GgH-vc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-
-You will describe this addition and its accessibility in your report (see below).
-
-## Optional addition: Improving usability
-
-Try to identify at least one usability problem and address it
-  (optional). As with adding a feature, there are several options
-  here. Here are some examples of things _I_ think are usability issues. You
-  may not agree, if you choose to do this, you should focus on
-  something _you_ think is a usability issue.
-
-Whatever problems you address, please briefly describe the problems and solutions in your report.
-
-- As a color is selected and after the color is selected, the color FAB
-  should update its background to that color.
-- When a thickness is picked, the thickness FAB should update its icon
-  to indicate the thickness selected.
-- If the user begins drawing with the color or thickness FAB open (sub-icons present) the FAB immediately collapses
-- Some might find the menu items small and hard to select
-- No saving of state between invocations of the application. Could use
-  bundle to do this.
-
-
-# Part 6: Report
-
-In this portion you will be providing Heuristic Evaluation feedback and also reflecting on feedback that others have given you.
-
-## 6.1 Video
-To facilitate the online-only nature of this quarter, you will need to make a video of your final
-solution. To create a video, click on the ... at the bottom of the panel to the right of your
-emulator, then select "screen record" and "start recording" (see images below).
-
-<img src="undo-img/tab-of-options.png" alt="Empty drawing program window" height="400">
-<img src="undo-img/start-recording.png" alt="Drawing program window with one red stroke and undo button visible" height="400">
-
-In addition, you should follow these instructions to make sure that clicks are visible:
-
-<iframe width="560" height="315" src="https://www.youtube.com/embed/yYPZTnmP3Ws" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-
-
-Your video should have the following sequence which is to demonstrate undoing and redoing
-actions for changing thickness, color, and your new feature. Please DO NOT try to create a
-perfect version with no mistakes! You *will not* lose points for any usability
-issues or mistakes (unless your code isn't working, which will not be affected by
-this video). You *will* get much better feedback and learn more about
-Heuristic Evaluation if your video isn't perfect!
-
-- Step 1: draw something
-- Step 2: undo
-- Step 3: change the thickness
-- Step 4: draw something
-- Step 5: undo
-- Step 6: undo
-- Step 7: change color
-- Step 8: try to redo
-- Step 9: draw something
-- Step 10: use new feature
-- Step 11: draw something in the new feature (if you need to)
-- Step 12: undo drawing (if done)
-- Step 13: undo new feature
-- Step 14: draw something
-- Step 15: use new feature
-- Step 16: undo
-- Step 17: redo
-- Step 18: draw something
-
-Finish as you will (e.g. demonstrate optional usability improvement).
-
-## 6.2 Providing Heuristic Eval feedback
-
-You will be assigned four videos. For each one you should:
-
-- Watch the video
-- While watching, take notes on paper about issues you see.
-- Remember: Make two passes through video as discussed in class:
-   - Inspect flow
-   - Inspect each screen, one at a time against heuristics
-- Fill out the following [google form](https://docs.google.com/forms/d/e/1FAIpQLScDe9k5bOKFikyh4ai32ih1e8waMD4SMECAjZK3yRVl1u-eDQ/viewform)
-with the 3 most severe issues. This will include questions about:
-  - Who are you/ who are you evaluating
-  - Which task step (above)
-  - Which heuristics are violated (primary and secondary)
-  - What severity rating would you give it
-  - Take a picture (a frame of the video) and circle the issue
-  - Describe what happened
-
-You will submit 3 things for each assigned video. At least two should be bad issues, one can be good.
-
-## 6.3 Reflecting on Heuristic Eval feedback and other aspects of this assignment
-
-You will turn in a report describing the feedback you got from the Heuristic Evaluation and answering other questions about the assignment. We have provided a [template](undo-report).
-
-# Part 7: Reflection
-
-Your reflection should be done as Microsoft Word, Google or other type of document.
-Copy the following questions (in italics below) into your reflection document and add
-your responses below each question. You can have more than one answer per page, but if
-you can, please try to avoid page breaks in the middle of
-a question. Insert page breaks between questions as needed.
-
-1. _Review the Heuristics from [lecture](https://courses.cs.washington.edu/courses/cse340/20sp/slides/wk10/heuristic.html).
-Which of the heuristics fit mobile application design? Which of the heuristics are less relevant?
-What problems did the heuristics not capture?_
-
-2. _Relate the heuristics to the gulf of evaluation and the gulf of execution:_
-  * _Pick at least one heuristic that you believe captures a problem relating to the gulf of
-  evaluation. Explain why._
-  * _Pick at least one heuristic that you believe captures a problem relating to the gulf of
-  execution. Explain why._
-
-3. _How secure is the Undo app? What security issues could arise with this app?
-List the security principals presented in lecture and categorize
-them as (1) violated, (2) met, (3) not relevant in the Undo app. Defend your
-reasoning._
-
-4. _How would you add context-aware computing in your Undo drawing app? Pick one of the types of
-sensing-based apps (capture and access; adaptive services; novel interaction; behavioral imaging;
-data collection & response) and discuss how it could enhance the app. Describe a case where this
-new feature could be problematic and relate it to the Sensing lecture._
-
-5. _Think back to all of the assignments you have done, and the design principles we have learned from
-Properties of People I and II, Application Design, Accessibility, and Security, been used i
-n your assignments? List and define in your own words 5 Interaction Programming design
-tips from these lectures. Also give an example of which, if any, of the assignments did
-you see that concept used (you can do this even if it was not explicitly named in the learning
-objectives we gave). Please explain your answer_
-
-6. (1pt Extra Credit) Instructor note: Usually on an exam I like to have a fun, 1 pt, extra credit
-problem where student can draw something or write a poem. We're not having traditional exam, but I feel the
-tradition of the fun extra credit must go on. _In an number of sections this quarter the TAs
-created a [Kahoot!](https://kahoot.com/) to help students study for the examlets. (For those of you
-who could not make section, Kahoot! is an on line game that allows participants to answer
-timed, fun questions. ). You can earn your extra credit point by authoring a Kahoot! question
-(and answer(s)) that we could potentially use in our CSE 340 offering. This can be a serious or
-fun question, but school appropriate please!_
-
-
-# Turn-in
-
-## Submission Instructions
-
-You will turn in the following files via GitGrade. It will accept:
-
-- `history/StackHistory.java`
-- `app/ReversibleDrawingActivity.java`
-- `app/ColorPickerView.java`
-- `actions/ChangeThicknessAction.java`
-- Any additional classes you create in `cse340.undo` for your new action
-- `layout/*_menu.xml`
-- `layout/drawing_activity.xml`
-- `drawable/*`
-- `values/{colors,dimens,strings}.xml`
-
-
-You will turn in the following files via our [google form](https://docs.google.com/forms/d/e/1FAIpQLScAh5Zux4YMp2mZzYjurVhzdrFESL1MRHdHeMZP2cExOxL47w/viewform):
-- Your video
-
-You will turn in your reflection and report (separately) on Gradescope
-
-## Grading
-
-This HW will be out of 50 points and will roughly (subject to small adjustments) be distributed as:
-
-Implementation (20 pts)
-- Part 1: Implement ChangeThicknessAction (2pts)
-- Part 2: StackHistory (7pts)
-- Part 3: Adding thickness to FAB thickness menu (3pts)
-- Part 4: Integrating ColorPickerView (7pts). Includes correct interactive behavior,
-and correct interaction with the stack.
-- Code Organization, and Style: (1 pt)
-
-Heuristic Evaluation & Reflection (35 pts)
-- Part 5: Improvement (3 pts). Evaluated through video of application. Improvement
-is evident, significant and can be done, undone, then done again.
-- Part 6:
-  - Video order is correct (3pts)
-  - Heuristic Evaluation Form filled out (based on form) (3pts)
-  - Report (11pts) includes Introduction and detailed description of your improvement,
-  including a justification of your design based on principles and accessibility support,
-  Purpose, Task, Data, and Lessons learned
-- Part 7: Reflection (15 pts). Includes the following reflection questions:
-  - How well do the heuristics fit mobile application design? (3 pts)
-  - Relate the heuristics to the gulf of evaluation and the gulf of execution (3 pts)
-  - How secure is the Undo app? (3 pts)
-  - How would you use context-aware computing in your drawing app? (3 pts)
-  - How have Properties of People I and II been used in your assignments? (3 pts)
-  - End of class picture (1 pt extra credit)
diff --git a/diagrams/Jan 2020 University of Washington Intro to Accessibility and Inclusive Design.pptx b/diagrams/Jan 2020 University of Washington Intro to Accessibility and Inclusive Design.pptx
deleted file mode 100644
index 1f9bbf92e1df9d51e700796c0a71dc41da15168d..0000000000000000000000000000000000000000
Binary files a/diagrams/Jan 2020 University of Washington Intro to Accessibility and Inclusive Design.pptx and /dev/null differ
diff --git a/diagrams/diagrams.pptx b/diagrams/diagrams.pptx
deleted file mode 100644
index 88318c778d4292cc07239815fa908eca17c15a14..0000000000000000000000000000000000000000
Binary files a/diagrams/diagrams.pptx and /dev/null differ
diff --git a/diagrams/diagrams/mvc.png b/diagrams/diagrams/mvc.png
deleted file mode 100644
index d8461c69af23ceebca4b045b0b1356db5049e4d2..0000000000000000000000000000000000000000
Binary files a/diagrams/diagrams/mvc.png and /dev/null differ
diff --git a/diagrams/layout.pptx b/diagrams/layout.pptx
deleted file mode 100644
index 2cfddb1d2ab829e0415ec3d43e843b49f90330d3..0000000000000000000000000000000000000000
Binary files a/diagrams/layout.pptx and /dev/null differ
diff --git a/docs/android_files/AndroidStudio_Device_Manager_1.png b/docs/android_files/AndroidStudio_Device_Manager_1.png
deleted file mode 100644
index 102912e1b51be70337948e78dd1d94f89744241b..0000000000000000000000000000000000000000
Binary files a/docs/android_files/AndroidStudio_Device_Manager_1.png and /dev/null differ
diff --git a/docs/android_files/Device_Manager_File_Structure_2.png b/docs/android_files/Device_Manager_File_Structure_2.png
deleted file mode 100644
index 5c69e91aac44d2e3107b53ae7c29b96dc86acf69..0000000000000000000000000000000000000000
Binary files a/docs/android_files/Device_Manager_File_Structure_2.png and /dev/null differ
diff --git a/docs/android_files/Saving_CSV_3.png b/docs/android_files/Saving_CSV_3.png
deleted file mode 100644
index ca70ae3572e74b3299a9187a61cdca25cac716ce..0000000000000000000000000000000000000000
Binary files a/docs/android_files/Saving_CSV_3.png and /dev/null differ
diff --git a/docs/android_files/index.md b/docs/android_files/index.md
deleted file mode 100644
index 87ce28e47cb0c3c6a7a33e2a33fd6373bcfc2d25..0000000000000000000000000000000000000000
--- a/docs/android_files/index.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-layout: default
----
-
-* TOC
-{:toc}
-
-# Retreiving Data from an Android Device or Emulator
-
-1. When you open Android Studio to your as5-menus project, you will see a "Device File Explorer" tab in the lower right corner:
-
-    ![Arrow to Android Studio's Device File Explorer Tab, 30%](AndroidStudio_Device_Manager_1.png){:width="max-width"}
-
-2. When you click this tab (make sure your emulator is already running or physical device is plugged in) you will see the file structure of your emulator:
-
-    ![Highlighting TestResult.csv in Android Studio's Device File Explorer Tab](Device_Manager_File_Structure_2.png){:width="50%"}
-
-3. Once you have found TestResult.csv under `/storage/emulated/0/CSE340_Menus/TestResult.csv` or `/sdcard/CSE340_Menus/TestResult.csv` you can right-click to save it to your computer:
-
-    ![Right-Clicking for "Save As" on TestResult.csv](Saving_CSV_3.png){:width="max-width"}
-
-4. Now that you have the file saved to a location on your computer you can right-click to open it in Microsoft Excel or upload it to Google Sheets to process the data.
\ No newline at end of file
diff --git a/docs/dev_mode/About_Settings_Section.png b/docs/dev_mode/About_Settings_Section.png
deleted file mode 100644
index c16b524e6d48410f9e48e24636caaa1ab801ed4b..0000000000000000000000000000000000000000
Binary files a/docs/dev_mode/About_Settings_Section.png and /dev/null differ
diff --git a/docs/dev_mode/Build_Number.png b/docs/dev_mode/Build_Number.png
deleted file mode 100644
index 919fdf4d839a16965bad9fbdb1d2d56144f8708a..0000000000000000000000000000000000000000
Binary files a/docs/dev_mode/Build_Number.png and /dev/null differ
diff --git a/docs/dev_mode/Developer_Options.png b/docs/dev_mode/Developer_Options.png
deleted file mode 100644
index b40d373ef468155b281853984890841ae5e49470..0000000000000000000000000000000000000000
Binary files a/docs/dev_mode/Developer_Options.png and /dev/null differ
diff --git a/docs/dev_mode/Settings_Icon.png b/docs/dev_mode/Settings_Icon.png
deleted file mode 100644
index 60a024802f43f4b9a832e10c8ca9be936bf25539..0000000000000000000000000000000000000000
Binary files a/docs/dev_mode/Settings_Icon.png and /dev/null differ
diff --git a/docs/dev_mode/System_Settings.png b/docs/dev_mode/System_Settings.png
deleted file mode 100644
index b93d0f0372f01ecd426311f7e509b49cd172dfb1..0000000000000000000000000000000000000000
Binary files a/docs/dev_mode/System_Settings.png and /dev/null differ
diff --git a/docs/dev_mode/USB_Debugging.png b/docs/dev_mode/USB_Debugging.png
deleted file mode 100644
index 8299c76c5a9f768fb21d0e241a69344001e553fc..0000000000000000000000000000000000000000
Binary files a/docs/dev_mode/USB_Debugging.png and /dev/null differ
diff --git a/docs/dev_mode/index.md b/docs/dev_mode/index.md
deleted file mode 100644
index b39ceee0ac2cdec079e0010dca29a0f3067a263a..0000000000000000000000000000000000000000
--- a/docs/dev_mode/index.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-layout: default
----
-
-* TOC
-{:toc}
-
-# USB Debugging on Android
-
-If you have a personal device that you wish to use with Android Studio, enabling USB debugging is an important step in getting feedback sent from your phone to your PC. Setting this up, however, requires you to enable **Developer Mode** on your device.
-
-1. Open the `Settings` app on your device.
-
-    ![Clicking on Settings App in Android Appdrawer, 30%](Settings_Icon.png){:width="30%"}
-
-2. Scroll down to the `About Phone` submenu within the `Settings` app. This may be nested in a syntactically similar menu, such as `System`, and/or have a slightly different name.
-
-    ![Clicking on 'About' in Android System Settings, 30%](About_Settings_Section.png){:width="30%"}
-
-3. Scroll down to `Build Number` in the `About Phone` submenu.
-
-    ![Clicking on 'Build Number' in About Phone, 30%](Build_Number.png){:width="30%"}
-
-4. Tap `Build Number` several times. After a few taps, a Toast should appear notifying you that you are now a developer.
-
-5. Back out of the `About Phone` submenu. You should now see a `Developer Options` submenu on your device, somewhere in the same category as `About Phone`.
-
-    ![Clicking on 'Developer Options' in System Settings, 30%](Developer_Options.png){:width="30%"}
-
-6. In the `Developer Options` submenu, you should have the option to enable USB debugging.
-
-    ![Clicking on 'USB Debugging' in Developer Options, 30%](USB_Debugging.png){:width="30%"}
-
-Once you have done that, you will be able to debug your applications directly from your device.
-
-# Debugging Strategies
-
-- As with JGRASP, you can set breakpoints in your code by clicking to the right of a given line number. Then, by clicking the "debug" button to the right of the "run" button in the upper-right toolbar, you can have your app pause at the breakpoint, allowing you to inspect the state of your application.
-
-- The Logcat window can be difficult to parse, as the device tends to print out a lot of information that isn't necessarily relevant to your debugging process. However, Logcat provides a host of tools for pruning the errors that are displayed. You can limit console output by priority, or use the search tab to find the most relevant errors.
-
-- The Log class in Android Studio allows you to create custom sortable log statements. By importing `android.util.Log`, you gain access to a host of logging commands intended to display the state of your application quickly. Combining these with Logcat's search tools can be a good way to ensure that your function calls are running properly.
-
-- If you're curious about the implementation of core Android classes, you can use the tools provided by the IDE to view the inner workings of them. Android Studio will display an icon to the right of the line number to provide information on overriding methods for instance.<!--  -->
diff --git a/docs/index.md b/docs/index.md
index ba11d1e5e55d9d83c70b03752c623c7e4ac23f8d..e5f695af4ba3583f28adec5e2cb4de2ec4b5811d 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -17,10 +17,3 @@ slowly and will continue to be added to.
 - [GIT 101]({{site.baseurl}}/docs/git.html)
 - [GitGrade]({{site.baseurl}}/docs/gitgrade)
 
-**Handy Programming Resources**
-
-- [Debugging]({{site.baseurl}}/docs/dev_mode)
-- [Android File Explorer]({{site.baseurl}}/docs/android_files)
-- [Java 101]({{site.baseurl}}/docs/java/java.html)
-- [Advanced Java]({{site.baseurl}}/docs/java/java-advanced.html)
-- [Java example code]({{site.baseurl}}/docs/java/JavaRefresher.zip)
diff --git a/docs/java.html b/docs/java.html
deleted file mode 100644
index acc8c49f915240cbc2be0220ffc1fc33eec126af..0000000000000000000000000000000000000000
--- a/docs/java.html
+++ /dev/null
@@ -1,332 +0,0 @@
----
-layout: presentation
-title: Lab 1 Slides
-description: Lab project--Hello World--
-class: middle, center, inverse
----
-
-# SSUI Mobile Lab ({{site.quarter}})
-## Week 1: Java Refresher
-
-.title-slide-logo[
-  ![Android Logo](java/android-logo.png)
-]
-
----
-
-# Quick Java Refresher
-
----
-
-## What is Java?
---
-
-- Strongly, statically typed language
-
-  - Every variable has a type
-  - This type is decided at compile time (mostly)
-
---
-
-- Compiled, class-based, Object-oriented
-
---
-
-- Platform agnostic
-
-  - __Write once__, _run anywhere_ without recompilation
-  - Especially useful for Android
-
----
-
-## Java Basics: Primitive Types
-
---
-- Boolean
-
-```java
-boolean hasClassStarted = true;
-boolean isClassOver = false;
-```
-
---
-- Integer
-
-```java
-int numStudents = rand.nextInt(30);
-```
-
---
-- Float
-
-```java
-float gradePointAverage = 3.2f;
-```
-
---
-- Double
-  - Higher precision than float
-
-```java
-double examScore = 97.362;
-```
-
---
-- Byte, Short, etc.
-
----
-## Java Basics: Text
-
---
-- Characters
-
-```java
-char section = 'B';
-```
-
---
-- Strings
-
-```java
-String instructor = "Jennifer Mankoff";
-```
-
---
-All non-primitives types inherit from `Object` class
-  - Including `String`; note the capitalization
-
----
-## Java Basics: Visibility Modifiers
-
-```java
-public final String COURSE = "CSE 340";
-///...
-private final String SSN = "123-45-6789";
-```
-
---
-- `private`
-  - Kept secret, can only be read/written by `self`
-  - Cannot be accessed by subclasses
-
---
-- `package private`
-  - This is the default access if no modifier is specified
-  - Accessible by all classes in the same package.
-
---
-- `protected`
-  - Access restricted to `self`, subclasses, and package
-
---
-- `public`
-  - The world can read/write (fields) or call (methods)
-
----
-## Java Basics: Visibility Modifiers
-
---
-  - Generally, you want to be as restrictive as possible
-    - Usually, this means `private`
-
---
-
-  - Create getter/setter methods to modify the member variables
-
---
-
-  - .red[__Almost never use__ `public`] for fields
-    - Except for constants
-
----
-## Java Basics: `final`
-
---
-- Prevent value from changing after initialization
-
-```java
-final double courseGrade = 95.0; // local variable cannot be modified ever!
-```
-
---
-- Prevent subclassing
-
-```java
-  public final class Person {
-      // can't subclass (for example to make a Student class)
-      // ...
-  }
-```
-
---
-- Prevent overriding
-
-```java
-  public final int getValue() { // can't override!
-      return 0;
-  }
-```
-
----
-## Java Basics: `static`
-
---
-- Use for constants or variables are shared by all instances of a particular class
-
-```java
-final static double SALES_TAX_RATE = 0.07; // Class Constant (never changes)
-static double mTotalAmount = 3.56;          // Class variable can change
-```
-
---
-- Methods that can be called without an class instance (instantiating an object)
-
-```java
-static String toString(int i);
-// For example Integer.toString(100) => "100";
-```
-
----
-# Naming Conventions
-
-   - class names are PascalCased
-   - local variables and method names are camelCased
-   - class or instance variables begin with a 'm' (for member), such as mTotalAmount
-   - constants are UPPER_SNAKE_CASED
-
----
-## Java Basics: Methods
-- Methods in Java typically follow this format:
-
-```java
-{visibility} [static] [final] returnType methodName(paramType paramName, ...) {
-    // ...
-}
-```
-
---
-- `static` and `final` are optional, special modifiers
-- `visibility` is one of `public`, `private`, `protected`, or empty for package private
-
----
-## Java Basics: Method Example
-
-Summing two numbers and returning the answer as a string
-
-```java
-public String getSumOfTwoNumbersAsString(int first, int second) {
-  int sum = first + second;
-  return Integer.toString(sum);  // could also return "" + sum
-}
-```
-
----
-## Java Basics: Declaring a class
-
-```Java
-{visibility} class ClassName {
-  // Field declarations
-
-  // Method definitions
-}
-```
-
----
-
-## Java Basics: Constructing a Class
-
-```java
-public class Student {
-
-  // Class (static) variables -
-  public static final String STUDENT_KEY = "STUDENT";
-  private static final String ID_PREFIX = "S";
-
-  // Instance Variables
-  private String mIdNumber;
-  private String mName;
-
-  // Constructors - used to create an instance
-  Student(String name, String idNumber) {
-    this.name = mName;
-    this.idNumber = mIdNumber;
-  }
-
-  // Methods
-  public String getPrefixedIdNumber() {
-    return ID_PREFIX + mIdNumber;
-  }
-```
-
----
-## Java Basics: Constructing a Class cont.
-```java
-  // Getter
-  public String getName() {
-    return mName;
-  }
-
-  // Setter
-  public void setName(String newName) {
-    if (newName == null || newName == "") {
-      newName = "Unknown";
-    }
-
-    mName = newName;
-  }
-
-  // ... etc.
-
-}
-```
-
----
-# Enums
-
-An enum type is a special data type that enables for a variable to be a set of predefined constant
-
-```java
-public enum EssentialGeometry { INSIDE, OUTSIDE };
-
-...
-EssentialGeometry where = EssentialGeometry.INSIDE;
-```
----
-# Switch Statements
-
-A form of a conditional with different execution paths
-
-```java
-public enum EssentialGeometry { INSIDE, ON_EDGE, OUTSIDE };
-
-...
-EssentialGeometry where = EssentialGeometry.INSIDE;
-
-switch (where) {
-  case ON_EDGE:
-    // do the edgy things
-    break;
-  case INSIDE:
-    // do the inside things but also fall through
-    // and do the OUTSIDE things because no break statement;
-  case OUTSIDE:
-    // do the outside things
-    break;
-  default:
-    // do default things
-    // automatically falls through
-}
-
-```
-
-
----
-## More Java Resources
-
-- Java Documentation (https://docs.oracle.com/en/java/javase/13/docs/api/)
-
-- __Online Java Practice Problems__:
-
-  - http://codingbat.com/java
-
-  - https://practiceit.cs.washington.edu/problem/list
diff --git a/docs/java/JavaRefresher.zip b/docs/java/JavaRefresher.zip
deleted file mode 100644
index 25f27c4c6f164f4fa2ad7b747dc793d0083ec75d..0000000000000000000000000000000000000000
Binary files a/docs/java/JavaRefresher.zip and /dev/null differ
diff --git a/docs/java/android-logo.png b/docs/java/android-logo.png
deleted file mode 100755
index cebec75001ab25dc397065f193797d5ebd0cb38d..0000000000000000000000000000000000000000
Binary files a/docs/java/android-logo.png and /dev/null differ
diff --git a/docs/java/java-advanced.html b/docs/java/java-advanced.html
deleted file mode 100644
index 2b1e57a58736db7a29c7dcc9bfc41f7f73d0cd24..0000000000000000000000000000000000000000
--- a/docs/java/java-advanced.html
+++ /dev/null
@@ -1,219 +0,0 @@
----
-layout: presentation
-title: Advanced Java 
-description: Advanced Java Slides
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-
-# CSE 340 ({{site.quarter}})
-## Advanced Java
-
----
-layout: false
-
-# Roadmap
-- Inheritance
-- Generics
-- Anonymous Inner Classes
-- Lambdas (and `::` notation)
-
----
-# Inheritance
-
-.left-column50[
-Interfaces: a promise that you will implement these methods
-- Interfaces can only implement other interfaces
-- A class can implement many interfaces
-- Examples: Comparable interface
-
-Regular class: fully defined behaviors that you want to add to
-- All functions in the parent class have been implemented and are inherited
-- Usually would use this to add more specific behavior by changing implementation or adding new methods
-]
-.right-column50[
-Abstract classes: like interfaces but has some fully implemented methods as well
-- Can have abstract functions that are only defined in subclasses like interfaces
-- Also allows you to define shared member variables and functions for all subclasses
-- Examples: Pets all have a name (inherited member variable), are adopted the
-same way (function defined in abstract class) but eat different foods (abstract function defined only in subclasses)
-
-.small.red[https://courses.cs.washington.edu/courses/cse331/20wi/lectures/lec12-subtyping.pdf]
-]
-
----
-# Inheritance common errors and tips
-Be careful:
-- Make sure not to redefine a variable you inherited from a parent class 
-- Check and make sure that you are using the same method signature (return types and parameter types) when overriding inherited methods, otherwise this is actually overloading 
-- These might lead to undefined and weird behaviors! :( 
-
-Remember:
-- You can only subclass one class, but you can implement as many interfaces as you want
-- Subclasses are able to access and change public and protected member variables of parent
-- You must implement interface methods and all abstract superclass methods 
-
----
-# Switch Statements
-
-A form of a conditional with different execution paths
-
-```java
-public enum EssentialGeometry { INSIDE, ON_EDGE, OUTSIDE };
-...
-EssentialGeometry where = EssentialGeometry.INSIDE;
-switch (where) {
- case ON_EDGE: // do the edgy things
-   break;      // and skip everything after this
- case INSIDE:  // do the inside things but also fall through
-               // and do the OUTSIDE things because no break statement;
- case OUTSIDE: // do the outside things
-   break;      // and skip everything after this
- default:      // do default things
-               // automatically falls through
-}
-```
----
-# Private class fields are often labelled with a lowercase “m” at the front 
-
-This notation comes from AOSP<br>
-(Android Open Source Project) [Code Style Guidelines for Contributors](http://source.android.com/source/code-style.html#follow-field-naming-conventions)
-
-Follow Field Naming Conventions
-- Non-public, non-static field names start with ‘m’.
-- Static field names start with ‘s’.
-- Other fields start with a lower case letter.
-- Public static final fields (constants) are `ALL_CAPS_WITH_UNDERSCORES`.
-
-For example:
-- `private float mCircleRadius, mThumbRadius;`
-- `private final Paint mPaintStart, mPaintEnd;`
-
-
----
-# Enums
-
-An enum type is a special data type that restricts a variable to be a set of predefined constant
s
-
-```java
-public enum EssentialGeometry { INSIDE, OUTSIDE };
-...
-EssentialGeometry where = EssentialGeometry.INSIDE;
-```
----
-# Generics
-
-Basically, abstraction over types
-```java
-Point<Integer>, Point<Double>
-
-// Type abstraction: abstract over element type
-Interface List<E> {       // Lets us use types such as:
-	Boolean add(E n);     //   List<Integer>
-	E get(int index);     //   List<String>
-}                         //   List<List<Double>>
-
-```
----
-# Anonymous Inner Classes (1/3)
-
-In Java, Anonymous Inner Classes are inner classes (or a non-static class that’s nested inside another class)
-
-- Anonymous classes don’t have a name and are often used to make an instance of an object that has slightly different methods of another class or interface. 
-- This way, you don’t have to actually make a subclass of a class.
-- You’re going to see this type of class in some of our homework when implementing something called “listeners”
-
----
-# Anonymous Inner Classes (2/3)
-
-```java
-public class ExActivity extends AppCompatActivity {
-	private View.OnClickListener mClickListener = new View.OnClickListener() {
-		public void onClick(View v) {
-			if (mButton!=v) {
-				return;
-			}
-		}
-	}; // remember to end this statement with a semicolon
-}
-
-```
----
-# Anonymous Inner Classes (3/3)
-
-Digging deeper: Creating an anonymous inner class <br>
-`private View.OnClickListener mClickListener = new View.OnClickListener() {`
-
-.left-column50[
-
-`private` -- it's only available inside the class that contains it (e.g. `ExampleActivity`)
-
-`View.OnClickListener` -- the variable type ([Documentation](https://developer.android.com/reference/android/view/View.OnClickListener)), a nested class in `View`
-
-`mClickListener` is the variable name which is being set to...
-]
-.right-column50[
-a `new View.OnClickListener` which is an anonymous object from an abstract class
-- For those of you who have not taken 331, that means there are methods that have not been implemented in the class
-- The one method that you MUST implement (in order to create a new object of this type) is `onClick`, which overrides the abstract method
-]
----
-# Lambdas
-
-What are Lambda expressions in Java?
-- Block of code that can be passed around to execute
-- Instances of functional interfaces
-- Think of it as using code as data
-- Useful for anonymous classes and functional interfaces, allows compact instances of one method classes
-- This will come up later in the course when dealing with callbacks!
-- Once instantiated, you can re-use it! Treat it is as a function 
-
----
-# Lambda Simple Example
-.left-column50[
-An example functional interface
-```java
-interface FuncInter1
-   {
-     int operation(int a, int b);
-     int multiplication(int a, int b);
-   }
-
-...
-
-// Implementing interface w/ lambda function
-FuncInter1 add = (int x, int y) -> x + y;
-
-
-```
-]
-.right-column50[
-
-You can reuse this now!
-- `add.operation(2, 3)` returns 5
-- `add.multiplication(2, 3)` return 5
-]
----
-# Another Lambda Example using `::` operator
-
-`::` is a method reference, same as using lambda but even shorter and readable 
-
-Syntax of `::` operator `<Class name>::<method name>`
-
-Lambda Example
-
-`numList.forEach(e -> System.out.print(e));`
-
-This does the same thing!
-
-`numList.forEach(System.out::print)`
-
----
-
-
-
-
-
diff --git a/docs/java/java.html b/docs/java/java.html
deleted file mode 100644
index eddb432302a41d8567436d1eb4970c212352869d..0000000000000000000000000000000000000000
--- a/docs/java/java.html
+++ /dev/null
@@ -1,404 +0,0 @@
----
-layout: presentation
-title: Java Refresher
-description: Java Refresher Slides
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-
-# CSE 340 ({{site.quarter}})
-## Java Refresher
-
----
-layout: false
-
-# What is Java?
-
-- Strongly, statically typed language
-
-  - Every variable has a type
-  - This type is decided at compile time (mostly)
-
---
-
-- Compiled, class-based, Object-oriented
-
---
-
-- Platform agnostic
-
-  - __Write once__, _run anywhere_ without recompilation
-  - Especially useful for Android
-
----
-
-## Java Basics: Primitive Types
-
---
-.left-column50[
-- Boolean
-
-```java
-boolean hasClassStarted = true;
-boolean isClassOver = false;
-```
-]
----
-
-## Java Basics: Primitive Types
-
-.left-column50[
-- Boolean
-
-```java
-boolean hasClassStarted = true;
-boolean isClassOver = false;
-```
-
-- Integer
-
-```java
-int numStudents = rand.nextInt(30);
-```
-]
----
-
-## Java Basics: Primitive Types
-
-.left-column50[
-- Boolean
-
-```java
-boolean hasClassStarted = true;
-boolean isClassOver = false;
-```
-
-- Integer
-
-```java
-int numStudents = rand.nextInt(30);
-```
-- Float
-
-```java
-float gradePointAverage = 3.2f;
-```
-]
-
---
-.right-column50[
-- Double
-  - Higher precision than float
-
-```java
-double examScore = 97.362;
-```
-]
---
-.right-column50[
-- Byte, Short, etc.
-]
----
-## Java Basics: Text
-
---
-- Characters
-
-```java
-char section = 'B';
-```
-
---
-- Strings
-
-```java
-String instructor = "Jennifer Mankoff";
-```
-
---
-All non-primitives types inherit from `Object` class
-  - Including `String`; note the capitalization
-
----
-## Java Basics: Visibility Modifiers
-
-```java
-public final String COURSE = "CSE 340"; 
-...
-private final String SSN = "123-45-6789";
-```
-
---
-.left-column50[
-- `package private`
-  - This is the default access if no modifier is specified
-  - Accessible by all classes in the same package.
-]
----
-## Java Basics: Visibility Modifiers
-
-```java
-public final String COURSE = "CSE 340"; 
-...
-private final String SSN = "123-45-6789";
-```
-
-.left-column50[
-- `package private`
-  - This is the default access if no modifier is specified
-  - Accessible by all classes in the same package.
-- `private`
-  - Kept secret, can only be read/written by `self`
-  - Cannot be accessed by subclasses
-]
---
-.right-column50[
-- `protected`
-  - Access restricted to `self`, subclasses, and package
-]
----
-## Java Basics: Visibility Modifiers
-
-```java
-public final String COURSE = "CSE 340"; 
-...
-private final String SSN = "123-45-6789";
-```
-
-.left-column50[
-- `package private`
-  - This is the default access if no modifier is specified
-  - Accessible by all classes in the same package.
-- `private`
-  - Kept secret, can only be read/written by `self`
-  - Cannot be accessed by subclasses
-]
-.right-column50[
-- `protected`
-  - Access restricted to `self`, subclasses, and package
-- `public`
-  - The world can read/write (fields) or call (methods)
-]
----
-## Java Basics: Visibility Modifiers
-
---
-  - Generally, you want to be as restrictive as possible
-    - Usually, this means `private`
-
---
-
-  - Create getter/setter methods to modify the member variables
-
---
-
-  - .red[__Almost never use__ `public`] for fields
-    - Except for constants
-
----
-## Java Basics: `final`
-
---
-.left-column50[
-- Prevent value from changing after initialization
-
-```java
-// local variable cannot be modified ever!
-final double courseGrade = 95.0; 
-```
-]
----
-## Java Basics: `final`
-
-.left-column50[
-- Prevent value from changing after initialization
-
-```java
-// local variable cannot be modified ever!
-final double courseGrade = 95.0; 
-```
-
-- Prevent subclassing
-
-```java
-  // can't subclass 
-  // (for example to make a Student class)
-  public final class Person {
-	...
-  }
-```
-]
---
-.right-column50[
-- Prevent overriding
-
-```java
-	// can't override!
-	public final int getValue() { 
-      return 0;
-  }
-```
-]
----
-## Java Basics: `static`
-
---
-- Use for constants or variables are shared by all instances of a particular class
-
-```java
-final static double SALES_TAX_RATE = 0.07; // Class Constant (never changes)
-static double mTotalAmount = 3.56;          // Class variable can change
-```
-
---
-- Methods that can be called without an class instance (instantiating an object)
-
-```java
-static String toString(int i);
-// For example Integer.toString(100) => "100";
-```
-
----
-# Naming Conventions
-
-   - class names are PascalCased
-   - local variables and method names are camelCased
-   - class or instance variables begin with a 'm' (for member), such as mTotalAmount
-   - constants are UPPER_SNAKE_CASED
-
----
-## Java Basics: Methods
-- Methods in Java typically follow this format:
-
-```java
-{visibility} [static] [final] returnType methodName(paramType paramName, ...) {
-    ...
-}
-```
-
---
-- `static` and `final` are optional, special modifiers
-- `visibility` is one of `public`, `private`, `protected`, or empty for package private
-
----
-## Java Basics: Method Example
-
-Summing two numbers and returning the answer as a string
-
-```java
-public String getSumOfTwoNumbersAsString(int first, int second) {
-  int sum = first + second;
-  return Integer.toString(sum);  // could also return "" + sum
-}
-```
-
----
-## Java Basics: Declaring a class
-
-```Java
-{visibility} class ClassName {
-  // Field declarations
-
-  // Method definitions
-}
-```
-
----
-
-## Java Basics: Constructing a Class
-
-```java
-public class Student {
-  // Class (static) variables -
-  public static final String STUDENT_KEY = "STUDENT";
-  private static final String ID_PREFIX = "S";
-
-  // Instance Variables
-  private String mIdNumber;
-  private String mName;
-
-  // Constructors - used to create an instance
-  Student(String name, String idNumber) {
-    this.name = mName;
-    this.idNumber = mIdNumber;
-  }
-
-  // Methods
-  public String getPrefixedIdNumber() {
-    return ID_PREFIX + mIdNumber;
-  }
-```
-
----
-## Java Basics: Constructing a Class cont.
-```java
-  // Getter
-  public String getName() {
-    return mName;
-  }
-
-  // Setter
-  public void setName(String newName) {
-    if (newName == null || newName == "") {
-      newName = "Unknown";
-    }
-
-    mName = newName;
-  }
-
-  ... // etc.
-
-}
-```
-
----
-# Enums
-
-An enum type is a special data type that enables for a variable to be a set of predefined constant
-
-```java
-public enum EssentialGeometry { INSIDE, OUTSIDE };
-
-...
-EssentialGeometry where = EssentialGeometry.INSIDE;
-```
----
-# Switch Statements
-
-A form of a conditional with different execution paths
-
-```java
-public enum EssentialGeometry { INSIDE, ON_EDGE, OUTSIDE };
-...
-EssentialGeometry where = EssentialGeometry.INSIDE;
-switch (where) {
-  case ON_EDGE:
-    // do the edgy things
-    break;
-  case INSIDE:
-    // do the inside things but also fall through
-    // and do the OUTSIDE things because no break statement;
-  case OUTSIDE:
-    // do the outside things
-    break;
-  default:
-    // do default things
-    // automatically falls through
-}
-
-```
-
-
----
-## More Java Resources
-
-- Java Documentation (https://docs.oracle.com/en/java/javase/13/docs/api/)
-
-- __Online Java Practice Problems__:
-
-  - http://codingbat.com/java
-
-  - https://practiceit.cs.washington.edu/problem/list
diff --git a/docs/javaRefresher_slides.pdf b/docs/javaRefresher_slides.pdf
deleted file mode 100644
index 107410aa62897b3d35570973d845b596ddecf37a..0000000000000000000000000000000000000000
Binary files a/docs/javaRefresher_slides.pdf and /dev/null differ
diff --git a/docs/pps.md b/docs/pps.md
deleted file mode 100644
index da46a2e2b14ad0e048ecf7d0d501f86b8c48f9df..0000000000000000000000000000000000000000
--- a/docs/pps.md
+++ /dev/null
@@ -1,104 +0,0 @@
----
-layout: default
----
-
-
-* TOC
-{:toc}
-
-
-# How to turn the Propositional Production System (PPS) for a button  into code
-
-The code implementation should spiritually follow the PPS; that is, your code should only take
-action when moving from state to state (along the arrows in the PPS). This behavior is best
-represented by a `switch` statement, where each `case` represents a state in our PPS.
-Within each `case`, there can be nested `if` statement to handle transitioning to another state.
-
-Each `case` should be broken out of and should properly handle input, propagating input to later
-views or stopping the input propagation as necessary. We typically do this through the
-`onTouchEvent` method. In `onTouchEvent`, returning `true` will stop the input propagation to
-views below it, while returning `false` allows views below it to handle the event.
-
-## Button Examples
-
-Given the essential geometry for this button is:
-- Inside
-- Outside
-
-and methods for that will be used are:
-
-- `indentButton()` (when button is pressed, also invalidate() the view)
-- `normalButton()` (when button is not pressed, also invalidate() the view)
-- `invokeAction()` (when the user releases in the button)
-- `cancelAction()` (when the user releases outside the button)
-
-The PPS for this interaction is as follows:
-
-<div class="mermaid">
-graph TD
-S((.)) --> START((START))
-START -- "DOWN:Inside?indentButton()" --> PRESSED((PRESSED))
-PRESSED -- "MOVE:Outside?normalButton()" --> PRESSED
-PRESSED -- "UP:Outside?cancelAction()" --> END[END]
-PRESSED -- "UP:Inside?invokeAction()" --> END
-PRESSED -- "MOVE:Inside?indentButton()" --> PRESSED
-
-linkStyle 0 stroke-width:2px;
-linkStyle 1 stroke-width:2px;
-linkStyle 2 stroke-width:2px;
-linkStyle 3 stroke-width:2px;
-linkStyle 4 stroke-width:2px;
-linkStyle 5 stroke-width:2px;
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF;
-
-class S invisible
-class START start
-class PRESSED normal
-class END finish
-</div>
-
-The code is generated thusly
-
-
-```java
-@Override
-public boolean onTouch(MotionEvent e) {
-  EssentialGeometry geometry = essentialGeometry(event);
-  switch (state) {
-    case State.START:
-      if (geometry == Geometry.INSIDE && e.getAction() == MotionEvent.ACTION_DOWN) {
-         indentButton();
-         state = State.PRESSED;
-         return true;
-      }
-      break;
-    case PRESSED
-      if (e.getAction() == MotionEvent.ACTION_MOVE) {
-        if (geometry == Geometry.INSIDE) {
-          indentButton();
-    	  } else {
-          normalButton();
-        }
-        return true;
-      }
-      else if (e.getAction() == MotionEvent.ACTION_UP) {
-        state = State.START; // note we don't actually use the END state
-        if (geometry == Geometry.INSIDE) {
-          invokeAction();
-        } else {
-          cancelAction();
-        }
-        return true;
-      }
-      break;
-    default:
-      break;
-  }
-  return false;
-}
-
-```
diff --git a/docs/ppsscroll.md b/docs/ppsscroll.md
deleted file mode 100644
index f710c9fdda4edc477c607114e8d859a4e3306401..0000000000000000000000000000000000000000
--- a/docs/ppsscroll.md
+++ /dev/null
@@ -1,88 +0,0 @@
----
-layout: default
----
-
-
-* TOC
-{:toc}
-
-
-# How to turn the PPS for a Scroll bar into code
-
-The code implementation should spiritually follow the PPS; that is, your code should only take
-action when moving from state to state (along the arrows in the PPS). This behavior is best
-represented by a `switch` statement, where each `case` represents a state in our PPS. Within each
-`case`, there can be nested `if` statement to handle transitioning to another state.
-
-Each `case` should be broken out of and should properly handle input, propagating input to later
-views or stopping the input propagation as necessary. We typically do this through the
-`onTouchEvent` method. In `onTouchEvent`, returning `true` will stop the input propagation
-to views below it, while returning `false` allows views below it to handle the event.
-
-## Volume example
-
-<div class="mermaid">
-graph LR
-S((.)) --> A((Start))
-A -- "Press:insideBar? A" --> I((Inside))
-I -- "Release:B" --> E[End]
-I -- "Drag:insideBar? C" --> I
-I -- "Drag:outsideBar? D" --> I
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-class S invisible
-class A start
-class E finish
-class I normal
-
-</div>
-
-where
-- A is updateVolume();updateThumbPosition();updateThumbAlpha();
-- B is updateThumbAlpha();invokeVolumeChangeListeners()
-- C is updateVolume();updateThumbPosition();invalidate()
-- D is doNothing()
-
-```java
-@Override
-public boolean onTouchEvent(MotionEvent event) {
-    EssentialGeometry geometry = essentialGeometry(event);
-    switch(mState) {
-        case START:
-            if (event.getAction() == MotionEvent.ACTION_DOWN && geometry == EssentialGeometry.BAR) {
-                mState = State.INSIDE;
-                updateThumbPosition();
-                updateThumbAlpha();
-                updateVolume();
-                invalidate();
-                return true;
-            }
-            break;
-        case INSIDE:
-            if (event.getAction() == MotionEvent.ACTION_MOVE && geometry == EssentialGeometry.BAR) {
-                updateThumbPosition();
-                updateVolume();                
-                invalidate();
-                return true;
-            } else if (event.getAction() == MotionEvent.ACTION_UP) {
-                mState = State.START;
-                updateThumbAlpha();
-                invokeVolumeChangeListener();
-                invalidate();
-                return true;                   
-            }
-            break;
-        default:
-            break;
-    }
-    return false;
-}
-```
-In the above code snippet, `updateThumb()` would handle determining and setting the opacity of the
-thumb, while `updateVolume()` would similarly update the volume based on the position of your finger.
-Function calls inside the switch cases should be used to break up the logic in complicated situations
-or where the same logic can be used for multiple transitions.
diff --git a/grading.md b/grading.md
deleted file mode 100644
index 1ab753a48ebb3dcae17e98679e1b870401e1508d..0000000000000000000000000000000000000000
--- a/grading.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-layout: default
----
-
diff --git a/homework.md b/homework.md
deleted file mode 100644
index 1ab753a48ebb3dcae17e98679e1b870401e1508d..0000000000000000000000000000000000000000
--- a/homework.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-layout: default
----
-
diff --git a/index.md b/index.md
index 2e8533a08379b1f81d08ceea5b2fd95393c267de..b2f72ba71377e10d5d5ac0ac9cb0decc23512ec9 100755
--- a/index.md
+++ b/index.md
@@ -3,8 +3,8 @@ layout: default
 warning: draft
 ---
 
-<h1> Welcome to Interaction Programming! </h1>
-Interactive technology is changing society. Some of today’s interfaces are used by a billion people at a time. Almost everything we create is created for people to use, through user interfaces. We will learn about interactive systems, including programming paradigms and design of event handling, layout, undo, accessibility and context awareness.
+<h1> Welcome to Class! </h1>
+Description of class
 
 For quick links to key things, check out the navigation bar above and the table of contents here:
 
@@ -15,8 +15,8 @@ For quick links to key things, check out the navigation bar above and the table
 
 See [Canvas]({{site.canvas}}) for all zoom meeting links
 
-**Class Time:** M/W/F at 10:30am PDT \\
-**Lab Times:** 9:30am PDT (Section AA) and 10:30 am PDT (Section AB)
+**Class Time:**  \\
+**Lab Times:** 
 
 # Course staff
 
@@ -29,79 +29,26 @@ See [Canvas]({{site.canvas}}) for all zoom meeting links
 ## TAs
 
 :--: | :---------: | :-- | | :--: | :---------: | :--
-	**Section AA** | ![Taylor Gotfrid](assets/img/staff/gotfrid.jpg){:class="ta-picture"} | Taylor Gotfrid (she/her) | | **Section AB** | | David Chen (he/him)
-	**Infrastructure** |  ![Jeremy Zhang](assets/img/staff/zhang.jpg){:class="ta-picture"} | Jeremy  Zhang (he/him) | | | | 
+	**Section AA** | ![Taylor Gotfrid](assets/img/staff/gotfrid.jpg){:class="ta-picture"} | Taylor Gotfrid (she/her) | | **Section AB** | | 
+	**Infrastructure** |  |  | | | | 
 
 # Should I take this class?
 
-Yes! Some of today’s interfaces are being used by a billion people at
-a time. Almost everything we create is created for people to use, and
-user interfaces are how people interact with anything else you do
-(whether it is a new machine learning algorithm or a database
-system). User interfaces are incredibly important, but they also
-represent a different programming paradigm than you may have learned
-before. This class will teach you
-
-- How to write an event-driven program which reacts to user input and
-  displays output. If you’ve never done this before, the abstractions
-  you will learn are standard in almost any user interface toolkit. Even
-  if you have, too often, without attention to structure, interfaces
-  become impenetrable spaghetti code.
-- How to think about the design of novel interaction techniques. As
-  devices diversify, so too do the ways in which people interact, from
-  voice based interfaces to augmented reality. By understanding the
-  principles of interaction technique design you can do a better job of
-  making interactions that users will want, which improves both the user
-  experience and the business value of what you create.
-- How to avoid common gotchas in the implementation of user
-  interfaces. We will teach you the proper way to create Accessible Interaces and
-  implement features like Undo. We will also touch on other design principles (no
-  modal dialogues; good use of color; inclusion of support for help and
-  so on) that work in any user interface!ß
-
-Taking a class is a big commitment, and you will work hard in this
-class. So we want to help you make sure this is the right class for
-you. Below is some information about prerequisites and expectations.
+Why take this class?
 
 # Prereqs and expectations
 
-The only requirement for this class is that you have taken CS 142 and
-143 or an equivalent class, meaning you are comfortable programming in
-Java, and have some experience with data structures. However, if you
-are not comfortable working in an IDE environment, using version
-control, and picking up and working with someone else’s library code,
-you will likely need to plan for extra time with TAs, and possibly
-attend extra tutoring sessions, to keep up with the class.
-Taking CSE 391 just before or concurrently with 340 can help, but our staff
-can also assist where needed.
-
-The specific platform and language for this class are Java on Android
-phones (or simulators); using the IntelliJ IDE (Android Studio). While
-Google is switching over to Kotlin, there are good reasons to [start
-learning Android with Java first](https://dzone.com/articles/java-vs-kotlin-which-language-android-developer-sh).
-
-Note that this class is designed for CS majors, and other students who
-work regularly with information technology and are strong
-programmers. While we will consider applications from outside the
-major, financial and other restrictions may limit
-space for such students.
+What do I need to know to take this class?
 
 # Course Modules
 
-| Module        | Interaction Programming Theory    | Programming Practice  |
+| Module        |  Theory    |  Practice  |
 |---------------|-----------------------------------|-----------------------|
-| Visual        | - Interface Toolkits<br>- Interactor Hierarchy<br>- Peer Review<br>- Visual Design Tips | - Android Programming<br>- Drawing on a Canvas<br>- Bounding Boxes<br>- Animation |
-| Layout        | - Visual Layout<br>- Layout Constraints<br>- Layout algorithm                                                                                                                       | - Layout in Android                                                                         |
-| Accessibility | - Accessible Design Principles                                                                                                                                                      | - Building Accessible Apps                                                                  |
-| Events        | - Input Devices and Types<br>- Event Handling<br>- Model View Controller<br>- Essential Behavior<br>- Finite State Machines<br><br>                                                 | - Java callbacks<br>- Event handling in Android<br>- Build a novel color picker interactor  |
-| Interaction   | - Physical computing<br>- Motor Design Tips<br>- Predicting and testing interactor efficiency<br>- Application design principles<br>- Quantitative Study Design <br>- Data Analysis | - Building pop up menus                                                                     |
-| Behavior      | - Theories of User Behavior<br>- Behavior Change<br>- Machine Learning<br>- Application Security<br>- Heuristic Evaluation                                                          | - Implementing a drawing program<br>- Implementing undo/redo feature                        |
+|         |  |  |
 
 
 # Course Structure
 
-Each week, there will be three hours of lecture material (Monday, Wednesday, Friday) and
-one TA-led lab (Thursday). In addition the TAs will host office hours, often in pairs.
 
 ## Zoom
 
@@ -119,12 +66,10 @@ Change their Zoom screen name to a school appropriate screen name that hides any
 identifying information such as their name or
 UW Net ID, and not share their computer audio or video during their Zoom sessions.
 
-
 ## Lectures
 
 Lectures are designed to introduce new material throughout the quarter, motivate key theories and
-concepts, as well as demonstrate Interface Programming primarily using the Android Studio development
-environment.
+concepts, as well as practice.  
 
 The goals in this class center around learning by doing. This
 means that hands on time trying out everything from implementation to
@@ -145,12 +90,6 @@ and learning, particularly as we discuss both theoretical and practical aspects
 Programming. Stay on top of the course materials, bring your questions to class and seek help
 if there are problems.
 
-### Lecture examlets and final reflection
-
-There will not be a midterm or final exam this quarter. Instead, there will be 4 quizzes held
-during the last 15-30 minutes of Friday lecture every other week, beginning the third week. The final
-project will incorporate a deeper reflection that covers all course material.
-
 ### Remote Lecture Guidelines and Expectations
 Students are expected to adhere to the below expectations for remote lectures. These guidelines are
 intended to help lecture go more smoothly, facilitate questions and group activities, and foster a
@@ -171,11 +110,6 @@ you and then you can unmute your mic and ask your question
 
 ## Lab
 
-On Thursdays, you will participate in a weekly lab, held at either 9:30 or 10:30 am PDT. These
-labs will be similar those you may have had in other classes - we will spend the 50 minutes answering
-questions, going over common errors in homework solutions, discussing sample problems in
-more detail than we can in lecture, and completing exercise worksheets with TAs available to help.
-
 ## Remote Lab Guidelines and Expectations
 Students are expected to adhere to the below expectations for remote labs. These guidelines are
 intended to help lab go more smoothly, facilitate questions and group activities, and
@@ -193,12 +127,7 @@ can unmute your mic and ask your question
 
 This is a challenging, four credit class, meaning you should expect 8
 hours of homework outside of class a week. We hope make the workload as predictable as
-possible. Assignments will have a fixed and an open ended piece, and some will require
-a structured peer review. After you turn in an assignment you will also work on a short
-practice quiz on the most relevant material taught in the assignment. About a week after the
-practice quiz we will have an examlet - a short check for your understand on the the prior modu
-
-FIX: Homework will typically involve either a single (one-week) part or be split into two parts, with each about a week long
+possible.
 
 # Class Coordination
 
@@ -250,73 +179,6 @@ will do to try to make the class a welcoming environment:
 
 Grades will be assigned approximately as follows:
 
-- 70%: Assignments
-- 15%: Effort, participation and altruism (EPA)
-- 15%: Assessments
-
-## EPA (Effort, participation and altruism)
-
-You can earn "points" for each of the following:
-
-- **Effort:** Attending office hours, lectures, and sections. Keeping up with the discussion board.
-- **Participation:** Asking questions in lecture and on the discussion board, voting on peer instruction questions, interacting with TAs and other students.
-- **Altruism:** Helping others in lecture, during office hours, and on the discussion board.
-
-EPA scores are kept internal to the staff (i.e. not disclosed to students).
-
-
-
-## Late Days
-
-You have 3 free late days which will automatically be applied until they run out, following which
-each late day will incur a 10% penalty on the assignment that was due
-
-Each homework will allow up to two late days, after which turn-ins will be given a zero.
-
-## Regrade Policy
-
-Reflecting on feedback is one of the most valuable ways you can learn from your mistakes,
-and we encourage you to do so. If you have a question about a grade you received or if you
-feel the grade you received is incorrect, please email an instructor for an appointment to
-discuss the assignment and your grade in detail.
-
-It is also possible for the graders to make mistakes. If that happens we certainly would like to
-correct the error. Please note the following:
-
-When you request a regrade, we may look at the entire assessment, homework or reflection. Therefore,
-it is possible for your grade to go either up or down through this process.
-
-- Coding Assignments: Regrade requests for homework assignments must be
-submitted within one week of when the grade was returned to you. You must do two things in
-order to request a regrade of a homework (failure to do these two things may result in the
-  regrade not happening):
-  - Reply to the code review comment that is prompting your request of the regrade. You can find
-  your code review comments in your GitLab repository for that assignment.
-  - Send a private message on [Ed]({{site.piazza}}) to the instructors that you are requesting a
-  regrade. Include a link to the repository in your message and a written summary describing
-  why your work should be reexamined.
-
-- Exams and Written Assignments: We will use Gradescope to grade exams and manage regrade requests.
-Via Gradescope, you should submit any requests separately for each problem with an
-explanation of why you want this problem regraded. The time limit for such regrade requests will
-be detailed in the email you receive from Gradescope.
-
-# Exams
-There will be four short examlets at the start of class, every other Friday.
-
-- April 17
-- May 1
-- May 15
-- May 29
-
-Alternate examlets will only be given in unusual extenuating circumstances. You must contact the
-instructor prior to the examlet date if you believe you need to take the examlet at another time,
-but no later than least two days prior to the examlets.
-
-More information about the exams, their structure, and what resources you will be allowed to use
-will be discussed in class and listed on the course website as we approach the these dates.
-
-
 # Religious Accommodations
 Washington state law requires that UW develop a policy for accommodation of student absences or
 significant hardship due to reasons of faith or conscience, or for organized religious activities.
@@ -326,55 +188,3 @@ Accommodations must be requested within the first two weeks of this course using
 [Religious Accommodations Request](https://registrar.washington.edu/students/religious-accommodations-request/)
  form on UW's site.
 
-
-# Other relevant classes to know about
-
-There are a number of classes on campus that teach related concepts
-which you may wish to consider in addition to this one. As of Spring 2020,
-here are the ones we are aware of:
-
-- CSE 154: Web Programming: [Sp 20](https://courses.cs.washington.edu/courses/cse154/20sp/)
-  This course covers languages, tools, and techniques for developing interactive and dynamic web
-  pages. Topics include page styling, design, and layout; client and server side scripting;
-  web security; and interacting with data sources such as databases.
-- [HCDE 310: Interactive Systems Design &
-  Technology](https://www.smunson.com/teaching/hcde310/a17/) This course is a
-  project based course that teaches how to prototype applications on the
-  web using Python that solve human problems or enable new
-  activities. Includes information about APIs and how people interact with them. It
-  differs from CSE 340 in its choice of platform. Additionally, it
-  doesn’t cover the theory of UI programming, nor issues such as
-  accessibility, undo, and so on.
-- [INFO 343: Client side web
-  development](https://canvas.uw.edu/courses/1118282) This is a
-  programming course, and there will be significant overlap between the
-  courses, as INFO 343 also touches on event based programming, output,
-  and accessibility. [CSE 154: Web
-  Programming](https://courses.cs.washington.edu/courses/cse154/20sp/)
-  also covers some related
-  material. However, both are about programming on the web using
-  JavaScript instead of on Android, using Java. In addition, CSE 340
-  covers more of the theory of UI programming and design, similar to
-  HCID 520.
-- [CSE 440: Introduction to
-  HCI](http://courses.cs.washington.edu/courses/cse440/); [441: Advanced HCI](http://courses.cs.washington.edu/courses/cse441/) This is an advanced series of courses for undergraduate
-  seniors. The focus of 440 is less on programming and more broadly on
-  methods for designing, prototyping, and evaluating user interfaces to
-  computing applications, while 441 is an open ended capstone
-  course. These are excellent follow on courses to 340, for a student
-  who wants to go deeper into how to make usable, enjoyable effective
-  interfaces, and how to solve interesting problems with HCI. Related is
-  [CSE 510](http://courses.cs.washington.edu/courses/csep510/), the HCI
-  course for the professional masters program.
-- HCID 520: User Interface Software +
-  Technology ([Wi 17](http://uwdata.github.io/hcid520/17wi/), [Wi 16](http://faculty.washington.edu/ajko/hcid520/) [Wi 19](https://canvas.uw.edu/courses/1256337))
-  This course
-  teaches about user interfaces, including what they are, how they are
-  built, and some inventions in user interface software and
-  technology. There are many similarities between these classes. However HCID 520
-  is only open to [MHCI+D students](https://mhcid.washington.edu/) Masters students.
-- [HCID 521: Prototyping](https://canvas.uw.edu/courses/1128377/assignments/syllabus)
-  This class is for the [MHCI+D students](https://mhcid.washington.edu/)
-  only and focuses on prototyping techniques, not implementation. It
-  covers everything from paper prototyping to physical interfaces to 3D
-  printing.
diff --git a/schedule.md b/schedule.md
index 1f5690b20eab5891ef52d2dbac9cfe31efe2394b..deb255bb9a671f0654ba0044a966cac71c88966b 100644
--- a/schedule.md
+++ b/schedule.md
@@ -9,491 +9,13 @@ warning: draft
 <!-- ********* Week 1 ********* -->
 
 {: .week}
-# Week 1: What's in an Interface
+# Week 1: title
 
-{: .lecture} Monday 3/30: Why take this course? What is HCI?
-: **Learning Goals** Relevance of class to all of CS
+{: .lecture} date: title
+: **Learning Goals** 
 : **Readings**
-- Watch the video and read section 4.1 [The CS Field Guide to Human Computer Interaction Introduction](https://csfieldguide.org.nz/en/chapters/human-computer-interaction/)
-- Take the class [survey](https://catalyst.uw.edu/webq/survey/bricker/387508)
-
 : **Slides** {% include slide.html title="Introduction to course" loc="wk01/intro.html" %}
 
-{: .lecture} Wednesday 4/1: What is a toolkit?
-: **Learning Goals**  Toolkit User Types; Basic structure of a user interfaces; How this looks in Android; Introduction of Doodle Assignment
-: **Readings**
-
-- [Widget Toolkit](https://en.wikipedia.org/wiki/Widget_toolkit)
-- Watch Engelbart, Cronkite and other videos from {% include slide.html title="Introduction to course" loc="wk01/intro.html" %}
-
-**Slides** {% include slide.html title="Interface Toolkits" loc="wk01/toolkits.html" %}
-
-**Assigned** AS1 [Doodle]({{site.baseurl}}/assignments)
-
-
-{: .lab} Thursday, 4/2: Setting Up Doodle
-: **Learning Goals** Android project structure; Our development environment (Git/GitGrade), Doode
-
-**Preparation for Lab**
-
-* Android Basics:
-  * Download [Android Studio](https://developer.android.com/studio) and [install it](https://developer.android.com/studio/install)
-  * Select the Tools->SDK Manager and make sure you have Android 7.0 or 7.1.1 (Nougat) installed. This is the version of the Android SDK we will use for this class.
-  * Follow [this tutorial](https://developer.android.com/training/basics/firstapp) to create an Android Application.
-  * Continue with the tutorial to also
-  [run your app](https://developer.android.com/training/basics/firstapp/running-app)
-  either on an emulator or on an Android Device.
-
-* Git Setup: [macOS](https://courses.cs.washington.edu/courses/cse154/19au/resources/assets/atomgit/macosx/), [win](https://courses.cs.washington.edu/courses/cse154/19au/resources/assets/atomgit/windows/) (ignore pieces about Atom as we use Android Studio)
-  * Make sure you have git setup on your computer, follow above instructions
-  * If you have never used git before read through [this]({{site.baseurl}}/docs/git.html)
-  and [this (Android Studio ≈ Intellij)](https://courses.cs.washington.edu/courses/cse331/20sp/tools/version-control.html)
-  * Ensure that you can clone from CSE GitLab, (we recommend cloning via SSH
-    but you'll need to [generate a key](https://docs.gitlab.com/ee/ssh/))
-* Supporting Material [Java Refresher]({{site.baseurl}}/docs/java.html); [Git]({{site.baseurl}}/docs/git.html); [331's
-Git resource](https://courses.cs.washington.edu/courses/cse331/20sp/tools/version-control.html)
-* [Java refresher code]({{site.baseurl}}/docs/JavaRefresher.zip)
-* [Java Refresher slides]({{site.baseurl}}/docs/javaRefresher_slides.pdf)
-
-**Day Of**
-
-* **Slides** {% include slide.html title="Getting Started With Android" loc="l01/hello.html" %}
-* **Slides** {% include slide.html title="GitGrade" loc="l01/gitgrade.html" %}
-* **Slides** {% include slide.html title="Doodle" loc="l01/doodle.html" %}
-
-
-{: .lecture} Friday, 4/3: Drawing on the Screen
-: **Learning Goals** How does Android support drawing on the screen; Drawing abstractions; clipping and other transformations
-: **Readings**
-
-* [Using Android Resources](https://www.tutorialspoint.com/android/android_resources.htm)
-* Look at the following Android Documentation
-  * [ImageView](https://developer.android.com/reference/android/widget/ImageView)
-  * [Drawables](https://developer.android.com/guide/topics/graphics/drawables)
-  * [Canvas](https://developer.android.com/reference/android/graphics/Canvas)
-* [Drawing on the Canvas](https://android.jlelse.eu/android-canvas-for-drawing-and-custom-views-e1a3e90d468b)
-* What is a Bounding Box?
-  * Description [Minimum bounding box](https://en.wikipedia.org/wiki/Minimum_bounding_box)
-  * Exercise: [Bounding box in coordinate geometry](https://www.mathopenref.com/coordbounds.html)
-* A beginners guide to implement Android Animations — [Part 1](https://medium.com/@shubham08gupta/a-beginners-guide-to-implement-android-animations-part-1-2-part-series-b5fce1fc85) (2 part series)
-
-**Slides** {% include slide.html title="Drawing Components & Animation" loc="wk01/drawing.html" %}
-
-
-<!-- ********* Week 2 ********* -->
-
-{: .week}
-# Week 2: Output to Me
-
-{: .lecture} Monday, 4/6:  Drawing Interfaces; Animation
-: **Learning Goals** Role of interactor in drawing on the screen, how to use animation to move interactors
-: **Readings and Watchings**
-
-- There is a lot in there and it is a bit of a preview for Friday, but make sure you watch from 6:00-7:00 [Measure Layout Draw](https://youtu.be/4NNmMO8Aykw?t=368) -
-- Transformations in Android (video coming soon)
-- [Introduction to Animation](https://developer.android.com/training/animation/overview)
-- [Property Animation Overview](https://developer.android.com/guide/topics/graphics/prop-animation)
-
-**Slides**: {% include slide.html title="Drawing the interface" loc="wk02/interface-drawing.html" %}
-
-{: .lecture} Wednesday, 4/8: Properties of People I: Visual Perception
-: **Learning Goals** Design implications of people's visual capabilities
-
-**Readings and Watching**
-- [5 Visual-Design Principles in UX](https://www.nngroup.com/articles/principles-visual-design/)
-- [Visual Design Basics](https://www.usability.gov/what-and-why/visual-design.html)
-- [Gestalt Principles](https://www.interaction-design.org/literature/article/the-law-of-similarity-gestalt-principles-1)
-- Theresa-Marie Rhyne - SIGGRAPH University [Applying Color Theory to Digital Media and Visualization"](https://www.youtube.com/watch?v=KJv1N8akoUs) - at least the first 11 minutes or so
-
-**Slides** {% include slide.html title="Properties of People I: Vision" loc="wk02/people-vision.html" %}
-
-{: .lab} Thursday, 4/9: Debugging, Peer Evaluation, Doodle Help
-: **Learning Goals** Support for Creative Work on Doodle; Discussion of and practice evaluating (toy example)
-: **Slides** {% include slide.html title="Debugging, Peer Evaluation and Animation" loc="l02/animation.html" %}
-**Resources**:
- - [Animation Demo (movie)](slides/l02/img/animationDemo.mov)
- - [AnimationDemo.zip](slides/l02/animationPractice.zip)
-
-**Due** (10pm) AS1 [Doodle]({{site.baseurl}}/assignments) code
-
-{: .lecture} Friday 4/10: Introduction to Layout
-: **Learning Goals** Relating layout to the interactor hierarchy
-: **Readings**
-
-- [Layouts (Overview)](https://developer.android.com/guide/topics/ui/declaring-layout)
-- [Building a Responsive UI](https://developer.android.com/training/constraint-layout)
-- [Android - UI Layouts](https://www.tutorialspoint.com/android/android_user_interface_layouts.htm)
-
-**Worksheet** [Layout 1](https://docs.google.com/document/d/1hhFPJBZATrAgWb0pD7S2VZtA6aE2wGKM4wFDISk56sA/edit?usp=sharing)
-: **Slides** {% include slide.html title="Layout" loc="wk02/layout.html" %}
-
-**Assigned**  AS2 [Layout]({{site.baseurl}}/assignments)
-: **Assigned** Quiz 1 (due Sunday): Canvas Practice quiz containing sample questions covering key concepts from Doodle, Properties of People I: Vision, and readings
-
-
-<!-- ********* Week 3 ********* -->
-
-{: .week}
-# Week 3: Present to Me
-{: .lecture} Sunday, 4/12: Peer Evaluation
-: **Assigned** AS1 [Doodle]({{site.baseurl}}/assignments) peer reviews released (look for emails)
-: **Due** Quiz 1
-
-{: .lecture} Monday, 4/13:  Layout II - more layout details
-: **Learning Goal** How is layout accomplished? What is the difference between using XML vs creating
-Views and adding them to the parent?
-
-: **Readings and Watchings**
-- [Android ImageView ScaleType: a Visual Guide](https://thoughtbot.com/blog/android-imageview-scaletype-a-visual-guide)
-- See readings from 4/10
-
-
-: **Slides** {% include slide.html title="More on Layout in Android" loc="wk03/layout-ii.html" %}
-
-{: .lecture} Tuesday, 4/14
-
-: **Due** Peer evaluation of [Doodle]({{site.baseurl}}/assignments)
-
-{: .lecture} Wednesday, 4/15:   Layout: Implementation and Theory
-: **Learning Goals** Under the hood: How is layout accomplished?
-
-: **Readings and Watchings**
-
-- Watch or re-watch: [Measure Layout Draw](https://youtu.be/4NNmMO8Aykw?t=368)
-- Read one of
-  - [How Android Draws Views](https://developer.android.com/guide/topics/ui/how-android-draws)
-  - [Measure… Layout… Draw!](https://medium.com/@britt.barak/measure-layout-draw-483c6a4d2fab)
-  - Deeper details: [https://cheesecakelabs.com/blog/understanding-android-views-dimensions-set/](https://cheesecakelabs.com/blog/understanding-android-views-dimensions-set/)
-
-**Slides** {% include slide.html title="Layout in Android" loc="wk03/layout-algorithm.html" %}
-
-**Due** [Doodle]({{site.baseurl}}/assignments) Reflection
-
-{: .lab} Thursday, 4/16: Support on Layout
-: **Learning Goals** Work through constraint based layout
-
-: **Slides** {% include slide.html title="Layout" loc="l03/layout.html" %}
-
-{: .lecture} Friday, 4/17: AMA, Examlet 1
-: **Examlet 1** Assess your knowledge on Android development and drawing on the canvas
-
-**Slides** {% include slide.html title="AMA, Examlet" loc="wk03/examlet.html" %}
-
-**Due** AS2 [Layout]({{site.baseurl}}/assignments) part 1-2 (for pixel tests)
-
-<!-- ********* Week 4 ********* -->
-
-{: .week}
-# Week 4: Include Everyone
-{: .lecture} Monday, 4/20:  Accessibility
-: **Learning Goals** Learn about the history of accessibility, why it is important, and what problems exist
-: **Readings**
-- [Android Accessibility Overview](https://developer.android.com/guide/topics/ui/accessibility/)
-- [Android Accessibility Guides](https://developer.android.com/guide/topics/ui/accessibility/apps)
-- [Proper Alt Text Writing](https://webaim.org/techniques/alttext/)
-- [Material Design: Assistive Technology](https://material.io/design/usability/accessibility.html#assistive-technology)
-
-: **Slides** {% include slide.html title="Accessibility" loc="wk03/accessibility-and-inclusive-design.pdf" %}
-
-{: .lecture} Wednesday, 4/22: Guest Lecture (Venkatesh Potluri & Anne Ross): Android Accessibility
-: **Learning Goals** Learn about how to make Android apps accessible
-: **Readings** See Monday
-: **Slides**
-  - {% include slide.html title="Accessibility in Practice" loc="wk04/accessibility.html" %}
-  - [340AccessibiltyScanner](340AccessibiltyScanner.pdf)
-
-**Assigned**: AS3 [Accessibility]({{site.baseurl}}/assignments)
-
-
-{: .lab} Thursday, 4/23: Finish Layout & Start Accessibility
-: **Learning Goals** Use the Accessibility Checker
-
-: **Slides**  {% include slide.html title="Layout and Accessibility" loc="l04/accessibility.html" %}
-
-{: .lecture} Friday, 4/24: Event Handling I: Where Events Come from
-: **Learning Goals** Basics of event handling including event types and listeners (callbacks)
-: **Readings**
-- [Comparators](https://tech.willhaben.at/sorting-objects-working-with-java-comparator-5302ab38c21f)
-- [UI Events in Android](https://developer.android.com/guide/topics/ui/ui-events)
-- [Model-View-Controller](https://medium.com/upday-devs/android-architecture-patterns-part-1-model-view-controller-3baecef5f2b6)
-
-**Slides** {% include slide.html title="Event Handling I: Callbacks, Model View Controller, and Events" loc="wk04/events.html" %}
-**Supplemental Files** [person.zip]({{site.baseurl}}/slides/wk04/person.zip)
-
-**Assigned** Quiz 2 (due Sunday): Sample questions covering key concepts from layout
-
-**Due** AS2 [Layout]({{site.baseurl}}/assignments) part 3-5 (code + reflection)
-
-
-<!-- ********* Week 5 ********* -->
-
-{: .week}
-# Week 5: React to me
-{: .lecture} Sunday 4/26:
-: **Due** Quiz 2
-
-{: .lecture} Monday 4/27: Event Handling II: Where Events Go
-: **Learning Goals** How events are dispatched to interactors, importance of interactor hierarchy
-: **Readings**
-- [UI Events](https://developer.android.com/guide/topics/ui/ui-events)
-- [4 Ways To Implement OnClickListener On Android](https://medium.com/@CodyEngel/4-ways-to-implement-onclicklistener-on-android-9b956cbd2928)
-
-
-: **Slides** {% include slide.html title="Event Handling II: Delivery of Events in the Interactor Hierarchy" loc="wk05/event-delivery.html" %}
-**Supplemental Files** [Counter.zip]({{site.baseurl}}/slides/wk05/Counter.zip)
-
-{: .lecture} Wednesday, 4/29: Event Handling III: How Interactors use Events
-: **Learning Goals** Learn how to handle input; How to properly implement a finite state machine in an interactor; Implementation Strategies for Interactors to Handle Events
-: **Readings and Prework**
-- [Custom View Components](https://developer.android.com/guide/topics/ui/custom-components)
-- Download [Counter.zip]({{site.baseurl}}/slides/wk05/Counter.zip) and read through it.
-- Informational only: [Original PPS paper](https://dl.acm.org/doi/abs/10.1145/97243.97252)
-
-: **Slides** {% include slide.html title="Essential Behavior and the use of finite state machines to implement it" loc="wk05/pps-geom.html" %}
-
-{: .lab} Thursday, 4/30: Implementing Interactors
-: **Learning Goals** Get comfortable with finite state machines' implementation in interactors
-
-: **Slides**  {% include slide.html title="State Machines" loc="l05/state.html" %}
-
-**Due**: AS3 [Accessibility]({{site.baseurl}}/assignments)
-
-{: .lecture} Friday, 5/1: Examlet 2, Event Handling IV: Essential Geometry
-: **Learning Goals** ColorPicker intro, Create a non-rectangular interactor, Essential Geometry and Essential Behavior
-: **Reading**
-
-- [Custom View Components](https://developer.android.com/guide/topics/ui/custom-components)
-
-<!-- - **Slides** {% include slide.html title="Review Slides Touching on Key Concepts from Prior Weeks" loc="wk05/review.html" %} -->
-**Slides** {% include slide.html title="Summary of Toolkit Architecture" loc="wk05/whole-toolkit.html" %}
-
-**Examlet 2** Assess your knowledge on layout theory and practice in Android
-
-**Assigned** AS4 [Color Picker]({{site.baseurl}}/assignments)
-
-
-<!-- ********* Week 6 ********* -->
-
-{: .week}
-# Week 6: Beyond Touch: The Larger World
-
-{: .lecture} Monday, 5/4: Context Awareness - Jen Mankoff, Guest Lecture
-: **Learning Goals** Assumptions about phone use and examples of context aware applications
-: **Readings**:
-- [Calm Tech, Then and Now](http://www.johnseelybrown.com/calmtech.pdf)
-- [The Coming Age of Calm Technology](https://pdfs.semanticscholar.org/ed7f/cec667281ab1f4ca4ac10239582cb4345e0a.pdf?_ga=2.248923214.838018675.1588119518-1260861436.1586456410)
-
-: **Slides** {% include slide.html title="The Sensing Phone" loc="wk06/context.html" %}
-
-{: .lecture} Wednesday, 5/6: Physical Computing
-: **Learning Goals** Learn a little about 3D Printing and extending phones for sensing
-: **Readings and Watchings**
-- Lisa Harouni Ted Talk: [A Primer on 3D Printing](https://www.ted.com/talks/lisa_harouni_a_primer_on_3d_printing)
-- [Powder Printing](https://www.youtube.com/watch?v=kBHsfNDsbCs&feature=youtu.be&t=29s)
-- [Liquid Printing](https://www.popsci.com/new-liquid-based-3d-printer-takes-minutes-not-hours/)
-
-: **Slides** {% include slide.html title="Physical Computing" loc="wk06/3dprinting.html" %}
-
-{: .lab} Thursday, 5/7: Bundling + Color Picker help
-: **Learning Goals** What're bundles? What do they do? Let's find out!
-
-: **Slides**  {% include slide.html title="How to use Bundle" loc="l06/bundling.html" %}
-
-{: .lecture} Friday, 5/8: Properties of People II: Motor Behavior
-: **Learning Goals** Learn the theory driving good interactor design; Motor behavior basics and
- implications for design including Fitts' law and Guiard's theory of bimanual input
-: **Readings**
-- [Fitts' Law](https://en.wikipedia.org/wiki/Fitts%27s_law)
-- [Video](https://www.youtube.com/watch?v=kly2QA1bFc8)
-
-: **Slides** {% include slide.html title="Properties of People II: Motor Control" loc="wk06/people-motor.html" %}
-
-**Assigned** Quiz 3 (due Wednesday 5/13): Sample questions covering key concepts from accessibility and color picker assignments
-
-
-<!-- ********* Week 7 ********* -->
-
-{: .week}
-# Week 7: Design Principles
-
-{: .lecture} Monday, 5/11:Predicting and Evaluating Interactor Efficiency
-: **Learning Goals** Apply design tips we've discussed to comparing the efficiency of different variations on interactors; Learn about wide variety of solutions for selection; Learn about Qualitative and Quantitative ways of testing theories
-
-: **Slides** {% include slide.html title="Predicting and Evaluating Interactor Efficiency" loc="wk07/menus.html" %}
-
-**Assigned** AS5 [Menus]({{site.baseurl}}/assignments)
-
-**Due** AS4 [Color Picker]({{site.baseurl}}/assignments) code and reflection
-
-{: .lecture} Wednesday, 5/13: Application Design Principals
-: **Learning Goals** Mental models, gulf of execution, gulf of evaluation
-**Readings**:
-- [Mental Models](https://www.nngroup.com/articles/mental-models/)
-- [The Two UX Gulfs: Evaluation and Execution](https://www.nngroup.com/articles/two-ux-gulfs-evaluation-execution/) (also a short article [here](https://www.educative.io/edpresso/gulf-of-execution-and-gulf-of-evaluation))
-- [The Seven Stages of Action](https://www.guerillagirl.de/2017/03/18/seven-stages-of-action-don-norman/).
-At least watch these two videos
-  - [The Seven Stages of actions](https://youtu.be/n4fCHYbRcKw&feature=emb_logo)
-  - [It's not you. Bad Doors are everywhere](https://www.youtube.com/watch?v=yY96hTb8WgI&feature=emb_logo)
-
-: **Slides** {% include slide.html title="Application Design Principals" loc="wk07/interaction.html" %}
-
-**Due** Quiz 3
-
-{: .lab} Thursday, 5/14: Designing Menus
-: **Learning Goals** Help with Menus Assignment; Revisiting key concepts
-
-: **Slides**  {% include slide.html title="Getting started with Menus" loc="l07/menus-lab.html" %}
-
-{: .lecture} Friday, 5/15: Examlet 3, Reasoning from Data
-: **Learning Goals** Principals of and Problems with Behavior Change
-**Readings**
-- [Dopamine, Smartphones & You: A battle for your time](http://sitn.hms.harvard.edu/flash/2018/dopamine-smartphones-battle-time/)
-- [Science Of Persuasion](https://www.youtube.com/watch?v=cFdCzN7RYbw) (Optional)
-
-: **Slides** {% include slide.html title="Behavior Change with Mobile Devices" loc="wk07/behavior-change.html" %}
-
-**Examlet 3** Assess your knowledge on key concepts from accessibility and color picker
-
-
-
-<!-- ********* Week 8 ********* -->
-
-{: .week}
-# Week 8: Understand Me
-
-{: .lecture} Monday, 5/18:  Studying People
-: **Learning Goals** Understand concepts in data pipeline in an applied fashion including what is
-our hypothesis, how this translates into study design and method, considerations when interacting
-with users, data collection cleaning and analysis, some statistical methods, and how we draw conclusions
-**Readings**
-- [Some Social Scientist Are Tired of Asking for Permission](https://www.nytimes.com/2017/05/22/science/social-science-research-institutional-review-boards-common-rule.html)
-
-: **Slides** {% include slide.html title="Quantitative Study Design/Running" loc="wk08/studies.html" %}
-
-
-
-{: .lecture} Wednesday, 5/20: Using data to influence people
-: **Learning Goals** Data analysis and how charts and statistics can be used and misused
-
-: **Slides** {% include slide.html title="Analyzing Data" loc="wk08/studies2.html" %}
-
-**Assigned** AS5 [Menus]({{site.baseurl}}/assignments) part 5-6
-
-{: .lab} Thursday, 5/21: Sample Menu Data Analysis
-: **Learning Goals** Evaluating Human Subjects Experiments
-
-: **Slides** {% include slide.html title="Menus Data Analysis" loc="l08/menus-data.html" %}
-
-**Due** AS5 [Menus]({{site.baseurl}}/assignments) part 1-4
-
-
-{: .lecture} Friday, 5/22: Undo
-: **Learning Goals** Theory and implementation of Undo
-
-: **Slides** {% include slide.html title="Undo" loc="wk08/undoSlides.html" %}
-
-**Assigned** AS6 [Undo]({{site.baseurl}}/assignments)
-: **Assigned** Quiz 4 (due <del>Sunday</del>Monday): Covering important concepts from interactor implementation, accessibility and Fitts' Law
-
-<!-- ********* Week 9 ********* -->
-
-{: .week}
-# Week 9: Undo Me
-
-{: .lecture} Monday, 5/25
-: **Due** Quiz 4
-
-{: .holiday} Monday, 5/25: Memorial Day
-: **Due** AS5 [Menus]({{site.baseurl}}/assignments) part 5-6
-
-{: .lecture} Wednesday, 5/27:  Interaction Programming in Web Development
-: **Learning Goals** See how Web Development follows many of the same Interaction Programming principles we've been learning all quarter!
-**Readings**
-- [Spot the Heron Case Study](https://gitlab.cs.washington.edu/cse340-20sp-students/cse340-spottheheron)
-- [What is HTML?](https://developer.mozilla.org/en-US/docs/Learn/HTML/Introduction_to_HTML/Getting_started)
-- [What is CSS?](https://developer.mozilla.org/en-US/docs/Learn/CSS/First_steps/How_CSS_works)
-- [Intro to Javascript](https://javascript.info/intro)
-- [Difference between JS and Java](https://stackoverflow.com/questions/245062/whats-the-difference-between-javascript-and-java)
-
-: **Slides** {% include slide.html title="Interaction Programming in Web Development" loc="wk09/web" %}
-
-
-{: .lab} Thursday, 5/28: Work on Undo
-: **Slides** {% include slide.html title="Getting started with Undo" loc="l09/undo-lab.html" %}
-
-{: .lecture .tbd} Friday, 5/29: Examlet 4, Machine Learning
-: **Learning Goals** Using Machine Learning in Interactive Systems
-**Readings and Watchings**
-- [The Risk of Machine-Learning Bias (and How to Prevent It)](https://sloanreview.mit.edu/article/the-risk-of-machine-learning-bias-and-how-to-prevent-it/)
-- [The Basics of Machine Learning](https://sloanreview.mit.edu/article/the-risk-of-machine-learning-bias-and-how-to-prevent-it/)
-
-: **Slides** {% include slide.html title="Mobile Machine Learning" loc="wk09/ml.html" %}
-
-**Examlet 4** (Due by 10pm) Assess your knowledge on key concepts menus, application design principles, and properties of people II.
-
-
-<!-- ********* Week 10 ********* -->
-
-{: .week}
-# Week 10: Assess Me
-
-{: .lecture} Monday, 6/1: Interaction Programming in Flutter
-: **Learning Goals** See how Flutter follows many of the same Interaction Programming principles we've been learning all quarter!
-**Readings**
-- [What is Flutter?](https://flutter.dev/docs/resources/technical-overview) up to "try it"
-- Optional additional: the “aggressive composability” [Inside Flutter](https://flutter.dev/docs/resources/inside-flutter)
-
-**Slides** [Interaction Programming in Flutter](https://docs.google.com/presentation/d/18Ma_vUkgWPBHFQ9KWoC3jrcDZhp3f9lzmVYQcl7zHOM/preview?slide=id.p)
-
-
-{: .lecture} Wednesday, 6/3:  Heuristic Evaluation
-: **Learning Goals** Learn about a quick way to get feedback on the quality of your application,
-particularly good for focused tasks on screens.
-**Readings**:
-- [Usability Heuristics](https://csfieldguide.org.nz/en/chapters/human-computer-interaction/usability-heuristics/)
-
-**Slides** {% include slide.html title="Heuristic Evaluation" loc="wk10/heuristic" %}
-
-**Due** [Undo]({{site.baseurl}}/assignments)
-
-{: .lab} Thursday, 6/4:  Heuristic Eval of Undo App
-: **Learning Goals** Execute a Heuristic Eval (start in Lab)
-
-:  **Slides** {% include slide.html title="Heuristic Evaluation" loc="l10/lab-heuristic.html" %}
-
-**Due** (16-Mar): Heuristic Eval Reflection
-
-{: .lecture} Friday 6/5:Guest Lecture: Implementing Secure & Private Mobile Apps
-: **Learning Goals** Implementing Secure & Private Mobile Apps
-**Readings**
-- [Android Security Tips](https://developer.android.com/training/articles/security-tips)
-- [Cryptography](https://developer.android.com/guide/topics/security/cryptography)
-
-
-: **Slides** {% include slide.html title="Secure Android Application Development" loc="wk09/cse340-guestlecture-june5.pdf" %}
-**Assigned** Quiz 6 (due Sunday): Sample questions covering key concepts from undo and heuristic evaluation
-
-<!-- ********* Finals Week ********* -->
-
-{: .week}
-# Week 11: Final-ly
-
-{: .exam} 6/8: Final Reflection Due (in lieu of Final Exam)
-
-: **Due** [Undo]({{site.baseurl}}/assignments/undo) final reflection
-: **Due** Quiz 6
-
-<!-- Things cut from the course that could be added back: -->
-
-<!-- {: .lecture} TBD Augmented Reality -->
-<!-- : **Slides** {% include slide.html title="Augmented Reality on the phone" loc="wk08/ar.html" %} -->
-<!-- some key things you need to do to implement Sensing, discussion of the context awareness assignment -->
-
-<!-- Deeper introduction to Animation -->
-
-<!-- Advanced Layout Concepts -->
-<!-- : **Learning Goals** Using tabs, lenses, and so on); How to make use of the Android Layout Libraries Effectively -->
-<!-- : {: .tbd} **Slides**: Advanced Layout -->
+{: .lab} Example lab
+: **Learning Goals** 
 
-<!-- : **Learning Goals** Using machine learning to reason from mobile data -->
-<!-- : **Slides** {% include slide.html title="Machine learning on mobile devices" loc="wk10/ml.html" %} -->
diff --git a/slides/l01/doodle.html b/slides/l01/doodle.html
deleted file mode 100644
index f6897cd621f3f475706e17c1daa9afb168725947..0000000000000000000000000000000000000000
--- a/slides/l01/doodle.html
+++ /dev/null
@@ -1,309 +0,0 @@
----
-layout: presentation
-title: Introduction to Doodle Assignment
-description: Introduction to Doodle Assignment
-class: middle, center, inverse
----
-# CSE 340 Lab 1: Doodle (Spring 2020)
-
-## Introduction to Doodle
-
-.title-slide-logo[
-![:img Android Logo](img/android-logo.png)
-]
----
-
-.left-column[
-## **Library** (and Inheritance Hierarchy)
-<br>
-<br>
-<br>
-<div class="mermaid">
-    graph LR
-    Activity[Activity]
-    Activity -->|...| Doodler[Doodler]
-    Doodler --> Part1[Part1]
-    Part1 --> Part1Activity[Part1Activity]
-    Part1 --> Part2Activity[Part2Activity]
-
-    classDef yellow font-size:19px,text-align:center
-    classDef green font-size:19px,text-align:center
-
-    class Part1,Part1Activity,Part2Activity yellow
-    class Activity,Doodler green
-</div>
-]
-
-.right-column[
-## Android Classes we are using in Doodle and how they relate
-
-- Doodler (which you don't edit) *extends* [Activity](https://developer.android.com/reference/android/app/Activity)
-- Part1 *extends* Doodler. It implements *helper methods* for Part1Activity and
-Part2Activity.
-- Part1Activity and Part2Activity both extend Part1
-]
----
-layout:none
-
-.title[Running Sample Code]
-.body[
-When you accept the assignment on GitGrade, a repository containing the starter code is generated for you on CSE
-GitLab. You **MUST** work within this assignment, as it will be turned in via GitGrade when it is due.
-
-Please clone and use the repository and commit and push your work regularly.
-Not only will doing so protect your code, but it will also allow course staff
-to look at your code and it will allow you to easily pull any changes we make
-to the assignment source.You can find instructions on setting up and maintaining
-a forked repository [here](https://help.github.com/en/articles/working-with-forks).
-]
----
-## Cloning Doodle
-
-.left-column[
-You can find your unique repo by the notification email or by going to [GitLab](https://gitlab.cs.washington.edu) or via
-the [GitGrade](https://gitgrade.cs.washington.edu) interface.
-]
-
-.right-column[
-![:img Android Studio splash screen, 30%](img/doodle-clone-1.png)
-![:img Android Studio clone dialog, 30%](img/doodle-clone-2.png)
-]
-
----
-.title[Open project in Android Studio]
-.body[
-- Run configurations should be automatically imported from Gradle
-- If not, `build` should trigger an import
-- Run with â–º
-- Connect an android device by USB or create a new virtual device
-- If by USB, debugging must be enabled on the device
-]
----
-.title[Implementing `addImage`]
-.body[
-```java
-private ImageView addImage(FrameLayout doodleView, String imageName, Float x, Float y, int size);
-```
-
-### Params:
-- `doodleView`: Canvas in which to render the image.
-- `imageName`: Filename of image to draw in `res/drawable`.
-]
---
-.body[
-- `x`: Horizontal distance from top-left corner of canvas to top-left of image.
-- `y`: Veritcal distance from top-left corner of canvas to top-left of image.
-- `size`: Width and height of rendered image, in pixels.
-]
-
----
-.title[Implementing `addImage`]
-.body[
-### Returns:
-- An `ImageView` which has been added to the canvas.
-]
-
----
-.title[Implementing `addImage`]
---
-.body[
-Break down into component steps, look up documentation, and implement
-
-1) Create `ImageView`
-]
---
-.body[
-2) Add new view to canvas
-]
---
-.body[
-3) Position and set view size
-]
---
-.body[
-4) Set view contents
-]
----
-.title[Implementing `addImage`]
-.body[
-```java
-private ImageView addImage(FrameLayout doodleView, String imageName, Float x, Float y, int size) {
-// Create ImageView and add it to doodleView.
-ImageView image = new ImageView(this);
-// Add image to doodleView
-// Set image size and position
-// Set image contents using filename
-return image;
-}
-```
-]
----
-.title[Implementing `addImage`]
-.body[
-```java
-private ImageView addImage(FrameLayout doodleView, String imageName, Float x, Float y, int size) {
-// Create ImageView and add it to doodleView.
-ImageView image = new ImageView(this);
-// Add image to doodleView
-doodleView.addView(image);
-
-// Set image size and position
-
-// Set image contents using filename
-return image;
-}
-```
-]
----
-.title[Implementing `addImage`]
-.body[
-```java
-private ImageView addImage(FrameLayout doodleView, String imageName, Float x, Float y, int size) {
-// Create ImageView and add it to doodleView.
-ImageView image = new ImageView(this);
-// Add image to doodleView
-doodleView.addView(image);
-
-// Set image size
-image.getLayoutParams().height = size;
-image.getLayoutParams().width = size;
-
-// Set image position ?
-
-// Set image contents using filename
-return image;
-}
-```
-]
-
----
-.title[Breakout Room Discussion]
-.body[
-
-<iframe src="https://embed.polleverywhere.com/multiple_choice_polls/d8jYLjVJq9Lp6MlCMl0XZ?controls=none&short_poll=true" width="800" height="600" frameBorder="0"></iframe>
-
-]
-
-<!--
-.title[Implementing `addImage`]
-.body[
-```java
-private ImageView addImage(FrameLayout doodleView, String imageName, Float x, Float y, int size) {
-// Create ImageView and add it to doodleView.
-ImageView image = new ImageView(this);
-doodleView.addView(image);
-
-image.getLayoutParams().height = size;
-image.getLayoutParams().width = size;
-image.setX(x);
-image.setY(y);
-
-// Set image contents using filename
-return image;
-}
-```
-]
--->
-
----
-.title[Implementing `addImage`]
-.body[
-```java
-private ImageView addImage(FrameLayout doodleView, String imageName, Float x, Float y, int size) {
-// Create ImageView and add it to doodleView.
-ImageView image = new ImageView(this);
-// Add image to doodleView
-doodleView.addView(image);
-
-// Set image size
-image.getLayoutParams().height = size;
-image.getLayoutParams().width = size;
-
-// Set image position ?
-
-// Set image contents using filename
-int resID = getResources().getIdentifier(imageName, "drawable", getPackage());
-image.setImageResource(resID);
-return image;
-}
-```
-]
-
----
-.title[Android Debugging Tips]
-.body[
-
-Resource: [https://developer.android.com/studio/debug](https://developer.android.com/studio/debug)
-
-]
-
-<!---
-## `ValueAnimator`
-
-- Keeps track of the animation's timing (how long its been running and current value of property)
-
-- Contains a `TimeInterpolator` that defines the type of interpolation for the value over time
-
-- Contains a `TypeEvaluator` that figures out how to calculate values for the property being animated
-
-```java
-ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
-animation.setDuration(1000);
-// Starts the animation
-animation.start();
-// TODO: need to listen for updates to get the returned value
-```
--->
-<!--
-.title[How do we use pacing functions for this?]
-.body[
-![:img Picture of a curve transforming motion over time to create a pacing
-effect, 40%](img/pacing.png)
-
-- Time normalized with respect to animation interval (0...1)
-- Normalized time is transformed by pacing function (0…1)
-- Paced value is then fed to curve function to get final value
-
-] -->
-<!--
-.title[XML shown in class]
-.body[
-```xml
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-    <objectAnimator android:propertyName="x" android:valueTo="100" />
-</set>
-```
-]
--->
-<!--
-```java
-package com.example.myapplication;
-//imports...
-
-public class MainActivity extends AppCompatActivity {
-@Override
-protected void onCreate(Bundle savedInstanceState) {
-super.onCreate(savedInstanceState);
-ImageView view = new ImageView(this);
-setContentView(view);
-
-Bitmap bitmap = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888);
-view.setImageBitmap(bitmap);
-Canvas c = new Canvas(bitmap);
-Paint p = new Paint();
-c.drawCircle(10,10,5,p);
-
-ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 1f, 0f);
-anim.setDuration(2000);
-anim.start();
-
-Animator anim2 = (Animator) AnimatorInflater.loadAnimator(this,
-R.animator.sample);
-anim2.setTarget(view);
-anim2.setDuration(2000);
-anim2.start();
-}
-}
-```
--->
\ No newline at end of file
diff --git a/slides/l01/gitgrade.html b/slides/l01/gitgrade.html
deleted file mode 100644
index a6c9f64a35133b1599bedcf121e5a557f53b2b55..0000000000000000000000000000000000000000
--- a/slides/l01/gitgrade.html
+++ /dev/null
@@ -1,48 +0,0 @@
----
-layout: presentation
-title: Lab 1 GitGrade Slides
-description: Introduction to GitGrade and accepting the first assignment
-class: middle, center, inverse
----
-
-# CSE 340 Lab 1: GitGrade (Spring 2020)
-
-## Introduction to course infastructure
-![:img GitGrade Logo, 20%](img/gitgrade_square.png)
-
----
-## What is GitGrade?
-
-GitGrade is the software we use to manage and grade programming assignments.
-
-## Why is it relevant to you?
-
-Because you will use GitGrade to `accept` the assignment, in order to generate a GitLab repository with starter code.
-
-You will also `turn-in` the assignment using GitGrade by registering a commit as your submission.
-
----
-## What are we doing with it today?
-
-We're going to `accept` the first assignment (`as1-doodle`) and clone the generated repository.
-
-Start by navigating to
-[https://gitgrade.cs.washington.edu/student/assignment/116](https://gitgrade.cs.washington.edu/student/assignment/116).
-This link is available on the course website, on the `Doodle` assignment page.
-
-You will need to login with your CSE GitLab credentials.
----
-## Accepting the assignment
-
-Accept the assignment, and navigate to the generated GitLab repository of the name
-`cse340-20wi-students/as1-doodle-NETID`
-
-![:img screenshot of GitLab accept assignmet page with a large button labeled "Accept Assignment",
-90%](img/accept-screencap.png)
-
----
-## Turning in the assignment
-- Through GitGrade, link on the Doodle page on the course website (accept link + `/turnin`)
-- Recommended to visit the turnin page ahead of time to read the **nuances and details**
-- Late Day Policy: 3 late days, no partial usage. Applied whenever something is turned in late until you run out.
-- If something is late, and you have no late days: `score -= (10% * unexcused days late)`
\ No newline at end of file
diff --git a/slides/l01/hello.html b/slides/l01/hello.html
deleted file mode 100644
index 46a2d2e3d1c0c31bf37ff6dc7127ebf1a703e268..0000000000000000000000000000000000000000
--- a/slides/l01/hello.html
+++ /dev/null
@@ -1,216 +0,0 @@
----
-layout: presentation
-title: Lab 1 Slides
-description: Lab project--Hello World--
-class: middle, center, inverse
----
-
-# CSE 340 Lab 1 (Spring 2020)
-## Week 1: Getting Started With Android Development
-
-.title-slide-logo[
-![Android Logo](img/android-logo.png)
-]
-
----
-
-## Course Objectives
-- Practical applications for learnings in lecture
-
-
-- Understand design considerations when making mobile apps
-
-
-- Design and implement basic Android applications
-
-
-- Debugging in Java and for Android
-
----
-
-## Lab 1 Objectives
-
-- Introduce the building blocks of Android applications
-
-
-<!-- - Obtain the course repository -->
-
-
-- Explore an Android project folder
-
-
-- Getting the first part of the Doodle started
-
-
-- Show some basic Android debugging techniques
-
----
-## Android Applications
-
-__Components__
-
-- Activity
-- Service
-- Broadcast Receiver
-- Content Providers
-
-__Intents__
-
-- Launch components (and provide them with data)
-- Not limited to components of the same app
-- Meaning: your components can be started by intents from other applications
-
-
----
-## Activity
-[`android.app.Activity`](https://developer.android.com/reference/android/app/Activity)
-
-- Represents a single interface
-
-- Example: Activities for Gmail App
-- Inbox, Message Compose, Spam Folder, etc.
-
-- Activities can be started by other applications, if desired
-- E.g., sharing a photo by email starts Gmail's Message Compose activity
-
----
-## Activity
-
-.center[
-![:img Activity Lifecycle, 40%](img/activity_lifecycle.png)
-]
-
----
-## Service
-[`android.app.Service`](https://developer.android.com/reference/android/app/Service)
-
-
-- Entry point for background processes
-
-
-- Example: Spotify's player activity uses a service to play music
-- Could be done by activity alone
-
-- Use of a service allows music to continue when player activity is no longer in the foreground
-
-- Services may be killed and restarted as required by the OS
-- A persistent service such as music playback may use a persistent notification to prevent this
-
----
-## Broadcast Receivers
-[`android.content.BroadcastReceiver`](https://developer.android.com/reference/android/content/BroadcastReceiver.html)
-
-
-- Entry point for events outside of regular userflow
-
-
-- Example: Alarms
-- Application schedules callback with OS in 10 minutes
-
-- In the meantime, the application can be killed
-
-- 10 minutes later, the OS broadcasts the callback event to the app
-
-- App begins playing sound; vibrating
-
----
-## Content Providers
-[`android.content.ContentProvider`](https://developer.android.com/reference/android/content/ContentProvider)
-
-
-- Persistent storage of data
-
-
-- Supports multiple backends, depending on app permissions
-- Local filesystem, web, SQLite DB, etc.
-
-- Can permit access to other applications
-- Contacts can be read and written to by other apps, depending on permissions
-
-<!---
-## Obtaining the Course repository
-
-- After [accepting the assignment](https://courses.cs.washington.edu/courses/cse340/20sp/slides/l01/gitgrade.html#1), go to Gitlab
-
-- If you do not have SSH set up with Gitlab, just download the zip for now
-
-- Later: ['Set up an SSH key with
-Gitlab'](https://gitlab.cs.washington.edu/help/ssh/README#generating-a-new-ssh-key-pair)
-
-- Once you have SSH set up, clone the repository -- will show after section -->
-
----
-## Android Project Structure
-
-.center[
-![:img Android Project Structure, 30%](img/android_project_structure.png)
-]
-
----
-
-## Android Project Structure
-
-`app/src/main/AndroidManifest.xml`
-
-- Describes application at a high level for both compilation and running
-- Includes app package, components, permissions, and hardware features
-
-
-
-`app/src/main/java/com.example.myapp/MainActivity.java`
-
-- The main activity activated when application launches
-
-
-
-`app/build.gradle`
-
-- Android build tool configuration file
-- Includes target and min SDK versions and dependencies
-
-
-`app/src/main/res/layout/activity_main.xml`
-
-- Declares the views and layout of the main activity
-
----
-## Android Project Structure
-
-`drawable-<density>/`
-
-  - Images at various pixel densities to accommodate various display resolutions
-  - Keep filenames consistent between folders
-
-
-`layout/`
-
-  - Layout XML description files for application activities
-
-
-`mipmap/`
-
-  - Launcher icons for your application at various sizes and shapes
-
-
-`values/`
-
-  - A good place to store constants
-  - Density-independent pixel values (sizes)
-  - Color
-  - Good for string localization as well
-  - Storing strings here makes it much easier to add additional languages in the future!
-
----
-
-  ## Resources
-
-  - Vogella Tutorials -
-  - Android Animation - http://www.vogella.com/tutorials/AndroidAnimation/article.html
-
-  - Android Developer
-  - View Animation - https://developer.android.com/guide/topics/graphics/view-animation.html
-  - Property Animation - https://developer.android.com/guide/topics/graphics/prop-animation.html
-
-  - Relevant supplemental material is provided on the course website
-  - Listed in the schedule
-  - This week's supplemental material reviews Java, covers Android animation
\ No newline at end of file
diff --git a/slides/l01/img/accept-screencap.png b/slides/l01/img/accept-screencap.png
deleted file mode 100644
index d4c9bd30025ebc9f8cde44d3caacb229b3934d7e..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/accept-screencap.png and /dev/null differ
diff --git a/slides/l01/img/activity_lifecycle.png b/slides/l01/img/activity_lifecycle.png
deleted file mode 100644
index ab0921a717d184442c96c1b8863018d46920a67c..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/activity_lifecycle.png and /dev/null differ
diff --git a/slides/l01/img/android-logo.png b/slides/l01/img/android-logo.png
deleted file mode 100755
index cebec75001ab25dc397065f193797d5ebd0cb38d..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/android-logo.png and /dev/null differ
diff --git a/slides/l01/img/android-versions-oct2018.png b/slides/l01/img/android-versions-oct2018.png
deleted file mode 100644
index 0317a23481dd904945e70c60790755ac28b2ae69..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/android-versions-oct2018.png and /dev/null differ
diff --git a/slides/l01/img/android_project_structure.png b/slides/l01/img/android_project_structure.png
deleted file mode 100644
index 60efcf057b7240f6c29e09b5e09edcad52b64174..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/android_project_structure.png and /dev/null differ
diff --git a/slides/l01/img/doodle-clone-1.png b/slides/l01/img/doodle-clone-1.png
deleted file mode 100644
index ab06ba85fc07a7ff070816ce3d8cdae25163eac5..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/doodle-clone-1.png and /dev/null differ
diff --git a/slides/l01/img/doodle-clone-2.png b/slides/l01/img/doodle-clone-2.png
deleted file mode 100644
index 1fc9275e26732ebb178c482500cfb16d21d1eac6..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/doodle-clone-2.png and /dev/null differ
diff --git a/slides/l01/img/gitgrade_square.png b/slides/l01/img/gitgrade_square.png
deleted file mode 100644
index 300617b81c276855f685524efb55670492c4ac7a..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/gitgrade_square.png and /dev/null differ
diff --git a/slides/l01/img/instagram-example.png b/slides/l01/img/instagram-example.png
deleted file mode 100755
index 0094d142321dde64b7a627634d2e619e8cca0e1f..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/instagram-example.png and /dev/null differ
diff --git a/slides/l01/img/mvp-design-pattern.png b/slides/l01/img/mvp-design-pattern.png
deleted file mode 100755
index 9dd87a7f4c12553e619856dd300b307ae9e7b449..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/mvp-design-pattern.png and /dev/null differ
diff --git a/slides/l01/img/pacing.png b/slides/l01/img/pacing.png
deleted file mode 100644
index 3997cf6fd6aeee192b83ddd549982c9fb8c857a2..0000000000000000000000000000000000000000
Binary files a/slides/l01/img/pacing.png and /dev/null differ
diff --git a/slides/l01/notes-sp19.txt b/slides/l01/notes-sp19.txt
deleted file mode 100644
index 978318b631574c4e5e832b3e276016df849eb000..0000000000000000000000000000000000000000
--- a/slides/l01/notes-sp19.txt
+++ /dev/null
@@ -1,146 +0,0 @@
-Introduction - 2 minutes
-   - Welcome to CSE 340
-   - Over the duration of this course, you will be applying your learnings from
-   lecture in a very practical way
-      - This means
-         - not only understanding what to consider when building mobile apps
-         - but also designing and implementing your own Android apps
-   - With that goal in mind, we will use our time in lab today to start exploring
-   Android app development
-      - I will introduce you to the building blocks of Android applications
-      - After obtaining the course repository
-         - we will explore the android project folder
-         - I will show some basic Android debugging techniques
-
-
-
-
-Android Application Components - 7 minutes
-- Applications are comprised of a variety of components.
-   - These components are activities, services, broadcast receivers, and content providers
-
-- Components are activated with objects called intents
-   - These intents provide the components with data. 
-   - Intents are not limited to components of the same application,
-   so your components can actually be activated by intents from other applications.
-      - Personal example: for an internship I was kicking off a workflow
-      on an Amazon Echo where we would play a series of audio pieces, record them,
-      and then analyze them. For that, I defined the intent in the Android manifest,
-      and then supplied the intent over a command line with arguments like which audio
-      files to play, how long to record for, etc.
-
-- Activities represent single screens with a user interface
-   - Gmail has different activities for composing your message, looking at your inbox,
-   accessing your settings, etc.
-   - <Walk through example workflow>
-      - This diagram is a toolkit architecture.
-
-- Services are components that perform operations in the background that don't provide
-a user interface.
-   - For example, Spotify's player activity is where you select what music to play,
-   but its player service is what actually places the music. This is why you can
-   navigate your phone freely when you use Spotify.
-   - In my project, the Intent kicked off a service that would fetch audio from the cloud,
-   play it, and calibrate it. There was no user interface because the device was an Amazon Echo.
-   - Of course, it's the OS's prerogative to impact the life of a service instance. 
-
-- Broadcast Receivers are entry points for events outside of the regular user workflow.
-   - Registers system or application events using the publish-subscribe model.
-   - When an interesting event happens, a broadcast is sent.
-   - Individual apps can register to receive specific broadcasts.
-   - For example, an alarm app can register a callback with the OS for x time. Then,
-   when the time comes, the OS sends a broadcast to the alarm app to wake it up, and the
-   alarm starts ringing.
-   - Think of it as a messaging system between apps outside of the user workflow.
-
-- Content Providers are the interfaces for managing persistent data.
-   - For example you could have a Content Provider manage writing data to the local filesystem
-   or the cloud.
-   - You can manage other applications' interactions with your data.
-      - For example, the messenger app interacts with a content provider to look at your
-      contacts list on your phone if you give it permission. 
-
-
-
-
-
-Obtaining the Course Repository - Give them 5 minutes to obtain and peruse
-the repository
-
-- Make it private
-
-
-
-
-
-Ask two people if they noticed any files that stood out in particular
-and why those files stood out - 3 minutes
-
-
-
-
-
-
-Move through important files together - 5 minutes
-
-- The Android Manifest describes the application at a high level.
-   - Identifies the name of the application package
-   - Describes all the components of the app.
-   - Lists any permissions the application would need, as well
-   as any hardware or software the app depends on to compile and run
-      - For example, if the app needs permission to write to the disk,
-      that information would be here
-      - Notice that the Part1Activity activity is described here as accepting
-      intent for the Main action with category Launcher. This means that this
-      activity is the main activity that is activated when launching the app.
-
-- The MainActivity java file sets the behavior of the main acitivity of the
-application. For us, the Main activity is Part1Activity.java
-   - Here in Doodler we see the OnCreate method, which is run whenever an Activity
-   is launched.
-      - Our OnCreate calls other methods, like addText, addLine, and addImage, that you
-      will implement.
-
-- The build.gradle file configures the build for the application
-   - Describes the minimum SDK versions and technical dependencies the project will depend on.
-
-- The resources folder contains additional files and static content that the code will use.
-   - Things like images, static data files, and even activity layouts and global
-   constants can be described here.
-      - One interesting thing about Android development is that depending on your needs
-      you can implement functionality either in your code files or in your resources folder.
-
-- The activity_main.xml file declares the views and the layout of the main activity.
-   - Layouts in Android are in XML. 
-      - If you've ever done HTML development, this should
-      be familiar to you. 
-      - Components in your view are structured like a tree, where each
-      component is described relative its parent.
-         - In Doodle, we see that right now our outermost container is ConstraintLayout,
-         and inside that is a FrameLayout whose height and width are set to match the parent.
-
-- The drawable folders contain the images for the application.
-   - The different folders are for accomodating various display resolutions.
-
-- The layout folder holds the XML files describing the layouts of the different
-activities in the program.
-   - In our application, there's only the main activity's xml layout, but additional
-   layouts can go here as well.
-
-- The mipmap folders contain the launcher icons for the application for a variety
-of screen sizes and shapes.
-
-- The values folder is a good place to store global static constant values
-   - e.g. strings
-
-
-- Go over debugging - 5 minutes
-   - Breakpoints, the android studio debugger
-   - Logging
-
-
-- 22 minutes - work on Doodle
-   - Working on Doodle addImage
-
-Discussion in general:
-   - Learning a toolkit is hard - need to explore
\ No newline at end of file
diff --git a/slides/l01/notes-wi20.txt b/slides/l01/notes-wi20.txt
deleted file mode 100644
index 22ebd968d757c5f51f95d5bd51ae5d5ea02304d4..0000000000000000000000000000000000000000
--- a/slides/l01/notes-wi20.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-TODO:
- - update assignment accept link in gitgrade slides
- - add assignment accept and turn-in links to assignment page
-
-Issues:
- - not sure how doable the addImage without handholding the entire thing / showing them the code
-
- total structured time: 37min
- total unstructured time: 23min
-
-Introduction - 10 minutes
-   - Welcome to CSE 340
-   - Introduce ourselves!
-   - notes on how section works, teachers changing
-
-   - Talk about nametags, hand out nametags
-   - Plug Java Refresher Lab 5.30 @ CSE1 403
-
-   - Over the duration of this course, you will be applying your learnings from
-   lecture in a very practical way
-      - This means
-         - not only understanding what to consider when building mobile apps
-         - but also designing and implementing Android apps
-   - With that goal in mind, we will use our time in lab today to start exploring
-   Android app development
-      - We'll accept the first assignment, Doodle
-      - Clone the repository to our local devices
-      - Explore the structure and pieces of an Android project
-      - Complete the first part of the assignment
-
-Android apps happen on phones, if you want to get a phone instead here are our recommendations
-(Sophie, 7min)
-
-GitLab Intro (using the GitLab deck) - 10min
-
-Intro to Doodle
-    - open the assignment spec and walk through it quickly: 5min
-    - open the repo in Android Studio and talk through important files: 5min
-        - activities
-        - layouts
-    - talk through the addImage line: 5min
-    - let students work on Doodle for remaining time
-
-
-
diff --git a/slides/l02/animation.html b/slides/l02/animation.html
deleted file mode 100644
index 3141f5ddcce3009b19e38047aba60d1bfb885afb..0000000000000000000000000000000000000000
--- a/slides/l02/animation.html
+++ /dev/null
@@ -1,157 +0,0 @@
----
-layout: presentation
-title: Lab 2 Slides
-description: Lab project--Doodle--
----
-
-# CSE 340 Lab 2 (Spring 2020)
-## Week 2: Get Help with Doodle
-
-.title-slide-logo[
-  ![Android Logo](img/android-logo.png)
-]
-
----
-
-# Doodle Timeline
-
-- Doodle Due: Thursday, April 9 @ 10:00pm (**Today!**)
-
-- Lock: Saturday, April 11 @ 10:00pm (If you are using late days)
-
-- Peer Eval: Sunday, April 12 - Tuesday, April 14 @ 10:00pm
-
-- Reflection: Wednesday, April 15 @ 10:00pm
-
----
-
-# Lab 2 Objectives
-
-- Go through peer evaluation and reflection
-
-
-- How to debug in Android
-
-
-- Android Animation
-
----
-
-# Lab 2 After Implementation
-
-- Peer evaluation - fill the survey that we send out
-
-- The best ones will show off in class
-
-
-- Part 3: Turn in reflection on Gradescope after peer evaluation
-
----
-# Peer Evaluation
-- Why?
-  - Chance to externalize your work
-  - Get user feedback (the user experience is after all the point of HCI)
-
-- What to expect  
-  - Your grade won't be determined by peer evaluating alone
-  - You get credit for **doing** the peer evaluation
-  - Questions about spec requirements -- no room for interpretation
-  - Questions that prompt about subjective feedback
-    - Provide constructive feedback
-  - Anonymous to your peers (but not to the teaching staff)
-
-- Your feedback on the exercise! (be honest)
-
----
-
-# Peer Evaluation Practice
-
-- Download the apk file: https://tinyurl.com/wdgjkcu
-
-- Google form: https://tinyurl.com/DoodleTestEval (Please use your UW Net ID)
-
----
-
-# Peer Evaluation Instructions
-
-.right-column-staff[
-- You will be assigned to peer grade 3 assignments via email
-- If you have an Android phone
-  - Click on the download link to install the app on your phone
-- If you don't have a phone
-  - Download the APK files
-  - Open the APK file in Android Studio and run the app in the emulator
-- Fill out the google form for each APK file
-]
-
-.left-column-staff[
-<img src="./img/wizard.png" alt="screenshot of Android Studio Wizard" width="40%" height="50%"/>
-]
----
-
-# Android Debugging
-
-- Select a device to debug your app on
-- Set breakpoints in your Java, Kotlin, and C/C++ code
-- Examine variables and evaluate expressions at runtime
-
-
-- How to use Debugger: https://developer.android.com/studio/debug#java
-- Helpful tool (Logcat): https://developer.android.com/studio/debug/am-logcat#java
-
-
----
-# Animation on Android
-
-- _Property Animation_ - preferred method; more flexible
-
-- _View Animation_ - simple setup; the old way (but you have to deal with xml...)
-
-- _Drawable Animation_ - load `Drawable` resources and display them one frame after the other (it is like a gif)
-
-
----
-# Property Animation
-
-- Define an animate that changes on object's _property_ (a field in an object) over _a length of time_
-
-## `ValueAnimator`
-
-- Keeps track of the animation's timing (how long its been running and current value of property)
-
-```java
-ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
-animation.setDuration(1000);
-// Starts the animation
-animation.start();
-// TODO: need to listen for updates to get the returned value
-```
-
----
-
-# `ObjectAnimator` (the one you need in this assignment)
-
-- Rather than listening for a value, we can simply directly animate a property on an object
-
-- **However**: the property that you are animating must have a setter function (in camel case) in the form of set<propertyName>() for this to work (_setDuration()_)
-
-```java
-ObjectAnimator anim = ObjectAnimator.ofFloat(textView, "alpha", 0f, 1f);
-anim.setDuration(1000);
-anim.start();
-```
-
----
-
-# Resources
-
-- Vogella Tutorials - http://www.vogella.com/tutorials/AndroidAnimation/article.html
-
-- Android Developer
-  - View Animation - https://developer.android.com/guide/topics/graphics/view-animation.html
-  - Property Animation - https://developer.android.com/guide/topics/graphics/prop-animation.html
-
-- Relevant supplemental material is provided on the course website
-  - Listed in the Doodle assignment
-  - Don't stress out :) this isn't required
-
diff --git a/slides/l02/animationPractice.zip b/slides/l02/animationPractice.zip
deleted file mode 100644
index f61898caee6a923d2664759343babc271aa24ce7..0000000000000000000000000000000000000000
Binary files a/slides/l02/animationPractice.zip and /dev/null differ
diff --git a/slides/l02/img/activity_lifecycle.png b/slides/l02/img/activity_lifecycle.png
deleted file mode 100755
index 879f51f6e8fafe75d267984680ef63f85b118dc5..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/activity_lifecycle.png and /dev/null differ
diff --git a/slides/l02/img/android-logo.png b/slides/l02/img/android-logo.png
deleted file mode 100755
index cebec75001ab25dc397065f193797d5ebd0cb38d..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/android-logo.png and /dev/null differ
diff --git a/slides/l02/img/animation/android-animate.gif b/slides/l02/img/animation/android-animate.gif
deleted file mode 100755
index 0fb1d08fd616979b31c4390966e7c2e3410b2c4f..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/animation/android-animate.gif and /dev/null differ
diff --git a/slides/l02/img/animation/animation-linear.png b/slides/l02/img/animation/animation-linear.png
deleted file mode 100755
index 08bd9fc3dc2ce5d151294b1d2b695a490f2e5f00..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/animation/animation-linear.png and /dev/null differ
diff --git a/slides/l02/img/animation/valueanimator.png b/slides/l02/img/animation/valueanimator.png
deleted file mode 100755
index 6cc2a13bbfca142b090c3fec00ddf410ca82eeb5..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/animation/valueanimator.png and /dev/null differ
diff --git a/slides/l02/img/animationDemo.mov b/slides/l02/img/animationDemo.mov
deleted file mode 100644
index a6869d9aea9806463e59f8fd6266d3b48a8819f7..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/animationDemo.mov and /dev/null differ
diff --git a/slides/l02/img/animationPractice.zip b/slides/l02/img/animationPractice.zip
deleted file mode 100644
index f61898caee6a923d2664759343babc271aa24ce7..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/animationPractice.zip and /dev/null differ
diff --git a/slides/l02/img/anydo-example.png b/slides/l02/img/anydo-example.png
deleted file mode 100755
index ad9958b541d2a3cce7890b7f8156ebf84bb7cfd0..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/anydo-example.png and /dev/null differ
diff --git a/slides/l02/img/first-android-project-structure.png b/slides/l02/img/first-android-project-structure.png
deleted file mode 100755
index 8a63e70e71075cbd6963baa58fc9eb4e52bbe1ea..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/first-android-project-structure.png and /dev/null differ
diff --git a/slides/l02/img/instagram-example.png b/slides/l02/img/instagram-example.png
deleted file mode 100755
index 0094d142321dde64b7a627634d2e619e8cca0e1f..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/instagram-example.png and /dev/null differ
diff --git a/slides/l02/img/wizard.png b/slides/l02/img/wizard.png
deleted file mode 100644
index 8ecaad5256c117e6ab7c93b93e5b61818a57950f..0000000000000000000000000000000000000000
Binary files a/slides/l02/img/wizard.png and /dev/null differ
diff --git a/slides/l03/img/LayoutSpec.png b/slides/l03/img/LayoutSpec.png
deleted file mode 100644
index d35a62e29abba453847a525fc4eba2956e1d34d2..0000000000000000000000000000000000000000
Binary files a/slides/l03/img/LayoutSpec.png and /dev/null differ
diff --git a/slides/l03/img/android-linear.png b/slides/l03/img/android-linear.png
deleted file mode 100644
index 6b252da67203bb2e57a21a65c2b442d1e7e14a9d..0000000000000000000000000000000000000000
Binary files a/slides/l03/img/android-linear.png and /dev/null differ
diff --git a/slides/l03/img/constraint-editor.png b/slides/l03/img/constraint-editor.png
deleted file mode 100644
index cb898264dbb375ea8f1fe36aa38180cf76f5ceee..0000000000000000000000000000000000000000
Binary files a/slides/l03/img/constraint-editor.png and /dev/null differ
diff --git a/slides/l03/img/design-view.png b/slides/l03/img/design-view.png
deleted file mode 100644
index 76f63830d1dbd0e0388c6ce7f57bd2b3d7618db9..0000000000000000000000000000000000000000
Binary files a/slides/l03/img/design-view.png and /dev/null differ
diff --git a/slides/l03/img/exam-q-sol.png b/slides/l03/img/exam-q-sol.png
deleted file mode 100644
index 047f349edee6bc6236c21e774ef2d7febef9ff0e..0000000000000000000000000000000000000000
Binary files a/slides/l03/img/exam-q-sol.png and /dev/null differ
diff --git a/slides/l03/img/interactor-hierarchy.png b/slides/l03/img/interactor-hierarchy.png
deleted file mode 100644
index bd0a91b5f82c8810b45ea4c661fe9fda6e68e311..0000000000000000000000000000000000000000
Binary files a/slides/l03/img/interactor-hierarchy.png and /dev/null differ
diff --git a/slides/l03/img/pinterest-android.png b/slides/l03/img/pinterest-android.png
deleted file mode 100644
index b07ff8eb6c83c79e5b44007a16da7d1b47c88536..0000000000000000000000000000000000000000
Binary files a/slides/l03/img/pinterest-android.png and /dev/null differ
diff --git a/slides/l03/img/watch3.png b/slides/l03/img/watch3.png
deleted file mode 100644
index ce7134c4b0c57883931335e40fef086a366e7294..0000000000000000000000000000000000000000
Binary files a/slides/l03/img/watch3.png and /dev/null differ
diff --git a/slides/l03/img/xmlvsjava.png b/slides/l03/img/xmlvsjava.png
deleted file mode 100644
index 62b80b16d6c1c2cb1779fc42a1928e42e1aa7aaa..0000000000000000000000000000000000000000
Binary files a/slides/l03/img/xmlvsjava.png and /dev/null differ
diff --git a/slides/l03/layout.html b/slides/l03/layout.html
deleted file mode 100644
index 0b49a4fe99589f60d698eaea59b0257965b83584..0000000000000000000000000000000000000000
--- a/slides/l03/layout.html
+++ /dev/null
@@ -1,278 +0,0 @@
----
-layout: presentation
-title: Lab 3 Slides
-description: Lab project--Layout--
----
-
-# CSE 340 Lab 3 (Spring 2020)
-## Week 3: Layout
-
-.title-slide-logo[
-  ![Android Logo](img/android-linear.png)
-]
-
----
-
-# Layout Timeline
-
-- Layout part 1-2 due: Tomorrow @ 10:00pm (No late days allowed)
-
-- Layout part 3-4 and Reflection due:  Next Thursday, April 23 @ 10:00pm
-  - Lock: Saturday, April 25 @ 10:00pm (If you are using late days)
-
-
-<!-- # Reflection?
-
-- What did you learn from doing Part4?
-
-- Was there anything that was surprisingly easy or hard?
-
-- Include your diagram of the interactor hierarchy and the corresponding interface. -->
-
----
-
-# Instruction for turning in Layout part 3-4
-
-- **(Important!)** You will have to accept the Layout Part 3-4 at Gitgrade before you turn in
-
-- Track your acceptance/ submission of all assignments: https://gitgrade.cs.washington.edu/student/summary/8723
-
-- Work in the same repo as Part 1-2
-
----
-# Section 3 Objectives
-
-- User Interfaces on Android
-  - ConstraintLayout
-  - Interactor Hierarchy
-
-- `LayoutInflater`
-  - XML vs. Programmatic (Java)
-
-- Previous exam problem of Layout
-  - Worksheet: https://tinyurl.com/cse340lab3
-
-
----
-# User Interfaces on Android
-.left-column-half[
-- Views
-  - Base class for __all__ UI elements
-  - Interactors (e.g buttons, labels, image views, etc)
-- ViewGroups
-  - Encapsulates one or more views (e.g. Android Components, **Layouts**)
-  - Can define specific **layout** properties
-- Layout
-  - Defines the structure for the user interface (UI) of your app
-  - View and ViewGroup objects live within Layouts
-  - We will use the word *Components* to include both layout components and interactors (Views) since you don't generally "interact" with layouts
-]
-
-.right-column-half[
-<div class="mermaid">
-graph TD
-W(ViewGroup) --> V[ViewGroup]
-W --> V1[View]
-W --> V2[View]
-V --> V3[View]
-V --> V4[View]
-V --> V5[View]
-
-classDef blue font-size:14pt,text-align:center
-classDef darkblue font-size:14pt,text-align:center
-
-class W,V darkblue
-class V1,V2,V3,V4,V5 blue
-</div>]
-
----
-# Layout in Android
-Where we left off: "Many layout and other attributes for components. You should explore!"
-
-![:img Picture of the whole android layout interface showing the possible components that can be added; the component tree (interactor hierarchy; and the attributes for the Save Button; which is selected, 90%](img/design-view.png)
-
----
-# Layout Types in Android
-
-- [FrameLayout](https://developer.android.com/reference/android/component/FrameLayout.html) - good for position views on
-top of each other, or encapsulating a bunch of views. Used in [Doodle](/assignments/doodle).
-
-- [__LinearLayout__](https://developer.android.com/reference/android/component/LinearLayout.html) - places views one after
-the other in order according to the orientation (Horizontal or Vertical). Used in [Layout](/assignments/layout).
-
-- [__RelativeLayout__](https://developer.android.com/reference/android/widget/RelativeLayout) - Positions of the children
-are desribed in relation to one another
-
-- [__TableLayout__](https://developer.android.com/reference/android/component/TableLayout.html) - Rows and columns style
-way of declaring a layout
-
-- [GridLayout](https://developer.android.com/reference/android/component/GridLayout.html) - Uses
-an [*adapter*](https://developer.android.com/reference/android/interactor/Adapter.html) that provides items to display in
-a grid
-
-- [ConstraintLayout](https://developer.android.com/reference/android/component/ConstraintLayout.html) Let's you use constraints to specify how things should lay out. Used in [Layout](/assignments/layout).
-
-
-- More on https://developer.android.com/guide/topics/ui/declaring-layout.html
-
-<!--
-
-
-# What is LayoutInflater? -->
-
----
-# Constraint Layout
-.left-column-half[
-
-![:img A simple layout on an android watch with a textview and two
-buttons (save and discard) and the constraints highlighted,70%](img/constraint-editor.png)
-]
-.right-column-half[
-- ConstraintLayout is a ViewGroup that allows you to position widgets in a flexible way
-- Useful for building responsive interfaces in Android.
-- You can see little lines connecting the `textView` to its container and it's sibling (the `linearLayout`).
-  - This specifies how it's attached (can change type by clicking on right)
-  - If you were to change the interface (e.g. a different sized screen), it would stay attached and keep filling the space
-  - All ends up in XML you can explore too
-]
-
-
----
-# What are  Constraints?
-.left-column[
-![:img A simple layout on an android watch with a textview and two
-buttons (save and discard) and the constraints highlighted,110%](img/watch3.png)]
-.right-column[
-
-- Very general
-- Can reproduce most other things
-- Can operate on multiple axes
-- Can enhance other layout options
-
-]
-
----
-
-# Worksheet: Interactor Hierarchy
-
-What would be the Component Tree for the Layout Part 1-2 program?
-
-.left-column-half[
-  ![:img diagram of the interactor hierarchy shown on the next slide in graphic form, 50%](img/LayoutSpec.png)
-]
-
-
---
-.right-column-half[
-<div class="mermaid" style="font-size: small;">
-graph TD
-LL(LinearLayout) --> S[StatusBar]
-LL --> RL[RelativeLayout]
-RL --> SV[ScrollView]
-RL --> BN[BottomNav]
-SV --> CL[ConstraintLayout]
-CL --> V2[ImageView]
-CL --> V3[...]
-CL --> V4[ImageView]
-
-
-class LL,RL,SV,CL darkblue
-class S,SV,BN,V2,V3,V4 blue
-</div>
-]
-
----
-
-# LayoutInflater
-
-- Accepts a valid XML file and converts it into a `View` object or interactor hierarchy.
-
-- In Part 3 you will code part of it in an XML file and the rest programmatically (Java).
-
-- Why? (Discuss about pros and cons of constructing layout with XML and programmatically)
-
----
-
-# XML vs. Programmatic (Java)
-
-.left-column-half[
-- XML is easier setting up the Layouts
-
-- XML shows the Layouts directly
-
-- XML can be inflated many times
-]
-
-.right-column-half[
-![XML vs Programmatic Java](img/xmlvsjava.png)
-]
----
-
-# XML vs. Programmatic (Java)
-
-- Programmatic is easier adding items to the Layouts
-
-- Programmatic can use loops
-
-- Sample solution of adding items into Layout in Part 1 (XML) has 55 lines
-
-- Sample solution of adding items into Layout in Part 2 (Java) has 17 lines
-
-
----
-
-# How do we use the LayoutInflater?
-
-1. Setting up the LayoutInflater
-```java
-// Obtains the LayoutInflater from the given context
-LayoutInflater.from(Context context)
-```
-
-2. Inflate
-```java
-// Inflate a new view hierarchy from the specified XML resource
-inflate(int resource, ViewGroup root)
-```
-
----
-# Worksheet: Quick Exercise
-
-Construct a LayoutInflater and pass in the `part1.xml` file.
-
----
-
-# Quick Exercise Solution
-
-```java
-public Part1View(Context context, List<String> imageNames, int vMargin) {
-// Obtain the inflater from the context
-LayoutInflater inflater = LayoutInflater.from(context);
-
-// Inflate R.layout.part1 
-View newView = inflater.inflate(R.layout.part1, null); // newView is at the root of the inflated tree
-
-// Add it to this view
-this.addView(newView);
-}
-```
-
----
-
-# Previous Exam Question
-
----
-
-# Solution
-
-**What is the basic idea you have for how to fix it?**
-
-> Constrain the top of the scroll to the bottom of the text view.
-
-**Which view would you need to modify (provide the value you would set `android:id` to)?**
-
-> `@+id/scrollView`
-
-**What one line of XML would you add? Pseudocode ok here, you don't have to use exact names.**
-
-> `app:layout_constraintTop_toBottomOf="@id/textView"`
diff --git a/slides/l04/accessibility.html b/slides/l04/accessibility.html
deleted file mode 100644
index 9f6f39b0cbf4891b646bcc8ad8bca50d2f2f780d..0000000000000000000000000000000000000000
--- a/slides/l04/accessibility.html
+++ /dev/null
@@ -1,110 +0,0 @@
----
-layout: presentation
-title: Lab 04 Slides
-description: Layout and Accessibility
-class: middle, center, inverse
----
-# CSE 340 Lab 4 (Spring 2020)
-
-## Week 4: Accessibility
-
-.title-slide-logo[
-  ![Accessibility Logo](img/cover.jpg)
-]
-
----
-
-# Assignment Timeline
-
-- Layout part 3-4 and Reflection due: ~~Today, April 23~~ Tomorrow, April 24 @ 10:00pm
-  - Lock: Saturday, April 25 @ 10:00pm (If you are using late days)
-
-- No peer evaluation for this assignment
-
-- Accessibility assignment out: Yesterday, April 22 - due: Next Thursday, April 30
-
-<!--
-
-# Reflection
-
-- Include a screen shot of the interface you are emulating in your reflection
-
-- Include a screenshot of the result of your implementation in your reflection
-
-- Also include your diagram of the interactor hierarchy and the corresponding interface.
-
-- Tell us: What did you learn from doing Part 4?
-
-- Tell us: Was there anything that was surprisingly easy or hard? -->
-
----
-# Section 4 Objectives
-
-- Get ready for Accessibity Assignment
-- What is Alt Text?
-- Accesibity in designing technology
-- Discussion: What does inclusion mean to you?
-
-
----
-
-# Get ready for Accessibity Assignment
-
-- Install Accessibility Scanner on Emulator (through Google Play)
-  - https://play.google.com/store/apps/details?id=com.google.android.apps.accessibility.auditor&hl=en_US
-
----
-
-# Alt Text
-
-- What is alt text, and why is it important?
-
-- Adding Accessibility Features to Apps for Blind and Visually-Impaired Users: https://youtu.be/1by5J7c5Vz4
-- Introduction to Alternative Text: https://webaim.org/techniques/alttext/#intro
-
----
-
-.title-slide-logo[
-  ![Exmaple photo of Purple flowers with a fuzzy center surrounded by green leaves](img/flower.png)
-]
-
----
-
-## Bad alt text:
-
-- This picture of flowers was taken at the Chihuly Glass Gardens
-
-## Better alt text:
-
-- Purple flowers with a fuzzy center surrounded by green leaves
-
----
-
-# Who can alt text help? 
-
-- Not only visually impaired individuals!
-
----
-
-# Are the captions we used in the lectures enough? 
-
-- Why?
-
----
-
-.left-column-half[
-# ASL Gloves
-
-- Why are technologies like this harmful?
-
-- You could build bias into technology if you are not careful
-
-]
-
-.right-column-half[
-![:img These “SignAloud” gloves developed by UW sophomores Navid Azodi and Thomas Pryor translate American Sign Language into speech and text, 90%](img/asl_gloves.png)
-]
-
----
-
-# What does inclusion mean to you?
diff --git a/slides/l04/agenda.txt b/slides/l04/agenda.txt
deleted file mode 100644
index 76f136a1a969625bd527f42c7144e567dc3b5c16..0000000000000000000000000000000000000000
--- a/slides/l04/agenda.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-- reminder for layout assignment
-- timeline
-- layout reflection (10 mins)
-
-- alt text  (10 mins)
-- what is alt text, and why is it important?
-- who can screen reader help?
-
-- brain storm: other than alt text, what we can do for other disabilities? for example, deaf   (5-10 mins)
--- caption: help non-native speakers
--- captions in this class - not enough. why?
-- please do not call us "hearing impaired" (brifly explain my identity. since they call blind "visual impaired")
-- disabilities varies (i am deaf, and i dont represent blind people, i dont represent the D community)
-
-- some mindsets i have noticed in HCI:   (10 mins)
--- asl glove (why does it hurt the community?)
--- how to be an "ally" (please, dont say its my job to fight. Fight with me if you consider yourself an ally)
-
-- what does "inclusion" mean?   (10 mins)
--- it mean view us as who we are
-- technology shows a mindset. And the mindset is the core. Thus, you are not only learning the technology in this class. We want you to learn the mindset as well.
-- you could build bias in technology if you are not careful
-- accessibility is always an inherent feature, not a nice addition, it should not be something you implement the last
-
-
-- ask prob questions and encourage students
-- divide groups
\ No newline at end of file
diff --git a/slides/l04/img/asl_gloves.png b/slides/l04/img/asl_gloves.png
deleted file mode 100644
index 15e1c51fe2af35f02817cf2df4afe182189eff1a..0000000000000000000000000000000000000000
Binary files a/slides/l04/img/asl_gloves.png and /dev/null differ
diff --git a/slides/l04/img/cover.jpg b/slides/l04/img/cover.jpg
deleted file mode 100644
index 0ab996615cbaba6c49d6ee41e20e0c02689a4d67..0000000000000000000000000000000000000000
Binary files a/slides/l04/img/cover.jpg and /dev/null differ
diff --git a/slides/l04/img/flower.png b/slides/l04/img/flower.png
deleted file mode 100644
index acd6bc12862d864b1bedcb114d79627d59de644d..0000000000000000000000000000000000000000
Binary files a/slides/l04/img/flower.png and /dev/null differ
diff --git a/slides/l05/img/eventDiagram.png b/slides/l05/img/eventDiagram.png
deleted file mode 100644
index 6a73ac5e20901d48a503f43375824925b58cb921..0000000000000000000000000000000000000000
Binary files a/slides/l05/img/eventDiagram.png and /dev/null differ
diff --git a/slides/l05/img/layout.png b/slides/l05/img/layout.png
deleted file mode 100644
index b6ff09630cff8240594e1550a96aa75bbd25f707..0000000000000000000000000000000000000000
Binary files a/slides/l05/img/layout.png and /dev/null differ
diff --git a/slides/l05/img/smq.png b/slides/l05/img/smq.png
deleted file mode 100644
index 66c0e1367260f1845bf068fe07aa5f6d5dbd959e..0000000000000000000000000000000000000000
Binary files a/slides/l05/img/smq.png and /dev/null differ
diff --git a/slides/l05/img/smrecap.png b/slides/l05/img/smrecap.png
deleted file mode 100644
index 9757ee308e1388fb9e687fa08d4c6d0df195c247..0000000000000000000000000000000000000000
Binary files a/slides/l05/img/smrecap.png and /dev/null differ
diff --git a/slides/l05/img/statemachine.png b/slides/l05/img/statemachine.png
deleted file mode 100644
index 2d0038d95b01e30c67f13a3f5daf3f7cd9d9239c..0000000000000000000000000000000000000000
Binary files a/slides/l05/img/statemachine.png and /dev/null differ
diff --git a/slides/l05/state.html b/slides/l05/state.html
deleted file mode 100644
index 41717d5e47c53952a73bc56303f92ebe1a5b5421..0000000000000000000000000000000000000000
--- a/slides/l05/state.html
+++ /dev/null
@@ -1,105 +0,0 @@
----
-layout: presentation
-title: Lab 5 Slides
-description: State Machine
-class: middle, center, inverse
----
-
-# CSE 340 Lab 5 (Spring 2020)
-## Week 5: State Machine
-
-.title-slide-logo[
-  ![State Machine Logo](img/statemachine.png)
-]
-
----
-# Timeline
-- Accessibility assignment due: Today, April 30 @ 10:00pm
-  - Lock: Saturday, May 2 @ 10:00pm (if you are using late days)
-
----
-# Section 5 Objectives
-
-- Understanding State Machine
-- Practice with PPS and State Machine
-  - Worksheet: https://tinyurl.com/340section5
-- Questions
-
----
-# State Machine 
-
-- State Machines are used to respond to incoming events and allows for us to store state between events.
-- Start state - indicated with incoming arrow
-- End state - indicated with double-layered shape
-- Transition States - indicated with single-layered shape
-- Event Arrows - indicated with an arrow between states, represent different actions taken up states.
-
-![:img State Machine Diagram Recap, 50%](img/smrecap.png)
-
----
-# Propositional Production System (PPS)
-
-- State machine is just the start, stop and interim states with arrows with nothing on them.
-- State machine with:
-  - ? (Boolean gates)
-  - action calls 
-  - extra conditions required to fire
-  on the arrows is called PPS.
-
-  ![:img State Machine Diagram Question, 50%](img/smq.png)
-
----
-# State Machine Practice
-Discussion: What is the behavior of this State Machine/PPS?
-
-![:img State Machine Diagram Question, 60%](img/smq.png)
-
----
-# Worksheet: State Machine Practice
-- Link: https://tinyurl.com/340section5
-
----
-# Worksheet Solutions
-
-Problem 1:
-
-1. updateThumbPosition()
-2. updateVolume()
-3. INSIDE
-4. EssentialGeometry.BAR
-5. updateThumbPosition()
-6. updateVolume()
-7. State.START
-8. updateThumbAlpha()
-
-
-Read more: [How to turn the PPS into code](https://courses.cs.washington.edu/courses/cse340/20sp/docs/pps)
-
-
----
-# Worksheet Solutions
-Problem 2:
-
-
-<div class="mermaid" style="font-size: 14pt">
-  graph TD
-  S((.)) --> A((Start))
-  A -- "DOWN:insideBar? updateButtonPosition(); 
-  updateButtonAlpha(); invokeScrollAction();
-  invalidate();" --> I((PRESSED))
-  A -- "DOWN:insideButton? updateButtonAlpha(); 
-  invokeScrollAction(); invalidate();" --> I((PRESSED))
-  I -- "UP:updateButtonAlpha(); invalidate();" --> E[End]
-  I -- "MOVE:updateButtonPosition(); invokeScrollAction(); invalidate();" --> I
-  
-  classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-  classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-  classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-  classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-  
-  class S invisible
-  class A start
-  class E finish
-  class I normal
-  
-  </div>
diff --git a/slides/l06/android-logo.png b/slides/l06/android-logo.png
deleted file mode 100644
index cebec75001ab25dc397065f193797d5ebd0cb38d..0000000000000000000000000000000000000000
Binary files a/slides/l06/android-logo.png and /dev/null differ
diff --git a/slides/l06/bundling.html b/slides/l06/bundling.html
deleted file mode 100644
index 02c58fd4310c4c0f0110991b2c6541cd19a927f6..0000000000000000000000000000000000000000
--- a/slides/l06/bundling.html
+++ /dev/null
@@ -1,122 +0,0 @@
----
-layout: presentation
-title: Lab 6 Slides
-description: Bundling
-class: middle, center, inverse
----
-
-# CSE 340 Lab 6 (Spring 2020)
-## Week 6: Bundles? Bundles!
-
-.title-slide-logo[
-  ![Android Logo](android-logo.png)
-]
-
----
-# Timeline
-- Color Picker and Reflection due: Next Monday, May 11 @ 10:00pm
-  - Lock: Wednesday, May 13 @ 10:00pm (if you are using late days)
-
-- Practice quiz for Accessibility and Color Picker will be out: this Friday, May 8
-  - Due: Next Wednesday, May 13 @ 10:00pm
-
-- **Reminder:** Please fill out this [form](https://docs.google.com/forms/d/e/1FAIpQLSdQrpZx-gexgDcKEF1SRp4egObimDP9qqVwLD56w0V2sYJDpw/viewform) by tomorrow night, so we can plan for our next assignment - Menus.
----
-# Section 6 Objectives
-
-- Solicit some anonymous feedback and questions
-- Bundles
-  - What're they?
-  - Why they're important
-  - How we use them (for the assignment and otherwise)
-- Questions and work time on Color Picker
-
----
-
-# Feedback
-
-Form link: https://forms.gle/A7BBRGQGvF6J1aJ1A
-- Any questions you have about assignment/ examlet
-- Any feedback you have on section
-  - What can we do better? What is going well? 
-  - We want this to be a good use of time for you.
-
----
-
-# Bundles: So you got lots of apps..
-
-And they all want to use _tons_ of memory, but they don't **need** that memory all the time.
-
-  - Android: You get no/minimal memory when you're not actively being used.
-  - Apps: But then how do we remember stuff when we are being used if we can't save it in memory
-  - Android: Use this `bundle`
-
-_(In truth the app could write/read its state to disk whenever it is being closed/opened but that is time consuming and would delay the OS launching new things)_
-
----
-
-# What is a Bundle?
-
-- First what happens when the user closes the application? Does it die?
-  - No!
-
-- Where does it go then?
-  - Think about it as **hibernation**
-  - All of it's memory is cleared, so all of your variables are _GONE_ 😲.
-  - **But** Android lets you save some variables to a `bundle` right before your memory is cleared, and gives you your `bundle` back when you get the memory space back.
-
-- What's in the bundle? 
-  - You decide, entirely up to the application developer (you).
-
-_(Your bundle is destroyed if the user force quits the app through multitasking, or if the phone is turned off. There is also a max size of the bundle and likely not something you will run into)_
-
----
-
-# Bundles & Code
-
-- Bundle management is occuring at the `activity` layer, not to be confused with any individual `view`.
-
-- When the user closes the app, right before it closes and its memory is cleared, Android invokes `onSaveInstanceState(Bundle outState)` on the activity, providing a reference to the activity for the app to save values into.
-
-- Then when the user opens the app again, Android invokes `onRestoreInstanceState(Bundle savedInstanceState)` returning the same bundle from earlier.
-
-- You can think of the `bundle` as a `Map<String, Object>` that only supports certain types of objects (they must be `Serializable` which includes all primitives and `String`)
-
-_(Read more [here](https://developer.android.com/topic/libraries/architecture/saving-states))_
-
----
-
-# Bundles: Code Example
-
-```java
-public abstract class MainActivity extends AppCompatActivity {
-
-  @Override
-  public void onSaveInstanceState(Bundle outState) {
-      super.onSaveInstanceState(outState);
-
-      outState.putString("OUR_KEY", "bundles? bundles!!!");
-  }
-
-  @Override
-  protected void onRestoreInstanceState(Bundle savedInstanceState) {
-      super.onRestoreInstanceState(savedInstanceState);
-      
-      String whatWeSaved = savedInstanceState.getString("OUR_KEY");
-      // whatWeSaved would contain "bundles? bundles!!!"
-  }
-}
-```
----
-# Discussion: Using Bundles in Color Picker 
-Not in this assignment but you could store the state of the Color Picker view directly into the bundle instead of storing the state of the application. 
-- Think about the model of the application
-- Think about the model of the color picker view/interactor
-- Is it better to store the state of the application or the view? 
-
----
-
-# Work time on Color Picker
-
-- Color-Angle conversion [hints](https://docs.google.com/document/d/1p97w2eoDe8hhmhDgE9fgkO5emimfKPy-eqGvzyaeUUQ/edit?usp=sharing)
-
diff --git a/slides/l07/img/callbacks2.png b/slides/l07/img/callbacks2.png
deleted file mode 100644
index 37eeff1f958d4f711faf7ce2af0ceb9736121957..0000000000000000000000000000000000000000
Binary files a/slides/l07/img/callbacks2.png and /dev/null differ
diff --git a/slides/l07/img/callbacks3.png b/slides/l07/img/callbacks3.png
deleted file mode 100644
index c7c5e1de7d5c73ca13b8e95df99735ce5aeec7fa..0000000000000000000000000000000000000000
Binary files a/slides/l07/img/callbacks3.png and /dev/null differ
diff --git a/slides/l07/img/listener.png b/slides/l07/img/listener.png
deleted file mode 100644
index 30ad3eea628489302baae48acddf0b7c59ecbbab..0000000000000000000000000000000000000000
Binary files a/slides/l07/img/listener.png and /dev/null differ
diff --git a/slides/l07/img/menus.png b/slides/l07/img/menus.png
deleted file mode 100644
index ae04e3b7be46c18e69c93a2b1eaa5a584d406f4f..0000000000000000000000000000000000000000
Binary files a/slides/l07/img/menus.png and /dev/null differ
diff --git a/slides/l07/img/menussm.png b/slides/l07/img/menussm.png
deleted file mode 100644
index 0baadcf1c31e35a4e89954c65ad3b42262832d21..0000000000000000000000000000000000000000
Binary files a/slides/l07/img/menussm.png and /dev/null differ
diff --git a/slides/l07/img/smrecap.png b/slides/l07/img/smrecap.png
deleted file mode 100644
index 9757ee308e1388fb9e687fa08d4c6d0df195c247..0000000000000000000000000000000000000000
Binary files a/slides/l07/img/smrecap.png and /dev/null differ
diff --git a/slides/l07/img/tips.png b/slides/l07/img/tips.png
deleted file mode 100644
index 6a7406ab1d2f992e5352885127fb7aa5ebe23ee3..0000000000000000000000000000000000000000
Binary files a/slides/l07/img/tips.png and /dev/null differ
diff --git a/slides/l07/img/translate.png b/slides/l07/img/translate.png
deleted file mode 100644
index 37fa3326c7b96cefe9e0d17c89c4fb45bf122030..0000000000000000000000000000000000000000
Binary files a/slides/l07/img/translate.png and /dev/null differ
diff --git a/slides/l07/menus-lab.html b/slides/l07/menus-lab.html
deleted file mode 100644
index 38438b5de4eafab0484bd7a515f23675c356cf69..0000000000000000000000000000000000000000
--- a/slides/l07/menus-lab.html
+++ /dev/null
@@ -1,166 +0,0 @@
----
-layout: presentation
-title: Lab 7 Slides
-description: Menus
-class: middle, center, inverse
----
-
-# CSE 340 Lab 7 (Spring 2020)
-## Week 7: Getting started with Menus
-
-
-
-.title-slide-logo[
-  ![:img Menu Types, 50%](img/menus.png)
-]
-
----
-
-# Menus Timeline
-
-- Programming part (Part 1-4) due: Next Wednesday, May 20 @ 10:00pm
-  - Lock: Friday, May 22 @ 10:00pm (if you are using late days)
-
-- Analysis part (Part 5-6: Report and Reflection) out: Wednesday, May 20
-  - Due: Monday, May 25 @ 10:00pm
-
-- **Examlet 3 is tomorrow!** Friday, May 15
-
----
-
-# Section 7 Objectives
-
-- Thank you for filling out the mid-quarter section feedback form!
-- Review key concepts for Menus assignment
-  - Translate
-  - Callbacks
-  - State machine ([Lab 5](https://courses.cs.washington.edu/courses/cse340/20sp/slides/l05/state.html#1))
-- Examlet review with Kahoot 
-- Work time on Menus assignment
-- Questions
-
----
-
-# Translate
-
-- Move origin (and everything else) in x and y
-![:img a large moon and a large moon moved to the right a few pixels, 15%](img/translate.png)
-   
-    ```java
-    translate(float dx, float dy)
-    ```
-- How do we use _translate_ in Menus?
----
-
-# Callbacks
-
-Callbacks handle application response to events
-  - Update Application Model
-    
-    ![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface and a do_action() call
-happening below the line in response to a button_pressed(), 45%](img/callbacks2.png)
-
-
----
-
-# Callbacks
-
-Callbacks handle application response to events
-  - Best implemented using custom listeners:
-    - Let you execute code when your view's model has changed
-    - No other way to know that has happened
-    
-    ![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface with do_action() replaced
-with an actionListener, 45%](img/callbacks3.png)
-
----
-# Example in ColorPicker
-
-We setup the Custom View side for you
-
-```java
-    // Currently registered ColorListener instance or null.
-    // A set of listener in Color picker vs. One listener in Menus
-    private List<ColorChangeListener> mColorChangeListeners;
-
-    // Class which defines a listener to be called when a new color is selected.
-    public interface ColorChangeListener {
-        void onColorSelected(@ColorInt int color);
-    }
-
-    // Registers a new listener
-    public final void addColorChangeListener(@NonNull ColorChangeListener colorChangeListener) {
-        mColorChangeListeners.add(colorChangeListener);
-    }
-```
----
-# Example in ColorPicker
-
-You implemented this
-.left-column-half[
-`// TODO: Register callback to update {color,label} View when color changed.`
-
-- What method do we call to register the callback?  
-  - `addColorChangeListener()`
-
-- What do we usually do in a callback? 
-  - update application (`MainActivity`) model
-]
-.right-column-half[
-![:img listener relationship diagram in color picker, 100%](img/listener.png)
-]
-
----
-# Custom Listener in Menus
-
-You need to do this yourself in Menus
-
-```java
-// TODO: register a new listener with the menu so that the application knows when a selection is made
-
-// TODO: implement the listener. When the user completes a trial, the menu listener should store
-// the results of the trial, and setup for the next trial
-```
-
-
----
-# Android Studio Tips
-
-- [Keyboard shortcuts](https://developer.android.com/studio/intro/keyboard-shortcuts)
-- Structure tab
-
-![:img android structure tab, 50%](img/tips.png)
-
-
-
----
-# Work time on Menus
-
-
-
-<div class="mermaid">
-  classDiagram
-  
-  class MenuExperimentView {
-    onTouchEvent()
-    startSelection()
-    endSelection()
-    updateModel()
-    onDraw()
-  }
-  
-  
-  AbstractMenuExperimentView <|-- MenuExperimentView
-  
-  AbstractMainActivity <|-- MainActivity
-  AbstractMainActivity <|-- TestActivity
-  MenuExperimentView <|-- PieMenuView
-  MenuExperimentView <|-- NormalMenuView
-  MenuExperimentView <|-- CustomMenuView
-  
-  
-  </div>
-
-
diff --git a/slides/l08/.gitkeep b/slides/l08/.gitkeep
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/slides/l08/menus-data.html b/slides/l08/menus-data.html
deleted file mode 100644
index 9fa2d81cd917c4b84a7b7e9d9ea498d77fd6a1dd..0000000000000000000000000000000000000000
--- a/slides/l08/menus-data.html
+++ /dev/null
@@ -1,78 +0,0 @@
----
-layout: presentation
-title: Lab 8 Slides
-description: Menus Data Analysis
-class: middle, center, inverse
----
-
-# CSE 340 Lab 8 (Spring 2020)
-## Week 8: Menus Data Analysis
-
-
-.title-slide-logo[
-  ![:img Data Analysis, 40%](menus_data.png)
-]
-
----
-
-# Menus Timeline
-
-- Programming part (Part 1-4) due: ~~yesterday~~ Today, Thursday, May 21 @ 10:00pm
-  - Lock: Friday, May 22 @ 10:00pm (if you are using late days)
-
-- Analysis part (Part 5-6: Report and Reflection) due: Monday, May 25 @ 10:00pm
-    - Lock: Wednesday, May 27 @ 10:00pm (if you are using late days)
----
-
-# Section 8 Objectives
-
-- Data analysis
-  - In-class demo
-- Remote testing
-- Menus help & questions
-
----
-
-# Data Analysis
-
-In-class demo
-
-- Getting Menus data from an Android device or Emulator ([instructions here](https://courses.cs.washington.edu/courses/cse340/20sp/docs/android_files/))
-
-- Working with data: [sample spreadsheet](https://docs.google.com/spreadsheets/d/1JqfKhHugIF-kebs_bVztCnkUe0CizXN8PU_Ar3kXtK4/edit#gid=1104722579)
-
-
----
-
-# Remote Testing
-
-1. Still looking for participants? Find your group members [here](https://docs.google.com/document/d/11nsEWs3TubV5Zy0zOIGguqZJohkS34uizIrDv-bgnYs/edit)
-  - You can ask us/the course staff too 😊
-2. Create an APK:  
-  - In your menu project in Android Studio, select the *Build -> Build Bundle(s)/APK(s) -> Build APK(s)*.
-  - When the *Build APK(s)* message popup appears in the lower right hand corner, click the *locate* link to find the `app-debug.apk`.
-3. Send a copy of the consent form (Word/Google Doc) to the participant
-4. Set up your phone call or video meeting
-  - Briefly explain the study
-  - Have the participant "sign" [this Google form](https://bit.ly/20sp-Menus-Consent) as written consent
-
----
-
-# Remote Testing (cont.)
-5\. Send your APK - Have the participant test your menus:
-- **Highly recommend** to create a shared Google folder/drive with your participant where:
-  - you upload your APK
-  - your participant can later upload their .csv data file 
-
-**Notes**:
-- Participants please make sure to `Clear Result CSV` prior testing and complete a full session
-- Developer please make sure you have 108 data points from each participant
-
-Read more: [Menus Spec](https://courses.cs.washington.edu/courses/cse340/20sp/assignments/menus#part-5-conduct-and-write-up-user-study)
-
-
----
-
-# Questions
-
-
diff --git a/slides/l08/menus_data.png b/slides/l08/menus_data.png
deleted file mode 100644
index e94e349ff2398ebc099de80f1ae9072e0fcd6395..0000000000000000000000000000000000000000
Binary files a/slides/l08/menus_data.png and /dev/null differ
diff --git a/slides/l09/img/abridged_undo_view_tree.png b/slides/l09/img/abridged_undo_view_tree.png
deleted file mode 100644
index deafa50f428c05705f4edb5c7ae21fc34edab58b..0000000000000000000000000000000000000000
Binary files a/slides/l09/img/abridged_undo_view_tree.png and /dev/null differ
diff --git a/slides/l09/img/draw-app.jpg b/slides/l09/img/draw-app.jpg
deleted file mode 100644
index 6cc42303aa32f5f7533bb42a2159ced7a96b27f9..0000000000000000000000000000000000000000
Binary files a/slides/l09/img/draw-app.jpg and /dev/null differ
diff --git a/slides/l09/outline.md b/slides/l09/outline.md
deleted file mode 100644
index cb33e127f340aa299b9a3cb1af3a067cab482d69..0000000000000000000000000000000000000000
--- a/slides/l09/outline.md
+++ /dev/null
@@ -1,13 +0,0 @@
-### lab outline
-
-- Intro
-  - Hi I'm Adam!
-  - Welcome to color picker
-  - you got emails for GitLab repos for assignment 3, clone them as we'll be working with them today
-- Visually introduce color picker (3min)
-- Talk through stub/spec (7min)
-  - Reminder of api references
-  - Radian math quick refresh
-- Convert unconstrained xy coords to a color (10min)
-- Work in small groups over examples of possible interaction flows, ask about potential outputs (2 + 5)
-- work on state machine implementation (23min)
diff --git a/slides/l09/undo-lab.html b/slides/l09/undo-lab.html
deleted file mode 100644
index d6cd5e3e832707f52d2d610e5ab07ac79ec5febd..0000000000000000000000000000000000000000
--- a/slides/l09/undo-lab.html
+++ /dev/null
@@ -1,250 +0,0 @@
----
-layout: presentation
-title: Lab 9 Slides
-description: Getting Started With Undo
-class: middle, center, inverse
----
-# CSE 340 Lab 9 (Spring 2020)
-## Week 9: Getting started with Undo
-
-.title-slide-logo[
-  ![:img Drawing App, 40%](img/draw-app.jpg)
-]
-
----
-# Undo Timeline
-
-- Programming part due: Next Monday, June 1 @ 10:00pm
-  - Lock: Wednesday, June 3 @ 10:00pm (if you are using late days)
-
-- Heuristic Evaluation due: Friday, June 5 @ 10:00pm
-- Reflection due: Monday, June 8 @ 10:00pm
-
-- **Examlet 4 is tomorrow!** Friday, May 29
-
----
-# Section 9 Objectives
-
-- Understanding Undo assignment
-- Examlet review with Kahoot
-- Work time/ Questions on Undo assignment
-
----
-# The Undo feature
-
-- Incredibly useful interaction technique
-
-- Reverts the application to an older state
-
-  - Mistakes can easily be undone
-
-  - *"Ugh...that was definitely not right, but manually erasing all this work is going to take forever"*
----
-# The Redo feature
-
-- Inverse to the Undo feature
-- "Undoes" an undo
-
-  - Work previously undone is reapplied
-
-  - *"Huh, maybe I made the right decision after all..."*
----
-# Codebase: Application
-.left-column60[
-- `ReversibleDrawingActivity`, class contains the entire interactor hierarchy
-  - Floating Action Buttons (FAB), buttons that allow for actions supported by AbstractReversibleDrawingActivity
-  - References DrawingView in AbstractDrawingActivity 
-
-- `AbstractReversibleDrawingActivity`, abstract class that extends AbstractDrawingActivity
-  - adds support for undo/redo
-  - includes buttons for undo/redo
-  - `doAction()`, `undo()`, `redo()`]
-
-.right-column30[
-<div class="mermaid">
-classDiagram
-
-AbstractDrawingActivity <|.. AbstractReversibleDrawingActivity
-AbstractReversibleDrawingActivity <|.. ReversibleDrawingActivity
-class AbstractDrawingActivity {
-  DrawingView: "Canvas the user draws on"
-  addMenu()
-  addCollapsableMenu()
-  doAction()
-}
-
-class AbstractReversibleDrawingActivity {
-  +AbstractStackHistory
-  +doAction()
-  +undo()
-  +redo()
-}
-
-class ReversibleDrawingActivity {
-  +onAction()
-  +onColorSelected()
-  +onThicknessSelected()
-}
-</div>]
-
----
-# Codebase: Application
-
-.left-column60[
-- `AbstractDrawingActivity` - abstract class for app that supports drawing without history
-
-  - Wrapper around a `DrawingView`
-
-  - `doAction()`
-
-  - Contains methods for adding menus and changing visibility]
-
-  .right-column30[
-  <div class="mermaid">
-  classDiagram
-  
-  AbstractDrawingActivity <|.. AbstractReversibleDrawingActivity
-  AbstractReversibleDrawingActivity <|.. ReversibleDrawingActivity
-  class AbstractDrawingActivity {
-    DrawingView: "Canvas the user draws on"
-    addMenu()
-    addCollapsableMenu()
-    doAction()
-  }
-  
-  class AbstractReversibleDrawingActivity {
-    +AbstractStackHistory
-    +doAction()
-    +undo()
-    +redo()
-  }
-  
-  class ReversibleDrawingActivity {
-    +onAction()
-    +onColorSelected()
-    +onThicknessSelected()
-  }
-  </div>]
----
-# Codebase: DrawingView
-.left-column-half[- `AbstractDrawingActivity` is a wrapper around a `DrawingView`
-  - Sets behavior for how strokes are drawn 
-
-- DrawingView, a drawing canvas that handles strokes
-  - Strokes are just `StrokeView`'s in the `DrawingView`
-  - `onTouchEvent()` implements a PPS that describes lifetime of a stroke being created]
-
-.right-column40[
-<div class="mermaid">
-  classDiagram
-  
-  class AbstractDrawingActivity {
-    DrawingView: "Canvas the user draws on"
-    addMenu()
-    addCollapsableMenu()
-    doAction()
-  }
-
-  class StrokeView {
-     Path
-     onDraw()
-  }
-  </div>
-]
----
-
-# Codebase: Actions
-.left-column-staff[
-- `AbstractAction` abstract class defines basic behavior any Action should have
-- `AbstractReversibleAction` abstract class defines interface for actions that can be undone
-- `doAction()` chain: `AbstractReversibleDrawingActivity.doAction()` âž¡`AbstractDrawingActivity.doAction()` âž¡`AbstractAction.doAction()`
-- `AbstractReversibleDrawingActivity`'s `undo()` and `redo()` call methods on `AbstractReversibleAction` to undo/redo]
-
-.right-column55[
-<div class="mermaid">
-  classDiagram
-  
-  AbstractAction <|.. AbstractReversibleAction
-  AbstractReversibleAction <|.. ChangeColorAction
-  AbstractReversibleAction <|.. ChangeThicknessAction
-  AbstractReversibleAction <|.. AbstractReversibleViewAction
-  AbstractReversibleViewAction <|.. StrokeAction
-  
-  class AbstractAction {
-    doAction()
-  }
-  class AbstractReversibleAction {
-    +boolean done
-    +undoAction
-  }
-  class AbstractReversibleViewAction  {
-    +invalidate
-  }
-  </div>
-]
-
----
-
-# Codebase: Actions
-.left-column-staff[
-- Actions:
-  - `ChangeColorAction`
-  - `ChangeThicknessAction`, implement for homework
-  - `StrokeAction`
-  - And more, create your own action!]
-
-.right-column55[
-<div class="mermaid">
-  classDiagram
-  
-  AbstractAction <|.. AbstractReversibleAction
-  AbstractReversibleAction <|.. ChangeColorAction
-  AbstractReversibleAction <|.. ChangeThicknessAction
-  AbstractReversibleAction <|.. AbstractReversibleViewAction
-  AbstractReversibleViewAction <|.. StrokeAction
-  
-  class AbstractAction {
-    doAction()
-  }
-  class AbstractReversibleAction {
-    +boolean done
-    +undoAction
-  }
-  class AbstractReversibleViewAction  {
-    +invalidate
-  }
-  </div>
-]
-
----
-
-# Codebase: History
-
-.left-column60[The `AbstractReversibleDrawingActivity` uses an StackHistory interface to manage the undo/redo history
-  - You will implement the concrete `StackHistory` which implements `AbstractStackHistory`  
-  - Think: What data structures are used? Why does this make sense?
-    - What happens to the redo history if you take a new action after undoing a couple times?
-    - What happens to the undo history if you redo an action?
-    - What happens to the redo history if you undo an action?]
-
-.right-column30[
-<div class="mermaid">
-  classDiagram
-  
-  AbstractStackHistory <|.. StackHistory
-  class AbstractStackHistory {
-    addAction(AbstractReversibleAction action)
-    undo()
-    redo()
-    canUndo()
-    canRedo()
-  }
-  
-  class StackHistory {
-     +capacity: "Max stack size"
-  }
-  
-  
-  </div>
-]
-
diff --git a/slides/l09/undo_exam_question.pdf b/slides/l09/undo_exam_question.pdf
deleted file mode 100644
index c739bea3b80736a3f299a8fe2818586cea2d853a..0000000000000000000000000000000000000000
Binary files a/slides/l09/undo_exam_question.pdf and /dev/null differ
diff --git a/slides/l09/undo_lab_notes.txt b/slides/l09/undo_lab_notes.txt
deleted file mode 100644
index 2f0debf2ecaf43158114a00571e79969f9313cc7..0000000000000000000000000000000000000000
--- a/slides/l09/undo_lab_notes.txt
+++ /dev/null
@@ -1,104 +0,0 @@
-Today we will spend lecture exploring and building an understanding of the
-Undo assignment.
-
-The Undo feature is an incredibly useful interaction technique. It allows the user
-to revert the application to an older state, enabling mistakes to be easily undone.
-
-The Redo feature is also very useful, and is the inverse to the Undo feature.
-It "undoes" an undo. Work previously undone is reapplied.
-
-[DEMO]
-Let's begin by looking at the app in action. There are two different
-menus - one for changing the thickness of the drawn stroke and the other
-for changing the color of the drawn stroke. Changing the thickness, changing
-the color, or changing the stroke are the three types of actions the user can
-take, and the user can undo or redo any of these actions using buttons that
-only appear when they're relevant. Undo only appears when there is an action to
-undo, and redo only appears when there is an action to redo.
-
-[CODEBASE EXPLORATION]
-
-[ACTIVITY FILES]
-Let's dive into the codebase.
-
-The MainActivity in this app is a concrete implementation of the ReversibleDrawingActivity
-and in turn DrawingActivity abstract classes. Important methods include `onColorSelected()`
-and `onThicknessSelected()`
-
-DrawingActivity is an abstract class for an app that supports drawing without support for Undo or Redo.
-An important method to read is doAction().
-
-The ReversibleDrawingActivity extends DrawingActivity and adds support for undo/redo to it, 
-including both the undo/redo buttons and the history. Important methods to read
-include doAction(), undo(), and redo().
-
-The MainActivity class inherits from ReversibleDrawingActivity. It adds support for thickness
-and color to the undo/redo support in ReversibleDrawingActivity. It also adds menus to show 
-the thickness/color options. Important methods to read include onColorSelected() and onThicknessSelected().
-
-[DRAWING VIEW]
-The DrawingActivity is a wrapper around a DrawingView. The DrawingView sets the 
-behavior for how strokes are drawn. Strokes are just StrokeView objects drawn against
-the DrawingView. The onTouchEvent() should look 
-familiar. It implements a PPS that describes the lifetime of a stroke being created.
-
-There's a useful diagram that visualizes the code's structure. You should also look
-at the layout files. Chances are you'll want to update them to add new features. 
-
-[ACTIONS]
-
-We're building a drawing app. Whenever the user interacts with the app, he/she
-is taking some sort of Action. The Action abstract class defines the basic behavior
-any Action should have. The DrawingActivity's doAction() calls the doAction() implementation
- in Action's subclasses. 
-
-There's another abstract class called ReversibleAction that extends Action. This represents an action
-that is reversible. The ReversibleAction abstract class extends the Action abstract class 
-and adds an undoAction() method to undo the particular Action. 
-All three of the actions we've defined in the app are reversible. If for your extra feature you define a 
-new action, it may extend ReversibleAction, or it may just extend Action - it's up to you.
-
-The three actions we've defined are ChangeColorAction, ChangeThicknessAction, and StrokeAction.
-The ChangeColorAction, when applied, stores the DrawingView's Paint's old color and sets a new color.
-When undone, it sets the color on the DrawingView's paint to its previous color. 
-The ChangeThicknessAction does something similar, except it alters the thickness of the
-DrawingView's paint. The StrokeAction creates a StrokeView that represents the View of the
-stroke drawn and adds it to the DrawingView.
-
-[HISTORY]
-
-Your first goal with this assignment is to implement StackHistory. StackHistory extends the
-AbstractHistory abstract class. It is the fundamental data structure that will allow your
-users to undo and/or redo actions on the app, and it is used in the ReversibleDrawingActivity.
-
-[ADDITIONAL RESPONSIBILITIES]
-Your second goal with this assignment is to add a new FAB that adds a thickness 0 stroke.
-
-Your third goal with this assignment is to add an additional feature to the app. The simplest
-thing to do is to add a new FAB to one of the existing menus, like a FAB that allows you to draw 
-in a new color. If you want to challenge yourself, you could allow users to use your ColorPicker wheel
-to select a color or allow a user to change a stroke location.
-
-That was a lot. I'm actually going to help you out and show you how to add one of the
-additional features, but before I get to that - any questions?
-
-[ADDING COLOR FAB]
-
-I'm going to show you how to add a Color FAB. This is one of your options for additional
-features. It's also very similar to adding the Thickness 0 FAB.
-
-The first thing I'm going to do is go to color_menu.xml, because I know this
-is the layout file that contains all the color FABs. I'm just going to copy
-and paste one of the other color FABs. Then I'm going to update it's id, contentDescription,
-and backgroundTint attributes. 
-
-To be consistent with the style here, I'm going to define the string for the contentDescription
-in the strings.xml file.
-
-Next I'm going to look at MainActivity because I know that's the class that adds
-the color and thickness buttons. I noticed that the other color buttons are stored 
-in COLOR_MENU_ITEMS array. I add my grey FAB to the array. addCollapsableMenu adds
-the button and sets its on click listener automatically, so you don't have to worry 
-about it showing up correctly on your app or registering a listener. All you have to
-do now is go to onColorSelected, which is the listener function for the color buttons.
-I add my own case for the grey fab, do a ChangeColorAction, and I'm done.
\ No newline at end of file
diff --git a/slides/l10/10-heuristic-1.png b/slides/l10/10-heuristic-1.png
deleted file mode 100644
index fb0ccf3ae0d1ab2153ac19709c2ed58797225d7d..0000000000000000000000000000000000000000
Binary files a/slides/l10/10-heuristic-1.png and /dev/null differ
diff --git a/slides/l10/10-heuristic-2.png b/slides/l10/10-heuristic-2.png
deleted file mode 100644
index fe13cfe4b255e278e7089fad3912a3e59a2f41ad..0000000000000000000000000000000000000000
Binary files a/slides/l10/10-heuristic-2.png and /dev/null differ
diff --git a/slides/l10/10-heuristic.png b/slides/l10/10-heuristic.png
deleted file mode 100644
index 30d63b8b69588d725642697ec7196b52e6befd71..0000000000000000000000000000000000000000
Binary files a/slides/l10/10-heuristic.png and /dev/null differ
diff --git a/slides/l10/lab-heuristic.html b/slides/l10/lab-heuristic.html
deleted file mode 100644
index 90f246e614d237015e11a5008e69baee68d55f49..0000000000000000000000000000000000000000
--- a/slides/l10/lab-heuristic.html
+++ /dev/null
@@ -1,73 +0,0 @@
----
-layout: presentation
-title: Lab 10 Slides
-description: Getting started with Heuristic Evaluation
-class: middle, center, inverse
----
-# CSE 340 Lab 10 (Spring 2020)
-## Week 10: Heuristic Evaluation
-
-.title-slide-logo[
-  ![:img 10 Heuristic Evaluation Principles, 45%](10-heuristic.png)
-]
----
-
-# Undo Timeline
-
-- Heuristic Evaluation due: Friday, June 5 @ 10:00pm
-
-- Report and Reflection due: Monday, June 8 @ 10:00pm
-
----
-
-# Section 10 Objectives
-
-- Heuristic Evaluation instruction
-
-- CSE 340 Farawell Kahoot
-
-- Questions/Feedback
-
-
----
-
-## Heuristic Evaluation
-
-- You should have received an email with the [survey link](https://docs.google.com/forms/d/e/1FAIpQLScDe9k5bOKFikyh4ai32ih1e8waMD4SMECAjZK3yRVl1u-eDQ/viewform) and videos
-
-- We will complete a heuristic evaluation on one submission in section today
-    - You must complete the remaining 3 evaluations by the due date
-
-- What should you do?
-
-    - Two passes through the interface: one to inspect flow, another to inspect each screen against heuristics
-    - For each video, submit 3 things: At least two should be bad issues, one can be good.
-    - Write a Usability Action Report ([template](https://courses.cs.washington.edu/courses/cse340/20sp/assignments/undo-report) provided)
----
-
-![:img 10 Heuristic Evaluation Principles, 60%](10-heuristic-1.png)
-
-- **H1. Visibility of system status** -- Are users informed about what is going on in the app?
-
-- **H2: Match between the system and the real world** -- Does the app use concepts, language, and conventions that would be familiar to users?
-
-- **H3: User control and freedom** -- Does it allow users to do what they want to?
-
-- **H4: Consistency and standards** -- Does the app use the same conventions in all its components? Is it consistent with other apps on the same platform?
-
-- **H5: Error prevention** -- Is the app defensive? Does it have a design that protects users from making mistakes?
-
----
-
-![:img 10 Heuristic Evaluation Principles, 60%](10-heuristic-2.png)
-
-
-- **H6: Recognition rather than recall** -- Are the objects/actions/options of the app easily accessible to newcomers, or do they require memory?
-
-- **H7: Flexibility and efficiency of use** -- Can users customize the app to their needs?
-
-- **H8: Aesthetic and minimalist design** -- Is the app cluttered? Does it contain only relevant components?
-
-- **H9: Help users recognize, diagnose, and recover from errors** -- When users run into any problem, will it be easy for them to fix it?
-
-- **H10: Help and documentation** -- Is help easy to find and navigate? Is the information given even helpful?
diff --git a/slides/unused/3dmodeling.html b/slides/unused/3dmodeling.html
deleted file mode 100644
index 0bb6b2e4aa3487f77eedff6336861cd55b3306c1..0000000000000000000000000000000000000000
--- a/slides/unused/3dmodeling.html
+++ /dev/null
@@ -1,149 +0,0 @@
----
-layout: presentation
-title: Basic Intro to 3D modeling
-description: Description of how to create a 3D model in OpenSCAD
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse-
----
-# Physical Computing
-
-Jennifer Mankoff
-
-CSE 340 Winter 2020
----
-layout:false
-
-[//]: # (Outline Slide)
-.title[Today's goals]
-.body[
-- Introduce OpenSCAD
-- Talk about elements of 3D modeling
-]
-
----
-.title[OpenSCAD: A language for 3D modeling]
-.body[
-[Beginner's
-tutorial](http://edutechwiki.unige.ch/en/OpenScad_beginners_tutorial)
-
-Comments and variables similar to what you are used to
-
-```
-//Name Tag - Customizable
-Name = "Jen Mankoff";
-Length = 90 ;
-c = 20;
-```
-]
----
-.title[OpenSCAD concepts: solids]
-.body[
-Primitive Solids such as `cube([2,3,4]);` make up your designs
-
-Also `sphere` `cylinder` `polyhedron` 
-]
----
-.title[OpenSCAD concepts: transformations]
-.body[
-Same as 2D transformations
-
-- `rotate([x,y,z]) [solid]`
-- `translate([x,y,z]) [solid]`
-- `mirror([x,y,z]) [solid]`
-- ...
-]
----
-.title[OpenSCAD concepts: CSG modeling]
-.body[
-- Union: `union() { [transformations/solids/etc] }` combines children
-- Difference: `difference() {}` subtracts everything from first child
-- Hull: `hull() {}` combines all the children within a convex hull 
-
-]
-
----
-.title[OpenSCAD concepts: 2G geometry + linear extrusion]
-.body[
-- `linear_extrude (height=XX)` and then define a polygon to extrude,
-  e.g., `polygon(points=[[0,0],[100,0],[0,100],[15,15],[65,15],[15,65]], paths=[[0,1,2],[3,4,5]]);`
-
-makes what? 
-]
---
-.body[
-![:img Picture of a triangle extruded to a depth of 16,30%](img/modeling/extruded-polygon.png)
-
-]
----
-.title[Other things to extrude]
-.body[
-
-- Can import a DXF file and extrude, just put this after `linear_extrude`: `import (file = "file.dxf");`
-
-- text: 
-
-```
-content = "Text rocks";
-font = "Liberation Sans";
-
-translate ([-30,0,0]) {
-   linear_extrude(height = 3) {
-       text(content, font = font, size = 10);
-     }
- }
-```
-]
----
-.title[Other features]
-.body[
-[Cheat sheet](http://www.openscad.org/cheatsheet/index.html)
-
-- `%` shows something transparently so you can find out what would
-  happen
-- `$fn` sets resolution (can speed things up by making this low during design)
-- Can create functions (`module name() {}` )
-- Can use for loops 
-- Can use [other peoples' libraries](https://github.com/mtu-most/most-scad-libraries)
-]
----
-.title[Let's try it]
-.body[
-- Open OpenSCAD
-- Before you begin modeling, go to View>>Show Axes. This will make it
-  easier to see where the parts of your model are being placed.
-- Click and drag to change viewing angle
-- Right click and drag to move origin
-
-
-]
----
-.title[sample program]
-.body[
-
-```
-//Name Tag
-Name = "Jen Mankoff";
-Length = 90 ;
-c = 20;
-
-linear_extrude(height = 5)
-translate([0, 5, 0])
-text(Name);
-
-difference(){
-    hull(){
-        cylinder(h=2,d=40);
-        translate([Length,0,0])
-        cylinder(h=2,d=40);
-    }
-    translate([Length,0,0])
-    cylinder(h=2,d=14);
-
-}
-```
-]
----
-# End of Deck
diff --git a/slides/unused/activity-events.html b/slides/unused/activity-events.html
deleted file mode 100644
index 81970bc95a0da05dd108ee195b871a3edbc6a69e..0000000000000000000000000000000000000000
--- a/slides/unused/activity-events.html
+++ /dev/null
@@ -1,40 +0,0 @@
----
-layout: presentation
-title: Background on how Activities Generate Events
-description: Activity state changes generate events. Here's how
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-template: inverse
-
-# Interaction Programming Lab (Spring 2019)
-## Activity State Change Event Handling
----
-layout: false
----
-
-## Activity.red[*]
-
-- Application component providing a screen for users to interact
-
---
-
-- Typically fills whole the screen (though it doesn't have to)
-
---
-<br><br>
-![:img Android Calculator App, 20%](img/android-calculator-example.png)
-![:img Android Contacts App, 20%](img/android-contacts-example.png)
-![:img Android Search App, 20%](img/android-search-example.png)
-<br>
-
---
-
-<br>
-.footnote[
- More on Activites: https://developer.android.com/guide/components/activities.html
-
-]
diff --git a/slides/unused/ar.html b/slides/unused/ar.html
deleted file mode 100644
index fe53f80ac6cfd3916a6d8d2fa0e9009bdd7eac09..0000000000000000000000000000000000000000
--- a/slides/unused/ar.html
+++ /dev/null
@@ -1,214 +0,0 @@
----
-layout: presentation
-title: Augmented Reality and your Phone
-description: Discussion of the future of mobile AR
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Augmented Reality and your Phone
-
-Jennifer Mankoff
-
-CSE 340 Spring 2019 
-Slides credit: Chauncey Frend, Indiana University
-.footnote[[Frend, Chauncey. ”Augmented Reality & the UITS Advanced Visualization Lab." 30 Sep 2016/28 Feb 2017. Digital Arts & Humanities Workshop Series. Scholars' Commons, Wells Library, Indiana University, Bloomington.](http://hdl.handle.net/2022/21293)
-]
-
----
-layout: false
-
-.title[What is Augmented Reality?]
-
-.body[
-![:img Continuum, 100%](img/ar/arvr.png)
-]
-.footnote[
-Milgram, Paul, et al. "Augmented reality: A class of displays on the reality-virtuality continuum." Photonics for industrial applications. International Society for Optics and Photonics, 1995.
-[Photo
-Source](http://smartideasblog.trekk.com/augmented-or-virtual-how-do-you-like-your-reality)
-]
----
-.left-column[
-##        What is AR?
-
-A combination of 
-- a real scene viewed by a user and 
-- a virtual scene generated by a computer that augments the scene with
-  additional information.
-  ]
-.right-column[
-![:img eg, 60%](img/ar/areg.png)
-
-]
-???
-Differences to VR?
-Augmented Reality
-- System augments the real world scene
-- User maintains a sense of presence in real world
-- Needs a mechanism to combine virtual and real worlds
-- Hard to register real and virtual
-
----
-.left-column50[
-## Brief History
-
-- 1901 Lyman Frank Baum  author of “The Master Key” imagines a kind of AR.
-- 1968 Ivan Sutherland invents first head-mounted display “Sword-of-Damocles” at University of Utah.
-- 1999 ARToolkit was created by Hirokazu Kato at HITLab
-- 2010 Vuforia for AR Mobile Apps was released by Qualcomm.
-- 2013 Google announces Google Glass.
-- 2015 Microsoft announces the HoloLens.
-- 2016 Niantic released Pokémon Go.
-]
-.right-column50[
-![:img History, 100%](img/ar/arhistory.png)
-]
----
-.title[AR Coloring Book]
-.body[
-![:youtube AR Coloring Book Video, SWzurBQ81CM]
-0:00-0:30
-]
-
----
-.title[AR Climbing Wall]
-.body[
-![:youtube AR Climbing Wall, rjWcE25s7kQ]
-0:00-0:33
-]
-
----
-.title[AR 3D Assembly]
-.body[
-![:youtube AR 3D Assembly, CONY3q3OdPA]
-
-0:00-0:33
-
-[Similar example in medical domain](https://www.youtube.com/watch?v=MS3h9_KPoBY&feature=youtu.be)
-]
-
----
-.title[AR in Retail]
-.body[
-![:img Ikea, 100%](img/ar/ikea.png)
-]
-
----
-.title[AR in Tourism]
-.body[
-![:img Disney, 100%](img/ar/disney.png)
-]
-
----
-.title[Human/robot Interaction]
-.body[
-
-![:youtube HRI, mSCrviBGTeQ]
-
-Time: 2:15
-
-]
----
-.left-column[
-## Building AR experiences]
-.right-column[
-ASSETS
-
-Display
-
-Interface
-]
----
-.left-column[
-## Building AR experiences: ASSETS]
-.right-column[
-Sources?
- - 3D Scanning
- - Photogrammetry
- - 3D Authoring
- - 3D Repositories
-  - e.g. Smithsonian X 3D https://3d.si.edu/browser
-  - e.g. Thingiverse
-]
-???
-Other media? 
----
-.left-column[
-## Building AR experiences: Display Hardware]
-.right-column[
-
-![:img Hololens, 50%](img/ar/hololens.png)
-![:img Phone, 25%](img/ar/mobile.png)
-
-Requirements?
-]
-???
-Camera
-Display
-...
-
----
-.left-column[
-## Building AR experiences: Interface]
-.right-column[
-![:youtube Pokemon Go, vgfZbgwrbx8]
-
-- 4:00-7:20 
-
-
-]
-.footnote[https://www.geekwire.com/2018/pokemon-go-evolved-remain-popular-initial-craze-cooled/]
-???
-Discussion of interface needs
----
-.left-column[
-## Combining real and virtual
- 
-Registering assets with the scene
-
-Tracking objects
-]
-.right-column[
-![:img registration, 50%](img/ar/objectplace.png)
-]
-???
-1st picture - real world
-
-2nd picture - real world with virtual objects and inter-reflections and virtual 
-	shading
----
-.title[Difficult!]
-.body[
-
-Requires objects to behave in physically plausible manners when manipulated
-- Occlusion
-- Collision detection
-- Shadows
-
-AR systems sensitive to visual errors - virtual object may not be stationary in the
-	real scene or it may be in the wrong place.
-
-Time delays lead to augmented image lagging behind motions in the real scene.
-
-]
-???
-Failures in registration due to:
-Noise
-Position and pose of camera with respect to the real scene
-Image distortions
-Time delays
-In calculating the camera position
-
-
-
----
-.title[Some tools]
-.body[
-- Unity (Basic package)
-- [Vuforia (AR
-  Plugin)](https://medium.com/quick-code/top-tutorials-to-learn-vuforia-to-develop-ar-applications-274eedc2b18f)
-  
-]
diff --git a/slides/unused/ar/areg.png b/slides/unused/ar/areg.png
deleted file mode 100644
index 70b9195a640946c8b4ec22aaf79ae5f431f8c933..0000000000000000000000000000000000000000
Binary files a/slides/unused/ar/areg.png and /dev/null differ
diff --git a/slides/unused/ar/arhistory.png b/slides/unused/ar/arhistory.png
deleted file mode 100644
index 550d9f858b52ecbf1502d503e69f632d16297950..0000000000000000000000000000000000000000
Binary files a/slides/unused/ar/arhistory.png and /dev/null differ
diff --git a/slides/unused/ar/arvr.png b/slides/unused/ar/arvr.png
deleted file mode 100644
index de518a47a6de4fb5c7f0b03fda00b08e118cc95a..0000000000000000000000000000000000000000
Binary files a/slides/unused/ar/arvr.png and /dev/null differ
diff --git a/slides/unused/ar/disney.png b/slides/unused/ar/disney.png
deleted file mode 100644
index 5e648a272f580502a65d94ccf9767fbae62a2f3f..0000000000000000000000000000000000000000
Binary files a/slides/unused/ar/disney.png and /dev/null differ
diff --git a/slides/unused/ar/hololens.png b/slides/unused/ar/hololens.png
deleted file mode 100644
index bbb80f5d644bf7208c14aeacb047b7a7487dfaf8..0000000000000000000000000000000000000000
Binary files a/slides/unused/ar/hololens.png and /dev/null differ
diff --git a/slides/unused/ar/ikea.png b/slides/unused/ar/ikea.png
deleted file mode 100644
index 581b9ca6b395866451e7515eeb86ed0a6d5ce560..0000000000000000000000000000000000000000
Binary files a/slides/unused/ar/ikea.png and /dev/null differ
diff --git a/slides/unused/ar/mobile.png b/slides/unused/ar/mobile.png
deleted file mode 100644
index bde11ccf0af95bc7ea20eb3d16b2a239f7445a77..0000000000000000000000000000000000000000
Binary files a/slides/unused/ar/mobile.png and /dev/null differ
diff --git a/slides/unused/ar/objectplace.png b/slides/unused/ar/objectplace.png
deleted file mode 100644
index 4f5dbe56678158c3c657ed14c73a772c1daf4a56..0000000000000000000000000000000000000000
Binary files a/slides/unused/ar/objectplace.png and /dev/null differ
diff --git a/slides/unused/cartoon2.png b/slides/unused/cartoon2.png
deleted file mode 100644
index 44d9f443c8702ee6e65fec7b12378c8c9545ce27..0000000000000000000000000000000000000000
Binary files a/slides/unused/cartoon2.png and /dev/null differ
diff --git a/slides/unused/dev-demo.html b/slides/unused/dev-demo.html
deleted file mode 100644
index ff90862930ac559bd82463d2db65cafa80252eb2..0000000000000000000000000000000000000000
--- a/slides/unused/dev-demo.html
+++ /dev/null
@@ -1,121 +0,0 @@
----
-layout: presentation
-title: Hello World Slides--Week 1, Lab-- 
-description: Lab project--Hello World--
-class: middle, center, inverse
----
-
-# SSUI Mobile Lab (Spring 2020)
-## Week 1: Development Environment Setup
-
-.title-slide-logo[
-  ![:img Android Logo, 100%](img/android-logo.png)
-]
-
----
-
-# Overview
-- ## Android Studio Installation
-
-- ## Android SDK Installation
-
-- ## Exercise: Hello World
----
-
-layout: false
-## Development Environment Setup
-
---
-
-- Download + Install
-
-  - __Android Studio__:  
-    https://developer.android.com/studio/index.html
---
-
-  - __Genymotion Android Emulator__ *(Optional)* :   https://www.genymotion.com/thank-you-freemium/
---
-
-- Android Set-up
---
-  - Open Android Studio
-
----
-
-template: inverse
-## Android Studio Walk-through
-
----
-
-### Starting Android an Android Project
-![:img Select `Start a new Android Studio Project`, 70%](img/lab-00-hello-01.png)
-
----
-
-### Project Configuration
-
-![:img Project Configuration, 70%](img/lab-00-hello-02.png)
-
----
-
-### Targeting Android Devices
-
-![:img Targeting Android Devices, 70%](img/lab-00-hello-03.png)
-
----
-
-### Adding an Activity
-
-![:img Adding an Activity, 70%](img/lab-00-hello-04.png)
----  
-
-### Customizing the Activity
-
-![:img Customizing the Activity, 70%](img/lab-00-hello-05.png)
-
----
-
-### Viewing your Activity's Code
-
-  ![:img Viewing your Activity's Code, 70%](img/lab-00-hello-06.png)
-
----
-
-### Running your Application
-  ![:img Running your Application, 70%](img/lab-00-hello-07.png)
-
-
----
-### Selecting a Deployment Target
-  ![:img Selecting a Deployment Target, 70%](img/lab-00-hello-08.png)
-
----
-### Configuring a Virtual Device (Install Marshmallow)
-  ![:img Install Marshmallow, 70%](img/lab-00-hello-09.png)
-
-
----
-### Let the Installer Run (Grab some Coffee)
-  ![:img Let the Installer Run - Grab some Coffee, 70%](img/lab-00-hello-10.png)
-
-
----
-### Configuring a Virtual Device - Select a Phone
-  ![:img Configuring a Virtual Device - Select a Phone, 70%](img/lab-00-hello-11.png)
-
-
----
-### Configuring a Virtual Device - Naming your Device
-  ![:img Configuring a Virtual Device - Naming your Device, 70%](img/lab-00-hello-12.png)
-
-
----
-
-### Selecting a Deployment Target
-  ![:img Selecting a Deployment Target, 70%](img/lab-00-hello-13.png)
-
-
----
-### Start your Application!
-  ![:img Start your Application, 70%](img/lab-00-hello-14.png)
-
diff --git a/slides/unused/final-exam-review.html b/slides/unused/final-exam-review.html
deleted file mode 100644
index c1f6509f21a203f963c7763427d3cf8b3ea77bd0..0000000000000000000000000000000000000000
--- a/slides/unused/final-exam-review.html
+++ /dev/null
@@ -1,113 +0,0 @@
----
-# Example long answer question
-
-##Which is better and which laws explain it?
-
-| #A | #B | 
-|--|--|
-|![:img Picture of the Graffiti gesture recognition alphabet from the Palm Pilot, 50%](img/whole/Grafitti.png)|.right-column50[![:img Picture of the Edgewrite gesture recognition alphabet, 100%](img/whole/Edgewrite.png)]|
-
---
-- Fitts Law ( distance and sized;  expert errorless behavor)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (expert behavior)
-- Gestalt Psychology (will they see it at all?)
-- **Errors (will they be reduced)**
-
----
-.left-column-half[
-# Fitts Law
-
-![:img Picture of graph of fitts law data collected when I did the
-experiment. Y axis is time and x is index of difficulty. It's fairly
-noisy because fitts law is designed to measure multiple
-people. However it does fit a line., 80%](img/whole/timeoverid.png)
-
-Fitts' law only applies to *error-free, expert* behavior
-]
-.right-column-half[
-.jax[$$MT = a + b*log_2({Dist \over Size} + 1)$$
-]
-
-where
-- *MT* is movement time
-- *ID/MT* is the *Throughput* of a device in bits/second
-- *a* and *b* are empirically derived constants 
-- ID is the *Index of Difficulty* (ID, in bits) of a movement
-.jax[$$log_2({Dist \over Size} + 1)$$]
-
-
-]
-???
-This is just a line
-
-Fitts’ law tells us about difficulty for pointing and selection tasks
-- Time to move the hand depends only on relative precision required
-- MT increases as __distance__ from target increases
-- MT decreases as __size__ of target increases
-- Diagram this
-
-Fitts' law only applies to expert behavior
-
----
-.title[Design tips derived from motor principals]
-.body[
-Design Tip #1: Make small targets larger
-
-Design Tip #2: Put commonly used things close together
-
-Design Tip #3: Make use of Edges: They are Infinite
-
-Design Tip #4: Use pie menus instead of context menus for expert tasks
-
-Design Tip #5: Use snapping to minimize distance<br> when likely
-targets are known
-
-Design Tip #6: Separate Motor Size from Visible Size
-
-]
----
-.title[Use of two handed input]
-.body[
-
-2 Handed input principles
-- Non preferred leads
-- Sets frame of reference
-- Preferred does fine movement
-]
---
-.title[Lenses]
-.body[
-Use: Display hidden, context-specific interaction
-
-Implementation
-]
----
-.title[Study design]
-.body[
-Know your terms (participant, session, trial, condition)
-
-Know the important information about ethics
-- Beneficence -->
- - Value of research higher than risks
- - Do no harm
-- Respect for Persons -->
- - Fully informed of intent and purpose
- - Informed consent
- - May opt out at any time, for any reason
-- Justice
- - equitable, representative selection of participants
-]
-
----
-.title[Study Analysis]
-.body[
-
-Basic statistics: Max, Min, Mean, Mode
-
-Bar chart: Compares conditions (means)
-
-Histogram: Shows number of results in each part of a range (distribution)
-
-Correlation != Causation
-]
diff --git a/slides/unused/img/Edgewrite2.png b/slides/unused/img/Edgewrite2.png
deleted file mode 100644
index d667210ad2a378b2158d5ed08c97edb01efec834..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/Edgewrite2.png and /dev/null differ
diff --git a/slides/unused/img/Grafitti2.png b/slides/unused/img/Grafitti2.png
deleted file mode 100644
index af6a460e7db587130d59a195b06160ceadbbef9d..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/Grafitti2.png and /dev/null differ
diff --git a/slides/unused/img/akkarh.jpg b/slides/unused/img/akkarh.jpg
deleted file mode 100644
index 9ea23e5b7e5f4cc5603d8323973622dceb5b3033..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/akkarh.jpg and /dev/null differ
diff --git a/slides/unused/img/amber.png b/slides/unused/img/amber.png
deleted file mode 100644
index dc1ee2f038baeef5c20a0ccc3d8a1c0f8dd94774..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/amber.png and /dev/null differ
diff --git a/slides/unused/img/android-calculator-example.png b/slides/unused/img/android-calculator-example.png
deleted file mode 100755
index f5921e2da2941d95e3d6eafc39fade76ec14c266..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/android-calculator-example.png and /dev/null differ
diff --git a/slides/unused/img/android-contacts-example.png b/slides/unused/img/android-contacts-example.png
deleted file mode 100755
index 86239c1cdfab7abde795a4d01567cede0dd7accd..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/android-contacts-example.png and /dev/null differ
diff --git a/slides/unused/img/android-logo.png b/slides/unused/img/android-logo.png
deleted file mode 100755
index cebec75001ab25dc397065f193797d5ebd0cb38d..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/android-logo.png and /dev/null differ
diff --git a/slides/unused/img/android-search-example.png b/slides/unused/img/android-search-example.png
deleted file mode 100755
index ba5e27882923910ebee1e758760360e943c670d8..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/android-search-example.png and /dev/null differ
diff --git a/slides/unused/img/animation.png b/slides/unused/img/animation.png
deleted file mode 100644
index ab4004c764f33b6a9e74806206a1262f835a17c2..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/animation.png and /dev/null differ
diff --git a/slides/unused/img/area.png b/slides/unused/img/area.png
deleted file mode 100644
index 09a62b05a8402bccfb0d2dd1d6d5e3fae53f00ff..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/area.png and /dev/null differ
diff --git a/slides/unused/img/ascent.png b/slides/unused/img/ascent.png
deleted file mode 100644
index bd3570da5f06b32335df6fe44627c6ed7b8b62e8..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/ascent.png and /dev/null differ
diff --git a/slides/unused/img/background-paper.png b/slides/unused/img/background-paper.png
deleted file mode 100644
index fab891a842afc9228f4eaa8098b56252c11a3398..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/background-paper.png and /dev/null differ
diff --git a/slides/unused/img/bad-defaults.gif b/slides/unused/img/bad-defaults.gif
deleted file mode 100644
index e2a3c38c8184eb2a8468f6609171355e7da5dee4..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/bad-defaults.gif and /dev/null differ
diff --git a/slides/unused/img/buttons.png b/slides/unused/img/buttons.png
deleted file mode 100644
index 26675f540854d26ee061fb0f9f81a46d9766ca14..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/buttons.png and /dev/null differ
diff --git a/slides/unused/img/cartoon.png b/slides/unused/img/cartoon.png
deleted file mode 100644
index 5f76a447e8897a2b5a527df6f715c18dce15ed38..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/cartoon.png and /dev/null differ
diff --git a/slides/unused/img/colordodge-both.png b/slides/unused/img/colordodge-both.png
deleted file mode 100644
index fa80aafc9aa29f8f656020a8aa2bf175de96c88c..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/colordodge-both.png and /dev/null differ
diff --git a/slides/unused/img/colordodge-diagram.png b/slides/unused/img/colordodge-diagram.png
deleted file mode 100644
index ec409e17117c3e56ec8aa2826d5bafea6e3c87b7..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/colordodge-diagram.png and /dev/null differ
diff --git a/slides/unused/img/colormeter-highlights.png b/slides/unused/img/colormeter-highlights.png
deleted file mode 100644
index 4bf4ad68b9d61b7fcebf9dcc9c675fc456983e75..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/colormeter-highlights.png and /dev/null differ
diff --git a/slides/unused/img/combined2.png b/slides/unused/img/combined2.png
deleted file mode 100644
index c40330a24baefe21cc51e412404416ab7b0d9fe2..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/combined2.png and /dev/null differ
diff --git a/slides/unused/img/dest.png b/slides/unused/img/dest.png
deleted file mode 100644
index 89def8fa8bacee63b6568bdd908fafd714555d04..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/dest.png and /dev/null differ
diff --git a/slides/unused/img/destatop-diagram.png b/slides/unused/img/destatop-diagram.png
deleted file mode 100644
index 8de5e7f261e925749c8c0870569e32fddc64ae74..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/destatop-diagram.png and /dev/null differ
diff --git a/slides/unused/img/destatop.png b/slides/unused/img/destatop.png
deleted file mode 100644
index a2db0db76f516e56ff70d3a7bf8aa6c60b2884b0..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/destatop.png and /dev/null differ
diff --git a/slides/unused/img/diagram.png b/slides/unused/img/diagram.png
deleted file mode 100644
index 5437f18cc73929e005672147a1da65fa821abff5..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/diagram.png and /dev/null differ
diff --git a/slides/unused/img/diaz.png b/slides/unused/img/diaz.png
deleted file mode 100644
index 59c95dc4ecde1bc5b966fd09364892eb27a14418..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/diaz.png and /dev/null differ
diff --git a/slides/unused/img/download-projects.png b/slides/unused/img/download-projects.png
deleted file mode 100644
index 2c14bd2aafc9317983c230fd4af3ef1279707b0e..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/download-projects.png and /dev/null differ
diff --git a/slides/unused/img/drawing-interface.png b/slides/unused/img/drawing-interface.png
deleted file mode 100644
index 25ca6afba81ee996baa56de1ef507751b13cf107..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/drawing-interface.png and /dev/null differ
diff --git a/slides/unused/img/echeverra.png b/slides/unused/img/echeverra.png
deleted file mode 100644
index cd9317cfb4c036141df5d4299a7262863ffe7c9e..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/echeverra.png and /dev/null differ
diff --git a/slides/unused/img/ex1.png b/slides/unused/img/ex1.png
deleted file mode 100644
index 2900bc8d9e002acb4ef7d670c5036468a723fe74..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/ex1.png and /dev/null differ
diff --git a/slides/unused/img/ex2.png b/slides/unused/img/ex2.png
deleted file mode 100644
index 2b5f42516128abe09cb980dc36fc55c84fcba7bd..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/ex2.png and /dev/null differ
diff --git a/slides/unused/img/expanded.png b/slides/unused/img/expanded.png
deleted file mode 100644
index 4907f94f175c3c32c81aabd86688ca1157c5b013..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/expanded.png and /dev/null differ
diff --git a/slides/unused/img/gmail-snapping.gif b/slides/unused/img/gmail-snapping.gif
deleted file mode 100644
index 66a17084941a6d03ad02d2dfa7b62446ec755b1d..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/gmail-snapping.gif and /dev/null differ
diff --git a/slides/unused/img/goodviz.png b/slides/unused/img/goodviz.png
deleted file mode 100644
index b42f09a9f43ddc6d05dcd1c0e3e287da291c78a3..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/goodviz.png and /dev/null differ
diff --git a/slides/unused/img/hello-01.png b/slides/unused/img/hello-01.png
deleted file mode 100644
index 6c057df55e13c28a81228aa2fae3d0edf5cac700..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-01.png and /dev/null differ
diff --git a/slides/unused/img/hello-02.png b/slides/unused/img/hello-02.png
deleted file mode 100644
index b86dea59e9823022af4b81bef09fdfba55b89074..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-02.png and /dev/null differ
diff --git a/slides/unused/img/hello-03.png b/slides/unused/img/hello-03.png
deleted file mode 100644
index abe5ea1efe366c816202d3cefd4b0d6acacdbc2f..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-03.png and /dev/null differ
diff --git a/slides/unused/img/hello-04.png b/slides/unused/img/hello-04.png
deleted file mode 100644
index 6f97bb0cba2987998e50f8636db525c7079cb9e2..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-04.png and /dev/null differ
diff --git a/slides/unused/img/hello-06.png b/slides/unused/img/hello-06.png
deleted file mode 100644
index 170e81c7f423939618e0f2aa03125e3fad7c64c2..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-06.png and /dev/null differ
diff --git a/slides/unused/img/hello-07.png b/slides/unused/img/hello-07.png
deleted file mode 100644
index cb177cec3a40e92916564d2c41aad6be4f458238..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-07.png and /dev/null differ
diff --git a/slides/unused/img/hello-08.png b/slides/unused/img/hello-08.png
deleted file mode 100644
index 335d752558aef8183444ccdb34c9f59de9781895..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-08.png and /dev/null differ
diff --git a/slides/unused/img/hello-09.png b/slides/unused/img/hello-09.png
deleted file mode 100644
index 9c8722d48a4c63fe23597091479a5b6b441d3614..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-09.png and /dev/null differ
diff --git a/slides/unused/img/hello-10.png b/slides/unused/img/hello-10.png
deleted file mode 100644
index 880f6e86a28a16eede427735bc4a3b120a923bcd..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-10.png and /dev/null differ
diff --git a/slides/unused/img/hello-11.png b/slides/unused/img/hello-11.png
deleted file mode 100644
index cbb3f57b2bb8a8370f2add7d9bad0930ffb88b44..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-11.png and /dev/null differ
diff --git a/slides/unused/img/hello-12.png b/slides/unused/img/hello-12.png
deleted file mode 100644
index ba1580140041d190f4f459230234b9006f892d26..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-12.png and /dev/null differ
diff --git a/slides/unused/img/hello-13.png b/slides/unused/img/hello-13.png
deleted file mode 100644
index 93e377d4922b592f763057a4eb21019884b3016f..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-13.png and /dev/null differ
diff --git a/slides/unused/img/hello-14.png b/slides/unused/img/hello-14.png
deleted file mode 100644
index bf0f8d9f48d01391031e8ac57ebcc16ceffdd0e5..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/hello-14.png and /dev/null differ
diff --git a/slides/unused/img/history.png b/slides/unused/img/history.png
deleted file mode 100644
index 137e7e1cf9c1d15a26db157570135dcec876de84..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/history.png and /dev/null differ
diff --git a/slides/unused/img/input-example.gif b/slides/unused/img/input-example.gif
deleted file mode 100755
index 6aaadb863a3f3f120edd35cd05b6e507dfab7bbb..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/input-example.gif and /dev/null differ
diff --git a/slides/unused/img/linear.png b/slides/unused/img/linear.png
deleted file mode 100644
index 4b5b1fcd68a6d803cea91564521d2127a1018adf..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/linear.png and /dev/null differ
diff --git a/slides/unused/img/lorem-content.png b/slides/unused/img/lorem-content.png
deleted file mode 100644
index 6182fca44d5142386b8c5ad8546821e642cc96c4..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/lorem-content.png and /dev/null differ
diff --git a/slides/unused/img/meanchart.png b/slides/unused/img/meanchart.png
deleted file mode 100644
index 1a1d40eef2f2772506de97382338e6209ff904e7..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/meanchart.png and /dev/null differ
diff --git a/slides/unused/img/menu2.png b/slides/unused/img/menu2.png
deleted file mode 100644
index 355420f9062a0e8a0820a8910d1f563bb2df9703..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/menu2.png and /dev/null differ
diff --git a/slides/unused/img/messenger-bubble.gif b/slides/unused/img/messenger-bubble.gif
deleted file mode 100755
index 77defd497891e79a775a6ca3593cf33e02d2c890..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/messenger-bubble.gif and /dev/null differ
diff --git a/slides/unused/img/midterm/histogram.png b/slides/unused/img/midterm/histogram.png
deleted file mode 100644
index fc38781aa5657281643b358b01f25f7839f11df2..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/midterm/histogram.png and /dev/null differ
diff --git a/slides/unused/img/midterm/qs.png b/slides/unused/img/midterm/qs.png
deleted file mode 100644
index 90f6c7b5fb6d60cd832473aa12388b79cd0b32c0..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/midterm/qs.png and /dev/null differ
diff --git a/slides/unused/img/minimalist-app.png b/slides/unused/img/minimalist-app.png
deleted file mode 100644
index eb7b7a7cb0f47ff93eedf376ba0b4eb9c61ffe19..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/minimalist-app.png and /dev/null differ
diff --git a/slides/unused/img/modeling/extruded-polygon.png b/slides/unused/img/modeling/extruded-polygon.png
deleted file mode 100644
index 4e4502d0aa41d80333e032d005348aa05c7750d4..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/modeling/extruded-polygon.png and /dev/null differ
diff --git a/slides/unused/img/mvc.png b/slides/unused/img/mvc.png
deleted file mode 100644
index 15f6beea7a9cb9b94b00200db17b6ef4b9366307..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/mvc.png and /dev/null differ
diff --git a/slides/unused/img/p21-rettig.pdf b/slides/unused/img/p21-rettig.pdf
deleted file mode 100644
index 4b519982b782ecb9367304c831de8190db6dc27d..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/p21-rettig.pdf and /dev/null differ
diff --git a/slides/unused/img/p21-rettig.png b/slides/unused/img/p21-rettig.png
deleted file mode 100644
index cb5bc0b0c021dd5cd656314a8aa1071cf552511b..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/p21-rettig.png and /dev/null differ
diff --git a/slides/unused/img/palplates.png b/slides/unused/img/palplates.png
deleted file mode 100644
index ceb494c18ba7e5fdf03a9408d85c21269a2539e1..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/palplates.png and /dev/null differ
diff --git a/slides/unused/img/paper-prototype-example.jpg b/slides/unused/img/paper-prototype-example.jpg
deleted file mode 100755
index 804f888d1cc5f29981d291864c0b72e1df11751d..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/paper-prototype-example.jpg and /dev/null differ
diff --git a/slides/unused/img/paper.png b/slides/unused/img/paper.png
deleted file mode 100644
index a9ddd75d2abb12320c8b63a578985f5ddc42e0dc..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/paper.png and /dev/null differ
diff --git a/slides/unused/img/pie.png b/slides/unused/img/pie.png
deleted file mode 100644
index 19bb3cea94cceca2d283eceafb0f580812c433f4..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/pie.png and /dev/null differ
diff --git a/slides/unused/img/q2.png b/slides/unused/img/q2.png
deleted file mode 100644
index 1c7d316f8ea6be349057428ec713c53be8a36987..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/q2.png and /dev/null differ
diff --git a/slides/unused/img/red.png b/slides/unused/img/red.png
deleted file mode 100644
index 7dbe46c9c00ca3be4021c908e057dcd2738fdad5..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/red.png and /dev/null differ
diff --git a/slides/unused/img/redsat.png b/slides/unused/img/redsat.png
deleted file mode 100644
index e7d2519666e7434e6cd0558fde9b4ed18ef29bf1..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/redsat.png and /dev/null differ
diff --git a/slides/unused/img/redval.png b/slides/unused/img/redval.png
deleted file mode 100644
index 307cac41cdd5c32453b8eb984b193c5fdf42d8c3..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/redval.png and /dev/null differ
diff --git a/slides/unused/img/reference.png b/slides/unused/img/reference.png
deleted file mode 100644
index 378521989824e2f5e14c0c0964f88143e1c3e679..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/reference.png and /dev/null differ
diff --git a/slides/unused/img/reverse.png b/slides/unused/img/reverse.png
deleted file mode 100644
index b802283dba1c4ce186b23e2f2e81501dd126bb97..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/reverse.png and /dev/null differ
diff --git a/slides/unused/img/scrollbar-p2.png b/slides/unused/img/scrollbar-p2.png
deleted file mode 100644
index d77624497279e1529dd5b4c9e3440e657592f643..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/scrollbar-p2.png and /dev/null differ
diff --git a/slides/unused/img/scrollbar-p3.png b/slides/unused/img/scrollbar-p3.png
deleted file mode 100644
index aee4764b651e30f17952d8b6fcbe7b131a773dbb..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/scrollbar-p3.png and /dev/null differ
diff --git a/slides/unused/img/select-colors.png b/slides/unused/img/select-colors.png
deleted file mode 100644
index fe0aaec670e8e9070320f328b2ce1e343274689b..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/select-colors.png and /dev/null differ
diff --git a/slides/unused/img/select-shapes.png b/slides/unused/img/select-shapes.png
deleted file mode 100644
index 14c3341a45c65f2962d5995880ccb96e4960a187..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/select-shapes.png and /dev/null differ
diff --git a/slides/unused/img/sensing/aware-study.png b/slides/unused/img/sensing/aware-study.png
deleted file mode 100644
index f2f4fa24d33e4340774d383feeb610bcf9d03655..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/sensing/aware-study.png and /dev/null differ
diff --git a/slides/unused/img/sensing/aware_overview1.png b/slides/unused/img/sensing/aware_overview1.png
deleted file mode 100644
index e8c605485445b1d5d1cd0a38771b71814b976fd9..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/sensing/aware_overview1.png and /dev/null differ
diff --git a/slides/unused/img/sketch-styled.png b/slides/unused/img/sketch-styled.png
deleted file mode 100644
index b7280859cec521e6ae8bc5981904f00f187310d6..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/sketch-styled.png and /dev/null differ
diff --git a/slides/unused/img/snapping.gif b/slides/unused/img/snapping.gif
deleted file mode 100644
index e716fad939bd04ed7868a3376239cb412ceed2eb..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/snapping.gif and /dev/null differ
diff --git a/slides/unused/img/source.png b/slides/unused/img/source.png
deleted file mode 100644
index 05d2d1e4836a77cfd3b37501f0e364130790b5f9..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/source.png and /dev/null differ
diff --git a/slides/unused/img/spectrum.png b/slides/unused/img/spectrum.png
deleted file mode 100644
index c89c3b4fec26db2544598bf4e552fb843483b816..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/spectrum.png and /dev/null differ
diff --git a/slides/unused/img/static-interactive.png b/slides/unused/img/static-interactive.png
deleted file mode 100644
index 8080782000520e0199b0d574ad08ad3dc8d921fc..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/static-interactive.png and /dev/null differ
diff --git a/slides/unused/img/timeoverid.png b/slides/unused/img/timeoverid.png
deleted file mode 100644
index a633d97047b1974ec59e5811c2c768ebac148502..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/timeoverid.png and /dev/null differ
diff --git a/slides/unused/img/trueblue.png b/slides/unused/img/trueblue.png
deleted file mode 100644
index b318d002f47f0a680bfb96d6b867f48f6c572dd6..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/trueblue.png and /dev/null differ
diff --git a/slides/unused/img/visual-eg.png b/slides/unused/img/visual-eg.png
deleted file mode 100644
index 08029b57adb2d300013caf369af485ca7a3b5480..0000000000000000000000000000000000000000
Binary files a/slides/unused/img/visual-eg.png and /dev/null differ
diff --git a/slides/unused/l04-state.html b/slides/unused/l04-state.html
deleted file mode 100644
index 71a506b109bed2994b449d1bd5ff89866aae1b83..0000000000000000000000000000000000000000
--- a/slides/unused/l04-state.html
+++ /dev/null
@@ -1,376 +0,0 @@
----
-layout: presentation
-title: Lab 04 Saving State in Android --Week 4, Thursday--
-description: Introduction to state management in Android
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-template: inverse
-
-# Interactivity Lab (Fall 2018)
-## Week 3: State
-
-Instructor: TBD
-_{email}_
-
-Slides online: xxxTODO url
-
----
-layout: false
-
-# Goals for Today
-
----
-layout: false
-
-# Goals for Today
-
-- Understanding more about __Activities__
-- Learn about __State and Data Persistence__
----
-template: inverse
-
-# Saving State
----
-layout: false
-
-.left-column[## Activity Lifecycle]
-.right-column[![:img Android activity lifecycle, 50%](img/activity_lifecycle.png)]
-
-
----
-
-.left-column[## When to save state? (1/3)]
-.right-column[![:img Android activity state diagram, 50%](img/android-activity-states-01.png)]
-
-
----
-
-.left-column[## When to save state? (2/3)]
-.right-column[![:img Android activity state diagram -- process killed, 50%](img/android-activity-states-02.png)]
-
----
-
-.left-column[# When to save state? (3/3)]
-.right-column[
-- Activity `A` spawns Activity `B`
-  - E.g. Typing a Facebook post, then you select 'Add a Location'
-]
---
-.right-column[
-- Android kills `A` to reclaim resources while the user is interacting with `B`
-]
---
-.right-column[
-- User finishes with `B`, returns to `A` but the post is gone!
-]
----
-
-# Maintaining Activity State
-
-- We can fix it by saving the state in a `Bundle` before Android closes the `Activity`
-
-- We then restore the state when we return to the `Activity` later
-
----
-
-# Bundle it up
-
-- `Bundle`: A hash map (dictionary) of String keys to Primitive, Parcelable, Serializable values
-
---
-
-- Used to:
-  (1) Save/restore state
-  (2) Transfer data between different `Activity` in an app
-
---
-
-- Primitive are `int`, `float`, `boolean`, `double` (the usual suspects)
-
---
-
-- Custom objects that implement the `Serializable` or `Parcelable` interfaces
-  - You will need to make any custom classes that you want to save into a `Bundle` implement the `Parcelable` interface
-
----
-
-# Parcelable vs. Serializable
-
-- Both are for the same purpose of saving but `Serializable` makes implementations much easier...
-
---
-
-- **EXCEPT, .red[you should almost always use `Parcelable`]**
-
-
---
-
-- Why?
-  - `Serializable` uses introspection ==> more memory, and CPU cycles
-  - `Parcelable` **is optimized for mobile devices**
-
----
-## Implementing `Parcelable` (1/3)
-
--- You are required to implement the following methods for the `Parcelable` interface:
-
-```java
-public class MyPersonModel implements Parcelable {
-    private int mAge;
-
-    // Required for the interface
-    public int describeContents() {
-        return 0;
-    }
-
-    // Required for the interface
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeInt(mAge);
-    }
-    // Continued on next slide...
-```
-
----
-
-## Implementing `Parcelable` (2/3)
-
-```java
-
-    // Required for the interface
-    // CREATOR is an object that can remark
-    public static final Parcelable.Creator<MyPersonModel> CREATOR
-            = new Parcelable.Creator<MyPersonModel>() {
-        public MyPersonModel createFromParcel(Parcel in) {
-            return new MyPersonModel(in);
-        }
-
-        public MyPersonModel[] newArray(int size) {
-            return new MyPersonModel[size];
-        }
-    };
-
-    // Required for the interface
-    // Private constructor for Android to use with your CREATOR
-    private MyPersonModel(Parcel in) {
-        mAge = in.readInt();
-    }
-}
-```
----
-
-## Implementing `Parcelable` (3/3)
-- **Note**: .red[the order of the values when writing and reading them matters!]
-
-  - When you write to the parcel using `write*()` methods in `writeToParcel`,
-
-  - The write order __MUST BE__ the same as when you read them in the private constructor
-
-- For more details on implementation:
-  https://developer.android.com/reference/android/os/Parcelable.html
-
----
-
-# Saving in the Bundle
-
-- Methods for _saving_ items out of a Bundle
-
-  - Ints: `putInt(String key, int value)`
-
-  - Floats: `putFloat(String key, float value)`
-
-  - Characters: `putChar(String key, char value)`
-
-  - Strings: `putString(String key, String value)`
-
-  - Serializable Objects: `putSerializable(String key, Serializable value)`
-
-  - Parcelable Objects: `putParcelable(String key, Parcelable value)`
-
-  - _Others in the documentation (e.g. Arrays, Bytes, etc).._
-    https://developer.android.com/reference/android/os/Bundle.html
-
----
-# Retrieving from the Bundle
-
-- Methods for getting items out of a Bundle
-
-  - Ints: `getInt(String key)`
-
-  - Floats: `getFloat(String key)`
-
-  - Characters: `getChar(String key)`
-
-  - Strings: `getString(String key)`
-
-  - Serializable Objects: `getSerializable(String key)`
-
-  - Parcelable Objects: `getParcelable(String key)`
-
-  - _Others in the documentation_ (e.g. Arrays, Bytes, etc)..
-    https://developer.android.com/reference/android/os/Bundle.html
----
-## Saving Activity State (1/3)
-- Android provides the `onSaveInstanceState(Bundle savedInstanceState)` callback method for you to save the state of an `Activity`
-
-```java
-private static final USERNAME_KEY = "USER_NAME_KEY";
-private static final FIB_SUM_KEY = "FIB_SUM_KEY";
-
-private int mFibSumValue; // Set to 10295 by our user
-private String mUsername; // Set to "Michael" by our user
-
-@Override
-public void onSaveInstanceState(Bundle outState) {
-    // Always call super - your super classes could be saving state for you!
-    super.onSaveInstanceState(outState);
-
-    // Now
-    outState.putInt(FIB_SUM_KEY, mFibSumValue);
-    outState.putString(USERNAME_KEY, mUsername);
-}
-```
----
-
-## Restoring Activity State (1/4)
-
-- We saved, and now our user goes off to some other app
-
---
-
-- Android kills our `Activity`
-
---
-
-- Now how do we get the _saved_ state back?
-
----
-## Restoring Activity State (2/4)
-
--  Two ways:
-  - `onCreate(Bundle savedInstanceState)`
-  - `onRestoreInstanceState(Bundle savedInstanceState)`
-
----
-## Restoring Activity State (3/4)
-
-- Using `onCreate(Bundle savedInstanceState)`...
-
-```java
-private static final USERNAME_KEY = "USER_NAME_KEY";
-private static final FIB_SUM_KEY = "FIB_SUM_KEY";
-
-private int mFibSumValue = 0;
-private String mUsername = null;
-
-@Override
-protected void onCreate(Bundle savedInstanceState) {
-  super.onCreate(savedInstanceState);
-  setContentView(R.layout.activity_main);
-
-  mMainTextView = (TextView) findViewById(R.id.text_main_title);
-  mSumTextView = (TextView) findViewById(R.id.text_sum);
-  // Check if there was a previously saved state to restore to the user
-  // A non-null bundle means there was a state that was saved previously
-  // A bundle is just a Key-Value pairing - its a hash map :)
-  if (savedInstanceState != null) {
-    // There was a previous state - time to restore
-    mFibSumValue = savedInstanceState.getInt(FIB_SUM_KEY);
-    mUsername = savedInstanceState.getString(USERNAME_KEY);
-  }
-  updateMainText();
-  updateFibSumText();
-}
-```
-
----
-
-## Restoring Activity State (4/4)
-
-- Using `onRestoreInstanceState(Bundle savedInstanceState)`
-
-```java
-private static final USERNAME_KEY = "USER_NAME_KEY";
-private static final FIB_SUM_KEY = "FIB_SUM_KEY";
-private int mFibSumValue = 0;
-
-@Override
-protected void onRestoreInstanceState(Bundle savedInstanceState) {
-  super.onRestoreInstanceState(savedInstanceState);
-  // Check if there was a previously saved state to restore to the user
-  if (savedInstanceState != null) {
-    // There was a previous state - time to restore
-    mFibSumValue = savedInstanceState.getInt(FIB_SUM_KEY);
-    mUsername = savedInstanceState.getString(USERNAME_KEY);
-  }
-  updateMainText();
-  updateFibSumText();
-}
-```
-
----
-
-### Restoring in `onCreate` vs. `onRestoreInstanceState`
-- `onRestoreInstanceState`
-  - Guarantees you will never have a non-null `Bundle` when called
-  - Lets subclasses override the behavior of restoring the state
-
-- `onCreate`
-  - Lets you focus on doing all of your initialization in one place
-
-- You decide what works best for you :)
-
-- http://stackoverflow.com/questions/36408776/using-oncreate-vs-onrestoreinstancestate
-
----
-
-## Exercise: Parcelable and Activity State
-
-- Pair up!
-
-- Download the base code here:
-
-- This app lets a user enter a name, age, and favorite food
-
-- It stores this info in a `PersonModel`
-
-- When the app is killed, this information needs to remain edited
-
-- Implement the `Parcelable` interface for the PersonModel
-
-- Then use the Activity's relevant state change callbacks to `PersonModel` when the phone rotates
-
----
-### Some Notes about `onSaveInstanceState()`
-- .red[Only use to save and restore session variables and the state of the UI]
-
---
-
-  - Android won't always trigger the method
-
---
-
-  - It is called when the `Activity` is closed and _expected_ to be restored soon
-
---
-
-- If your app crashes, or is closed, **the values in the bundle will disappear!**
-
---
-
-- If you use custom views, you can implement their version of `onSaveInstanceState`:
-
-  Android will call `onSaveInstanceState()` every view in the layout
-
----
-# Project Work: Add Save State
-
-
----
-# End of Slides
-    
----
-
diff --git a/slides/unused/lofi.html b/slides/unused/lofi.html
deleted file mode 100644
index 67ae041a22de92c24ff14b2931efc4a1ceba3334..0000000000000000000000000000000000000000
--- a/slides/unused/lofi.html
+++ /dev/null
@@ -1,138 +0,0 @@
----
-layout: presentation
-title: Layout --Week 2, Monday-- 
-description: Description of Layout
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Advanced Interaction Design
-
-Jennifer Mankoff
-CSE 340 Spring 2019 
----
-layout:false
-
-background-image: url(img/paper.png)
-[//]: # (Outline Slide)
-# Today's goals
-- Problems with lo-fi prototypes
-- Understand user testing
-- Ethical considerations in testing
-- Collection and use of evidence
----
-.left-column[## Problems with low-fi prototypes?]
-.right-column[
-![:img paper prototype, 20%](img/paper.png)
-]
-???
--“Computer” inherently buggy
--Can’t get accurate time measurement
--Hard to implement some functionality: pulldowns, feedback, drag, viz …
--Won’t look like final product: sometimes hard to recognize components
--End-users can’t use by themselves: not in context of user’s work environment
--Couldn’t measure realistic I/O
--Lack of interactive feedback: e.g. button highlights
--“Computer” has to keep track of a lot of paper
--Users wouldn’t criticize UI
--Doesn’t map well to what will actual fit on the screen 
--Couldn’t hold in your hand – different ergonomics from target device
--Some things could not be simulated (highlighting)
--Writing on paper not the same as writing on target device / Hard to draw well (-recognition of elements)
--Appearance unrealistic
--Dynamic components hard to simulate (pop-ups)
--Couldn’t give proper affordance that something wasn’t selectable
--Some items had to be static!
--Dragging hard to simulate
----
-.left-column[## High Fi testing]
-.right-column[
-Must test & observe ideas with customers
-
- - Want to compare and contrast
- - Want to get more realistic reactions
-
-Paper mock-ups don’t go far enough
- - How would you show a drag operation?
- - Not realistic of how interface will be used
-
-Approaches
- - Can fake it -- good for early
- - Can implement it
-]
----
-.left-column[## Review: Testing Goals
-![:img Cartoon of user test, 100%](img/cartoon.png)
-]
-.right-column[
-Choose your focus
-
-Task design:
-- Appropriate scope
-- Predictable outcomes
-- Elicits action
-]
----
-.left-column[##Kinds of data we can collect?]
-???
-Discuss
---
-.right-column[
-Video, Descriptions of behaviors, Notes
-Can transcribe and analyze individual users
-Can look for patterns across users
-]
----
-.left-column[##Goal of data collection?]
-???
-Discuss
---
-.right-column[
-What went well?
-What went badly?
-What matters (severe, common)?
-]
----
-.left-column[##Qualitative data collection]
-.right-column[
-Identify Critical Incidents (can be good or bad)
-
-Critical Incidents are Situations that: 
-- Provoke silence 
-- Provoke puzzlement 
-- Provoke user comments 
-
-Capture using Critical Incident reports
-
-]
----
-.left-column[#Critical Incident Report]
-.right-column[
-Name: System doesn’t treat “1” and “one” interchangeably
-Severity:   High/Medium/Low + Good/Bad
-Frequency:  (expected within system)
-Category: 
-The user accomplishes a goal, but in a suboptimal way OR
-The user expresses some negative affect or says something is a problem.
-Evidence: Report FACTS!
-What the user (s) said: “My destination is One Market Street” “This is not right, I don't think this is what I want to do.” (on “Multiple Search Results” page).
-
-What the user (s) did: After receiving the “no exact match” error message, the user hits the Back button to return to the trip planner and enters “1” instead of “One.”
-
-What the system did: The system presented the user with a “Multiple Search Results” page, with the error message “We found some locations similar to your destination entry, but no exact match.”  After the user returns to the trip planner and enters “1,” the system returns a bus route.
-]
----
-.left-column[#Quantitative data]
-
----
-layout: false
-
-.left-column[##Other Menus]
-.right-column[
-Kurtenbach:
-![:youtube Illustration of advantages of marking menus,dtH9GdFSQaw]
-]
-
----
diff --git a/slides/unused/menus2.html b/slides/unused/menus2.html
deleted file mode 100644
index 9c519a5bc5029b15097455969c849045d3d3348f..0000000000000000000000000000000000000000
--- a/slides/unused/menus2.html
+++ /dev/null
@@ -1,585 +0,0 @@
----
-layout: presentation
-title: Predicting and Evaluating Interactor Efficacy
-description: Discussion of Theory and Collection of User Data for assessing Interactor Efficacy
-class: middle, center, inverse
----
-layout:false
-
-# Why is selection (and testing) important .red[*]
-.left-column50[
-
-![:img Image showing a false alarm in hawaii that led everyone to
-think there wsa a nuclear event, 100%](img/alert1.jpg)
-]
-.right-column50[
-![:img Image showing the screen that led to this error, 100%](img/alert.jpg)
-]
-
-.footnote[.red[*] [Washington Post Article](https://www.washingtonpost.com/news/morning-mix/wp/2018/01/16/that-was-no-wrong-button-in-hawaii-take-a-look/?utm_term=.1848969db923)
-]
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Predicting and Evaluating Interaction Efficacy
-
-Jennifer Mankoff
-CSE 340 Spring 2019 
----
-layout: false
-
-[//]: # (Outline Slide)
-# Today's Learning goals
-- Introduce key coding concepts for Menus Assignment
-- **Using Properties of People To Predict Design Outcomes**
----
-.title[Comments on Feedback]
-.body[
-Thanks for the feedback on the class!
-- Quizzes show. Assignments are taking a long time. We will try to post information
-about expected time, please reach out for help if you go beyond that
-
-- Start early (some people are starting ColorPicker today), so you can ask us for help with time to spare!
-
-]
-???
-Feedback from Monday 
----
-.title[Menus Assignment]
-.body[
-Will compare pie menus to linear menus
-
-Demo
-]
-
----
-.left-column50[
-## Interface  Structure
-
-<div class="mermaid">
-graph LR
-FrameLayout --> ActionBar[ActionBar]
-ActionBar --> TextView[TextView:Pie/Menu]
-ActionBar --> Hamburger[Hamburger:Next Session/ClearCSV]
-FrameLayout --> MainLayout[MainLayout]
-MainLayout --> MenuExperimentView[MenuExperimentView]
-MainLayout --> InstructionText[InstructionTextView]
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-class FrameLayout,ActionBar,MainLayout,TextView,Hamburger,MenuExperimentView,InstructionText normal
-</div>
-]
-
-.right-column50[
-## Inheritance Structure
-
-<div class="mermaid">
-graph LR
-MenuExperimentView[MenuExperimentView] --> PieMenuView[PieMenuView]
-MenuExperimentView --> NormalMenuView[NormalMenuView]
-</div>
-
-]
- 
----
-.title[PPS for assignment]
-.body[
-Implemented in MenuExperimentView
-
-<div class="mermaid">
-graph LR
-S((.)) --> A((Start))
-A -- "Press?drawMenu;startTrial;startPoint=p" --> I((Inside))
-I -- "Release:endTrial;reset();onOptionSelected(trial)" --> E[End]
-I -- "Drag:currentIndex=menuItem" --> I
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-class S invisible
-class A start
-class E finish
-class I normal
-</div>
-
-
-Works in both Menus!
-]
-
----
-.title[Enums]
-.body[
-
-Group of named constants
-
-- Used for PPS in colorPicker (PPS States; Essential Geometry)
-
-- Used for PPS in Menu assignment *and* for experimental conditions
-
-- Easy to inspect if you want to (we do this in ExperimentSession)
-
-[Documentation](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)
-]
-
----
-.title[Custom Listeners]
-.body[
-- Used in ColorPicker and Menus. You'll use them lots
-- Why create custom listeners?
-]
---
-.body[
- - Let you execute code when your view's model has changed
- - No other way to know that has happened
-
-]
-
----
-.title[How to implement]
-.body[
-
-Custom View needs
-- To define the custom interface 
-- To keep track of listeners
-]
---
-.body[
-Anything using the view needs
-- To implement the interface (specifically, the method that will be called)
-- To register itself as a listener
-]
----
-.title[Example Custom View -- ColorPicker: We setup the Custom View side for you]
-.body[
-```java
-    /** Currently registered ColorListener instance or null. */
-    protected ColorListener mColorListener;
-
-    /**
-     * Class which defines a listener to be called when a new color is selected.
-     */
-    public interface ColorListener {
-        void onColorSelected(@ColorInt int color);
-    }
-
-    /**
-     * Registers a new listener for the color of this ColorPicker, or replaces
-     * any existing listener.
-     *
-     * @param colorListener New listener or null.
-     */
-    public final void setColorListener(@Nullable ColorListener colorListener) {
-        mColorListener = colorListener;
-    }
-```
-]
----
-.title[You need to do this yourself in Menus]
-
-.body[
-
-```java
- /**
-     * You need to create a listener interface so the application
-     * can be notified when a selection is made. This will trigger
-     * the move to the next trial.
-     */
-    protected MenuExperimentViewSolution.MenuListener menuListener;
-```
-]
----
-.title[Example Custom Listener -- ColorPicker: You need to implement
-this]
-
-.body[
-`// TODO: Register callback to update {color,label} View when color changed.`
-
-What method do we call to register the callback?  setColorListener
-
-What method is called when?
-
-What do we usually do in a callback? update application state
-]
-???
- Draw a time based diagram 
----
-.title[Listener in Menus]
-.body[
-`setMenuListener` needs to be implemented, should
-
-- record the result of that trial
-- Update the experiment to show the next menu (or nothing if the
-session is over)
-- Update the instructions to the user
-]
----
-.title[OnDraw changes to Canvas]
-.body[
-Views `MATCH_PARENT`
-
-Makes drawing tricky
-
-Translate (like a parent view does for kids)
-
-]
----
-layout: false
-
-[//]: # (Outline Slide)
-# Today's Learning goals
-- Introduce key coding concepts for Menus Assignment
-- **Using Properties of People To Predict Design Outcomes**
----
-.title[Fitts Law]
-.body[
-Quiz Results to discuss
-]
-
----
-.title[Other laws we might use to make predictions about what will go better]
-.body[
-- Fitts Law (compare distance and size; check for infinite size)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- Gestalt Psychology (will they see it at all?)
-- Errors (will they be reduced)
-]
- ---
-#Which is better and which laws explain it?
-.left-column50[
-#A Pie Menu
-![:img Pie Menu, 80%](img/pie.jpg)
-]
-.right-column50[
-#B Pull down Menu
-![:img Traditional Menu inside a web browser, 80%](img/menu.png)
-]
-???
-
-What analysis methods can we use to predict?
-
-- Fitts Law (compare distance and size; check for infinite size)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- Gestalt Psychology (will they see it at all?)
-- Errors (will they be reduced)
-
----
-# Which is better and which law explains it?
-.left-column50[
-#A Pie Menu
-![:img Pie Menu, 80%](img/pie.jpg)
-]
-.right-column50[
-#B Marking Menu
-![:youtube Video assigned before class, 8c58bN6ajJ4?t=30]
-]
-???
-
-- Fitts Law (compare distance and size; check for infinite size)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - **Does someone have to 'check' something? More than once?**
- - **Do they have to move? More than once**
-- Gestalt Psychology (will they see it at all?)
-- Errors (will they be reduced)
----
-.title[Which is better and which laws explain it?]
-
-.body[
-A: Tapping B: Crossing
-![:youtube Video of using crossing for selection, kp2Zl4ONuik]
-]
-
-???
-
-- **Fitts Law (compare distance and size; check for infinite size)**
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- Gestalt Psychology (will they see it at all?)
-- Errors (will they be reduced)
-
----
-#Which is better and which laws explain it?
-.left-column50[
-#A
-![:img Picture of the Graffiti gesture recognition alphabet from the Palm Pilot, 100%](img/Grafitti.png)
-]
-.right-column50[
-#B
-![:img Picture of the Edgewrite gesture recognition alphabet, 50%](img/Edgewrite.png)
-
-]
-???
-
-- Fitts Law (compare distance and size; check for infinite size)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- Gestalt Psychology (will they see it at all?)
-- **Errors (will they be reduced)**
-
----
-#Which is better and which laws explain it?
-
-.left-column50[
-#A
-![:img Picture of old facebook security page with icons and text mixed
-up,100%](img/facebook.png)
-]
-.right-column50[
-#B
-
-![:img Picture of March 2019 facebook security page with icons and
-text clearly aligned, 100%](img/facebook2.png)
-]
-???
-
-- Fitts Law (compare distance and size; check for infinite size)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- **Gestalt Psychology (group?)**
-- **Errors (will they be reduced)**
----
-# How do we actually **prove** such theories?
-
---
-# Collect Data!
----
-
-.left-column[##Kinds of data we can collect?]
-???
-Discuss
---
-.right-column[
-- Video
-- Timing/Errors
-- Descriptions of behaviors
-- Notes
-- Can transcribe and analyze interviews with users
-- Can look for patterns across users
-]
----
-.left-column[##Qualitative data collection to test theory]
-.right-column[
-Identify Critical Incidents (can be good or bad)
-
-Critical Incidents are Situations that: 
-- Provoke silence 
-- Provoke puzzlement 
-- Provoke user comments 
-
-Capture using Critical Incident reports
-
-]
----
-.left-column[##Quantitative data collection to test theories]
-.right-column[
-Identify Hypothesis
-
-Hypothesis is 
-- Relevant
-- Testable
-
-Capture data that proves or disproves hypothesis
-
-]
----
-# How do we prove our theories? Hypothesis
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis((Hypothesis))
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis start
-</div>
-
-
----
-# How do we prove our theories? Method
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis((Hypothesis))
-Hypothesis -- "Study Design" --> Method((Method))
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis start
-class Method normal
-</div>
-
-
----
-# How do we prove our theories? Data
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis((Hypothesis))
-Hypothesis -- "Study Design" --> Method((Method))
-Method -- "Run Study" --> Data((Data))
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis start
-class Method,Data normal
-</div>
----
-# How do we prove our theories? Analysis
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis((Hypothesis))
-Hypothesis -- "Study Design" --> Method((Method))
-Method -- "Run Study" --> Data((Data))
-Data -- "Clean and Prep" --> Analysis((Analysis))
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis start
-class Method,Data,Analysis normal
-</div>
-
----
-# How do we prove our theories? Conclusions
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis((Hypothesis))
-Hypothesis -- "Study Design" --> Method((Method))
-Method -- "Run Study" --> Data((Data))
-Data -- "Clean and Prep" --> Analysis((Analysis))
-Analysis --> Conclusions((Conclusions))
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-linkStyle 4 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis,Conclusions start
-class Method,Data,Analysis normal
-</div>
-
-.left-column50[
-#A
-![:img Picture of the Graffiti gesture recognition alphabet from the Palm Pilot, 100%](img/Grafitti.png)
-]
-.right-column50[
-#B
-![:img Picture of the Edgewrite gesture recognition alphabet, 50%](img/Edgewrite.png)
-
-]
-
-???
-Hypothesis: Errors (will they be reduced)
-Method:?? 
-Data:??
-Analysis??
-Conclusions??
-
----
-# How do we prove our theories? Conclusions
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis((Hypothesis))
-Hypothesis -- "Study Design" --> Method((Method))
-Method -- "Run Study" --> Data((Data))
-Data -- "Clean and Prep" --> Analysis((Analysis))
-Analysis --> Conclusions((Conclusions))
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-linkStyle 4 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis,Conclusions start
-class Method,Data,Analysis normal
-</div>
-
-.left-column50[
-#A Pie Menu
-![:img Pie Menu, 80%](img/pie.jpg)
-]
-.right-column50[
-#B Pull down Menu
-![:img Traditional Menu inside a web browser, 80%](img/menu.png)
-]
-???
-
-Hypothesis: Errors will be reduced; 
-Hypothesis: Motion will be faster due to low level motor things 
-Hypothesis: fewer cognitive checks needed
-Method:?? 
-Data:??
-Analysis??
-Conclusions??
diff --git a/slides/unused/midterm.html b/slides/unused/midterm.html
deleted file mode 100644
index 23b1bc0a437338e6db71f3130ed4aeda9394370c..0000000000000000000000000000000000000000
--- a/slides/unused/midterm.html
+++ /dev/null
@@ -1,85 +0,0 @@
----
-layout: presentation
-title: Midterm Recap
-description: Discussion of some Midterm Questions
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Midterm Recap
-
-Jennifer Mankoff
-
-CSE 340 Spring 2019 
----
-layout: false
-
-.title[Midterm Histogram]
-.body[
-
-![:img Histogram of Midterm Grades, 100%](img/midterm/histogram.png)
-]
----
-
-.title[Question Breakdown]
-.body[
-
-<div class="mermaid">![:img Question Breakdown, 90%](img/midterm/qs.png)
-</div>]
----
-
-.title[Sampling of questions]
-.body[
-Your boss has read up on Fitts’ law, and wants to put all the controls
-at the bottom of the screen so they have infinite width and are easier
-to click on. However, your colleague argues that they should be in a
-pie menu which should pop up wherever the user presses instead. 
-
-- D and W in each case
-- Which is better?
-- Time savings for eyes free (HARD!)
-]
-???
-
----
-.title[Given an interface draw an interactor hierarchy]
-.body[
-What defines an interactor hierarchy?
-
-]
-
-???
-has a root
-only has views in it
-is a tree
---
-.body[
-What is damaged? Everything under the damaged region
-]
----
-.title[Callbacks]
-.body[
-
-You have registered your app to listen for OffRoute callbacks (when the driver’s vehicle deviates from the route, onOffRoute() will be called). Correctly label each method call, based on what object (Application or View) calls it, and where you would put the code to implement it. 
-
- |                         | Called by application or view? | Implemented in application or view? |
- |-------------------------|--------------------------------|-------------------------------------|
- | onOffRoute()            |                                |                                     |
- | setOnOffRouteListiner() |                                |                                     |
-
-]
-
-???
-view -- app
-app -- view
----
-.title[Draw a PPS]
-.body[
-Let's do it for a button
-]
----
-
-
-
diff --git a/slides/unused/paper.html b/slides/unused/paper.html
deleted file mode 100644
index 9a66d11245cfe4ed14ee353afeb9999ec1c6aadb..0000000000000000000000000000000000000000
--- a/slides/unused/paper.html
+++ /dev/null
@@ -1,479 +0,0 @@
----
-layout: presentation
-title: Layout --Week 2, Monday-- 
-description: Description of Layout
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# XXX need to cut back on these slides significantly to focus on exercise...
----
-layout:false
-
-# Marc Rettig’s Problems with Hi-Fi Prototypes
-
-Can you list some?
-???
-Hi-Fi prototypes take too long to build and change
-
-Reviewers and testers tend to comment on detailed, low-level issues rather than big picture
-
-Developers resist change
-
-A prototype in software can set expectations that are hard to change
-
-A single bug in a hi-fi prototype can bring a test to a complete halt
-
----
-template:inverse
-
-# Quiz
----
-# Paper Prototyping
-
-![:img Paper Prototyping, 20%](img/paper-prototype-example.jpg)
-
-Jennifer Mankoff
-CSE 340 Spring 2019
-
----
-# Example of Paper Prototyping
-
-![:youtube Paper Prototyping of video game,9wQkLthhHKA]
-
----
-layout:false
-
-.left-column[
-![:img Rettig Paper, 100%](img/p21-rettig.png)
-Marc Retting: Prototyping for Tiny Fingers. CACM 1994]
-
-.right-column[Paper prototyping is potentially a breakthrough idea for
-organizations that have never tried it, since it allows you to
-.red[demonstrate the behavior of an interface very early] in
-development, and .red[test designs with real users]...]
---
-.right-column[
-It is .red[fast], it .red[brings results early] in development (when it is
-relatively cheap to make changes), and allows a team to
-.red[try far more ideas] than they could with high-fidelity
-prototypes. Lo-fi prototyping 
-helps you apply Fudd's first law of creativity: 'To get a good idea,
-get lots of ideas.'
-]
-
----
-background-image: url(img/background-paper.png)
-
-.left-column[## What is Paper Prototyping?]
---
-
-.right-column[
-Fast and cheap way to create and test user interfaces]
-
---
-
-.right-column[
-It's equivalent to storyboarding in the film industry
-]
-
---
-
-.right-column[
-Focuses on function, less on form
-]
---
-
-.right-column[
-All you need: pen, paper (and possibly scissors/tape)
-]
-
----
-.left-column[Paper Prototypes
-
-![:img hand pointing at drawing interface, 100%](img/drawing-interface.png)
-]
-.right-column[
-Show what an interface … 
-- looks like (sort of)
-- flows like (from screen to screen)
-- interacts like (for some things)
-
-Should be… 
-- Fast to build
-- Lo-fi or hi-fi
-
-Support … 
-- Iteration
-- Ideation
-- User testing
-]
----
-.left-column[Paper Prototypes
-![:img hand pointing at drawing interface, 100%](img/drawing-interface.png)
-]
-.right-column[
-Can uncover what a user ...
-- fill in
-<br>
-<br>
-<br>
-Cannot uncover ...
-- fill in
-]
-???
-
-can uncover:
-- Notices
-- Prefers
-- Finds Accessible
-- Knows
-cannot uncover:
-Interaction
-Load Times
-Context aware (hard)
----
-## Today's learning goals
-
-Why paper prototypes?
-
-How to make paper prototypes 
-
-Hands-on experience rapidly making a paper prototype
-
-Understand what paper prototyping is and isn’t good for
-
-Begin to understand the role of study design in prototyping
-
----
-template:inverse
-
-# More Examples
----
-layout:false
-
-.left-column[## Example Prototype Dimensions
-
-There are other spectrums, but <br> these three are <br> very important
-]
-.middle-column[
-## &nbsp;&nbsp;Faster &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;  &nbsp;  &nbsp;  Slower.red[*]
-![:img skteched vs styled, 70%](img/sketch-styled.png)
-
-The visual look of your prototype is its most salient dimension. If not properly selected, it can sidetrack prototype reviews. Go hi-fi too soon and users will focus on aesthetics like color and font choice, which is not appropriate in early stages.
-]
- .small[.red[*]Source: [Smashing Magazine](http://www.smashingmagazine.com/2010/06/16/design-better-faster-with-rapid-prototyping/)]
----
-.left-column[##Visual Dimension
-
-Prototyping the Nintendo Wii UI .red[*]]
-
-.right-column[
-![:img A wii prototype, 70%](img/visual-eg.png)
-
-When a prototype looks like an early design, your users will be more comfortable providing candid—and often more critical—feedback  
-
-]
-
-.small.red[[Source: Gamustra](http://www.gamasutra.com/view/news/181321/Sometimes_paper_is_your_best_prototyping_tool__even_if_youre_Nintendo.php#.UK95NofAd8G)]
-
-???
-http://www.gamasutra.com/view/news/181321/Sometimes_paper_is_your_best_prototyping_tool__even_if_youre_Nintendo.php#.UK95NofAd8G
-
-'Oh, it's made out of cardboard! (laughs)'- Nintendo president Satoru
-Iwata marvels atthe simplicity of an early prototype of the Wii U's
-tablet controller (pictured above).Nintendo is banking on its
-Miiverse -- a sort of mini-Facebook with a layer of console game --
-	 -- makeup -- to draw players to its new Wii U console. It was
-a new concept, running on a new type of game hardware with the
-tablet-like GamePad.
-
-Nintendo contracted fellow Kyoto social media
-company Hatena Co. Ltd. to do a lot of the Miiverse design work. The
-Wii U's tablet-infused GamePad hadn't been finalized yet, but Hatena
-UI designer Kazuyuki Motoyama felt that he needed to know how the
-Miiverse would feel in his hands, so the company developed the basic
-feel of it with this simple cardboard prototype.
-
-'We wouldn't know how it felt unless we could actually hold it, but
-since we didn't have one, the only thing to do was make one,' Motoyama
-explains. 'In the middle of the night, I cut pieces of cardboard and
-glued them together.'
-
-Ithink there's a game development lesson here. You can prototype just
-about anything with the tools available to you, on just about any
-budget. Whether it's paper or an HTML website or even a free copy of
-UDK or Unity, you shouldn't let available technology hold you back
-from trying new ideas.
-
-If paper prototyping is good enough for a feature embedded in millions of Nintendo-made consoles, it's probably good enough for you too. 
-
----
-.left-column[## Example Prototype Dimensions
-
-There are other spectrums, but these three are very important
-]
-.middle-column[
-## &nbsp;&nbsp;Faster  &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;  &nbsp;  &nbsp;  Slower.red[*]
-![:img skteched vs styled, 70%](img/sketch-styled.png)
-
-![:img static vs interactive, 70%](img/static-interactive.png)
-
-
-Does the prototype reveal how the solution will work (static) or does
-it appear to be fully functional and respond to user input
-(interactive)?   
-
-]
-
-.small[.red[*][Source: Smashing Magazine](http://www.smashingmagazine.com/2010/06/16/design-better-faster-with-rapid-prototyping/)]
-
----
-.left-column[##Functional Dimension
-
-Prototyping the Nintendo Wii UI .red[*]]
-
-.right-column[
-![:img A wii prototype, 70%](img/visual-eg.png)
-
-Here the screen is made of paper. The controller is made of
-cardboard. But the design is interactive: The user clicks on a
-button and the facilitator updates the resulting paper interface
-
-]
-
-.small[.red[*][Source: Gamustra](http://www.gamasutra.com/view/news/181321/Sometimes_paper_is_your_best_prototyping_tool__even_if_youre_Nintendo.php#.UK95NofAd8G)]
----
-
-
-.left-column[## Example Prototype Dimensions
-
-There are other spectrums, but these three are very important
-]
-.middle-column[
-## &nbsp;&nbsp;Faster &nbsp; &nbsp; &nbsp; &nbsp;  &nbsp;  &nbsp;  &nbsp;  Slower.red[*]
-![:img skteched vs styled, 70%](img/sketch-styled.png)
-
-![:img static vs interactive, 70%](img/static-interactive.png)
-
-![:img lorum ipsum vs real content, 70% ](img/lorem-content.png)
-
-
-Displaying content? Early on, just squiggly lines, then maybe dummy
-text (though this can distract—be careful), then actual content.]
-]
----
-.left-column[##'Point of need' Computing .red[*]]
-.right-column[
-![:img Picture of a wall mounted paper interface, 70% ](img/palplates.png)
-
-
-.red[*]
-Supporting knowledge workers beyond the desktop with
-PALPlates. Mankoff, Jennifer, and  Bill Schilit. CHI 1997.
-]
----
-# Prototyping Concerns
-.left-column[## Choosing your focus]
-.right-column[
-![:img Prototyping Cartoon, 70%](img/cartoon.png)
-]
----
-# Prototyping Concerns
-.left-column[
-### Task Design
-- Appropriate scope
-- Predictable outcomes
-- Elicits action
-]
---
-.middle-column[
-### Prototype Design
-
-Each card represents one sub-screen/task element
-- Use a photocopier to make many version
-- Use post-its and notecards for different regions of the screen
-
-Simple is great
-]
----
-# Prototyping Concerns
-.left-column[## Choosing your focus
-
-### Task Design
-- Appropriate scope
-- Predictable outcomes
-- Elicits action
-]
-.middle-column[
-### Prototype Design
-
-Each card represents one sub-screen/task element
-- Use a photocopier to make many version
-- Use post-its and notecards for different regions of the screen
-
-Simple is great
-]
-.right-column[
-### Roles
-- Real users
-- An observer or video camera
-- A human computer
-]
-
-???
-Computer should be mostly silent
-
-Accurate
-
-Wait for users to act
-
----
-template:inverse
-
-#Importance of Testing .red[Multiple] Prototypes
-
----
-layout:false
-.left-column[##Testing Multiple Prototypes
-<br>
-<br>
-Wiklund Thurrot &amp; Dumas<br>
-Human Factors Society 1992
-]
-.right-column[
-We have found subjects reluctant to be critical of designs when they are asked to assign a rating to the design. In our usability tests, we see the same phenomenon even when we encourage subjects to be critical. 
-]
---
-.right-column[
-We speculate that the test subjects feel that giving a low rating to a
-product gives the impression that they are “negative” people, that the
-ratings reflect negatively on their ability to use computer-based
-technology, that some of the blame for a product’s poor performance
-falls on them, or that they don’t want to hurt the feelings of the
-person conducting the test.
-]
-
----
-template:inverse
-
-#What are some strategies to combat this problem?
----
-layout:false
-
-.left-column[##Eliciting Criticism]
-.right-column[
-Test low-fidelity prototypes that look unfinished
-
-Have independent testers (testers not invested in outcome)
-
-Show multiple prototypes/products & have them compare
-]
----
-template: inverse
-# Exercise
----
-layout: false
-## Exercise
-- Brainstorming - a To Do List app (7 mins)
-
---
-
-- Paper Prototype the app in groups of 3 (20 mins)
-
---
-
-- Come up with Task Scenarios (5 min)
-
---
-
-- User Test with 2 students from another group (15 min)
-
---
-
-- Discussion (10 min)
-
---
-
-Things we would add if we had time!
-- Refine your Prototype (10 min)
-
---
-
-- User Test with 1 student (10 min)
-
----
-
-## Discussion
-
---
-
-- What can and can't you learn from it?
-
---
-
-- Why is this hard for mobile applications?
-  
---
-
-  - Context-aware Applications?
-
---
-
-- What other low-fi techniques can we use?
----
-Sources:
-Storyboards, Paper Prototypes and Mockups
-Scott Klemmer’s HCI MOOC
-https://www.youtube.com/watch?v=z4glsttyxw8
-
-Paper Prototyping as a Usability Testing Technique
-https://usabilitygeek.com/paper-prototyping-as-a-usability-testing-technique/
-
-
-Also useful: wikipedia.org/wiki/Paper_prototyping
-Google image search: ‘paper prototyping’
-
-
-
-Book: Prototyping: A practitioner’s guide
-https://www.amazon.com/Prototyping-Practitioners-Todd-Zaki-Warfel/dp/1933820217
-
-Book: Paper Prototyping
-https://www.amazon.com/Paper-Prototyping-Interfaces-Interactive-Technologies/dp/1558608702
-
-
-Prototyping for tiny fingers. Rettig, Marc. Communications of the
-ACM 37.4 (1994
-
-Supporting knowledge workers beyond the desktop with
-PALPlates. Mankoff, Jennifer, and  Bill Schilit. CHI 1997.
-
-MoveableMaker: facilitating the design, generation, and assembly of
-moveable papercraft. Annett, Michelle, et al., UIST 2015. 
-
- 
----
-# Unused
-
----
- Example 1: Travellr
-
-![:youtube Paper Prototyping of travel app,_5FGeSQ7DBU]
-
-Example 2: Game (also video prototyping...)
-![:youtube Paper Prototyping of video game,x48qOA2Z_xQ]
-
----
-# Complex has its place too .red[*]
-
-![:youtube Paper Prototyping of video game,v=0yh-omblujQ]
-
-[Long video](https://www.youtube.com/watch?v=eujk284JYOE) and [Full talk](https://www.youtube.com/watch?v=NO4Fml1UZA4)
-
-.red[*] Annett, Michelle, et al. MoveableMaker: facilitating the
-design, generation, and assembly of moveable papercraft. Proceedings
-of the 28th Annual ACM Symposium on User Interface Software &
-Technology. ACM, 2015. 
diff --git a/slides/unused/sensing-assignment.html b/slides/unused/sensing-assignment.html
deleted file mode 100644
index f59f0f0e0b7cf5db60adfa1faf77b12fa301b74a..0000000000000000000000000000000000000000
--- a/slides/unused/sensing-assignment.html
+++ /dev/null
@@ -1,236 +0,0 @@
----
-layout: presentation
-title: Sensing Implementation
-description: Implementation of phone sensing
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Sensing with your Phone: Implementation
-
-Jennifer Mankoff
-
-CSE 340 Spring 2019 
----
-layout: false
-
-.title[Review: Android Awareness API]
-.body[
-Link to overview [Awareness API](https://developers.google.com/awareness/) 
-
-Unfortunately much of the documentation online is not up to date (last
-updated in 2017)
-]
-
-???
----
-.title[Non-programming requirements]
-.body[
-Emulator requirements: Play store installed
-- Makes it easier to get your app working
-
-Permission requirements: Correct API installed
-
-Follow the “[Quick
-Guide](https://developers.google.com/places/web-service/get-api-key)”
-- Click on 'Get Started'
-- Use your class repo name for your app name (something like
-cse340-LaughingChipmunks) -- competing with all other google apps for namespace
-- You may need a billing account. 
-- DONT LOSE YOUR API KEY or you'll have to start over. 
-]
----
-.title[Which APIs to enable?]
-.body[
-
-Minimum requirements
-- Awareness API (should be turned on by default
-- [See APis enabled](https://console.developers.google.com/apis/)
-]
-
----
-.title[Using your API key]
-.body[
-When you have your API key, go to your android manifest and paste it
-in between the quotation marks labeled API_KEY. 
-
-Once you do that, as
-described in the spec, you'll need to accept permissions and update
-play when you run your code.
-
-```xml
-
-        <meta-data
-            android:name="com.google.android.awareness.API_KEY"
-            android:value="YOUR_KEY_HERE"/>
-        <meta-data
-            android:name="com.google.android.geo.API_KEY"
-          android:value="YOUR_KEY_HERE"/>
-```
-	
-]
----
-.title[Review: Snapshots]
-.body[
-Current info
-
-Requires a single callback: 
-`onSnapshot(Response response)`
-
-Setup the callback in MainActivity (pass in the type of activity)
-`setSnapshotListener(Awareness.getSnapshotClient(this).getDetectedActivity(),`
-`new ActivitySnapshotListener(mUpdate, mResources));`
-	
-Parse the response and act on it in onSnapshot
-]
----
-.title[What are Snapshots useful for?]
-.body[
-Debugging
-
-Anything else?
-
-]
----
-.title[Review: [Fences](https://developers.google.com/awareness/)]
-.body[
-Conditional data
-
-3 callbacks: during, starting, stopping
-
-Setup in `MainActivity.java setupFenceListeners()`
-```java
-mActivityFenceListener = new ActivityFenceListener(
-	            // during
-                DetectedActivityFence.during(DetectedActivity.WALKING),
-			    // starting
-                DetectedActivityFence.starting(DetectedActivity.WALKING),
-				// stopping
-                DetectedActivityFence.stopping(DetectedActivity.WALKING),
-                this, this, mUpdate);
-```
-]
-???
-What might we use for a location fence?
-Headphone fence?
-...
----
-.title[Setting up a fence in `MainActivity.java`]
-.body[
-The rest is pretty boilerplate for everything
-
-```java
-if (((Checkable) v).isChecked() && 
-*    ensureFineLocationAccess()) {
-                mActivityFenceListener.register();
-            } else {
-                mActivityFenceListener.unregister();
-            }
-```
-]
-.footnote[
-`ensureFineLocationAccess()` needs to be checked before anything
-that uses location, e.g. weather]
-
----
-.title[Setting up a fence in `MainActivity.java`]
-.body[
-
-The rest is pretty boilerplate for everything
-```java
-if (((Checkable) v).isChecked() && 
-     ensureFineLocationAccess()) {
-                mActivityFenceListener.register();
-            } else {
-                 mActivityFenceListener.unregister();
-            }
-```
-]
-.footnote[These are because this is asynchronous]
----
-.title[Using Places]
-.body[
-Shows you what is nearby
-
-```java
-//In MainActivity:
-setSnapshotListener(
-    Awareness.getSnapshotClient(this).getPlaces(),
-                        new PlacesSnapshotListener(mUpdate, mResources)));
-//In PlacesSnapshotListener
-
-public void onSnapshot(PlacesResponse response) {
-        List<PlaceLikelihood> placeLikelihood = response.getPlaceLikelihoods();
-        if (placeLikelihood != null && !placeLikelihood.isEmpty()) {
-            for (PlaceLikelihood likelihood : placeLikelihood) {
-                addPlace(likelihood.getPlace().getName().toString(), likelihood.getLikelihood());
-            }
-        }
-
-
-        mUpdate.prependText(placeLikelihood.toString());
-    }
-```
-]
----
-.title[Work on adding a snapshot]
-.body[
-Make sure to download Oreo 27 for emulation (Nougat 25 won't work)
-
-When you run your code, you'll need to update Play store & set permissions
-
-Try to have the base code running by end of class (e.g. everything installed;
-            api keys correct) 
-You can get additional help in office hours
-]
----
-.title[Context Aware Computing Assignment]
-.body[
-Pick one type of context
-- attach for later
-- automatically execute based on context
-- present info based on context
-]
----
-.title[System Usability Scale]
-.body[
-1) I think that I would like to keep using this app.
-
-2) I found the system unnecessarily complex.
-
-3) I thought the system was easy to use.
-
-4) I found the use of implicit and explicit data in this app to be well integrated.
-
-5) I thought there was too much inconsistency in this system.
-
-6) I would imagine that most people would learn to use this system very quickly.
-
-7) I found the system very cumbersome to use.
-
-8) I felt very confident using the system.
-]
----
-.title[Group Project]
-.body[
-Expectations:
-- Work together to decide on a focus
-- Implement your App
-- Make a video
-]
----
-.title[More Expectations:]
-.body[
-Divide and conquer ok for video, interface implementation,
-  context-aware implementation
-
-Should not look at sensing code by others until yours has been
-  turned in 
-
-Group participation will be assessed
-]
-???
-Questions?
----
diff --git a/slides/unused/sensing.html b/slides/unused/sensing.html
deleted file mode 100644
index 5a1790e86793cf7d03ab8931cdee540f95f9bbeb..0000000000000000000000000000000000000000
--- a/slides/unused/sensing.html
+++ /dev/null
@@ -1,129 +0,0 @@
----
-layout: presentation
-title: Sensing with your Phone
-description: Discussion of practical side of phone sensing
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Sensing with your Phone
-
-Jennifer Mankoff
-
-CSE 340 Spring 2019 
----
-layout: false
-
-# Types of Input
-
-- Not just touches: clicks, key presses
-
---
-
-- *Sensors* - GPS, IMU/Accelerometer, humidity, temperature, etc
-
-???
-Sampled or event based?
---
-  - `Managers` (e.g. `LocationManager`) let us create and register a listener
-
-  - Listeners can receive updates at different intervals, etc.
-
-  - Some Sensor-specific settings  
-    [https://source.android.com/devices/sensors/sensor-types.html](https://source.android.com/devices/sensors/sensor-types.html)
-
----
-# Other Kinds of Input
-
-- Microphone
-
-- Camera
-
-- Multi-touch
-
-- Connected Devices? 
----
-.title[
-Aware Framework]
-.body[
-![:img Picture of how AWARE is used](img/sensing/aware_overview1.png)
-[Aware's Many Sensors](https://awareframework.com/sensors/)
-]
-???
-AWARE is an Android framework dedicated to instrument, infer, log and share mobile context information, for application developers, researchers and smartphone users. AWARE captures hardware-, software-, and human-based data. The data is then analyzed using AWARE plugins. They transform data into information you can understand.
----
-.title[Easy to collect data]
-.body[
-![:img Aware Study Interface, 70%](img/sensing/aware-study.png)
-]
----
-.title[We'll implement our own version]
-.body[
-Much Simpler
-
-Android only
-
-Uses Android's
-[Task](https://developer.android.com/reference/com/google/android/play/core/tasks/Task)
-API because this may be asynchronous. We do our best to hide this for
-you
-
-Uses Google's [Awareness
-API](https://developers.google.com/awareness/) to provide you access
-to data
-]
-
-???
----
-.title[Snapshots]
-.body[
-Current info
-
-Requires a single callback: 
-`onSnapshot(Response response)`
-
-Parse the response and act on it! 
-
-`WeatherSnapshotActivity` example
-]
----
-.title[Subclass ContextSnapshotActivity]
-.body[
-	You'll create activities for multiple sensors
-]
----
-.title[[Fences](https://developers.google.com/awareness/)]
-.body[
-Conditional data
-
-3 callbacks: during, starting, stopping
-
-From the android docs: 
-```
-if (TextUtils.equals(fenceState.getFenceKey(), "headphoneFenceKey")) {
-            switch(fenceState.getCurrentState()) {
-                case FenceState.TRUE:
-                    Log.i(TAG, "Headphones are plugged in.");
-                    break;
-                case FenceState.FALSE:
-                    Log.i(TAG, "Headphones are NOT plugged in.");
-                    break;
-                case FenceState.UNKNOWN:
-                    Log.i(TAG, "The headphone fence is in an unknown state.");
-                    break;
-            }
-        }
-```
-]
----
-.title[Subclass FenceActivity]
-.body[
-Again you'll create for multiple sensors
-]
----
-.title[Simulation Demo]
-.body[
-]
----
diff --git a/slides/unused/sensing2.html b/slides/unused/sensing2.html
deleted file mode 100644
index 9a5e82ecfe852f6e8feb84fd1e66e77e9f88f97d..0000000000000000000000000000000000000000
--- a/slides/unused/sensing2.html
+++ /dev/null
@@ -1,31 +0,0 @@
-
-<!-- ---
-# Types of Input
-
-- Not just touches, clicks, key presses
-
---
-
-- *Sensors* - GPS, IMU/Accelerometer, humidity, temperature, etc
-
-???
-Sampled or event based?
---
-  - `Managers` (e.g. `LocationManager`) let us create and register a listener
-
-  - Listeners can receive updates at different intervals, etc.
-
-  - Some Sensor-specific settings  
-    https://source.android.com/devices/sensors/sensor-types.html
-
----
-# Other Kinds of Input
-
-- Microphone
-
-- Camera
-
-- Multi-touch
-
-- Connected Devices? -->
----
diff --git a/slides/unused/state.html b/slides/unused/state.html
deleted file mode 100644
index aceb78df0dc2fc5451c94352c3a323ad861ea2e8..0000000000000000000000000000000000000000
--- a/slides/unused/state.html
+++ /dev/null
@@ -1,505 +0,0 @@
----
-layout: presentation
-title: Capturing Behavior through State 
-description: Description the use of propositional production systems to describe component behavior (interaction techniques)
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-layout: false
-
-.title[# Hall of Fame/Shame]
-.body[
-![:img Picture of the course website with the mouse clicking on an unresponsive hamburger menu,80%](img/noresponse.png)
-]
-
----
-class: inverse, center, middle
-
-.title[# From Events to Behavior]
-.body[
-Jennifer Mankoff
-CSE 340 Spring 2019 
-]
----
-
-[//]: # (Outline Slide)
-.title[# Today's goals]
-.body[
-Review / Quiz 
-
-Introduce interaction techniques
-
-Discuss use of Propositional Production Systems in implementing them
-
-Try creating a PPS 
-]
----
-.title[What is part of an event?]
-.body[
-![:img Picture of quiz results for the question about events. The question is "Which of these is not an event?" and the most popular answer is "CTRL (key pressed)" but many people also chose "WindowOpen" and "4"., 80%](img/notevent.png)
-]
----
-.title[When is focus used?]
-.body[![:img Picture of quiz results for the question about focus. The question is "In which of the following situations is focused used during event handling?" and many people correctly chose "When a mouse moves off a scrollbar" but others chose things like "When selecting a word in a text area" and "When clicking on a button", 80%](img/focus.png)
-]
----
-.left-column[
-## Interaction Technique]
-.right-column[
-A method for carrying out a specific interactive task
-
-Example: enter a number in a range
-
-could use...
-]
-???
-have the class try to think of examples
---
-.right-column[
-- (simulated) slider
-- (simulated) knob
-- type in a number (text edit box)
-
-Each is a different interaction technique
-]
----
-.left-column[
-## Example: Specify the end points for a line
-]
-.right-column[
-Could just specify two endpoints – click, click
-- not good: no affordance, <br>no feedback (/ feedforward)
-
-Better feedback is to use “rubber banding”
-- stretch out the line as you drag
-- at all times, shows where you would end up <br> if you “let go”
-]
-???
-Importance of feedback vs application callback
----
-.left-column[
-## Implementing rubber banding]
-
-.large.right-column[
-```
-Accept the press for endpoint P1; P2 = P1;
-Draw line P1-P2;
-Repeat
-  Erase line P1-P2;
-  P2 = current_position(); Draw line P1-P2;
-Until release event;
-Act on line input;
-```
-]
-???
-Discuss! 
-Not event based
-Not in the basic event/redraw loop
-Potentially locks up the system
----
-.left-column[
-## Implementing rubber banding]
-.right-column[
-Need to get around this loop <br> absolute min of 5 times / sec
-
-– 10 times better
-
-– more would be better
-]
-???
-aside -- why 5-10 times per second?
-
----
-.left-column[## Event driven code]
-.right-column[
-Needs to respond to events as they arrive
-
-Needs to maintain state between events 
-
-]
-
----
-.left-column[
-# Solution: Propositional Production Systems]
-.right-column[
-
-<div class="mermaid">
-graph LR
-S((.)) --> A((A))
-A -- "Event/Callback()" --> B((B))
-B -- "Event2/Callback2()" --> C[C]
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-
-
-class S invisible
-class A start
-class C finish
-class B normal
-</div>
-
-Special circle start state <br> (arrow going into it)
-
-Special circle for 'final state' <br> (really means 'reset to start')
-
-Transitions represent actions (callbacks).
-
-]
-???
-
----
-.left-column[
-# PPS Example: Rubber Banding
-
-
-Compare to previous implementation: 
-
-```
-Accept the press for endpoint P1; P2 = P1;
-Draw line P1-P2;
-Repeat
-  Erase line P1-P2;
-  P2 = current_position(); Draw line P1-P2;
-Until release event;
-Act on line input;
-```
-]
-.right-column[
-
-- Determine the Events (triggers)
-
-- Determine the States
-
-- Determine the Actions
-
-- Determine the Queries
-]
----
-.left-column[
-# PPS Example: Rubber Banding
-
-Compare to previous implementation: 
-
-```
-Accept the press for endpoint P1; P2 = P1;
-Draw line P1-P2;
-Repeat
-  Erase line P1-P2;
-  P2 = current_position(); Draw line P1-P2;
-Until release event;
-Act on line input;
-```
-]
-.right-column[
-
-<div class="mermaid">
-graph LR
-S((.)) --> A((Start))
-A -- "Mouse Down:?inView/Start_Line()" --> B((Drawing))
-B -- "Mouse_Move:?inView/Update()" --> B
-B -- "Mouse_Release:?inView/Finish_Line()" --> C[Finished]
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-
-class S invisible
-class A start
-class C finish
-class B normal
-</div>
-
-]
-
-???
-  Means: When you are in Start State, and a Mouse Down event arrives, do
-  the action ```Start_line()``` and go to Drawing State. Then update
-  the line end point position every time the mouse moves. Finally,
-  when it releases (Mouse Release event), finish the line (at this
-  stage a callback to the application might be appropriate)
-
-- translates input sequence into action!
-- How could we provide a better affordance?
-- Does it matter if we are using a mouse or a touch screen?
-
----
-
-.left-column[##Summary]
-.right-column[
-State machines are very good (for this job) but do have limits
-
-State machines don't handle independent actions very well (state explosion)
-
-Mostly useful for smaller things
-
-- Great for individual components
-- Not so great for whole dialogs
-
-Path of least resistance is rigid sequencing
- Ask: is this good for what I am doing?
-
-]
-???
-xxx TODO decide whether to keep
-xxx TODO decide how to end this deck and/or what other material needs
-to be covered
----
-.left-column[## Guards on transitions]
-.right-column[
-Sometimes also use “guards” --> **Propositional Production System**
-
-- predicate (Boolean expr) before event
-
-- adds extra conditions required to fire
-
-- typical notation: pred : event / action
-
-- e.g. button.enabled: press-inside / A
-
-Note: FSM augmented with guards is Turing complete 
-]
----
-
-.left-column[
-## PPS for Button?
-
-![:img FB Messenger Animation, 100%](img/messenger-bubble.gif)
-
-]
-.right-column[
-- Determine the Events (triggers)
-
-- Determine the States
-
-- Determine the Queries (essential geometry, context)
-
-- Determine the Actions
-]
-
-???
-What constitutes an “event” varies
-
-- may be just low level events, or
-- higher level (synthesized) events
-- e.g. region-enter, press-inside
-
-What is missing? Query fields 
-
----
-.left-column[
-## Facebook Button Solution
-![:img FB Messenger Animation, 100%](img/messenger-bubble.gif)
-]
---
-.right-column[
-
-Press:?inside => highlight(), start_animation(), small, active<br>
-AnimateStep ==> update(), active<br>
-AnimateFinish ==> !small, active<br>
-Release:inside,small => unhighlight(), exit()<br>
-Release:inside,!small => add_to_chat(), small, unhighlight(),
-exit()<br>
-
-__rest is unknowable from this animation__
-
-<div class="mermaid">
-  graph LR
-  S((.)) --> A((Start))
-  A -- "Press:?inside/highlight(), start_animation()" --> B((Active))
-  B -- "AnimateStep,update()" --> B
-  B -- "AnimateFinish,!small"--> B
-  B -- "Release,inside:small, unhighlight" -->D(End)
-  B -- "Release,inside:!small,add_to_chat(),unhighlight()" --> D
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-linkStyle 4 stroke-width:4px;
-linkStyle 5 stroke-width:4px;    
- 
-class S invisible
-class A start
-class D finish
-class B normal
-</div>
-
-]
-
----
-.left-column[
-## When to use PPSs
-]
-.right-column[
-
-- You're probably already using them, just not intentionally (and maybe
-less well as a result)
-- PPSs are a good way to do control flow in event driven systems
-
-Can do (formal or informal) analysis
-- are all possible inputs (e.g. errors) handled from each state
-- what are next legal inputs: can use to enable / disable
-Can be automated based on higher level specification
-]
-
----
-.left-column[
-## Implementation of PPS
-]
-
-???
-```
-fsm_transition(state, evt) switch (state)
-
-..case 0: // case for each state
-
-...switch(evt.kind)
-
-...case loc_move: // transition event
-
-....do all the transition actions
-....state = 42 // set the new state
-
-..case 1: // case for next state switch (evt.kind) ...
-
-return state;
-```
-
----
-layout: false
-
-.title[Exercise: Build your own color picker]
-.body[
-Learning goals: 
-- Create non-rectangle interactor
-- Use a state machine to manage feedback
-- Callbacks: React to events
-- Should handle error cases appropriately
-
-Android learning goals:
-- Save app state
-- Handle touch input properly
-- Understand app lifecycle
-]
-???
-
----
-.title[Color Picker PPS ]
-
-.body[Work in pairs on this]
-
----
-.left-column[![:img Picture of a menu with two items pulled down, 105%](img/menu.png)]
-
-.right-column[
-## Another example: Pull-down Menu
-
-How do we manage the drop-down behavior?
-
-FSM controller?
-
-]
-
---
-.right-column[
-Behavior:
-
-- Body pulls down on press (in arrow)
-
-- Body stays down until release
-
-- Items highlighted while cursor is over them
-]
----
-![:img Picture of a menu with two items pulled down, 25%](img/menu.png)
-
-<div class="mermaid">
-  graph LR
-  A((Start)) -- "Dn-inside-Top/Drop()" --> N((NotIn))
-  N -- "Enter-Item1/Highlight(1)" --> I((In1))
-  I -- "Enter-Item2/Highlight(2)" --> II
-  N -- "Enter-Item2/Highlight(2)" --> II((In2))  
-  I -- "Exit-Item1/Highlight(none)" --> N
-  II -- "Enter-Item1/Highlight(1)" --> I
-  I -- "Up/Fire-Item(1)" -->E((End))
-  II -- "Up/Fire-Item(2)"-->E((End))
-  II -- "Exit-Item2/Highlight(none)" --> N
-  N -- "Up/UnDrop()" --> F((End))
-</div>
-
----
-.title[ Summary]
-.body[
-- Interaction technique: involves input AND feedback
-- Propositional Production Systems let us implement feedback
-  - event driven
-  - actions on **transitions**
-  - guards (conditionals) on **transitions**
-]
----
-#End of Slides / Old material below here
----
-.left-column[# Discussion of state explosion]
-.right-column[
-Take a button, and a control key (can you draw the state machine for
-the control key?)
-]
---
-.right-column[Combine them (cross product)]
-
-
-<div class="mermaid" id="simplestate">
-  graph TD
-  A(( )) --> B(( ))
-  B --> A
-</div>
-
-<div class="mermaid">
-  graph LR
-  A(( )) --> B(( ))
-  B --> C(( ))
-  C --> B
-  C --> D(( ))
-  B --> End(( ))
-</div>
-
----
-.left-column[# Cross product of state diagrams]
-.right-column[
-Replicate the larger one
-
-Once for every state in the smaller one!
-
-At transitions between corresponding states
-
-Correct semantics
-  - Eliminate impossible states
-  - Merge similar ones
-
-
-Now add another independent machine (shift key?)
-
-]
-???
-Totally out of hand -- combinatorical explosion!
diff --git a/slides/unused/unused.html b/slides/unused/unused.html
deleted file mode 100644
index 8292316c4988413bc4b116286959ff8736a86b1c..0000000000000000000000000000000000000000
--- a/slides/unused/unused.html
+++ /dev/null
@@ -1,965 +0,0 @@
----
-layout: presentation
-title: Introductory Slides--Week 1, Monday--
-description: Introductory slides for Interaction Programming, CSE 340
-class: middle, center, inverse
----
-# Text quirks
-
-- Each glyph has a reference point that defines a baseline
-- Each glyph has an advance width (distance to next glyph's reference point)
-
-![:img examples of reference point and advance width,40%](img/reference.png)
----
-# Text quirks
-
-- Each glyph has a reference point that defines a baseline
-- Each glyph has an advance width (distance to next glyph's reference point)
-- font has standard ascent and descent
-
-![:img letter p with ascent and descent marked,60%](img/ascent.png)
----
-.title[Text quirks]
-.body[
-- Each glyph has a reference point that defines a baseline
-- Each glyph has an advance width (distance to next glyph's reference point)
-- Font has standard ascent and descent
-- Font has 'leading' (distance between lines)
-]
---
-.title[Why am I telling you all this?]
-.body[
-- Where is (0,0) of text when you call [drawText()]("https://developer.android.com/reference/android/graphics/Canvas.html#drawText(java.lang.CharSequence,%20int,%20int,%20float,%20float,%20android.graphics.Paint")? 
-- What should you set up in [Paint](https://developer.android.com/reference/android/graphics/Paint)?
-]
- 
----
-# Other Paint properties
-
-- Transparency and composition characteristics: Alpha value and `xfermode`([Porter-Duff](https://developer.android.com/reference/android/graphics/PorterDuffXfermode))
-???
-When the alpha channel is 1, the image is fully there, when it is 0,
-the image isn’t there at all, and when it is in between, the image is
-partially there. In other words, the alpha channel describes the shape
-of the image, it does not describe opacity. The way to think of images
-with an alpha channel is as irregularly shaped pieces of cardboard,
-not as colored glass.
-
---
-<br>![:img source image with triangle on transparent background,10%](img/source.png)
-![:img destination image with & on transparent background,10%](img/dest.png)
-![:img diagram of pixel relationships,10%](img/diagram.png)
---
-
-- Each type of pixel can be treated differently. 
-
---
-<br>![:img Both should be blue and source red, 10%](img/destatop-diagram.png)
-![:img result: just part shows,10%](img/destatop.png)
-![:img Both should be pink and source orange and dest red, 10%](img/colordodge-diagram.png)
-![:img result: pink triangle with blue and,10%](img/colordodge-both.png)
-???
-Dest blend mode, atop source, limited to pixels in dest, colors blue and orange
-Color Dodge blend mode, pixels from both kept, colors pink and blue and orange
-
-The general formula is an area weighted average:
-
-Asrcâ‹…[s]+Adestâ‹…[d]+Abothâ‹…B(s,d)
-
-where [s] and [d] are the source and destination colors respectively
-or 0, and B(s,d) can be chosen from a set of formulas
-
-alpha channel is
-Asrcâ‹…[as]+Adestâ‹…[ad]+Abothâ‹…[ab]
-
-where [ab] is determined by the blend mode. 
-
----
-# How does Canvas work?
-
-  - Handles __clipping__ of drawing boundaries
-
-???
-Clipping is super efficient if limited to a rectangle
-Implications for GUI design
---
-
-  - Performs __transformations__ on drawn visual elements
-
----
-# Work through clipping example (bell)
-.left[
-- For draw
-- For redraw
-]
-.right[
-![:img Picture of a very simple interface showing a ringing bell at
-left and an x at right to close the window with the words Google
-Calendar reminder Christian and Anind (Jen Mankoff) is starting at
-12:30pm. Video call between them, 70%](img/interface.png)
-
-]
----
-# Coordinate Transformations in Android
-
-```java
-  Canvas c = new Canvas();
-
-  // Set the drawing boundary
-  c.setClippingRect(100, 50, 200, 100);
-
-  // Draw the shape
-  c.drawRect(0, 0, 50, 50);
-
-  // Move origin to where shape's top-left corner is
-  c.translate(100, 50);
-
-  // Draw another Rect inside the Rect just drawn
-  c.drawRect(10,10,10,10);
-
-  // Return state back to before the translation & clipping
-  c.restore();
-```
----
-Which of the following must a parent component do before passing a
-drawable region to the child? [raise your hands]
-
-- [a] Translate (child.x, child.y)
-- [b] Clip(parent.x, parent.y, parent.w, parent.h)
-- [c] Translate (-child.x, -child.y)
-- [d] Clip(0,0,child.w,child.h)
-
----
-.left-column[
-# Aside: Interactors: Significant Stagnation
-
-- Basic GUI components invented 1970s
-- Windows, Icons, Menus, Pointers (“WIMP”)
-- “Perfected” by Macintosh in 1984
-- Not much change since then (even with web)
-]
-.right-column[
-## Most GUIs still use the same 7-10 interaction techniques
-
-![:img Picture of a very old mac control panel showing typical interactors at the time,80%](img/mvc/interactors1.png)
-]
-???
-- Work well, uniform
-- Good for usability
-- GUI is victim of its own success
-- Opportunities lost by not customizing interaction techniques to tasks
-- Hard for better techniques to get traction
-- Only very recently with mobile devices (touch based) have we seen lots of new techniques get a major foothold
----
-.title[In class Exercise: Interface Developer]
-.body[
-Let's look at interactors in Android Studio
-![:img A picture of the setup for android study in which we can layout
-components,80%](img/mvc/android-components.png)
-]
-???
-Menu, Button(types), Slider, Scrollbar, Spinner, List box, Icon, Link,
-Text box, Label,
----
-.title[In class Exercise]
-.body[
-Quick Tour | tutorial
-for [building a ui](https://developer.android.com/training/basics/firstapp/building-ui)
-
-![:img A picture of the setup for android study in which we can layout
-components,80%](img/mvc/android-components2.png)
-]
-
----
-# Multiple Simultaneous Animations (`AnimatorSet`)
-
-```java
-  // Create animator set
-  AnimatorSet bouncer = new AnimatorSet();
-
-  // Add the good stuff
-  bouncer.play(bounceAnim).before(squashAnim1);
-  bouncer.play(squashAnim1).with(squashAnim2);
-  bouncer.play(squashAnim1).with(stretchAnim1);
-  bouncer.play(squashAnim1).with(stretchAnim2);
-  bouncer.play(bounceBackAnim).after(stretchAnim2);
-
-  // Animate the alpha value from 1->0
-  ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
-  fadeAnim.setDuration(250);
-
-  // Build up a another level of animation sets
-  AnimatorSet animatorSet = new AnimatorSet();
-  animatorSet.play(bouncer).before(fadeAnim);
-
-  // Starts the animations
-  animatorSet.start()
-```
----
-# Declaring Animations in XML
-
-```
-/res/animator/object_animator_ex.xml
-```
-```xml
-<set android:ordering="sequentially">
-    <set>
-        <objectAnimator
-            android:propertyName="x"
-            android:valueTo="200"/>
-        <objectAnimator
-            android:propertyName="y"
-            android:valueTo="300"/>
-    </set>
-    <objectAnimator
-        android:propertyName="alpha"
-        android:valueTo=".5f"/>
-</set>
-```
-
-.footnote[Can do even *more* with ValueAnimator XML (will let you google this)]
-
----
-# There's more flexibility... (3/3)
-
-You can then run the animation by doing the following:
-
-```java
-  Animator anim = (Animator) AnimatorInflater.loadAnimator(this,
-      R.animator.object_animator_ex);
-  anim.setTarget(myObject);
-  anim.setDuration(2000);
-  anim.start();
-```
-
-Note that animations xml files should be in the `res/animator/` directory
-
----
-# Make sure the animation info is inside of:
-```xml
-<?xml version="1.0" encoding="utf-8"?>
-<set xmlns:android="http://schemas.android.com/apk/res/android">
-<!-- ... -->
-</set>
-```
-
----
-# An Aside: What is an Inflater?
-
-You will use these often! They give you access to XML data (part of
-the *model* of your application). Just saw an 
-[AnimatorInflater](https://developer.android.com/reference/android/animation/AnimatorInflater)
-in the previous code.
-
-```java
-[Type] [name] = ([Cast to Type]) [Inflator].load...([arguments])
-```
-Will need the *path* to the part of the XML you care about, typically
-something like:
-```
-R.[dirname].[filename]
-```
-Specifics vary from situation to situation (*e.g.,* [LayoutInflater](https://developer.android.com/reference/android/view/LayoutInflater)
-works slightly differently), so you'll need to read the documentation.
-]
-
-
----
-.title[Interactor (Component) Model]
-.body[
-__Encapsulate interactive components__ (interactors)
-- Component library (button, slider, container)
-- Interface built as a hierarchy of components
-
-__Components drawn by underlying graphics library__
-- Input event generation and dispatch
-- Historically mouse & keyboard, now touch, ...
-
-__Bounds management & damage/redraw__
-- Model geometry, redraw updated regions only
-]
-
----
-template: inverse
-
-# Saving State
----
-layout: false
-
-.left-column[## When to save state? (1/3)]
-.right-column[
-- Activity `A` spawns Activity `B`
-  - E.g. Typing a Facebook post, then you select 'Add a Location'
-]
---
-.right-column[
-- Android kills `A` to reclaim resources while the user is interacting with `B`
-]
---
-.right-column[
-- User finishes with `B`, returns to `A` but the post is gone!
-]
----
-.left-column[## Activity Lifecycle]
-.right-column[![:img Android activity lifecycle, 50%](img/viewupdate/activity_lifecycle.png)]
-
----
-
-.left-column[## When to save state? (2/3)]
-.right-column[![:img Android activity state diagram, 50%](img/viewupdate/android-activity-states-01.png)]
-
----
-
-.left-column[## When to save state? (3/3)]
-.right-column[![:img Android activity state diagram -- process killed, 50%](img/viewupdate/android-activity-states-02.png)]
-
----
-.title[ Maintaining Activity State]
-.body[
-- We can fix it by saving the state in a `Bundle` before Android closes the `Activity`
-
-- We then restore the state when we return to the `Activity` later
-]
----
-
-.title[# Bundle it up]
-.body[
-- `Bundle`: A hash map (dictionary) of String keys to Primitive, Parcelable, Serializable values
-]
---
-.body[
-- Used to:
-  (1) Save/restore state
-  (2) Transfer data between different `Activity` in an app
-]
---
-.body[
-- Primitive are `int`, `float`, `boolean`, `double` (the usual suspects)
-]
----
-.left-column[
-## Saving in the Bundle
-]
-.right-column[
-Methods for _saving_ items out of a Bundle
-
-- Ints: `putInt(String key, int value)`
-- Floats: `putFloat(String key, float value)`
-- Characters: `putChar(String key, char value)`
-- Strings: `putString(String key, String value)`
-- Serializable Objects: `putSerializable(String key, Serializable value)`
-- Parcelable Objects: `putParcelable(String key, Parcelable value)`
-- _Others in the documentation (e.g. Arrays, Bytes, etc).._
-]
-.footnote[[Bundle Documentation](    https://developer.android.com/reference/android/os/Bundle.html
-)]
----
-.left-column[
-## Retrieving from the Bundle
-]
-.right-column[
-Methods for getting items out of a Bundle
-
-- Ints: `getInt(String key)`
-- Floats: `getFloat(String key)`
-- Characters: `getChar(String key)`
-- Strings: `getString(String key)`
-- Serializable Objects: `getSerializable(String key)`
-- Parcelable Objects: `getParcelable(String key)`
-- _Others in the documentation_ (e.g. Arrays, Bytes, etc)..
-]
-.footnote[[Bundle Documentation](    https://developer.android.com/reference/android/os/Bundle.html
-)]
----
-.left-column[
-## Saving Activity State (1/3)]
-.right-column[
-- Android provides the `onSaveInstanceState(Bundle savedInstanceState)` callback method for you to save the state of an `Activity`
-
-```java
-private static final USERNAME_KEY = "USER_NAME_KEY";
-private static final FIB_SUM_KEY = "FIB_SUM_KEY";
-
-private int mFibSumValue; // Set to 10295 by our user
-private String mUsername; // Set to "Prabha" by our user
-
-@Override
-public void onSaveInstanceState(Bundle outState) {
-    // Always call super - your super classes could be saving state for you!
-    super.onSaveInstanceState(outState);
-
-    // Now
-    outState.putInt(FIB_SUM_KEY, mFibSumValue);
-    outState.putString(USERNAME_KEY, mUsername);
-}
-```
-]
----
-.left-column[
-## Restoring Activity State (1/2)
-]
-.right-column[
-- We saved, and now our user goes off to some other app
-]
---
-.right-column[
-- Android kills our `Activity`
-]
---
-.right-column[
-- Now how do we get the _saved_ state back?
-]
----
-.left-column[
-## Restoring Activity State (2/2)]
-.right-column[
--  Two ways:
-  - `onCreate(Bundle savedInstanceState)`
-  - `onRestoreInstanceState(Bundle savedInstanceState)`
-]
----
-.left-column[
-## Restoring in `onCreate` vs. `onRestoreInstanceState`
-]
-.right-column[
-- `onRestoreInstanceState`
-  - Guarantees you will never have a non-null `Bundle` when called
-  - Lets subclasses override the behavior of restoring the state
-
-- `onCreate`
-  - Lets you focus on doing all of your initialization in one place
-
-- In the assignment we use onCreate
-]
-.footnote[[Stackoverflow conversation on this](http://stackoverflow.com/questions/36408776/using-oncreate-vs-onrestoreinstancestate)
-]
----
----
-# Saving state: advanced material
----
-
-- Custom objects that implement the `Serializable` or `Parcelable` interfaces
-  - You will need to make any custom classes that you want to save into a `Bundle` implement the `Parcelable` interface
-
----
-
-# Parcelable vs. Serializable
-
-- Both are for the same purpose of saving but `Serializable` makes implementations much easier...
-
---
-
-- **EXCEPT, .red[you should almost always use `Parcelable`]**
-
---
-
-- Why?
-  - `Serializable` uses introspection ==> more memory, and CPU cycles
-  - `Parcelable` **is optimized for mobile devices**
-
----
-## Implementing `Parcelable` (1/3)
-
--- You are required to implement the following methods for the `Parcelable` interface:
-
-```java
-public class MyPersonModel implements Parcelable {
-    private int mAge;
-
-    // Required for the interface
-    public int describeContents() {
-        return 0;
-    }
-
-    // Required for the interface
-    public void writeToParcel(Parcel out, int flags) {
-        out.writeInt(mAge);
-    }
-    // Continued on next slide...
-```
-
----
-
-## Implementing `Parcelable` (2/3)
-
-```java
-
-    // Required for the interface
-    // CREATOR is an object that can remark
-    public static final Parcelable.Creator<MyPersonModel> CREATOR
-            = new Parcelable.Creator<MyPersonModel>() {
-        public MyPersonModel createFromParcel(Parcel in) {
-            return new MyPersonModel(in);
-        }
-
-        public MyPersonModel[] newArray(int size) {
-            return new MyPersonModel[size];
-        }
-    };
-
-    // Required for the interface
-    // Private constructor for Android to use with your CREATOR
-    private MyPersonModel(Parcel in) {
-        mAge = in.readInt();
-    }
-}
-```
----
-
-## Implementing `Parcelable` (3/3)
-- **Note**: .red[the order of the values when writing and reading them matters!]
-
-  - When you write to the parcel using `write*()` methods in `writeToParcel`,
-
-  - The write order __MUST BE__ the same as when you read them in the private constructor
-
-- For more details on implementation:
-  https://developer.android.com/reference/android/os/Parcelable.html
-
----
-## example code for restoring state
-
-
-```java
-private static final USERNAME_KEY = "USER_NAME_KEY";
-private static final FIB_SUM_KEY = "FIB_SUM_KEY";
-
-private int mFibSumValue = 0;
-private String mUsername = null;
-
-@Override
-protected void onCreate(Bundle savedInstanceState) {
-  super.onCreate(savedInstanceState);
-  setContentView(R.layout.activity_main);
-
-  mMainTextView = (TextView) findViewById(R.id.text_main_title);
-  mSumTextView = (TextView) findViewById(R.id.text_sum);
-  // Check if there was a previously saved state to restore to the user
-  // A non-null bundle means there was a state that was saved previously
-  // A bundle is just a Key-Value pairing - its a hash map :)
-  if (savedInstanceState != null) {
-    // There was a previous state - time to restore
-    mFibSumValue = savedInstanceState.getInt(FIB_SUM_KEY);
-    mUsername = savedInstanceState.getString(USERNAME_KEY);
-  }
-  updateMainText();
-  updateFibSumText();
-}
-```
----
-## example code for restoring state
-
-```java
-private static final USERNAME_KEY = "USER_NAME_KEY";
-private static final FIB_SUM_KEY = "FIB_SUM_KEY";
-private int mFibSumValue = 0;
-
-@Override
-protected void onRestoreInstanceState(Bundle savedInstanceState) {
-  super.onRestoreInstanceState(savedInstanceState);
-  // Check if there was a previously saved state to restore to the user
-  if (savedInstanceState != null) {
-    // There was a previous state - time to restore
-    mFibSumValue = savedInstanceState.getInt(FIB_SUM_KEY);
-    mUsername = savedInstanceState.getString(USERNAME_KEY);
-  }
-  updateMainText();
-  updateFibSumText();
-}
-```
----
----
-## Exercise: Parcelable and Activity State
-
-- Pair up!
-
-- Download the base code here:
-
-- This app lets a user enter a name, age, and favorite food
-
-- It stores this info in a `PersonModel`
-
-- When the app is killed, this information needs to remain edited
-
-- Implement the `Parcelable` interface for the PersonModel
-
-- Then use the Activity's relevant state change callbacks to `PersonModel` when the phone rotates
-
----
-### Some Notes about `onSaveInstanceState()`
-- .red[Only use to save and restore session variables and the state of the UI]
-
---
-
-  - Android won't always trigger the method
-
---
-
-  - It is called when the `Activity` is closed and _expected_ to be restored soon
-
---
-
-- If your app crashes, or is closed, **the values in the bundle will disappear!**
-
---
-
-- If you use custom views, you can implement their version of `onSaveInstanceState`:
-
-  Android will call `onSaveInstanceState()` every view in the layout
-
----
-.left-column[
-## Essential Behavior Quiz question
-PPS Parts?
-- Action	
-- Input modifier
-- Input Event
-- Query field (Condition)
-- State
-]
-.right-column[
-![:img Picture of first quiz question asking "What sort of interaction does this PPS support?" and showing a state machine for drawing a line with updates to the line on every move event. Most people correctly understood a line with rubber banding., 100%](img/viewupdate/quizqs.png)
-]
-
-
----
-layout: false
-
-# Affordance
-
-Opportunities to act
-- which are readily apparent to the user ... and appropriate to the
-  user’s abilities 
-
-Form “affords” certain actions and makes that apparent
-
-Allows and promotes certain actions
-
-- Door knobs afford turning
-- Handle of hammer affords grasping in a particular way
-]
-
----
-# Affordance Example: Knurling
-
-.left-column[
-![:img Picture of a knob with ridges around it, 80%](img/interaction/knurling.png)
-
-]
-.right-column[
-Small ridges typically found on knobs
-
-Increases friction
-
-Affords grip
-]
-
----
-# “Virtual affordances”
-
-.left-column[
-![:img Picture of a digital window corner ridges drawn on it, 80%](img/interaction/virtual-knurling.png)
-]
-
-.right-column[
-Don’t typically have much physical form in a GUI
-
-But, visual appearance can still suggest function
-]
---
-.right-column[
-Note that you don’t have to know about knurling for this to afford
-“grip” with the mouse
-]
----
-# Feedback
-
-Response by the system to the actins of the user – Cause and effect
-
-- Essential for forming mental models
-
-Making “system state” visible
-
----
-# Component design guideline #1
-
-Explicitly design a conceptual model and use affordance and feedback
-(and everything else you have)
-to reinforce it
-
----
-# Performance properties of people
-
-(Only a very few here) How long will things take?
-
-- e.g., physical movements
-
-How much can people remember? How fast are thing perceived?
-
----
-#How long will user actions take
-
-Strong models for physical movement
-
-Fitts’ law predicts movements as a function of distance and required accuracy:
-
-T = A log2(D/S + 0.5) + B D – distance to target
-
-S – size of target
-
-A,B proportionality constant and intercept (linear fit)
-
-– Property of user (motor control group)
-
----
-# Speed Differences Explained
-
-Menu position and design can have a
-significant impact on speed of interaction
-
-Fitts' law is the main
-explanation for this.
-
----
-# Fitts law –
-
-helps to capture the difficulty of input with different devices]
-
-Time = A + B*log2(Dist/Size + 0.5)
-
-“Index of Difficulty”
-
-- Time is linearly proportional to “index of difficulty” (log of what we would intuitively think of as “difficulty”)
-
-  - Proportionality constants depend on muscle group and device
-
-  - Difficulty determined by distance and required accuracy (size of
-target)
----
-.left-column[##Fitts’ law]
-.right-column[
-
-Actual numbers from Fitts’ law generally not all that helpful
-
-- That level of detailed analysis is hard
-
-- Very hard to know what exact distances are across
-
-dynamic layout and varied platforms General guideline
-
-- Keep required movements (accuracy & distance) firmly in mind
- - Avoid device swapping
- - Avoid disturbing focus of attention
-]
----
-.left-column[##Fitts’ law]
-.right-column[
-(True) expert performance tends to be closely related to time required for movements
-
-- not that closely related to learning (or performance) of novices
-
-- still need to consider “cognitive load”
-]
----
-.left-column[##How much can a person remember Short term (working)
-memory]
-.right-column[
-- Famous 7 +/- 2 “chunks” (Somewhat outdated model)
-
-- For us just: “very limited” and “decays quickly” – Has become “worse” with constant multitasking
-
-Long term
-
-– Essentially unbounded
-– But requires effort & may not always work on cue –  Can’t explicitly forget! Even though you try!
-]
----
-.left-column[##How much can a person remember Novice / expert
-differences]
-.right-column[
--  Experts have learned items in long term memory to draw on, novices don’t
-
--  But note that having the ability to operate from recogni2on does not preclude recall
-
-Implication:
-
-- Generally better to rely on recognition (seeing it in front of you)
-than just recall (having to pull it out of long term memory)
-]
----
-.left-column[##How fast are things perceived?]
-.right-column[
-
-less than ~20ms (1/50 sec) discrete images/flashes merge into con2nuous percep2on
-
-- Image you are looking at flickers 60 times per second
-- Differences in peripheral vision
-  - Sabertooth tigers
-]
---
-.right-column[
-Don’t ever have to be faster than this for user response!
-
-Get more than 120 million instructions per core (@3Ghz)
-
-(High end GPU theoretically as high as 26 billion instr.)
- - You can do a lot with that
- -  (First GUIs had ~20K)
- -  Not enough? Twice as many cores in 2-3yrs...
-]
----
-.left-column[##How fast are things perceived?]
-.right-column[
- ~100ms seems like “instant response”
-
-- Hard to tell response times below this apart
-
-- Upper range of eye saccades
-
-Discrete images into steps instead of apparent motion
-]
----
-.left-column[##How fast are things perceived?]
-.right-column[
-
-100ms (1/10 sec)
-
-Except some animation, most things don’t need to be faster than this
-
-- Typical target “cycle time”
-
-- 600 million+ machine instructions, ...
-]
----
-.left-column[##How fast are things perceived?]
-.right-column[
- 1-2 seconds typically “good response time”
-
--  Similar times in conversa2onal turn taking protocols
-
--  Longer delays ~5 sec have to say something to keep conversation alive
-
-(Note: numbers fuzzier as we go out)
-]
----
-.left-column[##How fast are things perceived?]
-.right-column[
-10-15 sec is typically “bad response time” – STM decay effects
-]
----
-.left-column[##A liMle about response times]
-.right-column[
-Good vs. bad response time
-is very dependent on expecta2on
-
--  If you can’t meet the goals, manipulate user expectations!
-
-Consistency of response is very important
-
-- Can be more important than
-time
-]
----
-.left-column[##How long do other cognitive activities take?]
-.right-column[
-Unfortunate, but...
-
-–  Things known, but overall not as well understood –  Much harder to apply what is understood
-
-–  See other HCI courses for some of this
-]
----
-.left-column[##We do know essen2ally minimums]
-.right-column[
-“Cycle” times for “Human Processor”
-(Model Human Processor [Card, Moran, Newell])
-
-- Perceptual ~100ms [50-200]
-
-- Cognitive ~70ms [25-170]
-
-- Motor ~70ms [30-100]
-
-Can be used to predict reaction times and highly routine actions
-
-- E.g., it takes at least ~150ms to
-act on something (~250ms more likely)
-
-Harder to use for complex things and/or with learning
-
-]
----
-.left-column[##When do these rules break down?]
-.right-column[
--  Novices
--  Disabled
- ]
-
----
-XX add some active learning?
-XX add something about color perception here or earlier?
-
-
----
-# Case Study: Text Entry Speed on Mobile Devices
-
-.left-column[
-![:img Picture of phone keypad with buttons laid out in rows of "1 2 3 - 4 5
-6 - 7 8 9 - * 0 #", 100%](img/pm/buttons.png)
-]
-.right-column[
-Multi-tap
-```
-77 88 444 222 55 0 22 777 666 9 66 0 333 666 99
-q u i c k _ b r o w n _ f o x
-```
-
-Slow, lot's of overhead
-]
-
----
-# Case Study: Text Entry Speed on Mobile Devices
-.left-column[
-![:img Picture of phone keypad with buttons laid out in rows of "1 2 3 - 4 5
-6 - 7 8 9 - * 0 #", 100%](img/pm/buttons.png)
-]
-.right-column[
-Multi-tap (~ 20 WPM)
-```
-77 88 444 222 55 0 22 777 666 9 66 0 333 666 99
-q u i c k _ b r o w n _ f o x
-```
-
-T9 - dictionary based disambiguation (~ 20 WPM)
-```
-7 8 4 2 5 0 2 7 6 9 6 0 3 6 9
-q u i c k _ b r o w n _ f o x 843 78425 27696 369 58677 6837 843 5299 364
-the quick brown fox jumps over the jazz dog
-tie stick crown lumps muds tie lazy fog
-vie vie
-```
-]
-???
-Most common word (top) not always right
----
-# Case Study: Text Entry Speed on Mobile Devices
-
-.left-column[
-![:img Picture of phone keypad with swype enabled and the swype for quick shown, 100%](img/pm/swype.jpg)
-]
-.right-column[
-Method | Speed
-----|----
-Multi-tap | ~ 20WPM
-T9 - dictionary based disambiguation | ~ 20 WPM
-Swype | ~ 55 WPM
-Keyboard | ~ 55 WPM
-Flesky | Up to 80 WPM ([Guinness World Record!](https://www.cnn.com/2014/05/15/tech/mobile/guiness-record-fastest-text/) )
-Speech | ~ 150 WPM
-
-Skeptical? Need to know % errors and time cost of error correction to truly evaluate
-]
-
-???
-Flesky is combination of gestures and automatic error correction
-
diff --git a/slides/wk01/drawing.html b/slides/wk01/drawing.html
deleted file mode 100644
index ef29741325c58b757b4616b11ea65b820961d186..0000000000000000000000000000000000000000
--- a/slides/wk01/drawing.html
+++ /dev/null
@@ -1,701 +0,0 @@
----
-layout: presentation
-title: Drawing On the Screen
-description: Discussion of basic information about how to draw on the screen
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Introduction to Drawing
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout: false
-
-[//]: # (Outline Slide)
-# Today's goals
-
-- Administrivia
-- Warmups
-  - Checks for understanding
-  - Practicing with breakouts, polleverywhere, and Ed
-- Quick view of resources
-- Abstractions for drawing on the screen
-- Drawing in Android
-- Clipping and other transformations
-
----
-# Administrivia
-
-- Please remember to take the first day [survey](https://catalyst.uw.edu/webq/survey/bricker/387508) if you have not already
-- Ed-iquette
-  - Please tag your posts with the most appropriate tag, e.g., if you are posting about doodle
-  please tag it with as1-doodle
-  - Please search to see if someone has already answered your question before posting! (these tags can help!)
-- Lab videos were posted
-- Important [Ed Post about a change to Part1.java](https://us.edstem.org/courses/381/discussion/24015)
-
----
-# Trying new things!
-
-1. Breakout rooms
-  - Today I've randomly assigned you to breakout rooms with one TA each.
-  - In the future, we will experiment with a system where you can choose your breakout partners
-  - Goal: Meet other students, answer some questions.
-    - Please turn your cameras on in the breakouts
-    - Introduce yourself, and say what color socks your wearing.
-    - Work together on the question posed....
-2. Warmup 1: pollev.com/docbrick
-   - answer the question
-   - try to think of a one unique answer per person in your breakout
-   - Each person should answer the poll separately
-   - We'll come back together and see the results.
-3. Warmup 2: Ed sway
-  - We'll go back into the breakout rooms and try to work together to answer questions on Sway
-  - Each person should submit their answers.
-
----
-
-Warmup 1
-
-<iframe src="https://embed.polleverywhere.com/free_text_polls/gmZBJAx5kjHZQkO16zRve?controls=none&short_poll=true" width="800" height="600" frameBorder="0"></iframe>
-
-
----
-# Quick view of resources
-
-One commong "Good Programming Practice" is to remove "static" resources from your code and
-store them in a resource area to be used by your program. Think of this like the "No Magic Numbers"
-principle you learned early in 142).
-
-- Often used in internationalization or localization
-- Often used in A/B testing in software development
-
-Android resources are stored in `.xml` files in subdirectories of the `app/res` directory may include
-- `drawable` - images you might draw on the screen in various formats
-- `layout` - layouts of various screens
-- `menu` - the menus for your application
-- `values` - might contain `colors.xml` and `strings.xml`
-
----
-## Developer roles
-
-.left-column[
-
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-
-  class t,l,a,w yellow
-  class ip green
-</div>
-]
-
-.right-column[
-From [last class](toolkits.html) we briefly discussed of the roles
-a developer can play in app development.
-
-- Today we're going to focus on being an Interface Developer (adding existing components like
-`ImageView` objects to the `doodleView`)
-- We might get to touch on being a Component Developer and thinking about how to create that new
-`LineView` component
-]
-
-
----
-# Drawing on the Screen
-
-- Take out your phone. Open an App. What do you see on your screen?
----
-# Drawing on the Screen
-
-- Take out your phone. Open an App. What do you see on your screen?
-
-.left-column[
-![:img Example poll everywhere mobile presenter application screen, 100%](img/drawing/pollevscreen.jpeg)]
-
-.right-column[
-(this is what I currently see)
-
-What is an app made up of?
-]
----
-# What is on your screen?
-
-.left-column[
-![:img Example poll everywhere mobile presenter application screen, 100%](img/drawing/pollevscreen.jpeg)
-]
-
-.right-column[
-App is made up of? Interactors
-
-Last class we discussed the "tree" of components.
-
-Think about what this hierarchy might look like.
-- What is at the "root" ?
-- How is this divided up into sections
-- In each section, how are things further divided up?
-
-
-]
-
----
-# What is on your screen?
-
-.left-column[
-![:img Example poll everywhere mobile presenter application screen, 100%](img/drawing/pollevscreen.jpeg)]
-
-.right-column[
-<div class="mermaid" style="width: 75%">
-graph LR
-W(Window) --> T[Title Bar]
-W --> L[Label: My Folders]
-W --> F[Folders]
-W --> B[Toolbar]
-T --> TA[Icon]
-T --> TB[Label: Activities]
-T --> TC[Button: Search]
-T --> TD[Button: Folder]
-T --> TE[Button: Add]
-F --> F1[Folder 1]
-F --> F2[Folder 2]
-F --> F3[Folder 3]
-F1 --> I[Icon]
-F1 --> N[Folder Name]
-F1 --> C[Activity Count]
-B --> H[Button:Home]
-B --> A[Button: Activities]
-B --> R[Button: Reports]
-B --> P[Button: Profile]
-
-classDef start font-size:12pt,text-align:center
-classDef blue font-size:12pt,text-align:center
-
-class W start
-class T,L,E,F,B,TA,TB,TC,TD,TE,F1,F2,F3,H,A,R,P,I,N,C blue
-
-</div>
-]
----
-# What is on your screen?
-
-.left-column[
-![:img Example poll everywhere mobile presenter application screen, 100%](img/drawing/pollevscreen.jpeg)
-]
-
-.right-column[
-App is made up of? Interactors
-
-What are Interactors made up of?
-
-]
-
-???
-Should push them down to the lowest level on the screen
-
-App is made up of? Interactors
-
-Interactors are made up of? lines, circles, text
-
-Lines, circles and text are made up of? Pixels
-
----
-# What is on your screen?
-
-.left-column[
-![:img Example poll everywhere mobile presenter application screen, 100%](img/drawing/pollevscreen.jpeg)]
-
-.right-column[
-App is made up of? Interactors
-
-Interactors are made up of? lines, circles, text
-
-Lines, circles and text are made up of? Pixels (picture elements)
-]
----
-# Aside: Displaying a Pixel
-
-.left-column30[
-Do you know how pixels are lit up in color or greyscale?
-- on your computer or TV screen?
-- on a projector?
-]
---
-.right-column50[
-[Cathode Ray Tube](https://en.wikipedia.org/wiki/Cathode-ray_tube) |  [LED Display](https://en.wikipedia.org/wiki/LED_display)
-:--: | :--:
-![:img Magnified view of a delta-gun shadow mask color CRT, 90%](img/drawing/CRT_display.jpg) | ![:img Detail view of a LED display with a matrix of red green and blue diodes, 90%](img/drawing/LED_display.jpg)
-
-]
-
-???
-Get them to at least realize that the actual pixels on their
-screen are LEDs
-
-
-
-
----
-# Drawing on the Screen
-
-What are we going to control as we build this application?
-
---
-- Interactors
-
---
-  - from the Toolkit
-  - they know how to draw themselves and possibly react to input
-
---
-In Android, we call these Interactors `Views`
-
-- *Aside: Widgets, Interactors, and `Views` are all variations on the same term*
-
---
-What if you were to build an interactor from scratch?
-
---
-- You'd need basic drawing capabilities from the toolkit such as drawing lines, circles, and so on
-
----
-# Toolkit Support for Basic Drawing
-
-.left-column[
-![:img Example poll everywhere mobile presenter application screen, 85%](img/drawing/DrawingPanel.png)]
-
-.right-column[
-All toolkits have some sort of `Canvas` object or abstraction
-- `Canvas` is an object level abstraction for performing drawing operations
-- Each `View` has a `Canvas` in Android
-- You can access it in the `onDraw(Canvas canvas)` method
-
-When is `onDraw()` called?
-
-]
-
-???
-Connect to DrawingPanel in 143?
-
----
-# Toolkit Support for Basic Drawing
-
-.left-column[
-![:img Example poll everywhere mobile presenter application screen, 85%](img/drawing/DrawingPanel.png)]
-
-.right-column[
-All toolkits have some sort of `Canvas` object or abstraction
-- `Canvas` is an object level abstraction for performing drawing operations
-- Each `View` has a `Canvas` in Android
-- You can access it in the `onDraw(Canvas canvas)` method
-
-When is `onDraw()` called?
-- Handled automatically for you by toolkit
-- Triggered whenever the pixels are *dirty* (there's been a change to what needs to be viewed)
-- You can trigger this with `invalidate()` (we'll use this in the future)
-
-]
-
-???
-Lots to discuss here. Mainly focus on introducing the concept
-of a library (a bunch of views you can pick from, Canvas and its methods, etc)
-
-vs an architecture (which controls when and in what order things happen).
-We'll learn about both in this class. You need to understand both to use a toolkit.
-
----
-# How does Canvas work?
-
-- Drawing is done by calling methods for different kinds of objects
-
---
-
-- For example: `drawRect`, `drawOval`, `drawLine`, `drawPath` ...
-
-  [Full List in the API Documentation](https://developer.android.com/reference/android/graphics/Canvas.html)
-
----
-# How does Canvas work?
-
-- Drawing is done by calling methods for different kinds of objects
-
-- Lots happens under the covers... let's look at an example...
-
---
-
-"I want to draw a line on the screen"
-
---
-
-So I would likely call `drawLine` on the `Canvas`.
-
---
-
-So... how do I tell the computer where the start and end of the line will be?
-
----
-# How is location decided?
-
-- (0,0) is at the top left of the screen
-- The screen is drawn pixel by pixel from top left to bottom right in "raster" lines
-
-![:img Picture of a very old CRT based TV display, 25%](img/drawing/analogtv.jpg)
-![:img Picture of raster scanning going from top left to top right; down a row; and so on, 25%](img/drawing/rasterscanning.png)
-[Source: Wikipedia](https://en.wikipedia.org/wiki/Analog_television#Displaying_an_image)
----
-# How is a drawing object rendered on screen?
-
-- An object (like a line) would be converted into one or more **strokes**
-- A stroke has properties such as width or color
-- The stroke is converted to **pixels** (correspond to dots on your screen)
-- These pixels are put in a `Bitmap` (frame buffer) first, then updated on the screen all at once
-
-???
-top left is from old-style raster graphics, where a beam of light literally moved
-down the screen from top left to bottom right, causing chemical excitation when on
-and thus lighting the screen
-
-the last is left over from when both graphics and drawing were slower and more linear
-Still most reliable approach
-
----
-# How is a stroke converted to pixels?
-- Strokes (can be) size independent. Pixels are not
-- Strokes are continuous. Pixels are not
-- Anti-aliasing
-
-Essentially converting from **vector** to **raster** graphics ([Bresenham's algorithm](https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm))
-
----
-# Quick understanding test
-
-What internal data structure (abstraction) represents an entire
-picture to display on a color screen?
-
---
-pixels in a 2D array
-
-![:img The left side of this image displays the RGB pixel values of the image of GitGrade's Hopper on the right side 3%](img/drawing/pixelcalc.png)
-
-Pixel Calculator (Tanimoto 2010)
-
-???
-
-**A frame buffer (2D array)	(picture)**
-
-The following are wrong, they represent a single pixel (but we haven't studied this yet)
-
-- A pixel (R,G,B)
-- A number from 0 to 255
-
----
-# What is the [Paint](https://developer.android.com/reference/android/graphics/Paint.html) Object?
-
-
-.left-column[
-![:img Picture of a phone screen with a blue and green circle drawn on it at different vertical positions (50 and 150 y center point), 80%](img/drawing/circles.png)
-]
-
-.right-column[A Paint object is an abstraction that determines how drawing operations should look
-```java
-Paint drawPaint = new Paint();
-drawPaint.setColor(Color.BLUE);
-drawPaint.setAntiAlias(true);
-drawPaint.setStrokeWidth(5);
-drawPaint.setStyle(Paint.Style.STROKE);
-canvas.drawCircle(500, 500, 400, drawPaint);
-
-drawPaint.setStrokeJoin(Paint.Join.ROUND);
-drawPaint.setStrokeCap(Paint.Cap.ROUND);
-drawPaint.setColor(Color.GREEN);
-drawPaint.setStrokeWidth(15);
-canvas.drawLine(350, 300, 500,600, drawPaint);
-```]
----
-
-# What is the [Paint](https://developer.android.com/reference/android/graphics/Paint.html) Object?
-
-- Abstraction that determines how drawing operations should look
-  - Drawing style: stroked, filled
-  - Line Characteristics: color, line width, join, cap styles
-  - Fill Characteristics (color)
-
-![:img example dotted line--unfilled,15%](img/drawing/dotted.png)
-![:img example solid filled,15%](img/drawing/filled.png)
-![:img example solid unfilled,15%](img/drawing/unfilled.png)
----
-
-# Other Paint properties
-
-- Text Characteristics: font family, style, size, alignment settings, etc.
-
---
-- font: shapes for chars (called *glyphs*) plus layout
-  - family or typeface
-
-![:img examples of different types of fonts,40%](img/drawing/fonts.png)
-
----
-# Other Paint properties
-
-- Text Characteristics: font family, style, size, alignment settings,
-etc.
-- font: shapes for chars (called *glyphs*) plus layout
-  - family or typeface
-  - style: plain, *italic*, **bold**, **_both_**, ~~strikethrough~~,  *etc.*
---
-
-  - points: 72.27 points per inch
-???
-because french inches were different (72 per inch)
-Really just a guideline these days
-It is the *width* of a capital M (no height specified)
-
----
-# The Path Object
-
-- Canvas supports drawing primitive shapes _and_ arbitrary paths:  `void drawPath(Path p, Paint paint);`
-
---
-
-- Declaring a `Path` can be done by combining basic primitive shapes (e.g rectangles, circles, ovals, curves like arc, cubic, etc.)
-
---
-
-- What drawing model does creating a path in this way correspond to?
- - Raster model
- - Vector model
-
----
-# The Path Object
-
-- Canvas supports drawing primitive shapes _and_ arbitrary paths:  `void drawPath(Path p, Paint paint);`
-
-- Declaring a `Path` can be done by combining basic primitive shapes (e.g rectangles, circles, ovals, curves like arc, cubic, etc.)
-
-
-- Which is more scalable?
-
- - Raster model
- - Vector model
-
-???
-XXXX could do in-class [drawing
-exercise](https://github.com/mriveralee/ssui-mobile-exercises-2016/tree/master/exercises/lab05/CustomDrawing)
-IF time XXXX needs updating
-
----
-# Bounding box of an object
-
-A bounding box (or sometimes [Minimum Bounding Box](https://en.wikipedia.org/wiki/Minimum_bounding_box))
-is a term used in coordinate geometry to describe the smallest rectangular area that contains an object or set of objects.
-
-Great example to play with: https://www.mathopenref.com/coordbounds.html
-
-Drawing Demo - things to think about
-- What is the bounding box of a line that is drawn diagonally
-  - from upper left to lower right?
-  - lower right to the upper left?
-  - from the upper right to the lower left?
-  - from the lower s`
-- What is bounding box of a vertical line?
-- What is the bounding box of a horizontal line?
-
----
-# Doodle assignment: practice with drawing
-
-Inspired by Google's Doodles, and will include animation (to be discussed)
-
-First we will create holders for things you might draw
-- Android already provides an `ImageView` and a `TextView`
-- You will create a `LineView`
-- You will produce some things we specify
-- Then you will have a chance to create any animation you want!
-
----
-# [Example from 19sp](img/drawing/doodlevid.mp4)
-
-.left-column[
-Note that we use a `View` for **each** thing on the screen
-]
-.right-column[
-![:youtube Animation showing images of food moving in a line down the page around a U finally forming a W, Sx8oiJGjaIM]
-
-]
-
----
-# Why so many separate `Views`?
-
-.left-column-half[
-
-Useful later when we want to do animation
-
-Also provides **separation of concerns** and good high level control
-- Can have a different paint object for each view
-- Can easily change z-order (what is on top of what)
-- Can store information used to draw that thing (whatever it is)
-- Can either make the size of the whole screen or resize around what is drawn
-
-Views can also be re-used easily
-]
-
-.right-column20[
-![:img Picture of an android device with 3 Views each one containing a line circle and square a different size with different backgrounds, 80%](img/drawing/views.png)
-]
-
-???
-This could be a good place to ask them to think about what that means and demonstrating two things with different z order.
-
----
-# Coordinates of the Views
-
-- The coordinate system for each View has the (0, 0) point in the upper left hand corner (remember why?)
-- The width and height of the View is determined it's `ViewGroup.LayoutParams` -
-  - These will be used by the layout system for positioning.
-  - We will learn more about these next week.
-  -
-- The `View` also has a position on the screen.
-  - `View#SetX(int)` and `View.SetY(int)` set the left and top most coordinate of the `View` in its parent.
-
----
-# Advanced Canvas: Coordinate Transformations
-
-.left-column[
-## How does the android toolkit move the various objects on this screen?
-]
-.right-column[
-![:youtube A phone screen with patterned circles spinning in different directions on it, w7DEWWtIlrs]
-]
-
-???
-Be sure to orally narrate what is happening for low-vision people in the room
-
----
-# Linear ("affine") Transformations available
-
-Translate, Scale, Rotate, Shear (and any combination thereof)
-
---
-
-- Translate: Move origin (and everything else) in x and y
-![:img a large moon and a large moon moved to the right a few pixels, 15%](img/drawing/translate.png)
-
-???
-used extensively in GUIS because child objects just draw themselves
-at *their* origin, so a component doesn't have to calculate how to draw
-itself based on its position
-
---
-
-- Scale: change size (negative == flip)
-![:img a large and small moon, 15%](img/drawing/scale.png)
-
---
-
-- Rotate and Shear
-![:img a rotated and angled moon, 25%](img/drawing/shear.png)
-
----
-# Coordinate Transformations
-
-- Can modify any shape, including text.
-- In practice, complex transformations are done with matrices, and matrices are using `concat(Matrix)`
-- But Android helps with this by providing methods in the [Canvas](https://developer.android.com/reference/android/graphics/Canvas) object to transform a canvas such as
-```java
-translate(float dx, float dy)
-rotate(float degrees)                           // the whole canvas around the canvas origin
-rotate (float degrees, float px, float py)      // around a particular point
-scale(float, float)
-scale (float sx, float sy, float px, float py)  // around a pivot point
-skew(float sx, float sy)                        // skew by sx and sy
-save()                                          // save the current transform
-restore()                                       // restore the previous transform
-```
-
-???
-- important thing to point out here: This is a value proposition for a toolkit again
-
-– Affine transformations are based on two-dimensional matrices of the
-following form:
-
-P' = T*P where P is 1x3 and T is the transform matrix (3x3) with the
-bottom row 0 0 1
-
-Thus, x' = ax + cy + t_x and y' = bx + dy + t_y
-
-*Note* Any sequence of transform, rotate and shear can be represented
-in a single matrix of this form (just multiple the matrices together)
-
-
-
----
-# Question: How to rotate about the center of an object
-
-<iframe src="https://embed.polleverywhere.com/multiple_choice_polls/DfxDLPdpd2zTpLlUJt9h9?controls=none&short_poll=true" width="800" height="500" frameBorder="0"></iframe>
-
-
-???
-
-[raise your hands]
-
-- A: Translate, rotate, translate
-- B: Rotate, Translate, Rotate
-- C: Scale, Rotate, Scale
-- D: Rotate
-
-
-XX define exercise
-maybe put this after android stuff?
-
-I usually draw this out on a piece of paper using the document camera to help
-
----
-# Solution: How to rotate about the center of an object
-.left-column[
-![:img a blue square and then a translated and rotated green square, 80%](img/drawing/trans-rotate.png)]
-.right-column[
-
-```java
-int rectHeight = 300;
-int rectWidth = 300;
-int rectY = 100;
-int rectX = 100;
-float px = (rectWidth - rectX)/2 + rectX;
-float py = (rectHeight - rectY)/2 + rectY;
-
-canvas.drawRect(rectX, rectY, rectWidth, rectHeight, paint);
-
-for (int i = 15; i < 360; i += 15) {
-    int color = (i % 2 == 0) ? Color.GREEN : Color.BLUE;
-    paint.setColor(color);
-
-    canvas.drawRect(rectX, rectY, rectWidth, rectHeight, paint);
-    canvas.translate(px, py);
-    canvas.rotate(i);
-    canvas.translate(-px, -py);
-}
-```
-
-]
-
----
-# Summary & revisiting learning goals for this week
-
-- What are the layers of the application stack
-- What are the roles of developers at each layer
-- How to add interactors to the app
-- How interactors are drawn
-- Pixel & stroke models
-- Canvas & Paint & Paths in Android
-- Maybe...Rotating around an object
diff --git a/slides/wk01/figs.pptx b/slides/wk01/figs.pptx
deleted file mode 100644
index 640314bbc7787224d8cd6a0c4be4c8daf54b0975..0000000000000000000000000000000000000000
Binary files a/slides/wk01/figs.pptx and /dev/null differ
diff --git a/slides/wk01/img/drawing/CRT_display.jpg b/slides/wk01/img/drawing/CRT_display.jpg
deleted file mode 100644
index 6e7315151756a6b0b81795cf9da1e461c26154df..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/CRT_display.jpg and /dev/null differ
diff --git a/slides/wk01/img/drawing/DrawingPanel.png b/slides/wk01/img/drawing/DrawingPanel.png
deleted file mode 100644
index a80c2e8f320be3df12dcc7248e1824ef267f3ea8..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/DrawingPanel.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/LED_display.jpg b/slides/wk01/img/drawing/LED_display.jpg
deleted file mode 100644
index 95bd0ad4022000674e359b23a082452d1e895b7b..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/LED_display.jpg and /dev/null differ
diff --git a/slides/wk01/img/drawing/activity_lifecycle.png b/slides/wk01/img/drawing/activity_lifecycle.png
deleted file mode 100644
index 837eea1fc6721683c4e103348a9e704faf527835..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/activity_lifecycle.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/activity_lifecycle_full.png b/slides/wk01/img/drawing/activity_lifecycle_full.png
deleted file mode 100755
index 879f51f6e8fafe75d267984680ef63f85b118dc5..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/activity_lifecycle_full.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/analogtv.jpg b/slides/wk01/img/drawing/analogtv.jpg
deleted file mode 100644
index c74daaf942b864b1bf0fa5a0948761a35f0576ab..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/analogtv.jpg and /dev/null differ
diff --git a/slides/wk01/img/drawing/android-animate.gif b/slides/wk01/img/drawing/android-animate.gif
deleted file mode 100755
index 0fb1d08fd616979b31c4390966e7c2e3410b2c4f..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/android-animate.gif and /dev/null differ
diff --git a/slides/wk01/img/drawing/animation-linear.png b/slides/wk01/img/drawing/animation-linear.png
deleted file mode 100755
index 08bd9fc3dc2ce5d151294b1d2b695a490f2e5f00..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/animation-linear.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/boundless.gif b/slides/wk01/img/drawing/boundless.gif
deleted file mode 100644
index b0613367fe237b6755557dd886a4f374380ec574..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/boundless.gif and /dev/null differ
diff --git a/slides/wk01/img/drawing/circles.png b/slides/wk01/img/drawing/circles.png
deleted file mode 100644
index 81448d0a6c68d6aaa1ecbe4952e90d4345d08006..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/circles.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/doodlevid.mp4 b/slides/wk01/img/drawing/doodlevid.mp4
deleted file mode 100644
index 090f7e51963466d13b647eb8fb71fb795925d70c..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/doodlevid.mp4 and /dev/null differ
diff --git a/slides/wk01/img/drawing/dotted.png b/slides/wk01/img/drawing/dotted.png
deleted file mode 100644
index 17a01df4330e0a8eef0d139fbe02ec41ece7910f..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/dotted.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/fastfood.mp4 b/slides/wk01/img/drawing/fastfood.mp4
deleted file mode 100644
index 8089ac7b2d852079847bf8384d270d2bf5c62591..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/fastfood.mp4 and /dev/null differ
diff --git a/slides/wk01/img/drawing/filled.png b/slides/wk01/img/drawing/filled.png
deleted file mode 100644
index eeccdb82550384e358f10b7ac93be3ec419a586a..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/filled.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/fonts.png b/slides/wk01/img/drawing/fonts.png
deleted file mode 100644
index 102d6b0b1adc3a98b0ecc0a220901b4b605195fd..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/fonts.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/interactors.png b/slides/wk01/img/drawing/interactors.png
deleted file mode 100644
index 339747d21e81b21df33a7a971a143991e85ffae4..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/interactors.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/interpolators.gif b/slides/wk01/img/drawing/interpolators.gif
deleted file mode 100644
index ad4e46ef00ad0843547fa69de0754dbaf9a7c59b..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/interpolators.gif and /dev/null differ
diff --git a/slides/wk01/img/drawing/messaging.png b/slides/wk01/img/drawing/messaging.png
deleted file mode 100644
index dbcd315a04f897ddc84b88b144f447f7379ff3b8..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/messaging.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/messenger-bubble.gif b/slides/wk01/img/drawing/messenger-bubble.gif
deleted file mode 100755
index 77defd497891e79a775a6ca3593cf33e02d2c890..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/messenger-bubble.gif and /dev/null differ
diff --git a/slides/wk01/img/drawing/pacing.png b/slides/wk01/img/drawing/pacing.png
deleted file mode 100644
index 3997cf6fd6aeee192b83ddd549982c9fb8c857a2..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/pacing.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/pathanimation.gif b/slides/wk01/img/drawing/pathanimation.gif
deleted file mode 100644
index f2829498a59210e38138a4a30b31cc26fe948916..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/pathanimation.gif and /dev/null differ
diff --git a/slides/wk01/img/drawing/pixelcalc.png b/slides/wk01/img/drawing/pixelcalc.png
deleted file mode 100644
index 2a18bcc5ecfea59668643d5654782554323e6631..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/pixelcalc.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/pollevscreen.jpeg b/slides/wk01/img/drawing/pollevscreen.jpeg
deleted file mode 100644
index eec7d069978daffee0f466c7388aedf36c734d58..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/pollevscreen.jpeg and /dev/null differ
diff --git a/slides/wk01/img/drawing/rasterscanning.png b/slides/wk01/img/drawing/rasterscanning.png
deleted file mode 100644
index 95cf22eb58025670e99a1af4b1d3c4d6456e9406..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/rasterscanning.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/spinners.mov b/slides/wk01/img/drawing/spinners.mov
deleted file mode 100644
index 90bd20b62efaa4fe887a336b371a58025539b6a8..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/spinners.mov and /dev/null differ
diff --git a/slides/wk01/img/drawing/trans-rotate.png b/slides/wk01/img/drawing/trans-rotate.png
deleted file mode 100644
index bdc729191278f7a42d4470d4329b243378d1c6a6..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/trans-rotate.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/unfilled.png b/slides/wk01/img/drawing/unfilled.png
deleted file mode 100644
index cec58bfe8be1cfd1338377dbadd1f11197ab2af5..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/unfilled.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/valueanimator.png b/slides/wk01/img/drawing/valueanimator.png
deleted file mode 100755
index 6cc2a13bbfca142b090c3fec00ddf410ca82eeb5..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/valueanimator.png and /dev/null differ
diff --git a/slides/wk01/img/drawing/views.png b/slides/wk01/img/drawing/views.png
deleted file mode 100644
index 63ed37f80d05ee622489509f2ca0fd9b9aecef78..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/drawing/views.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/activity_lifecycle.png b/slides/wk01/img/toolkits/activity_lifecycle.png
deleted file mode 100644
index ab0921a717d184442c96c1b8863018d46920a67c..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/activity_lifecycle.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/android-components.png b/slides/wk01/img/toolkits/android-components.png
deleted file mode 100644
index 30d90a952ecddebdfddc1ee1cd2586bb42070762..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/android-components.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/android-components2.png b/slides/wk01/img/toolkits/android-components2.png
deleted file mode 100644
index bb2539c214d6fbaacd876a56443f5533ff5cb5bd..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/android-components2.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/android-editor.gif b/slides/wk01/img/toolkits/android-editor.gif
deleted file mode 100644
index 740a8447abe8a2c87ace8be0786161fa86b0c070..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/android-editor.gif and /dev/null differ
diff --git a/slides/wk01/img/toolkits/android-swipe.png b/slides/wk01/img/toolkits/android-swipe.png
deleted file mode 100644
index 3f2f55e84b63c7a9e551125f114db550ac804e52..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/android-swipe.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/android-type.jpg b/slides/wk01/img/toolkits/android-type.jpg
deleted file mode 100644
index ce7404e45aa8b9a8b6f92cfddfd135311694b868..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/android-type.jpg and /dev/null differ
diff --git a/slides/wk01/img/toolkits/android-ui.png b/slides/wk01/img/toolkits/android-ui.png
deleted file mode 100644
index 16760d5095a74f896378a3cff9e5b70231161919..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/android-ui.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/animation.gif b/slides/wk01/img/toolkits/animation.gif
deleted file mode 100644
index 31558eec649308ffd33ab15872fb2c10997c6488..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/animation.gif and /dev/null differ
diff --git a/slides/wk01/img/toolkits/ape_fwk_hal.png b/slides/wk01/img/toolkits/ape_fwk_hal.png
deleted file mode 100644
index 54927259aed04a9eb299408e941f69a8a615ef03..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/ape_fwk_hal.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/hardware.jpg b/slides/wk01/img/toolkits/hardware.jpg
deleted file mode 100644
index d92ec906e33b0f37b1f5cc06e2c623e148155fc5..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/hardware.jpg and /dev/null differ
diff --git a/slides/wk01/img/toolkits/interactors1.png b/slides/wk01/img/toolkits/interactors1.png
deleted file mode 100644
index 73d003f6a57acf9338a629abb520bc9045e98ebb..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/interactors1.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/interface.png b/slides/wk01/img/toolkits/interface.png
deleted file mode 100644
index efc20af479615d575dd62054d447dabd3ab6f698..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/interface.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/many-uis.png b/slides/wk01/img/toolkits/many-uis.png
deleted file mode 100644
index 1fd7edc75974437e56d41047b159f73339022298..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/many-uis.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/novellibrary.png b/slides/wk01/img/toolkits/novellibrary.png
deleted file mode 100644
index a6e73b04930f211e0d98219be61682337e99bcc2..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/novellibrary.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/phones.jpeg b/slides/wk01/img/toolkits/phones.jpeg
deleted file mode 100644
index 167440241532cf08b589ef24ad9fb66ec70d7540..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/phones.jpeg and /dev/null differ
diff --git a/slides/wk01/img/toolkits/prototype.png b/slides/wk01/img/toolkits/prototype.png
deleted file mode 100644
index 920c6b2ba08cbca1aa6406ff0987b59eda057ce2..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/prototype.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/sandcastle1.png b/slides/wk01/img/toolkits/sandcastle1.png
deleted file mode 100644
index 265a540744d3b32b000231b226bd5df75de1a935..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/sandcastle1.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/sandcastle2.jpg b/slides/wk01/img/toolkits/sandcastle2.jpg
deleted file mode 100644
index 19f5af8ea412f80fbd7e2fb2d1ec0a110b25a755..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/sandcastle2.jpg and /dev/null differ
diff --git a/slides/wk01/img/toolkits/sandcastletools.png b/slides/wk01/img/toolkits/sandcastletools.png
deleted file mode 100644
index befeb3939b90834e9cd3c158e418425e7410ebf2..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/sandcastletools.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/sketch.png b/slides/wk01/img/toolkits/sketch.png
deleted file mode 100644
index 12952eab789096730ba6ea4040107be435804fa6..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/sketch.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/zoom-hall-of-fame.png b/slides/wk01/img/toolkits/zoom-hall-of-fame.png
deleted file mode 100644
index d11b519efcaff9347aaa4ffe0b0db21b28b2390a..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/zoom-hall-of-fame.png and /dev/null differ
diff --git a/slides/wk01/img/toolkits/zoom-hall-of-shame.png b/slides/wk01/img/toolkits/zoom-hall-of-shame.png
deleted file mode 100644
index b11f8a5d8b07fc74eddc9d0468684e13ff39c576..0000000000000000000000000000000000000000
Binary files a/slides/wk01/img/toolkits/zoom-hall-of-shame.png and /dev/null differ
diff --git a/slides/wk01/intro.html b/slides/wk01/intro.html
index 7744053e9278480072292d9dea360ef4a8349892..45722dfbbe46c9d5cac56a7db0f4f7b0e412e840 100644
--- a/slides/wk01/intro.html
+++ b/slides/wk01/intro.html
@@ -48,6 +48,93 @@ Small Group Discussion: How is it changing us as individuals and a society?
 # Summary (somewhat tongue in cheek)
 
 
+Welcome to the class!
+
+All of HCI was already invented (sort of!)
+
+HCI has a huge influence on individuals and society
+
+HCI is really all of computer science
+
+---
+layout: false
+
+<!-- (Outline Slide) -->
+
+# Today's goals
+
+- HCI: Designing the Future
+- **Learning goals**
+- Course staff
+- Syllabus
+---
+.left-column[
+# This **week's** learning goals
+]
+.right-column[
+- What is HCI? Past, present and future
+- Get up to speed with Android basics
+- Learn about basic abstractions for UI implementation
+- Names for common interactors
+]
+---
+.left-column[
+# Course learning goals:
+]
+.right-column[
+# Building Interfaces
+- Deep understanding of **how to build user interfaces**
+- Basic abstractions (layout, event handling, *etc.*)
+- Implementing best practices: Undo, Accessibility, Feedback, Errors,
+*etc.*
+- Exploration of advanced UI concepts: Ubicomp, Sensing, AR, *etc.*
+]
+---
+
+.left-column[
+# Course learning goals:
+]
+.right-column[
+#  Iterative Design
+
+- Basic understanding of **Iterative Design**
+- Why designers are valuable
+- Iterative design process
+- How designers get data from users
+]
+---
+layout: false
+
+<!-- (Outline Slide) -->
+
+# Today's goals
+
+- HCI: Designing the Future
+- Learning goals
+- **Course staff**
+- How we will teach this course
+- Learning goals
+- Course staff
+- Syllabus
+
+
+---
+#  HCI in the Future
+
+Small Group Discussion: How is it changing us as individuals and a society?
+
+<iframe src="https://us.edstem.org/courses/114/sway/host/1153" width="800" height="600" frameBorder="0"></iframe>
+
+???
+- Social networking has been implicated in revolutions and elections.
+- Interfaces designs have impacted health and safety.
+---
+# Return to discuss as a class
+
+---
+# Summary (somewhat tongue in cheek)
+
+
 Welcome to the class!
 
 All of HCI was already invented (sort of!)
diff --git a/slides/wk01/toolkits.html b/slides/wk01/toolkits.html
deleted file mode 100644
index b3eebd1d97db20302d4bc4518efb1591f379ff80..0000000000000000000000000000000000000000
--- a/slides/wk01/toolkits.html
+++ /dev/null
@@ -1,910 +0,0 @@
----
-layout: presentation
-title: Basic Toolkit Abstractions
-description: Discussion of basic abstractions for user interfaces
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Core Toolkit Abstractions
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-name: normal
-layout: true
-class:
----
-layout: false
-
-| Hall of Shame | Hall of Fame|
-|---|---|
-|![:img Zoom toolbar displaying over tabs, 100%](img/toolkits/zoom-hall-of-shame.png) | ![:img Zoom-hall-of-fame, 100%](img/toolkits/zoom-hall-of-fame.png)
----
-| Hall of Shame(?) | Hall of Fame |
-|---|---|
-|![:img Picture of a small sandcastle that is falling apart, 100%](img/toolkits/sandcastle1.png) | ![:img Picture of a complex sandcastle with LEDs lighting it up, 85%](img/toolkits/sandcastle2.jpg)
----
-![:img Simple home tools for sandcastle making such as a bucket; funnel; brush; and spackle knife, 45%](img/toolkits/sandcastletools.png)
----
-# Announcements
-
-- We have Ed ([use us.edstem.org](https://us.edstem.org/dashboard) to log in)
-- Reminder: set up your machine before lab tomorrow!
- - Android Basics: Follow [this](https://developer.android.com/training/basics/firstapp) tutorial to create an Android Application.
- - Continue with the tutorial to also [run your app](https://developer.android.com/training/basics/firstapp/running-app) either on an emulator or on an Android Device.
- - Git Setup: [macOS](https://courses.cs.washington.edu/courses/cse154/19au/resources/assets/atomgit/macosx/), [win](https://courses.cs.washington.edu/courses/cse154/19au/resources/assets/atomgit/windows/) (ignore pieces about Atom as we use Android Studio)
-Make sure you have git setup on your computer, follow above instructions
- - If you have never used git before read through [this](http://cse340-20wi.pages.cs.washington.edu/website/docs/git.html#1) and [this](https://courses.cs.washington.edu/courses/cse331/18au/handouts/tools/versioncontrol.html) (Android Studio ≈ Intellij)
- - Ensure that you can clone from CSE GitLab, (we recommend cloning via SSH)
-- There are now two new helpful pages
-  - An [Academic Conduct]({{site.baseurl}}/academic-conduct) page
-  with Application Content and Collaboration Policies section. (Linked to from home page)
-  - A [GitGrade]({{site.baseurl}}/docs/gitgrade) tutorial page linked to from
-  the [docs]({{site.baseurl}}/docs) page. Note: there are still more tutorials we are building up.
-
-???
-Our learning goals for the first lab are Android project structure, GitGrade and first assignment Doodle.
-Please follow the instructions below to be familiar with Android and have your Git ready before this Thursday section:
-
----
-# Java refresher course
-
-The TAs will be hosting a Java refresher that covers most facets of Java we will be using in this
-class (and maybe some additional Java 8+ material that is nice to know). Which includes:
-
-- Inheritance
-- Generics
-- Anonymous Inner Classes
-- Lambdas (and "::" notation)
-
-If these are not topics you're comfortable with (some are not directly covered in any CS class), come join us!
-
-Time: 5:30-6:30pm Thursday
-Zoom link in Ed
-
----
-[//]: # (Outline Slide)
-# Today's goals
-
-- **Toolkits & Toolkit Users**
-- Introduce the interactor hierarchy
-- How does an interactor draw?
-
----
-# What does it take to run an app on a phone?
-
-![:youtube An android screen with many icons on it; then an app opens and the user can be seen drawing a line. When they finish an undo button appears, 2TJPjyMQGkM]
-
-???
-
-- Give them 60 seconds to think about it and talk with their neighbor.
-- What you want to get at is the application stack
-
----
-# The Application Stack
-.left-column[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class ap,o,w yellow
-  class hlt,t green
-  class h darkblue
-</div>
-]
-.right-column[
-![:img Picture of a woman in front of an open laptop holding a phone with an ipad next to the laptop; a wristwatch on her arm; and a keyfob to the left of the laptop, 50%](img/toolkits/hardware.jpg)
-]
-
-???
-Get the class to brainstorm about what hardware is visible on the screen
-
-Point out that they all have stacks and the things we are learning are not android specific
-
----
-.left-column[
-![:img Picture of the control buttons at the bottom of several different phones; with icons and order changing from phone to phone, 100%](img/toolkits/phones.jpeg)
-]
-.right-column[
-## Android Hardware
-
-![:img Picture of the Hardware Abstraction Layer for android including audio; automotive; bluetooth; camera; drm; graphics; input; media; peripherals; sensors; storage; and tv componnets, 70%](img/toolkits/ape_fwk_hal.png)]
-
-???
-Get the class to brainstorm about what hardware is available on android vs their laptop and how that might influence user interfaces
-
----
-# The Application Stack
-.left-column[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class ap,h,w yellow
-  class hlt,t green
-  class o darkblue
-</div>
-]
-
-.right-column[
-What services does it provide?
-
-How does this impact what you might build in an application?
-]
-
-???
-Class brainstorming about what OS does
-1) manages shared resources (e.g. memory, processor power)
-2) has the power to start and pause and stop applicatinos
-
----
-.left-column[
-# Impact of Android OS on apps
-]
-.right-column[
-![:img Android Activity Lifecycle which shows when the operating system starts; pauses and kills android processes, 45%](img/toolkits/activity_lifecycle.png)
-]
-
-???
-How does the operating system influence what
-you can build? How does this differ on an android device from a desktop?
-
-The Android Activity Lifecycle starts when an activity is launched (by the OS); which leads to
-callbacks to the application such as onCreate, onStart and onResume. Once the activity is running,
-it may be paused, stopped or destroyed. Things like priority and available memory may
-influence this process, as does the user opening the app.
-
----
-# The Application Stack
-.left-column[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class ap,o,h yellow
-  class hlt,t green
-  class w darkblue
-</div>
-]
-.right-column[
-
-- Manages window size and visibility across many applications
-- May trigger clipping and redraw
-  - Lots of cases where this arises on a desktop (overlapping windows, minimization, etc)
-  - Toolkit handles this for you, but can lead to callbacks; redraw events
-
-Where is this on Android?
-]
-
-???
----
-# The Application Stack
-.left-column[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class ap,w,h,o yellow
-  class hlt,t green
-  class t darkblue
-</div>
-]
-
-.right-column[
-Services a toolkit supports (in the order we will learn them)
-- Graphics
-- Animation
-- Layout
-- Accessibility
-- Event Handling
-- Interactive Components
-- Undo
-- Sensing (not covered)
-- Data (not covered)
- - databases; apis
-]
-
-???
-What are some things you expect every interface to have that I didn't mention here?
-Example: Undo (we will learn about this)
-
-Do all user interface toolkits have all of these?
-
----
-# What is an Interface Toolkit
-
-(Main subject of this course)
-- Difference between toolkit and IDE (Integrated Development Environment)?
-- Difference between toolkit and API (Application Programming Interface)?
-
-Structure of a Toolkit
-- Library of components
-- Architecture
-
-???
-Connect what they learned in 143 (i.e that they used the SDK for Java which had a bunch of libraries that had pre-defined code). The IDE most people used was JGrasp.
-
----
-# Example: Doodle assignment: Makes use of the Android Toolkit
-
-Inspired by Google's Doodles, and will include drawing animation (to be discussed): <br>
-[Example from last year's class](img/drawing/doodlevid.mp4)
-
-![:youtube Animation showing images of food moving in a line down the page around a U finally forming a W, Sx8oiJGjaIM]
-
----
-.left-column40[
-## Doodle Assignment
-
-Uses of Android Toolkit  **Library** (green)
-
-<div class="mermaid">
-  graph TD
-  Activity[Activity]
-  Activity -->|...| Doodler[Doodler]
-  Doodler --> Part1[Part1]
-  Part1 --> Part1Activity[Part1Activity]
-  Part1 --> Part2Activity[Part2Activity]
-
-  View[View]
-  View --> ImageView[ImageView]
-  View --> TextView[TextView]
-  View --> LineView[LineView]
-
-  classDef yellow font-size:12pt,text-align:center
-  classDef green font-size:12pt,text-align:center
-  classDef blue font-size:12pt,text-align:center
-
-  class Part1,Part1Activity,Part2Activity,LineView yellow
-  class Activity,View,ImageView,TextView green
-  class Doodler blue
-
-</div>
-]
-
-.right-column30[
-##  Classes we are using in Doodle
-
-- Doodler (which you don't edit) *extends* [Activity](https://developer.android.com/reference/android/app/Activity)
-- Part1 *extends* Doodler. It implements *helper methods*.
-- Part1Activity and Part2Activity both extend Part1 (and use the helper methods)
-- LineView *extends* [View](https://developer.android.com/reference/android/view/View) (so does [ImageView](https://developer.android.com/reference/android/widget/ImageView.html) and [TextView](https://developer.android.com/reference/android/widget/TextView.html)
-
-]
-
-???
-Green: Android toolkit
-Blue: Classes we provide you don't have to modify
-Yellow: Classes you implement
-
-Remind students that they did do inheritance in 142/143 like with Critters.
-
----
-.left-column40[
-# Doodle: What you will learn
-
-- How the Android Activity Lifecycle works (*Architecture*)
-- How to use Android Toolkit `View` objects to show things on screen (*Library*)
-- How to create a custom `View` to draw lines on screen (*Library*)
-- All about Android's `Canvas` object and how to use it to draw on screen (*Library*)
-- How the Android Toolkit supports animation (*Architecture & Library*)
-]
-
-.right-column40[
-# Doodle: What you will do
-
-- Modify Android Activities (`Part1` and `Part1Activity`)
-- Implement methods to add images, text and lines
-- Create the custom view `LineView`
-- Override `onDraw` to draw on the screen in `LineView`
-- Use `ObjectAnimator` to animate Text and other things
-- Create a custom doodle in `Part2Activity`
-]
----
-
-# The Application Stack
-.left-column[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class w,ap,o,h yellow
-  class t green
-  class hlt darkblue
-</div>
-]
-.right-column[
-![:img Screenshot of the android layout tool, 80%](img/toolkits/android-editor.gif)
-]
----
-# Subtle influence of tools
-
-![:img Hand-drawn sketch of an interface very rough around the edges, 50%](img/toolkits/sketch.png)
-
----
-# Subtle influence of tools
-
-![:img High Fidelity Prototype, 40%](img/toolkits/prototype.png)
-
----
-# Subtle influence of tools
-
-Whorfian Effects
-- The way in which our tools influence how we think and thus what we do.
-
-- Origins are linguistic (e.g. the way in which language about color affects what we perceive)
-
-- Can even affect perception of human emotion!
-http://www.radiolab.org/story/91730-new-words-new-world/
-
-
----
-# The Application Stack
-.left-column[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class w,o,h yellow
-  class t,hlt green
-  class ap darkblue
-</div>
-]
-.right-column[
-![:img Screenshot of an android ui for exploring a neighborhood showing a range of locations; activities to engage in in those locations; and things that match the selected activity in a sequence of screens, 80%](img/toolkits/android-ui.png)
-]
-
-???
-Get class to discuss all the things that a UI like this does a little bit. What do you have to think about to build an application? How might a toolkit help with this?
----
-
-# Summary: The Application Stack
-.left-column[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-
-  class ap,w,o,h yellow
-  class hlt,t green
-
-</div>
-]
-
-.right-column[
-- **Application Program** - An application designed for an end user to perform specific tasks.
-- **High Level Tools** - Graphical interfaces that that let you specify parts of your interface (such as layout). Subject to Worfian Effects
-- **Toolkit** - A set of libraries and tools you use to develop applications.
-- **Window System** - Manages window size and visibility across applications
-- **OS** - The operating system that is running on the device, providing system services such as acceess to displays, input devices, file I/O
-- **Hardware** - The device that is running software, such as an Android Phone
-
-High level tools and the the Toolkit are generally packaged as part of a toolkit but really should be thought of as separate things. (You can program the toolkit without the tools. )
-]
-
----
-
-.left-column[
-## Developer roles
-
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class ip,t yellow
-  class w,l,a green
-</div>
-]
-.right-column[
-## Let's say you want to build an app
-
-In this class, you will use the Android Toolkit
-
-Who are we when we build the app?
-]
-
----
-.left-column[
-## Developer roles
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class t yellow
-  class w,l,a green
-  class ip darkblue
-</div>
-]
-.right-column[
-**Interface Programmers** combine library elements according to toolkit rules & following
-constraints of architecture; common to all UI toolkits
-
-In Android
-- Construct app out of `Views`
-- Assembly happens in an `Activity` in `onCreate()` using `addView(View)`
-
-In Doodle
-- You add views when you implement `addImage`, `addText` and `addLine` in `Part1.java`
-- You will need to call `doodleView.addView([view])` (`doodleView` is defined in `Doodler`)
-]
----
-# How does the toolkit know what to draw?
-
-![:img Picture of a very simple interface showing a ringing bell at
-left and an x at right to close the window with the words Google
-Calendar reminder Christian and Anind (Jen Mankoff) is starting at
-12:30pm. Video call between them, 70%](img/toolkits/interface.png)
-
-
-- Discuss
-???
-discuss with your neighbor based on the reading what does the
-toolkit need to know to draw this
-- what to draw; where to draw it
-- what are good abstractions for this?
-- Hierarchy normally reflects spatial containment relationships
-
---
-
-- Deconstruct
-
- - Let's list all the components... and arrange them in a tree
-
-???
-
-- deconstruct this interface into an interactor hierarchy
-
----
-![:img Picture of a very simple interface showing a ringing bell at
-left and an x at right to close the window with the words Google
-Calendar reminder Christian and Anind (Jen Mankoff) is starting at
-12:30pm. Video call between them, 60%](img/toolkits/interface.png)
-
-
-<div class="mermaid">
-graph LR
-W(Window) --> L(LeftSide:Icon)
-W --> M(Middle:Label)
-W --> R(Right:Close Button)
-
-classDef start font-size:14pt,text-align:center
-classDef blue font-size:14pt,text-align:center
-
-class W start
-class M,R,L blue
-
-</div>
-
----
-# More complex example
-
-![:img Picture of a messaging interface with two messages in it, 20%](img/drawing/messaging.png)
-
----
-.left-column[
-## More complex example
-
-![:img Picture of a messaging interface with two messages in it, 80%](img/drawing/messaging.png)]
-
-.right-column[
-<div class="mermaid">
-graph LR
-W(Window) --> T(Controls)
-W --> M(Chats)
-W --> Q(Text Entry)
-T --> A[Button:Messages]
-T --> B[Label:288-88]
-T --> C[Button:Edit]
-M --> G[Button:Call]
-M --> H[Button:Add to Contacts]
-M --> E[Chat1]
-M --> F[Chat2...]
-E --> I[Date]
-E --> J[Chat Msg]
-E --> K[Arrow]
-
-classDef start font-size:14pt,text-align:center
-classDef blue font-size:14pt,text-align:center
-
-
-class W start
-class T,M,E,Q,A,B,C,G,H,E,F,I,J,K blue
-
-</div>
-]
----
-# How is the tree used for drawing?
-
-Interface Programmer:
-- Build and interface == build an interactor hierarchy
-- Change an interface == change the interactor hierarchy (or its  parameters)
-
-
----
-
-.left-column-half[
-## How does Android let you do this
-Architecture invokes the work to construct the *interactor hierarchy*
-by calling  `onCreate()`
-
-In Doodle
-- *Doodler* overrides `onCreate()` (from it's grandparent *Activity* class)
-- *Doodler* provides a helper method for this (`doodle()`) which you
-   override in `Part1Activity` and `Part2Activity`.
-]
-.right-column-half[
-```java
-
-abstract class Doodler extends AppCompatActivity {
-    // ...
-    @Override
-    protected void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        // ...
-        doodle(...)
-    }
-
-    abstract protected void doodle(FrameLayout doodleView);
-```
-]
-
----
-# How is the tree used for drawing?
-
-The interface programmer is not really *drawing on a canvas*, they are *adding views* to a *parent view* in `onCreate()` (or later if something changes)
-
-This is *setup* for the interface being rendered: We are constructing
-the interactor (also called component) hierarchy when we call these methods.
-
-This happens in `Doodle` inside of `Part1.java` in `addImage()` when we say `doodleView.addView(imageView);`
-
-You have to do it in `addText()` and `addLine()` too.
-
----
-# How is the tree used for drawing?
-Toolkit Architecture:
-- Draw an interface == walk the tree and tell interactors to draw
-- Update an interface == walk the tree, only redraw things that are marked as dirty
-- Deliver input == walk the tree and deliver events (after midterm)
-
----
-# How does an interactor draw?
-
-Interactors (Views in Android):
-- Receive draw (`onDraw()` in Android)
-- Show feedback () (Draw onto `Canvas` in Android)
-- Respond to input (Future assignment!)
-
-You will create a custom interactor, a `LineView`, which has to implement `onDraw(Canvas canvas)`
-
-You can use all the [Canvas](https://developer.android.com/reference/android/graphics/Canvas) methods (we'll talk more about these in the [Drawing](Drawing.html) lecture on Friday)
-
-???
-HTML is like this too
-
-<!-- --- -->
-<!-- .left-column-half[ -->
-<!-- ## Most GUIs still use the same 7-10 interaction techniques -->
-<!-- - Basic GUI components invented 1970s -->
-<!-- - Windows, Icons, Menus, Pointers (“WIMP”) -->
-<!-- - “Perfected” by Macintosh in 1984 -->
-<!-- - Not much change since then (even with web) -->
-<!-- ] -->
-<!-- .right-column-half[ -->
-<!-- ## Aside: Significant Stagnation -->
-
-
-<!-- ![:img Picture of a very old mac control panel showing typical interactors at the time,70%](img/toolkits/interactors1.png) -->
-<!-- ] -->
-<!-- ??? -->
-<!-- - Work well, uniform -->
-<!-- - Good for usability -->
-<!-- - GUI is victim of its own success -->
-<!-- - Opportunities lost by not customizing interaction techniques to tasks -->
-<!-- - Hard for better techniques to get traction -->
-<!-- - Only very recently with mobile devices (touch based) have we seen lots of new techniques get a major foothold -->
-
-<!-- --- -->
-<!-- .left-column[ -->
-<!-- ## In class Exercise: Interface Developer, using Android Toolkit -->
-
-<!-- Quick Tour | tutorial -->
-<!-- for [building a ui](https://developer.android.com/training/basics/firstapp/building-ui)] -->
-
-<!-- .right-column[ -->
-<!-- ![:img A picture of the setup for android study in which we can layout -->
-<!-- components,60%](img/toolkits/android-components2.png) -->
-<!-- ] -->
-
----
-.left-column[
-## Developer Roles
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class ip,t yellow
-  class w,l,a green
-  class w darkblue
-</div>
-]
-.right-column[
-**Components** are small, reusable, well defined pieces of code that allow programmers to
-design and develop our UIs in a consistent way ([source](https://blog.bitsrc.io/building-a-consistent-ui-design-system-4481fb37470f)).
-- A UI component can create both functional and visual consistency in an application or set of applications.
-- Often components support new forms of input/direct manipulation.
-- Component development is supported by many toolkits
-
-**Component Developers** create these new, re-usable components.
-
-Example: In the Doodle assignment you will be developing the `LineView` interactor, a new component
-for drawing lines on the screen at certain locations.
-
-]
----
-# Component Developer: Developing Novel Interaction Techniques
-
-.left-column-half[
-- A method for carrying out a specific interactive task
-- Example: enter a number in a range
- - Swiping to invoke an action
- - Gesture based text entry
-
-![img: A picture of gesture based text entry on an android phone, 20%](img/toolkits/android-type.jpg)
-]
-
-.right-column-half[
-![img: A picture of a finger left-swiping to invoke an action on a
-list on an android phone, 10%](img/toolkits/android-swipe.png)
-
-]
----
-.left-column[
-## Developer Roles
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class ip,t yellow
-  class w,a green
-  class l darkblue
-</div>
-]
-.right-column[
-**Library Extenders** are similar to component developers, but may
-create new forms of layout, types of input, etc.
-
-- Supported by a few toolkits
-- Examples:
-  - The Java JDK can be extended by developers who create a set of components in a `.jar` file
-that is included with a software project (example [JFreeChart](http://jfree.org/jfreechart/))
-  - JavaScript has been extended by
-  [many libraries](https://en.wikipedia.org/wiki/List_of_JavaScript_libraries), such as Bootstrap or jQuery.
-]
----
-# Library Extender: Toolkit Support for Styling
-
-.left-column-half[
-![:img A picture of the same dialogue box styled 4 different ways, 100%](img/toolkits/novellibrary.png)
-]
-.right-column-half[
-subArctic allowed visually rich, dynamically resizable, images to be
-provided using primarily conventional drawing tools (and with no
-programming or programming-like activities at all).  Scott E. Hudson
-and Kenichiro Tanaka. (UIST '00)
-]
----
-.left-column[
-## Developer Roles
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class ip,t yellow
-  class w,l,a green
-  class a darkblue
-</div>
-]
-.right-column[
-**Architecture Extenders** modifies the flow of information within a toolkit to create entirely
-new effects (e.g. adding support for command objects)
-
-Supported by very few toolkits
-]
----
-# Architecture Extender: Animation
-
-.right-column50[
-![:img A picture of a phone interface using animation to show a menu, 80%](img/toolkits/animation.gif)
-]
-
-Integrated into existing GUI toolkit
-
-Primary abstraction: transition
-- models movement over time
-- through arbitrary space of values (e.g., color)
-- screen space is most common
-
-
-.footnote[Great post about [types of animation on mobile phones](https://yalantis.com/blog/-seven-types-of-animations-for-mobile-apps/), also
-source of the image]
-
----
-.left-column[
-## Developer Roles
-
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-  classDef darkblue font-size:14pt,text-align:center
-
-  class ip,t yellow
-  class w,l,a green
-  class t darkblue
-</div>
-]
-.right-column[
-**Toolkit builders** create entirely new toolkits that enable radical new forms of interaction
-
-e.g. RapID https://make4all.org/portfolio/rapid/
-]
----
-# Toolkit Builder: Physical Interfaces
-Creates entirely new toolkits that changes what we can do
-
-
-![:youtube Physical Interface made out of RFID tags,4k15uXpp7-g]
-
----
-# Toolkit for Overloading Existing Interfaces
-Prefab supports pixel based enhancements: write interpretation logic that can be composed, reused, and shared to manage the multi-faceted nature of pixel-based interpretation; robustly annotate interface elements with metadata needed to enable runtime enhancements.
-
-![:youtube Prefab Demo,lju6IIteg9Q]
-
----
-#  Summary: Developer Roles
-.left-column[
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-
-  class ip,w,l,a,t yellow
-</div>
-]
-.right-column[
-- **Interface Programmer** - Uses high level tools and toolkit to create a user interface.
-- **Component Developer** - Creates new, re-usable interators or interaction techniques.
-- **Library Extender** - Similar to Component Developer, creates a system of components such as new forms of layout, types of input, etc.
-- **Architecture Extender** - Modifies the flow of information within a toolkit to create entirely new effects
-- **Toolkit Builder** - Creates entirely new toolkits that enable radical new forms of interaction.
-]
----
-#  Summary: In this class we look at General Principals
-
-Particular toolkits tend to be mired in a particular platform
-
-Along comes the next big thing  (e.g., iPhone) and you’ll need to
-learn a new one
-
-We frequently will use Android as an example of these concepts
-
-If you learn the structures/concepts (and esp. rationale behind them)
-that survives change better
diff --git a/slides/wk02/graphs/example.mmd b/slides/wk02/graphs/example.mmd
deleted file mode 100644
index 2844fd51b384d36d23313011eef5290ab0919dab..0000000000000000000000000000000000000000
--- a/slides/wk02/graphs/example.mmd
+++ /dev/null
@@ -1,2 +0,0 @@
-graph LR
-    Start --> Stop
\ No newline at end of file
diff --git a/slides/wk02/graphs/simple.dot b/slides/wk02/graphs/simple.dot
deleted file mode 100644
index 454fdd5d94344e177a90e2602850802f0718a5c6..0000000000000000000000000000000000000000
--- a/slides/wk02/graphs/simple.dot
+++ /dev/null
@@ -1,5 +0,0 @@
-digraph simplestate {
-A --> B;
-B --> A;
-}
-
diff --git a/slides/wk02/img/animation/android-animate.gif b/slides/wk02/img/animation/android-animate.gif
deleted file mode 100755
index 0fb1d08fd616979b31c4390966e7c2e3410b2c4f..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/animation/android-animate.gif and /dev/null differ
diff --git a/slides/wk02/img/animation/animation-linear.png b/slides/wk02/img/animation/animation-linear.png
deleted file mode 100755
index 08bd9fc3dc2ce5d151294b1d2b695a490f2e5f00..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/animation/animation-linear.png and /dev/null differ
diff --git a/slides/wk02/img/animation/animation-nonlinear.png b/slides/wk02/img/animation/animation-nonlinear.png
deleted file mode 100644
index 999dddaa39b03e378e97aee307f76efa27605b39..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/animation/animation-nonlinear.png and /dev/null differ
diff --git a/slides/wk02/img/animation/valueanimator.png b/slides/wk02/img/animation/valueanimator.png
deleted file mode 100755
index 6cc2a13bbfca142b090c3fec00ddf410ca82eeb5..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/animation/valueanimator.png and /dev/null differ
diff --git a/slides/wk02/img/layout/1_portrait.png b/slides/wk02/img/layout/1_portrait.png
deleted file mode 100644
index 9bd05c02c72702aa248ba15346a46bf1e9ae0036..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/1_portrait.png and /dev/null differ
diff --git a/slides/wk02/img/layout/android-linear.png b/slides/wk02/img/layout/android-linear.png
deleted file mode 100644
index 6b252da67203bb2e57a21a65c2b442d1e7e14a9d..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/android-linear.png and /dev/null differ
diff --git a/slides/wk02/img/layout/colormeter.png b/slides/wk02/img/layout/colormeter.png
deleted file mode 100644
index 0ce396fb04418a818bbabfdc8d4aa75653a62936..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/colormeter.png and /dev/null differ
diff --git a/slides/wk02/img/layout/colormetercircled.png b/slides/wk02/img/layout/colormetercircled.png
deleted file mode 100644
index 7846c8e37ff787c175f38683920c4619ee47ff64..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/colormetercircled.png and /dev/null differ
diff --git a/slides/wk02/img/layout/design-view.png b/slides/wk02/img/layout/design-view.png
deleted file mode 100644
index 76f63830d1dbd0e0388c6ce7f57bd2b3d7618db9..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/design-view.png and /dev/null differ
diff --git a/slides/wk02/img/layout/facebook-bad.png b/slides/wk02/img/layout/facebook-bad.png
deleted file mode 100644
index 3803fe4e0e5e0d8ffb69f4e5b6c4253922a87359..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/facebook-bad.png and /dev/null differ
diff --git a/slides/wk02/img/layout/jackbox-bad.png b/slides/wk02/img/layout/jackbox-bad.png
deleted file mode 100644
index d1c9feef5ea3e5ea45202ea096aa2f63b3c7b274..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/jackbox-bad.png and /dev/null differ
diff --git a/slides/wk02/img/layout/layout-demo.png b/slides/wk02/img/layout/layout-demo.png
deleted file mode 100644
index 78b3721df71bc0e3bd03ad5271a0b56b103e513f..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/layout-demo.png and /dev/null differ
diff --git a/slides/wk02/img/layout/layout-inspector-menu.png b/slides/wk02/img/layout/layout-inspector-menu.png
deleted file mode 100644
index 84f498c204863802f17a63845e60d19ce7226653..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/layout-inspector-menu.png and /dev/null differ
diff --git a/slides/wk02/img/layout/part3-runtime.png b/slides/wk02/img/layout/part3-runtime.png
deleted file mode 100644
index e4d3a100d8ed6bfe5ead63b5feb07ee0c231337c..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/part3-runtime.png and /dev/null differ
diff --git a/slides/wk02/img/layout/pinterest-android.png b/slides/wk02/img/layout/pinterest-android.png
deleted file mode 100644
index b07ff8eb6c83c79e5b44007a16da7d1b47c88536..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/pinterest-android.png and /dev/null differ
diff --git a/slides/wk02/img/layout/pinterest-replica.png b/slides/wk02/img/layout/pinterest-replica.png
deleted file mode 100644
index ca0505920df258ef1f2bfb69e98559e25bd59878..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/pinterest-replica.png and /dev/null differ
diff --git a/slides/wk02/img/layout/watch.png b/slides/wk02/img/layout/watch.png
deleted file mode 100644
index a82e63211658da388620dbd69e66bac095532167..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/watch.png and /dev/null differ
diff --git a/slides/wk02/img/layout/watch2.png b/slides/wk02/img/layout/watch2.png
deleted file mode 100644
index bdd0e20b7981219a126087817f39a68708d532a3..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/watch2.png and /dev/null differ
diff --git a/slides/wk02/img/layout/windowsLayout.png b/slides/wk02/img/layout/windowsLayout.png
deleted file mode 100644
index 786c745ae438c2eade82a1e2df63e1ceebc34695..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/layout/windowsLayout.png and /dev/null differ
diff --git a/slides/wk02/img/people/777777.png b/slides/wk02/img/people/777777.png
deleted file mode 100644
index e16d234794a0ad23ae1da057e76a3c945901d621..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/777777.png and /dev/null differ
diff --git a/slides/wk02/img/people/777777w.png b/slides/wk02/img/people/777777w.png
deleted file mode 100644
index bbd487ec276a647eefd22dcfed2882e7b9d8e57f..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/777777w.png and /dev/null differ
diff --git a/slides/wk02/img/people/adobe.jpg b/slides/wk02/img/people/adobe.jpg
deleted file mode 100644
index 7d830e46a1851ba4bd3aaf119ee8cf219d262975..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/adobe.jpg and /dev/null differ
diff --git a/slides/wk02/img/people/amazon.png b/slides/wk02/img/people/amazon.png
deleted file mode 100644
index a4aab78af76c80ed70a1bc040c7226612ec2a8a0..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/amazon.png and /dev/null differ
diff --git a/slides/wk02/img/people/badviz.png b/slides/wk02/img/people/badviz.png
deleted file mode 100644
index f7dbf5fef601adbdc7c8627c1bd32244ed5de9c2..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/badviz.png and /dev/null differ
diff --git a/slides/wk02/img/people/bluelinks.png b/slides/wk02/img/people/bluelinks.png
deleted file mode 100644
index 78cc44cbed982de6cce60284ec1330985dd18451..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/bluelinks.png and /dev/null differ
diff --git a/slides/wk02/img/people/blueonblue.png b/slides/wk02/img/people/blueonblue.png
deleted file mode 100644
index 71c8d916afaf06f0f786e1c76b80ee45bfafb9d3..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/blueonblue.png and /dev/null differ
diff --git a/slides/wk02/img/people/blues.jpg b/slides/wk02/img/people/blues.jpg
deleted file mode 100644
index bb231a598f446eb6ca3230c50f5639f548a894be..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/blues.jpg and /dev/null differ
diff --git a/slides/wk02/img/people/chunking.png b/slides/wk02/img/people/chunking.png
deleted file mode 100644
index d0b8d8b362865cdf83b73dd45616f09175c40daa..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/chunking.png and /dev/null differ
diff --git a/slides/wk02/img/people/color-guidelines.png b/slides/wk02/img/people/color-guidelines.png
deleted file mode 100644
index d81e483ef9a8dacfe3d798eee43784b68c9b5583..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/color-guidelines.png and /dev/null differ
diff --git a/slides/wk02/img/people/distinct.png b/slides/wk02/img/people/distinct.png
deleted file mode 100644
index ddb0ea8f7b50260b768c2a600f2cd93f9cd6970e..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/distinct.png and /dev/null differ
diff --git a/slides/wk02/img/people/distinct1.png b/slides/wk02/img/people/distinct1.png
deleted file mode 100644
index ee1470dad6801674f88397baed960c134295f9fe..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/distinct1.png and /dev/null differ
diff --git a/slides/wk02/img/people/distinct2.png b/slides/wk02/img/people/distinct2.png
deleted file mode 100644
index 07b85fab15355dde58ae94a0109923a341fd676e..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/distinct2.png and /dev/null differ
diff --git a/slides/wk02/img/people/distinct3.png b/slides/wk02/img/people/distinct3.png
deleted file mode 100644
index a105e0f1b55b9cfa87af8ccbf38a4b6a97d431cb..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/distinct3.png and /dev/null differ
diff --git a/slides/wk02/img/people/distinct4.png b/slides/wk02/img/people/distinct4.png
deleted file mode 100644
index 7eabd003d7af201fbe89300a7645d2755c4da1fa..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/distinct4.png and /dev/null differ
diff --git a/slides/wk02/img/people/distinct5.png b/slides/wk02/img/people/distinct5.png
deleted file mode 100644
index e7825b09a4caac026e9b71ebd53e117ab7d51832..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/distinct5.png and /dev/null differ
diff --git a/slides/wk02/img/people/distinct6.png b/slides/wk02/img/people/distinct6.png
deleted file mode 100644
index 97b10f1439bd4d53b501975896aca04228a3893d..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/distinct6.png and /dev/null differ
diff --git a/slides/wk02/img/people/distinct7.png b/slides/wk02/img/people/distinct7.png
deleted file mode 100644
index df1123a90d8d15a3855066417edcff5538318bec..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/distinct7.png and /dev/null differ
diff --git a/slides/wk02/img/people/drawAll.gif b/slides/wk02/img/people/drawAll.gif
deleted file mode 100644
index 5cb98a396766419682d1138f677c93a1e91f4148..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/drawAll.gif and /dev/null differ
diff --git a/slides/wk02/img/people/elevator1.png b/slides/wk02/img/people/elevator1.png
deleted file mode 100644
index 3dd5bd9705a0196e746c40f34c1ffecdfb71f280..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/elevator1.png and /dev/null differ
diff --git a/slides/wk02/img/people/elevator2.png b/slides/wk02/img/people/elevator2.png
deleted file mode 100644
index 2f502f44672d483f1b6b7bcdd4ac35bca8f1d37d..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/elevator2.png and /dev/null differ
diff --git a/slides/wk02/img/people/eye.png b/slides/wk02/img/people/eye.png
deleted file mode 100644
index 18c3959f493de660378f9c7d3d1733b35f2a9f60..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/eye.png and /dev/null differ
diff --git a/slides/wk02/img/people/facebook.png b/slides/wk02/img/people/facebook.png
deleted file mode 100644
index 92d3ad836dedbe70081798da7ce6287a9097cbc6..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/facebook.png and /dev/null differ
diff --git a/slides/wk02/img/people/goodviz.png b/slides/wk02/img/people/goodviz.png
deleted file mode 100644
index 7cf03c3b75e24e2bc53086b70dc2569aecc275f0..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/goodviz.png and /dev/null differ
diff --git a/slides/wk02/img/people/hsv.png b/slides/wk02/img/people/hsv.png
deleted file mode 100644
index c6bede4dbe1e130f60964dd9d6bc8225a3a8556c..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/hsv.png and /dev/null differ
diff --git a/slides/wk02/img/people/humanspectrum.png b/slides/wk02/img/people/humanspectrum.png
deleted file mode 100644
index 47a8beee58beea7349195fd6a76f0c0487d19108..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/humanspectrum.png and /dev/null differ
diff --git a/slides/wk02/img/people/monalisa.png b/slides/wk02/img/people/monalisa.png
deleted file mode 100644
index 6594f080f477f7a0accc3e02f5ea77475f082886..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/monalisa.png and /dev/null differ
diff --git a/slides/wk02/img/people/pixelmonalisa.png b/slides/wk02/img/people/pixelmonalisa.png
deleted file mode 100644
index f37b3ec30eca0745b8fdd16f1699e371fa11faec..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/pixelmonalisa.png and /dev/null differ
diff --git a/slides/wk02/img/people/q1.png b/slides/wk02/img/people/q1.png
deleted file mode 100644
index 9090ed23584f5965f01fe97ef1c3c376b3f8f0ac..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/q1.png and /dev/null differ
diff --git a/slides/wk02/img/people/q3.png b/slides/wk02/img/people/q3.png
deleted file mode 100644
index 2f6b23badf43181ad42231740acd1368a8823aad..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/q3.png and /dev/null differ
diff --git a/slides/wk02/img/people/recognition.png b/slides/wk02/img/people/recognition.png
deleted file mode 100644
index 75e626b0d15f215a6182a3dbb972de0e18513f87..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/recognition.png and /dev/null differ
diff --git a/slides/wk02/img/people/redcomp.png b/slides/wk02/img/people/redcomp.png
deleted file mode 100644
index 81dec38e9e9408f89fddf1c850100ef978395f2a..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/redcomp.png and /dev/null differ
diff --git a/slides/wk02/img/people/rgb.png b/slides/wk02/img/people/rgb.png
deleted file mode 100644
index 4d5dc962d7325f3b83f25233d6f7667a1cdbbd9c..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/rgb.png and /dev/null differ
diff --git a/slides/wk02/img/people/rods_cones.png b/slides/wk02/img/people/rods_cones.png
deleted file mode 100644
index 6c4c88eaf3d67d1545818b497d737d5ce0a87626..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/rods_cones.png and /dev/null differ
diff --git a/slides/wk02/img/people/saturated.png b/slides/wk02/img/people/saturated.png
deleted file mode 100644
index afb6f508ce29ca418e9c27880ed232876799c702..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/saturated.png and /dev/null differ
diff --git a/slides/wk02/img/people/signs.png b/slides/wk02/img/people/signs.png
deleted file mode 100644
index 43c41773ac4b4b9a5676bd5d3175ce32b303d6b0..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/signs.png and /dev/null differ
diff --git a/slides/wk02/img/people/stars.png b/slides/wk02/img/people/stars.png
deleted file mode 100644
index 4b15a6175319606a10be47158b87682af91ae949..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/stars.png and /dev/null differ
diff --git a/slides/wk02/img/people/tiger.png b/slides/wk02/img/people/tiger.png
deleted file mode 100644
index 0d881bc771abf977c2e1982eba348b1771a47bc6..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/tiger.png and /dev/null differ
diff --git a/slides/wk02/img/people/tufte.png b/slides/wk02/img/people/tufte.png
deleted file mode 100644
index dc6f6a97a2a71c926e3a2a2dfcd4be3281fc2a81..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/tufte.png and /dev/null differ
diff --git a/slides/wk02/img/people/value-sat.png b/slides/wk02/img/people/value-sat.png
deleted file mode 100644
index b5ffb6814dde40eb19feca12d1c5d404219c0831..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/value-sat.png and /dev/null differ
diff --git a/slides/wk02/img/people/visualgrouping.png b/slides/wk02/img/people/visualgrouping.png
deleted file mode 100644
index ce969612793e2c9977149f83e24a61692ff1e36b..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/visualgrouping.png and /dev/null differ
diff --git a/slides/wk02/img/people/web1.png b/slides/wk02/img/people/web1.png
deleted file mode 100644
index 61ca27232965dbb3424d46dba693138c05fa85a7..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/web1.png and /dev/null differ
diff --git a/slides/wk02/img/people/web2.png b/slides/wk02/img/people/web2.png
deleted file mode 100644
index f0f96e2b9bda73c4f40f7a970100f0d9095dd817..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/web2.png and /dev/null differ
diff --git a/slides/wk02/img/people/web3.png b/slides/wk02/img/people/web3.png
deleted file mode 100644
index 88a1df7b1ee3b4095219efce172c12f7feebbf9b..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/web3.png and /dev/null differ
diff --git a/slides/wk02/img/people/windowsLayout.png b/slides/wk02/img/people/windowsLayout.png
deleted file mode 100644
index 786c745ae438c2eade82a1e2df63e1ceebc34695..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/windowsLayout.png and /dev/null differ
diff --git a/slides/wk02/img/people/windowsLayoutGreyscale.png b/slides/wk02/img/people/windowsLayoutGreyscale.png
deleted file mode 100644
index 5b253f3fe0b9b3243b844f0674614aa93ccc350a..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/windowsLayoutGreyscale.png and /dev/null differ
diff --git a/slides/wk02/img/people/yellow.png b/slides/wk02/img/people/yellow.png
deleted file mode 100644
index fa27be165b215ba5c1737359b12610ef7f37f29e..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/people/yellow.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/accelerate.gif b/slides/wk02/img/toolkit-drawing/accelerate.gif
deleted file mode 100644
index 519648efffb6d5c51fe0b4f1a392de59116a4ce7..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/accelerate.gif and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/animation-linear.png b/slides/wk02/img/toolkit-drawing/animation-linear.png
deleted file mode 100644
index 08bd9fc3dc2ce5d151294b1d2b695a490f2e5f00..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/animation-linear.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/bounce.gif b/slides/wk02/img/toolkit-drawing/bounce.gif
deleted file mode 100644
index c313049ed5d7841a755f38f3d48aafd6b3715021..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/bounce.gif and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/bounding-animation.png b/slides/wk02/img/toolkit-drawing/bounding-animation.png
deleted file mode 100644
index 411566257aaa2a6e8fa0df2697b0e44726f7bc9b..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/bounding-animation.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/boundless.gif b/slides/wk02/img/toolkit-drawing/boundless.gif
deleted file mode 100644
index b0613367fe237b6755557dd886a4f374380ec574..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/boundless.gif and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/doodle-layout.png b/slides/wk02/img/toolkit-drawing/doodle-layout.png
deleted file mode 100644
index 80b9fd17ebb77684d1000953988f9d9258137bb5..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/doodle-layout.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/doodle-layout2.png b/slides/wk02/img/toolkit-drawing/doodle-layout2.png
deleted file mode 100644
index a3d68d2f3fc0e04fe7bd44fabbcf25079fce798c..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/doodle-layout2.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/doodle-screenshot.png b/slides/wk02/img/toolkit-drawing/doodle-screenshot.png
deleted file mode 100644
index e2ead8c9139d191ba5182a6a95e12bd1ae0cd51e..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/doodle-screenshot.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/interactor-hierarchy.png b/slides/wk02/img/toolkit-drawing/interactor-hierarchy.png
deleted file mode 100644
index bb41dc3d5b987687e7df6970f7df476cea7c6bbd..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/interactor-hierarchy.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/interpolators.gif b/slides/wk02/img/toolkit-drawing/interpolators.gif
deleted file mode 100644
index ad4e46ef00ad0843547fa69de0754dbaf9a7c59b..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/interpolators.gif and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/linear.gif b/slides/wk02/img/toolkit-drawing/linear.gif
deleted file mode 100644
index 862a9241ff308d3e216ebf75f82e733db6637fe6..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/linear.gif and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/linearrotate.gif b/slides/wk02/img/toolkit-drawing/linearrotate.gif
deleted file mode 100644
index 8fc4be4fac5d10a2d5c6fc593e13284ce0339fb3..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/linearrotate.gif and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/overshoot.gif b/slides/wk02/img/toolkit-drawing/overshoot.gif
deleted file mode 100644
index 13bda4720e4de0f0584a7eee39c1a7cb65e22c3d..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/overshoot.gif and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/pathanimation.gif b/slides/wk02/img/toolkit-drawing/pathanimation.gif
deleted file mode 100644
index daf37d692c757cca41c53c041f6117921adb074a..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/pathanimation.gif and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/rotatedrects-center.png b/slides/wk02/img/toolkit-drawing/rotatedrects-center.png
deleted file mode 100644
index c84316897dace66263a21265cf31a6d4febaa1d4..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/rotatedrects-center.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/rotatedrects-original-origin.png b/slides/wk02/img/toolkit-drawing/rotatedrects-original-origin.png
deleted file mode 100644
index f8534eb40c19fb39bd2e9b8a4fa1763d8fd56e34..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/rotatedrects-original-origin.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/scale.png b/slides/wk02/img/toolkit-drawing/scale.png
deleted file mode 100644
index 8dbb996d67c33c9469850bac11933aeb5fdb061f..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/scale.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/screenshot_no_animation.jpeg b/slides/wk02/img/toolkit-drawing/screenshot_no_animation.jpeg
deleted file mode 100644
index f06bf323fa86e6e9285eebbaae7ce2a4805b890e..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/screenshot_no_animation.jpeg and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/shear.png b/slides/wk02/img/toolkit-drawing/shear.png
deleted file mode 100644
index 75ba28462f9ec3df6717dbb306e91391e53cc3f2..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/shear.png and /dev/null differ
diff --git a/slides/wk02/img/toolkit-drawing/translate.png b/slides/wk02/img/toolkit-drawing/translate.png
deleted file mode 100644
index 37fa3326c7b96cefe9e0d17c89c4fb45bf122030..0000000000000000000000000000000000000000
Binary files a/slides/wk02/img/toolkit-drawing/translate.png and /dev/null differ
diff --git a/slides/wk02/interface-drawing.html b/slides/wk02/interface-drawing.html
deleted file mode 100644
index dbf8ef56f2efa3ecb8df8fc7bac5a1c15b02b29c..0000000000000000000000000000000000000000
--- a/slides/wk02/interface-drawing.html
+++ /dev/null
@@ -1,871 +0,0 @@
----
-layout: presentation
-title: Drawing Interfaces
-description: Discussion of how toolkits draw interfaces
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Introduction to Drawing Interfaces
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout: false
-
-
-[//]: # (Outline Slide)
-# Today's goals
-
-- Reviewing Transformations
-- Breakout room test 2
-- Reviewing Rotation
-- Role of Interactor Hierarchy in drawing the screen
-- How to use Animation to move Interactors
-- Summary of what we've learned so far
-
----
-
-# Administrivia
-
-Important [Ed Post about two changes to the spec](https://us.edstem.org/courses/381/discussion/24921)
-1. You do not need to handle lines that have a "positive slope"
-2. We are asking that you turn in a video of your running custom doodle at the same time as your code.  (demo)
-
----
-# Linear ("affine") Transformations
-
-Translate, Scale, Rotate, Shear (and any combination thereof)
-
---
-
-- Translate: Move origin (and everything else) in x and y
-![:img a large moon and a large moon moved to the right a few pixels, 15%](img/toolkit-drawing/translate.png)
-
-???
-used extensively in GUIS because child objects just draw themselves
-at *their* origin, so a component doesn't have to calculate how to draw
-itself based on its position
-
---
-
-- Scale: change size (negative == flip)
-![:img a large and small moon, 15%](img/toolkit-drawing/scale.png)
-
---
-
-- Rotate and Shear
-![:img a rotated and angled moon, 25%](img/toolkit-drawing/shear.png)
-
----
-# Coordinate Transformations
-
-- Can modify any shape, including text.
-- In practice, complex transformations are done with matrices, and matrices are using `concat(Matrix)`
-- But Android helps with this by providing methods in the
-[Canvas](https://developer.android.com/reference/android/graphics/Canvas) object to transform a canvas such as
-
-```java
-translate(float dx, float dy)
-rotate(float degrees)                           // the whole canvas around the canvas origin
-rotate (float degrees, float px, float py)      // around a particular point
-scale(float, float)
-scale (float sx, float sy, float px, float py)  // around a pivot point
-skew(float sx, float sy)                        // skew by sx and sy
-save()                                          // save the current transform
-restore()                                       // restore the previous transform
-```
-
-???
-- important thing to point out here: This is a value proposition for a toolkit again
-
-– Affine transformations are based on two-dimensional matrices of the
-following form:
-
-P' = T*P where P is 1x3 and T is the transform matrix (3x3) with the
-bottom row 0 0 1
-
-Thus, x' = ax + cy + t_x and y' = bx + dy + t_y
-
-*Note* Any sequence of transform, rotate and shear can be represented
-in a single matrix of this form (just multiple the matrices together)
-
----
-# Breakout question: How can you rotate around the center of an object:
-
-<iframe src="https://embed.polleverywhere.com/multiple_choice_polls/DfxDLPdpd2zTpLlUJt9h9?controls=none&short_poll=true" width="800" height="500" frameBorder="0"></iframe>
-
-
-???
-
-[raise your hands]
-
-- A: Translate, rotate, translate
-- B: Rotate, Translate, Rotate
-- C: Scale, Rotate, Scale
-- D: Rotate
-
-
-XX define exercise
-maybe put this after android stuff?
-
-I usually draw this out on a piece of paper using the document camera to help
-
----
-# Breakout rooms test 2
-
-- You've been randomly assigned you to breakout rooms with one TA each.
-- In the future, we will experiment with a system where you can choose your breakout partners
-- Goal: Meet other students, test out the technology
-  - Please turn your cameras on in the breakouts
-  - Introduce yourself, and tell your group what color your favorite shirt is.
-  - Discuss the poll everywhere question and vote
-
-We'll do this for 5 minutes, then I will close the breakouts
-
----
-
-# Explanation
-
-.left-column[
-![:img Three rectangle with a second rectangle displayed rotating around the origin of the rectangle, 80%](img/toolkit-drawing/rotatedrects-original-origin.png)
-]
-
-.right-column[
-New view created called `RotatedRectangleView` that has `mEndPoint` and `mBrush` defined in a
-similar way to your `LineView`. It also is given the number of degrees (stored in the variable mDegrees)
-by which to rotate the rectangle.
-
-```java
-public void onDraw(Canvas canvas) {
-
-  canvas.drawRect(0, 0, mEndPoint.x , mEndPoint.y, mBrush);
-
-  int saveColor = mBrush.getColor();
-  mBrush.setColor(Color.GREEN);
-  canvas.rotate(mDegrees);
-  canvas.drawRect(0, 0, mEndPoint.x, mEndPoint.y, mBrush);
-}
-```
-]
-
----
-# Moving the canvas
-
-.left-column[
-![:img Three rectangle with a second rectangle displayed rotating around the origin of the rectangle, 80%](img/toolkit-drawing/rotatedrects-center.png)
-]
-
-.right-column[
-Move origin of the `canvas` to the center of the object, THEN rotate it, then
-move the origin back to it's original location (in this new rotated orientation)
-
-```java
-public void onDraw(Canvas canvas) {
-
-  canvas.drawRect(0, 0, mEndPoint.x , mEndPoint.y, mBrush);
-
-  float px = mEndPoint.x / 2;
-  float py = mEndPoint.y / 2;
-  int saveColor = mBrush.getColor();
-  mBrush.setColor(Color.GREEN);
-  canvas.translate(px, py);
-  canvas.rotate(mDegrees);
-  canvas.translate(-px, -py);
-  canvas.drawRect(0, 0, mEndPoint.x, mEndPoint.y, mBrush);
-}
-```
-]
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Toolkits
----
-layout: false
-
-## Review: Developer roles
-
-.left-column[
-
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-
-  class t,l,a,w yellow
-  class ip green
-</div>
-]
-
-.right-column[
-Recall the role Interface Programmer a developer can play in app development.
-]
-
----
-
-# Draw the interactor hierarchy
-
-Think about why we use a `View` for **each** thing on the screen...
-
- ![:img Picture of images arranged in a heart shape with a vertical line above them; the words UW below them and a horizontal line below that, 15%](img/toolkit-drawing/screenshot_no_animation.jpeg) &nbsp; &nbsp;  ![:img Interactor hierarcy of the image to the left , 20%](img/toolkit-drawing/interactor-hierarchy.png)
-
-
----
-
-# Simpler Example as an Interface Programmer
-
-.left-column[
-![:img Picture of a very simple doodle with the word 'placeholder' at the top and a line that goes from top left to about halfway down the screen, 100%](img/toolkit-drawing/doodle-screenshot.png)
-]
-.right-column[
-
-```java
- LineView line = new LineView(this, startX, startY, endX, endY, width, color);
- canvas.addView(line);
- TextView text = new TextView(this);
- text.setX(x);
- text.setY(y);
- text.setText("placeholder");
- canvas.addView(text);
-```
-]
-
----
-
-## Review: Developer roles
-
-.left-column[
-
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-
-  class t green
-  class ip,l,a,w yellow
-
-</div>
-]
-
-.right-column[
-Today we're going to discuss the role Toolkit builder plays in app development
-]
-
-
----
-# What is the toolkit architecture?
-
-???
-Applies to the flow of information within the toolkit
-
-Example: How the interface is drawn
-
-What could you add? Support for animation, machine learning, etc
-
-Supported by very few toolkits
-
----
-# What is the toolkit architecture?
-
-Applies to the flow of information within the toolkit
-
-Examples:
-- How the interface is drawn
-- How the interface is layed out
-- How the interface responds to the user
-
-What could you add? Support for animation, machine learning, etc
-
-Adding new features at the toolkit level is supported by very few toolkits
-
----
-
-# How is a View drawn on the screen?
-
-**Toolkit Architecture Builder**
-
-- Depth-first tree traversal of the interactor hierarchy
-- Each View draws itself in its location
-- Siblings drawn in order they appear
-
-Naive Pseudocode:
-
-```java
-protected void drawAll() {
-    onDraw();                     // Draw yourself. (lower in the Z-order)
-    foreach child c {             // for all of the children in this node
-        if (child.isVisible()) {  // if the child is visible
-          child.drawAll();        // tell the child to draw itself
-        }
-    }
-}
-```
-
-???
-What is missing here?
-How can children misbehave?
-What are they expecting that we don't do?
-Draw out what will happen on paper
-
----
-# How is a View drawn on the screen?
-
-Naive Pseudocode:
-
-```java
-protected void drawAll() {
-   onDraw();
-   foreach child c {
-     if (child.isVisible()) {
-       child.drawAll();
-     }
-   }
-}
-```
-
-- How could children misbehave?
-- Work arounds could we do?
-
-???
-Imagine if all the children were the same dimensions.
-
----
-# Work arounds?
-
-Make the **Interface Programmer** fix this
-
-Could make every view the size of the whole screen; Then just draw items in those views
-in the correct position
-
-Could tell every view where it is so it draws properly
-
-
----
-# For this, view needs a position, width and height
-
-.left-column-half[
-![:img Picture of the interactor hierarchy for the same app, 70%](img/toolkit-drawing/doodle-layout.png)
-]
-
-.right-column-half[
-What could go wrong with this approach?
-
-]
-???
-- What if we want to place a different view, automatically, to the right of the text?
-- How do we guarrantee that a view doesn't draw over it's neighbor?
-
----
-# For this, view needs a position, width and height
-
-.left-column-half[
-![:img Picture of the interactor hierarchy for the same app, 70%](img/toolkit-drawing/doodle-layout.png)
-]
-
-.right-column-half[
-What could go wrong with this approach?
-- What if we want to place a different view, automatically, to the right of the text?
-- How do we guarrantee that a view doesn't draw over it's neighbor?
-
-]
----
-# Specifying View position, width and height?
-
-.left-column-half[
-<br>
-![:img Picture of the interactor hierarchy for the same app, 70%](img/toolkit-drawing/doodle-layout2.png)
-]
-
-.right-column-half[
-**Interface Programmer** does this
-
-```java
-View view = new View();
-view.setX();
-view.setY();
-ViewGroup.LayoutParams params = view.getLayoutParams();
-param.width = width;
-param.height = height;
-view.setLayoutParams(param);
-```
-]
-???
-We'll go into much more depth on this in your next assignment
-
----
-# How does a toolkit use this?
-**Toolkit Architecture Builder**
-
-**Uses coordinate transformations to make each child the center of its universe!**
- - Parent (usually) specifies position of child when adding to the interactor hierarchy
- - Child counts on parent to set things up so child's internal coordinate system starts at (0,0)
-
---
-We just saw this with rotating the canvas!
-
----
-# How is a View drawn on the screen
-**Toolkit Architecture Builder**
-
-```java
-protected void drawAll() {
-    onDraw();
-    foreach child c {
-        if (child.isVisible()) {
-
-
-
-
-			 child.drawAll();
-
-		}
-  }
-}
-```
-Is this part of the _Toolkit Architecture_ or _Toolkit Library_?
-
----
-# How is a View drawn on the screen
-**Toolkit Architecture Builder**
-
-```java
-protected void drawAll() {
-    onDraw();
-    foreach child c {
-        if (child.isVisible()) {
-*            Rectangle r = child.getLayoutParams(); // Find child coordinates
-*            canvas.save();                         // Capture the current state of canvas
-*            canvas.translate(r.x, r.y);            // Move origin to child's top-left corner
-*            canvas.clip(0,0,r.width,r.height);     // Clip to child
-             child.drawAll();                       // Draw child (and all it's kids)
-*            canvas.restore();                      // Restore
-		}
-  }
-}
-```
-Is this part of the _Toolkit Architecture_ or _Toolkit Library_?
-???
-Draw out on paper again
-Note that this is  has absolute layout!
-
----
-
-# Why is a bounding box important here?
-
-![:img mouse moving along a path with linear interpolation, 25%](img/toolkit-drawing/linear.gif)
-&nbsp;
-![:img Bounding box around the objects being animated used to control their position, 40%](img/toolkit-drawing/bounding-animation.png)
-
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Animation
----
-layout: false
-
-.left-column[
-![:img Android Animation Example with bouncing and spinning circles that eventually transition to spell out android, 100%](img/animation/android-animate.gif)
-]
-
-.right-column[
-# Animation becoming core pillar of UX design
-
-Greater awareness of role for communicating UI behavior
-Guide, provide context, delight, engage
-
-.quote[‘Animation is increasingly becoming an important part of the UI
-design experience. Google’s material design guidelines are a good
-illustration of this. Expect to see even more tools and optimizations
-made to improve the production workflow and performance in browsers
-and on devices.’ ([Weareathlon](https://www.weareathlon.com/ideas/ten-ux-design-trends-for-2015))]
-]
-
-
----
-# Old implementation approach
-
-Frame-based
-- Redraw scene at regular intervals
-- Developer defines redraw function
-
-What toolkit principals does this violate?
-
-???
-it's bad because it doesn't provide any useful abstractions
-
-Fails to provide separation of concerns
---
-- Doesn't provide supportive abstractions
-
---
-- Fails to provide separation of concerns
-
----
-# Main implementation approach
-Transition-based (Hudson & Stasko '93)
-- Specify property values of animation transition speed and process
- - Uses 'pacing' functions to stylize animation, e.g. slow-in
-slow-out (see [easings.net](http://easings.net))
-
-- Typically computed via __interpolation__
-```java
-step(fraction){x_now = x_start + fraction*(x_end - x_start);}
-```
-- Timing and redraw managed by toolkit
-
-
----
-# Toolkit Architecture for Animation
-
-.left-column[
-<br>
-<br>
-<br>
-<br>
-<br>
-![Value Animator Process](img/animation/valueanimator.png)
-]
-.right-column[
-
-Steamlined process for animation of each frame
-- An update function is called
-- `invalidate()` is called
-- View is redrawn
-]
-
----
-# How an animation is set up
-
-Define an animation that changes on object's property (a field on a object) over a length of time.
-
-![:img boxes showing position and time changing over a 40 ms duration, 80%](img/toolkit-drawing/animation-linear.png)
-
-.footnote[[image source: Android animation documentation](https://developer.android.com/guide/topics/graphics/prop-animation)]
-
----
-# How an animation is set up
-
-Need the start and end value of the properties to be
-modified. Typically use a
-[Path](https://developer.android.com/reference/android/graphics/Path)
-for this.
-
-Need a *duration* (total time in ms for the animation)
-
-Need the *pacing function* for animation using an [Interpolator](https://developer.android.com/reference/android/view/animation/Interpolator)
-- Default is [AccelerateDecelerateInterpolator](https://developer.android.com/reference/android/view/animation/AccelerateDecelerateInterpolator)
-- Other subclasses include AccelerateInterpolator, AnticipateInterpolator, AnticipateOvershootInterpolator,
-BounceInterpolator, CycleInterpolator, DecelerateInterpolator, LinearInterpolator,
-OvershootInterpolator, PathInterpolator
-- Or make your own!
-
----
-
-# [ObjectAnimator](https://developer.android.com/reference/android/animation/ObjectAnimator)
-
-Directly animate a properties on an object
-
-**However**: the property that you are animating must have a setter
-function (in camel case) in the form of `set<propertyName>()` for this
-to work
-
-Can use a string (like `"alpha"`) or a property (like `View.X` in [View](https://developer.android.com/reference/android/view/View))
-
----
-# [ObjectAnimator](https://developer.android.com/reference/android/animation/ObjectAnimator)
-
-.left-column[
-<br>
-<br>
-![:img Boundless animation, 90%](img/toolkit-drawing/boundless.gif)
-]
-
-.right-column[
-Example for color
-```java
-// takes a target view, a property name, and values
-ObjectAnimator anim = ObjectAnimator.ofFloat(boundlessView, "alpha", 0f, 1f);
-anim.setDuration(1000);
-anim.start();
-```
-]
----
-# [ObjectAnimator](https://developer.android.com/reference/android/animation/ObjectAnimator)
-
-.left-column[
-![:img Path animation, 90%](img/toolkit-drawing/linear.gif)
-]
-
-.right-column[
-Example for position (using a
-[Path](https://developer.android.com/reference/android/graphics/Path))
-```java
-ImageView mouse = addImage(doodleView, "mouse", 500f, 50f, size);
-Path path = new Path();
-path.moveTo(400f, 50f);
-path.arcTo(200f, 50f, 600f, 450, 270, -180, true);
-path.arcTo(200f, 450f, 600f, 850, 270f, 180f, true);
-
-ObjectAnimator anim = ObjectAnimator.ofFloat(mouse, View.X, View.Y, path);
-anim.setDuration(5000);
-anim.start();
-
-
-```
-]
-
----
-# [ObjectAnimator](https://developer.android.com/reference/android/animation/ObjectAnimator)
-
-.left-column[
-![:img Path animation, 90%](img/toolkit-drawing/linearrotate.gif)
-]
-
-.right-column[
-- The static functions (like ofFloat) in ObjectAnimator are "factories" - the method creates the
-ObjectAnimator object for you!
-- You can have multiple ObjectAnimators working on a single view at the same time!
-
-```java
-ImageView mouse = addImage(doodleView, "mouse", 500f, 50f, size);
-Path path = new Path();
-// code to set up the path....
-ObjectAnimator anim = ObjectAnimator.ofFloat(mouse, View.X, View.Y, path);
-anim.setDuration(5000);
-anim.start();
-
-ObjectAnimator anim = ObjectAnimator.ofFloat(mouse,"rotation", 720);
-anim.setDuration(5000);
-anim.start();
-```
-
-]
----
-
-# Other useful properties for animation
-
-- `translationX` /`translationY` - view location as a delta from its top/left coordinates relative to the parent
-- `rotation` / `rotationX`/`rotationY` - control 2D rotation and 3D rotation around a pivot point
-- `scaleX` / `scaleY` - 2D scaliong of a `View` around a pivot point
-- `pivotX` / `pivotY` - changes location of thej pivot point (default is object's center)
-- `x` / `y` - utility property to describe the final location of a `View` in its container as a sum of (left, top) + `translationX`, `translationY`)
-- `alpha`
-
-.footnote[All found in the [View](https://developer.android.com/reference/android/view/View) class]
----
-
-# For more more flexibility...
-You can specify `Keyframe` objects to control the animation
-
-```java
-  // Key for start at 0
-  Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
-  // Key for half way finished animation
-  Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
-  // Key for end state
-  Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
-  // ValueName-to-keyframes
-  PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation",
-                                                                      kf0, kf1, kf2);
-  // Create the animation
-  ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target,
-                                                                      pvhRotation)
-  rotationAnim.setDuration(5000ms);
-```
----
-
-# Taking Animation to the next level
-
-.quote[ Despite the differences between user interfaces and cartoons
--- cartoons are frivolous, passive entertainment and user interfaces
-are serious, interactive tools -- cartoon animation has much to lend
-user interfaces to realize both affective and cognitive benefits]
-.small[Principals of animation borrowed from Johnston & Thomas ‘81,
-Lasseter ‘87]
-
----
-# Chang & Ungar, UIST '93
-
-What strategies do you see here?
-
-![:youtube Opening cartoon from who framed roger rabbit showing him trying to keep a baby safe,oQe0OWZvwWo]
-
-???
-- Squash-and-Stretch
-- Staging, Overlapping Action
-- Anticipation
-- Follow-Through
-- Slow In Slow Out
-
-
----
-## Example pacing functions -- derived from Disney style animation!
-.left-column[
-![:img Picture of for types of interpolation functions provided with
-android, 100%](img/toolkit-drawing/interpolators.gif)
-]
-.right-column[
-Slow in slow out (Accelerate/decelerate)
-<br>
-<br>
-
-Slow in (Accelerate)
-<br>
-<br>
-
-Anticipate (back up slightly, then accelerate)
-<br>
-<br>
-
-Anticipate Overshoot (same, then go too far and slow down)
-]
-
----
-# Why is pacing so important?
-
-Need to mimic real world
-- Observing motion tells us about size, weight, rigidity
-- No abrupt changes in velocity!
-
-Gives a feeling of reality and liveness
-- “animation” = “bring to life”
-- make inanimate object animate
-
-With this can come appeal and desirability
-
----
-# Example pacing functions
-
-Watch this and note the pacing you see!
-
-![:youtube Video showing a mother and child lamp playing with a ball
-illustrating a range of techniques,6G3O60o5U7w]
-
-???
-Normally I show this twice and ask them what they see:
-- No teleportation!
-- Squash and Stretch (preserve volume; can approximate inertia (ball))
-- Follow through (i.e. cord lags behind lamp)
-- Anticipation (small amount of counter movement (lampshade motion))
-- Exaggeration (cord up and down)
-
-- (not shown) Motion blur (doesn't need to be realistic
-
-
----
-# How implement pacing in animation?
-
-How would `t` and `x` change for slow in slow out?
-
---
-![:img boxes showing position and time changing over a 40 ms duration, 80%](img/animation/animation-nonlinear.png)
-
-.footnote[[image source: Android animation documentation](https://developer.android.com/guide/topics/graphics/prop-animation)]
-
----
-# We implement these with `Interpolators` in Android
-.left-column-half[
-![:img mouse moving along a path with linear interpolation,22%](img/toolkit-drawing/linear.gif)
-![:img mouse moving along a path with linear interpolation,22%](img/toolkit-drawing/accelerate.gif)
-![:img mouse moving along a path with overshoot interpolation,22%](img/toolkit-drawing/overshoot.gif)
-![:img mouse moving along a path with bounce interpolation,22%](img/toolkit-drawing/bounce.gif)
-]
-.right-column-half[
-The durations are the same for each of these animations
-- Left side is _Linear_
-- Second one is _Accelerate_
-- Third one is ??
-- Right side is ??
-
-
-]
-
-???
-overshoot
-bounce
-
----
-# Using an Interpolator
-```java
-ObjectAnimator anim = ObjectAnimator.ofFloat(mouse,
-                                             View.X, View.Y, path);  // Create the ObjectAnimator
-OvershootInterpolator interpolator = new OvershootInterpolator();    // Create an Interpolator
-anim.setInterpolator(interpolator);                                  // Tell the animator to use the interpolator
-anim.setDuration(3000);                                              // set the duration
-anim.start();                                                        // Tell the animation to start
-```
-
----
-# Using Animation Well - Accessbility
-
-.quote['The impact of animation on people with vestibular disorders can be quite severe.
-Triggered reactions include nausea, migraine headaches, and potentially
-needing bed rest to recover.' [W3C Accessibility Guidelines](https://www.w3.org/WAI/WCAG21/Understanding/animation-from-interactions.html)]
-
-Best option: provide control, be minimalistic
-???
-
----
-# Summary: Animation Design Tips
-
-1. Used sparingly and understandingly, animation can enhance the interface … otherwise can distract!
-2. Need to mimic real world
-3. Observing motion tells us about size, weight, rigidity
-4. No abrupt changes in velocity!
-5. Think about accessibility.
-
----
-# What to do for Doodle Part2Activity?
-
-Your chance to  make something creative.
-
-Peers will reviewed your custom doodle to ensure it uses some combination of lines, text, images, and animation.
-
-Peers will also "evaluate" (give you feedback on how much they liked it).
-
-
----
-# Summary & revisiting learning goals for this week and last
-
-.left-column-half[
-- What is HCI?
-- What is a toolkit? How do an architecture and library differ?
-- How do we draw on the screen?
-  - What is a pixel?
-  - What is a raster vs a vector model?
-  - What abstractions help with drawing?
-  - How do we use affine transformations?
-- What is the interactor hierarchy?
-  - How is it used for drawing?
-  - What role do affine transformations play in this?
-- What are the key abstractions for animation?
-  ]
-.right-column-half[
-- Android basics
-- What is a `View`?
-- `onCreate()` and `onDraw()`
-- How does `Canvas` work?
-- How do we construct the interactor hierarchy?
-- Implementing Animation
-]
diff --git a/slides/wk02/layout.html b/slides/wk02/layout.html
deleted file mode 100644
index 650ec178ce507ce3f152c01f378f68028f5ffddc..0000000000000000000000000000000000000000
--- a/slides/wk02/layout.html
+++ /dev/null
@@ -1,634 +0,0 @@
----
-layout: presentation
-title: Layout
-description: Description of Layout Algorithms and Approaches
-class: middle, center, inverse
----
-layout: false
-
-
-# Visual Design Tips Employed or Avoided?
-
-.left-column-half[
-<br>
-<br>
-![:img Facebook group page with 4 cards each with a picture and light grey on white fonts,80%](img/layout/facebook-bad.png)
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-]
-
-.right-column-half[
-- #1: Don't rely on blue for small objects
-- #2: Don't rely on blue for older users
-- #3: Make sure that contrast is high enough
-- #4:  Minimize saturated colors
-- #5: Use redundant cues
-- #6: Make things distinct
-- #7: Use small multiples
-- #8: Manage expectations if you can't change response time
-- #9: Replace subtle changes with obvious ones
-- #10: Use well-tested visual grouping strategies
-- #11: Minimize the number of options
-- #12: Rely on recognition rather than recall
-]
-
-.footnote[Shile W, 20sp from a Facebook group page]
-
----
-# Visual Design Tips Employed or Avoided?
-
-
-.left-column-half[
-<br>
-![:img Jackbox games front screen with many visual design tips not followed including using blue,80%](img/layout/jackbox-bad.png)
-<br>
-<br>
-]
-
-.right-column-half[
-- #1: Don't rely on blue for small objects
-- #2: Don't rely on blue for older users
-- #3: Make sure that contrast is high enough
-- #4:  Minimize saturated colors
-- #5: Use redundant cues
-- #6: Make things distinct
-- #7: Use small multiples
-- #8: Manage expectations if you can't change response time
-- #9: Replace subtle changes with obvious ones
-- #10: Use well-tested visual grouping strategies
-- #11: Minimize the number of options
-- #12: Rely on recognition rather than recall
-]
-
-.footnote[Lauren Bricker after visiting Jackbox games in 20sp]
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Introduction to Layout
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
-
----
-name: normal
-layout: true
-class:
----
-
-[//]: # (Outline Slide)
-# Today's goals
-- Announcements
-  - Reminder: Peer review emails will go out Saturday night/Sunday morning
-  - Layout will be released later today
-- Review of tree construction
-- Using tree for layout
-- Container components
-
----
-# Hall of Shame (from [CSE 154](https://courses.cs.washington.edu/courses/cse154/19au/lectures/lec05-css-iii-more-layout/index.html#/))
-
-![:img Terrible website from gatesnfences.com, 50%](https://courses.cs.washington.edu/courses/cse154/19au/lectures/lec05-css-iii-more-layout/images/gatesnfences.png)
-
-Thoughts?
-
-.footnote[[gatesnfences.com](http://www.gatesnfences.com/)]
-
----
-
-![:img Windows tablet screen with a grid of interactive squares...
-icons along the side for invoking menus... and a colorful background
-picture,70%](img/layout/windowsLayout.png)
-
-
-???
-Key Issues
-- where do components get placed?
-- how much space should they occupy?
-
----
-# Review of tree construction
-
-Circle all of the interactors in this interface.
-
-.left-column[![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 150%](img/layout/colormeter.png)]
-
-
----
-# Review of tree construction
-
-Circle all of the interactors in this interface.
-
-.left-column[![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 150%](img/layout/colormetercircled.png)]
-
----
-# What is the interactor hierarchy?
-
-<br>
-
-.left-column30[
-![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 100%](img/layout/colormeter.png)]
-
-
----
-# What is the interactor hierarchy?
-
-Naive version...
-
-.left-column30[
-![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 100%](img/layout/colormeter.png)]
-
-.right-column-half[
-<div class="mermaid">
-graph TD
-W(Window) --> M[Icon:Mag Window]
-W --> A[Slider:Aperture Size x y w h]
-W --> C[Menu:Choice x y w h]
-W --> I[Icon:Color x y w h]
-W --> T[Text:RGB x y w h]
-W --> La[Text:Label x y w h]
-
-classDef blue font-size:14pt,text-align:center
-classDef green font-size:14pt,text-align:center
-
-class W green
-class M,A,C,I,T,La blue
-</div>
-]
-
-???
-Start talking here about meta data that maters, they know about x, y, w and h from doodle
-
-Ask them to think about what else you might want to know to position something?
-
----
-# Why do we need layout?
-.left-column[
-
-<br>
-
-![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 100%](img/layout/colormeter.png)
-]
-.right-column[
-How can you center something?
-
-How can you lock it to an edge?
-
-How can you design layout that reacts (responds) well to turning your phone?
-
-Examples for web (from [CSE 154](https://courses.cs.washington.edu/courses/cse154/19au/lectures/lec05-css-iii-more-layout/index.html#/6))
-- c0FFEE shop with [no layout](https://courses.cs.washington.edu/courses/cse154/19au/lectures/lec05-css-iii-more-layout/code/coffee-shop-solution/coffee-shop.html)
-- c0FFEE shop with [layout](https://courses.cs.washington.edu/courses/cse154/19au/lectures/lec05-css-iii-more-layout/code/coffee-shop-starter/coffee-shop.html)
-]
-
----
-# User Interfaces on Android
-.left-column-half[
-- Views
-  - Base class for __all__ UI elements
-  - Interactors (e.g buttons, labels, image views, etc)
-- ViewGroups
-  - Encapsulates one or more views (e.g. Android Components, **Layouts**)
-  - Can define specific **layout** properties
-
-  We will use the word *Components* to include both layout components and interactors (Views) since you
-  don't generally "interact" with layouts
-]
-
-.right-column-half[
-<div class="mermaid">
-graph TD
-W(ViewGroup) --> V[ViewGroup]
-W --> V1[View]
-W --> V2[View]
-V --> V3[View]
-V --> V4[View]
-V --> V5[View]
-
-classDef blue font-size:14pt,text-align:center
-classDef darkblue font-size:14pt,text-align:center
-
-class W,V darkblue
-class V1,V2,V3,V4,V5 blue
-</div>
-
-]
-
----
-# Practice: Let's try to recreate this layout using containers and spacers
-
-.left-column[![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 150%](img/layout/colormeter.png)]
-
---
-.right-column-half[
-<div class="mermaid">
-graph TD
-W(Window) --> L(LeftSide:DisplayVert)
-W --> R(RightSide:DisplayVert)
-L --> Z[Space:Fixed]
-L --> Y[Space:Stretchy]
-R --> D(RGB DisplayHor)
-D --> V[Space:Fixed]
-D --> U[Space:Flexible]
-
-
-classDef bluegreen font-size:14pt,text-align:center
-classDef blue font-size:14pt,text-align:center
-classDef green font-size:14pt,text-align:center
-classDef yellow font-size:14pt,text-align:center
-
-class W bluegreen
-class L,R,D green
-class Z,Y,V,U yellow
-class M,A,C,I,T,Q blue
-</div>
-]
-
----
-# Practice: Let's try to recreate this layout using containers and spacers
-
-.left-column[![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 150%](img/layout/colormeter.png)]
-
-.right-column-half[
-<div class="mermaid">
-graph TD
-W(Window) --> L(LeftSide:DisplayVert)
-W --> R(RightSide:DisplayVert)
-L --> Z[Space:Fixed]
-L --> M[Icon:Mag Window]
-L --> A[Slider:Aperture Size]
-L --> Y[Space:Stretchy]
-R --> C[Menu:Choice]
-R --> D(RGB DisplayHor)
-D --> V[Space:Fixed]
-D --> I[Icon:Color]
-D --> T[Text:RGB]
-D --> U[Space:Flexible]
-R --> Q[Text:Label]
-
-classDef bluegreen font-size:14pt,text-align:center
-classDef blue font-size:14pt,text-align:center
-classDef green font-size:14pt,text-align:center
-classDef yellow font-size:14pt,text-align:center
-
-class W bluegreen
-class L,R,D green
-class Z,Y,V,U yellow
-class M,A,C,I,T,Q blue
-</div>
-]
-
----
-# Vertical Container Components
-
-.left-column[
-
-![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 150%](img/layout/colormeter.png)
-
-Linear (1D) layout of components
-- Always layout in the same direction
-- Places its direct descendants, in order, in that direction
-
-]
-
-.right-column[
-<div class="mermaid">
-graph TD
-W(Window) --> L(LeftSide:DisplayVert)
-W --> R(RightSide:DisplayVert)
-L --> Z[Space:Fixed]
-L --> M[Icon:Mag Window]
-L --> A[Slider:Aperture Size]
-L --> Y[Space:Stretchy]
-R --> C[Menu:Choice]
-R --> D(RGB DisplayHor)
-D --> V[Space:Fixed]
-D --> I[Icon:Color]
-D --> T[Text:RGB]
-D --> U[Space:Flexible]
-R --> Q[Text:Label]
-
-classDef bluegreen font-size:14pt,text-align:center
-classDef darkblue font-size:14pt,text-align:center
-classDef blue font-size:14pt,text-align:center
-classDef green font-size:14pt,text-align:center
-classDef yellow font-size:14pt,text-align:center
-
-class L,R darkblue
-class W bluegreen
-class D green
-class Z,Y,V,U yellow
-class M,A,C,I,T,Q blue
-</div>
-
-]
-
----
-# Horizontal Container Components
-
-.left-column[
-![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 150%](img/layout/colormeter.png)
-
-Same: Linear (1D) layout of components
-- Always layout in the same direction
-- Places its kids, in order, in that direction
-]
-
-.right-column[
-<div class="mermaid">
-graph TD
-W(Window) --> L(LeftSide:DisplayVert)
-W --> R(RightSide:DisplayVert)
-L --> Z[Space:Fixed]
-L --> M[Icon:Mag Window]
-L --> A[Slider:Aperture Size]
-L --> Y[Space:Stretchy]
-R --> C[Menu:Choice]
-R --> D(RGB DisplayHor)
-D --> V[Space:Fixed]
-D --> I[Icon:Color]
-D --> T[Text:RGB]
-D --> U[Space:Flexible]
-R --> Q[Text:Label]
-
-classDef bluegreen font-size:14pt,text-align:center
-classDef darkblue font-size:14pt,text-align:center
-classDef blue font-size:14pt,text-align:center
-classDef green font-size:14pt,text-align:center
-classDef yellow font-size:14pt,text-align:center
-
-class D darkblue
-class W bluegreen
-class L,R,D green
-class Z,Y,V,U yellow
-class M,A,C,I,T,Q blue
-</div>
-
-
-]
-
----
-# Spacers
-
-.left-column[
-![:img Color Meter Mac App -- shows the RGB values for whatever pixel the cursor is over, 150%](img/layout/colormeter.png)
-
-- Work extra well with layout containers
-- We can add *Fixed Space* (struts)
-  - Think of it like a strut in a building
-  - They hold things a fixed distance apart
-- We can also add *Stretchy Space* (springs)
-  - they push things apart as much as possible
-]
-
-.right-column[
-<div class="mermaid">
-graph TD
-W(Window) --> L(LeftSide:DisplayVert)
-W --> R(RightSide:DisplayVert)
-L --> Z[Space:Fixed]
-L --> M[Icon:Mag Window]
-L --> A[Slider:Aperture Size]
-L --> Y[Space:Stretchy]
-L --> C[Menu:Choice]
-R --> D(RGB DisplayHor)
-D --> V[Space:Fixed]
-D --> I[Icon:Color]
-D --> T[Text:RGB]
-D --> U[Space:Flexible]
-R --> Q[Text:Label]
-
-classDef bluegreen font-size:14pt,text-align:center
-classDef darkblue font-size:14pt,text-align:center
-classDef blue font-size:14pt,text-align:center
-classDef green font-size:14pt,text-align:center
-classDef yellow font-size:14pt,text-align:center
-
-class Y,Z,V,U darkblue
-class W bluegreen
-class L,R,D green
-class Z,Y,V,U yellow
-class M,A,C,I,T,Q blue
-</div>
-
-]
-
-
----
-
-.left-column-half[
-# Example (Layout Assignment)
-
-![:img Picture of Pintrest, 50%](img/layout/pinterest-android.png)
-]
-
-.right-column30[
-![:img Picture of layout part 3, 60%](img/layout/pinterest-replica.png)
-]
-
-???
-This is the kind of stuff we can do thanks to viewgroups
-
----
-# Example (Layout Assignment, part 3)
-
-.left-column-half[
-I've highlighted things that are visible (as opposed to just doing layout work)
-<div class="mermaid">
-graph TD
-C[ViewGroup:ConstraintLayout]
-C --> Column1[ViewGroup:Column1]
-C --> Column2[ViewGroup:Column2]
-Column1 --> V1[View:Fox]
-Column1 --> V2[View:Squirrel]
-Column1 --> V3[...]
-Column2 --> V4[View:Duckling]
-Column2 --> V5[...]
-
-classDef darkblue font-size:14pt,text-align:center
-classDef blue font-size:14pt,text-align:center
-
-class C,Column1,Column2 blue
-class V1,V2,V3,V4,V5 darkblue
-</div>
-
-]
-.right-column30[
-![:img Picture of layout part 3,60%](img/layout/pinterest-replica.png)
-]
-
-???
-This is the kind of stuff we can do thanks to viewgroups
-
----
-# Android's runtime view of the same
-
-.left-column[
-![:img Picture of the android studio tools menu with Layout Inspector highlighted, 100%](img/layout/layout-inspector-menu.png)
-
-VERY IMPORANT debugging tool
-]
-.right-column-half[
-![:img Picture of Part3 of the assignment running with the related interactor hierarchy at right, 50%](img/layout/part3-runtime.png)
-]
-
----
-# Layout Assignment
-
-.left-column[
-![:img Part1: picture of animals a button and a big textbox in a phone held vertically, 65%](img/layout/1_portrait.png)
-
-You can scroll this and the images are all equidistant.
-]
-.right-column[
-- Part 1 is about basic reactive layout using XML and constraints for a fixed number of images
-- Part 2 replicates this in code for a fixed number of images
-- Part 3 you create a *Layout Container* that can do a fancier layout, for an arbitrary number of images **Pintrest** style!
-- Part 4 you try to recreate a layout of your choice!
-
-]
-
----
-# Brief Diversion: What is XML?
-- XML stands for eXtensible Markup Language
-- A superset of HTML
-  - Tag names are surrounded by '<' and '>''s (Alligators or "wakkas")
-  - Tags are generally in pairs such as `<html>` `</html>` or can be self closing `<ImageView />`
-  - Tags can have attributes such as
-
-     `<tagname attribute="value" attribute="value"> content </tagname>`
-
----
-# Layout in Android
-.left-column-half[
-
-![:img A simple layout on an android watch with a textview and two buttons (save and discard),100%](img/layout/layout-demo.png)
-]
-
-.right-column-half[
-This is Android's GUI layout editor
-
-Where's the interactor hierarchy here?
-]
-
-???
-point out the "space"
-
----
-# Layout in Android
-.left-column-half[
-
-![:img A simple layout on an android watch with a textview and two buttons (save and discard),100%](img/layout/layout-demo.png)
-]
-
-.right-column-half[
-This is Android's GUI layout editor
-
-Where's the interactor hierarchy here?
-- It's the component tree!
-- The XML is a visual way of specifying the hierarchy that exists once the XML is loaded into the application
-
-What are the leaf nodes?
-Do you see anything unusual?
-]
-
-???
-point out the "space"
-
-
----
-# What is a spacer?
-.left-column-half[
-
-![:img A simple layout on an android watch with a textview and two buttons (save and discard),100%](img/layout/layout-demo.png)
-
-]
-
-.right-column-half[
-
-What is a Space?
-- Works extra well with layout containers
-- We can add *struts*
-  - Think of it like a strut in a building
-  - They hold things a fixed distance apart
-- We can also add *springs*
-  - they push things apart as much as possible
-
-```xml
-<Space
-  android:layout_width="0dp"
-  android:layout_height="wrap_content"
-  android:layout_weight="1" />
-```
-]
-
-???
-see next slide!
-
----
-# Layout in Android
-.left-column-half[
-
-![:img A simple layout on an android watch with a textview and two buttons (save and discard),100%](img/layout/layout-demo.png)
-]
-.right-column-half[
-In this case, they are in a `LinearLayout`
-- It always has a direction (horizontal or vertical)
-- And it places its kids, in order, in that direction, within its bounds
-
-Where is the linear layout on the screen?
-]
-
----
-# Layout in Android
-.left-column-half[
-
-![:img A simple layout on an android watch with a textview and two buttons (save and discard),100%](img/layout/layout-demo.png)
-]
-.right-column-half[
-In this case, they are in a `LinearLayout`
-- It always has a direction (horizontal or vertical)
-- And it places its kids, in order, in that direction, within its bounds
-
-Where is the linear layout on the screen?
-
-It's the box around 'Save and Discard'
-- We call this a *Layout Container*
-- Note: this is not visible in the actual GUI, it's a hidden interactor tree element
-]
----
-# Layout in Android
-.left-column-half[
-
-![:img A simple layout on an android watch with a textview and two buttons (save and discard),100%](img/layout/layout-demo.png)
-]
-.right-column-half[
-A Layout Container can
- - automate a lot of the layout tasks
- - make it much simpler to ensure reliable results
- - use these whenever they do the job
- - you will implement one for your assignment
-]
-
-
----
-# Layout in Android
-Many layout and other attributes for components. You should explore!
-
-![:img Picture of the whole android layout interface showing the possible components that can be added; the component tree (interactor hierarchy; and the attributes for the Save Button; which is selected, 90%](img/layout/design-view.png)
-
-???
-Talk about how there's many layout and other attributes for components that they should explore!
-
----
-# End of Deck
-
-The slides that were here have move to [Layout Part II](../wk03/layout-ii.html)
diff --git a/slides/wk02/people-vision.html b/slides/wk02/people-vision.html
deleted file mode 100644
index e1067dd972909f54a7970e66c8fe2135b5c33f77..0000000000000000000000000000000000000000
--- a/slides/wk02/people-vision.html
+++ /dev/null
@@ -1,1045 +0,0 @@
----
-layout: presentation
-title: Properties of People-- Visual Capacity
-description: Discussion of what we know about people that influences interface design in the vision realm
-class: middle, center, inverse
-
----
-
-# Open poll
-
-<iframe src="https://embed.polleverywhere.com/free_text_polls/sK4PfNJjme9aKeezruC36?controls=none&short_poll=true" width="800" height="600" frameBorder="0"></iframe>
-
-???
-
-
----
-# Critique this ad:
-
-![:img Adobe advertisement in vibrant colors showing a red cloud icon
-on a blueish background along with bold and very thin white text on
-the blueish background and more white text on a
-blue button and a play arrow in light blue on a light grey
-background,100%](img/people/adobe.jp
-
---
-
-Adobe, what were you thinking?
-- Selling Software
-- showing off what they can do
-- Make sure it's said that it is hard to read - thin white line/poor contrest.
-
-???
----
-# Review
-
-.left-column60[
-In the `drawAll()` method for the toolkit:
-
-Which of the following must a parent component do to its own Canvas obect before
-telling a child component to draw itself?
-
-- [a] canvas.translate(child.x, child.y)
-- [b] canvas.clip(parent.x, parent.y, parent.w, parent.h)
-- [c] canvas.translate(-child.x, -child.y)
-- [d] canvas.clip(0, 0, child.w, child.h)
-]
-
---
-.right-column30[
-![:img Animation of the drawAll method with translation and clipping,95%](img/people/drawAll.gif)
-]
---
-
-What does it need to do after the child draws itself?
-
-.footnote[See [How a view is drawn on the screen](https://courses.cs.washington.edu/courses/cse340/20sp/slides/wk02/interface-drawing.html#29)]
-
-???
-Answer: Translate (a), then clip (d)
-Answer 2: (c)
-
-
-
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Properties of People
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-name: normal
-layout: true
-class:
----
-
-[//]: # (Outline Slide)
-
-# Today's goals
-
-- Discuss visual properties of people
-- Discuss memory
-
-## Future Goals
-- Discuss motor control
-
----
-# Administrivia
-
-- Reminder: [Doodle](https://courses.cs.washington.edu/courses/cse340/20sp/assignments/) code is due Thursday night.
-  - IMPORTANT: git add/commit/push - then [TURN IN](https://gitgrade.cs.washington.edu/student/assignment/116/turnin)
-  - Lab will go over this
-- Doodle peer reviews will be out late Saturday or early Sunday. Get these done quickly. They do not take long
-- Layout will be out on Friday
-- Religious accomodations section added to [syllabus](https://courses.cs.washington.edu/courses/cse340/20sp/#Religious-Accommodations)
-(Chag sameach Pesach to those who celebrate)
-
----
-# Visual Properties of People
-
-People's visual abilities have a big impact on everything from how we
-model color to what makes for good design
-
-People have a variety of visual capabilities, which you should know
-- 4.5% of the world population (mostly men) is color blind<sup>1</sup>
-- 17% of the world population live with some vision impairment<sup>2</sup>
-
-Good design is generally more accessible design
-
-*Bad psychology is good enough to support good design (I hope! :)*
-
-.footnote[
-<sup>1</sup>[colourblindawareness.org](www.colourblindawareness.org/colour-blindness/)<br>
-<sup>2</sup>[WHO](https://www.who.int/news-room/fact-sheets/detail/blindness-and-visual-impairment)<br>
-]
-???
-talk about my own disability
-
----
-layout: false
-# What does this image show? (raise hands if you know)
-
-.body[
-![:img Picture of unknown object. Color range is -3500 (blue) to 1000 (red) but
-only yellow and a little blue shows, 40%](img/people/badviz.png)
-]
-.footnote[
-Example from
-http://10qviz.org/home/categories/rainbow-color-map/
-]
-
----
-# What does this image show? (raise hands if you know)
-
-.body[
-![:img Picture of unknown object. Color range is -3500 (blue) to 1000 (red) but
-only yellow and a little blue shows, 40%](img/people/badviz.png)
-![:img Picture of US Coastline (florida). Color range is -3500 (blue)
-to 1000 (white) and range maps well onto values so detail can be made out, 40%](img/people/goodviz.png)
-]
-.footnote[
-Example from
-http://www.research.ibm.com/people/l/lloydt/color/color.HTM
-]
-
-
-???
-So why is the color choice poor?
-- No mapping of color (note on right how blues are used for water, and greens for land)
-- Color is better if you adjust by saturation (purity) or value (brightness) rather than hue (rough color, ie red, green, blue, orange) for mapping. People can more easily see and compare differences in saturation and value over hue. Also, changes in hue don’t naturally map to a scale, whereas saturation and value do.
-
----
-# Visible Spectrum (Human Limits matter!)
-![:img Color spectrum UV to IR (purple to red), 50%](img/people/humanspectrum.png)
-
-.footnote[
-http://insight.med.utah.edu/Webvision/index.html]
----
-.left-column-half[
-## Why RGB
-
-- Match eye's model
-  - Receptor cells for red, green, blue (cones)
-- Receptor cells for grayscale (rods)
-]
-.right-column-half[
-![:img Picture of Rod & Cone cells, 85%](img/people/rods_cones.png)
-]
----
-# Retina covered with light-sensitive receptors
-
-.right-column[
-Rods
-- Primarily for night vision & perceiving movement
-- Sense intensity or shades of gray
-- Can’t discriminate between colors
-- Mostly at edge of retina
-- ~75M – 150M rods
-]
-.left-column[
-![:img Diagram of eye, 120%](img/people/eye.png)
-]
-
----
-# Retina covered with light-sensitive receptors
-
-.right-column[
-Rods
-- ~75M – 150M rods
-
-Cones
-- Used to sense color
-- Mostly in center of retina
-- ~4.5M – 7M cones
-
-Many more rods than cones
-]
-.left-column[
-![:img Diagram of eye, 120%](img/people/eye.png)
-]
----
-# RGB Matches how human vision works
-
-.right-column[
-In Java, CSS, and other GUI programming, color is 24 bit (+ 8 bits for
-alpha transparency)
-
-So 8 bits for each of red, green, blue
-
-- Why not more bits?
-- Why not 64 bit color?
-
-Discuss!
-]
-.left-column[
-![:img RGB color scheme, 100%](img/people/rgb.png)
-]
-
-???
-Humans can’t really see much more colors
-
----
-# RGB Matches how human vision works
-
-.right-column[
-However, RGB isn't all that intuitive (technology centric)
-- Especially artists and visual designers
-- Hard to pick colors in 3d on a 2d screen
-- Or actually perceive them at a cognitive level
-]
-.left-column[
-![:img RGB color scheme, 100%](img/people/rgb.png)
-]
-???
-
----
-# RGB Matches how human vision works
-
-.right-column[
-However, RGB isn't all that intuitive (technology centric)
-- Especially artists and visual designers
-- Hard to pick colors in 3d on a 2d screen
-- Or actually perceive them at a cognitive level
-
-HSV is much better for *people*
-- Hue: Dominant wavelength of light
-- Saturation: Purity (how much white/black mixed in)
-- Value: Luminance or amount of light in color = max(R,G,B)
-]
-.left-column[
-## RGB
-![:img RGB color scheme, 50%](img/people/rgb.png)
-## HSV
-![:img HSV color scheme, 50%](img/people/hsv.png)
-
-]
-
-???
-HSV cylindrical – hue around the outside (angle) on the web value between
-0 and 360 (red is 0, green is 120, blue is 240) and it’s in rainbow
-order), saturation from center to edge, value is top to bottom
-
----
-# Understanding HSV
-
-.left-column[
-![:img HSV color scheme, 100%](img/people/hsv.png)
-]
-
-.right-column[
-- Hue - or color value, is around the circle at the top of the cone.
-- Saturation - the colors get more saturated the further out from the center of the cone
-- Value - the color gets "brighter" the closer you are to the top of the cone and darker the further you go down.
-
-
-]
----
-# Compare the following colors using HSV
-.right-column[
-Which is correct?
-
-- A: Top color has different *hue* than bottom color
-- B: Top color has higher *saturation* than bottom color
-- C: Top color has higher *value* than bottom color
-]
-.left-column[
-![:img Darker and lighter red boxes, 100%](img/people/redcomp.png)
-]
-???
-B: Saturation
-
----
-# Value vs saturation
-
-![Red with varying saturation (to white) and value (to black)](img/people/value-sat.png)
----
-# Question
-
-You have been asked to create a digital-paper compatible interface. As a result; you need to pick colors that will be easily distinguishable in black and white. Which of 'H' 'S' and 'V' should you vary to support black and white display?
-
-???
-last year's answers
-
-![:img You have been asked to create a digital-paper compatible interface. As a result; you need to pick colors that will be easily distinguishable in black and white. Which of 'H' 'S' and 'V' should you vary to support black and white display?, 75%](img/people/q3.png)
-
----
-# Perception of Color is Culturally Defined!
-
-.footnote[
-<sup>1</sup>[New Scientist: Russian speakers get the blues](https://www.newscientist.com/article/dn11759-russian-speakers-get-the-blues/)
-]
-
-.right-column[
-
-Not only are we limited to RGB, but we disagree about how to interpret
-it<sup>1</sup>
-]
-.left-column[
-![:img Picture of blues that not everyone can distinguish,90%](img/people/blues.jpg)
-]
-???
-
-The language you speak can affect how you see the world, a new study of colour perception indicates. Native speakers of Russian – which lacks a single word for “blue” – discriminated between light and dark blues differently from their English-speaking counterparts, researchers found.
-
----
-# And Relative
-
-![:youtube Vergeer and Van Lier illusion,Db4PwJ2LDVk]
----
-# Design Tip #1: Don't rely on Blue for Small Objects
-
-.left-column-half[
-![:img Example webpage from
-https://www.crazyegg.com/blog/why-hyperlinks-are-blue/ describing why
-hyperlinks are blue historically and which has blue hyperlinks, 80%](img/people/bluelinks.png)
-
-]
-.right-column-half[
-- Photopigments not distributed evenly
- - Mainly reds (64%) & few blues (2-4%)
- - Less sensitive to short wavelengths (blue)
-]
-
----
-# Design Tip #1: Don't rely on Blue for Small Objects
-
-.left-column-half[
-![:img Example webpage from
-https://www.crazyegg.com/blog/why-hyperlinks-are-blue/ describing why
-hyperlinks are blue historically and which has blue hyperlinks, 80%](img/people/bluelinks.png)
-
-]
-.right-column-half[
-- Photopigments not distributed evenly
- - Mainly reds (64%) & few blues (2-4%)
- - Less sensitive to short wavelengths (blue)
-- Few blue cones in fovea
- - Harder to see small blue objects you fixate on
- - Blue text also slightly harder to read
-
-
-- So: blue hyperlinks as default is worst choice
-- Note: strong contrast >> avoiding blue
-]
-
----
-# Design Tip #2: Don’t Rely on Blue for Older Users
-
-- As we age, our lens yellows and absorbs <Br> shorter wavelengths
-- Sensitivity to blue is even more reduced
-
-![:img Example article from IEEE pervasive with inaccessible blue on blue text, 40%](img/people/blueonblue.png)
-
----
-# Design Tip #3: Make sure that contrast is high enough
-
-.left-column-half[
-**Accessibility Issue!**
-
-WCAG requires *at least 4.5:1* contrast, so you cannot round a
-contrast ratio up to 4.5:1. For example, #777777 <br>(![:img grey with
-black text,10%](img/people/777777.png) ![:img grey with
-white text,10%](img/people/777777w.png)) is a commonly-used
-shade of gray with a 4.48:1 contrast ratio. It does not meet the WCAG
-contrast threshold.<sup>1</sup>
-]
-.right-column-half[
-![:img Windows tablet screen with a grid of interactive squares...
-icons along the side for invoking menus... and a colorful background
-picture,100%](img/people/windowsLayout.png)]
-
-.footnote[
-[WCAG guidelines on contrast](https://webaim.org/articles/contrast/)
-]
-???
-Test in greyscale
-
----
-# Design Tip #3: Make sure that contrast is high enough
-
-.left-column-half[
-**Accessibility Issue!**
-
-WCAG requires "at least 4.5:1" contrast, so you cannot round a
-contrast ratio up to 4.5:1. For example, #777777 <br>(![:img grey with
-black text,10%](img/people/777777.png) ![:img grey with
-white text,10%](img/people/777777w.png)) is a commonly-used
-shade of gray with a 4.48:1 contrast ratio. It does not meet the WCAG
-contrast threshold.
-]
-
-.right-column-half[
-![:img Windows tablet screen with a grid of interactive squares...
-icons along the side for invoking menus... and a colorful background
-picture,100%](img/people/windowsLayoutGreyscale.png)
-]
-
-
-???
-Test in greyscale
-
-Focus on value over hue or saturation
-
-This will help ensure visibility
-
-Can use a b/w photocopier to help if you already have a GUI
-
-Keep luminance / intensity / value the same from grayscale when moving to color
-
----
-# Designing Tip #4: Minimize saturated Colors
-
-.medium.right-column70[
-- Different wavelengths of light focus at different distances behind
-eye’s lens
-
-- If your GUI has lots of reds and blues, will force lots of
-refocusing and cause fatigue
-
-- Design Implication
- - Pure (saturated) colors require more focusing than less pure
-(desaturated, pastel)
- - Avoid saturated colors in UIs unless really need something to stand
-out (stop sign)
- - Don't follow this advice! [Vibrant Colors in Web Design](https://uxplanet.org/vibrant-colors-in-web-design-20-visually-impactful-websites-to-inspire-you-bc7988da1e95)
-]
-.left-column[
-![:img Picture of President Trump and Hilary Clinton in bright blue
-and red with yellow writing over the top,150%](img/people/saturated.png)
-
-[mediaelection.com](http://mediaelection.com/)
-]
----
-# Where to Find More Color Advice?
-
-.medium.right-column70[
-- Martin Krzywinski<sup>1</sup> on <br>[Brewer Palettes](http://mkweb.bcgsc.ca/brewer/)
-- [Color Brewer](http://colorbrewer2.org/), [Color Scheme
-Desginer](http://colorschemedesigner.com), [Color Schemer](http://colorschemer.com)
-]
-.left-column[![:img Picture of color palette that is vibrant and less saturated, 150%](img/people/color-guidelines.png)]
-.footnote[
-<sup>1</sup>Famous information graphics artist, [bio](http://mkweb.bcgsc.ca/bio/martin-krzywinski-bio.pdf)]
----
-# Color Blindness: Ishihara Test
-![:youtube Ishihara Colorblindness test showing colored dots inside
-colored dots showing numbers,WzAW41DugXQ]
-
-If you can’t see numbers, don’t worry
-- Projectors, LCD screens, CRT, and print all have different dynamic ranges, hard to get them to match
-???
-
-Trouble discriminating colors
-
-About 9% of males, 0.5% of females
-
-Two main types
-- Different photopigment response is common
- - Reduces capability to discern small color diffs
-- Red-green deficiency is best known
- - Lack of either green or red photopigment can’t discriminate colors dependent on R & G
- - More rare are blue-yellow and total color blindness
-
-Some women have a fourth type of cone
-- Estimates are 12% women
-- Some can see more colors than ordinary humans
-
-
----
-# Design Tip #5: Use Redundant Cues
-
-.left-column-half[
-![:img Picture of hexagonal red stopsign and triangular red yield
-sign, 70%](img/people/signs.png)
-]
-
-
-.right-column-half[
-Don't rely solely on Hue: Use mixtures of colors (red / green issues)
-
-Also have contrast in intensity
-
-Consider having other redundant cues too
- - What redundant cues used for traffic signs?
-]
-
-???
-Traffic signs have multiple cues: color, word, shape
-
-another case for using greyscale to test
-
----
-# Gestalt Psychology
-
-A lot of this draws from Gestalt Psychology.
-
-_Gestalt_ means "an organized whole that is perceived as more than the sum of its parts."
-
-Read about other [gestalt psychology](https://www.interaction-design.org/literature/article/the-law-of-similarity-gestalt-principles-1) principles
-- similarity
-- continuation
-- closure
-- proximity
-- figure/ground
-- symmetry and order
-
----
-# People are easy to trick
-
-.left-column50[
-![:img Spheres where the foreground colorr hue 230° & 90° appear similar but the background spheres all base color RGB 255 157 194 appear distinctly pink and orange, 85%](https://pbs.twimg.com/media/EZ_3kqmWkAAU2R9?format=jpg&name=large)
-]
-
-.right-column40[
-From [@NovikProf](https://twitter.com/NovickProf/status/1270005909704638470/photo/1)
-
-Surprising 4: The foreground colors (hue 230° & 90°) appear similar but the background spheres
-(all base color RGB 255 157 194) appear distinctly pink and orange.
-Original .png file is at [http://bit.ly/2O74l2I](http://bit.ly/2O74l2I).
-]
-
-
----
-# People are easy to trick
-
-How do we actually create color? We don't have LEDs of every color
---
-
-- Three LCD cells per pixel
-
-- Keep them small!
-
----
-# Why Pixels are enough
-
-.right-column-half[
-Limits of human perceptual system
-
-Eye reconstructs
-]
-.left-column-half[
-![:img Picture of mona lisa,45%](img/people/monalisa.png) ![:img pixelated
-zoomed in picture of mona lisa, 45%](img/people/pixelmonalisa.png)
-]
----
-# People are easy to trick
-
-How do we actually create color? We don't have LEDs of every color
-
-- Three LCD cells per pixel
-
-- Keep them small!
-
-How might we do grayscale?
-
-???
-make connection to video
----
-# How fast can people see things?
-
-.left-column[
-![:img Picture of a sabertooth tiger,100%](img/people/tiger.png)
-]
-
-.right-column[
-*&lt; ~20ms (1/50 sec) discrete images/flashes merge into continuous perception*
-
-Image you are looking at flickers 60 times per second
-
-Differences in peripheral vision
- -  Sabertooth tigers
-]
----
-# How fast can people see things?
-.left-column[
-![:img Picture of a sabertooth tiger,100%](img/people/tiger.png)
-]
-.right-column[
-*&lt; ~20ms (1/50 sec) discrete images/flashes merge into continuous perception*
-
-Pretty much never have to be faster than this for user response!
-- Get >120 million instructions per core (@3Ghz)
-- High end GPU theoretically as high as 26 *billion* instr.
-- First GUIs had ~20 *thousand*
-]
----
-# Can use this to create greyscale
-
-How might we do grayscale?
-
---
-
-- Black 25% of the time,
-- 40-60 frames per second (FPS)?
-???
-40-60 FPS
-
----
-# Can use this for animation
-- minimum of 10 FPS
-- 24-40 smoother
----
-# How fast can people see things?
-
-&lt; ~20ms (1/50 sec) discrete images/flashes merge into continuous perception
-
-*&lt; ~100-200ms seems like “instant response”*
-- Hard to tell response times below this apart
-- Upper range of eye saccades
-
----
-# Let's try an experiment
-
----
-# Also useful for Pre-attentive processing
-
-.left-column[
-![:img Picture of red squares,170%](img/people/distinct1.png)
-]
-
-.right-column-half[
-On the next couple of slides you're going to see a picture.
-
-- Turn on your mics if you'd like to partipate.
-- If all of the shapes are the same, you'll call out "same", call out "different" if they are different.
-- One of the TAs will time us.
-
-Need a ~~victim~~ volunteer with a stopwatch
-
-]
-
-???
-Grouping looks at how to make things look related
-
-What if we want to make things look different and stand out?
-
-Let's try it: Say out loud:
-
-Same 		if every object is the same
-
-Different 	if at least one object is different
----
-# Pre-attentive processing
-
-![:img Picture of red squares and one red circle,35%](img/people/distinct2.png)
-
-???
-this is about shape
-
----
-# Pre-attentive processing
-
-![:img Picture of blue circles and one red
-circle,35%](img/people/distinct3.png)
-
-???
-this is about color
----
-# Pre-attentive processing
-
-![:img Picture of blue circles with no standout,35%](img/people/distinct4.png)
-
-???
-gotcha!
-
----
-# Pre-attentive processing
-
-![:img Picture of blue circles and one larger blue
-circle,35%](img/people/distinct5.png)
-
-???
-this is about size
----
-# Pre-attentive processing
-
-![:img Picture of blue circles and red squares and one red circle. ,35%](img/people/distinct6.png)
-
-???
-This one doesn't work well
----
-# Design Tip #6 Make things Distinct
-
-![:img Picture of blue circles and red squares and one red circle. ,45%](img/people/distinct7.png)
-
-What other variables might be important to making things distinct?
-???
-From Kevin Mullet and Darrell Sano, Designing Visual Interfaces
-
-- Value
-- Orientation
-- Texture
-- Position (2d/3d)
----
-# Design Tip #7: Use [Small Multiples](https://en.wikipedia.org/wiki/Small_multiple)
-
-.left-column-half[
-
-![:img 5 star rating for a review with the stars being multiples, 30%](img/people/stars.png)
-
-]
-
-![:img Picture of Tufte book cover with examples of small multiples
-including micro-macro readings (clothes of different colors hanging on
-a line) and layering and separation ( people waving signals). ,50%](img/people/tufte.png)
-
-.footnote["Information consists of differences that make a difference" -- Edward --
--- Tufte, Envisioning Information]
-
-
----
-# How fast can people see things?
-
-.left-column-half[
-&lt; ~20ms (1/50 sec) discrete images/flashes merge into continuous perception
-
-&lt; ~100-200ms seems like “instant response”
-
-.bold.blue[&lt; 1-2 seconds typically “good response time”]
-- Similar times in conversational turn taking protocols
-- Longer delays ~5 sec have to say something to keep conversation
-       alive
-- Note: numbers fuzzier as we go out
-]
----
-# How fast can people see things?
-.left-column-half[
-&lt; ~20ms (1/50 sec) discrete images/flashes merge into continuous perception
-
-&lt; ~100-200ms seems like “instant response”
-
-&lt; 1-2 seconds typically “good response time”
-
-.bold.blue[More than  10-15 sec is typically “bad response time”]
-
-- Short Term Memory (STM) g#1 decay effects
-- Web has trained us to accept slower response times
-- However a difference of 250 ms can switch people to a competitor
-]
----
-# How fast can people see things?
-.left-column-half[
-&lt; ~20ms (1/50 sec) discrete images/flashes merge into continuous perception
-
-&lt; ~100-200ms seems like “instant response”
-
-&lt; 1-2 seconds typically “good response time”
-
-.bold.blue[More than  10-15 sec is typically “bad response time”]
-]
-.right-column-half[
-.quote["Two hundred fifty msec, either slower or faster, is close to
-the magic number now for competitive advantage on the Web"]
-]
-.footnote[Harry Shum, a computer scientist and speed specialist at Microsoft]
-
----
-# Design Tip #8: Manage Expectations
-
-Long response times are more manageable if you
-
-- Tell people what to expect, be predictable (follow through)
-
-- Also good to support interrupts
-
----
-
-# How fast can people see things?
-.left-column-half[
-&lt; ~20ms (1/50 sec) discrete images/flashes merge into continuous perception
-
-&lt; ~100-200ms seems like “instant response”
-
-&lt; 1-2 seconds typically “good response time”
-
-.bold.blue[More than  10-15 sec is typically “bad response time”]
-]
-
-.right-column-half[
-Can also manipulate perception: [Chris Harrison's
-work](http://chrisharrison.net/index.php/Research/ProgressBars2)
-
-
-![:youtube Harrison progress bar manipulation shows how animation of
-progress bars changes perception of response time,CDnN3wLY3OE]
-]
-
----
-# How fast can people see things?
-
-.left-column-half[
-&lt; ~20ms (1/50 sec) discrete images/flashes merge into continuous perception
-
-&lt; ~100-200ms seems like “instant response”
-
-&lt; 1-2 seconds typically “good response time”
-
-More than  10-15 sec is typically “bad response time”
-
-.bold.blue[No response: Change Blindness]
-]
-.right-column-half[
-![:youtube Video of someone asking for directions while another person
-walks by with a door,FWSxSQsspiQ]
-]
-
-???
-
-- Subtle changes over time
-- Distractors
-- Discontinuities (Ex. in movies)
-
----
-# How fast can people see things?
-
-.left-column-half[
-&lt; ~20ms (1/50 sec) discrete images/flashes merge into continuous perception
-
-&lt; ~100-200ms seems like “instant response”
-
-&lt; 1-2 seconds typically “good response time”
-
-More than  10-15 sec is typically “bad response time”
-
-.bold.blue[No response: Change Blindness]
-]
-.right-column-half[
-![:youtube Video of basketball players, 0grANlx7y2E]
-]
----
-# Design Tip #9: Replace subtle changes with obvious ones
-
-![:img Picture of a web page form,40%](img/people/web1.png)
----
-# Design Tip #9: Replace subtle changes with obvious ones
-
-![:img Picture of a web page form,40%](img/people/web2.png)
----
-# Design Tip #9: Replace subtle changes with obvious ones
-
-![:img Picture of a web page form,40%](img/people/web3.png)
----
-
-# What's wrong with these buttons?
-
-![:img Picture of an elevator button panel with the labels and buttons
-not visually associated leading to ambiguity,40%](img/people/elevator1.png)
-
-???
-No clear association between buttons and labels
----
-# Better grouping strategy
-
-![:img Picture of an elevator button panel with the labels and buttons
- visually associated removing ambiguity,40%](img/people/elevator2.png)
-
-???
-Clear association between buttons and labels
-
----
-# Good or bad?
-
-Review Star Labels | Icon Labels
-----|----
-![:img Similar issue but with star ratings for multiple categories of issues such as durability and fun ambiguously associated on Amazon,80%](img/people/amazon.png) | ![:img Similar issue but with labels for icons on Facebook,60%](img/people/facebook.png)
-
-???
-No clear association between icons and labels
-
----
-# Design Tip #10: Use well-tested visual grouping strategies
-
-.right-column[![:img Visual grouping strategies including proximity similarity and
-connections between related things are shown in the image. For example
-putting things close together that are grouped and further otherwise
-is proximity. Using color or shape could be for similarity. Lines can support connections. ,40%](img/people/visualgrouping.png)
-]
----
-# But not too many groups!
-
-[Hick's law](https://en.wikipedia.org/wiki/Hick%27s_law): Reaction
- time (RT) is logarithmically related to the number of options
- .jax[$$RT = T * log_2(n+1)$$]
-
- - in other words people use *binary search*
- - Assumes there is a logic to the ordering (worse when random)
-
- - General case: Information foraging theory (Pirolli & Card)
-
----
-# Design Tip #11: Minimize the number of options
-
-With every additional choice the time it will take
- more time for  selection
-
-
----
-# How much can a person remember?
-
-Short term (working memory)
-- Famous 7 +/- 2 “chunks” (Somewhat outdated model)
- - 2461827176
- - YBEAMBIMGC
-
----
-# How much can a person remember?
-
-Short term (working memory)
-- Famous 7 +/- 2 “chunks” (Somewhat outdated model)
- - 2461827176 vs (412) 268-1776
- - YBEAMBIMGC vs EBAY IBM GMC
-
----
-# Chunking in practice
-
-![:img 4 different example ribbons from microsoft demonstrating
-chunking of related functions, 70%](img/people/chunking.png)
----
-
-# How much can a person remember?
-
-Short term (working memory)
-- Famous 7 +/- 2 “chunks” (Somewhat outdated model)
-- Basically: “very limited” and “decays quickly”
-- Has become “worse” with constant multitasking
-
---
-Long term
-- Essentially unbounded
-- But requires effort & may not always work on cue
-- Can’t explicitly forget! Even though you try!
----
-# How much can a person remember?
-
-Short term
-- 7 +/- 2 "chunks" (or less); decays quickly
-
-Long term
-- Essentially unbounded, but slower
-
-Novice / expert differences
--  Experts have learned items in long term memory to draw on, novices don’t
-
----
-# Design Tip #12: Rely on Recognition rather than Recall
-.right-column[
-Cannot count on memory to be there, or be fast!
-
-- Generally better to rely on recognition (seeing it in front of you)
-than just recall (having to pull it out of long term memory)
-
--  But note that having the ability to operate from recognition does
-not preclude recall
-]
-.left-column[
-![:img Example of printer dialog with image of printed page at top
-right illustrating impact of settings and thus supporting recognition,
-110%](img/people/recognition.png)
-]
----
-# Recap of Design Tips for Vision
-
-- #1: Don't rely on blue for small objects
-- #2: Don't rely on blue for older users
-- #3: Make sure that contrast is high enough
-- #4:  Minimize saturated colors
-- #5: Use redundant cues
-- #6: Make things distinct
-- #7: Use small multiples
-- #8: Manage expectations if you can't change response time
-- #9: Replace subtle changes with obvious ones
-- #10: Use well-tested visual grouping strategies
-- #11: Minimize the number of options
-- #12: Rely on recognition rather than recall
-
----
-# Summary
-
-Human Physiology drives design
-- Number of colors
-- Pixel size (retina displays)
-
-Good design is accessible design
-
-- There is tons to know about good use of color and other visual
-design elements. For not, the simplest thing to do is to look for existing color palettes, and just those. That should account for the vast majority of your needs for colors. There is also red-green color blindness too. Simplest thing to do is to turn your screens into greyscale, and see if you can see differences.
-
----
-# End of deck (unused slides past here)
----
-# Demonstrate your Understanding of HSV
-
-You have been asked to create a digital-paper compatible interface. As
-a result, you need to pick colors that will be easily distinguishable
-in black and white. Which of 'H' 'S' and 'V' should you vary to
-support black and white display?
-
-Which is correct?
-- A: Hue
-- B: Saturation
-- C: Value
-
-???
-C Value
-
----
-
-# Aside: Color Gamuts<sup>1</sup>
-
-![:youtube Explanation of color gamuts,8y9yENEdtG4]
-
-.footnote[
-<sup>1</sup>
-See the [Wikipedia page on color
-gamuts](http://en.wikipedia.org/wiki/Gamut) for more information]
-
-???
-- no time to play video
-- Outside is wavelengths (hues)
-- Triangle shows primary colors for this gamut
----
diff --git a/slides/wk03/examlet.html b/slides/wk03/examlet.html
deleted file mode 100644
index 5e865cfd2d80d936f639bd9839237df380066821..0000000000000000000000000000000000000000
--- a/slides/wk03/examlet.html
+++ /dev/null
@@ -1,20 +0,0 @@
----
-layout: presentation
-title: AMA/Examlet
-description: Review, then assessment.
----
-
-# On Tap for today
-
-Part 1: Review on anything up to 4/9 (25 minutes)
-
-Part 2: Our Examlet. (25 minutes)
-  - The examlet will open at 10:55 - 25 minutes into class.
-  - The expectation is that everyone that is in our timezone (PDT) or close to PDT would take this before the end of class.  I have
-  spoken to the students I know are not in this time zone separately
-  - You should start right away as you would in a traditional classroom and not wait around.
-  - We will be checking to see that everyone has taken it by 11:45am
-  - You will not need to stay on Zoom to take the assessment. However we will stay in the classroom session in case you have questions about the format etc.
-  - This should be about 20 minutes, but you will have a buffer to 25 minutes to ensure that everyone can submit on time.
-  - If you have problems with any of the technology you MUST get in touch with the course staff immediately.
-  - You may use your notes, the website, take a look at your code, etc, but *you may not collaborate with others on the exam*.
diff --git a/slides/wk03/img/layout-algorithm/android-linear.png b/slides/wk03/img/layout-algorithm/android-linear.png
deleted file mode 100644
index 6b252da67203bb2e57a21a65c2b442d1e7e14a9d..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/android-linear.png and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/bad-layout.jpg b/slides/wk03/img/layout-algorithm/bad-layout.jpg
deleted file mode 100644
index 55cf47438eb8cae311aa26180659dbc9d7975f50..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/bad-layout.jpg and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/badLayout.png b/slides/wk03/img/layout-algorithm/badLayout.png
deleted file mode 100644
index 1272a6dab0bd83e82e70988038b0ca788e522d15..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/badLayout.png and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/constraints.png b/slides/wk03/img/layout-algorithm/constraints.png
deleted file mode 100644
index 78898ddb4fc866d46c7981a84778ddd14ebdd44b..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/constraints.png and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/goodLayout.png b/slides/wk03/img/layout-algorithm/goodLayout.png
deleted file mode 100644
index ad8b0eee3f09ef6e9fa90147d74456ad290929de..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/goodLayout.png and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/pinterest-android.jpg b/slides/wk03/img/layout-algorithm/pinterest-android.jpg
deleted file mode 100644
index 3c36582648b9294fa1bfbbaf56f7f0f9fcc8d670..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/pinterest-android.jpg and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/quiz1.png b/slides/wk03/img/layout-algorithm/quiz1.png
deleted file mode 100644
index 80e63bddd1e58cee348d0f8bff3c241b688745ec..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/quiz1.png and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/quiz2.png b/slides/wk03/img/layout-algorithm/quiz2.png
deleted file mode 100644
index 024ddbdd8c6f8a519caa3ab8ac5908c24fd27166..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/quiz2.png and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/trylayout.png b/slides/wk03/img/layout-algorithm/trylayout.png
deleted file mode 100644
index d001b208ec53f2c7ece0a3aaf50adffe8a453125..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/trylayout.png and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/watch3.png b/slides/wk03/img/layout-algorithm/watch3.png
deleted file mode 100644
index ce7134c4b0c57883931335e40fef086a366e7294..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/watch3.png and /dev/null differ
diff --git a/slides/wk03/img/layout-algorithm/worseLayout.png b/slides/wk03/img/layout-algorithm/worseLayout.png
deleted file mode 100644
index b94189d6c98f546d08d4aced03c7dfaf972e34a1..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-algorithm/worseLayout.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/constraint-editor.png b/slides/wk03/img/layout-ii/constraint-editor.png
deleted file mode 100644
index cb898264dbb375ea8f1fe36aa38180cf76f5ceee..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/constraint-editor.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/constraints.png b/slides/wk03/img/layout-ii/constraints.png
deleted file mode 100644
index 78898ddb4fc866d46c7981a84778ddd14ebdd44b..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/constraints.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/design-view.png b/slides/wk03/img/layout-ii/design-view.png
deleted file mode 100644
index 76f63830d1dbd0e0388c6ce7f57bd2b3d7618db9..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/design-view.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/explore-devices.png b/slides/wk03/img/layout-ii/explore-devices.png
deleted file mode 100644
index f226288d9e058fef8b2b28d1f9836d908661407a..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/explore-devices.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/fixed.png b/slides/wk03/img/layout-ii/fixed.png
deleted file mode 100644
index 412bad473f486a9178681db203cbae918e767c56..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/fixed.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/layoutparams.png b/slides/wk03/img/layout-ii/layoutparams.png
deleted file mode 100644
index 1e80c2fef10e2de5d5b0691481112a8dc323744f..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/layoutparams.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/layouttoolbar.png b/slides/wk03/img/layout-ii/layouttoolbar.png
deleted file mode 100644
index be73a95c45ee9ec84379257721b63951c60e7f2f..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/layouttoolbar.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/linearlayout.png b/slides/wk03/img/layout-ii/linearlayout.png
deleted file mode 100644
index ab3d68b83b6c5a7cb915ab87c6c75cfb4b952864..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/linearlayout.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/match.png b/slides/wk03/img/layout-ii/match.png
deleted file mode 100644
index 96fdca857d70a2ecd6c7f3e4e2b1e2493865cd10..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/match.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/modern-yahoo.png b/slides/wk03/img/layout-ii/modern-yahoo.png
deleted file mode 100644
index 0760609a794ec4c1a2797bdbfd5d5190fc9723da..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/modern-yahoo.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/part1-diagram.png b/slides/wk03/img/layout-ii/part1-diagram.png
deleted file mode 100644
index d35a62e29abba453847a525fc4eba2956e1d34d2..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/part1-diagram.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/spottheheron-prototype.png b/slides/wk03/img/layout-ii/spottheheron-prototype.png
deleted file mode 100644
index 240a67f5cbb7a18f176a778be692c4e09d26ec7f..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/spottheheron-prototype.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/spottheheron-wireframe.png b/slides/wk03/img/layout-ii/spottheheron-wireframe.png
deleted file mode 100644
index f54d313eb11c98a26d1dc0d1b855b902bbe1b875..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/spottheheron-wireframe.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/text-view.png b/slides/wk03/img/layout-ii/text-view.png
deleted file mode 100644
index 1d49a12ee182cd49abf523f77607b1f62b181c73..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/text-view.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/watch.png b/slides/wk03/img/layout-ii/watch.png
deleted file mode 100644
index 44b8d98d37b56d24272f42df63a5ae6cb3d40700..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/watch.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/watch3.png b/slides/wk03/img/layout-ii/watch3.png
deleted file mode 100644
index ce7134c4b0c57883931335e40fef086a366e7294..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/watch3.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/wrap.png b/slides/wk03/img/layout-ii/wrap.png
deleted file mode 100644
index 6cc11d6b590c7545445ea02762584ac07f51d6af..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/wrap.png and /dev/null differ
diff --git a/slides/wk03/img/layout-ii/xml-files.png b/slides/wk03/img/layout-ii/xml-files.png
deleted file mode 100644
index 97e22458b2bb3db69d909a66b8df2e0b0e32a16a..0000000000000000000000000000000000000000
Binary files a/slides/wk03/img/layout-ii/xml-files.png and /dev/null differ
diff --git a/slides/wk03/layout-algorithm.html b/slides/wk03/layout-algorithm.html
deleted file mode 100644
index 1861944f3761e789c63e121e82e238474720e642..0000000000000000000000000000000000000000
--- a/slides/wk03/layout-algorithm.html
+++ /dev/null
@@ -1,800 +0,0 @@
----
-layout: presentation
-title: Layout Algorithms
-description: Introduction the implementation of layout
-class: middle, center, inverse
----
-
-# Hall of Fame or Hall of Shame?
-
-.left-column-half[
-Think about those Visual Design Tips!
-
-![:img Picture of two layouts with very small areas for interaction or images that are too small to see, 60%](img/layout-algorithm/bad-layout.jpg)
-]
-
-.right-column-half[
-
-- #1: Don't rely on blue for small objects
-- #2: Don't rely on blue for older users
-- #3: Make sure that contrast is high enough
-- #4:  Minimize saturated colors
-- #5: Use redundant cues
-- #6: Make things distinct
-- #7: Use small multiples
-- #8: Manage expectations if you can't change response time
-- #9: Replace subtle changes with obvious ones
-- #10: Use well-tested visual grouping strategies
-- #11: Minimize the number of options
-- #12: Rely on recognition rather than recall
-]
-
----
-
-# What went wrong?
-.left-column50[![:img File browser with toolbar, 90%](img/layout-algorithm/goodLayout.png)]
-.right-column50[![:img File browser with only half of same toolbar, 80%](img/layout-algorithm/badLayout.png)]
-
-???
-- Changing available space e.g., window resized by user
-- Changing sizes, fonts, etc.
-- Adding and removing components
-- Layout mechanism has to deal with all cases
----
-# What went wrong?
-![:img File browser with only half of same toolbar, 80%](img/layout-algorithm/worseLayout.png)
-
-???
-- No scroll bar for text boxes that are too narrow
-- No way to redistribute space between directory & file list
-- Important controls (e.g., Open) get hidden
-- Min size is much too small
-- No way to send the dialog away (buttons gone)
-
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-
-# Layout Algorithms
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
-
----
-name: normal
-layout: true
-class:
-
----
-layout: false
-
-[//]: # (Outline Slide)
-# Goals for today
-- __Review__
-- How layout is implemented in the toolkit
-
----
-# Review: XML Inflation
-
-
-Inflation in `MainActivity#onCreate(Bundle)`:
-```java
-// contents is the ScrollView
-contents.addView(getLayoutInflater().inflate(R.layout.part1solution, null), PARAMS);
-```
-
-To break this down, recall that `MainActivity` inherits (indirectly) from  `Context`
-```java
-LayoutInflater inflater = getLayoutInflater();         // ask the Context for the inflater
-View newView = inflater.inflate(R.layout.part1, null); // newView is at the root of the inflated tree
-contents.addView(newView, PARAMS);                     // attach the newView to the parent
-```
-
-In a View (in say `Part3View.java`) get the inflater this way:
-```java
-LayoutInflater inflater = LayoutInflater.from(context); // Use a static method to get the inflater
-// The rest is the similar
-```
-???
-Remind that you can inflate once but use many times
-
----
-# Review: Adding Programatically
-
-Adding a view programatically in `MainActivity` broken down in steps
-1. The LayoutParams are created
-2. The new view is created
-3. Use [ViewGroup#addView(View, ViewGroup.LayoutParams)](https://developer.android.com/reference/android/view/ViewGroup#addView%28android.view.View,%20android.view.ViewGroup.LayoutParams%29)
-method on the parent to add it to the Interactor Hierarchy (with the params)
-
-```java
-public static final RelativeLayout.LayoutParams PARAMS = new RelativeLayout.LayoutParams(
-            RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
-....
-Part2View p2v = new Part2View(this, getImageStrings(), vMargin);
-contents.addView(p2v, PARAMS);
-```
----
-# Review: Adding Programatically
-
-A slightly different way:
-1. Create the new view
-2. Add it to the parent using [ViewGroup#addView(View)](https://developer.android.com/reference/android/view/ViewGroup#addView%28android.view.View%29)
-3. Set up the LayoutParams
-4. Add the LayoutParams to the view
-
-```java
-public static final RelativeLayout.LayoutParams PARAMS = new RelativeLayout.LayoutParams(
-            RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
-...
-Part2View p2v = new new Part2View(this, getImageStrings(), vMargin);
-contents.addView(p2v);
-// Add more setup for the params if needed.
-contents.setLayoutParams(PARAMS);
-```
-
----
-# Solutions to [LayoutLab](https://github.com/harshitha-akkaraju/layoutlab)
-
-Don't peek until you've tried it :)
-
-- [Inflation](https://github.com/harshitha-akkaraju/layoutlab/blob/complete/app/src/main/res/layout/activity_main.xml)
-- [Programatically](https://github.com/harshitha-akkaraju/layoutlab/blob/complete/app/src/main/java/com/harshiakkaraju/layoutlab/ProgrammaticConstraints.java)
-
----
-# Aside: changing properties dynamically
-
-What if you canted to change background color of all of the buttons to red?
-
-
-```java
-for (int i = 0; i &lt; layout.getChildCount(); i++) {
-  view = layout.getChildAt(i);
-  view.setBackgroundColor(Color.RED);
-}
-```
-
----
-# Reminder: Layout Types in Android
-
-- [FrameLayout](https://developer.android.com/reference/android/component/FrameLayout.html) - good for position views on
-top of each other, or encapsulating a bunch of views. Used in [Doodle](/assignments/doodle).
-
-- [__LinearLayout__](https://developer.android.com/reference/android/component/LinearLayout.html) - places views one after
-the other in order according to the orientation (Horizontal or Vertical). Used in [Layout](/assignments/layout).
-
-- [__RelativeLayout__](https://developer.android.com/reference/android/widget/RelativeLayout) - Positions of the children
-are desribed in relation to one another
-
-- [__TableLayout__](https://developer.android.com/reference/android/component/TableLayout.html) - Rows and columns style
-way of declaring a layout
-
-- [GridLayout](https://developer.android.com/reference/android/component/GridLayout.html) - Uses
-an [*adapter*](https://developer.android.com/reference/android/interactor/Adapter.html) that provides items to display in
-a grid
-
-- [ConstraintLayout](https://developer.android.com/reference/android/component/ConstraintLayout.html) Let's you use constraints to specify how things should lay out. Used in [Layout](/assignments/layout).
-
-
-- More on https://developer.android.com/guide/topics/ui/declaring-layout.html
-
-???
-
-Talk about different Toolkits may have different layouts.
-
----
-
-# Layouts in Play
-
-.left-column-half[
-Which layouts are used in these apps?
-]
-.right-column-half[
-![:img Pinterest layout, 36%](img/layout-algorithm/pinterest-android.jpg)
-![:img Pinterest layout, 35%](img/layout-algorithm/android-linear.png)
-]
-
---
-.left-column-half[
-Probably:
-- **LinearLayout**
-- **ConstraintLayout**
-
-Thinking about what layouts are in an app is part of your Part 4 of the Layout assignment.
-]
-
----
-# General & Powerful Approach: Constraints
-
-General mechanism for establishing and maintaining relationships between things
-- Layout is one use
-- Several other uses in UI
- - Connection of application to UI, e.g. deriving appearance from data
- - Multiple views of same data
- - Automated semantic feedback
- - Automatic arrangement of lines (powerpoint snapping!)
-
----
-layout: false
-
-## ConstraintLayout in Android
-
-.left-column[
-![:img A simple layout on an android watch with a textview and two
-buttons (save and discard) and the constraints highlighted,100%](img/layout-algorithm/watch3.png)
-]
-.right-column[
-- [ConstraintLayout](https://developer.android.com/reference/android/support/constraint/ConstraintLayout)
-  - Allows you to position widgets in a flexible way
-  - Useful for building **responsive** interfaces in Android.
-
-- You will be using ConstraintLayout for the Layout exercise
-
-- Review Monday's slides for more details
-]
-
----
-layout: false
-
-[//]: # (Outline Slide)
-# Goals for today
-- Review
-- **How layout is implemented in the toolkit**
-
----
-# Time to talk about position again
-
-.left-column-half[
-.quote[You have been asked to create a new `CircleView` object that can draw a circle in our
-`drawingView` object in Doodle. The user wants to add a circle so that the center point is at
-(100,100) on the drawingView and has a radius of (10). In `CircleView#onDraw(Canvas)` you will
-need to call `canvas.drawCircle(cx, cy, radius, paint)` (note that drawCircle takes the (x, y)
-location of the center of the circle as input). What values should you use for `cx` and `cy`
-in this your onDraw code?]
-]
-
-.right-column-half[
-![:img Quiz results showing that many people correctly selected 10 10 although some incorrectly selelected 100 100, 100%](img/layout-algorithm/quiz1.png)
-]
-
----
-# Time to talk about position again
-.left-column-half[
-.quote[Consider the same CircleView object that contains a circle of radius 10 that we want to
-display in the drawingView so the center appears at `100, 100` in the parent view's coordinate system.
-How should we set up the bounding box for the `CircleView` so that its canvas will be correctly
-clipped? What are `x`, `y`, `width` and `height` for the bounding box (in parent coordinates?)]
-]
-.right-column-half[
-![:img Quiz results showing that many people correctly selected 90 90 20 20, 100%](img/layout-algorithm/quiz2.png)
-
-]
-
----
-# Time to talk about position again
-
-.left-column-half[
-
-.quote[You have been asked to create a new `SquareView` object that can draw a square. The user
-  wants to add a square with its top left corner at (150,50) and a width of (20). In `SquareView.onDraw()`
-  you will need to call `canvas.drawRect(left, top, right, bottom, paint)` What values should
-  you use for `left` and `top`?
-]
-]
-???
-(0,0)
---
-.right-column-half[
-`(0,0)`
-]
----
-# Time to talk about position again
-.left-column-half[
-.quote[Consider the same square (at `150,50` with a width of `20` in its parent). How should we set
-up the bounding box for the `SquareView` so that its `Canvas` will be correctly clipped?
-What are `x`, `y`, `width` and `height` for the bounding box (in parent coordinates?)
-]
-]
-???
-(150,50,20,20)
---
-.right-column-half[
-`(150,50,20,20)`
-]
----
-# So: what have we learned?
-
-
---
-When an interactor draws itself, its drawing area always starts at (0,0)
-
-The *View* that interactor is in (it's *parent*) determines the location of its bounding box. This is what correctly positions it!
-
----
-# How does layout come into this?
-
-In Doodle you hard-coded the position of everything (or used animation to set it)
-
-But in most interfaces, we use *layout containers* to accomplish this.
-- Layout containers make decisions like "stack these views vertically" or "make them fit into this size area" and set their position and bounding box on this basis
-- The *toolkit architecture* then helps to enforce this
-
----
-# How is position calculated by the toolkit architecture?
-.left-column-half[
-<br>
-<br>
-
-<div class="mermaid">
-graph TD
-W(ViewGroup) --> V[ViewGroup]
-W --> V1[View]
-W --> V2[View]
-V --> V3[View]
-V --> V4[View]
-V --> V5[View]
-
-classDef blue font-size:14pt,text-align:center
-classDef darkblue font-size:14pt,text-align:center
-
-class W,V darkblue
-class V1,V2,V3,V4,V5 blue
-</div>
-]
-.right-column-half[
-- The Component (Interactors + ViewGroups) Hierarchy in just about everything
-  - Draw and redraw
-  - Layout
-- Toolkit architecture invokes layout
-- Containers do the work
-  - Manage size and position of children
-  - Enforce component abstraction: Simple loop through child components --> Recursive tree traversal
-    - Translate child to correct location
-    - Clip child after drawing is complete
-  - Know how to handle resizing (reactive)
-
-]
-???
-- Parent knows how to setup for drawing of children, invoke their
-drawing code, and add additional output (before and/or after) based on
-what the parent is and its internal state
-
-- Whorfian effects (things not in the library are hard)
-
-- Nesting not well defined
-
-
----
-# How do Container Components actually do layout?
-.left-column-half[
-<br>
-<br>
-
-<div class="mermaid">
-graph TD
-W(ViewGroup) --> V[ViewGroup]
-W --> V1[View]
-W --> V2[View]
-V --> V3[View]
-V --> V4[View]
-V --> V5[View]
-
-classDef blue font-size:14pt,text-align:center
-classDef darkblue font-size:14pt,text-align:center
-
-class W,V darkblue
-class V1,V2,V3,V4,V5 blue
-</div>
-]
-.right-column-half[
-Key Issues:
-- Where do components get placed?
-- How much space should they occupy?
-- How should components to react to changes?
-  - number of components
-  - size of window
-- Who should get to decide children's sizes? parents or children?
-  - Should it be a top down vs bottom up approach
-  - Depth first tree traversal
-]
----
-# Simplest possible layout implementation (similar to what is in Frame layout)
-
-Depth first tree traversal
-
-No consideration of child size or position in doing layout
-
-Simplified from
-FrameLayout
-[source
-code](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/FrameLayout.java),
-[View](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java)
-and [ViewGroup](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewGroup.java)
-
-```java
-protected void onLayout(boolean changed, int l, int t, int r, int b) {
-    foreach child c {
-        if (child.isVisible()) {
-             Rectangle r = child.getLayoutParams();
-             childLeft = padding + r.x;
-             childTop = padding + r.y;
-             child.layout(childLeft, childTop, r.w, r.h);
-        }
-    }
-}
-```
-???
-we're ignoring the implementation of gravity here
-
-remind them what protected means?
-
----
-# Generalized implementation of layout
-Details of most else, and two-pass process, handled in [View](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java)
-and [ViewGroup](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewGroup.java)
-
-```java
-// Second: do the actual updating
-public void layout(Rectangle newBounds) {
-   onMeasure() // measure myself; this is recursive
-   onLayout()  // again; recursive. Makes use of calculated measurements
-}
-```
-
----
-.left-column[
-# Measuring
-]
-.right-column[
-`onMeasure()` is a callback* invoked by `View.measure()`
-]
-.footnote[We'll be talking more about callbacks when we talk about events]
-
---
-.right-column[
-Object is given guidance about the size is given from parent view in the form of `MeasureSpec` parameters
-]
---
-.right-column[
-`onMeasure` ensures every view has a width and height value set prior to a layout pass
-]
---
-
-.right-column[
-Note: You must manually take padding into account (subtract padding
-from the width/height dimensions)
-]
-
----
-.left-column[
-# Best toolkits let child specify
-]
-.right-column[
-Size (based on nature of component (think TextBox vs Button vs LinearLayout)
-- preferred size
-- minimum size
-- maximum size
-
-Parent gets to ignore all of that, but usually tries not to. Someone has to be in charge; it's the parents (my kids hate that! :)
-- Usually tries to give each child as much as possible & divide up the remainder proportionally
-- However, child component has to deal if not enough (i.e. truncate text)
-]
-
----
-# Reference Implementation of onMeasure
-
-```java
-// First: Measure everything
-protected void onMeasure(int widthspec, int heightspec) {
-  // loop through children in order they were added
-  foreach child {
-    // get child's preferred layout size
-	onMeasure()
-	// story relevant information & do calculations about
-	// the container size
-  }
-  // based on all that, update our dimensions
-  setMeasuredDimension()
-}
-```
-
-Why does a container need to know about its kids' sizes to measure itself?
-
-???
-
-Example: it might need to be big enough to fit them all (LinearLayout)
-
----
-# Aside `ImageView` height:
-
-- What is it's height before layout is done? Unknown!
-- But you need it in Part3 to decide where to put it
- - You haven't added it to the interactor hierarchy yet
- - How do you get height?
-
---
-
-Call `image.measure()` (you'll have to think about what the right parameters are)
-
-Then call `image.getMeasuredHeight()` (why not `image.getHeight()`?)
-
---
-
-Because it's 0! Since this image isn't laid out.
-
----
-# Frame layout -- actual implementation (slightly simplified)
-
-```java
-protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec {
-   // recursively calculate size of children
-   foreach child  {
-     // ... calculate max child width and max child height
-     maxWidth = Math.max(maxWidth, child.getMeasuredWidth() // +  margins);
-     maxHeight = ...
-   }
-   // ... add in padding
-   setMeasuredDimension(... based on what was found)
-   // now recursively set dimensions for all children
-
-   foreach child {
-       final View child = getChildAt(i);
-       child.measure(childWidthMeasureSpec, childHeightMeasureSpec); // recursion through callback
-   }
-}
-```
-???
-How would we do this for linearLayout?
-
----
-# Generalized implementation of layout
-Details of most else, and two-pass process, handled in [View](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java)
-and [ViewGroup](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewGroup.java)
-
-```java
-// Second: do the actual updating
-public void layout(Rectangle newBounds) {
-   onMeasure() // measure myself; this is recursive
-   onLayout()  // again; recursive. Makes use of calculated measurements
-}
-```
-
----
-.left-column[
-# Layout
-]
-.right-column[
-`onLayout()` is a callback triggered when a view's position is changed
-]
---
-.right-column[
-Gives the new position __relative__ to the parent
-]
---
-.right-column[
-Causes a layout call on all children (!)
-]
-
----
-# Reference implementation of onLayout
-
-```java
-// a layout class should override onLayout.
-protected void onLayout(boolean changed, int l, int t, int r, int b) {
-   // recursively calls layout on each child
-   foreach child {
-       LayoutParams lp = child.getLayoutParams();
-	   // calculate the width and height of the kids
-       int width = calculated width
-       int height = calculated height
-	   // calculate the position of kids
-       int childLeft = calculated position
-	   int childTop = calculated position
-       child.layout(childLeft, childTop, childLeft + width, childTop + height);
-   }
-}
-```
-???
-
-What might we use for left/top/width/height
-- in FrameLayout?
-- in LinearLayout?
-
----
-# How would LinearLayout calculate these?
-This is just setting the bounding box!
-What is child *n*'s position? Width? Height?
-- need to know we are vertical
-- can decide to set our width entirely based on kids
-- we get to decide position
-
----
-# Generalized implementation of onLayout
-
-When is this called?
-
-???
-- Whenever the interface is *damaged* (call `invalidate(true)` to force this)
-- Before the recursive `drawAll()` function we talked about last week. **Why?**
-
-
---
-- Whenever the interface is *damaged* (call `invalidate(true)` to force this)
-- Before the recursive `drawAll()` function we talked about last week. **Why?**
-
-
-???
-Because `drawAll()` needs to know where interactors are to properly *translate* and *clip* before calling `onDraw()` on each of them
-
---
-
- - Because `drawAll()` needs to know where interactors are to properly *translate* and *clip* before calling `onDraw()` on each of them
-
----
-# How does this relate to drawing?
-.left-column-half[
-<br>
-<br>
-
-<div class="mermaid">
-graph TD
-W(ViewGroup) --> V[ViewGroup]
-W --> V1[View]
-W --> V2[View]
-V --> V3[View]
-V --> V4[View]
-V --> V5[View]
-
-classDef blue font-size:14pt,text-align:center
-classDef darkblue font-size:14pt,text-align:center
-
-
-class W,V darkblue
-class V1,V2,V3,V4,V5 blue
-</div>
-]
-.right-column-half[
-*After* measuring & layout:
-
-__Tree traversal__ may be done on the layout hierarchy. Order depends on the specific layout algorithm (constraints don't require any!)
-]
-
---
-.right-column-half[
-Each view is responsible for drawing itself
-]
---
-.right-column-half[
-Siblings are drawn in the order that they appear
-]
----
-.left-column[
-# When to (re)Draw?
-]
-.right-column[
-Drawing is costly- (e.g. frame rates dropping for scrolling interactions)
-]
---
-.right-column[
-Often the screen is static
-]
---
-.right-column[
-We should *draw when we need to*
-]
-
---
-.right-column[
-Re-drawing "damaged" areas: call `invalidate()`
-]
----
-.left-column[
-# Summary of the Drawing Process
-]
-.right-column[
-1) Android calls measure on root node (view)
-```java
-// View specifies size of self
-protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
-```
-]
----
-.left-column[
-# Summary of the Drawing Process
-]
-.right-column[
-1) Android calls measure on root node (view)
-```java
-// View specifies size of self
-protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
-```
-2) Android calls layout on view
-```java
-// View specifies size and position of children
-protected void onLayout(boolean changed, int left, int top, int right, int bottom);
-```
-]
----
-.left-column[
-# Summary of the Drawing Process
-]
-.right-column[
-1) Android calls measure on root node (view)
-```java
-// View specifies size of self
-protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec);
-```
-2) Android calls layout on view
-```java
-// View specifies size and position of children
-protected void onLayout(boolean changed, int left, int top, int right, int bottom);
-```
-3) Android calls draw on view
-```java
-// Add the drawing happens
-protected void onDraw(Canvas canvas);
-```
-]
----
-# What of this do *you* need to do
-
-- If you are creating an interface, none of it
- - Just use the layouts
-- If you are creating a new type of layout class
- - It depends
- - If you can manage layout entirely by specifying
-   an interactor hierarchy with layout params that do what you want, you are golden (our assignment)
-- If you want to do something entirely new (lay out images in a spiral for example) you have to override `onLayout()` or `onMeasure()` or both (not assigned)
----
-# End of deck
-
----
-#Conceptual form of UI constraints
-
-``` java
-// this is 5 pixels to the right of that
-this.x = that.x + that.w + 5
-// this is centered
-this.x = that.x + that.w/2 - this.w/2
-// this is 10 larger than children
-this.w = 10 + max_child().x + max_child().w
-```
-
----
-# Frame layout -- actual implementation (slightly simplified)
-
-Simplified from
-FrameLayout
-[source
-code](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget/FrameLayout.java),
-[View](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/View.java)
-and [ViewGroup](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewGroup.java)
-```java
-// this is implemented in view
-public void layout(int l, int t, int r, int b) {
-  // first make sure everything has a size (recursively)
-  onMeasure()
-  // then do layout
-  onLayout(changed, left, top, right, bottom)
-}
-
-// a layout class should override onLayout. In FrameLayout
-protected void onLayout(boolean changed, int l, int t, int r, int b) {
-   // recursively calls layout on each child
-   foreach child {
-       LayoutParams lp = child.getLayoutParams();
-       int width = child.getMeasuredWidth();
-       int height = child.getMeasuredHeight();
-       int childLeft = parentLeft + lp.leftPadding; // add padding
-       int childTop = parentTop + lp.topPadding; // add padding
-       child.layout(childLeft, childTop, childLeft + width, childTop + height);   // recursion through callback
-   }
-}
-```
-???
-Traverses the hierarchy many times over as implemented
-Can try to be more efficient or give more control... tradeoffs
diff --git a/slides/wk03/layout-ii.html b/slides/wk03/layout-ii.html
deleted file mode 100644
index 1945cd1068cf3855f404cb2951a27b4e1fe1db15..0000000000000000000000000000000000000000
--- a/slides/wk03/layout-ii.html
+++ /dev/null
@@ -1,641 +0,0 @@
----
-layout: presentation
-title: Layout II - More on Android Layout
-description: Layout II - the details
-class: middle, center, inverse
----
-
-<iframe src="https://embed.polleverywhere.com/multiple_choice_polls/cnO00FYxqbWSpDfHzx2PM?controls=none&short_poll=true" width="800" height="600" frameBorder="0"></iframe>
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-
-# Layout II - More on Android Layout
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
-
----
-name: normal
-layout: true
-class:
-
----
-
-[//]: # (Outline Slide)
-# Today's goals
-- Announcements
-  - Peer reviews technically due Tuesday, please do them early
-  - Reflection due Wednesday (no late days)
-  - Layout 1-2 due Friday (no late days)
-- Specifying Layout in XML
-- Inflation
-- Laying out views programatically
-- Wednesday we will talk about the theory behind layout.
-
-
----
-# Why do we need layout?
-.left-column60[
-![:img Yahoo in 1996 with no layout other than centering, 40%](http://blogoscoped.com/files/yahoo-1996-large.png)&nbsp;&nbsp;![:img screen capture of modern yahoo  with blocks laying out different news articles, 50%](img/layout-ii/modern-yahoo.png)
-]
-
-.right-column30[
-- Visual appeal
-- Organization (think about Properties of People Design tip #10: Use well-tested visual grouping strategies)
-]
-
----
-# Reminder: User Interfaces on Android
-.left-column-half[
-- Views
-  - Base class for __all__ UI elements
-  - Interactors (e.g buttons, labels, image views, etc)
-- ViewGroups
-  - Encapsulates one or more views (e.g. Android Components, **Layouts**)
-  - Can define specific **layout** properties
-
- We will use the word *Components* to include both layout components and interactors (Views) since you
- don't generally "interact" with layouts
-]
-.right-column-half[
-<div class="mermaid">
-graph TD
-W(ViewGroup) --> V[ViewGroup]
-W --> V1[View]
-W --> V2[View]
-V --> V3[View]
-V --> V4[View]
-V --> V5[View]
-
-classDef blue font-size:14pt,text-align:center
-classDef darkblue font-size:14pt,text-align:center
-
-class W,V darkblue
-class V1,V2,V3,V4,V5 blue
-</div>
-
-]
-
----
-# Layout in Android
-Where we left off: "Many layout and other attributes for components. You should explore!"
-
-![:img Picture of the whole android layout interface showing the possible components that can be added; the component tree (interactor hierarchy; and the attributes for the Save Button; which is selected, 90%](img/layout-ii/design-view.png)
-
-???
-Talk about how there's many layout and other attributes for components that they should explore!
-
----
-# Layout Types in Android
-
-- [FrameLayout](https://developer.android.com/reference/android/component/FrameLayout.html) - good for position views on
-top of each other, or encapsulating a bunch of views. Used in [Doodle](/assignments/doodle).
-
-- [__LinearLayout__](https://developer.android.com/reference/android/component/LinearLayout.html) - places views one after
-the other in order according to the orientation (Horizontal or Vertical). Used in [Layout](/assignments/layout).
-
-- [__RelativeLayout__](https://developer.android.com/reference/android/widget/RelativeLayout) - Positions of the children
-are desribed in relation to one another
-
-- [__TableLayout__](https://developer.android.com/reference/android/component/TableLayout.html) - Rows and columns style
-way of declaring a layout
-
-- [GridLayout](https://developer.android.com/reference/android/component/GridLayout.html) - Uses
-an [*adapter*](https://developer.android.com/reference/android/interactor/Adapter.html) that provides items to display in
-a grid
-
-- [ConstraintLayout](https://developer.android.com/reference/android/component/ConstraintLayout.html) Let's you use constraints to specify how things should lay out. Used in [Layout](/assignments/layout).
-
-
-- More on https://developer.android.com/guide/topics/ui/declaring-layout.html
-
-???
-
-We'll talk more about Constraint layouts later
-
-
----
-.left-column[
-## Example: Linear Layout of Email
-
-[Linear Layout Tutorial](https://developer.android.com/guide/topics/ui/layout/linear)
-
-![:img Linear layout of an email message with to line subject line and message arranged vertically, 100%](img/layout-ii/linearlayout.png)
-
-]
-
-.right-column[
-
-```xml
-&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingLeft="16dp"
-    android:paddingRight="16dp"
-    android:orientation="vertical" &gt;
-  &lt;EditText
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:hint="@string/to" /&gt;
-  &lt;EditText
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:hint="@string/subject" /&gt;
-  &lt;EditText
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        android:gravity="top"
-        android:hint="@string/message" /&gt;
-  &lt;Button
-        android:layout_width="100dp"
-        android:layout_height="wrap_content"
-        android:layout_gravity="right"
-        android:text="@string/send" /&gt;
-&lt;/LinearLayout&gt;
-```
-
-]
-
-
-???
-Can implement all of the things we discussed earlier using constraints
-
-note that they can be hard to debug?
-
-Discussion of specific inheritance hierarchy for constraints
-
-- Only have to write once when we use classes properly
-- can mix and match things
-
-
-
----
-# Layout in Android
-- The Layout XML View completely specifies what was in the GUI (and vice versa)
-- Get to it by clicking 'Text' (next to 'Design')
-
-.left-column-half[
-![:img Picture of the  android layout interface showing the xml which completely specifies what was in the other image,45%](img/layout-ii/text-view.png)&nbsp;
-![:img A simple layout on an android watch with a textview and two buttons (save and discard),50%](img/layout-ii/watch.png)
-]
-
-.right-column-half[
-
-```xml
-&lt;?xml version="1.0" encoding="utf-8"?&gt;
-&lt;-...-&gt;
-&lt;TextView
-&lt;-...-&gt;
-&lt;LinearLayout
-   &lt;-...-&gt;
-   &lt;Button
-      android:id="@+id/button"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:text="@string/Save" /&gt;
-      &lt;-...-&gt;
-&lt;/LinearLayout&gt;
-```
-
-]
-
-???
-What examples do we have here?
-- Layout container (linearlayout)
-- Spacer
-- springiness
-- struts
-- constraints
-
----
-# More about XML and Android
-.left-column[
-![:img Picture of the android ide file system with an xml file inside of res highlighted, 70%](img/layout-ii/xml-files.png)
-]
-.right-column[
-
-Android has XML, where all sorts of static properties can be specified
-
-Every Android app has a `layout` directory and a `values` directory and several others. We'll use these in this assignment
-
-In XML you can set variables that we can access later in XML or code
-- In XML access a value (such as  `vMargin` from our assignment) using `@(file name)/(value name)`
-, where the file name is a file somewhere in `res` and the value name is an xml value found in that file.  i.e., for `vMargin`, you can use  `"@dimen/vMargin"`
-- In code, you refer to that value by `R.(file name).(value name)`
-
-]
-
----
-# The importance of ID
-
-.left-column-half[
-In `MainActivity.java` for Layout
-```java
-// Set window contents based on selected item.
-*switch (item.getItemId()) {
-*  case R.id.action_part_1:
-*    setCurrentTabId(R.id.action_part_1);
-     contents.addView(getLayoutInflater().inflate(R.layout.part1, null), PARAMS); // params here is a set of layout paramaters for this view
-     return true;
-*  case R.id.action_part_2:
-*    setCurrentTabId(R.id.action_part_2);
-     contents.addView(new Part2View(this, getImageStrings()), PARAMS);
-     return true;
-     //...
-}
-```
-]
-.right-column-half[
-- Set the IDs in your layout XML when you create things!
-- Use good ID names (like variables in programming)
-- Access it programmatically using `[Component].getId()` and `[Component].setID()`.
-- Access all Ids using `R.id.[ID]`
-- We use this to implement the tab navbar in Layout
-
-![:img Picture of the android layout toolbar, 50%](img/layout-ii/layouttoolbar.png)
-
-]
----
-# Lots to unpack here
-
-`PARAMS` is a class constant added to `MainActivity` to hold the parameters for the layout:
-```java
-*public static final RelativeLayout.LayoutParams PARAMS =
-*            new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
-*                                            RelativeLayout.LayoutParams.MATCH_PARENT);
-...
-switch (item.getItemId()) { // Set window contents based on selected item.
-  case R.id.action_part_1:
-    setCurrentTabId(R.id.action_part_1);
-*   contents.addView(getLayoutInflater().inflate(R.layout.part1, null), PARAMS);
-    return true;
-  case R.id.action_part_2:
-    setCurrentTabId(R.id.action_part_2);
-*   contents.addView(new Part2View(this, getImageStrings()), PARAMS);
-    return true;
-    //...
-}
-```
----
-# PARAMS
-
-```java
-public static final RelativeLayout.LayoutParams PARAMS =
-            new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,
-                                            RelativeLayout.LayoutParams.MATCH_PARENT);
-```
-.left-column40[
-- There are a lot of options for layout parameters, study the documentation! [Here](https://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams) is the documentation for the `RelativeLayout` `LayoutParams`
-- Width and height are often set as either `MATCH_PARENT` or `WRAP_CONTENT` (could be used to wrap the bounding box wrap around the text in your `TextView` in Doodle)
-]
-.right-column-half[
-![:img Four different permuations of the MATCH_PARENT or WRAP_CONTENT layout parameters, 100%](img/layout-ii/layoutparams.png)
-
-]
----
-# Two ways to create Interactors
-
-- Specify elements in WYSIWYG* editor, which will automatically create and initialize the objects via XML.
-  - You could also hand type the XML the editor would produce.
-  - Done in `Doodler#onCreate(Bundle)` - the line `setContentView(R.layout.activity_main);`
-  - Will be done in Part 1, Part 3, and Part 4 for Layout
-
-```java
-*   contents.addView(getLayoutInflater().inflate(R.layout.part1, null), PARAMS);
-```
-
-- Instantiate UI classes at runtime.
-  - We did this creating new views in Doodle at runtime!
-  - Will do this in Part 2, Part 3, and Part 4 for Layout
-
-```java
-*   contents.addView(new Part2View(this, getImageStrings()), PARAMS);
-```
-.footnote[\*WYSIWYG = What You See Is What You Get]
----
-# Where are these views getting added?
-
-Looking at  `MainActivity#onCreate(Bundle)` we see `setContentView(R.layout.activity_main);`
-
-This statement loads `activity_main.xml`.
-
-Looking deeper we see that contains a `RelativeLayout`
-which contains a `ScrollView` and the `BottomNavigationView`.
-
-```
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ... >
-    <ScrollView
-       android:id="@+id/tab_contents" >
-     </ScrollView>
-
-    <android.support.design.widget.BottomNavigationView
-      android:id="@+id/bottom_nav"
-      ...  />
-
-</RelativeLayout>
-```
-
----
-
-# Using that id
-
-So we find the `contents` (a `ScrollView`) by that unique id
-
-`ScrollView contents = findViewById(R.id.tab_contents);`
-
----
-# Runtime Instantiation *FROM XML*
-
-In part 1 we instantiate (create) `part1.xml` into the hierarchy of view which will be the children of
-the `ScrollView contents` using **Inflation**.
-
-We use a [LayoutInflater](https://developer.android.com/reference/android/view/LayoutInflater)
-pass it in the id of the xml we're interested in (`R.layout.part1`). Once inflated, we add
-it to the ScrollView.
-
-```java
-*   contents.addView(getLayoutInflater().inflate(R.layout.part1, null), PARAMS);
-```
-
-To do Inflation in your code you need to `import [package].R;`
-
----
-# Programatic creation of the hierarchy
-
-In part 2, we recreate his hierarchy programatically by instantiating an `Part2View` object and adding
-that to the view.
-
-```java
-*   contents.addView(new Part2View(this, getImageStrings()), PARAMS);
-```
-
-Just like with Part 1, we need to create a `ConstraintLayout` then add that to the ScrollView.
-
-We did that for you... Your job is to add `ImageView` objects to the `ConstraintLayout`.
-
-Hint: create and use `ConstraintLayout.LayoutParams` for specifying the constraints on the `ImageView`
-objects you create. You'll probably want to look at the [documentation](https://developer.android.com/reference/android/support/constraint/ConstraintLayout.LayoutParams)
-
----
-# Constraint Layout in Android
-.left-column-half[
-
-![:img A simple layout on an android watch with a textview and two
-buttons (save and discard) and the constraints highlighted,90%](img/layout-ii/constraint-editor.png)
-]
-.right-column-half[
-This assignment also uses **Constraints** (the `ConstraintLayout`)
-
-You can see little lines connecting the `textView` to its container and it's sibling (the `linearLayout`).
-- This specifies how it's attached (can change type by clicking on right)
-- If you were to change the interface (e.g. a different sized screen), it would stay attached and keep filling the space
-- All ends up in XML you can explore too
-]
-
----
-# Constraint Layout in Android
-.left-column-half[
-
-![:img A simple layout on an android phone instead of a watch with a textview and two buttons (save and discard),100%](img/layout-ii/explore-devices.png)
-]
-.right-column-half[
-You  can test this:  modify the aspect ratio of your display, and flip it to horizontal to test things
-]
-
-???
-Demonstration: consider demoing this interface live
-PRINT THIS LIST
-- Show dragging things to create layout
-- Show different size and orientation phones
-- Show editing attributes
-- Show clicking on constraints in box to change type
-- Show simple interface hierarchy
-- Show simplifying xml
-- Show changing button names/ids
-
----
-# What are  Constraints?
-.left-column[
-![:img A simple layout on an android watch with a textview and two
-buttons (save and discard) and the constraints highlighted,110%](img/layout-ii/watch3.png)]
-.right-column[
-
-- Very general
-- Can reproduce most other things
-- Can operate on multiple axes
-- Can enhance other layout options
-
-]
-
----
-
-# What are  Constraints?
-.left-column[
-![:img A simple layout on an android watch with a textview and two
-buttons (save and discard) and the constraints highlighted,110%](img/layout-ii/watch3.png)]
-
-.right-column[
-
-- What do you think this does? `app:layout_constraintBottom_toTopOf="@+id/linearLayout"`
-- And this? `app:layout_constraintEnd_toEndOf="parent"`
-- We  also use `Start_tStartOf` and 'Top_toTopOf` to create this
-
-```xml
-&lt;TextView
-  android:id="@+id/textView"
-  android:layout_width="0dp"
-  android:layout_height="0dp"
-  android:text="@string/sample_text"
-  app:layout_constraintBottom_toTopOf="@+id/linearLayout"
-  app:layout_constraintEnd_toEndOf="parent"
-  app:layout_constraintStart_toStartOf="parent"
-  app:layout_constraintTop_toTopOf="parent"
-  android:layout_marginStart="8dp"
-  android:layout_marginTop="8dp"
-  android:layout_marginEnd="8dp"
-  android:layout_marginBottom="8dp"/&gt;
-
-```
-]
----
-.left-column[
-## Constraints in Android
-
-![:img picture of attributes window showing controls for
-constraint-based layout including five types of elements, 100%](img/layout-ii/constraints.png)]
-
-.right-column[
-[Docs](https://developer.android.com/training/constraint-layout/): limited set of constraints
-- 1 Size ratio
-- 2 Delete constraint (not a constraint, just removes them)
-- 3 Height/width mode (3 main types):
- - Wrap constraint ![:img wrap symbol >>>, 5%](img/layout-ii/wrap.png)
- - Fixed size ![:img fixed symbol I--I, 5%](img/layout-ii/fixed.png)
- - Match Constraint ![:img match symbol IvvvI, 5%](img/layout-ii/match.png)
-- 4 Margins
-- 5 Constraint bias (essentially weights on competing constraints)
-
-Range of attachment options (e.g. button sides, corners)
-
-Worth getting to know additional abstractions (groups; guidelines;
-barriers; chains)
-]
-???
-
--bias lets us create something that is 2-3 of the way over rather than
-centered
-
-go back to android to demo again
----
-# Powerful option
-
-Can do everything we can do with springs, struts, and linear layouts
-
-Declare relationships (.red[what] should be true)
-
-System automatically maintains relationships under change (.red[how])
----
-# Powerful option
-
-Can do everything we can do with springs, struts, and linear layouts
-
-Declare relationships (what should be true)
-
-- This should be centered in that
-
-- This should be 12 pixels to the right of that
-
-- Parent should be 5 pixels larger than child
-
-System automatically maintains relationships under change (how)
----
-# Powerful option
-Can do everything we can do with springs, struts, and linear layouts
-
-Declare relationships (what should be true)
-
-System automatically maintains relationships under change (how)
-
-Too good to be true?
-- Unsolvable for arbitrary things
-- Works really well for a limited set
-???
-a good set for ui programming
-xx need to make sure I know why it is hard for arbitrary things
-
----
-# Note that these are one-way constraints
-
-You can change the right side, and it will update the left side (not
-the reverse)
-
-Can be very inefficient  .jax[$$O(2^n)$$]
-
-But highly efficient incremental update algorithms exist
-???
-
-Only have to update things that might change
-
-Hudson's work on this was seminal
-
-can have a Directed Acyclic Graph (DAG) but not a cycle (thus, a tree)
-hard to guard against cycles
-
----
-# Layout Assignment
-.left-column[
-![:img Part1: diagram of images evenly spaced stacked vertically, 100%](img/layout-ii/part1-diagram.png)
-]
-
-.right-column[
-Part 1 is about basic reactive layout using XML and constraints
-- We will use constraints for the left/right/top/bottom of each image
-- `scaleType`, `width` and `height` will be provided for you
-
-There are also things we specify without constraints: margins, for example.
-- Android best practice is to use a variable for this
-- How do we do that in XML?
-
-Note: the image on the left is what we are calling a __Layout Wireframe__
-]
-
----
-# Layout Assignment
-.left-column[
-![:img Part1: diagram of images evenly spaced stacked vertically, 100%](img/layout-ii/part1-diagram.png)
-]
-
-.right-column[
-Part 1 is about basic reactive layout using XML and constraints
-
-Part 2 asks you to reproduce this in code
-- Not all that different from creating views in Doodle
-- What are the key steps here?
-]
-???
-instantiate
-add to the hierarchy
-
-Just now we will also add layout containers
----
-# Layout Assignment
-.left-column[
-![:img Part1: diagram of images evenly spaced stacked vertically, 100%](img/layout-ii/part1-diagram.png)
-]
-
-.right-column[
-Part 1 is about basic reactive layout using XML and constraints
-
-Part 2 asks you to reproduce this in code
-- Not all that different from creating views in Doodle
-- What are the key steps here?
-  - instantiate (create an interactor)
-  - add to the hierarchy
-  - just now we will also add layout containers
-]
-
----
-# Layout Assignment
-.left-column[
-![:img Part4: Spot the heron low fidelity prototype, 40%](img/layout-ii/spottheheron-prototype.png) ![:img Part4: Spot the heron layout wireframe, 50%](img/layout-ii/spottheheron-wireframe.png)
-
-]
-
-.right-column[
-Part 3 is about using both XML and programatic means to create a Pinterest style Layout
-
-Part 4 is about designing and creating your own mock up of another app layout
-- Make sure you do the design first
-- Create your Layout Wireframe (see left)
-- Create your interactor hierarchy
-]
-
----
-# Constraints: A General and Powerful Approach
-
-General mechanism for establishing and maintaining relationships between things
-- Layout is one use
-- Several other uses in UI
- - Connection of application to UI, e.g. deriving appearance from data
- - Multiple views of same data
- - Automated semantic feedback
- - Automatic arrangement of lines (Snapping in drawing programs)
-
-
----
-
-# Practice with the [Layout Lab](https://github.com/harshitha-akkaraju/layoutlab)
-
-- Clone [https://github.com/harshitha-akkaraju/layoutlab.git](https://github.com/harshitha-akkaraju/layoutlab.git)
-- Open it up in Android studio
-- Switch between the challenges based in the `AndroidManifest.xml`
-
-| Create this layout using XML | Create this layout programatically |
-| :-- | :-- |
-| ![:img Challenge for buttons in XML, 30%](https://github.com/harshitha-akkaraju/layoutlab/raw/master/img/xml-layout.png) | ![:img Challenge with buttons to be added programatically, 30%](https://github.com/harshitha-akkaraju/layoutlab/raw/master/img/programmatic-layout.png)|
diff --git a/slides/wk04/340AccessibiltyScanner.pdf b/slides/wk04/340AccessibiltyScanner.pdf
deleted file mode 100644
index 12d1e850100a27121cf1ec26b917e66545bc79fb..0000000000000000000000000000000000000000
Binary files a/slides/wk04/340AccessibiltyScanner.pdf and /dev/null differ
diff --git a/slides/wk04/340AccessibiltyScanner.pptx b/slides/wk04/340AccessibiltyScanner.pptx
deleted file mode 100644
index 349f162034811496921188fb0e680c38c7f1b6fe..0000000000000000000000000000000000000000
Binary files a/slides/wk04/340AccessibiltyScanner.pptx and /dev/null differ
diff --git a/slides/wk04/accessibility-and-inclusive-design.pdf b/slides/wk04/accessibility-and-inclusive-design.pdf
deleted file mode 100644
index 743b2c59227b9aaf00d299c8970bf1d362c302a5..0000000000000000000000000000000000000000
Binary files a/slides/wk04/accessibility-and-inclusive-design.pdf and /dev/null differ
diff --git a/slides/wk04/accessibility.html b/slides/wk04/accessibility.html
deleted file mode 100644
index df690dde43c9586011fd0997f35b3573d4883921..0000000000000000000000000000000000000000
--- a/slides/wk04/accessibility.html
+++ /dev/null
@@ -1,113 +0,0 @@
----
-layout: presentation
-title: Accessibility --Week 4, Monday--
-description: Accessibility
-class: middle, center, inverse
----
-[//]: # (Outline Slide)
-.left-column[
-# Today's goals
-]
-.right-column[
-
-Reminders
-  - Layout Part 3-5 due tomorrow at 10pm
-    - Remember you needed to accept [as2-layout-part-3-4](https://gitgrade.cs.washington.edu/student/assignment/120) first!
-    - Remember git add/commit/push __then go to [GitGrade to turn in](https://gitgrade.cs.washington.edu/student/assignment/120/turnin)__
-  - Accessiblity is now open!
-    - Remember to [accept]() the assignment through GitGrade
-
-Accessibility in practice!
-
-Intro to the Accessibility assignment
-]
----
-
-# Screen Reader Accessibility on Android
-
-Venkatesh Potluri & Anne Ross
-
-CSE 340, {{site.quarter}}
-
----
-name: normal
-layout: true
-class:
-
----
-# Venkatesh Research Interests
-
-Accessible programming tools for blind software developers
-- A Multi Modal Approach for Blind and Visually Impaired Developers to Edit Webpage Designs
-- CodeTalk (aka.ms/codetalk)
-
-Improving screen reader interactions
-- investigating nonvisual interaction techniques on laptop touchpads
-- QBit: an exploratory tangible user interface to support nonlinear nonvisual window switching
-
----
-# A Multimodal Approach for Blind and Visually Impaired Developers to Edit Webpage Designs
-
-<iframe width="560" height="315" src="https://www.youtube.com/embed/NbkiVG9Mi9s" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-
----
-# Today’s focus
-
-.left-column-half[
-Screen readers.
-
-What are screen readers?
-
-Different types of screen readers.
-- JAWS for Windows
-- NonVisual Desktop Access
-- VoiceOver
-- TalkBack
-- ChromeVox
-
-]
-.right-column-half[
-![:img JAWS logo. A blue shark; with talking rings over blue text that reads JAWS.,30%](img/accessibility/JAWS_logo.png) ![:img NVAccess logo. geometric shapes intermix in orange blues and purple. text reads; NVAccess empowering lives through non-visual access to technology,50%](img/accessibility/NVDA_logo.png)
-
-*Where can you find one?*
-Different devices used to interact with screen readers.
-]
-
----
-# Building for screen readers
-
-Screen readers get underlying information about controls from operating systems.
-- this information is provided by a developer.
-- Accessibility APIs provide the information to a screen reader.
-- Screen readers provide this information visually, through audio or in Braille to users.
-
-.left-column-half[
-![:img Diagram showing the client (screen reader) making a call to the accessibility API; which passes along the request to the provider (browser); which checks the content in the web document; which sends the information back up the chain, 100%](img/accessibility/ScreenReaderIllustration.png)
-]
-.right-column-half[
-Illustrative example of how screen readers get information. Source: semantics to screen readers -- a list apart.
-
-*Do all developers provide this information?*
-]
-
----
-# App Health Indicators reported by Google's Accessibility Scanner
-
-| Error                | Description                                                                                                                   |
-|----------------------|-------------------------------------------------------------------------------------------------------------------------------|
-| Clickable Items      | Overlapping clickable items                                                                                                   |
-| Editable Image Label | TextView has a content description. This might interfere with a screen reader’s ability to read the content of the text field |
-| Image Contrast       | Low contrast in image or icon                                                                                                 |
-| Item Descriptions    | Items with identical speakable text                                                                                           |
-| Item Label           | Missing element label                                                                                                         |
-| Item Type Label      | Item label ends with type, e.g., “Play Button.” TalkBack automatically announces item type, so information is redundant       |
-| Link                 | URL in link may be invalid                                                                                                    |
-| Text Contrast        | Low text contrast between foreground and background                                                                           |
-| Touch Target         | Item is too small|
-
-
----
-# Demo
-
----
-# Accessbility assignment
diff --git a/slides/wk04/events.html b/slides/wk04/events.html
deleted file mode 100644
index 5be04a5d53d9461f12bfe56bd78875547a4e476b..0000000000000000000000000000000000000000
--- a/slides/wk04/events.html
+++ /dev/null
@@ -1,721 +0,0 @@
----
-layout: presentation
-title: Event Handling I -- Callbacks, Model View Controller, and Events
-description: Describes input devices, abstractions around events, Listeners, Event Delivery
-class: center, middle, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Write down three things that you reacted to this week
-
-What are some examples?
-
---
-
-This is event-driven interaction
-
---
-
-We will be studying the theory and practice of event driven interactions in Android
-
-
-
----
-# Event Handling I - Callbacks, Model View Controller, and Events
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
-
-
----
-layout: false
-
-# Administrivia
-- Layout part 3-5
-   - Due date TONIGHT at 10pm
-   - Reflection is due with code.
-   - Lock date (aka when GitGrade and Gradescope will lock) TOMORROW at 10pm
-- Assesssments
-   - [Post Layout Quiz](https://canvas.uw.edu/courses/1370612/quizzes/1236290) it out due Sunday.
-   - Will likely change the format for the Layout Examlet.
-- Accessiblity is out
-- Mid quarter evals are out
-
-
----
-[//]: # (Outline Slide)
-# Today's goals
-
-- What is a callback?
-- What is an event?
-- What is a Model View Controller?
-- How is this all related? 
----
-
-# Java 102: `Comparator&lt;E&gt;`
-
-Recall that if you have an array of items that have a "natural sorting order"
-such as:
-
-```java
-String[] names = {"Emma", "Ncuti", "Tina", "Idris", "Awkwafina"};
-```
-
-We can sort those things using `Arrays.sort`
-
-```java
-Arrays.sort(names);
-System.out.println(Arrays.toString(names));
-```
-
-Which will output:
-
-```
-[Awkwafina, Emma, Idris, Ncuti, Tina]
-```
-
----
-
-# Java 102: `Comparator&lt;E&gt;`
-
-What if you want to create a new class: [Person](person.zip)
-
-```java
-public class Person {
-
-   private String mFirstName;
-   private String mLastName;
-   private int mAge;
-
-   public Person(String firstName, String lastName, int age) {
-      mFirstName = firstName;
-      mLastName = lastName;
-      mAge = age;
-   }
-
-   public String toString() { return mFirstName + " " + mLastName + " - age " + mAge; }
-```
-
-
----
-
-# Java 102: `Comparator&lt;E&gt;`
-
-If we had an array of these `Person` objects
-
-```
-Person[] people = {new Person("Emma", "Watson", 30), new Person("Ncuti", "Gatwa", 27), ... }
-```
-
-How would we sort that array using `Arrays.sort`?
-
---
-
-```java
-public class Person implements Comparable<Person> {
-
-  ...
-  public int compareTo(Person other) {
-    // what would go in here?!?!?!?!?
-  }
-}
-```
-
-Should we choose based on the first name? Last name? age?
-
----
-
-# Java 102: `Comparator&lt;E&gt;`
-
-There's another way to set up sorting: by creating an object that extends from
-[`Comparator&lt;E&gt;`](https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/Comparator.html)
-
-A subclass of `Comparator&lt;E&gt;` must implement one method:
-
-```java
-public int compare​(E object1, E object2)	 // Compares its two arguments for order.
-```
-`compare` compare returns
-
-* -1 if object1 is "less than" object2
-* 0 if object1 and object2 are equivalent
-* 1 if object1 is "greater than" object 2
-
----
-# Java 102: `Comparator&lt;E&gt;`
-
-Example:
-
-```
-// this class is defined in PersonLastNameComparator.java
-public class PersonLastNameComparator implements Comparator<Person> {
-
-   @Override
-   public int compare(Person p1, Person p2) {
-     return p1.getLastName().compareTo(p2.getLastName());
-   }
-}
-```
-
-Then we could do the folowing to sort the array by the last name.
-
-
-```java
-Arrays.sort(people, new PersonLastNameComparator());
-```
-
----
-# Callbacks
-
-The model used for implementing Comparators is consider a **Callback**
-
-From [Wikipedia](https://en.wikipedia.org/wiki/Callback_(computer_programming)):
-
-> A callback ... is any executable code that is passed as an argument to other code;
-> that other code is expected to call back (execute) the argument at a given time.
-
----
-# Classes, Inner classes, and Anonymous classes.
-
-There are three ways to implement callbacks in Java
-
-1. Creating a class in a separate file (like `PersonLastNameComparator`)
-2. Creating an inner class (like `Person.FirstNameComparator`)
-3. Creating an anonymous class (like the following)
-
-```java
-Arrays.sort(people, new Comparator<Person>() {
-   @Override
-   public int compare(Person p1, Person p2) {
-
-      return p1.getAge() - p2.getAge();
-   }
-});
-```
----
-# Classes, Inner classes, and Anonymous classes.
-
-There are <del>three</del> four ways to implement callbacks in Java
-
-1. Creating a class in a separate file (like `PersonLastNameComparator`)
-2. Creating an inner class (like `Person.FirstNameComparator`)
-3. Creating an anonymous class (like the following)
-4. Using a lambda
-
-```java
-Arrays.sort(people, (Person p1, Person p2)->{return p1.getAge() - p2.getAge();});
-```
-
----
-# Callback Exercise
-
-Note: this is a breakout room exercise
-
-- Please participate!
-- TAs will help moderate the activity.
-
----
-
-# Callback Exercise
-
-1. Imagine we're designing a Zoo. Each group is going to design a different zoo enclosure
-2. In your rooms
-  - Agree on and write down the name of your enclosure (what animal you contain)
-  - Determine the type of animal in this enclosure.
-  - Decide what sound will emanate from this enclosure when you get a “makeNoise for some number of seconds” request
-  - Decide who will turn their mic on in the main room to make the sound.
-  - Decide who will type the name of your enclosure in the chat upon your return
-3. When you come back into the main room
-  - One person type the name of your enclosure in the chat.
-4. Wait until the instructor calls your enclosure name, then make the sound for the requested number of seconds.
-
----
-# Callback Exercise
-
-As code, I've asked each enclosure to implement the following interface to define the behavior. (Note:
-Listeners are a type of event handling callback in Java/Android)
-
-  ```java
-  public interface EnclosureListener {
-      public void makeNoise(int numSeconds);
-  }
-  ```
-
-For example:
-
-  ```java
-  public class LionCage implements EnclosureListener {
-    ...
-
-    public void makeNoise(int numSeconds) {
-      // make the animal noise for the given number of seconds
-    }
-  }
-  ```
-
----
-# Callback Exercise
-
-Further, by telling me the name of your enclosure you're registering your listener WITH me, the "zookeeper"
-
-  ```java
-  public class LionCage implements EnclosureListener {
-    ...
-
-    public void makeNoise(int numSeconds) {
-      // make the animal noise for the given number of seconds
-    }
-
-    public void onCreate(Bundle savedInstanceState) {
-      ...
-      zookeeper.addEnclosureListener(this);
-    }
-  }
-  ```
----
-# Callback Exercise
-
-  ```java
-  public class Zookeeper {
-    // The zookeeper keeps a list of all EnclosureListeners that were registered,
-    private List<EnclosureListeners> mEnclosureListeners;
-
-    public final void addEnclosureListener(EnclosureListener listener) {
-        if (listener == null) {
-            throw new IllegalArgumentException("enclosureListener should never be null");
-        }
-        mEnclosureListeners.add(listener);
-    }
-
-    // And can call on them whenever they need with the right amount of time.
-    public void cacophony(int seconds)
-      for (EnclosureListener listener : mEnclosureListeners) {
-          listener->makeNoise(seconds);
-      }
-    }
-  }
-  ```
----
-# Callback Exercise
-
-- The Zookeeper has NO idea what each enclosure will do until the listener is registered and called.
-- Each enclosure separately defines how it will react to a makeNoise event.
-- The "contract" between the zookeeper and the enclosures is the defined EnclosureListener interface.
-
----
-# Callbacks in Java
-
-- At the time Java has created the toolkit developers had *no* idea how every app would want to respond to events
-- The toolkit has pre-defined interfaces so apps or components can respond to events such as clicks or touches. For example:
-   - The `View` class defines the following Listeners as inner classes:
-      - `View.OnClickListener`
-      - `View.OnLongClickListener`
-      - `View.OnFocusChangeListener`
-      - `View.OnKeyListener`
-      - `View.OnTouchListener`  (this is used in ColorPicker and Menu by subclassing AppCompatImageView)
-      - `View.OnCreateContextMenuListener`
-
-We will come back to these in our next class.
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Model View Controller, Input Devices and Events
----
-name: normal
-layout: true
-class:
----
-# How do you think an app responds to user input?
-
-.left-column30[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-
-  class ap,w,o,h,hlt,t yellow
-</div>
-]
-.right-column60[
-What happens at each level of the hardware stack?
-]
----
-# How do you think an app responds to user input?
-
-.left-column30[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-
-  class ap,w,o,h,hlt,t yellow
-</div>
-]
-.right-column60[
-What happens at each level of the hardware stack?
-- Hardware level: electronics to sense circuits closing or movement
-  - Difference between hardware (Event vs sampled)
-  - Sensor based input
-- OS: "Interrupts" that tell the Window system something happened
-   - Logical device abstraction and types of devices
-- Windows system: Tells which window received the input
-- Toolkit: defines how the app developer will use these events
-  - Events as an abstraction
-- High level tools: Defines standard components that react to events in a certain way
-- Application Program: Can use standard components OR create new interactions
-  - May define separate interaction techniques
-]
----
-# Responding to Users: Model View Controller (MVC)
-
-.left-column30[
-<br>
-<div class="mermaid">
-graph TD
-View(View * ) --1-Input--> Presenter(Controller)
-Presenter --5-Output --> View
-Presenter --2-Updates-->Model(0,3-Model)
-Model --4-State Change-->Presenter
-
-classDef edgeLabel font-size:14pt
-classDef blue font-size:14pt,text-align:center
-classDef bluegreen font-size:14pt,text-align:center
-
-class View,Presenter blue
-class User,Model bluegreen
-</div>
-]
-
-.right-column60[
-Suppose this is a digital phone app
-
-<sup>*</sup> User interacts through View (s) (the interactor hierarchy)<br>
-<sup>0</sup> Model State: _Current person:_ Lauren; _Lock state:_ closed<br>
-<sup>1</sup> Password entry. Trigger _Event Handling_<br>
-<sup>2</sup> Change state: App unlocked<br>
-<sup>3</sup> Model State: _Current person:_ Lauren; _Lock state:_ open<br>
-<sup>4</sup> Change state of View(s)<br>
-<sup>5</sup> Trigger _Redraw_ and show
-
-]
-???
-Sketch out key concepts
-- Input -- we need to know when people are doing things. This needs to be event driven.
-- Output -- we need to show people feedback. This cannot ‘take over’ i.e. it needs to be multi threaded
-- Back end -- we need to be able to talk to the application.
-- State machine -- we need to keep track of state.
-- What don’t we need? We don’t need to know about the rest of the UI, probably, etc etc
-- Model View Controller -- this works within components (draw diagram), but also represents the overall structure (ideally) of a whole user interface
-- NOTE: Be careful to write any new vocabulary words on the board and define as they come up.
-
----
-# Responding to Users: Model View Controller (MVC)
-
-.left-column30[
-<br>
-<div class="mermaid">
-graph TD
-View(View * ) --1-Input--> Presenter(Controller)
-Presenter --5-Output --> View
-Presenter --2-Updates-->Model(0,3-Model)
-Model --4-State Change-->Presenter
-
-classDef edgeLabel font-size:14pt
-classDef blue font-size:14pt,text-align:center
-classDef bluegreen font-size:14pt,text-align:center
-
-class View,Presenter blue
-class User,Model bluegreen
-</div>
-]
-
-.right-column60[
-Suppose this is a fancy speech-recognition based digital door lock instead
-
-
-<sup>*</sup> User interacts through View (s) (the interactor hierarchy)<br>
-<sup>0</sup> Model State: _Current person:_ Lauren; _Lock state:_ closed<br>
-<sup>1</sup> Password entry. Trigger _Event Handling_<br>
-<sup>2</sup> Change person to Lauren; App unlocked<br>
-<sup>3</sup> Model State: _Current person:_ Lauren; _Lock state:_ open<br>
-<sup>4</sup> Change state of View(s)<br>
-<sup>5</sup> Trigger _Redraw_ and show
-
-]
-???
-Sketch out key concepts
-- Input -- we need to know when people are doing things. This needs to be event driven.
-- Output -- we need to show people feedback. This cannot ‘take over’ i.e. it needs to be multi threaded
-- Back end -- we need to be able to talk to the application.
-- State machine -- we need to keep track of state.
-- What don’t we need? We don’t need to know about the rest of the UI, probably, etc etc
-- Model View Controller -- this works within components (draw diagram), but also represents the overall structure (ideally) of a whole user interface
-- NOTE: Be careful to write any new vocabulary words on the board and define as they come up.
-
----
-# Model View Controller (MVC)
-
-From [Wikipedia]()
-
->MVC is a software design pattern commonly used for
-developing user interfaces which divides the related program logic into three interconnected elements.
-
-- *Model* - a representation of the state of your application
-- *View* - a visual representation presented to the user
-- *Controller* - communicates between the model and the view
-  - Handles changing the model based on user input
-  - Retrieves information from the model to display on the view
-
---
-MVC exists within each View as well as for overall interface
-
----
-# MVC in Android
-
-.left-column30[
-
-<br>
-<div class="mermaid">
-graph TD
-View(Passive View) --user events--> Presenter(Presenter: <BR>Supervising Controller)
-Presenter --updates view--> View
-Presenter --updates model--> Model(Model)
-Model --state-change events--> Presenter
-
-classDef edgeLabel font-size:14pt
-classDef blue font-size:14pt,text-align:center
-classDef bluegreen font-size:14pt,text-align:center
-
-class View,Presenter blue
-class Model bluegreen
-</div>
-]
-.right-column60[
-Applications typically follow this architecture
-
-- What did we learn about how to do this?
- - What causes the screen to update?
- - How are things laid out on screen?
-]
-???
-- Relationship of MVC to Android software stack
-- Measure and layout
-- Discuss Whorfian effects
-
---
-.right-column60[
-Responding to Users: Event Handling
-- When a user interacts with our apps, Android creates **events**
-- As app developers, we react "listening" for events and responding
-appropriately
-]
----
-
-|Procedural | Event Driven |
-| :--: | :--: |
-|![:img Code printout saying Statement 1; Statement 2; Statement 3, 60%](img/events/procedural.png)|<br><br><br><br>![:img Code printout saying Method 1; Method 2; Method 3 with mouse and keyboard icons causing events pointed at different methods, 60%](img/events/eventdriven.png)|
-|Code is executed in sequential order |&nbsp;&nbsp;&nbsp; Code is executed based upon events|
-
----
-
-# But what is an Event?
-
-Generally, input is harder than output
-
-- More diversity, less uniformity
-
-- More affected by human properties
-
----
-# Where does and Event come from?
-
-Consider the "location" of an event...
-
-What is different about a joystick, a touch screen, and a mouse?
-
-???
-- Mouse was originally just a 1:1 mapping in 2 dimensions == absolute
-location; bounded
-- Joystick is relative (maps movement into rate of change in location); unbounded
-- Touch screen is absolute; bounded
-- What about today's mouse? Lifting and moving?
-
---
-
-- Mouse was originally just a 1:1 mapping in 2 dimensions == absolute
-location; bounded
-- Joystick is relative (maps movement into rate of change in location); unbounded
-- Touch screen is absolute; bounded
-
---
-
-What about the modern mouse? Lifting and moving?
-
---
-
-How about a wii controller?
-
----
-# Is this an input device?
-
-.left-column-half[![:img Picture of swipe keyboard showing text entry of satisfying, 60%](img/events/swipe.png)]
---
-.right-column-half[No … it’s an interaction technique. Over 50 WPM!]
-
-???
-Who/what/where/etc
-Dimensionality – how many dimensions can a device sense?
-Range – is a device bounded or unbounded?
-Mapping – is a device absolute or relative?
-
---
-.right-column-half[
-Considerations:
-- Dimensionality – how many dimensions can a device sense?
-- Range – is a device bounded or unbounded?
-- Mapping – is a device absolute or relative?
-]
----
-# Interaction techniques / Components make input devices effective
-
-For example, consider text entry:
-- 60-80 (keyboards; twiddler)
-- ~20 (soft keyboards)
-- ~50? Swype – but is it an input device?
----
-# Modern hardware and software starting to muddy the waters around this
-
-![:img Picture of OLED keyboard with labels on keys for gaming instead
-of typing, 30%](img/events/oled.png)
-
-???
-Add OLEDs to keys -> reconfigurable label displays
-
----
-
-# Higher level abstraction
-
-Logical Device Approach:
-
-- Valuator (slider) -> returns a scalar value
-- Button -> returns integer value
-- Locator -> returns position on a logical view surface
-- Keyboard -> returns character string
-- Stroke -> obtain sequence of points
-
-???
-
-- Can obscure important differences -- hence use inheritance
-- Discussion of mouse vs pen -- what are some differences?
-- Helps us deal with a diversity of devices
-- Make sure everyone understands types of events
-- Make sure everyone has a basic concept of how one registers listeners
-
-
----
-# Not really satisfactory...
-
-Doesn't capture full device diversity
-
-| Event based devices               |&nbsp;&nbsp;&nbsp;    | Sampled devices                     |
-| --                                | -- | --                                  |
-| Time of input determined by user  |    | Time of input determined by program |
-| Value changes only when activated |    | Value is continuously changing      |
-| e.g.: button                      |    | e.g.: mouse                         |
-
-???
-Capability differences
- - Discussion of mouse vs pen
- - what are some differences?
-
----
-# Contents of Event Record
-
-Think about your real world event again. What do we need to know?
-
-**What**: Event Type
-
-**Where**: Event Target
-
-**When**: Timestamp
-
-**Value**: Event-specific variable
-
-**Context**: What was going on?
-
-???
-Discuss each with examples
-
----
-# Contents of Event Record
-
-What do we need to know about each UI event?
-
-**What**: Event Type (mouse moved, key down, etc)
-
-**Where**: Event Target (the input component)
-
-**When**: Timestamp (when did event occur)
-
-**Value**: Mouse coordinates; which key; etc.
-
-**Context**: Modifiers (Ctrl, Shift, Alt, etc); Number of clicks; etc.
-
-???
-Discuss each with examples
-
----
-
-# Input Event Goals
-
-Device Independence
-- Want / need device independence
-- Need a uniform and higher level abstraction for input
-
-Component Independence
-- Given a model for representing input, how do we get inputs delivered
-to the right component?
-???
-
-
----
-# Summary
-- Callbacks: a programatic way to get or send information from/to our program from the system
-
---
-- MVC: Separation of concerns for user interaction
---
-
-- Events: logical input device abstraction
---
-
-- We model everything as events
-- Sampled devices
-  - Handled as “incremental change” events
-  - Each measurable change: a new event with new value
-- Device differences
-  - Handled implicitly by only generating events they can generate
-- Recognition Based Input?
-  - Yes, can generate events for this too
-
-
----
-# End of Deck
diff --git a/slides/wk04/img/accessibility/JAWS_logo.png b/slides/wk04/img/accessibility/JAWS_logo.png
deleted file mode 100644
index 653532ed13a71afaa851d5a0c8bd119c70d12748..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/accessibility/JAWS_logo.png and /dev/null differ
diff --git a/slides/wk04/img/accessibility/NVDA_logo.png b/slides/wk04/img/accessibility/NVDA_logo.png
deleted file mode 100644
index 54eb3531832505478b73264830d8ea6dae708877..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/accessibility/NVDA_logo.png and /dev/null differ
diff --git a/slides/wk04/img/accessibility/ScreenReaderIllustration.png b/slides/wk04/img/accessibility/ScreenReaderIllustration.png
deleted file mode 100644
index e0671e6c54528c9fea483130979260016c61a6e1..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/accessibility/ScreenReaderIllustration.png and /dev/null differ
diff --git a/slides/wk04/img/accessibility/chart.png b/slides/wk04/img/accessibility/chart.png
deleted file mode 100644
index b2e1f680ee863fca1f6fe23e7b6bf933629b5295..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/accessibility/chart.png and /dev/null differ
diff --git a/slides/wk04/img/accessibility/diverse-people.png b/slides/wk04/img/accessibility/diverse-people.png
deleted file mode 100644
index 1717e18fce88c912b3a346a50b02ef08eebfffc0..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/accessibility/diverse-people.png and /dev/null differ
diff --git a/slides/wk04/img/events/eventdriven.png b/slides/wk04/img/events/eventdriven.png
deleted file mode 100644
index 67b3cebc7c86a8c61e71b16f054e56c26f5ef6c0..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/events/eventdriven.png and /dev/null differ
diff --git a/slides/wk04/img/events/mvp-design-pattern.png b/slides/wk04/img/events/mvp-design-pattern.png
deleted file mode 100755
index 9dd87a7f4c12553e619856dd300b307ae9e7b449..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/events/mvp-design-pattern.png and /dev/null differ
diff --git a/slides/wk04/img/events/oled.png b/slides/wk04/img/events/oled.png
deleted file mode 100644
index 93ff779017d7e530ef25d16b0ea8fbe6886e0e22..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/events/oled.png and /dev/null differ
diff --git a/slides/wk04/img/events/procedural.png b/slides/wk04/img/events/procedural.png
deleted file mode 100644
index e7c58ac3a6f46f44c0108c3a88838fbe9ec287ed..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/events/procedural.png and /dev/null differ
diff --git a/slides/wk04/img/events/quiz-mvc.png b/slides/wk04/img/events/quiz-mvc.png
deleted file mode 100644
index d8461c69af23ceebca4b045b0b1356db5049e4d2..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/events/quiz-mvc.png and /dev/null differ
diff --git a/slides/wk04/img/events/swipe.png b/slides/wk04/img/events/swipe.png
deleted file mode 100644
index e34f742fd91da41607df613a4c52c934462db305..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/events/swipe.png and /dev/null differ
diff --git a/slides/wk04/img/events/user.png b/slides/wk04/img/events/user.png
deleted file mode 100644
index abba33c403bb48060c5eb1027b976a9bc41a95db..0000000000000000000000000000000000000000
Binary files a/slides/wk04/img/events/user.png and /dev/null differ
diff --git a/slides/wk04/person.zip b/slides/wk04/person.zip
deleted file mode 100644
index 33212540315522bf36fbd37d6326b824ec591e46..0000000000000000000000000000000000000000
Binary files a/slides/wk04/person.zip and /dev/null differ
diff --git a/slides/wk04/person/Person.java b/slides/wk04/person/Person.java
deleted file mode 100644
index da937458e70d3ce038e690ecaf6e21d50b18b412..0000000000000000000000000000000000000000
--- a/slides/wk04/person/Person.java
+++ /dev/null
@@ -1,55 +0,0 @@
-import java.util.*;
-
-public class Person {
-
-   /////// Instance (non-static) methods of Person
-   private String mFirstName;
-   private String mLastName;
-   private int mAge;  
-   
-   
-   public Person(String firstName, String lastName, int age) {
-      mFirstName = firstName;
-      mLastName = lastName;
-      mAge = age;
-   }
-   
-   @Override
-   public String toString() {
-      return mFirstName + " " + mLastName + " - age " + mAge;
-   }
-   
-   public String getFirstName() {
-      return mFirstName; 
-   }
-   
-   public String getLastName() {
-      return mLastName; 
-   }
-   
-   public int getAge() {
-      return mAge; 
-   }
-   
-   
-   
-   
-   /**
-   * Ooh, fancy, an inner class!
-   * Inner classes are neat because they can access the private variables of their 
-   * outer class (Person in this case)
-   * Could we have made this its own public class in its own file, and added getters and 
-   * setters to Person?
-   *      Yes, we certainly could have. I just wanted you to see an inner class.
-   */
-   public static class FirstNameComparator implements Comparator<Person> {
-
-      @Override
-      public int compare(Person p1, Person p2) {
-         
-         // Fill me in using a known comparison method!
-         return 0;
-      }
-   }
-   
-}
\ No newline at end of file
diff --git a/slides/wk04/person/PersonClient.java b/slides/wk04/person/PersonClient.java
deleted file mode 100644
index 37ea4a315ceb7c3a52244b1c7eb426b2c572f4dd..0000000000000000000000000000000000000000
--- a/slides/wk04/person/PersonClient.java
+++ /dev/null
@@ -1,70 +0,0 @@
-import java.util.*;
-
-public class PersonClient {
-   
-   /**
-   *Main method prints out various sorts
-   *@param args commandline input
-   */
-   public static void main(String[] args) {
-      Person[] people = generatePeople();
-      
-      // Print the original list.       
-      System.out.println("Original list: " + Arrays.toString(people));
-      
-      Arrays.sort(people, new PersonLastNameComparator());
-      System.out.println("Sorted by last name: " + Arrays.toString(people));
-
-      Arrays.sort(people, new Person.FirstNameComparator());
-      System.out.println("Sorted by first name: " + Arrays.toString(people));
-
-
-      Arrays.sort(people, new Comparator<Person>() {
-         @Override
-         public int compare(Person p1, Person p2) {
-         
-            return p1.getAge() - p2.getAge();
-         }
-      });
-      System.out.println("Sorted by age (ascending): " + Arrays.toString(people));
-      
-      Arrays.sort(people, 
-         (Person p1, Person p2)->{return p2.getAge() - p1.getAge();});
-      System.out.println("Sorted by age (descending): " + Arrays.toString(people));
-      
-      
-
-
-
-
-
-
-
-   }
-   
-   /**
-   *Generates a list of three people for testing purposes
-   *@return a default list of people
-   */
-   private static Person[] generatePeople() {
-
-      Person[] people = {
-         new Person("Emma", "Watson", 30), 
-         new Person("Ncuti", "Gatwa", 27), 
-         new Person("Tina", "Fey", 49), 
-         new Person("Idris", "Elba", 47),
-         new Person("Awkwafina", "", 31),
-         new Person("Michael", "Mando", 38),
-         new Person("Judi", "Dench", 85),  
-         new Person("Adam", "Driver", 36),
-         new Person("Logan", "Browning", 30), 
-         new Person("John", "Hamm", 49), 
-         new Person("Dev", "Patel", 30), 
-         new Person("Manny", "Jacinto", 32), 
-         new Person("Jennifer", "Aniston", 51),  
-         new Person("Morgan", "Freeman", 82),  
-      };
-      return people;
-   }
-
-}
diff --git a/slides/wk04/person/PersonLastNameComparator.java b/slides/wk04/person/PersonLastNameComparator.java
deleted file mode 100644
index ae4c461538fc47e7ebe58aac91ab459d1bc01ce3..0000000000000000000000000000000000000000
--- a/slides/wk04/person/PersonLastNameComparator.java
+++ /dev/null
@@ -1,10 +0,0 @@
-import java.util.*;
-
-public class PersonLastNameComparator implements Comparator<Person> {
-
-   @Override
-   public int compare(Person p1, Person p2) {
-
-      return p1.getLastName().compareTo(p2.getLastName()); 
-   }
-}
\ No newline at end of file
diff --git a/slides/wk05/Counter.zip b/slides/wk05/Counter.zip
deleted file mode 100644
index ae4ab8d469d740ce739c5c02539ff36fea6cb14b..0000000000000000000000000000000000000000
Binary files a/slides/wk05/Counter.zip and /dev/null differ
diff --git a/slides/wk05/event-delivery.html b/slides/wk05/event-delivery.html
deleted file mode 100644
index 7cdc70d1f419860cddd44aebc316bc7febd45774..0000000000000000000000000000000000000000
--- a/slides/wk05/event-delivery.html
+++ /dev/null
@@ -1,948 +0,0 @@
----
-layout: presentation
-title: Event Handling II --  Event Delivery using the Interactor Hierarchy
-description: Describes input devices, abstractions around events, Listeners, Event Delivery
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Event Delivery using the Interactor Hierarchy
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-name: normal
-layout: true
-class:
----
-# Accessibilty warmup
-
-Try the problem on the front of the worksheet
-
---
-
-- TIL: Talkback will "tell" what an item on the screen is if
-  - it has a content description  (`android:contentDescription="..."`) OR
-  - is focusable (`android:focusable="true"`) OR
-  - it is clickable (`android:clickable="true"`) OR
-  - You have attached a `onClickListener` to the interactor.
-
----
-
-
-[//]: # (Outline Slide)
-# Today's goals
-
-Discuss how Input Events are delivered
-
-- Event hierarchy
-- Input dispatch process
-- Listeners <- Prework for Wednesday
-- ~~Picking, capture and bubble~~ <- Moved to Wednesday
-
----
-# Administrivia
-
-For Friday's examlet, you need to enable your UW GSuite account.
-
-- During class I will give out a link that will allow you to copy the Layout Examlet.
-- The Google Doc will copy to your drive.
-- You'll answer the questions in the doc.
-- You'll save the doc as a PDF
-- You'll upload the PDF to Gradescope.
-
-See this [page](https://itconnect.uw.edu/connect/email/google-apps/getting-started/) for
-information on how ensure your GSuite account is activated.
----
-# Review: Logical Device Approach
-
-- Valuator → returns a scalar value (like a slider)
-- Button → returns integer value
-- Locator → returns position on a logical view surface
-- Keyboard → returns character string
-- Stroke → obtain sequence of points
-
----
-# Meta notes
-
-We are working on grading the Layout Assignment.
--  It's mostly going well.
-- A common issues we're seeing is not reading the starter code and understanding what it is doing
-- Recommedation:
-  - START EARLY: this gives you time to go to OH, read our discussion board, ask questions, and
-  get responses. (Remember responses may not be instantaneous, so you may have to work on something
-  else while you wait. )
-  - Skim the spec. Write down a list of questions the spec raises (i.e what don't you know or understand
-  at a quick glance)
-  - Accept and open the code.
-  - Understand the class hierarchy that is given to you. A visual of the hierarchy should be in the spec.
-  - Understand what is happening in the onCreate of whatever extends from `AppCompatActivity`
-  - Start implementing Part1 and look for those TODOs.
-  - REREAD the spec.
-  - Remember to read the spec one more time before turning in the assignment to make sure you got all the pieces.
-
-
----
-# Meta notes
-
-  - Remember: this class is about Interaction Programming. Programming Android is the substrate for the discussion.
-  - We try to explicitly state when are discussing theory vs practice.
-  - Subgoal of this class: a transition or bridge to 300 level courses.
-    - Important that you learn how to read less structured specifications
-    - Important that you learn how to search for __usable__ information
-    - Is StackOverflow friend or foe?
-
----
-.left-column[
-# Review
-
-<div class="mermaid" >
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef green font-size:14pt,text-align:center
-
-  class ip,t,w,l,a green
-</div>
-]
-
-.right-column[
-<p>&nbsp;</p>
-<p>&nbsp;</p>
-
-- Which developer role were you when implementing Layout Part 1, 2, 3?
-
-- Did you take on any other developer roles for part 4?
-]
-
----
-# Interacting with the User
-
-.left-column-half[
-Command line interfaces
-![:img Picture of a Command Line Interface, 100%](img/event-delivery/commandline.png)
-]
-
---
-.right-column-half[
-- Think about the from 142/143 or in prior classes did they create that took user interaction
-  - e.g. Budgeter, Guessing game, Hangman
-- How would you write code to do interactivity on a command line or in the console in JGrasp?
-- What control flow structure did you use to get input repeatedly from the user?
-- Did the system continue to work or did it wait for the user input?
-]
-
-
----
-# Interacting with the User
-.left-column-half[
-Command line interfaces
-![:img Picture of a Command Line Interface, 100%](img/event-delivery/commandline.png)
-]
-.right-column-half[
-Mac Desktop interface
-![:img Picture of a windows desktop, 100%](img/event-delivery/windows.png)|
-]
-
-???
-  - Event-Driven Interfaces (GUIs)
-  - Interaction driven by user
-  - UI constantly waiting for input events
-  - Pointing & text input, graphical output
-
----
-# Review
-
-.left-column[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-
-  class ap,o,h,hlt,t yellow
-  class w green
-</div>
-]
-.right-column[
-The Window System layer has several responsibilities. It
-
-- provides each view (app) with an independent drawing interface.
-- ensures that the display gets updates to reflect changes
-- recieves input from the OS and dispatches it to the appropriate widget
-
-
-
-]
-
----
-# Review
-
-Device Independence
-- We need device independence to handle a variety of ways to get input
-- We need a uniform and higher level abstraction for input (events)
----
-
-# Contents of Event Record
-
-Think about one of your real world events from last class again. What do we need to know?
-
-**What**: Event Type
-
-**Where**: Event Target
-
-**When**: Timestamp
-
-**Value**: Event-specific variable
-
-**Context**: What was going on?
-
-???
-Discuss each with examples
-
----
-# Contents of Event Record
-
-Example: The cat meowed: What do we need to know?
-
-**What**: A cat's meow
-
-**Where**: My ears (this is the input target)
-
-**When**: 9:00pm
-
-**Value**: From the kitchen, near the food bowl
-
-**Context**: Whining, pacing, and generally being a pest.
-
-.footnote[It really does happen see [this video](img/event-delivery/jackhungry.mov)]
-???
-Jack wants food.
----
-# Contents of Event Record
-
-Example: The cat meowed: What do we need to know?
-
-**What**: A cat's meow
-
-**Where**: My ears (this is the input target)
-
-**When**: 10:00am
-
-**Value**: From the hallway or following us around
-
-**Context**: Purring and rubbing up against us
-
-???
-Jack wants attention.
----
-
-
----
-# Another example: : Contents of Event Record
-
-Now imagine a user clicks on the previous button in our PetGallery. What would the event button look like?
-
-What do we need to know about that UI event?
-
---
-**What**: Click (Could also think about the mouse down and mouse up separately)
-
---
-**Where**: X,Y coordinate of the finger when the click ended
-
---
-**When**: The timestamp when the click occured
-
---
-**Value**: 1 Finger (or maybe None)
-
---
-**Context**: Any possible modifiers (Ctrl, Shift, Alt, etc); Number of clicks; etc.
-
----
-
-# Your turn
-
-Imagine you are writing a program to listen for "Hey Siri" on an Android phone.
-
-Work with your neighbor to fill in the fields of the Event Record for this event on your worksheet.
-
-**What**:
-
-**Where**:
-
-**When**:
-
-**Value**:
-
-**Context**: Any possible modifiers
-
----
-
-# Your turn
-
-Imagine you are writing a program to ironically listen for "Hey Siri" on an Android phone.
-
-Work with your neighbor to fill in the fields of the Event Record for this event on your worksheet.
-
-**What**: Speaking starts (or speaking ends)
-
-**Where**: Normally position on screen. In this case, ill defined because this event is not dispatched positionally. Can be blank, or may hold the current cursor location.
-
-**When**: Timestamp of the audio heard
-
-**Value**: The content of the audio recorded
-
-**Context**: Any possible modifiers
-
----
-# Review
-
-Device Independence
-- We need device independence to handle a variety of ways to get input
-- We need a uniform and higher level abstraction for input (events)
-
-Component Independence
-- Given a model for representing input, how do we get inputs delivered
-to the right component?
-  - Valuator → returns a scalar value
-  - Button → returns integer value
-  - Locator → returns position on a logical view surface
-  - Keyboard → returns character string
-  - Stroke → obtain sequence of points
-
----
-
-## Android Events
-
-Each kind of event in Android its own class but they all implement the
-[InputEvent](https://developer.android.com/reference/android/view/InputEvent) abstract class.
-- A little hard to find all the parts defined in one place
-- Harder to deal with uniformly
-- But easily extensible for new event types
-
-.red[Artificial] events are a thing
-- Window Events
-- Search Event
-- others.
-
----
-# Android [MotionEvent](https://developer.android.com/reference/android/view/MotionEvent)
-
-```java
-java.lang.Object
-   ↳	android.view.InputEvent
- 	   ↳	android.view.MotionEvent
-
-public final class MotionEvent extends InputEvent implements Parcelable {
-
-  int getAction()      // up, down etc
-  int getActionIndex() // multi touch support -- which pointer
-  float getX()         // position
-  float getY()         // position
-  int getButtonState() // pressed or not, for example
-  long getDownTime()
-  float getOrientation(int pointerIndex)
-  float getPressure()
-  float getSize()      // fingers aren't pixel sized
-                       // and many more...
-}
-```
----
-# Aside: Multiple Hierarchies discussed so far in class
-
-Can you think of them?
-
---
-
-- Inheritance hierarchy for interactors (Viewp)
-- Inheritance hierarchy for layout
-- Inheritance hierarchy for events
-- Component hierarchy (Interactors and View Groups)
---
-  - Also remember how the component hierarchy is used in drawing (Z-order)
-
----
-# Events can represent abstract concepts...
-
-Can you think of any?
-
---
-
-...Think of how the state of the app changes as you use it.
-
---
-
-- __Create__: Android is done creating the object
---
-- __Active__: in foreground of screen, and receives input
---
-- __Paused__: activity lost focus (is no longer displayed on screen)
---
-- __Stopped__:
-  - Another activity has focus
-  - Original activity remains in memory -- perfect place to save data & state
-  - Often can be *killed* by Android OS if not resumed relatively quickly
---
-- __Inactive__: after an activity has been killed; or before it is launched
---
-- __Timer__: Animation
-
----
-
-# Activity State Change Events
-
-.left-column-half[
-![:img Android Activity Lifecycle,50%](img/event-delivery/activity_lifecycle.png)
-]
-.right-columns-half[
-Look familiar?
-]
-
----
-# Thinking as a Toolkit Developer
-
-.left-column-half[
-<br>
-<div class="mermaid">
-  graph LR
-  ip[Interface Programmer]
-  w[Component Developer]
-  l[Library Extender]
-  a[Architecture Extender]
-  t[Toolkit Builder]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-
-  class ip,w,l,a green
-  class t yellow
-</div>
-]
-
-.right-column-half.font-smaller[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-  classDef yellow font-size:14pt,text-align:center
-  classDef green font-size:14pt,text-align:center
-
-  class ap,o,h,hlt,w green
-  class t yellow
-</div>
-
-]
-
----
-# How does the Toolkit Architecture deliver events?
-
-Application’s UI Thread (This is the main thread of your program)
-```java
-while (true) {
-  // Gets event from the application message queue.
-  // If the queue is empty, we just wait here.
-  Event e = GetEventFromMessageQueue();
-
-  // Dispatches the event to the appropriate application window
-  // (the destination address is in the event data).
-  DispatchEventToMessageDestination(e);
-}
-```
---
-This code is automatically setup and managed by the UI framework you are using (e.g., .NET, WPF, Android, Swift).
-You don’t really need to worry about it (but you should know it’s there and how it functions!)
-
----
-# Input __Dispatch__ Process
-
-Input thread:
-- When a user interacts,  __events__ are created
-- Events go into a queue
-
-???
-
-What do you think of when you hear the word "thread"? How does it relate to CS?
-
-Remember a queue is a data structure that is first in first out.
-
----
-# Input __Dispatch__ Process
-
-Input thread
-
-Dispatch thread:
-- Front event comes off queue
-- How does a toolkit decide where to send events?
-
---
-
-- Depends: Is it Focus or Positional input?
- - Focus list (in order based on interest)
- - Positional list (z-order under cursor based on interactor hierarchy)
-
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface, 100%](img/event-delivery/callbacks.png)]
-.right-column-half[
-Dispatch Strategies (theory)
-- Positional
-  - Bottom-up
-  - Top-down
-  - Bubble out
-- Focus-based
-]
----
-.left-column-half[
-## Event Dispatch (theory)
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface, 100%](img/event-delivery/callbacks.png)
-]
-.right-column-half[
-- Bottom up dispatch
-  - The event is directed to the "lowest", frontmost interactor in the tree that
-contains the mouse position
-  - That interactor might not want the input, so it goes to window at the next level up the tree
-]
----
-.left-column-half[
-## Event Dispatch (theory)
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface, 100%](img/event-delivery/callbacks.png)
-]
-.right-column-half[
-- Bottom up dispatch
-- Top down dispatch
-  - The event is directed to topmost window that contains the mouse location
-  - That window decides how to dispatch it further (recursively)
-  - Common in OO toolkits
-  - Useful in situations where the interactor is "view only" (parent wants to disable input to child)
-]
-
----
-.left-column-half[
-## Event Dispatch (theory)
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface, 100%](img/event-delivery/callbacks.png)
-]
-.right-column-half[
-- Bottom up dispatch
-- Top down dispatch
-- Bubble-out dispatch
-  - Used when there is no clear nesting of windows and groups of interactive objects
-  - Tree is traversed as in top down approach, but bounding rectangles are hints, not guarantees
-  - Objects checked in opposite order from drawing: frontmost items are checked first
-  - Object that was hit is attached to the event, ancestors know what was selected
-]
-
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface, 100%](img/event-delivery/callbacks.png)
-]
-.right-column-half[
-- Bottom up dispatch
-- Top down dispatch
-- Bubble-out dispatch
-- Focus dispatch
-  - No straighforward location of where the event happened
-  - Windowing system determines which window/interactor should get the input.
-  - Common example: where should key press/release events go?
-]
-
-
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface and a do_action() call
-happening below the line in response to a button_pressed(), 100%](img/event-delivery/callbacks2.png)]
-.right-column-half[
-Callbacks handle *application* response to events
-- Update Application Model
-
-]
-
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface with do_action() replaced
-with an actionListener, 100%](img/event-delivery/callbacks3.png)]
-.right-column-half[
-Callbacks handle *application* response to events
-- Update Application Model
-- Best implemented using custom listeners
-
-]
-
----
-template: inverse
-
-## Event Listeners
-
-### Putting theory into practice
-
-???
-- Implementation strategy
-
-- Basic goal: notify something of a change
-
----
-# Basics of Event Listeners (1/3)
-
-- Interface on the `View` class that acts as a _callback_ method
-
---
-
-  - Recall interfaces specify behavior (but no data) that can be inherited.
-
---
-
-- Must be attached to a particular `View`
-
---
-
-- Android framework triggers the method once the `View` is interacted with by the user
-
---
-
-- A `View` can have listen for different types of interactions
-- But: the `View` must implement and registering the appropriate listeners
-
-???
-What is an interface?
-
----
-layout: false
-
-.left-column[
-## Standard Event Listeners provided by Android
-
-More listed in the [API Documentation](https://developer.android.com/guide/topics/ui/ui-events.html)
-]
-.right-column[
-The set of Android's provided interfaces include:
-  ```java
-    // User tapped a view
-    public static interface View.OnClickListener { ... }
-
-    // User long pressed on a View
-    public static interface View.OnLongClickListener { ... }
-
-    // State of view has changed
-    // (e.g. user clicked outside a EditText input box)
-    public static interface View.OnFocusChangeListener { ... }
-  ```
- ]
-
----
-# Implementing clicking
-
-Create your button
-
-Register an event listener with the button
-
----
-# Registering an Event Listener
-
-~~Three~~ five ways to register an event listener:
-
-  - Creating a separate class/file or an inner class
-  - Creating an anonymous inner class
-  - Implementing an Interface
-  - Creating an anonymous class as a parameter
-  - Lambdas
-
-Code for the following demo is [here](Counter.zip).
-This code uses a helper function
-```java
-/** Method to increment the count field */
-private void incrementCount(View v) {
-    TextView counter = findViewById(R.id.count);
-    String textCount = counter.getText().toString();
-    int count = Integer.parseInt(textCount);
-    counter.setText("" + ++count);
-
-    ((TextView)findViewById(R.id.whichButton)).setText(((Button)v).getText());
-
-}
-```
-
----
-
-.left-column[
-## Registering a Listener - Inner class (1/2)
-
-Create the Listener subclass
-]
-.right-column[
-  ```java
-  private class MyButtonListener implements View.OnClickListener {
-      @Override
-      public void onClick(View v) {
-          incrementCount(v);
-      }
-  }
-  ```
-]
----
-.left-column[
-## Registering a Listener  - Inner class (2/2)
-
-Create the Listener subclass
-
-Register it (by instantiating an object of that type)
-]
-.right-column[
-  ```java
-  // in onCreate...
-  Button b1 = findViewById(R.id.button_three);
-  if (b1 != null) {  // Should always check for null
-      b1.setOnClickListener(new MyButtonListener());
-  }
-  ```
-]
-
-
----
-.left-column[
-## Create an Anonymous Inner Class
-]
-.right-column[
-```java
-public class EventExampleActivity extends AppCompatActivity {
-
-  // An anonymous inner class as a member variable in an Activity
-  View.OnClickListener mButtonClickListener = new View.OnClickListener() {
-      @Override
-      public void onClick(View v) {
-          // call the private method in EventExampleActivity
-          incrementCount(v);
-      }
-  };
-
-  protected void onCreate(Bundle savedState) {
-    Button b1 = findViewById(R.id.button_one);
-    if (b1 != null) {
-      b1.setOnClickListener(mButtonClickListener);
-    }
-  }
-}
-```
-]
-
-???
-incrementCount is a private method
-Mention that mXxxx variables are private fields and this is a quick way
-to find all private fields when searching variables in code
----
-# Digging deeper: Creating an Anonymous Inner Class
-
-Let's take some time to parse this...
-
-```java
-  private View.OnClickListener mButtonClickListener = new View.OnClickListener() {
-```
-- `private` - it's only available inside the class that contains it (i.e. `EventExampleActivity`)
-- `View.OnClickListener` is the variable type ([Documentation](https://developer.android.com/reference/android/view/View.OnClickListener.html)) - a nested class in `View`
-- `mButtonClickListener` is the variable name which is being set to...
-- a `new View.OnClickListener()` which is an anonymous object from an abstract class
-  - For those of you who have not taken 331, that means that there are methods that have not been implemented in the class.
-  - The on method that you MUST implement (in order to create a new object) is `OnClick` which overrides the abstract method
-
-```java
-  public void OnClick(View v) { /* stuff in here does the work when a click is received! */ }
-```
----
-
-.left-column[
-## Registering a Listener - Implement the Interface
-]
-.right-column[
-  ```java
-// Start by implementing the interface
-public class EventExampleActivity extends AppCompatActivity
-  implements View.OnClickListener { // Necessary to implement
-
-  protected void onCreate(Bundle savedState) {
-    Button b3 = findViewById(R.id.button_three);
-    if (b3 != null) {  // Should always check for null
-        b3.setOnClickListener(this);
-    }
-  }
-
-  // Here's where you do the implementation of your listener in your class
-  @Override
-   public void onClick(View v) {
-       incrementCount(v);
-   }
-  ```
-]
----
-
-.left-column[
-## Registering a Listener - Anonymous class as a parameter
-
-Create and register the listener all at once
-]
-.right-column[
-  ```java
-  Button b4 = findViewById(R.id.button_four);
-   if (b4 != null) {  // Should always check for null
-       b4.setOnClickListener(new View.OnClickListener() {
-           public void onClick(View v) {
-               incrementCount(v);
-           }
-       });
-   }
-  ```
-]
----
-.left-column[
-## Registering a Listener - lambda
-
-Create the and register the listener all at once with lamba syntax
-]
-.right-column[
-  ```java
-  Button b5 = findViewById(R.id.button_five);
-  if (b5 != null) {  // Should always check for null
-      b5.setOnClickListener((View v) -> incrementCount(v));
-  }
-  ```
-]
-.right-column[
-To use Lambdas you have to upgrade to Java 8. See these
-[instructions](https://developer.android.com/studio/write/java8-support) to do this.
-]
-
----
-.left-column[
-## Registering Multiple Listeners
-]
-.right-column[
-Can register more than one listener
-
-For example:
-```java
-  View v = new View();
-  v.setOnClickListener(...);
-  v.setOnLongClickListener(...);
-  ```
-]
----
-.left-column[
-## Many Views, Same Listener (1/3)]
-
-.right-column[
-Event callbacks are passed the `View` as a parameter
-]
---
-
-.right-column[
-
-We can reuse a listener for views that handle the same action
-  (e.g. all 5 buttons could use the same class/method for the action)
-]
----
-
-## Many Views, Same Listener (2/3)
-
-- And we can handle different actions by checking the `View` or its `id`:
-  ```java
-    protected void onCreate(Bundle savedState) {
-      Button b1 = (Button) findViewById(R.id.button_one);
-      if (b1 != null) {
-        b1.setOnClickListener(mButtonClickListener);
-      }
-
-      Button b2 = (Button) findViewById(R.id.button_two);
-      if (b2 != null) {
-        b2.setOnClickListener(mButtonClickListener);
-      }
-    }
-  ```
----
-## Many Views, Same Listener (3/3)
-
-You can use the ID of the view to determine where the event originated from
-
-```java
-  View.OnClickListener mButtonClickListener = new View.OnClickListener({
-    public void onClick(View v) {
-      if (v == null) {
-        return;
-      }
-
-      int viewId = v.getId();
-
-      switch (viewId) {
-        case R.id.button_one:  // First Button
-          Log.d("Button Press", "First Button");
-          break;
-        case R.id.button_two:  // Second Button
-          Log.d("Button Press", "Second Button");
-          break;
-        default:               // Someone else is using the listener!
-          Log.d("Button Press", "Invalid Button!");
-      }
-    }
-  });
-```
----
-.left-column[
-## Marking an event as handled
-]
-.right-column[
-This ensures only one view gets it (we talk about the algorithm behind this later)
-
-Return `boolean` value that indicate the event has been handled (`true`)
-
-  ```java
-    /**
-     * onLongClick - triggered when a view is long clicked
-     * @param v - the view long pressed
-     * @return - true if the callback consumed the long click, false otherwise.
-     **/
-    boolean onLongClick (View v) { ... };
-  ```
-]
-.footnote[[API Documentation for Long Click](https://developer.android.com/reference/android/view/View.OnLongClickListener.html)
-]
-
----
-# End of Deck
-
-Thing to think about...
-
-How would you handle input in a circular component?
diff --git a/slides/wk05/img/event-delivery/activity_lifecycle.png b/slides/wk05/img/event-delivery/activity_lifecycle.png
deleted file mode 100644
index ab0921a717d184442c96c1b8863018d46920a67c..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/event-delivery/activity_lifecycle.png and /dev/null differ
diff --git a/slides/wk05/img/event-delivery/callbacks.png b/slides/wk05/img/event-delivery/callbacks.png
deleted file mode 100644
index 72147534bc5ba07de7a95ffe479f5505d65814f4..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/event-delivery/callbacks.png and /dev/null differ
diff --git a/slides/wk05/img/event-delivery/callbacks2.png b/slides/wk05/img/event-delivery/callbacks2.png
deleted file mode 100644
index 37eeff1f958d4f711faf7ce2af0ceb9736121957..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/event-delivery/callbacks2.png and /dev/null differ
diff --git a/slides/wk05/img/event-delivery/callbacks3.png b/slides/wk05/img/event-delivery/callbacks3.png
deleted file mode 100644
index c7c5e1de7d5c73ca13b8e95df99735ce5aeec7fa..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/event-delivery/callbacks3.png and /dev/null differ
diff --git a/slides/wk05/img/event-delivery/commandline.png b/slides/wk05/img/event-delivery/commandline.png
deleted file mode 100644
index 773bd5e16472702193d5aa0b8818d4b283f35662..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/event-delivery/commandline.png and /dev/null differ
diff --git a/slides/wk05/img/event-delivery/cookie-monster.gif b/slides/wk05/img/event-delivery/cookie-monster.gif
deleted file mode 100755
index f484a992a84a146276ed1a80af3f60fd225e4ff6..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/event-delivery/cookie-monster.gif and /dev/null differ
diff --git a/slides/wk05/img/event-delivery/jackhungry.mov b/slides/wk05/img/event-delivery/jackhungry.mov
deleted file mode 100644
index a41f687b0b33dd94a57a852ab9e8a82c602266fd..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/event-delivery/jackhungry.mov and /dev/null differ
diff --git a/slides/wk05/img/event-delivery/windows.png b/slides/wk05/img/event-delivery/windows.png
deleted file mode 100644
index 3fc19c0be90e80ae595ccc58c6a8b58116954300..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/event-delivery/windows.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/activity_lifecycle.png b/slides/wk05/img/pps-geom/activity_lifecycle.png
deleted file mode 100755
index 879f51f6e8fafe75d267984680ef63f85b118dc5..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/activity_lifecycle.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/android-activity-states-01.png b/slides/wk05/img/pps-geom/android-activity-states-01.png
deleted file mode 100755
index 614cc908ef0e4a693643d2a07d7131feab55fc13..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/android-activity-states-01.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/android-activity-states-02.png b/slides/wk05/img/pps-geom/android-activity-states-02.png
deleted file mode 100755
index e7042ef93ac69f8da5c7353babd93a727284541a..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/android-activity-states-02.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/callbacks.png b/slides/wk05/img/pps-geom/callbacks.png
deleted file mode 100644
index 72147534bc5ba07de7a95ffe479f5505d65814f4..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/callbacks.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/callbacks2.png b/slides/wk05/img/pps-geom/callbacks2.png
deleted file mode 100644
index 37eeff1f958d4f711faf7ce2af0ceb9736121957..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/callbacks2.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/callbacks3.png b/slides/wk05/img/pps-geom/callbacks3.png
deleted file mode 100644
index c7c5e1de7d5c73ca13b8e95df99735ce5aeec7fa..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/callbacks3.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/focus.png b/slides/wk05/img/pps-geom/focus.png
deleted file mode 100644
index 0e3b191d6a01f296400772022e90781889482d0a..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/focus.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/messenger-bubble.gif b/slides/wk05/img/pps-geom/messenger-bubble.gif
deleted file mode 100755
index 77defd497891e79a775a6ca3593cf33e02d2c890..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/messenger-bubble.gif and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/noresponse.png b/slides/wk05/img/pps-geom/noresponse.png
deleted file mode 100644
index cb52157c564bfd05b70e0a9c1c2e4b1d9b5925ad..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/noresponse.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/notevent.png b/slides/wk05/img/pps-geom/notevent.png
deleted file mode 100644
index c610bff3b877a36f2d47fce0b250781c540e08ae..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/notevent.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/picklist.svg b/slides/wk05/img/pps-geom/picklist.svg
deleted file mode 100644
index b1bb184b9fa2dc7dc9a5a3a659943a137a331c70..0000000000000000000000000000000000000000
--- a/slides/wk05/img/pps-geom/picklist.svg
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 24.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 184.8 195.3" style="enable-background:new 0 0 184.8 195.3;" xml:space="preserve">
-<style type="text/css">
-	.st0{fill:none;stroke:#000000;stroke-miterlimit:10;}
-	.st1{fill:#2E3192;}
-	.st2{font-family:'MyriadPro-Regular';}
-	.st3{font-size:12px;}
-	.st4{fill:#009444;}
-	.st5{fill:#D12029;}
-	.st6{fill:none;stroke:#2E3192;stroke-miterlimit:10;}
-	.st7{fill:none;stroke:#42B649;stroke-miterlimit:10;}
-	.st8{fill:none;stroke:#D12029;stroke-miterlimit:10;}
-	.st9{fill:#160C0B;}
-	.st10{fill:none;stroke:#000000;stroke-width:0.75;stroke-miterlimit:10;}
-	.st11{fill:none;stroke:#000000;stroke-width:0.75;stroke-miterlimit:10;stroke-dasharray:9.9093,9.9093;}
-	.st12{fill:none;stroke:#000000;stroke-width:0.75;stroke-miterlimit:10;stroke-dasharray:10.9093,10.9093;}
-	.st13{fill:none;stroke:#D12029;stroke-width:0.75;stroke-miterlimit:10;}
-	.st14{fill:none;stroke:#D12029;stroke-width:0.75;stroke-miterlimit:10;stroke-dasharray:10.9303,10.9303;}
-	.st15{fill:none;stroke:#D12029;stroke-width:0.75;stroke-miterlimit:10;stroke-dasharray:9.9093,9.9093;}
-</style>
-<polygon class="st0" points="179.3,190.4 3.3,190.4 3.9,4.3 179.9,4.3 "/>
-<text transform="matrix(1 0 0 1 25.2813 65.6343)" class="st1 st2 st3">V1</text>
-<text transform="matrix(1 0 0 1 52.2813 71.4978)" class="st4 st2 st3">V3</text>
-<text transform="matrix(1 0 0 1 31.2098 104.4477)" class="st5 st2 st3">V2</text>
-<text transform="matrix(1 0 0 1 82.7637 37.6707)" class="st1 st2 st3">V4</text>
-<text transform="matrix(1 0 0 1 123.6179 130.4509)" class="st2 st3">V5</text>
-<text transform="matrix(1 0 0 1 105.8968 80.1523)" class="st5 st2 st3">V6</text>
-<rect x="18.3" y="53.6" class="st6" width="73" height="80"/>
-<text transform="matrix(1 0 0 1 9.3218 19.4072)" class="st2 st3">V0</text>
-<polygon class="st7" points="87.9,84.1 45.9,84.1 46.3,58.5 88.3,58.5 "/>
-<rect x="77.5" y="25.4" class="st6" width="92.2" height="155.1"/>
-<rect x="25.3" y="91.4" class="st8" width="48.9" height="33.7"/>
-<polygon class="st0" points="152.8,136.6 133.5,158.8 110.6,135.9 129.9,113.7 "/>
-<ellipse class="st8" cx="110.8" cy="88.1" rx="33.3" ry="20.1"/>
-<circle class="st9" cx="82.8" cy="71.5" r="3.5"/>
-<g>
-	<g>
-		<polyline class="st10" points="152.6,152.6 152.6,158.6 146.6,158.6 		"/>
-		<line class="st11" x1="136.7" y1="158.6" x2="121.8" y2="158.6"/>
-		<polyline class="st10" points="116.8,158.6 110.8,158.6 110.8,152.6 		"/>
-		<line class="st12" x1="110.8" y1="141.7" x2="110.8" y2="125.3"/>
-		<polyline class="st10" points="110.8,119.9 110.8,113.9 116.8,113.9 		"/>
-		<line class="st11" x1="126.8" y1="113.9" x2="141.6" y2="113.9"/>
-		<polyline class="st10" points="146.6,113.9 152.6,113.9 152.6,119.9 		"/>
-		<line class="st12" x1="152.6" y1="130.8" x2="152.6" y2="147.2"/>
-	</g>
-</g>
-<g>
-	<g>
-		<polyline class="st13" points="144.2,103 144.2,109 138.2,109 		"/>
-		<line class="st14" x1="127.2" y1="109" x2="89" y2="109"/>
-		<polyline class="st13" points="83.5,109 77.5,109 77.5,103 		"/>
-		<line class="st15" x1="77.5" y1="93.1" x2="77.5" y2="78.2"/>
-		<polyline class="st13" points="77.5,73.3 77.5,67.3 83.5,67.3 		"/>
-		<line class="st14" x1="94.5" y1="67.3" x2="132.7" y2="67.3"/>
-		<polyline class="st13" points="138.2,67.3 144.2,67.3 144.2,73.3 		"/>
-		<line class="st15" x1="144.2" y1="83.2" x2="144.2" y2="98"/>
-	</g>
-</g>
-</svg>
diff --git a/slides/wk05/img/pps-geom/quizqs.png b/slides/wk05/img/pps-geom/quizqs.png
deleted file mode 100644
index 27636e6e935530d985628916bda1cfc7ab67d710..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/quizqs.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/window-with-highlighted-menu.png b/slides/wk05/img/pps-geom/window-with-highlighted-menu.png
deleted file mode 100644
index e283f1c2cc3703e082aa33e292916c1d0dcf4bc3..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/window-with-highlighted-menu.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/window-with-menu-highlight.png b/slides/wk05/img/pps-geom/window-with-menu-highlight.png
deleted file mode 100644
index c98efae6cbebbc0ae06d4bf2cf959a56850b29dc..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/window-with-menu-highlight.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/window-with-menu-highlight2.png b/slides/wk05/img/pps-geom/window-with-menu-highlight2.png
deleted file mode 100644
index d18967a3a33292c574743985e1a44882806cc78b..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/window-with-menu-highlight2.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/window-with-scrollbar.png b/slides/wk05/img/pps-geom/window-with-scrollbar.png
deleted file mode 100644
index cd6cd1f015f34aed26f079a6e8bdfe0b19031eb6..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/window-with-scrollbar.png and /dev/null differ
diff --git a/slides/wk05/img/pps-geom/window.png b/slides/wk05/img/pps-geom/window.png
deleted file mode 100644
index e1edc0bca27881e6b8a54fbdf4495b3e493886c8..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/pps-geom/window.png and /dev/null differ
diff --git a/slides/wk05/img/whole/callbacks.png b/slides/wk05/img/whole/callbacks.png
deleted file mode 100644
index 72147534bc5ba07de7a95ffe479f5505d65814f4..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/callbacks.png and /dev/null differ
diff --git a/slides/wk05/img/whole/callbacks2.png b/slides/wk05/img/whole/callbacks2.png
deleted file mode 100644
index 37eeff1f958d4f711faf7ce2af0ceb9736121957..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/callbacks2.png and /dev/null differ
diff --git a/slides/wk05/img/whole/callbacks3.png b/slides/wk05/img/whole/callbacks3.png
deleted file mode 100644
index c7c5e1de7d5c73ca13b8e95df99735ce5aeec7fa..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/callbacks3.png and /dev/null differ
diff --git a/slides/wk05/img/whole/combined.png b/slides/wk05/img/whole/combined.png
deleted file mode 100644
index 8f82cd3caaf966242fa1d127118706586d6793c0..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/combined.png and /dev/null differ
diff --git a/slides/wk05/img/whole/drawing.png b/slides/wk05/img/whole/drawing.png
deleted file mode 100644
index 1ee68b6c60c5e385f381295d075a042752076e49..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/drawing.png and /dev/null differ
diff --git a/slides/wk05/img/whole/full-solution-buffering.png b/slides/wk05/img/whole/full-solution-buffering.png
deleted file mode 100644
index 63871837cf02c6984b3fd18308c9a20dd944c201..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/full-solution-buffering.png and /dev/null differ
diff --git a/slides/wk05/img/whole/interpolators.gif b/slides/wk05/img/whole/interpolators.gif
deleted file mode 100644
index ad4e46ef00ad0843547fa69de0754dbaf9a7c59b..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/interpolators.gif and /dev/null differ
diff --git a/slides/wk05/img/whole/original-new.png b/slides/wk05/img/whole/original-new.png
deleted file mode 100644
index 3c9f19ae8050a037ba29c82249cc7f3fda1a3db9..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/original-new.png and /dev/null differ
diff --git a/slides/wk05/img/whole/redcomp.png b/slides/wk05/img/whole/redcomp.png
deleted file mode 100644
index 81dec38e9e9408f89fddf1c850100ef978395f2a..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/redcomp.png and /dev/null differ
diff --git a/slides/wk05/img/whole/value-sat.png b/slides/wk05/img/whole/value-sat.png
deleted file mode 100644
index b5ffb6814dde40eb19feca12d1c5d404219c0831..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/value-sat.png and /dev/null differ
diff --git a/slides/wk05/img/whole/window-with-menu.png b/slides/wk05/img/whole/window-with-menu.png
deleted file mode 100644
index ce64e0a977b63efb250de2eac8551ceaebf94f44..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/window-with-menu.png and /dev/null differ
diff --git a/slides/wk05/img/whole/window.png b/slides/wk05/img/whole/window.png
deleted file mode 100644
index e1edc0bca27881e6b8a54fbdf4495b3e493886c8..0000000000000000000000000000000000000000
Binary files a/slides/wk05/img/whole/window.png and /dev/null differ
diff --git a/slides/wk05/pps-geom.html b/slides/wk05/pps-geom.html
deleted file mode 100644
index ff0500f9ae11a47653368092d742cca3bd3134b1..0000000000000000000000000000000000000000
--- a/slides/wk05/pps-geom.html
+++ /dev/null
@@ -1,1099 +0,0 @@
----
-layout: presentation
-title: Event Handling III--Essential Geometry and View Updates
-description:
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# View Updates and Essential Geometry
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout:false
-
-[//]: # (Outline Slide)
-# Today's goals
-
-- Quick follow up from Monday - Click Listeners
-- Other Android callbacks
-- Input dispatching process (toolkit architecture)
-  - Picking (alternative: Focus)
-  - Capture
-  - Bubble
-- Propositional Production Systems in implementing interactors
-- Essential Geometry
-
----
-# Before anyone asks
-
-- Accessibility is due Thursday night. There is no reflection.
-- Examlet is on Friday (starting the last half of class).
-  - To avoid distraction this will entirely be a "take home" examlet. You may leave "class"
-  once we begin. (I will stay in class in case people need to come back in for clarifications).
-  - Instructions will be on Ed.
-  - You will be given a Google doc link to copy to your drive. You MUST have
-   [UW's GSuite enabled](https://itconnect.uw.edu/connect/email/google-apps/getting-started/).
-  - You will complete the quiz in your version of the Google doc
-  - You will your solution as a PDF (File->Download->PDF) to your machine
-  - You will then upload the quiz to Gradescope Quiz 5.
-  - Any issues will be added to an erratta document (link will also be in the ed post.)
-  - We will give you (some) more time to handle the technology.
-
----
-
-# Review of Monday
-
-- Events: logical input device abstraction
-- Event driven code: very different from procedural programming
-- Listeners are notified about events by the system and toolkit
-- Case study: implementing View.OnClickListener
-  - Creating a separate class/file or an inner class
-  - Creating an anonymous inner class
-  - Implementing an Interface
-  - Creating an anonymous class as a parameter
-  - Lambdas
-
-Please open [Ed Sway](https://us.edstem.org/courses/381/sway/)
-
-
----
-
-template: inverse
-
-# Other Android Callbacks
-
----
-layout: false
-
-# Event listeners Android sets up by default (1/3)
-
-- `onCreate`
-  - called when the activity is first created
-  - we've seen this in our Doodle, Layout, and even EventExampleActivity apps:
-
-```java
-@Override
-protected void onCreate(Bundle savedInstanceState) {
-  // We want to do any view initialization work here
-  super.onCreate(savedInstanceState);
-
-  // Load the XML representation of our layout into the view
-  setContentView(R.layout.activity_main);
-
-  // Any other work we need to do like adding views or
-  // registering click listeners!
-}
-```
-
----
-
-# Event listeners Android sets up by default (2/3)
-
-- `onStart`
-  - Called when activity is about to be visible to the user
-  - Always gets called after `onCreate` or `onRestart`
---
-- `onResume`
-  - Called when the activity will start interacting with a use
-  - Always gets called after `onStart`
---
-- `onPause`
-  - Called when the system is about to start resuming another previous activity
-  - __Commit changes__ to persistent data, __stop animations & intense operations__, __kill network__ requests
-  - .red[Fast implementation required!] - the next activity will not resume until this finishes in your activity
---
-- `onStop`: Called when the activity is no longer visible to the user
----
-# Event listeners Android sets up by default (3/3)
-
-- `onRestart`
-  - Called when the activity was previously stopped but is coming back to the user
-  - Followed by a call to `onStart`
---
-- `onDestroy`: the final notice before your activity is .red[__destroyed__]
---
-  .center.half-width-img[
-    ![Cookie Monster Eating](img/event-delivery/cookie-monster.gif)
-  ]
-
-
----
-template: inverse
-
-## Input Dispatch Process
-
----
-layout: false
-
-# Input __Dispatch__ Process
-
-Input thread:
-- When a user interacts,  __events__ are created
-- Events go into a queue
-
----
-# Input __Dispatch__ Process
-
-Input Thread
-
-Dispatch thread:
-- Front event comes off queue
-- Event gets sent to a listener (callback) attached to a `View` or `Activity`.
-- The `View` or `Activity` implements the callback
-
----
-.left-column-half[
-## Event Dispatch (Summary)
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface, 100%](img/pps-geom/callbacks.png)]
-.right-column-half[
-Theoretical Dispatch Strategies
-- Positional
-  - Bottom-up: The event sent to the "lowest", frontmost interactor in the tree that
-contains the mouse position. If it's not wanted there it goes up the tree.
-  - Top-down: Event is sent to the topmost interactor that contains the mouse location, then passed
-  down recursively to children.
-  - Bubble out: Traversal starts top down, bounding rectangles are hints. Event is sent to bottom most item (drawn last),
-  the event can bubble back (with knowledge of what was hit).
-- Focus-based: Windowing system determines which interactor gets the event.
-]
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface and a do_action() call
-happening below the line in response to a button_pressed(), 100%](img/pps-geom/callbacks2.png)]
-.right-column-half[
-Callbacks handle *application* response to events
-- Update Application Model
-
-]
-
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface with do_action() replaced
-with an actionListener, 100%](img/pps-geom/callbacks3.png)]
-.right-column-half[
-Callbacks handle *application* response to events
-- Update Application Model
-- Best implemented using custom listeners
-
-]
-
----
-# Another type of event: `onTouchEvent`
-
-- `onTouchEvent` is a callback that can be implemented on a `View` to react
-to a user's touch
-- Often used when creating your own new component.
-
-```java
-public class MyView extends View extends View.OnTouchListener {
-
-  @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    ...
-    // register the touch event
-    setOnTouchListener(this)
-  }
-  ...
-  @Override
-  public boolean onTouchEvent(MotionEvent event) {
-    // Handle the touch event here
-  }
-}
-
-```
----
-# Example: Overlapping windows
-
-.left-column40[
-<div class="mermaid">
-graph TD
-V0((V0)) --> V1((V1))
-V0 --> V4((V4))
-V1 --> V2((V2))
-V1 --> V3((V3))
-V4 --> V5((V5))
-V4 --> V6((V6))
-
-</div>
-]
-.right-column50[
-![:img Example of what this tree might look like in graphical form with V0 at the back, 60%](img/pps-geom/picklist.svg)
-]
----
-# How does _Android_ decide where to send events?
-
-.left-column40[
-<div class="mermaid">
-graph TD
-V0((V0)) --> V1((V1))
-V0 --> V4((V4))
-V1 --> V2((V2))
-V1 --> V3((V3))
-V4 --> V5((V5))
-V4 --> V6((V6))
-
-</div>
-]
-.right-column50[
-- Android traverses the view hierarchy (starting at root)
-- "Picks" `View` obects that respond to an input event
-- Loops through the list of `View` objects, checks if they will "capture" the event
-- If none capture the event, the event "bubbles" back up the `View`
-  object list
-]
-
----
-# Input Process - Picking
-
-.left-column40[
-<div class="mermaid">
-graph TD
-V0((V0)) --> V1((V1))
-V0 --> V4((V4))
-V1 --> V2((V2))
-V1 --> V3((V3))
-V4 --> V5((V5))
-V4 --> V6((V6))
-
-</div>
-]
-.right-column50[
-- In what order does dispatch "pick" the `View` objects?
-]
---
-.right-column50[
-- Hint: Post order traversal of the tree
-]
---
-.right-column50[
-- Picked Views = {`V2`, `V3`, `V1`, `V5`, `V6`, `V4`, `V0`}
-- Order matters!
-]
----
-# Input Process - Picking
-
-.left-column40[
-<div class="mermaid">
-graph TD
-V0((V0)) --> V1((V1))
-V0 --> V4((V4))
-V1 --> V2((V2))
-V1 --> V3((V3))
-V4 --> V5((V5))
-V4 --> V6((V6))
-</div>
-]
-
-.right-column50[
-But we can refine this! We can filter!
-
-What are some reasons to skip views?
-]
---
-.right-column50[
-- Not inside the view
-- View doesn't care about that type of input
-
-![:img Example of what this tree might look like in graphical form with V0 at the back, 40%](img/pps-geom/picklist.svg)
-
-]
-
----
-# Input Process - Picking only those interested
-
-.left-column40[
-
-<div class="mermaid">
-graph TD
-V0((V0)) --> V1((V1*))
-V0 --> V4((V4*))
-V1 --> V2((V2))
-V1 --> V3((V3*))
-V4 --> V5((V5))
-V4 --> V6((V6*))
-
-class V0,V2,V5 blue
-class V1,V4,V3,V6 bluegreen
-</div>
-]
-
-.footnote[*: denotes the element responds to the event because of position/type]
-
----
-# Input Example - Capture
-
-.left-column40[
-<div class="mermaid">
-graph TD
-V0((V0)) --> V1((V1*))
-V0 --> V4((V4*))
-V1 --> V2((V2))
-V1 --> V3((V3*))
-V4 --> V5((V5))
-V4 --> V6((V6*))
-
-class V0,V2,V5 blue
-class V1,V4,V3,V6 bluegreen
-</div>
-]
-.right-column50[
-Picked Views = {`V3`, `V1`, `V6`, `V4`}
-
-What happens next?
-]
---
-.right-column50[
-- Dispatch starts at the end of the picked `View` object list (`V4`)
-- Walking down the list, dispatch asks: will you consume this event?
-  - If `true`: the event is consumed and the event propagation __stops__
-  - If `false`: Move to the next element in the `View` list
-]
----
-# Input Example - Capture
-
-.left-column40[
-<div class="mermaid">
-graph TD
-V0((V0)) --> V1((V1*))
-V0 --> V4((V4*))
-V1 --> V2((V2))
-V1 --> V3((V3*))
-V4 --> V5((V5))
-V4 --> V6((V6*))
-
-class V0,V2,V5 blue
-class V1,V4,V3,V6 bluegreen
-</div>
-]
-.right-column50[
-Picked Views = {`V3`, `V1`, `V6`, `V4`}
-
-- Dispatch starts at the end of the picked `View` object list (`V4`)
-- Android backtracks through the list, asking if they want to consume the event
-- Does this correspond to a top-down or bottom-up dispatch strategy?
-- What happens when we reach the last `View` in the list and no one has consumed the event?
-]
-???
-It's top-down
-
----
-# Input Example - Bubbling
-
-.left-column40[
-<div class="mermaid">
-graph TD
-V0((V0)) --> V1((V1*))
-V0 --> V4((V4*))
-V1 --> V2((V2))
-V1 --> V3((V3*))
-V4 --> V5((V5))
-V4 --> V6((V6*))
-
-class V0,V2,V5 blue
-class V1,V4,V3,V6 bluegreen
-</div>
-]
-.right-column50[
-Picked Views = {`V3`, `V1`, `V6`, `V4`}
-]
-
---
-.right-column50[
-- Android starts at the front of the list `V3`, asking if they want to consume the event
-- Does this correspond to a top-down or bottom-up dispatch strategy?
-
-Note: Bubbling in this case is not the bubble-out in the theoretical case.
-]
-
-???
-bottom-up!
----
-# Input Example - Recap
-
-.left-column40[
-<div class="mermaid">
-graph TD
-V0((V0)) --> V1((V1*))
-V0 --> V4((V4*))
-V1 --> V2((V2))
-V1 --> V3((V3*))
-V4 --> V5((V5))
-V4 --> V6((V6*))
-
-class V0,V2,V5 blue
-class V1,V4,V3,V6 bluegreen
-</div>
-]
-.right-column50[
-|State           |Ordering         |
-|:---------------|:----------------|
-|*Picking*       | V3| V1 | V6 | V4|
-|*Capture Order* | 4 | 3  | 2  | 1 |
-|*Bubbling Order*| 1 | 2  | 3  | 4 |
-]
-
----
-# Stuff to ponder: How would you handle input in a circular component?
-???
-Consumption is based on the bounding box...
---
-
-Delivery is based on bounding box
-
-Return `false` if input is outside circle even if it's in the bounding box
-
----
-# Stuff to ponder: How would you handle focus input?
-
-- Some event types are focus based (e.g. keyboard input)
-- Just skip picking: Focus list is globally created, and we walk it the same way
-
----
-# Stuff to ponder: Implementing Drag and Drop
-
-Focus? Or Positional?
-
---
-[Android's tutorial is positional](https://developer.android.com/training/gestures/scale#java)
-
-
----
-# How does *Android* decide where to send events?
-
-- **Capture** (most things don’t) top to bottom deliver to target
-   object (bottom)
-   - example: `onInterceptTouchEvent()` in Android
-- **Pick** to identify objects of interest (or just focus())
-   - `buildTouchDispatchChildList()` in Android; happens only after capture!
-- **Bubble** (bottom to top)
-   - example: `onTouchEvent()` in Android
-- Invoke callback (wait until complete)
-  - we do this by creating a custom listener in Android
-
-.footnote[fascinating to look at [implementation in
-ViewGroup](https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewGroup.java)
--- not very general!]
-
----
-# Note about event records
-
-- Where
-  - Where is the location of the cursor (x,y position on the screen)
-  - For focus based events, where is often the target
-- Value is anything you might need to know (like whether it's a 1 or 2 finger swipe; or which key was pressed)
-
-Why is this important? For *picking*:
-- When input is positional, *only* interactors whose bounding box includes (x,y) -- where -- are picked
-- When input is focus based, *only* interactors in the focus list are picked. Where isn't used in dispatch
-
-
----
-
-# Creating a new type of listener
-
-Application callbacks can be implemented as custom listeners
-
-
-```java
-// Defines a new named inner interface for listening to an interesting event
-public interface MyListener {
-    void onInterestingEvent(); // can include a parameter
-}
-
-// variable to store the listener in once registered. Could also be a list of
-// listeners that are all called if the callback is triggered.
-protected MyView.MyListener mListener;
-
-public void setMyListener(MyListener mListener) {
-    this.mListener = mListener;  // could also be stored in a list.
-}
-...
-
-// somewhere else in your code, when callback time happens
-public void someMethod() {
-  mListener.onInterestingEvent();
-}
-
-```
----
-
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Using Input to Create Interaction Techniques
-
-## State Machines, PPS, Essential Geometry
-
----
-layout:false
-
-# Interaction Technique
-
-A method for carrying out a specific interactive task
-
-For example: For entering a number in a range you could use...
-
-???
-have the class try to think of examples
---
-- (simulated) slider
-- (simulated) knob
-- type in a number (text edit box)
-
-Each is a different interaction technique
----
-# Example: Specify the end points for a line
-
-Could just specify two endpoints – click, click
-- not good: no affordance
-  - no feedback (/ feedforward)
-
-Better feedback is to use “rubber banding”
-- stretch out the line as you drag
-- at all times, shows where you would end up <br> if you “let go”
-???
-Importance of feedback vs application callback
----
-# Implementing rubber banding
-
-```
-Accept the press for endpoint P1; P2 = P1;
-Draw line P1-P2;
-Repeat
-  Erase line P1-P2;
-  P2 = current_position(); Draw line P1-P2;
-Until release event;
-Act on line input;
-```
-
-???
-Discuss!
-Not event based
-Not in the basic event/redraw loop
-Potentially locks up the system
----
-# Implementing rubber banding
-
-Need to get around this loop <br> absolute min of 5 times / sec
-
-– 10 times better
-
-– more would be better but might block system.
-
-???
-aside -- why 5-10 times per second?
-
----
-# Event driven code
-
-Needs to respond to events as they arrive
-
-Needs to maintain state between events
-
----
-# Solution: State Machine
-
-- State Machines are used to respond to incoming events and allows for us to store state between events.
-- Start state - indicated with incoming arrow
-- End state - indicated with double-layered shape (means "reset to start")
-- Transition States - indicated with single-layered shape
-- Event Arrows - indicated with an arrow between states, represent different actions taken up states.
-
-.left-column40[
-<div class="mermaid">
-graph LR
-S((.)) --> A((A))
-A -- "a" --> B((B))
-B -- "b" --> B
-B -- "b" --> C[C]
-
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-
-
-class S invisible
-class A start
-class C finish
-class B normal
-</div>
-]
---
-.right-column50[
-Is the folowing "accepted" by the above state machine?
-
-- ab
-- abbbbbb
-- aab
-- abbbbba
-]
----
-# Solution: State Machine
-
-- State Machines are used to respond to incoming events and allows for us to store state between events.
-- Start state - indicated with incoming arrow
-- End state - indicated with double-layered shape (means "reset to start")
-- Transition States - indicated with single-layered shape
-- Event Arrows - indicated with an arrow between states, represent different actions taken up states.
-
-
-<div class="mermaid">
-graph LR
-S((.)) --> A((A))
-A -- "Event1/Callback1()" --> B((B))
-B -- "Event2/Callback2()" --> B
-B -- "Event3/Callback3()" --> C[C]
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-
-class S invisible
-class A start
-class C finish
-class B normal
-</div>
-
-
----
-# Propositional Production System (PPS)
-
-- State machine is just the start, stop and interim states with arrows with nothing on them.
-- PPS is a state machine with extra conditions required to fire on the arrows.
-  - ? predicate (Boolean expr) before event, adds extra conditions required to transition
-  - action calls
-- Typical notation
-
-  event : pred ? action
-
-- Example
-
-  MouseUp:inView?Start_Line()
-
-- Finite State Machine (FSM) augmented with guards is Turing complete
-
-
----
-# PPS Example: Rubber Banding
-
-
-.left-column-half[
-Compare to previous implementation:
-
-```
-Accept the press for endpoint P1; P2 = P1;
-Draw line P1-P2;
-Repeat
-  Erase line P1-P2;
-  P2 = current_position(); Draw line P1-P2;
-Until release event;
-Act on line input;
-```
-]
-.right-column-half[
-
-- Determine the Events (triggers)
-
-- Determine the States
-
-- Determine the Actions
-
-- Determine the Queries
-]
----
-# PPS Example: Rubber Banding
-.left-column40[
-Compare to previous implementation:
-
-```
-Accept the press for endpoint P1; P2 = P1;
-Draw line P1-P2;
-Repeat
-  Erase line P1-P2;
-  P2 = current_position(); Draw line P1-P2;
-Until release event;
-Act on line input;
-```
-]
-
-.right-column50[
-
-<div class="mermaid">
-graph TD
-S((.)) --> A((Start))
-A -- "Mouse Down:inView?Start_Line()" --> B((Drawing))
-B -- "Mouse_Move:inView?Update()" --> B
-B -- "Mouse_Release:inView?Finish_Line()" --> C[Finished]
-
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-
-class S invisible
-class A start
-class C finish
-class B normal
-</div>
-
-]
-
----
-# PPS Example: Rubber Banding
-.left-column40[
-
-Reading a state machine: translates input sequence into action!
-- When you are in Start State, and a Mouse Down event arrives, do
-  the action `Start_line()` and go to Drawing State.
-- Update  the line end point position every time the mouse moves.
-- When it releases (Mouse Release event), finish the line (at this
-  stage a callback to the application might be appropriate)
-]
-
-.right-column50[
-
-<div class="mermaid">
-graph TD
-S((.)) --> A((Start))
-A -- "Mouse Down:?inView/Start_Line()" --> B((Drawing))
-B -- "Mouse_Move:?inView/Update()" --> B
-B -- "Mouse_Release:?inView/Finish_Line()" --> C[Finished]
-
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-
-class S invisible
-class A start
-class C finish
-class B normal
-</div>
-
-]
-
-???
-
-How could we provide a better affordance?
-
-Does it matter if we are using a mouse or a touch screen?
-
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Using Essential Geometry as the basis for state
-
----
-layout:false
-
-# Using Essential Geometry as the basis for state
-
-.left-column-half[
-![:img google doc with scrollbar, 80%](img/pps-geom/window.png)
-
-]
-
-.right-column-half[
-- What is the essence (or nature) of this scrollbar? Where can you interact with it?
-]
-
----
-
-# Using Essential Geometry as the basis for state
-
-.left-column-half[
-![:img google doc with scrollbar, 80%](img/pps-geom/window.png)
-
-]
-
-.right-column-half[
-- What is the essence (or nature) of this scrollbar? Where can you interact with it?
-  - on the thumb
-  - inside the scrollbar above the thumb
-  - inside the scrollbar below the thumb
-  - inside up arrow
-  - inside the down arrow
-]
-
---
-.right-column-half[
-- How do we implement a scroll bar like this?
-]
-
----
-# Scrollbar State machine with Essential Geometry
-
-<div class="mermaid">
-graph LR
-S((.)) --> START((START))
-START -- "MouseDown:InThumb?StartScroll()" --> SCROLLING((SCROLLING))
-START -- "MouseClick:InsideAboveThumb?Scrollup()" --> DONE((DONE))
-START -- "MouseClick:InsideBelowThumb?Scrolldown()" --> DONE((DONE))
-SCROLLING -- "MouseMove:updateThumbDocument()" --> SCROLLING
-SCROLLING -- "MouseUp:KeepLocation()" --> DONE
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-linkStyle 4 stroke-width:4px;
-linkStyle 5 stroke-width:4px;
-
-class S invisible
-class START start
-class SCROLLING normal
-class DONE finish
-</div>
-
----
-# Let's try it for a button
-
-.left-column-half[
-Essential geometry is:
-- InsideButton
-- OutsideButton
-
-and methods for
-- `indentButton()` (when button is pressed)
-- `normalButton()` (when button is not pressed)
-- `invokeAction()` (when the user releases in the button)
-- `cancelAction()` (when the user releases outside the button)
-
-]
-
----
-# You should have something like this
-
-.left-column40[
-Essential geometry is:
-- Inside
-- Outside
-
-and methods for
-- `indentButton()` (when button is pressed)
-- `normalButton()` (when button is not pressed)
-- `invokeAction()` (when the user releases in the button)
-- `cancelAction()` (when the user releases outside the button)
-
-]
-.right-column50[
-<div class="mermaid">
-graph TD
-S((.)) --> START((START))
-START -- "DOWN:Inside?indentButton()" --> PRESSED((PRESSED))
-PRESSED -- "MOVE:Outside?normalButton()" --> PRESSED
-PRESSED -- "UP:Outside?cancelAction()" --> END[END]
-PRESSED -- "UP:Inside?invokeAction()" --> END
-PRESSED -- "MOVE:Inside?indentButton()" --> PRESSED
-
-linkStyle 0 stroke-width:2px;
-linkStyle 1 stroke-width:2px;
-linkStyle 2 stroke-width:2px;
-linkStyle 3 stroke-width:2px;
-linkStyle 4 stroke-width:2px;
-linkStyle 5 stroke-width:2px;
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF;
-
-class S invisible
-class START start
-class PRESSED normal
-class END finish
-</div>
-
-]
-
-
----
-# How do we implement this?
-.left-column-half[
-- Implement in `onTouch()` using a switch statement
-- Assume there is an
-`essentialGeometry(MotionEvent event)` method. It returns a enum that tells you what
- part of the geometry you are in for that point.
-- Assume implementations of all the methods
-- Assume a field, `state` which is the current state of the state machine
-- enums `EssentialGeometry` and `State` for comparing against
-]
-.right-column-half[
-
-```java
-@Override
-public boolean onTouch(MotionEvent e) {
-  EssentialGeometry geometry = essentialGeometry(event);
-  switch (state) {
-    case State.START:
-      if (geometry == Geometry.INSIDE && e.getAction() == MotionEvent.ACTION_DOWN) {
-         indentButton();
-         state = State.PRESSED;
-         return true;
-      }
-      break;
-    case PRESSED
-      if (e.getAction() == MotionEvent.ACTION_MOVE) {
-        if (geometry == Geometry.INSIDE) {
-          indentButton();
-    	  } else {
-          normalButton();
-        }
-        return true;
-      }
-      else if (e.getAction() == MotionEvent.ACTION_UP) {
-        state = State.START; // note we don't actually use the END state
-        if (geometry == Geometry.INSIDE) {
-          invokeAction();
-        } else {
-          cancelAction();
-        }
-        return true;
-      }
-      break;
-    default:
-      break;
-  }
-  return false;
-}
-```
-]
-
----
-# Enums
-
-Enums are a group of named constants
-
-- Often used for developing interactions for defining PPS States and Essential Geometry
-- Will be used in ColorPicker and in Menu assignment for interaction *and* for experimental conditions
-- Good code quality: limits choices of what a variable can be.
-
-[Documentation](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)
-
----
-
-.left-column[
-## Harder Button
-
-![:img FB Messenger Animation, 100%](img/pps-geom/messenger-bubble.gif)
-
-]
-.right-column[
-- Determine the Events (triggers)
-
-- Determine the States
-
-- Determine the Queries (essential geometry, context)
-
-- Determine the Actions
-]
-
-???
-What constitutes an “event” varies
-
-- may be just low level events, or
-- higher level (synthesized) events
-- e.g. region-enter, press-inside
-
-What is missing? Query fields
-
----
-.left-column[
-## Facebook Button Solution
-![:img FB Messenger Animation, 100%](img/pps-geom/messenger-bubble.gif)
-]
---
-.right-column[
-
-Press:inside? => highlight(), start_animation(), small, active<br>
-AnimateStep ==> update(), active<br>
-AnimateFinish ==> !small, active<br>
-Release:inside,small => unhighlight(), exit()<br>
-Release:inside,!small => add_to_chat(), small, unhighlight(),
-exit()<br>
-
-__rest is unknowable from this animation__
-
-<div class="mermaid">
-  graph LR
-  S((.)) --> A((Start))
-  A -- "Press:inside?highlight(),start_animation()" --> B((Active))
-  B -- "AnimateStep,update()" --> B
-  B -- "AnimateFinish,!small"--> B
-  B -- "Release,inside:small, unhighlight" -->D(End)
-  B -- "Release,inside:!small,add_to_chat(),unhighlight()" --> D
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:2px;
-linkStyle 1 stroke-width:2px;
-linkStyle 2 stroke-width:2px;
-linkStyle 3 stroke-width:2px;
-linkStyle 4 stroke-width:2px;
-linkStyle 5 stroke-width:2px;
-
-class S invisible
-class A start
-class D finish
-class B normal
-</div>
-
-]
-
----
-# When to use PPSs
-
-You're probably already using them, just not intentionally (and maybe
-less well as a result)
-
-PPSs are a good way to do control flow in event driven systems
-
-Can do (formal or informal) analysis
-- are all possible inputs (e.g. errors) handled from each state
-- what are next legal inputs: can use to enable / disable
-
-Can be automated based on higher level specification
-
----
-
-# Summary
-
-State machines are very good (for this job) but do have limits
-
-State machines don't handle independent actions very well (state explosion)
-
-Mostly useful for smaller things
-
-- Great for individual components
-- Not so great for whole dialogs
-
-Path of least resistance is rigid sequencing
- Ask: is this good for what I am doing?
-
-???
diff --git a/slides/wk05/review.html b/slides/wk05/review.html
deleted file mode 100644
index 5b3d4aec65b5d57848e6124173f0793014f2e771..0000000000000000000000000000000000000000
--- a/slides/wk05/review.html
+++ /dev/null
@@ -1,222 +0,0 @@
----
-layout: presentation
-title: The whole toolkit
-description: Review of what we know about GUI toolkits
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Review slides to help studying
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout:false
-
-.left-column[
-## And Introduced Model View Controller
-]
-.right-column[
-Model
-- Model of a single interactor: Typically a field
-- Application model
- - Separate from view model
- - Typically more persistent (*e.g.,* a database)
-
-View
-- `onDraw()` in a single interactor
-- Interactor hierarchy in an application
-
-Controller
-- state machine in a single interactor
-- callbacks (*e.g.,* custom listeners) in an application
-]
-???
-Different for Interactor and Application
-
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface, 100%](img/whole/callbacks.png)]
-.right-column-half[
-Dispatch Strategies
-- Positional (Bottom-first and top-down)
-- Focus-based
-
-State Machine describes *within-view* response to events
-]
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface and a do_action() call
-happening below the line in response to a button_pressed(), 100%](img/whole/callbacks2.png)]
-.right-column-half[
-Callbacks handle *application* response to events
-- Update Application Model
-
-]
-
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface with do_action() replaced
-with an actionListener, 100%](img/whole/callbacks3.png)]
-.right-column-half[
-Callbacks handle *application* response to events
-- Update Application Model
-- Best implemented using custom listeners
-
-]
----
-# Value of component abstraction
-
-Each component knows how to draw itself
-
-Based on what it is and its internal state
-
-Includes some common properties (inherited from a base class for all components), E.g.
-
-- position (x,y relative to parent)
-- size (w,h)
-- visible
-- Enabled
-
-Typically includes some specialized properties (declared in
-subclass)
-
----
-# More Output/Drawing Concepts
-
-Drawing primitives – populate a pixel array (*Frame Buffer*)
-
-Coordinate transformations (translate/scale/rotate/shear) & Clipping
-
-Fonts: Archaic origins, Non standardized
-- UI toolkit implications?
-
----
-.left-column[
-## Input/Event Concepts
-]
-.right-column[
-Devices
-
-- Logical: Valuator, Locator, Button, etc
-- Event vs. sampled devices
-- Absolute vs. Relative (and clutched)
-
-Event model to unify event and sampled devices
-- What
-- When
-- Where
-- Value
-- Context
-]
----
-# Review: None-core concepts
----
-layout:false
-
-# How an animation is set up
-
-Need the start and end value of the properties to be
-modified. Typically use a
-[Path](https://developer.android.com/reference/android/graphics/Path)
-for this.
-
-Need a *duration* (total time in ms for the animation)
-
-Need the *pacing function* for animation. Can explore subclasses of
-[Interpolator](https://developer.android.com/reference/android/view/animation/Interpolator)
-(or make your own!) for this
-
----
-.left-column[
-## Example pacing functions
-![:img Picture of for types of interpolation functions provided with
-android, 100%](img/whole/interpolators.gif)
-]
-.right-column[
-<br><br><br><br>
-Slow in slow out (Accelerate/decelerate)
-
-Slow in (Accelerate)
-
-Anticipate (back up slightly, then accelerate)
-
-Anticipate Overshoot (same, then go too far and slow down)
-]
----
-name: inverse
-layout: true
-class: center, middle, inverse
-
-# Understanding People
----
-layout:false
-
-# HSV
-
-RGB matches the eye (rods & cones, red green and blue)
-
-HSV is much better for *people*
-- Hue: Dominant wavelength of light
-- Saturation: Purity (how much white/black mixed in)
-- Value: Luminance or amount of light in color = max(R,G,B)
-
----
-.left-column[
-## Example Short Answer Exam Question
-![:img Darker and lighter red boxes, 80%](img/whole/redcomp.png)
-![:img Red with varying saturation (to white) and value (to black), 80%](img/whole/value-sat.png)
-
-]
-.right-column[
-# Compare the following colors using HSV
-Which is correct?
-
-- A: Top color has different *hue* than bottom color
-- B: Top color has higher *saturation* than bottom color
-- C: Top color has higher *value* than bottom color
-]
-???
-B: Saturation
-
----
-# Know your speeds (order of magnitude is key thing here)
-
-< ~20ms (1/50 sec) discrete images/flashes merge into continuous perception
-
-smooth animation: 24-40  frames per second
-
-< ~100-200ms seems like “instant response”
-- on web a difference of 250 ms can switch people to a competitor
-
-< 1-2 seconds typically “good response time”
-
-More than 10-15 sec is typically “bad response time”
-
----
-# Recap of design tips
-
-- Don't rely on blue for small objects
-- Don't rely on blue for older users
-- Make sure that contrast is high enough
-- Minimize saturated colors
-- Use redundant cues
-- Make things distinct
-- Use small multiples
-- Manage expectations if you can't change response time
-- Replace subtle changes with obvious ones
-- Use well-tested visual grouping strategies
-- Minimize the number of options
-- Rely on recognition rather than recall
diff --git a/slides/wk05/unused-maybe.html b/slides/wk05/unused-maybe.html
deleted file mode 100644
index c18f3c32607cc0f28305f70017f9702f9dcf0663..0000000000000000000000000000000000000000
--- a/slides/wk05/unused-maybe.html
+++ /dev/null
@@ -1,41 +0,0 @@
-
----
-# Summary
-- MVC: Separation of concerns for user interaction
---
-
-- Events: logical input device abstraction
---
-
-- We model everything as events
- - Sampled devices
-   - Handled as “incremental change” events
-   - Each measurable change: a new event with new value
- - Device differences
-   - Handled implicitly by only generating events they can generate
- - Recognition Based Input?
-   - Yes, can generate events for this too
-
-
-
-
-
-# End of Deck
-
-
----
-# Input __Dispatch__ Process
-
-Input Thread
-
-Dispatch thread
-
-Components:
-- Components have to listen for events (callbacks)
-- How do components respond?
-
-???
-- remind them that component/view/interactor are interchangeable in
-  this class
-- Update application state if appropriate
-- Request repaint if needed
diff --git a/slides/wk05/whole-toolkit.html b/slides/wk05/whole-toolkit.html
deleted file mode 100644
index 5d8aab6772e809f3b8cdda521d80b10121f02ac9..0000000000000000000000000000000000000000
--- a/slides/wk05/whole-toolkit.html
+++ /dev/null
@@ -1,459 +0,0 @@
----
-layout: presentation
-title: The whole toolkit
-description: Review of what we know about GUI toolkits
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# The whole toolkit
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout:false
-
-[//]: # (Outline Slide)
-# Today's goals
-
-- Update from Wednesday
-- Last bit about Essential Geometry
-- Let's look at colorpicker
-- Review and summarize core toolkit architecture
-
----
-# Event Dispatch
-
-- Top-down, Bottom-Up, Bubble-out, Focused-based: these are theoretical Event dispatch.
-- Android does it a bit differently.
-- Capture is top-down: start on the in the biggest interactor that contains the event,
- then narrow in on which window actually will use the event
-- Bubbling is bottom-up - start with the window at the front (the last drawn, lowest in the
-interactor tree) - see if the event is consumed by that interactor. If not, go up the tree.
-
----
-# Other comments
-
-- layout varies depending on the specific layout container
-  - ConstraintLayouts don't need multiple passes, it's a top down structure.
-  - LinearLayout is post order for measure (measure the children, who first measure their children)
-  - In general, have to look at implementation to know for sure.
--  `onDraw` is usually pre-order (Intuitively leaf nodes should be 'on top' of parents)
-- *Capture* is rarely used by component developers
-- *Bubbling* is far more common
-- Interface programmers just need to use callbacks, not worry about this stuff
-
----
-# Colorpicker assignment
-
----
-
-.left-column[
-## Have now seen *almost* all the parts of an interface
-]
-.right-column[
-
-Input
-
-- Input models (events)
-- Event dispatch
-- Event handling (state machine)
-- Callbacks to application
-
-Output
-- Interactor Hierarchy design & use
-- Drawing models (`onDraw()`)
-- Layout (`onLayout()` or `XML`)
-- Damage and redraw process
-]
----
-.left-column-half[
-# Core Toolkit Architecture
-
-Wait for *Event*
-
-*Dispatch* may cause change to:
-- interactor state
-- interactor hierarchy
-- application model
-]
-
-???
-What do you need to know though? Mostly only if you are a component developer
-
---
-.right-column-half[
-# Component Developer
-
-Implement event handler (e.g. `onTouch()`)
-
-Handle *Dispatch*
-- Update interactor state & model if needed
-- Notify application if application model should change (with a callback)
-- Call `invalidate()`
-]
-
-???
-What about if you are an app developer? Basically, just use callbacks
-
----
-.left-column-half[
-# Core Toolkit Architecture
-
-If damage do
-- *layout* (may change)
- - position
- - size
-- If damage do *redraw*
-]
-
---
-.right-column-half[
-# Component Developer
-
-- May need to implement `onMeasure()`  and `onLayout()` (if a container)
-- Will always implement `onDraw()` but *never call it* (call `invalidate()` instead)
-]
-
----
-## View Update: .red[Damage/Redraw]
-
-How does the toolkit know what to redraw?
-
-What causes damage?
-???
-concrete example on next slide
----
-.left-column[
-## View Update: .red[Damage/Redraw]
-]
-
-.right-column[
-What should be redrawn?
-
-![:img google doc with scrollbar, 50%](img/whole/window.png)
-]
-
----
-
-.left-column[
-## View Update: .red[Damage/Redraw]
-]
-
-.right-column[
-What should be redrawn?
-
-![:img google doc with scrollbar, 50%](img/whole/window-with-menu.png)
-]
----
-
-.left-column[
-## View Update: .red[Damage/Redraw]
-]
-
-.right-column[
-What should be redrawn?
-
-![:img google doc with scrollbar, 50%](img/whole/combined.png)
-]
-
----
-## View Update: .red[Damage/Redraw]
-
-How does the toolkit know what to redraw?
-
-What causes damage?
-???
-Can you think about other things?
-- Window hidden and re-exposed
-- Resizing
-- redrawing
-
---
-
-<br><br>Naive approach to redraw
-
----
-
-## View Update: .red[Damage/Redraw]
-
-
-![:img pic of original screen and changed screen, 72%](img/whole/original-new.png)
-
-
-???
-XXX TODO ADD pic like this using divs?
-
-- Can be slow (redrawing everything unecessary)
-- Can cause flickering
- - double buffering is better,
- - hence the 'Canvas' abstraction or equivalent
- - can then switch which FB is displayed (very fast)
-
----
-## View Update: .red[Damage/Redraw]
-
-![:img pic of original screen and changed screen, 72%](img/whole/original-new.png)
-![:img pic with double buffering included, 70%](img/whole/full-solution-buffering.png)
-
----
-## View Update: .red[Damage/Redraw]
-
-![:img pic of original screen and changed screen, 72%](img/whole/original-new.png)
-![:img pic with double buffering included, 70%](img/whole/full-solution-buffering.png)
-
-**Never** just draw:  Why not?
-
-
-???
-- Update *state*
-- Report *damage* (by calling 'repaint())
-- Wait for *toolkit to request redraw*
- (also works if damage comes from elsewhere)
-- How does it generalize to any cause of damage (always need state!!)
-
----
-## View Update: .red[Damage/Redraw]
-
-How does the toolkit know what to redraw?
- - Let the component report: Damage/Redraw invoked by `invalidate()` or equivalent
-
-
----
-## View Update: .red[Damage/Redraw]
-
-How does the toolkit know what to redraw?
-- Let the component report (`invalidate()`) **NOTE** we are *not* calling *onDraw()* directly (important for your assignment)
-- Aggregate
-- Usually calculate bounding box
-
-
----
-## View Update: .red[Draw/Redraw]
-
-Virtual device abstraction provided by windowing system
-
-Component abstraction provided by toolkit
-- Enforced using clipping
-- Supported using coordinate system transformations
-
-
-Drawing is recursive
-- Makes it possible for parent to *decorate* kids
-- Parent responsible for making kids think they are the center of the universe (translate)
-- Clipping: intersect parent and child, also handled by parent
-
-???
-
-Allows each program to (mostly) pretend that it has the screen (frame
-buffer) to itself
-
-Allows each component to (mostly) pretend that it has the screen to
-itself
-
-
----
-# Core Toolkit Architecture
-
-If damage do
-- *layout* (may change)
- - position
- - size
-- If damage do *redraw*
- - Union of damage (any of those can cause it) used to trigger redraw of anything inside that union
- - Drawing + clipping – standard drawing order, but only for things damaged; clipped to damage region
- - Clear damage
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Using Essential Geometry as the basis for state
-
----
-layout:false
-
-# Using Essential Geometry as the basis for state
-
-.left-column-half[
-![:img google doc with scrollbar, 80%](img/pps-geom/window.png)
-
-]
-
-.right-column-half[
-- What is the essence (or nature) of this scrollbar? Where can you interact with it?
-]
-
----
-
-# Using Essential Geometry as the basis for state
-
-.left-column-half[
-![:img google doc with scrollbar, 80%](img/pps-geom/window.png)
-
-]
-
-.right-column-half[
-- What is the essence (or nature) of this scrollbar? Where can you interact with it?
-  - on the thumb
-  - inside the scrollbar above the thumb
-  - inside the scrollbar below the thumb
-  - inside up arrow
-  - inside the down arrow
-]
-
---
-.right-column-half[
-- How do we implement a scroll bar like this?
-]
-
----
-# Scrollbar State machine with Essential Geometry
-
-<div class="mermaid">
-graph LR
-S((.)) --> START((START))
-START -- "MouseDown:InThumb?StartScroll()" --> SCROLLING((SCROLLING))
-START -- "MouseClick:InsideAboveThumb?Scrollup()" --> DONE((DONE))
-START -- "MouseClick:InsideBelowThumb?Scrolldown()" --> DONE((DONE))
-SCROLLING -- "MouseMove:updateThumbDocument()" --> SCROLLING
-SCROLLING -- "MouseUp:KeepLocation()" --> DONE
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-linkStyle 4 stroke-width:4px;
-linkStyle 5 stroke-width:4px;
-
-class S invisible
-class START start
-class SCROLLING normal
-class DONE finish
-</div>
-
----
-# Let's try it for a button
-
-.left-column-half[
-Essential geometry is:
-- InsideButton
-- OutsideButton
-
-and methods for
-- `indentButton()` (when button is pressed)
-- `normalButton()` (when button is not pressed)
-- `invokeAction()` (when the user releases in the button)
-- `cancelAction()` (when the user releases outside the button)
-
-]
-
----
-# You should have something like this
-
-.left-column40[
-Essential geometry is:
-- Inside
-- Outside
-
-and methods for
-- `indentButton()` (when button is pressed)
-- `normalButton()` (when button is not pressed)
-- `invokeAction()` (when the user releases in the button)
-- `cancelAction()` (when the user releases outside the button)
-
-]
-.right-column50[
-<div class="mermaid">
-graph TD
-S((.)) --> START((START))
-START -- "DOWN:Inside?indentButton()" --> PRESSED((PRESSED))
-PRESSED -- "MOVE:Outside?normalButton()" --> PRESSED
-PRESSED -- "UP:Outside?cancelAction()" --> END[END]
-PRESSED -- "UP:Inside?invokeAction()" --> END
-PRESSED -- "MOVE:Inside?indentButton()" --> PRESSED
-
-linkStyle 0 stroke-width:2px;
-linkStyle 1 stroke-width:2px;
-linkStyle 2 stroke-width:2px;
-linkStyle 3 stroke-width:2px;
-linkStyle 4 stroke-width:2px;
-linkStyle 5 stroke-width:2px;
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF;
-
-class S invisible
-class START start
-class PRESSED normal
-class END finish
-</div>
-
-]
-
-
----
-# How do we implement this?
-.left-column-half[
-- Implement in `onTouch()` using a switch statement
-- Assume there is an
-`essentialGeometry(MotionEvent event)` method. It returns a enum that tells you what
- part of the geometry you are in for that point.
-- Assume implementations of all the methods
-- Assume a field, `state` which is the current state of the state machine
-- enums `EssentialGeometry` and `State` for comparing against
-]
-.right-column-half[
-
-```java
-@Override
-public boolean onTouch(MotionEvent e) {
-  EssentialGeometry geometry = essentialGeometry(event);
-  switch (state) {
-    case State.START:
-      if (geometry == Geometry.INSIDE && e.getAction() == MotionEvent.ACTION_DOWN) {
-         indentButton();
-         state = State.PRESSED;
-         return true;
-      }
-      break;
-    case PRESSED
-      if (e.getAction() == MotionEvent.ACTION_MOVE) {
-        if (geometry == Geometry.INSIDE) {
-          indentButton();
-    	  } else {
-          normalButton();
-        }
-        return true;
-      }
-      else if (e.getAction() == MotionEvent.ACTION_UP) {
-        state = State.START; // note we don't actually use the END state
-        if (geometry == Geometry.INSIDE) {
-          invokeAction();
-        } else {
-          cancelAction();
-        }
-        return true;
-      }
-      break;
-    default:
-      break;
-  }
-  return false;
-}
-```
-]
-
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# END OF DECK
diff --git a/slides/wk06/3dprinting.html b/slides/wk06/3dprinting.html
deleted file mode 100644
index fca37938858c5569c6bcf5068884ed03be27ccf4..0000000000000000000000000000000000000000
--- a/slides/wk06/3dprinting.html
+++ /dev/null
@@ -1,613 +0,0 @@
----
-layout: presentation
-title: Intro to 3D printing
-description: Description of 3D printing value on mobile phones
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Intro to 3D Printing and Physical Computing
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout:false
-
-[//]: # (Outline Slide)
-.title[Today's goals]
-.body[
-- Reminders
-  - Start on ColorPicker if you have not already
-  - Practice quiz on Accessibility/ColorPicker out on Friday - due 5/13
-  - Examlet on Accessibility/ColorPicker on Friday 5/15
-- IMPORTANT
-  - We need you to fill out
-  [this form](https://docs.google.com/forms/d/e/1FAIpQLSdQrpZx-gexgDcKEF1SRp4egObimDP9qqVwLD56w0V2sYJDpw/viewform) so we can plan for our next assignment.
-- Discuss different types of 3D models
-- Talk about how 3D printing works
-- Talk about how 3D models are converted into low level g-code
-]
-
-
-
----
-# Story time...
-
-.left-column40[
-![:img 1997 green subaru station wagon](img/3dprinting/subaru.png)
-]
-
---
-.right-column50[
-<br><br>
-![:img subaru station wagon dome light, 70%](img/3dprinting/subaru-light.png) &nbsp; &nbsp;![:img subaru station wagon dome light switch, 20%](img/3dprinting/subaru-switch.png)
-
-]
-
----
-# Traditional Manufacturing
-
-<div class="mermaid">
-graph LR
-A(Materials) --> B(Factory)
-B --> D(Shipping)
-D --> E(Storage)
-E --> F(Shipping)
-F --> G(You)
-
-classDef blue font-size:14pt;
-classDef green font-size:14pt;
-
-class B,D,E,F blue
-class A,G green
-</div>
-
----
-.left-column[
-# Legacy ... literally
-
-]
-.right-column[
-![:img used part sale for a 1997 subaru legacy dome light, 45%](img/3dprinting/subaru-legacy-part.png)
-
-]
----
-# It worked!
-
-![:img 1997 green subaru station wagon](img/3dprinting/subaru-switch-replaced.png) &nbsp;&nbsp;
-![:img 1997 green subaru station wagon](img/3dprinting/subaru-switch-replaced-on.png)
-
-
-
----
-# The future (is Here)
-<br>
-<div class="mermaid">
-graph LR
-A(3D Modeling, <br> e.g. OpenSCAD) -->|Prepare| B(Geometry <br> e.g. .stl file)
-B -->|Slice| D(Printer instructions<br>G-code file)
-D -->|Printer| E(Printed Object)
-
-class A,B,D blue
-class E green
-</div>
-
-- __Prepare__ for printing
-- __Slice__ the model
-- __Printer__ Controller
-
----
-# Prepare for Printing
-
-- Create a model using any one of a number of 3D modeling packages such as Sketchup, Open SCAD,
-Rhino 3d, Meshmixer, Blender, OnShape, Minecraft, SolidWorks
-  - Some packages reprsent 3D objects as solids, others as shells and boundaries.
-- Or you can find lots of stuff in repositories, like [Thingiverse](http://www.thingiverse.com/)
-
-
-.left-column50[
-__Solids__ (image from [Wikipedia](https://en.wikipedia.org/wiki/Constructive_solid_geometry ))
-
-![:img example of what solid modeling looks like, 40%](img/3dprinting/solid-modeling.png)
-]
-
-.right-column50[
-__Shells/Boundaries__
-
-![:img A 2D nurb plane, 45%](img/3dprinting/shells.png)
-![:img A 3d scan of a male with long hair, 30%](img/3dprinting/bust.png)
-]
-
----
-# .stl File
-
-Almost every software package can save the files as a `.stl` file (stereolithography)
-
-.left-column50[
-
-![:img open cube modeled as with surfaces, 45%](img/3dprinting/cube-shell.png)
-![:img open cube as stl file, 45%](img/3dprinting/cube-stl.png)
-
-]
-.right-column50[
-```
-solid OBJECT
-  facet normal 0 -1 0
-    outer loop
-      vertex 10 -10 0
-      vertex 0 -10 10
-      vertex 0 -10 0
-    endloop
-  endfacet
-  facet normal 0 -1 0
-    outer loop
-      vertex 0 -10 10
-      vertex 10 -10 20
-      vertex 8 -10 20
-    endloop
-  endfacet
-```
-]
-
----
-# Printer Controller
-
-The printer controller converts the `.stl` file into GCode, commands read by the printer
-
-
-.left-column50[
-```
-solid OBJECT
-  facet normal 0 -1 0
-    outer loop
-      vertex 10 -10 0
-      vertex 0 -10 10
-      vertex 0 -10 0
-    endloop
-  endfacet
-  facet normal 0 -1 0
-    outer loop
-      vertex 0 -10 10
-      vertex 10 -10 20
-      vertex 8 -10 20
-    endloop
-  endfacet
-```
-]
-
---
-.right-column50[
-
-![:img colorful magician, 50%](img/3dprinting/magician.png)
-
-]
----
-# Printer Controller
-
-The printer controller converts the `.stl` file into GCode, commands read by the printer
-
-
-.left-column50[
-```
-solid OBJECT
-  facet normal 0 -1 0
-    outer loop
-      vertex 10 -10 0
-      vertex 0 -10 10
-      vertex 0 -10 0
-    endloop
-  endfacet
-  facet normal 0 -1 0
-    outer loop
-      vertex 0 -10 10
-      vertex 10 -10 20
-      vertex 8 -10 20
-    endloop
-  endfacet
-```
-]
-
-.right-column50[
-```
-G1 X-5.87 Y-12.69 Z0.47 F3360.0
-G1 F1200.0
-G1 E1.0
-G1 F3360.0
-M101
-G1 X-5.87 Y12.69 Z0.47 F381.198 E5.799
-G1 X-2.93 Y12.69 Z0.47 F381.198 E6.354
-G1 X-2.93 Y-12.69 Z0.47 F381.198 E11.152
-G1 X0.0 Y-12.69 Z0.47 F381.198 E11.707
-G1 X0.0 Y12.69 Z0.47 F381.198 E16.506
-G1 X2.93 Y12.69 Z0.47 F381.198 E17.06
-G1 X2.93 Y-12.69 Z0.47 F381.198 E21.859
-G1 X5.87 Y-12.69 Z0.47 F381.198 E22.414
-G1 X5.87 Y12.69 Z0.47 F381.198 E27.213
-G1 X8.8 Y12.69 Z0.47 F381.198 E27.768
-
-```
-]
-
----
-# Results
-![:img small grey 3D printed box](img/3dprinting/grey-box.png)
-
-
-
----
-# What do new fabrication technologies provide?
-
-.left-column50[
-New ways to create
-- Faster, easier, sometimes better
-
-New ways to customize
-- Faster iteration
-- Mass customization
-
-New materials
-
-New shapes
-]
-
---
-.right-column50[
-Magic arms
-
-![:youtube Video of child using a 3D printed hand, WoZ2BgPVtA0]
-
-]
-
----
-# What new fabrication technologies are not
-
-Not the startrek replicator
-
-Not as fast as the best manufacturing solutions for bulk manufacturing
-
-Not as fast as your 2d printer
-
-Often expensive
-
-Material range is limited
-
----
-# Additive Vs Subtractive Printing
-
-.left-column50[
-- Additive printing puts down material, building up the object layer by layer
-  - Some are done with extruded plastic or other material
-  - Others are done with powders that are sealed together (powder printers)
-- Subtractive removes materials from around the object
-]
-
-.right-column50[
-![:img three 3D printed lion heads two are subtractive printing one is additive, 80%](img/3dprinting/add-subtract.png)
-
-]
-
-
----
-# Additive Fused Deposition Modeling (FDM)
-
-.left-column50[
-![:img examples of failed additive prints, 100%](img/3dprinting/additive.png)
-
-]
-.right-column50[
-<br>
-![:youtube Time lapse video explaining 3D printing, m_QhY1aABsE]
-
-]
-
----
-# Powder printing (@0:28)
-<br>
-![:youtube Time lapse video of powder printing, kBHsfNDsbCs?t=28]
-
----
-# Liquid printing (@0:23)
-<br>
-![:youtube Time lapse video liquid printing, l3TgmvV2ElQ?t=23]
-
----
-# Laser Sintering (@0:53)
-<br>
-![:youtube Time lapse video laser sintering, 9E5MfBAV_tA?t=53]
-
----
-# Other Materials
-
-- [Lisa Harouni Talk](https://www.ted.com/talks/lisa_harouni_a_primer_on_3d_printing#t-120717) (@2:12)
-- [Powder printer](https://youtu.be/kBHsfNDsbCs?t=29s)
-- [Liquid Based additive printers](https://www.popsci.com/new-liquid-based-3d-printer-takes-minutes-not-hours/) (@1:07)
-- [Candy](https://www.youtube.com/watch?time_continue=5&v=rU6RAM0Wrck&feature=emb_logo),
-[Chocolate](http://youtu.be/BIFi8but3Vw) other [Confections](https://www.youtube.com/watch?v=U3TmrCzVZ6w)
-- [Pancake bot](https://www.youtube.com/watch?v=f3Q8nbtRNT0)
-- Cement for houses [old](https://www.youtube.com/watch?v=WzmCnzA7hnE), [new](https://www.youtube.com/watch?v=8zt_3Gs1ksg)
-- [MIT’s glass printer](https://gizmodo.com/watching-mits-glass-3d-printer-is-absolutely-mesmerizin-1725433454)
-- [Ceramics](https://www.youtube.com/watch?v=1JjaqKUUMMw) (with sound vibrations), [Sample art](https://www.foransuon.com/)
-
----
-# More reasons to learn about it!
-
-.left-column50[
-3d Printed car
-
-![:youtube Video of car being 3D printed, daioWlkH7ZI]
-
-]
-.right-column50[
-<br>
-- [3D Printed Medical Device Saves Baby's Life](https://www.youtube.com/watch?v=zr0HGCZSgE4)
-- [Prosthetic hand](http://youtu.be/CHPuMCshkLU?t=42s) (up to ~2:10)
-- [Lots of examples quickly](https://www.youtube.com/watch?v=X5AZzOw7FwA)
-- [3D printers print ten houses in 24 hours](https://www.youtube.com/watch?v=SObzNdyRTBs)
-- [Printed body parts](http://youtu.be/jSjW-EgKOhk?t=1m8s)
-- [Printed organs](https://www.youtube.com/watch?v=4nqw1yjyKEs)
-- [3D printed pizza](http://youtu.be/dvjqmMfMU7w?t=15s)
-- [3D printed fashion](http://youtu.be/63Xozzh_uHM)
-- [3D Printing a Garden Sprinkler](https://www.youtube.com/watch?v=y9XRD3P2G-E)
-]
-
-
----
-# Printing: Beyond plastic
-
-.left-column50[
-![:img Model for embedding a nut and bolt in a print, 50%](img/3dprinting/embedding.png)
-![:img Fabric taped down and embedded, 70%](img/3dprinting/fabric.png)
-![:img Fabric attached through holes, 50%](img/3dprinting/fabric2.png)
-
-]
-
-.right-column50[
-![:img Shorey designs embedded metal, 40%](img/3dprinting/metal-embed.jpg)&nbsp;&nbsp;
-![:img Shorey designs dragon scales, 40%](https://images.squarespace-cdn.com/content/v1/5cf88c7cc74fa800012045db/1559817320037-GI8H3Y56L8W087DD9CDG/ke17ZwdGBToddI8pDm48kLxnK526YWAH1qleWz-y7AFZw-zPPgdn4jUwVcJE1ZvWEtT5uBSRWt4vQZAgTJucoTqqXjS3CfNDSuuf31e0tVH-2yKxPTYak0SCdSGNKw8A2bnS_B4YtvNSBisDMT-TGt1lH3P2bFZvTItROhWrBJ0/aaezgif.com-video-to-gif.gif?format=1000w)
-
-[Shorey Designs](https://www.shoreydesigns.com/3d-printing-on-fabric)
-
-]
----
-# What else to embed?
-
-.left-column-half[
-![:img Picture of tendon that can be used to bend something, 80%](img/3dprinting/tendon1.png)
-![:img Picture of tendon that has been used to bend something, 80%](img/3dprinting/tendon2.png)
-]
-.right-column-half[
-![:youtube Examples of embedded fabric, 9xqze9csLmY]
-]
-???
-- String or wire (like a tendon)
-
----
-# What else to print?
-
-![:img Gears, 20%](img/3dprinting/gear.png) ![:img Timing wheel, 20%](img/3dprinting/wheel.png) ![:img String Drive Wheel, 20%](img/3dprinting/stringdrive.png)
-
----
-# What not to print
-
-- Food handling articles (unless on a special printer)
-- Safety critical strong things
-- High heat tolerance things
-- Things for chemically harsh environments
-
----
-# How does printing enhance a mobile phone?
-
-.left-column-half[
-[Etch a Sketch!](https://www.thingiverse.com/thing:3251892)
-
-![:youtube Mobile phone case to use the phone like an etch a sketch, dcaErURbyIA]
-]
-
---
-.right-column-half[
-New ways of interacting!
-- Works by combining condutive plastic with custom interactor
-- Looks like touch input to the software
-- Gears control motion options mechanically
-]
----
-# How does printing enhance a mobile phone?
-.left-column-half[
-[Phone trigger buttons](https://www.thingiverse.com/thing:2960274)
-![:youtube Game playing hardware --trigger buttons--,X_C1Qxjg2WI]
-]
-.right-column-half[
-New ways of interacting!
-- Similar approach, also conductive
-]
-
----
-# How does printing enhance a mobile phone?
-.left-column-half[
-XiaoyiZhang, TracyTran, YuqianSun, IanCulhane, ShobhitJain, JamesFogarty, JenniferMankoff: [Interactiles: 3D Printed Tactile Interfaces to Enhance Mobile Touchscreen Accessibility](https://make4all.org/portfolio/interactiles/). ASSETS 2018
-
-![:img A picture of a mobile phone with a tangible scrollbar and number pad built into its case to help improve blind interaction with the phone,40% ](img/3dprinting/interactiles.png)
-]
-
-.right-column-half[
-New ways of interacting!
-- Silicon & sewn conductive thread
-- Nuts and bolts
-]
----
-# How does printing enhance a mobile phone?
-.left-column-half[
-
-Acoustruments
-![:youtube Printed objects whose use can be sensed, C2d1pB1qlvA]
-]
-.right-column-half[
-New ways of interacting!
-- Leverages the phone's microphone
-- Uses flexible plastic with holes
-- Requires machine learning
-]
----
-# How does printing enhance a mobile phone?
-.left-column-half[
-Tactile map for the blind
-
-![:img An interactive map with 6 black conductive touchpoints. The map
-is held in a case with 6 conductive buttons that houses a Samsung Note
-2 with a 5.5-inch screen., 40%](img/3dprinting/tactile-map.png)
-]
-.right-column-half[
-New ways of interacting!
-
-Phone as embedded computer
-- Better solution because reprinting a map is faster than making a whole new portable map for each region
-- Similar to new interaction techniques, uses conductive plastic
-]
-
----
-# Use your phone to control general hardware
-
-[IOIO](https://learn.sparkfun.com/tutorials/ioio-otg-hookup-guide) /
-[IOIO wiki](https://github.com/ytai/ioio/wiki)
-
-![:img a development board specially designed to allow developers to add advanced hardware I/O capabilities to their Android or PC application. It features a PIC microcontroller,which acts like a bridge that connects an app on your PC or Android device to low-level peripherals. An app-level library helps you write control code for these low level peripherals in the same way you’d write any other Java app!](img/3dprinting/ioio.jpg)
-
-
----
-# How does printing enhance a mobile phone?
-.left-column-half[
-![:img (a) 3D printed smartphone adaptor designed for the Samsung
-Galaxy Note II with a black ABS dark box comprising slots for
-droppers. (b) 3D printed cartridge composed of a white ABS piece
-comprising 4 wells and BL substrate reservoirs and a black sliding lid
-with transparent ABS windows. (c) The assembled smartphone-based
-device with running the specifically designed application for BL
-signal acquisition and analysis., 60%](img/3dprinting/biotoxicity.jpg)
-
-Many similar options -- e.g. [Ph
-Meter](https://ieeexplore.ieee.org/abstract/document/6916991);
-[Sensing sweat
-make-up](https://pubs.rsc.org/en/content/articlehtml/2014/an/c4an01612b);
-[Nanosensing by
-Nasa](https://www.nasa.gov/centers/ames/news/features/2009/cell_phone_sensors.html)
-[more examples](https://www.sciencedirect.com/science/article/pii/S0167779914000572)
-]
-.right-column-half[
-New ways of interacting
-
-Phone as embedded computer
-
-New ways of sensing
-
-- [Biotoxicity
-sensing](https://www.sciencedirect.com/science/article/pii/S0925400515305992)
-- Dark box
-- Phone case
-]
-
-???
- By clicking the “start” button (b) the application runs and several
-  tabs can be selected (c). The “Procedure” box (d) provide to the
-  user the instructions to perform the assay, then the Begin button
-  allow to proceed to the “Checklist” box (e) where preset timers
-  guide the user through the correct incubation times before BL image
-  acquisition. The instructions can be also eluded by selecting “Test
-  sample” in the home page, which jumps the user directly to the
-  checklist. At the end of the countdown the smartphone camera is
-  activated and the user can simply touch the “Acquire” button to
-  capture the BL image of both the test and control wells. (f) The
-  acquired images are rapidly analyzed on the smartphone and the
-  sample toxicity result is displayed as “Cell viability” value and a
-  warning message (Safe, Harmful, Highly toxic). BL image and results
-  can be also saved for downstream application (i.e. sending results
-  to a central laboratory).
-
----
-# How does printing enhance a mobile phone?
-
-.left-column50[
-[Phone for potentiostatic
-control](https://ieeexplore.ieee.org/abstract/document/6916991)
-
-![:img Arrangement used for mobile phone based ECL sensing. The audio
-jack supplies the potential to the paper microfluidic sensor while the
-resultant emission is detected by the camera in video mode. Both the
-excitation and detection processes are controlled by a software
-application which can also transmit the results via e-mail. The black
-plastic sleeve surrounding the top of the phone holds the sensor
-adjacent to the camera and blocks ambient light., 40%](img/3dprinting/potentiometric.jpg)
- ]
-.right-column50[
-New ways of interacting
-
-Phone as embedded computer
-
-New ways of sensing
-- exploits ability to play sounds
-- serves basic functions of a potentiostat in controlling an applied
- potential to oxidise ECL-active molecules
-- resultant photonic signal is monitored using the camera in video
- mode.
-- combined with paper microfluidic sensors
-
-]
-???
-
-The audio jack supplies the potential to the paper microfluidic
-sensor, while the resultant emission is detected by the camera in
-video mode. Both the excitation and detection processes are controlled
-by a software application which can also transmit the results via
-e-mail. The black plastic sleeve surrounding the top of the phone
-holds the sensor adjacent to the camera and blocks ambient light.
-
----
-# How does printing enhance a mobile phone?
-
-.left-column50[
-Printed Analytics
-![:youtube Printed objects whose use can be sensed, W1V2AgDbgTQ]
-]
-.right-column-half[
-New ways of interacting
-
-Phone as embedded computer
-
-New ways of sensing
-- uses backscatter technology
-- works in range of a modified wireless router
-]
-
----
-# Summary: What does physical computing offer us?
-
-.left-column-half[
-New ways to interact
-- capacitive sensing facilitate by conductive plastic/thread
-- microphone + machine learning
-
-New ways to sense information
-- fluid properties
-- audio
-- backscatter
-]
-.right-column-half[
-New ways to combine devices (e.g. through bluetooth sensing of physical hardware)
-
-Benefits:
-- modify a device beyond what the manufacturer expected
-- apid prototyping of novel solutions
-]
---
-# END OF DECK
----
-# Moon House Video
-
-![:youtube Video of a robot 3d printing a round house, 8zt_3Gs1ksg]
-
----
-# Accessible Game Control
-
-![:youtube Xbox adaptive controller intro, 9fcK19CAjWM]
diff --git a/slides/wk06/context.html b/slides/wk06/context.html
deleted file mode 100644
index c21f4f1a884b76392b763dbd6a281c727954a1bc..0000000000000000000000000000000000000000
--- a/slides/wk06/context.html
+++ /dev/null
@@ -1,847 +0,0 @@
----
-layout: presentation
-title: The Physical Phone --Week 8, Monday--
-description: What we know about the physical use and abilities of a phone
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-background-image: url(img/context/people-background.png)
-# The Physical Phone
-
-Jennifer Mankoff
-
-CSE 340 {{site.quarter}}
----
-layout: false
-
-[//]: # (Outline Slide)
-.left-column[# Today's goals]
-.right-column[
-- Talk about myths about phone use
-- Talk about what a phone can sense
-]
----
-.title[Interface Structure]
-.body[
-
-<div class="mermaid">
-graph TD
-
-I(Input) --Explicit Interaction--> A(Application)
-A --> Act(Action)
-
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-
-class U,C,A,I,S,E,Act,Act2 normal
-</div>
-]
----
-.title[Context Aware Computing Interface Structure]
-.body[
-
-<div class="mermaid">
-graph TD
-
-I(Input) --Explicit Interaction--> A(Application)
-A --> Act(Action)
-
-U(User) --Implicit Sensing--> C(Context-Aware Application)
-S(System) --Implicit Sensing--> C
-E(Environment) --Implicit Sensing--> C
-C --> Act2(Action)
-
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-
-class U,C,A,I,S,E,Act,Act2 normal
-</div>
-]
----
-# Example: COVID-19 Contact Tracing
-
-.left-column-half[
-![:img Picture of a COVID-19 contact tracing app showing motivational text like Join the fight and Get motivated if you come into contact with COVID-19, 100%](img/context/contact-tracing.jpg)
-]
-.right-column-half[
-- Install an app on your phone
-- Turn on bluetooth
-- Keep track of every bluetooth ID you see
-]
-
----
-.left-column[
-![:img Picture of a COVID-19 contact tracing app showing motivational text like Join the fight and Get motivated if you come into contact with COVID-19, 100%](img/context/contact-tracing.jpg)
-]
-.right-column[
-## Context Awareness is about *Human Activity*
-- Useful, and necessary, input to context-aware systems
-- Easier and easier to collect information about human activity
-]
-
-.footnote[[Image credit](https://www.techherd.co/iot-mobile-threats/) ]
-
-???
-Improved software and inferencing
-
-Improved sensors
----
-.left-column[
-## Computational Behavioral Imaging
-]
-.right-column[
-![:img Picture of X-ray scan of body, 30%](img/context/imaging.png)
-]
----
-.left-column[
-## Computational Behavioral Imaging
-]
-.right-column[
-![:img Picture of X-ray scan of body, 30%](img/context/imaging.png)
-![:img Picture of a COVID-19 contact tracing app showing motivational text like Join the fight and Get motivated if you come into contact with COVID-19, 35%](img/context/contact-tracing.jpg)
-]
----
-.left-column[
-## Computational Behavioral Imaging
-]
-.right-column[
-![:img Picture of X-ray scan of body, 30%](img/context/imaging.png) ![:img Internet of things devices, 50%](img/context/IoT.png)
-]
----
-.left-column[
-![:img Smartphone, 100%](img/context/phone.png)
-]
-.right-column[
-## Phones
-
-People already carry them
-
-Capture many aspects of behavior
-- Interactions with information: virtual
-- Social engagement: social
-- Loads of sensors: physical
-]
-
----
-.left-column[
-## Assumptions
-]
-.right-column[
-We have made a number of .red.bold[WRONG] assumptions about:
-- what smartphones are
-- how they are used
-]
-
----
-.left-column[
-## Assumption #1: We all have smart phones
-
-![:img Picture of a bunch of phones (some outdated), 100%](img/context/phones.png)
-]
-.right-column[
-What is a smart phone?
-]
-???
-What do you think?
----
-.left-column[
-## Assumption #1: We all have smart phones
-![:img Picture of a bunch of phones (some outdated), 100%](img/context/phones.png)
-
-]
-.right-column[
-What is a smart phone?
-- Runs a complete mobile OS
-- Offers computing ability and connectivity
-- Includes sensors
-]
----
-
-# Types of Sensors
-
-.left-column-half[
-
-- Not just touches: clicks, key presses
-
-| | | |
-|--|--|--|
-|Accelerometer | Rotation | Screen|
-|Applications | Location | Telephony|
-|Battery | Magnetometer | Temperature|
-|Bluetooth | Network Usage | Traffic|
-|Calls | Orientation | WiFi|
-|Messaging | Pressure | Processor|
-|Gravity | Proximity | Humidity |
-|Gyroscope | Light |  ... Many More |
-]
-.right-column-half[
-Other Kinds of Sensors:
-
-- Microphone
-
-- Camera
-
-- Multi-touch
-
-- Connected Devices?
-
-]
-
-???
-Sampled or event based?
----
-# Which Sensors might be useful for contact tracing? Why?
-.left-column-half[
-
-microphone/camera/multi-touch/IOT PLUS
-
-| | | |
-|--|--|--|
-|Accelerometer | Rotation | Screen|
-|Applications | Location | Telephony|
-|Battery | Magnetometer | Temperature|
-|Bluetooth | Network Usage | Traffic|
-|Calls | Orientation | WiFi|
-|Messaging | Pressure | Processor|
-|Gravity | Proximity | Humidity |
-|Gyroscope | Light |  ... Many More |
-]
-.right-column-half[
-Type your answers in chat!
-]
----
-
-# How do you program with sensors?
-
-  - `Managers` (e.g. `LocationManager`) let us create and register a listener
-
-  - Listeners can receive updates at different intervals, etc.
-
-  - Some Sensor-specific settings
-    [https://source.android.com/devices/sensors/sensor-types.html](https://source.android.com/devices/sensors/sensor-types.html)
-
----
-# Implementing Sensing
-
-Android [Awareness API](https://developers.google.com/awareness/)
-.left-column-half[
-## Turn it on
-
-Must enable it: [Google APIs](https://console.developers.google.com/apis/)
-
-Recent updates to documentation (from 2017): February 2020!
-]
-
-.right-column-half[
-## Set up callbacks
-
-Two types of context sensing: Snapshots/ Fences
-]
-???
-
----
-# Snapshots
-
-Capture sensor data at a moment in time
-
-Require a single callback, to avoid hanging while sensor data is fetched:
-
-`onSnapshot(Response response)`
-
-Seting up the callback  (just like callbacks for other events)
-
-``` java
-setSnapshotListener(Awareness.getSnapshotClient(this).getDetectedActivity(),
-                    new ActivitySnapshotListener(mUpdate, mResources));
-```
-
----
-# Fences
-
-Notify you *every time* a condition is true
-
-Conditional data
-
-3 callbacks: during, starting, stopping
-
-```java
-mActivityFenceListener = new ActivityFenceListener(
-                // during
-                DetectedActivityFence.during(DetectedActivity.WALKING),
-                // starting
-                DetectedActivityFence.starting(DetectedActivity.WALKING),
-                // stopping
-                DetectedActivityFence.stopping(DetectedActivity.WALKING),
-                this, this, mUpdate);
-```
-
-???
-What might we use for a location fence?
-Headphone fence?
-...
-
----
-# Snapshots vs Fences for contact tracing
-
-.left-column40[
-<iframe src="https://embed.polleverywhere.com/multiple_choice_polls/mdDbVMvvYnDCcu3ugYWzh?controls=none&short_poll=true" width="800" height="600" frameBorder="0"></iframe>
-
-]
---
-.right-column30[
-Answer: Fence
-
-We want to be notified about *every* contact so we can record it
-]
-
----
-# Using Context-Awareness in Apps
-.left-column[
-![:img Picture of a mobile phone with a text message on screen containing a transcription of recent audio, 100%](img/context/scribe4me.jpeg)
-]
-.right-column[
-
-Capture and Access:
-- .red[Food diarying] and nutritional awareness via receipt analysis [Ubicomp 2002]
-- .bold.red[Audio Accessibility] for deaf people by supporting mobile
-sound transcription [Ubicomp 2006, CHI 2007]
-- .red[Citizen Science] volunteer data collection in the field [CSCW
-  2013, CHI
-  2015]
-- .red[Air quality assessment] and visualization [CHI 2013]
-- .red[Coordinating between patients and doctors] via wearable
-  sensing of in-home physical therapy [CHI 2014]
-]
----
-# What might we do with today's phones?
-.left-column[
-![:img Picture of a mobile phone with an unlock gesture that also labels emails for keeping or discarding, 100%](img/context/proactive.png)
-]
-.right-column[
-
-## Adaptive Services (changing operation or timing)
-
-- .red[Adaptive Text Prediction] for assistive communication devices
-  [TOCHI 2005]
-- .red[Location prediction] based on prior behavior [Ubicomp 2014]
-- .bold.red[Pro-active task access] on lock screen based on predicted user
-  interest [MobileHCI 2014]
-]
----
-# What might we do with today's phones?
-.left-column[
-![:img example interaction above and on the surface of a phone supported by adding a depth camera to the front of the phone -- shows
-interacting with text, 80%](img/context/airtouch.jpg)
-
-![:img example interaction above and on the surface of a phone supported by adding a depth camera to the front of the phone -- shows interacting with an image, 80%](img/context/airtouch2.jpg)
-]
-.right-column[
-## Novel Interaction
-
-- .red[Cord Input] for interacting with mobile devices  [CHI 2010]
-- .red[Smart Watch Intent to Interact] via twist'n'knock gesture [GI
-  2016]
-- .red[VR Intent to Interact] vi sensing body pose, gaze and gesture
-  [CHI 2017]
-- .red[Around Body interaction] through gestures with the phone
-  [Mobile HCI 2014]
-- .red.bold[Around phone interaction] through gestures combining on and
-  above phone surface [UIST 2014]
-
-]
----
-# What might we do with today's phones?
-.left-column[
-![:img example interaction above and on the surface of a phone supported by adding a depth camera to the front of the phone -- shows
-interacting with text, 80%](img/context/airtouch.jpg)
-
-![:img example interaction above and on the surface of a phone supported by adding a depth camera to the front of the phone -- shows interacting with an image, 80%](img/context/airtouch2.jpg)
-]
-.right-column[
-![:youtube Interweaving touch and in-air gestures using in-air
-gestures to segment touch gestures, H5niZW6ZhTk]
-]
-
----
-# What might we do with today's phones?
-.left-column[
-![:img Picture of an interface for simulating driving behavior providing feedback to the user about aggressive driving, 100%](img/context/driving.png)
-
-]
-.right-column[
-
-## Behavioral Imaging
-
-- .red[Detecting and Generating Safe Driving Behavior] by using
-inverse reinforcement learning to create human routine models [CHI 2016,
-2017]
-- .red[Detecting Deviations in Family Routines] such as being late to
-pick up kids [CHI 2016]
-]
----
-# What might we do with today's phones?
-
-.left-column[
-![:img The Momento desktop platform (D) and server (S) communicate with clients (C) via SMS/MMS; HTTP; or the Context Toolkit, 100%](img/context/momento.png)
-
-]
-.right-column[
-## General Solutions for Data Collection and Response
-
-- .red[General solution for studying people in the wild] via mobile
-sensing and interaction [CHI 2007]
-- .red[Minimizing user burden] for generating adaptive services via
-  test-time feature ordering [Ubicomp 2016]
-]
-
----
-
-<iframe src="https://embed.polleverywhere.com/multiple_choice_polls/pgjVCzFsgUO4RT0yWQJLF?controls=none&short_poll=true" width="800" height="600" frameBorder="0"></iframe>
-
----
-# Revisiting Assumption #1: We all have smart phones
-
-.left-column[
-![:img Picture of a bunch of phones (some outdated), 100%](img/context/phones.png)
-
-]
-.right-column[
-Does this seem like a smart phone?
-
-No, it just more input devices
-
-You have to do all the work
-]
-
---
-.corner-ribbon.brtl[All Marketing]
----
-background-image: url(img/context/phones-background.png)
-# Dumb (Feature) Phones
-
-We live in a time of dumb phones
-
-Know almost nothing about me
-
-Explicit preferences
-
-Contacts
-
-Running applications
-
-Hardly knows when I’m mobile/fixed, charging/not charging
-
-Doesn’t know me or what I’m doing
-
---
-.corner-ribbon.purple.tlbr[WHY NOT SMARTER???]
----
-# Research Goal: A real smartphone!
-.left-column[
-![:img Smartphone, 100%](img/context/phone.png)
-]
-.right-column[
-Want to build a smart phone that
-
-Collects and learns a model of human behavior with every interaction
-
-From the moment the phone is purchased and turned on
-
-Uses behavior information to improve interaction and the user experience
-
-Do this opportunistically
-
-- Your noise is my signal!
-- Big Data of 1
-]
-???
-How close are we to this?
-
-- Amazing amounts of computation at hand
-- Memory and storage
-- Radios and communication
-- Sensors
-- Software
----
-# Assumption #2: Proximity is standard
-
-We assume that users have their phones with them and turned on 24-7
-
-Which is great for things like health apps and behavior modeling
-- Mobile phone is personal and travels with the user
-- Proxy for user context
-- Proxy for user’s environment context
-- Proxy for user’s attention/display device
-- Provide always-available service
-
----
-# Assumption #2: Proximity is standard
-
-## How much of the day is your phone on?
-
-Average user: 78-81% [Dey, 2011]
-
-- One-fifth of the time, phone is off
-- Can’t sense anything
-- Can’t show anything to the user
-
----
-<iframe src="https://embed.polleverywhere.com/multiple_choice_polls/eB1wjPW8LGqgpi9X1mhQS?controls=none&short_poll=true" width="800" height="600" frameBorder="0"></iframe>
----
-
-# Where is your phone right now?
-.left-column-half[
-
-![:img Picture of person holding a phone to their head,10%](img/context/armsreach.png)  Arms Reach
-
-![:img Picture of person in a room with a phone,20%](img/context/roomsreach.png) Same Room
-
-![:img Picture of person near a house with a phone,20%](img/context/AWAY.png) Further
-
-Off
-]
-.right-column-half[
-
-]
-
----
-# When your phone is on, where is it?
-.left-column[
-![:img Picture of person holding a phone to their head,20%](img/context/armsreach.png)
-
-![:img Picture of person in a room with a phone,50%](img/context/roomsreach.png)
-
-![:img Picture of person near a house with a phone,50%](img/context/AWAY.png)
-]
-.right-column[
-- Within arm’s reach (53%)
-- Within the same room (35%)
-- Further away? (12%)
-
-![Bar plot showing 53% within arm’s reach; 35% same room; 12% further away, 100%
-](img/context/phonedist.png)
-]
----
-# Assumption #2: Proximity is standard
-
-.left-column-half[
-## Challenges for interpreting phone data:
-
-***Can't use the phone as a proxy for the user***
-
-It's off about 20% of the time
-
-It's not in the same roomabout 12% of the time
-
-]
---
-.left-column-half[
-***How do we implement contact tracing given this?***
-]
-
----
-# Assumption #2: Proximity is standard
-
-.left-column-half[
-## Challenges for interpreting phone data:
-
-***Can't use the phone as a proxy for the user***
-
-It's off about 20% of the time
-
-It's not in the same roomabout 12% of the time
-
-***How do we implement contact tracing given this?***
-]
-.right-column-half[
-## May need complementary sensors
-
-Smart watch
-
-Fitbit
-
-Room level sensing
- ]
----
-.left-column[
-## Assumption #3: Usage is Notification Driven
-![:img People at a dinner table paying attention to their phones instead of eachother, 100%](img/context/dinner.png)
-]
-.right-column[
-What do we know about how people use their mobile devices?
-
-- “Always on the phone!”
-- “Notifications are ruining my life!”
-
-]
----
-# Characterizing Usage: Glance
-
-.left-column-half[
-![:img Picture of different kinds of usage including glance; review; engage; and phone calls showing that almost all include glancing at the lock screen while others also include the home screen (almost all) and applicaion usage also includes app-specific stuff, 100%](img/context/usage.png)
-]
-.right-column-half[
-![:youtube Glancing at a phone without engaging, 4pXLqDZCFwo]
-]
-
-.footnote[Based on 1 months data from 10 participants]
----
-# Characterizing Usage: Review
-
-.left-column-half[
-![:img Picture of different kinds of usage including glance; review; engage; and phone calls showing that almost all include glancing at the lock screen while others also include the home screen (almost all) and applicaion usage also includes app-specific stuff, 100%](img/context/usage.png)
-]
-.right-column-half[
-![:youtube Reviewing on a phone, vsPkU8fHp-c]
-]
-
-.footnote[Based on 1 months data from 10 participants]
----
-# Characterizing Usage: Engage
-
-.left-column-half[
-![:img Picture of different kinds of usage including glance; review; engage; and phone calls showing that almost all include glancing at the lock screen while others also include the home screen (almost all) and applicaion usage also includes app-specific stuff, 100%](img/context/usage.png)
-]
-.right-column-half[
-![:youtube Reviewing on a phone, NCwj3__BFxQ]
-]
-
-.footnote[Based on 1 months data from 10 participants]
----
-# Characterizing Usage
-
-.left-column-half[
-![:img Histograph of percentage of total device use sessions by
-session duration showing that most sessions are lock screen only and
-less than 60 seconds long, 100%](img/context/usage2.png)
-]
-.right-column-half[
-95% of sessions shorter than 5 minutes; most < 60 secs
-
-Notifications lead to engagement… only 25% of the time!
-
-Self-interruption therefore more common than we would think
-
-Notifications prevent unnecessary engages
-
-No good support for reviews
-]
----
-.left-column[
-## Opportunity: Leverage real knowledge about phone use
-![:img People at a dinner table paying attention to their phones instead of eachother, 100%](img/context/dinner.png)
-]
-.right-column[
-Engage people when appropriate
-
-Avoid interrupting when not
-
-Make short interactions more powerful
-
-]
----
-.left-column[
-![:img Picture of a mobile phone with an unlock gesture that also labels emails for keeping or discarding, 100%](img/context/proactive.png)
-]
-.right-column[
-## Example: pro-active tasks
-
-Provide access to email management, etc right on lock screen
-
-]
----
-.left-column[
-![:img Picture of a mobile phone with an unlock gesture that also labels emails for keeping or discarding, 100%](img/context/proactive.png)
-]
-.right-column[
-## Example: pro-active tasks
-
-Provide access to email management, etc right on lock screen
-
-Study of phone use (10 users, 4 weeks)
-
-95% of sessions shorter than 5 minutes; most < 60 secs
-
-No good support for quick task completion (just viewing things)
-]
----
-.left-column[
-## All users
-
-![:img Picture of a graph showing 3 weeks of use going from 15%
-engagement down to 6.4% engagement, 100%](img/context/proactive-results.png)
-]
-
-.right-column[
-## Results
-
-25 participants
-- 10 nonusers (4% of lockscreen views with a task or less per week)
-- 9 regular users (5-10% of lockscreen views with a task per week)
-- 5 power users (40-60% of lockscreen views!)
-]
-???
-regular users  mostly used the tasks when they had some down time, or
-when bored or nothing better to do.
-
-power users who applied actions to email in more than 1/3 of sessions
-when tasks were present on their lock screen.
-
----
-.left-column[
-## Cleaners
-
-![:img Picture of a graph showing 3 weeks of use going from 39%
-engagement down to 22% and then back up to 50% engagement, 100%](img/context/cleaneruser.png)
-]
-.right-column[
-## Results
-
-25 participants
-- 10 nonusers (4% of lockscreen views with a task or less per week)
-- 9 regular users (5-10% of lockscreen views with a task per week)
-- 5 power users (40-60% of lockscreen views!)
-- 3 'cleaners'
-]
-???
-We also found a special kind of power users called cleaners. They rarely had any unread emails in their inbox and used ProactiveTasks to keep their inbox clear of any unwanted emails.
-
----
-.left-column[
-## Assumption #4: Need is Necessary
-![:img People at a dinner table paying attention to their phones instead of eachother, 100%](img/context/dinner.png)
-]
-.right-column[
-
-.quote[When asked which device or platform they would not be able to
-live without, a majority (65%) chose iPhone, while only a few (1%)
-[...mentioned] facebook. Nearly 15% ...
-]
-]
----
-.left-column[
-## Assumption #4: Need is Necessary
-![:img People at a dinner table paying attention to their phones instead of eachother, 100%](img/context/dinner.png)
-]
-.right-column[
-
-.quote[When asked which device or platform they would not be able to
-live without, a majority (65%) chose iPhone, while only a few (1%)
-[...mentioned] facebook. Nearly 40% ...  .red[said they'd rather give up their laptop
-than go for even a weekend without their iPhone]
-]
-]
-
----
-.left-column[
-## Assumption #4: Need is Necessary
-![:img People at a dinner table paying attention to their phones instead of eachother, 100%](img/context/dinner.png)
-]
-.right-column[
-![:img barplot showing percentage of people would keep their smart
-phone over game console (72%); tablet computer (69%); Dishwasher
-(46%); Laptop computer (40%); TV (32%); Fridge (13%); and care (8%),
-60%](img/context/phone-compare.png)
-]
----
-.left-column[
-## Assumption #4: Need is Necessary
-
-## Should we combat this? How?
-
-]
-.right-column[
-
-[Hinicker](https://www.alexishiniker.com/) (works at UW):
-- Can devices teach self-regulation, rather than trying to regulate children?
-- Why do people compulsively check their phones? Can they change this?
-
-[Burke](http://thoughtcrumbs.com/) (works at Facebook):
-- [Watching silly cat videos is good for
-  you](https://www.wsj.com/articles/why-watching-silly-cat-videos-is-good-for-you-1475602097)
-- [Online social life good for your
-  longevity](https://www.nytimes.com/2016/11/01/science/facebook-longer-life.html)
-   ... but [The Relationship Between Facebook Use and Well-Being
-  Depends on Communication Type and Tie
-  Strength](https://academic.oup.com/jcmc/article/21/4/265/4161784)
-
-
-
-]
----
-.left-column[
-## Assumptions
-
-- Assumption #1: Phones are smart
-- Assumption #2: Proximity is standard
-- Assumption #3: Usage is notification driven
-- Assumption #4: Need is necessary
-]
-
-.right-column[
-By removing assumptions, we can recast:
-
-- the notion of what a smart phone is
-- how we can use them to improve people’s lives
-- how to leverage make (personalized) meaning from (your) big data
-]
-???
----
-# Do you think COVID-19 has challenged the validaty of any of these assumptions?
-
-.left-column[
-## Assumptions
-
-- Assumption #1: Phones are smart
-- Assumption #2: Proximity is standard
-- Assumption #3: Usage is notification driven
-- Assumption #4: Need is necessary
-]
-
-.right-column[
-<iframe src="https://embed.polleverywhere.com/multiple_choice_polls/Omnf3hdr8zaHvaGCTpemV?controls=none&short_poll=true" width="800" height="600" frameBorder="0"></iframe>
-]
-???
-
----
-.title[Challenges to this vision]
-.body[
-
-- Battery
-- Raw sensors not behavior data
-- Not the sensors we always want
-- Computational complexity
-- Latency in communication
-- Basic software framework to support apps that can adapt to user behavior
-- Apps that drive innovation
-- How people use phones
-]
-
----
-
-# End of Deck
-
----
----
-# Places
-
-Shows you what is nearby
-
-```java
-//In MainActivity:
-setSnapshotListener(Awareness.getSnapshotClient(this).getPlaces(),
-                    new PlacesSnapshotListener(mUpdate, mResources)));
-
-//In PlacesSnapshotListener
-public void onSnapshot(PlacesResponse response) {
-        List<PlaceLikelihood> placeLikelihood = response.getPlaceLikelihoods();
-        if (placeLikelihood != null && !placeLikelihood.isEmpty()) {
-            for (PlaceLikelihood likelihood : placeLikelihood) {
-                addPlace(likelihood.getPlace().getName().toString(), likelihood.getLikelihood());
-            }
-        }
-
-        mUpdate.prependText(placeLikelihood.toString());
-    }
-```
diff --git a/slides/wk06/img/3dprinting/add-subtract.png b/slides/wk06/img/3dprinting/add-subtract.png
deleted file mode 100644
index 6f5b26318d7eef422a90eb445d73cd709a0ad5d5..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/add-subtract.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/additive.png b/slides/wk06/img/3dprinting/additive.png
deleted file mode 100644
index 9c184ca2202e52685fbb1b60c10e089079fa39c4..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/additive.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/biotoxicity.jpg b/slides/wk06/img/3dprinting/biotoxicity.jpg
deleted file mode 100644
index 3c6ed987d21d9a11d7697ba9c64348262c1094bb..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/biotoxicity.jpg and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/bridge-overhang.png b/slides/wk06/img/3dprinting/bridge-overhang.png
deleted file mode 100644
index af254bfc6dc3c8f8528a07c3a77b322d8c3807a6..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/bridge-overhang.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/bridge.png b/slides/wk06/img/3dprinting/bridge.png
deleted file mode 100644
index db7f1d3f5cf02b0e74a22955309e0262ca720562..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/bridge.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/bust.png b/slides/wk06/img/3dprinting/bust.png
deleted file mode 100644
index 4c4ae6d28f2290d297b2a9f2752f617896bade9a..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/bust.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/cube-shell.png b/slides/wk06/img/3dprinting/cube-shell.png
deleted file mode 100644
index 6644e896fe81d890f86cd2cdb325379b20ba6138..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/cube-shell.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/cube-stl.png b/slides/wk06/img/3dprinting/cube-stl.png
deleted file mode 100644
index 2144fa59e8f9f57b2b1b4c846a5ec1447858bcca..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/cube-stl.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/embedding.png b/slides/wk06/img/3dprinting/embedding.png
deleted file mode 100644
index 5b94cfe7fb597578bd1d1be2cbd9c8631730cb4e..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/embedding.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/fabric.png b/slides/wk06/img/3dprinting/fabric.png
deleted file mode 100644
index 7d0bc21fd9085b149aafc40fdb0b3e56ffb55f2d..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/fabric.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/fabric2.png b/slides/wk06/img/3dprinting/fabric2.png
deleted file mode 100644
index 102da43375884c43e33cb2651171fed9df79badd..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/fabric2.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/gear.png b/slides/wk06/img/3dprinting/gear.png
deleted file mode 100644
index 0b3b449368c5bb8b837714458a1df964eb8fa16a..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/gear.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/grey-box.png b/slides/wk06/img/3dprinting/grey-box.png
deleted file mode 100644
index 904cdc8219d7966f0dbeb98bfe340bd8f5b67b99..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/grey-box.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/interactiles.png b/slides/wk06/img/3dprinting/interactiles.png
deleted file mode 100644
index 0d19934e984e9c4e61aef0f7c0c9138bd3ea7bd6..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/interactiles.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/ioio.jpg b/slides/wk06/img/3dprinting/ioio.jpg
deleted file mode 100644
index 3ff69c8a9937bf6c184222b57a5ec17d80401aff..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/ioio.jpg and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/magician.png b/slides/wk06/img/3dprinting/magician.png
deleted file mode 100644
index 6eb9bc0dfe45b89a48c2a2df0ef039b852fad392..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/magician.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/metal-embed.jpg b/slides/wk06/img/3dprinting/metal-embed.jpg
deleted file mode 100644
index 4053fc24a6fab246cd3fd731166058b88251c99e..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/metal-embed.jpg and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/nutbolt.png b/slides/wk06/img/3dprinting/nutbolt.png
deleted file mode 100644
index e86bb2b4fe5fb6940eeb7ecf394c254ccf66dc2f..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/nutbolt.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/overhang.png b/slides/wk06/img/3dprinting/overhang.png
deleted file mode 100644
index 713e58d1c59cb8f4ac1abd5f31d0513d5303ec67..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/overhang.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/phone-sensor.gif b/slides/wk06/img/3dprinting/phone-sensor.gif
deleted file mode 100644
index 418dcb2a5ec1de520e81e135b1ed7889faf78c90..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/phone-sensor.gif and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/potentiometric.jpg b/slides/wk06/img/3dprinting/potentiometric.jpg
deleted file mode 100644
index 1544080a61574922edf3d9943c9dd0e9f1dccd94..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/potentiometric.jpg and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/shells.png b/slides/wk06/img/3dprinting/shells.png
deleted file mode 100644
index 3149f9fe2d45b210d9c8e67e62018fb000c25e7a..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/shells.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/slicing.png b/slides/wk06/img/3dprinting/slicing.png
deleted file mode 100644
index ef83638decfaa0492b23710aa502209c7a0c7e73..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/slicing.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/solid-modeling.png b/slides/wk06/img/3dprinting/solid-modeling.png
deleted file mode 100644
index cb3326c70a5e4643d7442125062c8d1e6608e300..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/solid-modeling.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/stringdrive.png b/slides/wk06/img/3dprinting/stringdrive.png
deleted file mode 100644
index 4cb62f6934901666864e8548e85de906be988561..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/stringdrive.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/subaru-legacy-part.png b/slides/wk06/img/3dprinting/subaru-legacy-part.png
deleted file mode 100644
index 29430ffffff174f26865b9dcdf9cc76da7976098..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/subaru-legacy-part.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/subaru-light.png b/slides/wk06/img/3dprinting/subaru-light.png
deleted file mode 100644
index 5861e18aa8a062d5d2edd544b695a7608498e583..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/subaru-light.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/subaru-switch-iterations.png b/slides/wk06/img/3dprinting/subaru-switch-iterations.png
deleted file mode 100644
index bc285f6be2d46c56483b927d1e989e7bf33c8599..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/subaru-switch-iterations.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/subaru-switch-model.png b/slides/wk06/img/3dprinting/subaru-switch-model.png
deleted file mode 100644
index 5bb1cd88324b8e614af0a7995955fffd33265d97..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/subaru-switch-model.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/subaru-switch-replaced-on.png b/slides/wk06/img/3dprinting/subaru-switch-replaced-on.png
deleted file mode 100644
index dc85bbc0235f95b5ed81539a32713fe2d9f61099..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/subaru-switch-replaced-on.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/subaru-switch-replaced.png b/slides/wk06/img/3dprinting/subaru-switch-replaced.png
deleted file mode 100644
index 0f1d0bc40a06617ec631111d6ab1a33c51c03101..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/subaru-switch-replaced.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/subaru-switch.png b/slides/wk06/img/3dprinting/subaru-switch.png
deleted file mode 100644
index 08001dc1320648cf57a20ef424d736e6626b780d..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/subaru-switch.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/subaru.png b/slides/wk06/img/3dprinting/subaru.png
deleted file mode 100644
index 821622a51b2f3b5603559c2433fd0b80ca46a7f6..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/subaru.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/tactile-map.png b/slides/wk06/img/3dprinting/tactile-map.png
deleted file mode 100644
index 3b1c229976fb0aaf6988914ff6b66e317d07a836..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/tactile-map.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/tendon1.png b/slides/wk06/img/3dprinting/tendon1.png
deleted file mode 100644
index b3ff5353cc4ca3191ab52d7ecba317e3cb23b993..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/tendon1.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/tendon2.png b/slides/wk06/img/3dprinting/tendon2.png
deleted file mode 100644
index 5d9315d5cd919c6de8a08e92c7e7dbb93302cf4b..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/tendon2.png and /dev/null differ
diff --git a/slides/wk06/img/3dprinting/wheel.png b/slides/wk06/img/3dprinting/wheel.png
deleted file mode 100644
index 712f582933956ed5e22501621fc913bd121a41fd..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/3dprinting/wheel.png and /dev/null differ
diff --git a/slides/wk06/img/buttons64dp.png b/slides/wk06/img/buttons64dp.png
deleted file mode 100644
index 691d9215cdec15742198a3e3c43396c8b62d1d04..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/buttons64dp.png and /dev/null differ
diff --git a/slides/wk06/img/buttons80dp.png b/slides/wk06/img/buttons80dp.png
deleted file mode 100644
index 40471bbe182b078f44b2ae52e8ab64a642a4baea..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/buttons80dp.png and /dev/null differ
diff --git a/slides/wk06/img/context/AWAY.png b/slides/wk06/img/context/AWAY.png
deleted file mode 100644
index a4dae68db4b02fe20d03c152abef4b6db8a1eff9..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/AWAY.png and /dev/null differ
diff --git a/slides/wk06/img/context/IoT.png b/slides/wk06/img/context/IoT.png
deleted file mode 100644
index 1c91c492c924bb12030d4722a2bfcd6bbac6fd09..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/IoT.png and /dev/null differ
diff --git a/slides/wk06/img/context/airtouch.jpg b/slides/wk06/img/context/airtouch.jpg
deleted file mode 100644
index 9011cfef75f72996ed1b32a7ddeb12851f7cd9d2..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/airtouch.jpg and /dev/null differ
diff --git a/slides/wk06/img/context/airtouch2.jpg b/slides/wk06/img/context/airtouch2.jpg
deleted file mode 100644
index 1f99e07245b6273cc270a864100675121b7fba37..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/airtouch2.jpg and /dev/null differ
diff --git a/slides/wk06/img/context/armsreach.png b/slides/wk06/img/context/armsreach.png
deleted file mode 100644
index 838c66594b92750af97a4e0631bab3826fa0651c..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/armsreach.png and /dev/null differ
diff --git a/slides/wk06/img/context/cleaneruser.png b/slides/wk06/img/context/cleaneruser.png
deleted file mode 100644
index cb97629f6d0ea7594f7ee64c71c344c6f1ef9469..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/cleaneruser.png and /dev/null differ
diff --git a/slides/wk06/img/context/contact-tracing.jpg b/slides/wk06/img/context/contact-tracing.jpg
deleted file mode 100644
index b43f2d9bded10709c601fd94ca46b47a2af79fe2..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/contact-tracing.jpg and /dev/null differ
diff --git a/slides/wk06/img/context/dinner.png b/slides/wk06/img/context/dinner.png
deleted file mode 100644
index f930464d08d700d56cf93437611ff001b8d2f189..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/dinner.png and /dev/null differ
diff --git a/slides/wk06/img/context/driving.png b/slides/wk06/img/context/driving.png
deleted file mode 100644
index 68c8d71f374bac87964d3252c0255cc38079dcb6..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/driving.png and /dev/null differ
diff --git a/slides/wk06/img/context/engage.png b/slides/wk06/img/context/engage.png
deleted file mode 100644
index 60a7e4e95a9ef146d793165352f1fd2c595ed0c6..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/engage.png and /dev/null differ
diff --git a/slides/wk06/img/context/glance.png b/slides/wk06/img/context/glance.png
deleted file mode 100644
index b16ad77a9d65fd46aca99bcdaf87a5d17c1e0860..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/glance.png and /dev/null differ
diff --git a/slides/wk06/img/context/imaging.png b/slides/wk06/img/context/imaging.png
deleted file mode 100644
index fe6a86ae3ac5363d8e65806be07e26dc405ce6bb..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/imaging.png and /dev/null differ
diff --git a/slides/wk06/img/context/momento.png b/slides/wk06/img/context/momento.png
deleted file mode 100644
index f67ac277b6c40bb28933a2a4fa0e74c29e8aad07..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/momento.png and /dev/null differ
diff --git a/slides/wk06/img/context/nonuser.png b/slides/wk06/img/context/nonuser.png
deleted file mode 100644
index ec5ae26df2dd00a27a28ddcaa8fd347bb17c8211..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/nonuser.png and /dev/null differ
diff --git a/slides/wk06/img/context/people-background.png b/slides/wk06/img/context/people-background.png
deleted file mode 100644
index d22eb0d03a42b0a8d48ef16e9ff7c2119641adb3..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/people-background.png and /dev/null differ
diff --git a/slides/wk06/img/context/phone-compare.png b/slides/wk06/img/context/phone-compare.png
deleted file mode 100644
index 9ebcd8a3ec026d18d7ae24afbc9be33c5f6a3f8f..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/phone-compare.png and /dev/null differ
diff --git a/slides/wk06/img/context/phone.png b/slides/wk06/img/context/phone.png
deleted file mode 100644
index 70dab7055c585ace1ec90a0810a0e41d85cda1a8..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/phone.png and /dev/null differ
diff --git a/slides/wk06/img/context/phonedist.png b/slides/wk06/img/context/phonedist.png
deleted file mode 100644
index 060747e4d1223db055b6a5216e644d236f17a103..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/phonedist.png and /dev/null differ
diff --git a/slides/wk06/img/context/phones-background.png b/slides/wk06/img/context/phones-background.png
deleted file mode 100644
index 995ed4e0f82b4042cd5fc4181940d12e8f5694ce..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/phones-background.png and /dev/null differ
diff --git a/slides/wk06/img/context/phones.png b/slides/wk06/img/context/phones.png
deleted file mode 100644
index 02ebf063e963a10179310823e209c5c21ff160e6..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/phones.png and /dev/null differ
diff --git a/slides/wk06/img/context/poweruser.png b/slides/wk06/img/context/poweruser.png
deleted file mode 100644
index ec5ae26df2dd00a27a28ddcaa8fd347bb17c8211..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/poweruser.png and /dev/null differ
diff --git a/slides/wk06/img/context/proactive-results.png b/slides/wk06/img/context/proactive-results.png
deleted file mode 100644
index f72d4f87c54d6465080c212cff49247d256d9e89..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/proactive-results.png and /dev/null differ
diff --git a/slides/wk06/img/context/proactive.png b/slides/wk06/img/context/proactive.png
deleted file mode 100644
index e029610ac82badc22dd7868951ecce12650638ab..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/proactive.png and /dev/null differ
diff --git a/slides/wk06/img/context/review.png b/slides/wk06/img/context/review.png
deleted file mode 100644
index 04c0113b13ee587f7023f8dbd9a6806b2342df28..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/review.png and /dev/null differ
diff --git a/slides/wk06/img/context/roomsreach.png b/slides/wk06/img/context/roomsreach.png
deleted file mode 100644
index 3f0cd47d1f76d15566870a3461ae185f0366abc5..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/roomsreach.png and /dev/null differ
diff --git a/slides/wk06/img/context/scribe4me.jpeg b/slides/wk06/img/context/scribe4me.jpeg
deleted file mode 100644
index 1f206a2e591bc4af4b4c78311694f21031875264..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/scribe4me.jpeg and /dev/null differ
diff --git a/slides/wk06/img/context/usage.png b/slides/wk06/img/context/usage.png
deleted file mode 100644
index 17ad608616abedceab02535967a24340703b821f..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/usage.png and /dev/null differ
diff --git a/slides/wk06/img/context/usage2.png b/slides/wk06/img/context/usage2.png
deleted file mode 100644
index 7d334162cc4668e80cadb3a891b6ba52dacd546b..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/context/usage2.png and /dev/null differ
diff --git a/slides/wk06/img/pm/body-fitts.png b/slides/wk06/img/pm/body-fitts.png
deleted file mode 100644
index d310a619ce4fee899e78aac5dacbb237a89d5128..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/body-fitts.png and /dev/null differ
diff --git a/slides/wk06/img/pm/bubblekeyboard.mov b/slides/wk06/img/pm/bubblekeyboard.mov
deleted file mode 100644
index f83852db123306ad013c3bc7d7f5da1e2430535a..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/bubblekeyboard.mov and /dev/null differ
diff --git a/slides/wk06/img/pm/buttons.png b/slides/wk06/img/pm/buttons.png
deleted file mode 100644
index 26675f540854d26ee061fb0f9f81a46d9766ca14..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/buttons.png and /dev/null differ
diff --git a/slides/wk06/img/pm/check.png b/slides/wk06/img/pm/check.png
deleted file mode 100644
index 2f14733dd108bcfc41f5a0b773e9b0ed6059d90d..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/check.png and /dev/null differ
diff --git a/slides/wk06/img/pm/common-snapping-cases.png b/slides/wk06/img/pm/common-snapping-cases.png
deleted file mode 100644
index e8382284e1a9d00172908384b357434737a1553b..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/common-snapping-cases.png and /dev/null differ
diff --git a/slides/wk06/img/pm/cursor.png b/slides/wk06/img/pm/cursor.png
deleted file mode 100644
index 38d621bc442c2d815049bc9bf1ed7aa2048b3464..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/cursor.png and /dev/null differ
diff --git a/slides/wk06/img/pm/debugging.png b/slides/wk06/img/pm/debugging.png
deleted file mode 100644
index 9c4134acf8d70b865591c307d5f8d026665b17d2..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/debugging.png and /dev/null differ
diff --git a/slides/wk06/img/pm/dragpop.png b/slides/wk06/img/pm/dragpop.png
deleted file mode 100644
index 015e0aca032107005f5a2662c1bfc361f13d33aa..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/dragpop.png and /dev/null differ
diff --git a/slides/wk06/img/pm/errors.png b/slides/wk06/img/pm/errors.png
deleted file mode 100644
index 80826d598295060fb21eeeeb95f46f79ed472b52..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/errors.png and /dev/null differ
diff --git a/slides/wk06/img/pm/escher.png b/slides/wk06/img/pm/escher.png
deleted file mode 100644
index 0ac5f09e3d238d5d6c1071cd3d6e9e02e4918750..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/escher.png and /dev/null differ
diff --git a/slides/wk06/img/pm/fitts.png b/slides/wk06/img/pm/fitts.png
deleted file mode 100644
index 7b0df624e6613f3dd1f6a38fbf9d6e17e80a5784..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/fitts.png and /dev/null differ
diff --git a/slides/wk06/img/pm/font-selection.png b/slides/wk06/img/pm/font-selection.png
deleted file mode 100644
index 04fa116a613e446c85590d056d154e57b1e05964..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/font-selection.png and /dev/null differ
diff --git a/slides/wk06/img/pm/gmail-snapping.gif b/slides/wk06/img/pm/gmail-snapping.gif
deleted file mode 100644
index 66a17084941a6d03ad02d2dfa7b62446ec755b1d..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/gmail-snapping.gif and /dev/null differ
diff --git a/slides/wk06/img/pm/grab-cursor.png b/slides/wk06/img/pm/grab-cursor.png
deleted file mode 100644
index 69ad61bc226d295712e677589bd0bd6e5ae0f8fe..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/grab-cursor.png and /dev/null differ
diff --git a/slides/wk06/img/pm/hiddensize.png b/slides/wk06/img/pm/hiddensize.png
deleted file mode 100644
index 32c6dd7c59eaa2f87c1e4c29801bca196abcff74..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/hiddensize.png and /dev/null differ
diff --git a/slides/wk06/img/pm/keyboard-mouse.jpg b/slides/wk06/img/pm/keyboard-mouse.jpg
deleted file mode 100644
index 3b9f366194a1832a35fd8c9621dec9bf3eb2958b..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/keyboard-mouse.jpg and /dev/null differ
diff --git a/slides/wk06/img/pm/linear-pie.jpg b/slides/wk06/img/pm/linear-pie.jpg
deleted file mode 100644
index 7b5be577b037ad1996b358bf68265ce8e9171465..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/linear-pie.jpg and /dev/null differ
diff --git a/slides/wk06/img/pm/linear-pie.png b/slides/wk06/img/pm/linear-pie.png
deleted file mode 100644
index 99fa1c9be77105ec9a858423a8bf1bf3f92acba5..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/linear-pie.png and /dev/null differ
diff --git a/slides/wk06/img/pm/mac-expanded.png b/slides/wk06/img/pm/mac-expanded.png
deleted file mode 100644
index a0e0d83d0be9bb0740e8069923da73b1fd25c8eb..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/mac-expanded.png and /dev/null differ
diff --git a/slides/wk06/img/pm/mac-noedge.png b/slides/wk06/img/pm/mac-noedge.png
deleted file mode 100644
index b1c0e0a346e3081e971fda5e4838930f67018f8f..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/mac-noedge.png and /dev/null differ
diff --git a/slides/wk06/img/pm/macvswindows.png b/slides/wk06/img/pm/macvswindows.png
deleted file mode 100644
index 78f6e16b617deec6df270683f2235fa9d37f0ca4..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/macvswindows.png and /dev/null differ
diff --git a/slides/wk06/img/pm/magnification.png b/slides/wk06/img/pm/magnification.png
deleted file mode 100644
index 10228424e733844c88ba076d36f3fc8bdee249bf..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/magnification.png and /dev/null differ
diff --git a/slides/wk06/img/pm/new-zoom-leave.png b/slides/wk06/img/pm/new-zoom-leave.png
deleted file mode 100644
index 4c00cd0546155519467a06cac83f1efb5dca05cc..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/new-zoom-leave.png and /dev/null differ
diff --git a/slides/wk06/img/pm/old-zoom-leave.png b/slides/wk06/img/pm/old-zoom-leave.png
deleted file mode 100644
index 78c133c0e0d3751be92e497c9d6a1cd06f7a3868..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/old-zoom-leave.png and /dev/null differ
diff --git a/slides/wk06/img/pm/old-zoom-leave2.png b/slides/wk06/img/pm/old-zoom-leave2.png
deleted file mode 100644
index be1ba7272ba0bdb898694986e66245149aad7334..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/old-zoom-leave2.png and /dev/null differ
diff --git a/slides/wk06/img/pm/pointer-cursor.png b/slides/wk06/img/pm/pointer-cursor.png
deleted file mode 100644
index 78e12c265671daf592eb68cfcbf6903c63d16191..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/pointer-cursor.png and /dev/null differ
diff --git a/slides/wk06/img/pm/powerpoint-toolbar.png b/slides/wk06/img/pm/powerpoint-toolbar.png
deleted file mode 100644
index ad67beceb109847c530752f3e696a763be9a4436..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/powerpoint-toolbar.png and /dev/null differ
diff --git a/slides/wk06/img/pm/size.png b/slides/wk06/img/pm/size.png
deleted file mode 100644
index f56056be3e8fc5d3b55e2bf2f4845677d899112c..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/size.png and /dev/null differ
diff --git a/slides/wk06/img/pm/size1.png b/slides/wk06/img/pm/size1.png
deleted file mode 100644
index 40da7ad658c54dd0b4a47cd182a7cd089483f9d0..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/size1.png and /dev/null differ
diff --git a/slides/wk06/img/pm/size2.png b/slides/wk06/img/pm/size2.png
deleted file mode 100644
index 6351479cab97a656e0b98d36e141eea51b364358..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/size2.png and /dev/null differ
diff --git a/slides/wk06/img/pm/swype.jpg b/slides/wk06/img/pm/swype.jpg
deleted file mode 100644
index b9ae2648366e5bd4b59aeec898b4316f9c764862..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/swype.jpg and /dev/null differ
diff --git a/slides/wk06/img/pm/timeoverid.png b/slides/wk06/img/pm/timeoverid.png
deleted file mode 100644
index a633d97047b1974ec59e5811c2c768ebac148502..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/timeoverid.png and /dev/null differ
diff --git a/slides/wk06/img/pm/windows-comparison.png b/slides/wk06/img/pm/windows-comparison.png
deleted file mode 100644
index 3dc19639799015d50a9d1152e95e020363c30f2a..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/windows-comparison.png and /dev/null differ
diff --git a/slides/wk06/img/pm/x.png b/slides/wk06/img/pm/x.png
deleted file mode 100644
index 75e39254205b42ab016a06f3381a9a37a799ad20..0000000000000000000000000000000000000000
Binary files a/slides/wk06/img/pm/x.png and /dev/null differ
diff --git a/slides/wk06/people-motor.html b/slides/wk06/people-motor.html
deleted file mode 100644
index 932b22a32c991ae700063e9ce279deb83559b9cb..0000000000000000000000000000000000000000
--- a/slides/wk06/people-motor.html
+++ /dev/null
@@ -1,706 +0,0 @@
----
-layout: presentation
-title: Properties of People II
-description: Deriving Design Principles from Physiology of Motor Control
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Properties of People II: Motor Control & Mental Models
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout: false
-
-# Agenda
-
-- Administrivia
-  - Color Picker is due Monday 5/11 (10pm)
-  - The Accessibility and Color Picker practice quizzes are out.
-  - - **Reminder:** Please fill out this [form](https://docs.google.com/forms/d/e/1FAIpQLSdQrpZx-gexgDcKEF1SRp4egObimDP9qqVwLD56w0V2sYJDpw/viewform) by tonight, so we can plan for our next assignment - Menus.
-- Fitts' Law and implications for interface design
-
----
-
-# Let's try an experiment
-.left-column-half[![:img Image of an interface with a red dot and many grey dots on the left
-and a dialog on right to control randomization and highlight distance
-and width in a Fitts' law experiment., 80%](img/pm/fitts.png)
-]
-.right-column-half[
--  [Fitts' Law Experiment](http://simonwallner.at/ext/fitts/) (simonwallner.at/ext/fitts) Scroll
-   down to just below 'A word of warning'
-- Click the red circles as fast as possible
-]
----
-
-[//]: # (Outline Slide)
-# Today's goals
-
-Experience Fitts' Law
-
-Discuss its implications for design
-
-Introduce Guiard's model of Bi-Manual Control
-
-Discuss its implications for design
----
-.left-column-half[
-# Throughput
-
-![:img Picture of graph of fitts law data collected when I did the
-experiment. Y axis is time and x is index of difficulty (ID). It's fairly
-noisy because fitts law is designed to measure multiple
-people. However it does fit a line., 80%](img/pm/timeoverid.png)
-]
-.right-column-half[
-.jax[$$MT = a + b*log_2({Dist \over Size} + 1)$$
-]
-
-where
-- *MT* is movement time
-- ID is the *Index of Difficulty* (ID, in bits) of a movement
-.jax[$$log_2({Dist \over Size} + 1)$$]
-- *ID/MT* is the *Throughput* of a device in bits/second
-- *a* and *b* are empirically derived constants
-- Note: We will use D for Dist and W for Width throughout the rest of this lecture
-]
-???
-This is just a line
-
-Fitts’ law tells us about difficulty for pointing and selection tasks
-- Time to move the hand depends only on relative precision required
-- MT increases as __distance__ from target increases
-- MT decreases as __size__ of target increases
-- Diagram this
-
----
-# Original Fitts' experiment
-
-.left-column-half[
-![:img Mock up of the original task in Fitt's experiment, 80%](https://upload.wikimedia.org/wikipedia/commons/1/16/Fitts_Task_English.jpg)
-.font-small[[Wikpedia](https://en.wikipedia.org/wiki/Fitts%27s_law)]
-]
-.right-column-half[
-Original experiment from Paul Morris Fitts involved tapping on plates as quickly as possible.
-]
-
----
-
-# Compare Device Performance & Human Performance
-
-.left-column-half[
-![:img Graph of Fitts law lines for various body parts (Neck Arm Wrist
-Finger) with time on the Y axis and bits on the X axis, 100%](img/pm/body-fitts.png)
-
-]
-
-.right-column-half[
-.font-small[
-Device/Part | Study | Throughput (bits/s) | Relative to Optimal
--------|-------|------------ | -----------
-Finger | Langolf (1976) | 38
-Wrist  | Langolf (1976) | 23
-EyeTracker| Ware & Mikaelian (1987) | 13.7 |
-Hand   | Fitts (1954) | 10.6
-Arm    | Langolf (1976) | 9.5
-Xbox 360 | Zaranek (2014) | 5 | **.47** (arm)
-Mouse  | Mackenzie (2001) | 4.9 | .46 (hand)
-Neck      | Pfaff (1985) | 4.2 |
-Trackball | Mackenzie (2001)| 3.0 | .28 (hand)
-Touchpad  | Mackenzie (2001) | 2.9 | .27 (hand)
-Head      | Hansen (2018) | 2.5 | **.51** (neck)
-Gaze      | Hansen (2018) | 2.1 | **.15** (eyetracker)
-Joystick  | Mackenzie (2001)| 1.8 | .17 (hand)
-Playstation Move | Zaranek (2014) | 1.5 | .16 (arm)
-Kinect    | Zaranek (2014) | 1 | .1 (arm)
-]
-]
-.footnote[Card, S. K., Mackinlay, J. D., & Robertson, G. G. (1991). <br>
-A morphological analysis of the design space of input devices. <br> ACM
-Transactions on Information Systems (TOIS), 9(2), 99-122.
-]
-???
-Useful to know if you're designing something like VR
-
-Doesn't have much impact on interface design
-
-Doesn't capture everything; e.g. error rate is higher for eye tracker
-
----
-# Warnings
-
-Applies to *expert, errorless* use
-
-![:img bar chart of Average WPM for error rates of 1% to 20% in a
-study that falsely inserted typing errors is much higher for 1% than
-20%,40%](img/pm/errors.png)
-
-
-.footnote[Error rate was manipulated by faking errors.
-Ahmed Sabbir Arif and Wolfgang Stuerzlinger. CHI 2010. Predicting the cost of error correction in character-based text entry technologies. In Proceedings of the SIGCHI Conference on Human Factors in Computing Systems, April 2010
-]
-
-???
-Axis: X is faked error rates, Y is the words per minute.
-
-Shows how WPM did change in the study where error rate is being changed.
-If you know you are going to make a lot of errors you slow down your motion
-The underlying way we're designed to move is with small motions, to eliminate jerk
-We accelerate and decelerate smoothly
-Trace of motion for different body parts - after the initial motion, which is a rapid aiming motion,
-then corrective motions if you misss the target.
-Lots of those corrections, that is where you are goign to see people slow down.
-Subtle effects here – like the time to fix errors goes up as the error rate goes up…
-Act of correcting an error also takes time.
-Not worry about in the assignment, but interesting to know.
-
----
-# Example: Arm based input
-
-Student project using a Kinect from 2012.
-Watch the movement of his arm...
-
-![:youtube Bubble keyboard implemented by Chinmay N in 2012. Users swipe with their full arm to select letters in on a keyboard, mQ-pCDr3RCw]
-
-
----
-# Discussion: Implications of Fitts' law
-
-In your breakout groups,
-- Discuss: Why are some things harder than others to click on?
-- Add your thoughts on the bullet line with your group number in this [Google Doc](https://docs.google.com/document/d/162SuMVyuVguaTiv7hSyZUbrDhvYZUbXHJLglHvENRbM/edit?usp=sharing)
-- It's helpful if one of you share your screens.
-
-![:img Picture of mac desktop and windows desktop. Of note is the main menu bar which is at the very top of the mac desktop but at the top of *each* window on the windows desktop, 80%](img/pm/macvswindows.png)
-
-???
-Constantly relevant
-
-Intuitively, things that are closer and/or bigger are faster and
-easier to hit (and vice versa)
-
-What is different about the file location in Mac and Windows?
-
-What is the width at the top of the screen.
-
----
-# Design Tip #1: <br>Make small targets larger
-
-![:img Pet Gallery buttons at 64dp](img/buttons64dp.png)&nbsp;&nbsp;![:img Pet Gallery buttons at 80dp](img/buttons80dp.png)
-
-What does this do to Fitts Law Predictions?
---
-- Maximizes Size (W)
-
-Why should you not maximize all of the targets?
-
---
-
-- Fitts' law involves a logrithmic calculation -- exponentially bigger gains for small targets, not so
-much of a gain for larger targets
-
----
-# Design Tip #2:<br> Put commonly used things close together
-
-![:img Screenshot of the powerpoint toolbar with grouped things,100%](img/pm/powerpoint-toolbar.png)
-
-Is this minimizing Distance (D) or maximizing Size (W)? (zoom poll)
----
-
-# Design Tip #2:<br> Put commonly used things close together
-
-.left-column50[
-![:img Image of the drag'n'pop interface which moves icons to the cursor when they are valid targets,80%](img/pm/dragpop.png)
-]
-.right-column50[
-# ... Or bring them closer to  cursor
-
-Is this minimizing Distance (D) or maximizing Size (W)? (zoom poll)
-
-]
-.footnote[
-Baudisch, P., Cutrell, E., Robbins, D., Czerwinski, M., Tandler,
-P. Bederson, B., and Zierlinger, A. Drag-and-Pop and Drag-and-Pick:
-Techniques for Accessing Remote Screen Content on Touch- and
-Pen-operated Systems. In Proceedings of Interact 2003, Zurich
-Switzerland, August 2003, pp. 57-64.
-]
-
-
-???
-Reduces Distance (D)
-
-Not good design to put everything close together
-
-No space to move all targets (contextual filtering helps)
-
-Could do with a fancy container...
-
----
-# Design Tip #2:<br> Put commonly used things close together
-
-.left-column50[
-![:img Image of the drag'n'pop interface which moves icons to the cursor when they are valid targets,80%](img/pm/dragpop.png)
-]
-
-.right-column50[
-
-Minimizes Distance (D) in Fitts Law Predictions
-
-Why not do this to all targets?
-]
---
-.right-column50[
-- Other usability goals matter too -- e.g. grouping related things
-- It is not good design to put everything close together
-- There is not enough space to move all targets (contextual filtering helps)
-
-How would you implement this?
-
-]
-
-
-
----
-# We can make things *Closer* and *Larger* at the same time
-
-![:img Image of mac with doc icons magnified,100%](img/pm/mac-expanded.png)
-
----
-# We're beating Beating Fitts' Law!
-
-How else can we do this?
---
-
-Just don't use a mouse! Shortcut buttons; scroll wheel
-
-Or CHEAT... manipulate the interface
-- Minimize D
-- Increase W
-
----
-
-# Do these menus minimize Distance (D) or maximize Size (W)?
-
-(zoom poll)
-Select from a menu bar at top of screen
-![Picture of the apple menu opened on a mac,80%](img/pm/mac-noedge.png)
-
-???
-Problems?
-
-- Can be tiring to reach edges of *very* large screens
-- Not all interfaces can do this (e.g. web designers)
----
-# Design Tip #3:<br>Make use of Edges: They are Infinite
-
-.right-column[
-![:img Picture of the Windows menu in Windows 95 Windows XP and Windows 8 showing progressive improvement in the relationship between look (namely a border around the icon) and feel (can click anywhere making it an infinitely large button which is easier to hit from a Fitts law perspective), 100%](img/pm/windows-comparison.png)
-]
-
-???
-- Windows 95 bug: bottom-left corner is offset by a few pixels, can’t click on it
-- Windows XP fixes it by making Start button go all the way to the corner
-- Windows 8 uses styling to make start menu circular, but still makes entire corner clickable
----
-# Recent Example (Zoom)
-
-Which of these do you think is a better button for maximizing size using the infinite edge?
-
-.left-column60[
-![:img Old zoom leave button which looks only like text but really is an infinite edge, 30%](img/pm/old-zoom-leave.png)
-]
-.right-column30[
-<br>
-![:img New zoom leave button which looks bigger but loses the infinite edge, 50%](img/pm/new-zoom-leave.png)
-]
-
----
-# Recent Example (Zoom)
-
-Which of these do you think is a better button for maximizing size using the infinite edge?
-
-.left-column60[
-![:img Old zoom leave button which looks only like text but really is an infinite edge, 30%](img/pm/old-zoom-leave.png) &nbsp;&nbsp;
-![:img Old zoom leave button which displays its infinite edge/larger button when hovered over, 30%](img/pm/old-zoom-leave2.png)
-
-Although it looks like only the text is clickable, it turns out the whole edge was. Now we only have a "smaller" but brighter button to click.
-]
-.right-column30[
-<br>
-![:img New zoom leave button which looks bigger but loses the infinite edge, 50%](img/pm/new-zoom-leave.png)
-]
-
-
-
----
-# Does this minimize Distance (D) or maximize Size (W)?
-
-Right click in place and then select (starting at :19)
-
-![:youtube Illustration of advantages of marking menus,dtH9GdFSQaw?start=19]
-
-.footnote[
-Kittenish, G., & Buxton, W. (1994, April). User learning and performance with marking menus. In CHI (Vol. 94, pp. 258-264).
-]
-???
-Minimizes D
-AND
-increases W
-(only angle matters)
-
-
----
-# Does this minimize Distance (D) or maximize Size (W)?
-
-Why is it so rare & unfamiliar?
-
-![:img Left -- A pie menu consisting of a circle broken into eight
-wedges containing menu items like copy and undo; right-- A picture of
-a standard linear menu ,50%](img/pm/linear-pie.jpg)
-
-.footnote[
-Left example: OneNote 2013, Right example: Firefox. Taken from [Fitts
-law and user experience](https://www.smashingmagazine.com/2012/12/fittss-law-and-user-experience/)
-by
-[https://www.smashingmagazine.com/author/anastasios-karafillis/](Anastasios Karafillis)
-]
-
----
-# Design Tip #4:<br>Use pie menus instead of context menus for expert tasks
---
-
-Under some circumstances only...
-
-- Less than 8 options (Small target areas when too many menu entries are added)
-- Expert user (willing to memorize and gain advantage of marking
-menus)
-- Grouping not important (hard to group radially)
-
-Pie menus are often not implemented in production code
-- Needs to be seen as a high priority feature
-- Managers need to be able to assign staff to the project
-  - Sadly, project constraints define an interface. (**Shouldn't be a thing! Whorfian effects**)
-
-
----
-
-# Does this minimize Distance (D) or maximize Size (W)?
-
-![:img video of someone moving emails into folders with snapping,60%](img/pm/gmail-snapping.gif)
-
-???
-Snapping to a target
-
-- [A] Minimize D?
-- [B] Maximize W?
-
-minimizes D
----
-
-# Design Tip #5:<br>Use snapping to minimize distance<br> when likely targets are known
-
-![:img Picture showing drag snapping in gmail trello and chrome,40%](img/pm/common-snapping-cases.png)
-
-.font-small[
-
-Gmail | Trello | Chrome
------ | ------ | -----
-![:img check, 10%](img/pm/check.png)Drag Handle | ![:img x, 10%](img/pm/x.png)No Handle | ![:img x, 10%](img/pm/x.png) No Handle
-![:img ,10%](img/pm/grab-cursor.png)Grab cursor | ![:img ,10%](img/pm/pointer-cursor.png)Pointer cursor | ![:img ,10%](img/pm/cursor.png)Default cursor
-![:img check, 10%](img/pm/check.png)Drop Shadow | ![:img check, 10%](img/pm/check.png)Drop Shadow | ![:img x, 10%](img/pm/x.png) No Drop Shadow
-![:img check, 10%](img/pm/check.png)Drop Target | ![:img check, 10%](img/pm/check.png)Drop Target | ![:img x, 10%](img/pm/x.png) No Drop Target
-![:img x, 10%](img/pm/x.png) No Natural Movement | ![:img check, 10%](img/pm/check.png)Natural Movement | ![:img check, 10%](img/pm/check.png) Natural Movement
-]
-
-.footnote[Examples courtesy of [Drag and Drop for Design Systems](https://uxdesign.cc/drag-and-drop-for-design-systems-8d40502eb26d)]
-
-???
-Also common in drawing programs
-
-Most sophisticated approach: dynamic semantics: Check legality and
-consequences of each result at every move don’t catch errors, prevent them
----
-# Does this minimize Distance (D) or maximize Size (W)?
-
-Fan Cursor, Area Cursor and Bubble Cursor
-![:youtube Video showing a variety of schemes for making the cursor
-bigger including fan cursor; area cursor; and bubble
-cursor,bq1x5cRqgUc]
-
-.footnote[Su, X., Au, O. K. C., & Lau, R. W. (2014, April). The
-implicit fan cursor: a velocity dependent area cursor. In Proceedings
-of the SIGCHI Conference on Human Factors in Computing Systems
-(pp. 753-762). ACM.]
-
----
-# Design Tip #6:<br>Separate Motor Size from Visible Size
-
-.left-column[
-![:img Picture of two versions of a dialog box; scrollbar; and
-menu, 100%](img/pm/hiddensize.png)
-]
-.right-column[
-- (a) Visual space appearance of buttons in a dialogue
-box.
-- (b) Motor space version of button design in (a) with much larger
-targets for certain buttons.
-- (c) Standard scroll-bar design.
-- (d) Visual space appearance of scroll-bar redesigned to occupy smaller
-screen space.
-- (e) Motor space version of scroll-bar design in (d) with larger targets for active areas.
-- (f) Visual space appearance of menu.
-- (g) Motor space version of the menu design in (f) with the
-distance to more important items reduced by compressing the size of less important items)
-]
-.footnote[Semantic pointing widget designs from Blanch et al. 2004]
-???
-How would you implement this?
-- Manipulate picking
-- Whorfian effects
----
-# Would you ever make something too small virtually?
-
---
-
-How about a cancel button?
-
----
-# How long will this take?
-.right-column-half[
-Select 'Open New Window in Process'
-]
-.left-column[
-![:img Cascading menus. User wants to use "Open New Window" then "Open
-new window in process" -- second option-- but the most direct path takes them over "Open command prompt" which changes the displayed sub-menu causing problems, 200%](img/pm/size.png)
-]
---
-.right-column-half[
-Steering law ... Fitts law integrated over the path you have to follow
-]
---
-.right-column-half[
-But it's not predictive at all. Why?
-]
---
-.right-column-half[
-It doesn't account for actual user behavior
-]
----
-# Actual User Behavior
-
-.left-column50[
-![:img Cascading menus. User wants to use "Open New Window" then "Open
-new window in process" -- second option -- but the most direct path takes them over "Open command prompt" which changes the displayed sub-menu causing problems, 80%](img/pm/size1.png)
-]
---
-.right-column50[
-![:img Cascading menus. User wants to use "Open New Window" then "Open
-new window in process" -- second option -- but the most direct path takes them over "Open command prompt" which changes the displayed sub-menu causing problems, 80%](img/pm/size2.png)
-]
-
-???
-Overly eager cascading menus, wrong submenu
-- Common problem w/ web menus (but not Mac or Win)
-- could brainstorm solutions (e.g. snapping? set focus somehow?)
-- whorfian effects: this is hard to implement
-
----
-# Fitts law has a huge limitation
-
-It is only predictive of **ERROR-FREE, EXPERT** behavior
-
-Related to our discussion of [Interaction Design](people-motor.html#28)
----
-# What else might we want to measure?
-
---
-- Time on Task -- How long does it take people to
-complete basic tasks? (For example, find something to
-buy, create a new account, and order the item.)
-
---
-- Accuracy -- How many mistakes did people make? (And
-were they fatal or recoverable with the right information?)
-
---
-- How strenuous (e.g. gaze has lower throughput but is less strenuous
-than head pointing Mackenzie 2018)
-
---
-- Recall -- How much does the person remember
-afterwards or after periods of non-use?
-
---
-- Emotional Response -- How does the person feel about
-the tasks completed? (Confident? Stressed? Would the
-user recommend this system to a friend?)
-
-Build up a list of good UI design principals from these basics
-- Undo
-- Predictability
-- ...
-What is missing? (e.g. fun)
-
----
-# Two Handed Interaction
-
-![:img Picture by Escher of two hands each drawing the other, 40%](img/pm/escher.png)
-???
-Used to be a norm
-
-Seems we forgotten to include it in our interfaces
----
-# Guiard's model of bimanual control
-
-Hand | Role and Action
----- | ----
-Non-preferred | Leads the preferred hand (in time)
-| Sets the spatial frame of reference for the preferred hand
-| Performs coarse movements
-Preferred | Follows the non-preferred hand
-| Works within established frame of reference set by the non-preferred hand
-| Performs fine movement
-
-Aside: Guiard is assuming right-handed. Tendencies somewhat less clear for left-handers,but we typically assume this still applies
-]
-.footnote[
-Seminal work
-Yves Guiard, “Asymmetric Division of Labor in Human Skilled Bimanual Action: The Kinematic Chain as a Model”, Journal of Motor Behavior, Vol. 19, No. 4, 1987, pp. 486-517.http://cogprints.org/625/
-]
-???
-non-preferred hand sets context for preferred
-coarser, slower movement
-tends to move first
-???
-Applications?
-
-- Mouse+keyboard
-- Lenses
-
----
-# What does theory say about keyboard layout?
-
-![:img Picture of right-handed user typing on keyboard with leftside
-and rightside power keys and mouse on right side (top). Picture of
-user  mousing with same set ups (bottom). Of note is the bad angle for
-the mouse in the keyboard with the right side power keys,
-30%](img/pm/keyboard-mouse.jpg)
-
-.footnote[From [Evoluent keyboard advertisement](https://turningpointtechnology.com/KB/EV/KB1.asp)]
----
-# Analysis of alternative keyboard layout
-
-Task | Leading Movement | Trailing/Overlapping Movement
-----|----|----
-Delete | Right hand — manipulate pointer with mouse; select by double clicking/dragging | Left hand — press DELETE (probably with little finger)
-Select an option in a window (see Figure 15) | Right hand — manipulate pointer with mouse; click option | Left hand — press ENTER (Assumes OK button is default)
-Click on a link in a browser | Left hand — navigate to link via PAGE UP and/or PAGE DOWN keys | Right hand — manipulate pointer with mouse; select link by clicking
-Open file; open folder; launch program | Right  hand — manipulate pointer with mouse; single click on icon | Right hand — press ENTER (avoids error prone double-click operation)
-
----
-# Other Examples: Tool Stone for Magic Lenses
-
-![:youtube By manipulating a mouse and a cube (one in each hand) the user controls a lens and uses it on screen, V32SnUnAe2E]
-
-Inspired by [1994 CHI paper](https://dl.acm.org/citation.cfm?id=166126)
-Published in [UIST 2000](https://lab.rekimoto.org/projects/toolstone/)
-
----
-# Magnification
-
-![:img Picture of a mandelbrot fractal with a lens over part of it magnifying that part, 50%](img/pm/magnification.png)
-
----
-# Font Selection
-
-![:img Picture of a paragraph of text with a lens containing a menu of options for bold italic regular and bold italic, 40%](img/pm/font-selection.png)
-
-???
-Fitts' law implications?
----
-# Debugging Lenses
-
-![:img Picture of a GUI application with a lens showing information about two lines including their coordinates and the option to turn on and off additional features, 40%](img/pm/debugging.png)
-
-.footnote[
-Hudson, S. E., Rodenstein, R., and Smith, I. 1997. Debugging lenses: a new class of transparent tools for user interface debugging. In Proceedings UIST '97, 179-187. http://doi.acm.org/10.1145/263407.263542
-]
----
-# Advantages of Lenses
-
-In context interaction
-- Little or no shift in focus of attention and/or movement
-- Alternate views in context and on demand
-
-???
-- tool is at/near action point
-- can compare in context
-- useful for “detail + context” visualization techniques
---
-
-Structured well for 2 handed input
-- non-dominant hand does course positioning (of the lens)
-- dominant hand does fine work
-
-"Spatial modes"
-- Use “where you click through” to establish meaning
-- Typically has a clear affordance for the meaning
-
----
-# Implementing Lenses
-
-.small[
-<div class="mermaid">
-  graph TD
-  Root(Root) --> LP(Lens Parent)
-  LP --> L[Lens]
-  LP --> I(Interactor 1)
-  LP --> II(Interactor 2)
-  LP --> III(Interactor 3)
-
-</div>
-]
-.footnote[Edwards, Hudson, et al., “Systematic output modification in a 2D user interface toolkit”, UIST ’97. http://doi.acm.org/10.1145/263407.263537 ]
-???
-Can be implemented with special "lens parent" container & lens interactors
-- Lens may need to change results of picking (only positional is affected) in collusion with lens parent
-- Lens parent forwards all damage to all lenses
-- Lenses typically change any damage that overlaps them into damage of whole lens area
-- Can pass a subclass of Drawable to "ambush and modify" drawing for output effects
----
-# Discussion: Should scrolling be dominant or non-dominant?
-
-What tasks is scrolling used for?
-
-Which precedes/follows?
-
-???
-Task | Characteristics
-Scrolling  | precedes/overlaps other tasks
-| sets the frame of reference
-| minimal precision needed (coarse)
-Selecting, editing, reading, drawing, etc. | follows/overlaps scrolling
-| works within frame of reference set by scrolling
-| demands precision (fine)
----
-# Summary Slide
-
-Design tips for motor
-
-- Design Tip #1: Make small targets larger
-- Design Tip #2: Put commonly used things close together
-- Design Tip #3: Use edges. They are infinite in size (W)
-- Design Tip #4: Use pie menus for expert tasks (better yet, marking menus)
-- Design Tip #5: Use snapping to reduce distance (D) when targets are known
-- Design Tip #6: Separate motor and visible size
-
-Two-Handed input principles
-- Non preferred leads
-- Sets frame of reference
-- Preferred does fine movement
diff --git a/slides/wk07/behavior-change.html b/slides/wk07/behavior-change.html
deleted file mode 100644
index 8e7ebc3d1ffb3bf9d6be995782978f39e59890f8..0000000000000000000000000000000000000000
--- a/slides/wk07/behavior-change.html
+++ /dev/null
@@ -1,741 +0,0 @@
----
-layout: presentation
-title: Using Mobile Phones to Persuade
-description: Using Mobile Phones to Persuade--Behavior Change through Mobile Design
----
-layout: normal
-
-# Do this now
-
-.left-column-half[
-<br>
-<iframe src="https://embed.polleverywhere.com/multiple_choice_polls/3oPAa3YORE0gE6uCKe7mq?controls=none&short_poll=true" width="600" height="400" frameBorder="0"></iframe>
-
-]
-
-.right-column-half[
-In chat write down your current "ear worm"
-
-What song is running through your head
-or are you listening to on repeat?
-
-]
-
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# [NOTIFICATIONS](http://sitn.hms.harvard.edu/flash/2018/dopamine-smartphones-battle-time/)
-
-![:img Picture of phone screen with red dots,
-80%](img/behavior-change/dopamine.jpg)
-
-
-.footnote[Picture from [itstimetologoff.com](https://www.itstimetologoff.com/2018/03/22/why-switching-off-your-social-media-and-phone-notifications-is-your-own-mini-digital-detox/)]
-???
-Multiple kinds of notifications on your phone.
-Here's the red dot with the number of messages on it.
-What other kinds are there?
-- Toast - appears within an app only
-- Email? Easy or hard to ignore
-What do you prefer? Which are more interruptive?
-Urge to clear the red dots on the screen?
-They effect your brain the seritonin in your rain (red dots in particular)
----
-# [Dopamine, Smartphones & You: A battle for your time](http://sitn.hms.harvard.edu/flash/2018/dopamine-smartphones-battle-time/)
-
-![:img Picture of brain looking at notification, 40%](img/behavior-change/dopamine2.png)
-
-???
-From a company's perspective, it's trying to get your attention
-Not an altruistic service
-It's not always the case, but incentives are there.
-War between companies to get your attention
-Important to think about how you use notifications if you're doing Mobile app development.
-
----
-layout: false
-
-.left-column[
-## Using Mobile Phones to Persuade
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
-]
-.right-column[
-
-
-![:img Picture of violinist in office with boy and principal with caption; I've hired this musician to play a sad melody while I give you a sob story about why I didn't do my homework. It's actually quite effective, 60%](img/behavior-change/sob.png)
-
-]
-
----
-# Examlet 3
-
-- Examlet 3 will be released after lecture
-- Same process as Examlet 2: copy a google doc, fill it out, make a PDF and upload to gradescope
-- Different: Not as time bound: due by 10pm tonight.
-
-
----
-# What does it take to persuade you?
-
-
-![:youtube Wildebeest arguing about a log and whether it is a crocodile, JMJXvsCLu6s]
-
----
-.left-column[
-## Technology for persuasion
-
-Coercive: negative connotatons, patronizing, paternalistc, "we know
-what’s best for you and you will do it!"
-]
-.right-column[
-![:img Big person leaning on small person, 30%](img/behavior-change/coercion.png)
-]
-
-???
-Persuasion is changing your behavior.
-
----
-.left-column[
-## Technology for persuasion
-
-## Is really about behavior change
-]
-.right-column[
-
-Which do you think is true?
-
-Persuasive = Coercive
-
-Persuasive >= Coercive
-
-Persuasive <= Coercive
-
-Persuasive != Coercive
-
-]
-???
-Technology that is pursuading you to do some kind of action.
-
-If you've bought something like a fitbit, you're buying into the idea of something pursuading
-you to do something.
----
-# What does it take to persuade you?
-
-![:youtube People being persuaded to climb stairs, 2lXh2n0aPyw]
-
-???
-What kind of pursuasion is being applied here.
-Is this coercive or not coercive?
-
----
-# What does it take to persuade you?
-
-
-.left-column50[
-![:youtube Cialdini, cFdCzN7RYbw]
-
-:54 6 shortcuts
-
-]
-???
-Tip example -
-How are they doing the study? What are the conditions?
-What are they measuring? (how much they tip)
-How do they sample?
-Are they consenting the participants like we have to do the  menus study?
-
---
-.right-column50[
-How does this list of shortcuts apply to interface design?
-
-- reciprocity
-- scarcity
-- authority
-- consistency
-- liking
-- consensus
-
-]
-
-???
-Trying to keep people using your app
-
----
-# What’s needed to support positive behavior change?
-.quote[
-If you cannot measure it, you cannot improve it.]
-
-Lord Kelvin
-
-???
-Not using sensor based interfaces, but we'll talk about what can we do with sensor data?
-Almost every app that you download collects data about you. Studies have been done
-about the libraries that are used in seemingly begnin apps.
-Example: Angry birds. Why do they collect location data? (Sales)
-
-Most of the data they're collecting is through third party libraries.
-
----
-# Data Collection Options
-
-![:img Data collection Devices (fitbits; watches; etc), 40%](img/behavior-change/data-collection.png)
-
----
-# Data Collection Options
-
-.left-column[
-
-Or we could just use one...
-
-]
-
-.right-column[
-![:img Samsung Phone, 20%](img/behavior-change/phone.png)
-
-]
-???
-We're carrying this around and letting them collect all this data.
-
----
-.left-column[
-## Making Data Actionable
-
-## Data ]
-.right-column[
-
-![:img Speedometor with dial at 110mph, 80%](img/behavior-change/speedometer.png)
-
-]
-
----
-.left-column[
-## Where is the value?
-
-## Data
-
-]
-.right-column[
-Most of what we get is Data
-
-![:img many graphs, 100%](img/behavior-change/mostlydata.png)
-]
-
-???
-We have to do more to turn the raw into something useful.
-Knowledge instead of just data
-
-
----
-.left-column[
-## Making Data Actionable
-
-## Knowledge ]
-.right-column[
-
-![:img Sign comparing speed (29mph) to speed limit (25mp), 60%](img/behavior-change/sign.png)
-
-]
-
----
-.left-column[
-## Making Data Actionable
-
-## Decision Making ]
-.right-column[
-
-![:img out of focus sign due to speeding, 50%](img/behavior-change/focus.png)
-
-Danger... you have exceded the speed limit of 80kph. <br>
-Slow down immediately or face strict disciplinary action
-
-.footnote[[Meru speed alarms in cabs](https://www.meru.in/about-us/our-philosophy)]
-
-]
-???
-
-This will be influencing based on the data
-
----
-.left-column[
-## Making Data Actionable
-
-### Translating data into behavior change
-
-]
-.right-column[
-![:img Personal Informatics apps, 80%](img/behavior-change/personalinformatics.png)
-
-]
-.footnote[[personalinformatics.org](http://personalinformatics.org/tools)]
-
-???
-Website that has a list of all the APIs that they were aware of at the time that supports behavior change.
-
----
-.left-column[
-## Making Data Actionable
-
-### Translating data into behavior change
-
-]
-.right-column[
-![:img five part model of personal informatics with stages
-preparation; collection; integration; reflection; action ,
-80%](img/behavior-change/personal-informatics-model.png)
-
-Developed with 68 survey participants, 11 follow-up interviews
-
-]
-.footnote[Li, Dey, Forlizzi. A Stage-Based Model of Personal
-Informatics Systems. CHI 2010.]
-
-???
-Study done at the iSchool
-Beyond notifications to get users to use an app
-
-Can't assume that everyone is at the action stage.
-
-
----
-
-.left-column[
-## Preparation
-
-![:img person waving, 100%](img/behavior-change/alice.png)
-]
-.right-column[
-Alice!
-- **Wanted** to become active
-- **Decided** to track her physical activity
-- **Chose** to track step counts using a pedometer
-]
-
-
-.footnote[
-**Preparation**|Collection|Integration|Reflection|Action]
-
-
----
-.left-column[
-## Collection
-
-]
-
-.right-column[
-
-| day | steps | day | steps | day | steps | day | steps | day | steps | day | steps |
-|-----|-------|-----|-------|-----|-------|-----|-------|-----|-------|-----|-------|
-| Mon | 1573  | Mon | 1209  | Mon | 12344 | Mon | ...   | Mon | ...   | Mon | ...   |
-| Tue | 4392  | Tue | 1834  | Tue | 1200  | Tue | ...   | Tue | ...   | Tue | ...   |
-| Wed | 4537  | Wed | 4341  | Wed | 4311  | Wed | ...   | Wed | ...   | Wed | ...   |
-| Thu | 5842  | Thu | 8300  | Thu | 7348  | Thu | ...   | Thu | ...   | Thu | ...   |
-| Fri | 10258 | Fri | 10300 | Fri | 9384  | Fri | ...   | Fri | ...   | Fri | ...   |
-| Sat | 7528  | Sat | 6347  | Sat | 5123  | Sat | ...   | Sat | ...   | Sat | ...   |
-| Sun | 1367  | Sun | 1231  | Sun | 1430  | Sun | ...   | Sun | ...   | Sun | ...   |
-| Mon | 1497  | Mon | 1503  | Mon | 1427  | Mon | ...   | Mon | ...   | Mon | ...   |
-| Tue | 1837  | Tue | 1717  | Tue | 1643  | Tue | ...   | Tue | ...   | Tue | ...   |
-| Wed | 4537  | Wed | 4341  | Wed | 4311  | Wed | ...   | Wed | ...   | Wed | ...   |
-| Thu | 5842  | Thu | 8300  | Thu | 7348  | Thu | ...   | Thu | ...   | Thu | ...   |
-| Fri | 10258 | Fri | 10300 | Fri | 9384  | Fri | ...   | Fri | ...   | Fri | ...   |
-| Sat | 7528  | Sat | 6347  | Sat | 5123  | Sat | ...   | Sat | ...   | Sat | ...   |
-| Sun | 1367  | Sun | 1231  | Sun | 1430  | Sun | ...   | Sun | ...   | Sun | ...   |
-| ... | ...   | ... | ...   | ... | ...   |     | ...   | ... | ...   | ... | ...   |
-]
----
-
-.left-column[
-## Integration
-
-![:img person waving, 100%](img/behavior-change/alice.png)
-]
-.right-column[
-![:img chart of steps, 80%](img/behavior-change/chart.png)
-
-]
-
-
-.footnote[
-Preparation|Collection|**Integration**|Reflection|Action]
-
-???
-bar plot
-
----
-
-.left-column[
-## Reflection
-
-![:img person waving, 100%](img/behavior-change/alice.png)
-]
-.right-column[
-![:img chart of steps, 80%](img/behavior-change/chart-highlights.png)
-
-]
-
-.footnote[
-Preparation|Collection|Integration|**Reflection**|Action]
-
-???
-Days when she's really outside of the mean
-
----
-
-.left-column[
-## Action
-
-![:img person moving, 100%](img/behavior-change/aliceactive.png)
-]
-.right-column[
-
-The stage when people choose what they are going to do with their
-new-found understanding of themselves.
-]
-
-.footnote[
-Preparation|Collection|Integration|Reflection|**Action**]
-
-
-???
-How can we support this with technology?
-
---
-.right-column[
-– Alerts
-
-– Incentives
-
-– Suggestions
-
-]
-
-???
-Context-aware computing...
-
----
-
-.left-column50[
-![:img self tracking in context, 80%](img/behavior-change/full-model.png)
-]
-.right-column50[
-
-# Why Behavior Change is Difficult
-
-
-### Every stage presents distinct barriers
-
-Failures in one stage cascade through later stages, must design for
-entire tracking process
-
-### This occurs in a larger context of deciding to track, selecting a tool, and eventual lapsing
-]
-.footnote[Epstein, Ping, Fogarty, Munson. A Lived Informatics Model of
-Personal Informatics. UbiComp 2015.]
-
-???
-Fitbit users lapse after a time - they don't charge it.
-Not incentivised.
-Have to account for when they're lapsing
-
-
----
-
-# Process of Change
-
-![:img Trans-theoretical change model, 80%](img/behavior-change/ttc.png)
-
-<!--
-| Precont.      | Cont.         | Prep.           | Action                | Maint.           | Adoption              |
-|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|-----------------------|
-| Consciousness-raising | Consciousness-raising | Consciousness-raising |                       |              | Social liberation     | Social liberation     | Social liberation     | Social liberation     |                       |                       |
-         |                       |
-|                       | Self-analysis         | Self-analysis         |                       |                       |                       |
-|                       | Emotional arousal     | Emotional arousal     |                       |                       |                       |
-|                       | Positive outlook      | Positive outlook      |                       |                       |                       |
-|                       |                       | Commitment            | Commitment            | Commitment            | Commitment            |
-|                       |                       | Behavior analysis     | Behavior analysis     |                       |                       |
-|                       |                       | Goal setting          | Goal setting          | Goal setting          |                       |
-|                       |                       | Self-reevaluation     | Self-reevaluation     | Self-reevaluation     |                       |
-|                       |                       |                       | Countering            | Countering            |                       |
-|                       |                       |                       | Monitoring            | Monitoring            | Monitoring            |
-|                       |                       |                       | Environmental control | Environmental control | Environmental control |
-|                       |                       |                       | Helping relationships | Helping relationships | Helping relationships |
-|                       |                       |                       | Rewards               | Rewards               | Rewards               |
-|                       |                       |                       |                       |                       |                       |
-{: .small #small}
--->
-
-
-???
-Using the same plan for every individual who wishes to change a behavior will not work
-
-Timing is important in the process of willful change
-
----
-background-image: url(img/behavior-change/phoneplanet.png)
-
-# Case Study: <BR> Energy Use
----
-# What is the responsibility of technologists to address climate change?
-![:img Picture of unhappy amazon boxes, 40%](img/behavior-change/amazon.jpeg)
-
-.footnote[[Amazon Refuses to Act on Climate Change. So We Employees Are Speaking Out](https://www.yesmagazine.org/planet/amazon-climate-change-action-jeff-bezos-20190530)]
-
----
-# Case Study: UbiGreen - In Class activity
-
-.right-column30[
-![:img Picture of a mobile phone with a car and a tree on the sceren,40%](img/behavior-change/ubigreen.png)
-]
-
-This will be fun - a design activity!
---
-Honest.
---
-Don't leave...
---
-It does involve breakout rooms.
---
-(If you are the only one in a breakout room come back to the main room and I'll put you in another one.)
---
-
-
-Each group will work on a page in the [shared google doc](https://docs.google.com/document/d/1SqvaQyhFYs6AsOPoDcBkG4egCRRq3jEaW17HOi0hSkM/edit?usp=sharing)
---
-
-Case study is explained on the next slide AND in the doc.
---
-
-One person in each breakout room should share the screen with slide, everyone should also
-be in the google doc.
-
----
-# Case Study: UbiGreen - In Class activity
-
-.right-column30[
-![:img Picture of a mobile phone with a car and a tree on the sceren,40%](img/behavior-change/ubigreen.png)
-]
-
-Problem: High Carbon Dioxide emissions from U.S. households from personal transportation (single use
-vehicles).
-
-Goal: To create an app that will encourage users to change their behavior with respect to using
-their cars.
-
---
-
-This was last done in 2006-9... the app needs updating...
-
-.left-column40[
-.footnote[
-based on a [CHI 2009 paper](https://dl.acm.org/doi/10.1145/1518701.1518861) by J. Froehlich,
-T. Dillahunt, P. Klasnja, J. Mankoff, S. Consolvo, B. Harrison, J. A. Landay
-]
-]
----
-# Case Study: UbiGreen - In Class activity
-
-.right-column30[
-![:img Picture of a mobile phone with a car and a tree on the sceren,40%](img/behavior-change/ubigreen.png)
-]
-
-Your task:
-- Design an app that will
-  - Use sensing data to determine a user's behavior (what type of data would you need?)
-  - Pursuade (or coerce?) users of your app to change their behavior
-- Design a user study that will determine if your app is successful.
-  - What is your [hypothesis](https://courses.cs.washington.edu/courses/cse340/20sp/slides/wk07/menus.html#36)?
-  - What is your [method](https://courses.cs.washington.edu/courses/cse340/20sp/slides/wk07/menus.html#40)? What conditions might you have for your experiment?
-  - What might you [measure](https://courses.cs.washington.edu/courses/cse340/20sp/slides/wk07/menus.html#41)?
-  - What [data](https://courses.cs.washington.edu/courses/cse340/20sp/slides/wk07/menus.html#43) would you collect?
-  - How would you [collect the data](https://courses.cs.washington.edu/courses/cse340/20sp/slides/wk07/menus.html#49)?
-  - How would you prove your theories?
-
-
-
-
----
-
-# Case Study: UbiGreen - actual research
-
-Sensed Transportation Behavior
-
-Ever-present Feedback
-
-Two formative studies
-- Online survey
-- In situ experience sampling method (ESM) study
-
-Three week field deployment
-
-.footnote[
-based on a [CHI 2009 paper](https://dl.acm.org/doi/10.1145/1518701.1518861) by J. Froehlich,
-T. Dillahunt, P. Klasnja, J. Mankoff, S. Consolvo, B. Harrison, J. A. Landay
-]
-
-???
-Smartest phone at the time (2006)
-
-
----
-
-![:img Picture of a mobile phone with a car and a tree on the screen, 50%](img/behavior-change/ubigreen-explained.png)
-
----
-
-![:img Picture of a mobile phone with a car and a tree on the screen,60%](img/behavior-change/ubigreen-system.png)
-
----
-![:img Picture of a mobile phone with a car and a tree on the screen,60%](img/behavior-change/ubigreen-sequence.png)
-
----
-.left-column[
-![:img Picture of a mobile phone with a car and a tree on the screen,40%](img/behavior-change/ubigreen.png)
-
-]
-
-.right-column[
-## UbiGreen
-
-2 cities; 14 participants
-
-Obtain preliminary feedback on prototype
-- Engagement
-- Potential for social use
-- Potential for changing behavior
-
-]
-
----
-.left-column[
-![:img Picture of a mobile phone with a car and a tree on the sceren,40%](img/behavior-change/ubigreen.png)
-
-]
-
-.right-column[
-## UbiGreen
-
-
-Engagement
-.quote[It's omnipresent]
-
-Behavior Change:
-.quote[
-“It really encourages you to analyze your own performance”
-]
-
-<!-- Social
-.quote[
-“Some people at work knew about the polar bear and every day they -->
-<!-- asked me about it. ‘Did you get a seal today?’”] -->
-
-]
-???
-Introspection
-
----
-# Personal Informatics
-![:img five part model of personal informatics with stages
-preparation; collection; integration; reflection; action ,
-80%](img/behavior-change/personal-informatics-model.png)
-
-
-???
-Apply it to ubigreen
-
----
-# Aside: Other ways for CS to engage with sustainability
-.left-column50[
-
-## Impact: Direct ways of reducing carbon emissions
-
-- Efficiency (new technologies, new patterns of use, better buildings, etc.)
-- Carbon capture & storage
-- Alternate sources of energy
-- Carbon sinks (e.g. reforestation)
-- Better energy grid
-]
-
-.right-column50[
-
-## Solutions: Indirect ways of reducing carbon emissions
-
-- Population control
-- Economic controls (e.g., taxes)
-- Cross-cultural solutions (culturally-relevant technologies)
-- Education
-- Governmental buy in (Local laws, world treaties, etc)
-- Advancing science
-]
-.footnote[
-[Socolow &
-Pacala](http://ngm.nationalgeographic.com/2007/10/carbon-crisis/img/stabilization_wedges.pdf);
-A. Gore, Earth in the Balance
-]
----
-.right-column[
-## My checklist for mobile ICT impact
-
-*Measure* waste and impact
-   - Example: [what happens to phones when you finish with them?](https://dl.acm.org/citation.cfm?doid=1357054.1357110)
-
-*Monitor, Model & Inform* governments as well as individuals
-  - Example: [Measuring air pollution using a mobile
-    device](https://dl.acm.org/citation.cfm?doid=1978942.1979290)
-]
----
-.left-column[
-
-![:img therml, 100%](img/behavior-change/therml.png)
-
-Simulated impact of multiple algorithms on three month data set
-
-]
-
-.right-column[
-## My checklist for mobile ICT impact
-
-*Encourage environmentality*
-  - example [Automated thermostat  setting](https://dl.acm.org/citation.cfm?doid=2493432.2493441)
-  - automation, efficiency, re-use
-  - people (lived experience)
-  - reduce waste
-]
-.footnote[[some computer science issues in creating a sustainable world](http://www.cs.cmu.edu/~io/publications/ieee08-preprint.pdf)]
-
----
-.left-column[
-![:img cscw, 100%](img/behavior-change/android.png)
-]
-
-.right-column[
-# My checklist for mobile ICT impact
-
-*Relevance across sectors and cultures* (residential: renters, owners, etc), business, ...)
-  - Example: [understanding conflicts between landlords and tenants  around energy use](https://dl.acm.org/citation.cfm?doid=1864349.1864376)
-  - Example: [deploying an android energy monitor to help communities &
-  individuals monitor](https://dl.acm.org/citation.cfm?doid=2531602.2531626)
-
-Goal: *Scale up* to governments, nations or more
-]
-.footnote[
-[Some computer science issues in creating a sustainable world](http://www.cs.cmu.edu/~io/publications/ieee08-preprint.pdf)
-]
----
-
-.title[Why a digression on sustainability in a behavior change lecture?]
-.body[
-![:img five part model of personal informatics with stages
-preparation; collection; integration; reflection; action ,
-80%](img/behavior-change/personal-informatics-model.png)
-
-]
-???
-That's all there is to fix it, we need the will power at a society level
-
-Of course there's other applications of behavior change as well :)
-Health is a big one!
diff --git a/slides/wk07/img/behavior-change/alice.png b/slides/wk07/img/behavior-change/alice.png
deleted file mode 100644
index afca3ba696619e3701d1c19d79050ece03c69c71..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/alice.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/aliceactive.png b/slides/wk07/img/behavior-change/aliceactive.png
deleted file mode 100644
index 31d5c2c28f1aee621909557f9695d2f835484cbe..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/aliceactive.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/amazon.jpeg b/slides/wk07/img/behavior-change/amazon.jpeg
deleted file mode 100644
index 9d713cef9b12ee01424cdb3fb1c07dded5ee2d33..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/amazon.jpeg and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/android.png b/slides/wk07/img/behavior-change/android.png
deleted file mode 100644
index c05abc897a6ba254f4bf90cfa088dfb9de0d2569..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/android.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/chart-highlights.png b/slides/wk07/img/behavior-change/chart-highlights.png
deleted file mode 100644
index aa85ec73c9867b35e533f908213fe010872a4a7e..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/chart-highlights.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/chart.png b/slides/wk07/img/behavior-change/chart.png
deleted file mode 100644
index 48bf2c80d8c82673d08dcd270513bd242f4a94f8..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/chart.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/coercion.html b/slides/wk07/img/behavior-change/coercion.html
deleted file mode 100644
index d04f6b052527ab854bcd2babf3e56c5bc76bc88d..0000000000000000000000000000000000000000
--- a/slides/wk07/img/behavior-change/coercion.html
+++ /dev/null
@@ -1,449 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" prefix="og: http://ogp.me/ns#">
-<head>
-
-<meta charset="utf-8">
-<meta name="viewport" content="width=device-width, initial-scale=1">
-<title>Free photo Chef Man Manager Pressure Suppression Superior - Max Pixel</title>
-<meta name="description" content="Chef Man Manager Pressure Suppression Superior photo, resolution 2603×3904 pixel, Image type PNG, free download and free for commercial use.">
-
-
-<meta name="google-site-verification" content="Je-m0JymvkSxpT3DfyirLx1O4vzwjAVMCxgR88P9OYI" />
-
-<link rel="apple-touch-icon" sizes="57x57" href="https://www.maxpixel.net/images/apple-touch-icon-57x57.png">
-<link rel="apple-touch-icon" sizes="60x60" href="https://www.maxpixel.net/images/apple-touch-icon-60x60.png">
-<link rel="apple-touch-icon" sizes="72x72" href="https://www.maxpixel.net/images/apple-touch-icon-72x72.png">
-<link rel="apple-touch-icon" sizes="76x76" href="https://www.maxpixel.net/images/apple-touch-icon-76x76.png">
-<link rel="apple-touch-icon" sizes="114x114" href="https://www.maxpixel.net/images/apple-touch-icon-114x114.png">
-<link rel="apple-touch-icon" sizes="120x120" href="https://www.maxpixel.net/images/apple-touch-icon-120x120.png">
-<link rel="apple-touch-icon" sizes="144x144" href="https://www.maxpixel.net/images/apple-touch-icon-144x144.png">
-<link rel="apple-touch-icon" sizes="152x152" href="https://www.maxpixel.net/images/apple-touch-icon-152x152.png">
-<link rel="apple-touch-icon" sizes="180x180" href="https://www.maxpixel.net/images/apple-touch-icon-180x180.png">
-
-<link rel="icon" type="image/png" href="https://www.maxpixel.net/images/favicon-32x32.png" sizes="32x32">
-<link rel="icon" type="image/png" href="https://www.maxpixel.net/images/android-chrome-192x192.png" sizes="192x192">
-<link rel="icon" type="image/png" href="https://www.maxpixel.net/images/favicon-96x96.png" sizes="96x96">
-<link rel="icon" type="image/png" href="https://www.maxpixel.net/images/favicon-16x16.png" sizes="16x16">
-
-
-<meta name="msapplication-TileColor" content="#4ea64e">
-<meta name="msapplication-TileImage" content="https://www.maxpixel.net/images/mstile-144x144.png">
-<meta name="theme-color" content="#4ea64e">
-
-<link rel="canonical" href="https://www.maxpixel.net/Chef-Man-Manager-Pressure-Suppression-Superior-3026568">
-
-
-
-<meta property="og:image" content="https://www.maxpixel.net/static/photo/640/Chef-Man-Manager-Pressure-Suppression-Superior-3026568.png">
-<meta property="og:type" content="article">
-<meta property="og:title" content="Free photo Chef Man Manager Pressure Suppression Superior - Max Pixel">
-<meta name="twitter:card" content="photo">
-<meta name="twitter:site" content="@fGreatPicture">
-<meta name="twitter:title" content="Free photo Chef Man Manager Pressure Suppression Superior - Max Pixel">
-<meta name="twitter:image" content="https://www.maxpixel.net/static/photo/640/Chef-Man-Manager-Pressure-Suppression-Superior-3026568.png">
-<meta name="twitter:image:width" content="427">
-<meta name="twitter:image:height" content="640">
-
-<link rel="stylesheet" href="https://www.maxpixel.net/css/max-pixel.min.css">
-<link rel="stylesheet" href="https://www.maxpixel.net/css/style.css">
-<!--[if lt IE 9]><script src="https://www.maxpixel.net/js/respond.min.js"></script><![endif]-->
-<style>
-  #header_inner, #footer_inner { max-width: 1620px; }
-</style>
-<script type="text/javascript">
-var base_url = 'https://www.maxpixel.net/';
-</script>
-
-</head>
-<body>
-<div id="wrapper">
-  <div id="header">
-    <div id="header_inner">
-      <div class="pure-menu pure-menu-horizontal pure-menu-open">
-        <ul>
-          <li class="pure-dropdown hide-xs hide-sm hide-md"><a href="https://www.maxpixel.net/Special-Photos" id="special-link">Special Photos</a></li>
-          <li class="pure-dropdown hide-xs hide-sm hide-md"><a><i class="icon icon_menu_dots"></i></a>
-            <ul class="pure-menu-children">
-              <li class="mm_inc"><a href="http://www.freegreatpicture.com/" target="_blank">FreeGreatPicture.com</a></li>
-              <li class="mm_inc"><a href="http://www.freegreatdesign.com/">FreeGreatDesign.com</a></li>
-            </ul>
-          </li>
-          <li class="pure-dropdown hide-lg hide-xl"><a><i class="icon icon_menu_bars"></i></a>
-            <ul id="mobile_menu" class="pure-menu-children">
-              <li><a href="https://www.maxpixel.net/Special-Photos">Special Photos</a></li>
-            </ul>
-          </li>
-        </ul>
-      </div>
-      <a id="logo" href="https://www.maxpixel.net/" class="hover_opacity"><img src="https://www.maxpixel.net/images/logo.png"></a>
-      <form class="media_search header_search" action="https://www.maxpixel.net/search" method="get">
-                <input type="submit" value=" ">
-        <div class="dd_box"><span class="image_type" style="margin-right:5px">Search</span><i class="arrow"></i></div>
-        <div class="pure-form bubble se">
-          <table>
-
-            <tr class="image_option">
-              <th>Orientation</th>
-              <td><label>
-                  <input type="checkbox" name="orientation" value="horizontal">
-                  Horizontal</label>
-                <label>
-                  <input type="checkbox" name="orientation" value="vertical">
-                  Vertical</label></td>
-            </tr>
-            <tr>
-              <th style="vertical-align:middle">Category</th>
-              <td><select name="cat">
-                                  <option value="" selected>All</option>
-                                  <option value="animals">Animals</option>
-                                  <option value="buildings">Architecture/Buildings</option>
-                                  <option value="backgrounds">Backgrounds/Textures</option>
-                                  <option value="fashion">Beauty/Fashion</option>
-                                  <option value="business">Business/Finance</option>
-                                  <option value="computer">Computer/Communication</option>
-                                  <option value="education">Education</option>
-                                  <option value="feelings">Emotions</option>
-                                  <option value="food">Food/Drink</option>
-                                  <option value="health">Health/Medical</option>
-                                  <option value="industry">Industry/Craft</option>
-                                  <option value="music">Music</option>
-                                  <option value="nature">Nature/Landscapes</option>
-                                  <option value="people">People</option>
-                                  <option value="places">Places/Monuments</option>
-                                  <option value="religion">Religion</option>
-                                  <option value="science">Science/Technology</option>
-                                  <option value="sports">Sports</option>
-                                  <option value="transportation">Transportation/Traffic</option>
-                                  <option value="travel">Travel/Vacation</option>
-                                </select></td>
-            </tr>
-            <tr class="image_option">
-              <th style="vertical-align:middle">Larger than</th>
-              <td style="ccolor:#777"><input type="text" name="min_width" value="" placeholder="Width">
-                <span class="times">&times;</span>
-                <input type="text" name="min_height" value="" placeholder="Height">
-                px </td>
-            </tr>
-            <tr class="image_option">
-              <th>Color</th>
-              <td>
-                <label>
-                  <input type="checkbox" name="colors[]" value="transparent"> Transparent
-                </label>
-                <input id="cf_grayscale" class="cf_grayscale" type="checkbox" name="colors[]" value="grayscale" style="float:none">
-                <label style="display:inline" for="cf_grayscale"> Black and white</label>
-                <div class="color_filter bg_colors">
-                                                      <input id="cf_red" type="checkbox" name="colors[]" value="red">
-                  <label for="cf_red" class="red"></label>
-                                    <input id="cf_orange" type="checkbox" name="colors[]" value="orange">
-                  <label for="cf_orange" class="orange"></label>
-                                    <input id="cf_yellow" type="checkbox" name="colors[]" value="yellow">
-                  <label for="cf_yellow" class="yellow"></label>
-                                    <input id="cf_green" type="checkbox" name="colors[]" value="green">
-                  <label for="cf_green" class="green"></label>
-                                    <input id="cf_turquoise" type="checkbox" name="colors[]" value="turquoise">
-                  <label for="cf_turquoise" class="turquoise"></label>
-                                    <input id="cf_blue" type="checkbox" name="colors[]" value="blue">
-                  <label for="cf_blue" class="blue"></label>
-                                    <input id="cf_lilac" type="checkbox" name="colors[]" value="lilac">
-                  <label for="cf_lilac" class="lilac"></label>
-                                    <input id="cf_pink" type="checkbox" name="colors[]" value="pink">
-                  <label for="cf_pink" class="pink"></label>
-                                    <input id="cf_white" type="checkbox" name="colors[]" value="white">
-                  <label for="cf_white" class="white"></label>
-                                    <input id="cf_gray" type="checkbox" name="colors[]" value="gray">
-                  <label for="cf_gray" class="gray"></label>
-                                    <input id="cf_black" type="checkbox" name="colors[]" value="black">
-                  <label for="cf_black" class="black"></label>
-                                    <input id="cf_brown" type="checkbox" name="colors[]" value="brown">
-                  <label for="cf_brown" class="brown"></label>
-                                  </div></td>
-            </tr>
-            <tr>
-              <th style="font-weight:normal"><a href="#" onclick="$('#search_syntax').slideToggle(200);return false;">more...</a></th>
-              <td style="min-width:200px;max-width:250px"><div id="search_syntax" style="display:none;white-space:normal"> You can use AND, OR, NOT and () to refine your search results:
-                  <p style="white-space:nowrap"><i>flower AND (red OR blue) NOT rose</i></p>
-                </div></td>
-            </tr>
-          </table>
-        </div>
-        <div>
-          <input type="text" name="q" value="" placeholder="Typing your keyword..." data-autofocus>
-          <input type="hidden" name="order" value="popular">
-        </div>
-      </form>
-    </div>
-  </div>
-      <div id="content" class="clearfix">
-    <div id="media_show" class="photo">
-      <div class="left">
-        <div class="inside">
-          <div style="text-align:center">
-            <div id="media_container" class="init" itemscope itemtype="schema.org/ImageObject">
-              <meta itemprop="license" content="https://creativecommons.org/licenses/publicdomain/">
-              <img itemprop="contentURL" srcset="https://www.maxpixel.net/static/photo/1x/Chef-Man-Manager-Pressure-Suppression-Superior-3026568.png 1x, https://www.maxpixel.net/static/photo/2x/Chef-Man-Manager-Pressure-Suppression-Superior-3026568.png 2x" src="https://www.maxpixel.net/static/photo/1x/Chef-Man-Manager-Pressure-Suppression-Superior-3026568.png" alt="Pressure, Suppression, Superior, Manager, Chef, Man">
-              <div class="overlay"><em>×</em>
-                <table style="height:100%">
-                  <tr>
-                    <td>
-                      <div id="support_overlay" style="color:#fff;font-size:20px">
-                        <p class="hide_on_small_img" style="margin:0 0 40px;font-size:34px;text-shadow:0 1px 10px rgba(0,0,0,.7)"><b>Support Max Pixel</b></p>
-                        <p style="margin:0 0 8px">Buy us a cup of coffee</p>
-                        <a href="https://www.maxpixel.net/utility/donate/geralt-9301" target="_blank"><span class="pure-button" style="min-width:120px;font-size:18px"><img src="https://www.maxpixel.net/images/paypal.svg" style="vertical-align:middle;height:24px" alt=""> Coffee</span></a>
-                      </div>
-                      <div id="img_click_overlay">
-                        <div id="like_buttons_clone"></div>
-                        <div id="download_menu_clone"></div>
-                      </div>
-                    </td>
-                  </tr>
-                </table>
-              </div>
-              <h3>
-                                                <a href="https://www.maxpixel.net/tag/Pressure">Pressure</a>
-                                <a href="https://www.maxpixel.net/tag/Suppression">Suppression</a>
-                                <a href="https://www.maxpixel.net/tag/Superior">Superior</a>
-                                <a href="https://www.maxpixel.net/tag/Manager">Manager</a>
-                                <a href="https://www.maxpixel.net/tag/Chef">Chef</a>
-                                <a href="https://www.maxpixel.net/tag/Man">Man</a>
-                              </h3>
-            </div>
-            <a style="position:absolute;left:-9999px" rel="license" about="https://www.maxpixel.net/static/photo/1x/Chef-Man-Manager-Pressure-Suppression-Superior-3026568.png" href="https://creativecommons.org/licenses/publicdomain/">Public Domain</a>
-          </div>
-          <h1>Chef Man Manager Pressure Suppression Superior</h1>
-          <div class="mmo mmo-zoom" slot-id="9569266757" slot-name="detail 1"></div>
-
-          <p>You can also exhort them by <a href="https://www.maxpixel.net/utility/donate/geralt-9301" rel="nofollow" target="_blank">inviting our photographers one cup of Coffee</a>. If it is so great, please share with your friends.</p>
-<p>License to use <a href="https://creativecommons.org/publicdomain/zero/1.0/deed.en" target="_blank" rel="nofollow">Creative Commons Zero - CC0</a>. You are free to use for many purposes without worrying issues licenses because this picture is TRUE FREE. We just want you to back a referral link to Max Pixel (optional).</p>
-<p>It was archived in the category "<a href="https://www.maxpixel.net/people"><strong>People</strong></a>", maximum resolution is <em>2603×3904</em> pixels, you can download it to PNG format. We were tagged: Pressure, Suppression, Superior, Manager, Chef, Man.</p>
-
-          <h4>Our team would like to recommend to you a few pictures in the same category:</h4>
-
-                              <p class="related">
-            <a href="https://www.maxpixel.net/Yoke-Forced-Burnout-Pressure-Nanny-Dependency-62283" title="Pressure, Burnout, Dependency, Yoke, Forced, Nanny"><img src="https://www.maxpixel.net/static/photo/640/Yoke-Forced-Burnout-Pressure-Nanny-Dependency-62283.png" alt="Pressure, Burnout, Dependency, Yoke, Forced, Nanny"></a>
-            <span>Pressure, Burnout, Dependency, Yoke, Forced, Nanny</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Pressure-Suppression-Stress-Fear-Professions-65336" title="Pressure, Suppression, Stress, Professions, Fear"><img src="https://www.maxpixel.net/static/photo/640/Pressure-Suppression-Stress-Fear-Professions-65336.png" alt="Pressure, Suppression, Stress, Professions, Fear"></a>
-            <span>Pressure, Suppression, Stress, Professions, Fear</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Violent-Containing-Distress-Shield-Stop-Coercion-144103" title="Containing, Stop, Shield, Violent, Distress, Coercion"><img src="https://www.maxpixel.net/static/photo/640/Violent-Containing-Distress-Shield-Stop-Coercion-144103.png" alt="Containing, Stop, Shield, Violent, Distress, Coercion"></a>
-            <span>Containing, Stop, Shield, Violent, Distress, Coercion</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Violent-Containing-Woman-Stop-Move-Tattoo-144106" title="Woman, Move, Tattoo, Containing, Stop, Violent"><img src="https://www.maxpixel.net/static/photo/640/Violent-Containing-Woman-Stop-Move-Tattoo-144106.png" alt="Woman, Move, Tattoo, Containing, Stop, Violent"></a>
-            <span>Woman, Move, Tattoo, Containing, Stop, Violent</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Abuse-Child-Containing-Person-Torture-Rape-334307" title="Child, Person, Containing, Abuse, Rape, Torture"><img src="https://www.maxpixel.net/static/photo/640/Abuse-Child-Containing-Person-Torture-Rape-334307.png" alt="Child, Person, Containing, Abuse, Rape, Torture"></a>
-            <span>Child, Person, Containing, Abuse, Rape, Torture</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Torture-Person-Containing-Rape-Child-Abuse-334309" title="Child, Person, Containing, Abuse, Rape, Torture"><img src="https://www.maxpixel.net/static/photo/640/Torture-Person-Containing-Rape-Child-Abuse-334309.png" alt="Child, Person, Containing, Abuse, Rape, Torture"></a>
-            <span>Child, Person, Containing, Abuse, Rape, Torture</span>
-          </p>
-                    <div class="mmo mmo-zoom" slot-id="2045999954" slot-name="detail 2"></div>
-          <br>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Bullying-Bully-Aggression-Tease-Abuse-Attack-655659" title="Bully, Attack, Aggression, Bullying, Abuse, Tease"><img src="https://www.maxpixel.net/static/photo/640/Bullying-Bully-Aggression-Tease-Abuse-Attack-655659.png" alt="Bully, Attack, Aggression, Bullying, Abuse, Tease"></a>
-            <span>Bully, Attack, Aggression, Bullying, Abuse, Tease</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Tease-Aggression-Attack-Abuse-Bullying-Bully-655660" title="Bully, Attack, Aggression, Bullying, Abuse, Tease"><img src="https://www.maxpixel.net/static/photo/640/Tease-Aggression-Attack-Abuse-Bullying-Bully-655660.png" alt="Bully, Attack, Aggression, Bullying, Abuse, Tease"></a>
-            <span>Bully, Attack, Aggression, Bullying, Abuse, Tease</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Tool-Screw-Clamp-Person-Terminal-Silhouette-Man-790474" title="Screw Clamp, Terminal, Tool, Silhouette, Man, Person"><img src="https://www.maxpixel.net/static/photo/640/Tool-Screw-Clamp-Person-Terminal-Silhouette-Man-790474.png" alt="Screw Clamp, Terminal, Tool, Silhouette, Man, Person"></a>
-            <span>Screw Clamp, Terminal, Tool, Silhouette, Man, Person</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Rape-Person-Torture-Abuse-Containing-Child-1223678" title="Child, Person, Containing, Abuse, Rape, Torture"><img src="https://www.maxpixel.net/static/photo/640/Rape-Person-Torture-Abuse-Containing-Child-1223678.png" alt="Child, Person, Containing, Abuse, Rape, Torture"></a>
-            <span>Child, Person, Containing, Abuse, Rape, Torture</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Torture-Rape-Abuse-Person-Child-Containing-1223680" title="Child, Person, Containing, Abuse, Rape, Torture"><img src="https://www.maxpixel.net/static/photo/640/Torture-Rape-Abuse-Person-Child-Containing-1223680.png" alt="Child, Person, Containing, Abuse, Rape, Torture"></a>
-            <span>Child, Person, Containing, Abuse, Rape, Torture</span>
-          </p>
-                                        <p class="related">
-            <a href="https://www.maxpixel.net/Suppression-Education-Fear-Terror-Violent-Child-1439468" title="Child, Education, Fear, Terror, Violent, Suppression"><img src="https://www.maxpixel.net/static/photo/640/Suppression-Education-Fear-Terror-Violent-Child-1439468.png" alt="Child, Education, Fear, Terror, Violent, Suppression"></a>
-            <span>Child, Education, Fear, Terror, Violent, Suppression</span>
-          </p>
-                    
-          <p class="tags">
-                        <a href="https://www.maxpixel.net/tag/Pressure">Pressure</a>
-                        <a href="https://www.maxpixel.net/tag/Suppression">Suppression</a>
-                        <a href="https://www.maxpixel.net/tag/Superior">Superior</a>
-                        <a href="https://www.maxpixel.net/tag/Manager">Manager</a>
-                        <a href="https://www.maxpixel.net/tag/Chef">Chef</a>
-                        <a href="https://www.maxpixel.net/tag/Man">Man</a>
-                        <a href="https://www.maxpixel.net/tag/Boss">Boss</a>
-                        <a href="https://www.maxpixel.net/tag/Employer">Employer</a>
-                        <a href="https://www.maxpixel.net/tag/Press">Press</a>
-                        <a href="https://www.maxpixel.net/tag/Keep-It-Small">Keep It Small</a>
-                        <a href="https://www.maxpixel.net/tag/Power">Power</a>
-                        <a href="https://www.maxpixel.net/tag/Authority">Authority</a>
-                        <a href="https://www.maxpixel.net/tag/Employee">Employee</a>
-                        <a href="https://www.maxpixel.net/tag/Subordinate">Subordinate</a>
-                        <a href="https://www.maxpixel.net/tag/The-Exercise-Of-Power">The Exercise Of Power</a>
-                        <a href="https://www.maxpixel.net/tag/Powerful">Powerful</a>
-                        <a href="https://www.maxpixel.net/tag/Violent">Violent</a>
-                        <a href="https://www.maxpixel.net/tag/Silhouette">Silhouette</a>
-                        <a href="https://www.maxpixel.net/tag/Tie">Tie</a>
-                        <a href="https://www.maxpixel.net/">Free Photos</a>
-            <a href="https://www.maxpixel.net/">Free Images</a>
-            <a href="https://www.maxpixel.net/">Max Pixel</a>
-          </p>
-        </div>
-      </div>
-      <div class="right">
-
-                <div style="padding:15px 20px;background:#f7f8fa">
-          <table id="details">
-                        <tr>
-              <th>Category</th>
-              <td><a href="https://www.maxpixel.net/people">People</a></td>
-            </tr>
-                                    <tr>
-              <th style="white-space:nowrap">Image type</th>
-              <td>PNG</td>
-            </tr>
-                                    <tr>
-              <th>Resolution</th>
-              <td>2603×3904</td>
-            </tr>
-                        <tr style="display:none">
-              <th>Downloads</th>
-              <td>0</td>
-            </tr>
-          </table>
-        </div>
-
-        <div class="mmo mmo-zoom" slot-id="8092533553" slot-name="sidebar 1" style="margin-top: 20px;"></div>
-        
-        <div class="download_menu" data-type="photos">
-          <span class="pure-button button-green" style="display:block;max-width:310px;margin:10px 0 0"><i class="icon icon_download"></i> Free Download</span>
-          <div class="bubble">
-            <form action="https://www.maxpixel.net/Chef-Man-Manager-Pressure-Suppression-Superior-3026568" method="post" target="_blank">
-            <table>
-                            <tr>
-                <td><input type="radio" name="download" value="https://cdn.pixabay.com/photo/2017/12/18/17/03/pressure-3026568_640.png">
-                   427×640</td>
-                <td>PNG</td>
-                <td>45 kB</td>
-              </tr>
-                            <tr>
-                <td><input type="radio" name="download" value="pressure-3026568_1280.png">
-                   853×1280</td>
-                <td>PNG</td>
-                <td>148 kB</td>
-              </tr>
-                            <tr>
-                <td><input type="radio" name="download" value="pressure-3026568_1920.png">
-                   1280×1920</td>
-                <td>PNG</td>
-                <td>315 kB</td>
-              </tr>
-                            <tr class="no_default">
-                <td><input type="radio" name="download" value="pressure-3026568.png">
-                   2603×3904</td>
-                <td>PNG</td>
-                <td>382 kB</td>
-              </tr>
-                          </table>
-            <input type="submit" name="submit_view" value="View" class="view_btn pure-button" data-w="300" style="display:inline-block;width:49%;float:right" /> <input type="submit" name="submit_download" value="Download" class="dl_btn pure-button button-green" data-w="300" style="display:inline-block;width:49%;" />
-            </form>
-          </div>
-                  </div>
-
-        <div class="like_buttons">
-          <span data-href="https://www.maxpixel.net/utility/share?photo_id=3026568" class="pure-button button-sm dd_box ajax" data-target=".share_links" title="Share">Share this photo <i class="icon icon_share"></i></span>
-          <div class="share_links" style="width:260px;padding:15px"></div>
-          <!-- <div class="fb-follow" data-href="https://www.facebook.com/freegreatpicture/" data-height="28" data-layout="button" data-size="large" data-show-faces="false"></div> -->
-          <div class="fb-like" data-href="https://www.facebook.com/freegreatpicture/" data-layout="button" data-action="like" data-size="large" data-show-faces="false" data-share="false"></div>
-        </div>
-
-        <div style="margin:20px 0 10px;padding:15px 20px;background:#f7f8fa;line-height:1.5"> <i class="icon icon_cc0"></i> CC0 Public Domain
-          <div style="margin-top:4px;font-size:14px">
-            Free for commercial use <br>
-            Link referral required
-          </div>
-        </div>
-        
-        
-        
-
-                <h4 style="margin-top:15px; margin-bottom:0px; font-size:13px;padding:5px 15px;background:#f7f8fa;border-bottom: 1px solid #eeeff2">Random special photos</h4>
-        <div class="flex_grid related_photos_sidebar" style="margin:0px -6px 15px -5px">
-                              <div class="item" data-w="640" data-h="426"><a href="https://www.maxpixel.net/Choose-Autumn-Large-Cucurbita-Maxima-Fruit-Pumpkin-3678820"> <img title="Pumpkin, Fruit, Autumn, Cucurbita Maxima, Choose, Large" src="https://www.maxpixel.net/images/blank.gif" alt="Choose Autumn Large Cucurbita Maxima Fruit Pumpkin" data-src="https://thumb.maxpixel.net/1314/Choose-Autumn-Large-Cucurbita-Maxima-Fruit-Pumpkin-3678820.jpg"> <em>Pumpkin, Fruit, Autumn, Cucurbita Maxima, Choose, Large</em> </a></div>
-                              <div class="item" data-w="640" data-h="426"><a href="https://www.maxpixel.net/Landscape-Sunset-Desert-Horizon-Sun-Dune-Travel-2774945"> <img title="Desert, Sun, Landscape, Sunset, Dune, Travel, Horizon" src="https://www.maxpixel.net/images/blank.gif" alt="Landscape Sunset Desert Horizon Sun Dune Travel" data-src="https://thumb.maxpixel.net/997/Landscape-Sunset-Desert-Horizon-Sun-Dune-Travel-2774945.jpg"> <em>Desert, Sun, Landscape, Sunset, Dune, Travel, Horizon</em> </a></div>
-                              <div class="item" data-w="640" data-h="427"><a href="https://www.maxpixel.net/Sitting-White-Mammal-Looking-Cat-Animal-Feline-3591348"> <img title="Cat, White, Animal, Mammal, Feline, Sitting, Looking" src="https://www.maxpixel.net/images/blank.gif" alt="Sitting White Mammal Looking Cat Animal Feline" data-src="https://thumb.maxpixel.net/1268/Sitting-White-Mammal-Looking-Cat-Animal-Feline-3591348.jpg"> <em>Cat, White, Animal, Mammal, Feline, Sitting, Looking</em> </a></div>
-                              <div class="item" data-w="426" data-h="640"><a href="https://www.maxpixel.net/Mackerel-Pet-Animal-Domestic-Cat-Cat-Portrait-3523992"> <img title="Cat, Domestic Cat, Mackerel, Pet, Animal, Portrait" src="https://www.maxpixel.net/images/blank.gif" alt="Mackerel Pet Animal Domestic Cat Cat Portrait" data-src="https://thumb.maxpixel.net/1256/Mackerel-Pet-Animal-Domestic-Cat-Cat-Portrait-3523992.jpg"> <em>Cat, Domestic Cat, Mackerel, Pet, Animal, Portrait</em> </a></div>
-                              <div class="item" data-w="640" data-h="254"><a href="https://www.maxpixel.net/Goose-Plumage-Waterfowl-Waterbird-Bird-Animal-3526503"> <img title="Goose, Waterbird, Waterfowl, Bird, Animal, Plumage" src="https://www.maxpixel.net/images/blank.gif" alt="Goose Plumage Waterfowl Waterbird Bird Animal" data-src="https://thumb.maxpixel.net/1256/Goose-Plumage-Waterfowl-Waterbird-Bird-Animal-3526503.jpg"> <em>Goose, Waterbird, Waterfowl, Bird, Animal, Plumage</em> </a></div>
-                              <div class="item" data-w="640" data-h="427"><a href="https://www.maxpixel.net/Herb-Spice-Green-Plant-Basil-Kitchen-Herb-Cook-3532424"> <img title="Basil, Herb, Kitchen Herb, Spice, Cook, Green, Plant" src="https://www.maxpixel.net/images/blank.gif" alt="Herb Spice Green Plant Basil Kitchen Herb Cook" data-src="https://thumb.maxpixel.net/1258/Herb-Spice-Green-Plant-Basil-Kitchen-Herb-Cook-3532424.jpg"> <em>Basil, Herb, Kitchen Herb, Spice, Cook, Green, Plant</em> </a></div>
-                              <div class="item" data-w="640" data-h="426"><a href="https://www.maxpixel.net/About-Time-To-Stumble-Jump-Time-Man-Alarm-Clock-2743994"> <img title="Time, Man, Jump, Alarm Clock, About Time To Stumble" src="https://www.maxpixel.net/images/blank.gif" alt="About Time To Stumble Jump Time Man Alarm Clock" data-src="https://thumb.maxpixel.net/986/About-Time-To-Stumble-Jump-Time-Man-Alarm-Clock-2743994.jpg"> <em>Time, Man, Jump, Alarm Clock, About Time To Stumble</em> </a></div>
-                              <div class="item" data-w="640" data-h="427"><a href="https://www.maxpixel.net/Pumpkin-Vegetables-Orange-Autumn-Food-Hokkaido-3636239"> <img title="Pumpkin, Hokkaido, Orange, Autumn, Vegetables, Food" src="https://www.maxpixel.net/images/blank.gif" alt="Pumpkin Vegetables Orange Autumn Food Hokkaido" data-src="https://thumb.maxpixel.net/1268/Pumpkin-Vegetables-Orange-Autumn-Food-Hokkaido-3636239.jpg"> <em>Pumpkin, Hokkaido, Orange, Autumn, Vegetables, Food</em> </a></div>
-                              <div class="item" data-w="640" data-h="427"><a href="https://www.maxpixel.net/Nature-Flower-Outdoors-Summer-Anemone-Plant-3616880"> <img title="Anemone, Flower, Plant, Nature, Summer, Outdoors" src="https://www.maxpixel.net/images/blank.gif" alt="Nature Flower Outdoors Summer Anemone Plant" data-src="https://thumb.maxpixel.net/1268/Nature-Flower-Outdoors-Summer-Anemone-Plant-3616880.jpg"> <em>Anemone, Flower, Plant, Nature, Summer, Outdoors</em> </a></div>
-                              <div class="item" data-w="640" data-h="426"><a href="https://www.maxpixel.net/Dahlia-Garden-Bud-Dahlia-Dahlias-Bud-Flower-3524115"> <img title="Dahlia, Dahlias Bud, Flower, Bud, Dahlia Garden" src="https://www.maxpixel.net/images/blank.gif" alt="Dahlia Garden Bud Dahlia Dahlias Bud Flower" data-src="https://thumb.maxpixel.net/1255/Dahlia-Garden-Bud-Dahlia-Dahlias-Bud-Flower-3524115.jpg"> <em>Dahlia, Dahlias Bud, Flower, Bud, Dahlia Garden</em> </a></div>
-                              <div class="item" data-w="640" data-h="213"><a href="https://www.maxpixel.net/Air-Dramatic-Sky-Atmosphere-Clouds-Weather-3526558"> <img title="Clouds, Sky, Dramatic, Air, Atmosphere, Weather" src="https://www.maxpixel.net/images/blank.gif" alt="Air Dramatic Sky Atmosphere Clouds Weather" data-src="https://thumb.maxpixel.net/1256/Air-Dramatic-Sky-Atmosphere-Clouds-Weather-3526558.jpg"> <em>Clouds, Sky, Dramatic, Air, Atmosphere, Weather</em> </a></div>
-                              <div class="item" data-w="640" data-h="426"><a href="https://www.maxpixel.net/Pallets-Structure-Texture-Pattern-Background-Wall-3614890"> <img title="Texture, Pattern, Background, Pallets, Wall, Structure" src="https://www.maxpixel.net/images/blank.gif" alt="Pallets Structure Texture Pattern Background Wall" data-src="https://thumb.maxpixel.net/1291/Pallets-Structure-Texture-Pattern-Background-Wall-3614890.jpg"> <em>Texture, Pattern, Background, Pallets, Wall, Structure</em> </a></div>
-                  </div>
-        
-      </div>
-      
-    </div>
-  </div>  <div id="push"></div>
-</div>
-<div id="footer">
-  <div id="footer_inner">
-    <div class="hover_links hide-xs hide-sm" style="float:right;margin:2px 0 0 30px"> <a href="https://www.facebook.com/freegreatpicture/" target="_blank"><i class="icon icon_facebook"></i></a> <a href="https://twitter.com/fGreatPicture" target="_blank"><i class="icon icon_twitter"></i></a> <a href="#" target="_blank" title="Process time: 0.0514 Seconds - Memory: 2.47MB - Sql: 6"><i class="icon icon_google_plus"></i></a> </div>
-    <span style="margin-right:30px">© 2016 MaxPixel.net</span>
-    <a style="margin-right:30px" href="https://www.maxpixel.net/">Max Pixel</a>
-    <a style="margin-right:30px" href="http://www.freegreatpicture.com/about" target="_blank">About</a>
-    <a style="margin-right:30px" href="http://www.freegreatpicture.com/contact" target="_blank">Contact</a>
-    <a style="margin-right:30px" href="http://www.freegreatpicture.com/join" target="_blank">Join</a>
-    <a style="margin-right:30px" href="http://www.freegreatpicture.com/term-of-service" target="_blank">TOS</a>
-    <a href="https://www.maxpixel.net/rid">RID</a>
-  </div>
-</div>
-<div id="fb-root"></div>
-<a id="toTop">â–²</a> 
-<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
-<script>
-    window.jQuery || document.write('<script src="https://www.maxpixel.net/js/jquery.min.js"><\/script>');
-    var LANG = 'en', I18N_DELETE = 'Really delete?';
-    var show_captcha=0;auth_user=1;
-    var show_ga = '1' == '1';
-</script> 
-<script src="https://www.maxpixel.net/js/max-pixel.min.js"></script>
-<script src="https://www.maxpixel.net/js/utility.js"></script>
-<script>
-
-        $('.header_search').find('input[type="text"], input:checked, select, input[type="hidden"]').each(function(){
-            var i = this;
-            $('.add_search_params').each(function(){
-                if (i.value && (!$(this).hasClass('filter') || i.name != 'colors' && i.name != 'min_width' && i.name != 'min_height'))
-                    $(this).append($('<input type="hidden" name="'+i.name+'">').val(i.value));
-            });
-        });
-    
-        if ($(window).innerWidth() > 767) document.write('<script src="//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.8&appId=1818229235120698" async defer><\/script>');
-        else $('#fb_like_widget').hide();
-
-  
-  $('#special-link').unbind( "click" );
-</script>
-
-<!-- Global site tag (gtag.js) - Google Analytics -->
-<script async src="https://www.googletagmanager.com/gtag/js?id=UA-17673201-26"></script>
-<script>
-  window.dataLayer = window.dataLayer || [];
-  function gtag(){dataLayer.push(arguments);}
-  gtag('js', new Date());
-
-  gtag('config', 'UA-17673201-26');
-</script>
-
-</body>
-</html>
-<!-- 11:07:04 30/05/2019 -->
\ No newline at end of file
diff --git a/slides/wk07/img/behavior-change/coercion.png b/slides/wk07/img/behavior-change/coercion.png
deleted file mode 100644
index 9329a4a28cae887cf7acdb773a8be917a4268eed..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/coercion.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/data-collection.png b/slides/wk07/img/behavior-change/data-collection.png
deleted file mode 100644
index 053253dc161cfb1617aebba4b576d627a220541d..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/data-collection.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/dopamine.jpg b/slides/wk07/img/behavior-change/dopamine.jpg
deleted file mode 100644
index 9f0170b483fbf5145719c0aad3c6ee674ab95bf3..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/dopamine.jpg and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/dopamine2.png b/slides/wk07/img/behavior-change/dopamine2.png
deleted file mode 100644
index 6b2461b22eb13dd1721bbf22b506b009a76a4e24..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/dopamine2.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/energycost.png b/slides/wk07/img/behavior-change/energycost.png
deleted file mode 100644
index ac66819963e3c9d66b0f4a2d63760e465edce127..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/energycost.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/focus.png b/slides/wk07/img/behavior-change/focus.png
deleted file mode 100644
index 7241d58e49cb8101cfcd19c8172e9a3b61341f1f..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/focus.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/full-model.png b/slides/wk07/img/behavior-change/full-model.png
deleted file mode 100644
index 8379c6e681e3829bc3dc6ae6978cad2d42fef176..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/full-model.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/house-background.png b/slides/wk07/img/behavior-change/house-background.png
deleted file mode 100644
index f34aa9bad1b8985effc10bd20a57faa4ebd38284..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/house-background.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/mostlydata.png b/slides/wk07/img/behavior-change/mostlydata.png
deleted file mode 100644
index c25fbbf622a32fad4d8f7d58d8e5c87e0d77f22d..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/mostlydata.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/personal-informatics-model.png b/slides/wk07/img/behavior-change/personal-informatics-model.png
deleted file mode 100644
index b7ec7714d914b333ceda3cb2146c805e38cd7107..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/personal-informatics-model.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/personalinformatics.png b/slides/wk07/img/behavior-change/personalinformatics.png
deleted file mode 100644
index f4d2f71c3686a00298b88616e41b5b8c8a4ab215..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/personalinformatics.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/phone.png b/slides/wk07/img/behavior-change/phone.png
deleted file mode 100644
index 3d5fe57f8e4f487d780319dcb35e1041143ed733..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/phone.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/phoneplanet.png b/slides/wk07/img/behavior-change/phoneplanet.png
deleted file mode 100644
index a5ee683695016659a255fefce6d78342b0cf781a..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/phoneplanet.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/scalability.png b/slides/wk07/img/behavior-change/scalability.png
deleted file mode 100644
index 71099b41f5e5d7e06c14098df1d61746b6a05fca..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/scalability.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/sign.png b/slides/wk07/img/behavior-change/sign.png
deleted file mode 100644
index 297f165ca97205d17d2a3689cd5dc5826b10d5af..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/sign.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/sob.png b/slides/wk07/img/behavior-change/sob.png
deleted file mode 100644
index 3a26631b30f839f30b4ba441c94d4c9f5c8a036f..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/sob.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/speedometer.png b/slides/wk07/img/behavior-change/speedometer.png
deleted file mode 100644
index 1372078f6fe156475574d114393aaee8dcc9259e..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/speedometer.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/stepcounter.png b/slides/wk07/img/behavior-change/stepcounter.png
deleted file mode 100644
index 8ccae1efa533d286827cd8b1685e25d868824a31..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/stepcounter.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/therml.png b/slides/wk07/img/behavior-change/therml.png
deleted file mode 100644
index 5a9f21011cb1aa7094d2980336e87a517cccdcb5..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/therml.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/ttc.png b/slides/wk07/img/behavior-change/ttc.png
deleted file mode 100644
index 85dbaecb8294e0d57642e8d402a40d88dfa92459..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/ttc.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/ubigreen-explained.png b/slides/wk07/img/behavior-change/ubigreen-explained.png
deleted file mode 100644
index 229ce0bfdc89411a311439c0697cbeacec400678..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/ubigreen-explained.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/ubigreen-sequence.png b/slides/wk07/img/behavior-change/ubigreen-sequence.png
deleted file mode 100644
index 87ba1b88ba963277fc93fbbf467885dee5ffcf2e..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/ubigreen-sequence.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/ubigreen-system.png b/slides/wk07/img/behavior-change/ubigreen-system.png
deleted file mode 100644
index 0883880cf4dc9b90d92e49d815c66ce89bf5febd..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/ubigreen-system.png and /dev/null differ
diff --git a/slides/wk07/img/behavior-change/ubigreen.png b/slides/wk07/img/behavior-change/ubigreen.png
deleted file mode 100644
index 5aac2bf2d689162115ee8c8d0f3565917733c826..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/behavior-change/ubigreen.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/buttons.png b/slides/wk07/img/interaction/buttons.png
deleted file mode 100644
index 26675f540854d26ee061fb0f9f81a46d9766ca14..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/buttons.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/chickens.png b/slides/wk07/img/interaction/chickens.png
deleted file mode 100644
index abe1ac534082651d0413623e7036a5bedd2ca672..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/chickens.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/cnn-small-x.png b/slides/wk07/img/interaction/cnn-small-x.png
deleted file mode 100644
index 7d5ee37abfc88bf5ed09597d3b5105c4b11a3994..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/cnn-small-x.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/desktop-new.png b/slides/wk07/img/interaction/desktop-new.png
deleted file mode 100644
index be7bbd22e62f47e2bca4ed24adaee67f1565ccb8..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/desktop-new.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/desktop.png b/slides/wk07/img/interaction/desktop.png
deleted file mode 100644
index dfc1e2e0dc980cf5aa5068ccc2d444bfdea374a6..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/desktop.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/feedforward.png b/slides/wk07/img/interaction/feedforward.png
deleted file mode 100644
index 20517d5296f0aacc0cd60dfe701fed9cc139ddee..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/feedforward.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/flat-doorknob.png b/slides/wk07/img/interaction/flat-doorknob.png
deleted file mode 100644
index b7fa0fcc0b4a0daed1e12d9f5fdb49318a4aed07..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/flat-doorknob.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/freezer-feedback.png b/slides/wk07/img/interaction/freezer-feedback.png
deleted file mode 100644
index d29834b5265e906ceb85481ad79082036120a25b..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/freezer-feedback.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/fridge-freezer-controls.png b/slides/wk07/img/interaction/fridge-freezer-controls.png
deleted file mode 100644
index 29d878c73d8c7f30e5d4127561505548b96082e5..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/fridge-freezer-controls.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/fridge-freezer-mental-model.png b/slides/wk07/img/interaction/fridge-freezer-mental-model.png
deleted file mode 100644
index 7eca6c06d956b7980b5281e76c1bbb41a27226a5..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/fridge-freezer-mental-model.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/fridge-freezer-valve.png b/slides/wk07/img/interaction/fridge-freezer-valve.png
deleted file mode 100644
index d367548be66857dc1edb0a88f5a0eb5e7307f16b..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/fridge-freezer-valve.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/gmail-snapping.gif b/slides/wk07/img/interaction/gmail-snapping.gif
deleted file mode 100644
index 66a17084941a6d03ad02d2dfa7b62446ec755b1d..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/gmail-snapping.gif and /dev/null differ
diff --git a/slides/wk07/img/interaction/gym-doors.png b/slides/wk07/img/interaction/gym-doors.png
deleted file mode 100644
index 99ffb06c3f14d3adee83426b9a59dc4b1291d8c6..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/gym-doors.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/knurling.png b/slides/wk07/img/interaction/knurling.png
deleted file mode 100644
index fa34dcaa22ec90dab6cab130a5170f94c616178c..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/knurling.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/mental1.png b/slides/wk07/img/interaction/mental1.png
deleted file mode 100644
index a3c23c4e46f70202c6a8117ed0607dc2f8e1f373..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/mental1.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/mental2.png b/slides/wk07/img/interaction/mental2.png
deleted file mode 100644
index 58c9cc1a547ec69cd2652c456c8cb040b5e6a0bd..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/mental2.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/mental3.png b/slides/wk07/img/interaction/mental3.png
deleted file mode 100644
index 07a7d35cca9dbe1309fe9c5809ce3ac2e2e684d6..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/mental3.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/mental4.png b/slides/wk07/img/interaction/mental4.png
deleted file mode 100644
index 1e40a86ffb987d0e45c5420bc8d87f34c46e62e0..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/mental4.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/mental5.png b/slides/wk07/img/interaction/mental5.png
deleted file mode 100644
index e8b861ac7042b4cc0b3bd2ab312ef120c1225564..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/mental5.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/mental6.png b/slides/wk07/img/interaction/mental6.png
deleted file mode 100644
index 5baea3ac170bd237ee0c35101160347918f32c04..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/mental6.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/mental7.png b/slides/wk07/img/interaction/mental7.png
deleted file mode 100644
index 9bb9a6c4bd2bf569e84b6de7d2d7e73f0e9ecc09..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/mental7.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/messenger-bubble.gif b/slides/wk07/img/interaction/messenger-bubble.gif
deleted file mode 100755
index 77defd497891e79a775a6ca3593cf33e02d2c890..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/messenger-bubble.gif and /dev/null differ
diff --git a/slides/wk07/img/interaction/norman-d-human-action-cycle.png b/slides/wk07/img/interaction/norman-d-human-action-cycle.png
deleted file mode 100644
index f5748a294e9e8786e3337bc8404b71364d1db0f9..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/norman-d-human-action-cycle.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/round-doorknob.png b/slides/wk07/img/interaction/round-doorknob.png
deleted file mode 100644
index 8413e79008f7f0537894d637cd1810b0b460239e..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/round-doorknob.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/search.png b/slides/wk07/img/interaction/search.png
deleted file mode 100644
index d5a1729071b75a1d9d7a57a6c7941c8ce6d405bb..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/search.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/sensor-explanation.png b/slides/wk07/img/interaction/sensor-explanation.png
deleted file mode 100644
index 54aabcd68aae660cd58fb7f222bccb24dd1ed0e5..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/sensor-explanation.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/sensor.jpg b/slides/wk07/img/interaction/sensor.jpg
deleted file mode 100644
index 34ae8df13304ec11c0b7739993c0d8f13d27ca90..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/sensor.jpg and /dev/null differ
diff --git a/slides/wk07/img/interaction/virtual-buttons.png b/slides/wk07/img/interaction/virtual-buttons.png
deleted file mode 100644
index 6e7cbd65b1a64b7e9ceec6e3f49a50868aedb17c..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/virtual-buttons.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/virtual-knurling.png b/slides/wk07/img/interaction/virtual-knurling.png
deleted file mode 100644
index c5e89ee2d5efdf43386d3fcdc9ba547592ce3ceb..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/virtual-knurling.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/web-button.png b/slides/wk07/img/interaction/web-button.png
deleted file mode 100644
index 1fa271f4371784721ce8b933ea09c800842ae15c..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/web-button.png and /dev/null differ
diff --git a/slides/wk07/img/interaction/webex.png b/slides/wk07/img/interaction/webex.png
deleted file mode 100644
index 2ab83c87aa26dfdafab3eff2e7e440e1eb574a72..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/interaction/webex.png and /dev/null differ
diff --git a/slides/wk07/img/menus/Edgewrite.png b/slides/wk07/img/menus/Edgewrite.png
deleted file mode 100644
index d667210ad2a378b2158d5ed08c97edb01efec834..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/Edgewrite.png and /dev/null differ
diff --git a/slides/wk07/img/menus/Grafitti.png b/slides/wk07/img/menus/Grafitti.png
deleted file mode 100644
index af6a460e7db587130d59a195b06160ceadbbef9d..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/Grafitti.png and /dev/null differ
diff --git a/slides/wk07/img/menus/alert.jpg b/slides/wk07/img/menus/alert.jpg
deleted file mode 100644
index 4fe4de37301fdc45319402cbaad9136cc8ea14ad..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/alert.jpg and /dev/null differ
diff --git a/slides/wk07/img/menus/alert1.jpg b/slides/wk07/img/menus/alert1.jpg
deleted file mode 100644
index f9a48ff3e25c781d6b98b566f1d325cf0084a514..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/alert1.jpg and /dev/null differ
diff --git a/slides/wk07/img/menus/facebook.png b/slides/wk07/img/menus/facebook.png
deleted file mode 100644
index 92d3ad836dedbe70081798da7ce6287a9097cbc6..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/facebook.png and /dev/null differ
diff --git a/slides/wk07/img/menus/facebook2.png b/slides/wk07/img/menus/facebook2.png
deleted file mode 100644
index f822bd03ce290e60d1f26fac0d3929c049b00958..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/facebook2.png and /dev/null differ
diff --git a/slides/wk07/img/menus/histogram.png b/slides/wk07/img/menus/histogram.png
deleted file mode 100644
index ddd96c9ea5ad7e74414f5bfd39e07df94914bbfd..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/histogram.png and /dev/null differ
diff --git a/slides/wk07/img/menus/menu.png b/slides/wk07/img/menus/menu.png
deleted file mode 100644
index 9116a28ebb90342f5fe20ad2d4f65de129cdd799..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/menu.png and /dev/null differ
diff --git a/slides/wk07/img/menus/menus-data.png b/slides/wk07/img/menus/menus-data.png
deleted file mode 100644
index f302bbe8693d7b7c6b7bee1b86bac38cceef22ac..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/menus-data.png and /dev/null differ
diff --git a/slides/wk07/img/menus/pie.jpg b/slides/wk07/img/menus/pie.jpg
deleted file mode 100644
index c8cf9639f66f1fda66da123cc15ed99b51689da5..0000000000000000000000000000000000000000
Binary files a/slides/wk07/img/menus/pie.jpg and /dev/null differ
diff --git a/slides/wk07/interaction.html b/slides/wk07/interaction.html
deleted file mode 100644
index 62124801a0d5feb3487345e5238559f80085d8a3..0000000000000000000000000000000000000000
--- a/slides/wk07/interaction.html
+++ /dev/null
@@ -1,535 +0,0 @@
----
-layout: presentation
-title: Interactive Application Design
-description: Description of principals for creating an understandable application
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Interactive Application Design
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout: false
-# Fitts' Law Revisited
-
-Example of how Marking Menus are used in practice (Maya)
-![:youtube Example of marking menu in Maya, r8PQy8cX9dc]
-
----
-# Fitts' Law Revisited
-
-.left-column-half[
-![:img CNN website marketing using a small x to close the pop up marketing that obscures the screen,85%](img/interaction/cnn-small-x.png)
-]
-
-.right-column-half[
-- Fitts' Law can be employed to help users be more productive by allowing them to interact with items easier.
-- How is the CNN marketing group using Fitts' law in this situation?
-]
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Design Principles and Metaphors
-
----
-layout: false
-
-# Hall of Shame/Hall of Fame
-
-.left-column[
-Is this physical or virtual? Ubicomp!
-
-![:img faucet with IR sensor, 110%](img/interaction/sensor.jpg )
-]
-
-.right-column[
-![:img Sign explaining how to use the sensor, 50%](img/interaction/sensor-explanation.png)
-]
-
-???
-
-- Realworld example, fails to work effectively.
-- Sign found right next to the fountain. Also sign on the fountain.
-- Good or bad example of interface design? Do you normally have to read instructions to use a water fountain?
-- What about an IR faucet?
-- Often, person using the interface feels stupid or that they shouldn't use it
-- Who can use your interface and who can't. As designers you have the power to make an interfaace usable.
-
-
----
-[//]: # (Outline Slide)
-# Today's goals
-
-- Metaphor
-- Creating good mental models
-- Design Tips for Interaction Design
- - Feedback
- - Feedforward
-
----
-# Metaphor
-
-.right-column[
-Lakoff & Johnson, Metaphors We Live By
-
-.quote[“...the way we think, what we experience,and what we do every day
-is very much a matter of metaphor.” ]
-]
----
-# Metaphor
-
-.left-column[
-![:img Picture of 4 chickens in a chicken coop,100%](img/interaction/chickens.png)
-]
-
-.right-column[
-
-Have you ever noticed how many chicken metaphors are in the English language?
-
-.font-small[
-- “A hen is only an egg's way of making another egg.” - Samuel Butler
-- “The key to everything is patience. You get the chicken by hatching the egg, not by smashing it.” - unknown
-- "Regard it as just as desirable to build a chicken house as to build a cathedral." - Frank Lloyd Wright
-- "A chicken in every pot" - 1928 Republican Party campaign slogan
-- "Don't have a pot to put it in" - 1928 Democratic Party response slogan
-- Nest egg - to save a little money each week
-- Scratching out a living - to earn enough to get by on
-- Don't count your chickens before they hatch - don't plan on an outcome before it actually happens.
-- Don't put all your eggs in one basket - don't plan on an outcome before it actually happens.
-- Feather your nest - saving for the future
-- Mother hen - very protective
-- Flew the coop - gone
-- Walking on eggshells- treading softly where certain people are concerned; trying not to upset someone
-- Like a chicken with it's head cut off - running around with no direction
-- You're chicken! - being afraid
-- Hard-boiled - tough attitude
-- Ruffle your feathers - something annoys you
-- No spring chicken - you're old. Plain and simple.
-- Hatch an idea - put a plan into motion
-- Pecking order - finding your place
-- Brood over it - to worry; to hover over a problem
-- Chicken scratch - poor handwriting
-- Stick your neck out - go to bat for someone else
-- Stuck in your craw - upset about something and won't verbalize what's going on inside you; carrying a grudge.
-- Bad egg - less than honest person; poor moral standards
-- In a stew - got yourself in trouble
-- Raise your hackle feathers - visibly annoyed
-- Nesting behavior- preparing a home (especially pregnant women just before a baby is due)
-- Empty nest syndrome - depression and loneliness when children leave home
-- Made from scratch - made from raw materials by hand
-]]
-
----
-# Desktop Metaphor (Magic Cap)
-.body[
-![:img Picture of a very literal desktop metaphor,60%](img/interaction/desktop.png)
-
-Critique!
-
-]
-???
-- Is this a good interface or not?
-- What are some of the challenges of this?
-  - Unwieldy,
-  - Not great use of screen real estate
-  - Other?
----
-# Are these better?
-
-.left-column-half[
-![:img Packard Bell Navigator Workspace interface,80%](http://pbclub.pwcsite.com/wiki/images/b/bd/Navigator_3.5.png)
-]
-
-.right-column-half[
-
-![:img Packard Bell Navigator Kidspace interface, 90%](https://external-preview.redd.it/e_qbSsuqodAhlG0h6C3tS5bRv4WbMrlDAQfwwyQdA8U.jpg?width=960&crop=smart&auto=webp&s=3f1618ae0182d466c146b90c7ff97ff434d4b58a)
-
-]
-
-.footnote[[Packard Bell Planet Wiki](http://pbclub.pwcsite.com/wiki/index.php/Packard_Bell_Navigator),
-[reddit](https://www.reddit.com/r/nostalgia/comments/6w951x/packard_bell_navigators_kidspace/)]
-
-
----
-# Is this a better option?
-
-.right-column-half[
-
-Can use metaphors to leverage existing conceptual models
-
-- Not really an attempt to simulate a real desktop
-- Leverages existing knowledge about files, folders, trash
-- A way to explain why some windows seem blocked
-]
-
-.left-column-half[
-![:img Jens Mac desktop, 90%](img/interaction/desktop-new.png)
-]
-
----
-# How else can we minimize errors?
-???
-Key concept: mental models
----
-.left-column[
-# Every system has at least 3 different models
-]
-
-.right-column[
-<div class="mermaid">
-graph TD
-  S[System Image: <br>Your Implementation&nbsp;] --> |System Feedback&nbsp;| U[User Model: How the user thinks&nbsp; <br>the system works]
-  D[Design Model: How you <br>intend the system to work&nbsp;]-->S
-  U -->|User Feedback&nbsp;| S
-</div>
-
-]
-
----
-# Relating the Human and the Interaction
-
-
-
-.left-column-half[
-
-![img: Gym doors with few affordances of where you can open them and whether there is an accessible way to use the doors,10%](img/interaction/gym-doors.png)
-
-]
-
---
-
-.right-column-half[
-![img: Don Norman's Human Action Cycle,10%](img/interaction/norman-d-human-action-cycle.png)
-]
-
-.footnote[[Don Norman, When Three World Collide: A model of the Tangible Interaction Process, 2009](https://www.researchgate.net/publication/221332102_When_three_worlds_collide_A_model_of_the_tangible_interaction_process)]
-
-???
-Note to instructors: Need to change image  to mermaid
-
-
----
-# Relating the Human and the Interaction
-
-
-.left-column-half[
-<br>
-<br>
-
-**Gulf of Execution** is the user's belief in functions the system _doesn't have_
-  - This is the users 'error' region
-
-**Gulf of Evaluation** is where the user _doesn't realize the system HAS a functionality_.
-]
-
-
-.right-column-half[
-![img: Don Norman's Human Action Cycle,10%](img/interaction/norman-d-human-action-cycle.png)
-]
-
----
-
-# Model of Mental Models
-
-![:img A box showing the design (white),50%](img/interaction/mental1.png)
-
----
-# Model of Mental Models
-
-![:img A box showing the design (white) and actual function (blue missing a little bit of the white),50%](img/interaction/mental2.png)
-
----
-# Model of Mental Models
-
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System Functionality",50%](img/interaction/mental3.png)
-
----
-# Model of Mental Models
-
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System Functionality",50%](img/interaction/mental4.png)
-
-
----
-# Model of Mental Models
-
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System
-Functionality" a dark blue cloud labeled "Occasionally Used Part of
-System Functionality" around the user's well understood region,50%](img/interaction/mental5.png)
-
----
-# Model of Mental Models
-
-.left-column50[
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System
-Functionality" a dark blue cloud labeled "Occasionally Used Part of
-System Functionality" around the user's well understood region and
-another cloud further out with errors (regions outside the blue system
-box) labeled "Users full model of what the system does",100%](img/interaction/mental6.png)
-
-]
-
-.right-column50[
-- Where are the gulf of evaluation and gulf of execution in this
-  image?
-]
-
---
-.right-column50[
-- Gulf of execution is the user 'error' region (user requests
-  function the __system DOESNT HAVE__), gulf of
-  evaluation is when the user __doesn't realize the system HAS a
-  functionality__.
-
-- How does an undo feature help the user bridge them?
-]
----
-# Model of Mental Models
-
-What happens when the user does something they think is core but is really not supported?
-
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System
-Functionality" a cloud further out with errors (regions outside the blue system
-box) and an arrow pointing from the part they really understand to the part outside
-of the application,50%](img/interaction/mental7.png)
-
---
-
-.right-column50[
-- Need to undo!
-]
-
-
----
-# Refridgerator/Freezer Example
-
-.left-column[
-<div class="mermaid">
-  graph LR
-  F[Freezer<br><br>]
-  Fr[Fridge&nbsp;<br><br><br><br><br><br><br><br>]
-
-</div>
-]
-
-.right-column[
-Problem:
-- Freezer too cold
-- Fridge just right
-]
-
----
-# Refridgerator/Freezer Goal
-.left-column-half[
-![img: Freezer controls and instructions on how to set temperatures,70%](img/interaction/fridge-freezer-controls.png)
-]
-
---
-
-.right-column-half[
-Goal:
-- Want to make the freezer warmer
-- Want the refridgerator to stay the same temperature
-]
-
-.footnote[Don Norman, Design of Everyday Things]
-
----
-
-# Refridgerator/Freezer Mental Model
-.left-column-half[
-![img: Mental model of how to set the fridge and freezer temperatures,70%](img/interaction/fridge-freezer-mental-model.png)
-]
-
---
-
-.right-column-half[
-Mental model:
-- Fridge control controls fridge temperature
-- Freezer control controls freezer temperature
-]
-
-.footnote[Don Norman, Design of Everyday Things]
-
----
-# Refridgerator/Freezer System Model
-.left-column-half[
-![img: System model of how to set the fridge and freezer temperatures,70%](img/interaction/fridge-freezer-valve.png)
-]
-
-.right-column-half[
-Valve controls the flow of cold air from one cooling unit.
-]
-
-.footnote[Don Norman, Design of Everyday Things]
----
-# Refridgerator/Freezer Feedback
-.left-column-half[
-![img: It takes 24 hours to get the feedback that new settings worked,70%](img/interaction/freezer-feedback.png)
-]
-
-.right-column-half[
-24 HOURS?!??!
-]
-
-.footnote[Don Norman, Design of Everyday Things]
----
-
-Design Tip #1: Consistency is Critical
-
-.left-column[
-What mental model error is this likely to create?
-]
-
-.right-column[
-![:img a screenshot from WebEx. Weve selected “Do not record a
-teleconference” but to continue we have to hit the “Start Recording”
-button. So we have a conflict in the mental model
-here.,60%](img/interaction/webex.png)
-]
-
----
-# Causes of Gulf of Evaluation
-
-What can cause a user's Gulf of Evaluation?
-
---
-- Hard to understand visual feedback
-- Poor use of colors
-- Bad layout, poor grouping
-- Unfamiliar display of information
-- Unfamiliar design patterns, or doesn’t follow convention
-- Forcing people to remember lots of things
-- Lack of feedback in response to inputs
-- Might not see visual updates
-- Can’t find info on screen
-- Might look same as unimportant
-- Irrelevant info on screen / important info missing
-
-???
-Recall: the user _doesn't realize the system HAS a functionality_.
-
----
-# Causes of Gulf of Execution
-
-What can cause a user's Gulf of Execution?
-
---
-- Unfamiliar devices and inputs
-- Don’t know what is possible
-- Unfamiliar GUI components
-- Solvable with experience
-- Unfamiliar interaction patterns
-- Also solvable with experience
-- Example patterns: Dialogs, Shopping Carts
-
-???
-Recall: the user's belief in functions the system _doesn't have_
-
----
-# Affordances
-
-Good Affordance| Bad Affordance
-----|----
-![:img Picture of a round doorknob, 40%](img/interaction/round-doorknob.png) | ![:img Picture of a flat doorknob, 40%](img/interaction/flat-doorknob.png)
-
-Well-designed objects have affordances
-- Clues to their operation that are readily apparent
-- Often visual, but not always (e.g., speech)
-- Allows and promotes certain actions
-
-
-???
-Opportunities to act which are readily apparent to the user ... and
-appropriate to the user’s abilities
-
-Form “affords” certain actions and makes that apparent
----
-Design Tip #2: Use *Affordances* to minimize errors
-
-Action | Physical Affordance | Virtual Affordance |  Minimal Design
-----|----|----|----
-Gripping | ![:img picture of knurling on a knob,45%](img/interaction/knurling.png) | ![:img Image of lines indicating a grabbable corner by imitating knurling,50%](img/interaction/virtual-knurling.png)
-Pushing | ![:img picture of buttons on a phone,55%](img/interaction/buttons.png) | ![:img Similar buttons on a webpage,55%](img/interaction/virtual-buttons.png)|![:img picture of web buttons on a flat-style page,55%](img/interaction/web-button.png)
-Search | ![:img magnifying glass](https://upload.wikimedia.org/wikipedia/commons/thumb/8/87/Magnifying_glass_icon_mgx2.svg/200px-Magnifying_glass_icon_mgx2.svg.png) || ![:img Text area for search. Uses greyed out text to suggest what should go in it, 55%](img/interaction/search.png)
-
-
-???
-Knurling: increases friction/affords gripping
-
-don't kneed to know the word to get it
-
----
-Design Tip #3: Make the Conceptual Model Visible
-
-Explicitly design a conceptual model
-
-Use affordance and feedback (and everything else you have) to reinforce it
-
----
-# Feedback
-
-Response by the system to the actions of the user – Cause and effect
-
-Essential for forming mental models
-
-Makes “system state” visible
-
-Messenger Feedback | and | Gmail Feedback
-----|----|----
-![:img Facebook messenger showing feedback as the user clicks on the thumbs up button](img/interaction/messenger-bubble.gif)||![:img User selecting and dragging two conversations in gmail with feedback,50%](img/interaction/gmail-snapping.gif)
-]
-
----
-# Feed Forward
-
-.right-column[
-What will happen if you execute action
-- Ex. Web page mouseover
-- Ex. Word processing I-bar
-- Ex. Label on a button
-
-Help people predict what will happen
-- Need feedforward at all scales
-- GUI widgets will handle basic feedforward
-- Don’t forget feedforward for screens
-]
-
-.left-column[
-![:img Picture of two icons showing additional visual feedback when the cursor hovers over them, 70%](img/interaction/feedforward.png)
-]
-
----
-# Revisit: What is this an example of?
-
-.left-column[
-Is this physical or virtual? Ubicomp!
-
-![:img faucet with IR sensor, 110%](img/interaction/sensor.jpg )
-]
-
-.right-column[
-![:img Sign explaining how to use the sensor, 50%](img/interaction/sensor-explanation.png)
-]
----
-# Application Design Tips
-
-- Design Tip #1: Consistency is Critical
-- Design Tip #2: Use *Affordances* to minimize errors
-- Design Tip #3: Make the Conceptual Model Visible
diff --git a/slides/wk07/menus.html b/slides/wk07/menus.html
deleted file mode 100644
index e11bc0995ffa85bfb642245384168fa3a13d4823..0000000000000000000000000000000000000000
--- a/slides/wk07/menus.html
+++ /dev/null
@@ -1,872 +0,0 @@
----
-layout: presentation
-title: Interaction Technique Design --Week 7, Wednesday--
-description: Description of Interaction Technique Design
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-layout:false
-
-# Why is selection (and testing) important .red[*]
-.left-column50[
-
-![:img False alarm in hawaii that led everyone to think there wsa a nuclear event, 75%](img/menus/alert1.jpg)
-]
---
-.right-column50[
-![:img Screen showing what led to this error, 85%](img/menus/alert.jpg)
-]
-
-.footnote[.red[*] [Washington Post Article](https://www.washingtonpost.com/news/morning-mix/wp/2018/01/16/that-was-no-wrong-button-in-hawaii-take-a-look/?utm_term=.1848969db923)
-]
----
-class: center, middle, inverse
-
-# Interaction Technique Design
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout: false
-
-[//]: # (Outline Slide)
-# Today's Agenda
-- Administrivia
-  - ColorPicker due at 10pm
-  - Practice quizzes (there are 2) due Wednesday 10pm
-  - Menus to be released tonight
-  - Examlet Friday
-- Introducing key concepts for menus assignment
-- Using key properties of people to predict design outcomes
-
----
-# Menus Assignment
-
-Goal: to compare pie menus, linear menus, and a custom menu you make!
-
-We provide support for running the experiment in MainActivity (and a testing harness in TestActivity)
-
-You implement a variety of menus
-
----
-# Menus Assignment
-
-<div class="mermaid">
-classDiagram
-
-class MenuExperimentView {
-  onTouchEvent()
-  startSelection()
-  endSelection()
-  updateModel()
-  onDraw()
-}
-
-
-AbstractMenuExperimentView <|-- MenuExperimentView
-
-AbstractMainActivity <|-- MainActivity
-AbstractMainActivity <|-- TestActivity
-MenuExperimentView <|-- PieMenuView
-MenuExperimentView <|-- NormalMenuView
-MenuExperimentView <|-- CustomMenuView
-
-
-</div>
-
----
-
-# What is a Menu in theory?
-
-???
-- Supports selection of an item from a fixed set of options
-- Options are set and determined in advance
-- Typically used for “commands” (verbs, things to do)
-- Occasionally for selecting a value (e.g., picking a font)
-
---
-.left-column-half[
-- Supports selection of an item from a fixed set of options
-- Options are set and determined in advance
-- Typically used for “commands” (verbs, things to do)
-- Occasionally for selecting a value <br> (e.g., picking a font)
-]
---
-<div class="mermaid">
-graph TD
-S((.)) --> A(Start)
-A -- "Press?startSelection()" --> I(Selecting)
-I -- "Release:endSelection()" --> E[End]
-I -- "Drag:updateModel()" --> I
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-class S invisible
-class A start
-class E finish
-class I normal
-</div>
-
-???
-
-Implemented in MenuExperimentView
-
-Works in all Menus!
-
----
-
-# What is a Menu in theory?
-
-.left-column-half[
-- Supports selection of an item from a fixed set of options
-- Options are set and determined in advance
-- Typically used for “commands” (verbs, things to do)
-- Occasionally for selecting a value <br> (e.g., picking a font)
-
-Implemented in MenuExperimentView
-
-Works in all Menus!
-]
-
-<div class="mermaid">
-graph TD
-S((.)) --> A(Start)
-A -- "Press?startSelection()" --> I(Selecting)
-I -- "Release:endSelection()" --> E[End]
-I -- "Drag:updateModel()" --> I
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-class S invisible
-class A start
-class E finish
-class I normal
-</div>
-
-
----
-# Aside: Enums
-
-.left-column-half[
-Group of named constants
-
-- Used for PPS in ColorPicker (PPS States; Essential Geometry)
-
-- Used for PPS in Menu assignment *and* for experimental conditions
-
-- Easy to inspect if you want to (can use to determine possible states, number items, etc)
-
-[Documentation](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)
-]
-.right-column-half[
-<div class="mermaid">
-classDiagram
-
-class TaskType {
-  LINEAR
-  RELATIVE
-  UNCLASS
-}
-
-class State {
-  START
-  SELECTING
-}
-
-class MenuType {
-  NORMAL
-  PIE
-  CUSTOM
-}
-
-</div>
-
-]
-
----
-# How do we draw a menu?
-
-.left-column30[
-<br>
-<div class="mermaid">
-classDiagram
-
-MenuExperimentView <|.. PieMenuView :  onDraw translates  and calls drawMenu
-
-class PieMenuView {
-  Canvas: 0,0 at first touch point.
-  Clipping rect: Whole screen
-  drawMenu()
-}
-
-class MenuExperimentView {
-   Canvas : 0,0 at top left of screen;
-   Clipping rect: Whole screen
-   onDraw() translate
-}
-</div>
-]
-
-.right-column60[
-- Important! MenuExperimentView set to `MATCH_PARENT`
-  - Makes drawing tricky!
-- Translate (like a parent view does for children)
-- `onDraw` in `MenuExperimentView` calls `drawMenu` in child classes.
-]
-
---
-.right-column60[
-
-Do we have to rotate/translate the `Canvas` back?
-]
-
---
-
-.right-column60[
-We don't strictly have to rotate or translate back because this is
-an inheritance drawing trick, not an interactor hierarchy drawing implementation
-]
-
----
-# Aside: Custom Listeners
-
-- Used in ColorPicker and Menus
-
-- Why create custom listeners?
-
---
- - Lets you execute code when the view's model has changed
- - No other way to know that has happened
-
----
-# Review: How to implement custom listeners
-
-The Custom View needs to
-- define the custom interface
-- keep track of listeners
-
---
-Anything *using* the view needs to
-- implement the interface (specifically, the method in that interface that will be called)
-- register itself as a listener with the view
-
----
-# Example Custom View -- ColorPicker
-
-In ColorPicker, we setup the Custom View side for you
-
-```java
-    // Currently registered ColorListener instance or null.
-    private List<ColorChangeListener> mColorChangeListeners;
-
-    // Class which defines a listener to be called when a new color is selected.
-    public interface ColorChangeListener {
-        void onColorSelected(@ColorInt int color);
-    }
-
-    // Registers a new listener
-    public final void addColorChangeListener(@NonNull ColorChangeListener colorChangeListener) {
-        mColorChangeListeners.add(colorChangeListener);
-    }
-```
-
----
-# Example Custom Listener -- ColorPicker:
-
-You implemented this
-
-.left-column-half[
-```
-// TODO: Register callback to update {color,label}
-// View when color changed.`
-```
-
-What method do we call to register the callback?  <br>`addColorChangeListener()`
-
-]
-.right-column-half[
-<div class="mermaid">
-classDiagram
-MainActivity ..> ColorPickerView : addColorChangeListener()
-MainActivity --> ColorChangeListener : Contains
-class ColorChangeListener {
-  onColorChanged()
-}
-class ColorPickerView {
-  addColorChangeListener()
-}
-class MainActivity {
-  ColorPickerView view
-}
-
-</div>
-]
----
-# Example Custom Listener -- ColorPicker:
-
-You implemented this
-
-.left-column-half[
-```
-// TODO: Register callback to update {color,label}
-// View when color changed.`
-```
-
-What method do we call to register the callback?  `addColorChangeListener()`
-
-What do we usually do in a callback? <br>update application's (`MainActivity`) model
-]
-.right-column-half[
-<div class="mermaid">
-classDiagram
-ColorPickerView ..> ColorChangeListener : onColorChanged()
-ColorChangeListener ..> MainActivity : update model
-
-class ColorChangeListener {
-  onColorChanged()
-}
-
-class MainActivity {
-  ColorPickerView view
-}
-</div>
-]
-
----
-# You will do this yourself in Menus
-
-```java
-// TODO: register a new listener with the menu so that the application knows when a selection is made
-
-// TODO: implement the listener. When the user completes a trial, the menu listener should store
-// the results of the trial, and setup for the next trial
-```
-
----
-class: center, middle, inverse
-
-# Experimenting with Interfaces
-
-Important part of building interfaces is experimenting
-
-Need structured ways to decide what's better
-
----
-# Experiments should be tied to *hypotheses* based on *theories* what will go better
-
-- Fitts Law (compare distance and size; check for infinite size)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- Gestalt Psychology (will they see it at all?)
-- Errors (will they be reduced)
-
-???
-why theory and not intuition?
-
----
-# Which is better and which laws explain it?
-.left-column50[
-## A. Pie Menu
-![:img Pie Menu, 80%](img/menus/pie.jpg)
-]
-.right-column50[
-## B. Pull down Menu
-![:img Traditional Menu inside a web browser, 80%](img/menus/menu.png)
-]
-???
-
-What analysis methods can we use to predict?
-
-- Fitts Law (compare distance and size; check for infinite size)
-- *Steering Law* (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- Gestalt Psychology (will they see it at all?)
-- Errors (will they be reduced)
-
----
-# Steering Law (based on Fitts' law)
-.left-column50[
-## A. Pie Menu
-![:img Pie Menu, 80%](img/menus/pie.jpg)
-]
-.right-column50[
-## B. Pull down Menu
-![:img Traditional Menu inside a web browser, 80%](img/menus/menu.png)
-]
-
----
-# Which is better and which law explains it?
-.left-column50[
-## A. Pie Menu
-![:img Pie Menu, 80%](img/menus/pie.jpg)
-]
-.right-column50[
-## B. Marking Menu
-![:youtube Video assigned before class, 8c58bN6ajJ4?t=30]
-]
-???
-
-- Fitts Law (compare distance and size; check for infinite size)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - **Does someone have to 'check' something? More than once?**
- - **Do they have to move? More than once**
-- Gestalt Psychology (will they see it at all?)
-- Errors (will they be reduced)
----
-# Cognitive modeling (less double checking)
-
-.left-column50[
-## A. Pie Menu
-![:img Pie Menu, 80%](img/menus/pie.jpg)
-]
-.right-column50[
-## B. Marking Menu
-![:youtube Video assigned before class, 8c58bN6ajJ4?t=30]
-]
-
----
-# Which is better and which laws explain it?
-
-A: Tapping &nbsp;&nbsp; B: Crossing
-![:youtube Video of using crossing for selection, kp2Zl4ONuik]
-
-???
-
-- **Fitts Law (compare distance and size; check for infinite size)**
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- Gestalt Psychology (will they see it at all?)
-- Errors (will they be reduced)
-
----
-# Fitts' Law (infinite width)
-
-A: Tapping &nbsp;&nbsp; B: Crossing
-![:youtube Video of using crossing for selection, kp2Zl4ONuik]
-
----
-# Which is better and which laws explain it?
-.left-column50[
-## A.
-
-![:img Picture of the Graffiti gesture recognition alphabet from the Palm Pilot, 100%](img/menus/Grafitti.png)
-]
-.right-column50[
-## B.
-
-![:img Picture of the Edgewrite gesture recognition alphabet, 50%](img/menus/Edgewrite.png)
-
-]
-???
-
-- Fitts Law (compare distance and size; check for infinite size)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- Gestalt Psychology (will they see it at all?)
-- **Errors (will they be reduced)**
----
-# Errors (better physical feedback during motor task)
-
-.left-column50[
-## A.
-
-![:img Picture of the Graffiti gesture recognition alphabet from the Palm Pilot, 100%](img/menus/Grafitti.png)
-]
-.right-column50[
-## B.
-
-![:img Picture of the Edgewrite gesture recognition alphabet, 50%](img/menus/Edgewrite.png)
-
-]
-
----
-# Which is better and which laws explain it?
-
-.left-column50[
-## A.
-![:img Old facebook security page with icons and text mixed
-up,80%](img/menus/facebook.png)
-]
-.right-column50[
-## B.
-
-![:img March 2019 facebook security page with icons and
-text clearly aligned, 80%](img/menus/facebook2.png)
-]
-???
-
-- Fitts Law (compare distance and size; check for infinite size)
-- Steering Law (distance and size over a path)
-- Cognitive modeling (complex multi-step model of expert behavior)
- - Does someone have to 'check' something? More than once?
- - Do they have to move? More than once
-- **Gestalt Psychology (group?)**
-- **Errors (will they be reduced)**
----
-# Gestalt Psychology (better grouping strategies)
-
-.left-column50[
-## A.
-![:img Old facebook security page with icons and text mixed
-up,80%](img/menus/facebook.png)
-]
-.right-column50[
-## B.
-
-![:img March 2019 facebook security page with icons and
-text clearly aligned, 80%](img/menus/facebook2.png)
-]
-
----
-# Back to comparing menus
-
-Kurtenbach: What did they study here?
-
-![:youtube Illustration of advantages of marking menus,dtH9GdFSQaw]
-
----
-# How do we prove our theories? Hypothesis
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis(Hypothesis)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis start
-</div>
-
-Discuss
-
---
-
-Marking Menus are better than Pie Menus
-
---
-Marking Menus are *faster* than Pie Menus
-
---
-Pie Menus are faster than Linear Menus for less than 8 items that have no obvious order
-
----
-.left-column-half[
-# What conditions does this experiment have?
-
-
-`MenuType`
-
-`TaskType` (could be a condition)
-]
-.right-column-half[
-# What might we measure? (from POP-Motor)
-]
---
-.right-column-half[
-- Time on Task
-- Accuracy
-- How strenuous
-- Recall
-- Emotional Response
-
-]
-
-<!-- --- -->
-<!-- # Classes that handle experimentation -->
-
-<!-- We provide most of the implementation for this -->
-
-<!-- <div class="mermaid"> -->
-<!-- classDiagram -->
-
-<!-- class MainActivity { -->
-<!--   showMenuForTrial() -->
-<!-- } -->
-<!-- class AbstractMainActivity { -->
-<!--   clearCSV() -->
-<!-- } -->
-<!-- class MainActivity { -->
-<!--   showMenuForTrial() -->
-<!-- } -->
-<!-- class TestActivity { -->
-<!--   showMenu() -->
-<!-- } -->
-
-<!-- class TrialListener { -->
-<!--   onTrialCompleted() -->
-<!-- } -->
-
-<!-- AbstractMainActivity <|-- MainActivity -->
-<!-- AbstractMainActivity <|-- TestActivity -->
-
-<!-- class ExperimentSession { -->
-<!--  createTrials() -->
-<!--  getNext() -->
-<!--  next() -->
-<!-- } -->
-
-<!-- </div> -->
-
-
----
-# How do we prove our theories? Method
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis(Hypothesis)
-Hypothesis -- "Study Design" --> Method(Method)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis start
-class Method normal
-</div>
-
-Compare specific conditions
-
-| MenuType | 8 items | 12 items |
-|----------|---------|----------|
-| Linear   |         |          |
-| Pie      |         |          |
-| Marking  |         |          |
-
-What if we wanted to do length AND ordered vs not?
-
-Want to consider every combination, or run twice (menuType x length and menuType x ordering)
-
----
-# How do we prove our theories? Data
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis(Hypothesis)
-Hypothesis -- "Study Design" --> Method(Method)
-Method -- "Run Study" --> Data(Data)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis start
-class Method,Data normal
-</div>
-
-What might we want to measure?
-
---
-- Time on task -- how long to complete basic tasks? (For example, find something to buy, create a new account, and order the item.)
-
---
-- Accuracy -- How many mistakes did people make? (And were they fatal or recoverable with the right information?)
-
---
-- How strenuous (e.g. gaze has lower throughput but is less strenuous than head pointing (Mackenzie 2018)
-
---
-- Recall -- How much does the person remember afterwards or after periods of non-use?
-
---
-- Emotional Response -- How does the person feel about the tasks completed? (Confident? Stressed? Would the user recommend this system to a friend?)
-
-???
-Build up a list of good UI design principals from these basics
-
-Undo
-Predictability
-... What is missing? (e.g. fun)
----
-# How to get such data?
-
-- Video
-- Timestamps
-- Notes
-- Can transcribe and analyze interviews with users
-- Can look for patterns across users
-
----
-# How do we prove our theories? Analysis
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis(Hypothesis)
-Hypothesis -- "Study Design" --> Method(Method)
-Method -- "Run Study" --> Data(Data)
-Data -- "Clean and Prep" --> Analysis(Analysis)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis start
-class Method,Data,Analysis normal
-</div>
-
-![:img sample data from the menus experiement, 80%](img/menus/menus-data.png)
-
----
-# How do we prove our theories? Conclusions
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis(Hypothesis)
-Hypothesis -- "Study Design" --> Method(Method)
-Method -- "Run Study" --> Data(Data)
-Data -- "Clean and Prep" --> Analysis(Analysis)
-Analysis --> Conclusions(Conclusions)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-linkStyle 4 stroke-width:4px;
-
-class S invisible
-class Hypothesis,Conclusions start
-class Method,Data,Analysis normal
-</div>
-
-![:img sample data from the menus experiement, 30%](img/menus/histogram.png)
-
-
-
----
-# Design an experiment
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis(Hypothesis)
-Hypothesis -- "Study Design" --> Method(Method)
-Method -- "Run Study" --> Data(Data)
-Data -- "Clean and Prep" --> Analysis(Analysis)
-Analysis --> Conclusions(Conclusions)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-linkStyle 4 stroke-width:4px;
-
-class S invisible
-class Hypothesis,Conclusions start
-class Method,Data,Analysis normal
-</div>
-
-.left-column50[
-## A.
-![:img Picture of the Graffiti gesture recognition alphabet from the Palm Pilot, 100%](img/menus/Grafitti.png)
-]
-.right-column50[
-## B.
-![:img Picture of the Edgewrite gesture recognition alphabet, 50%](img/menus/Edgewrite.png)
-]
-
-???
-Hypothesis: Errors (will they be reduced)
-Method:??
-Data:??
-Analysis??
-Conclusions??
-
----
-# Design an experiment
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis(Hypothesis)
-Hypothesis -- "Study Design" --> Method(Method)
-Method -- "Run Study" --> Data(Data)
-Data -- "Clean and Prep" --> Analysis(Analysis)
-Analysis --> Conclusions(Conclusions)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-linkStyle 4 stroke-width:4px;
-
-class S invisible
-class Hypothesis,Conclusions start
-class Method,Data,Analysis normal
-</div>
-
-.left-column50[
-## A. Pie Menu
-![:img Pie Menu, 80%](img/menus/pie.jpg)
-]
-.right-column50[
-## B. Pull down Menu
-![:img Traditional Menu inside a web browser, 80%](img/menus/menu.png)
-]
-
-???
-
-Hypothesis: Errors will be reduced;
-Hypothesis: Motion will be faster due to low level motor things
-Hypothesis: fewer cognitive checks needed
-Method:??
-Data:??
-Analysis??
-Conclusions??
diff --git a/slides/wk07/slides22 - persuasive tech copy.pdf b/slides/wk07/slides22 - persuasive tech copy.pdf
deleted file mode 100644
index 6eaf11a25a0f3b1e404c2eb54823c09b195efdb3..0000000000000000000000000000000000000000
Binary files a/slides/wk07/slides22 - persuasive tech copy.pdf and /dev/null differ
diff --git a/slides/wk08/img/studies/chart.png b/slides/wk08/img/studies/chart.png
deleted file mode 100644
index 51340bdc387fdb4390c0dc45310c8c853a29ea6a..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies/chart.png and /dev/null differ
diff --git a/slides/wk08/img/studies/import.png b/slides/wk08/img/studies/import.png
deleted file mode 100644
index a8e25213ae79c9f00bb100df23d69fa375602803..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies/import.png and /dev/null differ
diff --git a/slides/wk08/img/studies/raw.png b/slides/wk08/img/studies/raw.png
deleted file mode 100644
index 369cb3f5dfd935cc8f5c8bd32592cd67627e3001..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies/raw.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/cagelation.png b/slides/wk08/img/studies2/cagelation.png
deleted file mode 100644
index 2e41c1d7acd62d868f2df55f859d29fd9fb73bfe..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/cagelation.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/chart.png b/slides/wk08/img/studies2/chart.png
deleted file mode 100644
index 51340bdc387fdb4390c0dc45310c8c853a29ea6a..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/chart.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/correlation-cartoon.png b/slides/wk08/img/studies2/correlation-cartoon.png
deleted file mode 100644
index 1242708b466c0531b9effa97b1a572c70e044d2f..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/correlation-cartoon.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/correlation-demo.png b/slides/wk08/img/studies2/correlation-demo.png
deleted file mode 100644
index c28ef774a0faf9eb1501765e37934af5674713b1..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/correlation-demo.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/correlation.png b/slides/wk08/img/studies2/correlation.png
deleted file mode 100644
index c69cafbf23b3485a7c324f03ea4a19ce20e85e4a..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/correlation.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/histogram.png b/slides/wk08/img/studies2/histogram.png
deleted file mode 100644
index 6f7e8740d3aa89ea7208ad05269baf77df275f25..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/histogram.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/normal-only.png b/slides/wk08/img/studies2/normal-only.png
deleted file mode 100644
index a699b9b891468b7eb9e624d6f630908fc60df575..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/normal-only.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/pie-only.png b/slides/wk08/img/studies2/pie-only.png
deleted file mode 100644
index b9ec62ba9f84f0178670efd4e34c5b436b7a4488..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/pie-only.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/pivot1.png b/slides/wk08/img/studies2/pivot1.png
deleted file mode 100644
index bca708fc3cd0e423730c0035e723a48999a08cd7..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/pivot1.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/pivot2.png b/slides/wk08/img/studies2/pivot2.png
deleted file mode 100644
index 097489384473e677bf085338864849c35fcc3300..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/pivot2.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/priors.png b/slides/wk08/img/studies2/priors.png
deleted file mode 100644
index 780996fe4bd6e438d726e9ba3b13f7dcc48ab919..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/priors.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/samples1.png b/slides/wk08/img/studies2/samples1.png
deleted file mode 100644
index 49501eff4390ef68cf89dcc87031daece7975bea..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/samples1.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/samples2.png b/slides/wk08/img/studies2/samples2.png
deleted file mode 100644
index 7964a305be364fdd74536c64219dfdfbc0e281d7..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/samples2.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/samples3.png b/slides/wk08/img/studies2/samples3.png
deleted file mode 100644
index 386bfcdd2dc112661ae57d9f1ea603ddbac4211f..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/samples3.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/samples4.png b/slides/wk08/img/studies2/samples4.png
deleted file mode 100644
index c7964ba49e0f2a6daa9437d6dfb2da9e29ea37e8..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/samples4.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/samples5.png b/slides/wk08/img/studies2/samples5.png
deleted file mode 100644
index 386bfcdd2dc112661ae57d9f1ea603ddbac4211f..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/samples5.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/samples6.png b/slides/wk08/img/studies2/samples6.png
deleted file mode 100644
index a0c4949d6f4f5ef9623036312aaf19f4fb6b718a..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/samples6.png and /dev/null differ
diff --git a/slides/wk08/img/studies2/samples7.png b/slides/wk08/img/studies2/samples7.png
deleted file mode 100644
index c34a788058ea4c3f244c3e7c03684dd6d2b27594..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/studies2/samples7.png and /dev/null differ
diff --git a/slides/wk08/img/undo/callbacks.png b/slides/wk08/img/undo/callbacks.png
deleted file mode 100644
index 72147534bc5ba07de7a95ffe479f5505d65814f4..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/callbacks.png and /dev/null differ
diff --git a/slides/wk08/img/undo/callbacks2.png b/slides/wk08/img/undo/callbacks2.png
deleted file mode 100644
index 37eeff1f958d4f711faf7ce2af0ceb9736121957..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/callbacks2.png and /dev/null differ
diff --git a/slides/wk08/img/undo/callbacks3.png b/slides/wk08/img/undo/callbacks3.png
deleted file mode 100644
index c7c5e1de7d5c73ca13b8e95df99735ce5aeec7fa..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/callbacks3.png and /dev/null differ
diff --git a/slides/wk08/img/undo/flatland-roads.png b/slides/wk08/img/undo/flatland-roads.png
deleted file mode 100644
index 77655503c0c8225654cb4f6422960727363bcfd4..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/flatland-roads.png and /dev/null differ
diff --git a/slides/wk08/img/undo/flatland.png b/slides/wk08/img/undo/flatland.png
deleted file mode 100644
index 60c84737008f5acfa50d6a39be07a439ef2fc372..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/flatland.png and /dev/null differ
diff --git a/slides/wk08/img/undo/gym-doors.png b/slides/wk08/img/undo/gym-doors.png
deleted file mode 100644
index 99ffb06c3f14d3adee83426b9a59dc4b1291d8c6..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/gym-doors.png and /dev/null differ
diff --git a/slides/wk08/img/undo/mental1.png b/slides/wk08/img/undo/mental1.png
deleted file mode 100644
index a3c23c4e46f70202c6a8117ed0607dc2f8e1f373..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/mental1.png and /dev/null differ
diff --git a/slides/wk08/img/undo/mental2.png b/slides/wk08/img/undo/mental2.png
deleted file mode 100644
index 58c9cc1a547ec69cd2652c456c8cb040b5e6a0bd..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/mental2.png and /dev/null differ
diff --git a/slides/wk08/img/undo/mental3.png b/slides/wk08/img/undo/mental3.png
deleted file mode 100644
index 07a7d35cca9dbe1309fe9c5809ce3ac2e2e684d6..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/mental3.png and /dev/null differ
diff --git a/slides/wk08/img/undo/mental4.png b/slides/wk08/img/undo/mental4.png
deleted file mode 100644
index 1e40a86ffb987d0e45c5420bc8d87f34c46e62e0..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/mental4.png and /dev/null differ
diff --git a/slides/wk08/img/undo/mental5.png b/slides/wk08/img/undo/mental5.png
deleted file mode 100644
index e8b861ac7042b4cc0b3bd2ab312ef120c1225564..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/mental5.png and /dev/null differ
diff --git a/slides/wk08/img/undo/mental6.png b/slides/wk08/img/undo/mental6.png
deleted file mode 100644
index 5baea3ac170bd237ee0c35101160347918f32c04..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/mental6.png and /dev/null differ
diff --git a/slides/wk08/img/undo/mental7.png b/slides/wk08/img/undo/mental7.png
deleted file mode 100644
index 9bb9a6c4bd2bf569e84b6de7d2d7e73f0e9ecc09..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/mental7.png and /dev/null differ
diff --git a/slides/wk08/img/undo/norman-d-human-action-cycle.png b/slides/wk08/img/undo/norman-d-human-action-cycle.png
deleted file mode 100644
index f5748a294e9e8786e3337bc8404b71364d1db0f9..0000000000000000000000000000000000000000
Binary files a/slides/wk08/img/undo/norman-d-human-action-cycle.png and /dev/null differ
diff --git a/slides/wk08/studies.html b/slides/wk08/studies.html
deleted file mode 100644
index 3b60f194ba7e79e0ec6cef2c70956897c731079f..0000000000000000000000000000000000000000
--- a/slides/wk08/studies.html
+++ /dev/null
@@ -1,470 +0,0 @@
----
-layout: presentation
-title: Running a Quantitative Study
-description: Description of how to test a hypothesis in a study, all steps
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Running a Quantitative Study
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout: false
-
-# Today's goals
-
-- Review our designs from Friday
-- Discuss steps of running a study
-- Practice onboarding participants
-- Practice data analysis
-- Go over parts 5 & 6 of Menus
-
----
-# Case Study: UbiGreen - In Class activity
-
-Take 2 minutes to go back into our [shared google doc](https://docs.google.com/document/d/1SqvaQyhFYs6AsOPoDcBkG4egCRRq3jEaW17HOi0hSkM/edit?usp=sharing)
-
-Find a design by a different group than you were in. Use the google doc comment feature to leave
-a short critique.
-
-Phrases to get you started
-
-- I like ...
-- I wish ...
-- What if...
-
-.footnote[I like I wish critique method from [Stanford Design School](https://www.youtube.com/watch?v=QkWM2--3TQo)]
-
----
-# Experiment Design
-
-<div class="mermaid">
-graph LR
-S(.) --> Hypothesis(Hypothesis)
-Hypothesis -- "Study Design" --> Method(Method)
-Method -- "Run Study" --> Data(Data)
-Data -- "Clean and Prep" --> Analysis(Analysis)
-Analysis --> Conclusions(Conclusions)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:2.5em;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:3px;
-linkStyle 1 stroke-width:3px;
-linkStyle 2 stroke-width:3px;
-linkStyle 3 stroke-width:3px;
-linkStyle 4 stroke-width:3px;
-
-class S invisible
-class Hypothesis,Conclusions start
-class Method,Data,Analysis normal
-</div>
-
-&zwj;Think: What is the Hypothesis for the Menus assignment
---
-
-&zwj;Pair: We'd chat for a minute in person but I'm not putting you in breakouts for this question...
---
-
-&zwj;Share: Type your thoughts in the chat window
-
----
-# Method
-<div class="mermaid">
-graph LR
-S(.) --> Hypothesis(Hypothesis <br>Decreased seek <br>time and errors)
-Hypothesis -- "Study Design" --> Method(Method)
-Method -- "Run Study" --> Data(Data)
-Data -- "Clean and Prep" --> Analysis(Analysis)
-Analysis --> Conclusions(Conclusions)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:5em;
-classDef startsmall fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:2.5em;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:3px;
-linkStyle 1 stroke-width:3px;
-linkStyle 2 stroke-width:3px;
-linkStyle 3 stroke-width:3px;
-linkStyle 4 stroke-width:3px;
-
-class S invisible
-class Hypothesis start
-class Conclusions startsmall
-class Method,Data,Analysis normal
-</div>
-
-- 3 tasks x 3 menu types = 9 *conditions*
-- Each condition will have a total of totalTrials = `ITEM_MAX` x `NUM_REPEATS`
-  - In each *condition* we test `ITEM_MAX` different menu items
-  - For each menu item, we repeat `NUM_REPEATS` times
-
-| | Normal | Pie | Custom |
-|--|--|--|--|
-| **Linear** | totalTrials | totalTrials | totalTrials |
-| **Relational** | totalTrials | totalTrials  | totalTrials |
-| **Unclassified** | totalTrials | totalTrials | totalTrials |
-
----
-# Other Method considerations
-
-For Menus Part 5-6, an experimental *session* consists of 3 tasks x 3 menu types x
-`ITEM_MAX` items x `NUM_REPEATS` repetitions = 108 *trials*
-
-You have to run at least three participants through a complete session = 108 x 3 or 324 data points.
-
---
-In some experimental designs, participants only do some conditions
-- Called *between subjects design*
-
-Our participants do *all* trials
-- Our study is a *within subjects design*
-
-Order of presentation of conditions and items is randomized (why?)
-
-
-???
-Between subjects design: Person A compared to person B doing different tasks
-
----
-# Document all of this in your [report]({{site.baseurl}}/assignments/menu-report)
-
-Introduce study purpose
-
-`Write two sentences describing the purpose of the experiment. This
-can be the same text you use in your consent form`
-
----
-# Document all of this in your [report]({{site.baseurl}}/assignments/menu-report)
-
-Introduce study method - menus
-
-`Mention that there are three types of menus, Pie, Linear and Custom.
-Then describe your custom menu and include an screenshots of your custom menu in both a selected
-and unselected state. Describe some of the design choices you made when you were conceiving your
-custom menu and how your final product match (or didn’t) your original vision? Be sure to explain
-clearly how your custom menu works and how a user interacts with it?`
-
-Introduce study method - tasks
-
-`Describe the 9 conditions of the study. Explain how many
-items were selected per menu, and how many times each item was
-repeated. Describe how many trials each participant completed.`
-
----
-# Study Ethics
-<div class="mermaid">
-graph LR
-S(.) --> Hypothesis(Hypothesis:<br>Decreased seek <br>time and errors)
-Hypothesis -- "Study Design" --> Method(3 menus x <br> 3 task conditions )
-Method -- "Run Study" --> Data(Data)
-Data -- "Clean and Prep" --> Analysis(Analysis)
-Analysis --> Conclusions(Conclusions)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef normalbig fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:4em;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:5em;
-classDef startsmall fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:2.5em;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:3px;
-linkStyle 1 stroke-width:3px;
-linkStyle 2 stroke-width:3px;
-linkStyle 3 stroke-width:3px;
-linkStyle 4 stroke-width:3px;
-
-class S invisible
-class Hypothesis start
-class Conclusions startsmall
-class Method normalbig
-class Data,Analysis normal
-</div>
-
-Ethical Principles for running participants. Driven by
-[Criminal/Racist/Harmful studies](https://www.nytimes.com/2017/05/22/science/social-science-research-institutional-review-boards-common-rule.html)
- - Nazi war crimes
- - Tuskegee Syphilis study
- - Epilepsy studies of institutionalized children
- - [16,000 people involuntarily included in radiation
-   studies](https://www.nytimes.com/1995/08/20/us/count-of-subjects-in-radiation-experiments-is-raised-to-16000.html?module=inline)
- - [Milgram's study of electric shocking](https://www.simplypsychology.org/milgram.html)
- - [Stanford prison experiment](https://www.simplypsychology.org/zimbardo.html)
-
-
-???
-IRB = Institutional Review Board Protocol (and get it approved.)
-
----
-# Study Ethics
-<div class="mermaid">
-graph LR
-S(.) --> Hypothesis(Hypothesis:<br>Decreased seek <br>time and errors)
-Hypothesis -- "Study Design" --> Method(3 menus x <br> 3 task conditions )
-Method -- "Run Study" --> Data(Data)
-Data -- "Clean and Prep" --> Analysis(Analysis)
-Analysis --> Conclusions(Conclusions)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef normalbig fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:4em;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:5em;
-classDef startsmall fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:2.5em;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:3px;
-linkStyle 1 stroke-width:3px;
-linkStyle 2 stroke-width:3px;
-linkStyle 3 stroke-width:3px;
-linkStyle 4 stroke-width:3px;
-
-class S invisible
-class Hypothesis start
-class Conclusions startsmall
-class Method normalbig
-class Data,Analysis normal
-</div>
-
-
-Basic ethics ([Belmont Report](https://www.hhs.gov/ohrp/regulations-and-policy/belmont-report/read-the-belmont-report/index.html))
-- Beneficence -->
- - Value of research higher than risks
- - Do no harm
-- Respect for Persons -->
- - Fully informed of intent and purpose
- - Informed consent
- - May opt out at any time, for any reason
-- Justice -->
- - Equitable, representative selection of participants
-
-
----
-# Consent
-
-Write your [consent]({{site.baseurl}}/assignments/consent) form
-
-- Purpose of study (Beneficience)
-- Requirements for participation (Respect for Persons)
-- Study procedures (Respect for Persons)
-- Voluntariness (Respect for Persons)
-- Benefits to Society (Beneficience)
-- Contact (of IRB typically; Me in this case)
-
-
-???
-- Beneficence -->
- - Value of research higher than risks
- - Do no harm
-- Respect for Persons -->
- - Fully informed of intent and purpose
- - Informed consent
- - May opt out at any time, for any reason
-- Justice
- - equitable, representative selection of participants
-
----
-# Choosing and Consenting Participants
-
-For 20sp only, we are assigning you in "groups" to help you find testers.
-- If you can not safely test your app with someone who is co-present you will need to ask your [groupmates](https://docs.google.com/document/d/11nsEWs3TubV5Zy0zOIGguqZJohkS34uizIrDv-bgnYs/edit)
-- Consenting your participants will be very similar whether they are co-present or remote.
-  - Set up a time when can speak to your participant (in real time) - phone or video call
-  - For a co-present tester - print out two copies of the consent form for each participant -- one for them and one for you.
-  - For remote testers - send a copy of the consent form to the participant prior to your phone call
-or video meeting.
-
----
-# Choosing and Consenting Participants
-
-During the consent meeting
-- Briefly explain what your user study is about,
-- Ensure participants understand their participation in the study is voluntary.
-  - Do not *coerce* anyone into participating in your study.
-  - Make sure they know they have a choice, and have read the consent form.
-- Participants must acknowledge their consent by "signing" via the Google form (linked
-at the bottom of the consent form template).
-  - This form should send you an anonymized copy of their
-consent in email, which you can save and turn in with the rest of your report and reflection.
-
----
-# Choosing and Consenting Participants
-
-If you are unable to find 3 partipants from your friends, family, or pre-assigned group
-- Please reach out to a TA during Office Hours or to have them be a partipipant.
-- You may also reach out to other students in the class via Ed.
-
-
----
-# Document your participants in your [report]({{site.baseurl}}/assignments/menu-report)
-
-Method - Participants
-
-`Describe your participants (without identifying
-them). How were they recruited? How many were there?  Were
-they consented? You can also add
-some optional information such as: What was there average age? What
-genders were present? How experienced were they with android?`
-
----
-# Data Collection
-
-<div class="mermaid">
-  graph LR
-  S(.) --> Hypothesis(Hypothesis:<br>Decreased seek <br>time and errors)
-  Hypothesis -- "Study Design" --> Method(3 menus x <br> 3 task conditions )
-  Method -- "Run Study" --> Data(Data)
-  Data -- "Clean and Prep" --> Analysis(Analysis)
-  Analysis --> Conclusions(Conclusions)
-
-  classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-  classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-  classDef normalbig fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:4em;
-  classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:5em;
-  classDef startsmall fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:2.5em;
-  classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-  linkStyle 0 stroke-width:3px;
-  linkStyle 1 stroke-width:3px;
-  linkStyle 2 stroke-width:3px;
-  linkStyle 3 stroke-width:3px;
-  linkStyle 4 stroke-width:3px;
-
-  class S invisible
-  class Hypothesis start
-  class Conclusions startsmall
-  class Method normalbig
-  class Data,Analysis normal
-</div>
-
-If you have co-present users:
-
-1. **Clear your data** file before you start the **first participant
-only**
-2. Have participant read and sign the consent form
-3. Emphasize key points verbally
-4. Be Consistent in how you present the study
-5. Download result (you can use a tool window called `Device File Manager`)
-
----
-# Data Collection
-
-<div class="mermaid">
-  graph LR
-  S(.) --> Hypothesis(Hypothesis:<br>Decreased seek <br>time and errors)
-  Hypothesis -- "Study Design" --> Method(3 menus x <br> 3 task conditions )
-  Method -- "Run Study" --> Data(Data)
-  Data -- "Clean and Prep" --> Analysis(Analysis)
-  Analysis --> Conclusions(Conclusions)
-
-  classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-  classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-  classDef normalbig fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:4em;
-  classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:5em;
-  classDef startsmall fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:2.5em;
-  classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-  linkStyle 0 stroke-width:3px;
-  linkStyle 1 stroke-width:3px;
-  linkStyle 2 stroke-width:3px;
-  linkStyle 3 stroke-width:3px;
-  linkStyle 4 stroke-width:3px;
-
-  class S invisible
-  class Hypothesis start
-  class Conclusions startsmall
-  class Method normalbig
-  class Data,Analysis normal
-</div>
-
-If you have a remote user
-
-1. Generate your APK
-2. Consent your user via phone or video conference.
-3. Send your APK to the participant so they can load it onto their own device or into their own
- emulator
-  - You can't email your APK through UW's servers, so upload the APK to your Google Drive or One Drive and send your participant
- a link to download it for testing.
-4. Have your participant use the hamburger menu to select `Clear Result CSV` before starting
- your study
-5. Have your participant run one experiment session.
-6. When the study is done, your participant will need to download their data
-and send it back for analysis.
-7. Combine the three participants' data into one common .csv file.
-
-
----
-layout: true
-class: center, middle
----
-# Collecting data file (Demo)
----
-layout: false
-
-# Document what all of this in your [report]({{site.baseurl}}/assignments/menu-report)
-
-Method - Setting
-`What device was used? Was it an emulator? Where did the experiment take place?`
-
-Method - Data Collected
-`What information was collected (time, errors, etc)`
-
----
-# Data Collection
-.left-column[
-
-![:img Picture of a dialogue box called Import file showing that you should replace current sheet and automatically detect separator type and convert text to numbers dates and formulas,100%](img/studies/import.png)
-]
-
-.right-column[
-
-Select the 'raw' sheet of your spreadsheet then load your file into the spreadsheet
-
-![:img Picture of a spreadsheet with the tab titled 'Raw' selected](img/studies/raw.png)
-
-]
----
-# Data Collection
-.left-column[
-
-![:img Image of bar chart comparing tasks to menu type showing that
-normal menus get progressively slower as items become nonlinear while
-pie menus are about the same, 100%](img/studies/chart.png)
-]
-.right-column[
-
-
-Now click on `Example Chart`. Here you can
-
-- Analyze and chart data: Simple Statistics
-  - Min, Max, Mean (Sum/#), Median (Middle #), Mode (Most Common #)
-
-Demo
-
-Do this for speed *and* error.
-
-]
-
-
----
-# Document what all of this in your [report]({{site.baseurl}}/assignments/menu-report)
-
-Speed Results
-
-`Describe your thoughts about overall speed in different
-conditions. Use at least one chart to illustrate what you say. Here is
-an example chart generated using our data, when you paste your data
-into the spreadsheet you’ll see that it updates to reflect your data`
-
-Error Results
-
-`Describe what happened in terms of errors -- provide at least one chart showing
-what you learned about errors in different conditions`
diff --git a/slides/wk08/studies2.html b/slides/wk08/studies2.html
deleted file mode 100644
index f3c583a7bb22a054e44f4def6eb18ffba8b9c4ca..0000000000000000000000000000000000000000
--- a/slides/wk08/studies2.html
+++ /dev/null
@@ -1,468 +0,0 @@
----
-layout: presentation
-title: Understanding Quantitative Data
-description: Description of how to analyze study data and draw conclusions
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Analyzing Quantitative Data
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout:false
-
-[//]: # (Outline Slide)
-# Today's goals
-
-- How to use the Menus spreadsheet
-- Dependent and independent variables
-- Discuss how we determine causality
-- Practice onboarding participants
-- Practice data analysis
-
-
----
-# Data Collection
-.left-column[
-
-![:img Image of bar chart comparing tasks to menu type showing that
-normal menus get progressively slower as items become nonlinear while
-pie menus are about the same, 100%](img/studies2/chart.png)
-]
-.right-column[
-
-
-Now click on `Example Chart`. Here you can
-
-- Analyze and chart data: Simple Statistics
-  - Min, Max, Mean (Sum/#), Median (Middle #), Mode (Most Common #)
-
-Demo
-
-Do this for speed *and* error.
-
-]
-
----
-# Document what all of this in your [report]({{site.baseurl}}/assignments/menu-report)
-
-Speed Results
-
-`Describe your thoughts about overall speed in different
-conditions. Use at least one chart to illustrate what you say. Here is
-an example chart generated using our data, when you paste your data
-into the spreadsheet you’ll see that it updates to reflect your data`
-
-Error Results
-
-`Describe what happened in terms of errors -- provide at least one chart showing
-what you learned about errors in different conditions`
-
-
----
-# Use charts to check your assumptions
-
-![:img Image of bar chart comparing tasks to menu type showing that
-normal menus get progressively slower as items become nonlinear while
-pie menus are about the same, 50%](img/studies2/chart.png)
-
-
----
-# Using the right chart matters
-
-.left-column40[
-
-![:img Histogram of data about speed of pie menu selection and linear
-menu selection for each task type, 70%](img/studies2/histogram.png)
-]
-
-.right-column50[
-|Normal | Pie|
-|--|--|
-|![:img Histogram of data about speed of pie menu selection and linear menu selection for each task type,100%](img/studies2/normal-only.png)|![:img Histogram of data about speed of pie menu selection and linear menu selection for each task type, 100%](img/studies2/pie-only.png)|
-
-]
-
-
----
-# Can we determine *causality*?
-
-We'd like to be able to argue the task/menu type influenced the speed and error results.
-
---
-This implies *dependence* between speed/error, task, and menu type
-
---
-And it assumes you have measured the right variables!
-
----
-
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Determining Causality
-
-## thinking theoretically...
-
-
----
-layout:false
-
-
-# Dependence/independence
-
-Events that are independent
-- Flipping heads and then tails
-- Day of week and whether a patient had a heart attack (probably?)
-
-Events that are dependent
-- Vice presidential candidate and presidential nominee
-- Diagnostic test being positive and whether patient has a disease
-
---
-What are some dependent and indepenent relationships in the Menus study?
-
-???
-Think about a coin flip: one flip does not depend on another.
-What if we collect this kind of data, what might be true about it?
-
-
----
-# What might we expect to see is true of dependent variables?
-
-- When one changes, the other changes at the same rate
-- When one changes, the other changes at a faster rate
-- When one changes, the other does the opposite
-
-???
-Called a correlation
-We can see it in a scatter plot
-Go look at data and make one
-
----
-# This is called *Correlation*
-
-We can see it in a *scatterplot*
-
-![:img Example of correlations for heigh vs age (positively correlated) and
-height vs birth month (uncorrelated),60%](img/studies2/correlation.png)
-
----
-# Correlation (active) Demo
-
-[OpenSecrets.org data set on internet privacy resolution](https://www.opensecrets.org/featured-datasets/5)
-
-Active demo:
-
-Open it yourself: [tinyurl.com/cse340-ipdata](https://tinyurl.com/cse340-ipdata)
-
-Make a copy of this sheet to your own drive using File->Make a copy.
-
-(You must be logged into a Google account to make a copy)
----
-# Correlation demo
-
-[OpenSecrets.org data set on internet privacy resolution](https://www.opensecrets.org/featured-datasets/5)
-
-- Select two columns (use command/control click to select 2 columns)
-- Use Insert->Chart - Make sure this is a scatterplot
-
---
-![:img Correlation of company giving,60%](img/studies2/correlation-demo.png)
-
-Is there a correllation?
-
-
----
-# Correlation != Causation
-
-![:img Correlation of number of people who drowned per year and films
-nicolas cage appeared in, 80%](img/studies2/cagelation.png)
-
----
-# Correlation != Causation
-
-![:img Two people talking. Says one: I used to think correlation
-implied causation. Says the other: Then I took a statistics
-course. Now I don't. Says the other: Sounds like the class
-helped. Says the first: Well maybe, 50%](img/studies2/correlation-cartoon.png)
-
-.footnote[[XKCD](https://xkcd.com/552/)]
-
----
-# Grouping for analysis
-
-Pivot Tablest demo
-[tinyurl.com/cse340-ipdata](https://tinyurl.com/cse340-ipdata)
-
---
-![:img Giving vs party for diff votes, 30%](img/studies2/pivot1.png)
-
----
-# Grouping and charting helps you check your assumptions
-
-![:img Image of bar chart  tasks to menu type showing that
-normal menus get progressively slower as items become nonlinear while
-pie menus are about the same, 40%](img/studies2/chart.png)
-
-What do you see in the difference between tasks on each of these menus types?
-
---
-Charting gives you a place to start, what questions you might want to ask.
-
----
-# Grouping and charting helps you check your assumptions
-
-[20sp Sample data](https://docs.google.com/spreadsheets/d/1JqfKhHugIF-kebs_bVztCnkUe0CizXN8PU_Ar3kXtK4/edit?usp=sharing)
-
-Not that different in this sample set (just Jen doing it 3 times).
-
-You likely will get better results with your data
-
-We will get even better results with ALL of the data merged together
-
-(Remember to turn your CSV into the Canvas Assignment)
-
----
-
-# Comparing groups to see if they are different
-
-Bar charts  are not enough to assess difference though. Need to see the *distribution*
-
-A distribution is looking at how the people we are studying distributed over a specific variable we care about.
-
-A histogram graphically shows a distribution.
-
----
-# Histogram shows you a *distribution*
-
-Pivot Tablest demo
-[tinyurl.com/cse340-ipdata](https://tinyurl.com/cse340-ipdata)
-
---
-![:img Histogram of amount vs party, 40%](img/studies2/pivot2.png)
-
-
----
-# But having the right chart matters
-
-![:img Histogram of data about speed of pie menu selection and linear
-menu selection for each task type, 40%](img/studies2/histogram.png)
-
-
----
-# Normal Vs Pie
-
-|Normal | Pie|
-|--|--|
-|![:img Histogram of data about speed of pie menu selection and linear menu selection for each task type,100%](img/studies2/normal-only.png)|![:img Histogram of data about speed of pie menu selection and linear menu selection for each task type, 100%](img/studies2/pie-only.png)|
-
-The cause of the difference only shows here.
-
----
-
-# What do we learn from a histogram?
-
-![:img two distributions, 50%](img/studies2/samples1.png)
-
-???
-- shows a distribution
-- helps us tell if things are INDEPENDENT
-
----
-#  Histograms
-
-What do we learn from a histogram?
-- shows a distribution
-- helps us tell if things are INDEPENDENT
-
----
-# Comparing two groups
-
-![:img two distributions showing overlapping 95% confidence intervals,
-50%](img/studies2/samples2.png)
-
-
----
-# Comparing two groups
-
-![:img two distributions with less overlapping intervals (because more
-data is present), 50%](img/studies2/samples3.png)
-
----
-# Comparing two groups
-
-![:img two distributions with more data but overlapping histograms
-thus hard to differentiate, 50%](img/studies2/samples4.png)
-
----
-# Comparing two groups
-
-![:img two distributions with less overlapping intervals (because more
-data is present), 50%](img/studies2/samples5.png)
-
----
-# Comparing two groups
-
-![:img two distributions not overlapping at all, 50%](img/studies2/samples6.png)
-
----
-# Comparing two groups
-
-![:img same two distributions with difference between means marked as
-effect size, 50%](img/studies2/samples7.png)
-
----
-# Common Statistical Test for comparison: t-test
-
-Tests for difference between two samples
-
-Best used to determine what is ‘worthy of a second look’
-
-Limited in its applicability to normal, independent data
-
-Does not help to document effect size [the actual difference between groups], just effect likelihood
-
----
-.left-column[
-## Problems with t-tests
-
-The more implausible the hypothesis, the greater chance that it is a
-‘false alarm’
-]
-.right-column[
-![:img A picture of the likelihood of a positive t-test as influenced by
-priors (the expected likelihood of an outcome), 80%](img/studies2/priors.png)
-
-]
-???
-Top row: Prior (what's known to be true before the experiment)
-bottom row: Calculated p-value
-
-Notice the middle column, where something that is a toss-up has higher
-plausability than we would expect. This is a "Type 1 error"
-
-Alternatively, a small sample may cause a Type II error (failure to
-detect a true difference) due to random sampling bias
-
----
-.left-column[
-## Problems with t-tests
-]
-.right-column[
-- Doesn’t take prior knowledge into account
-- Susceptible to ‘data dredging’
- - The more tests you conduct the more likely you will find a result
-   even if one is not there
- - Adjustments mid experiment
-- Gives a yes or no answer: Either the null hypothesis is rejected (the result would be unlikely in a world where the null hypothesis was true) or it cannot be rejected
-- Based on assumed ‘average’ sample
-]
----
-# Which problems might affect our study?
-
-???
-Too many comparisons
---
-
-18 separate comparisons (3x3 conditions, 2 measures)
-
-ANOVA (**An**alysis **O**f **Va**riance): Fancy t-test that accounts for the whole group effect before
-doing pairwise comparisons
-
-???
-- Doesn’t take prior knowledge into account
-- Susceptible to ‘data dredging’
- - The more tests you conduct the more likely you will find a result
-   even if one is not there
- - Adjustments mid experiment
-- Gives a yes or no answer: Either the null hypothesis is rejected (the result would be unlikely in a world where the null hypothesis was true) or it cannot be rejected
-- Based on assumed ‘average’ sample
-
----
-# Demo of t-tests in our spreadsheet
-
-[20sp Sample data](https://docs.google.com/spreadsheets/d/1JqfKhHugIF-kebs_bVztCnkUe0CizXN8PU_Ar3kXtK4/edit?usp=sharing)
-
----
-.left-column[
-## Document what all of this in your [report]({{site.baseurl}}/assignments/menu-report)
-]
-.right-column[
-
-- Describe your hypothesis
-- Illustrate with graphs
-- Optional: use Table of results found in `Speed Analysis` and `Error Analysis` to describe Statistical Significance:
-
-`Pie menus were twice as fast as normal menus (M=.48s vs M=.83s), F(1,43)=295.891, p<.05. Unclassified menu items were harder to find than linear and relative ones (M=.84s, .59s, and .59s respectively), F(2,43)=93.778, p<0.5. We also found an interaction effect between menu and task (as illustrated in the chart above), F(5, 43) = 51.945, p<.001.`
-
-]
-
-
----
-# Drawing Conclusions
-
-<div class="mermaid" style="font-size:.5em">
-graph LR
-S(.) --> Hypothesis(Hypothesis:<br>Decreased seek <br>time and errors)
-Hypothesis -- "Study Design" --> Method(3 menus x <br> 3 task conditions )
-Method -- "Run Study" --> Data(Data)
-Data -- "Clean and Prep" --> Analysis(Analysis)
-Analysis --> Conclusions(Conclusions)
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:2.5em;
-classDef normalbig fill:#e6f3ff,stroke:#333,stroke-width:2px,font-size:.7em,height:4em;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:5em;
-classDef startsmall fill:#d1e0e0,stroke:#333,stroke-width:4px,font-size:.7em,height:2.5em;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:3px;
-linkStyle 1 stroke-width:3px;
-linkStyle 2 stroke-width:3px;
-linkStyle 3 stroke-width:3px;
-linkStyle 4 stroke-width:3px;
-
-class S invisible
-class Hypothesis start
-class Conclusions startsmall
-class Method normalbig
-class Data,Analysis normal
-</div>
-
-- Describe your hypothesis
-- Illustrate with graphs
-- Optional: Statistical Significance
-
-Draw Conclusions
-- Were errors less?
-- Was time faster?
-
-`Describe your conclusions. Do you think we should use pie menus more? What can we conclude from your data?`
-
-
----
-# Limitations of Laboratory Studies
-
-???
-Simulate real world environments
-- Location and equipment may be unfamiliar to participant [Coyne & Nielsen 2001]
-- Observation may effect performance - “Hawthorne Effect” [Mayo 1933]
-- Participant may become fatigued and not take necessary rest - “Demand Effect” [Orne 1962]
-- Tasks frequently artificial and repetitive, which may bore participants and negatively effect performance
-Studying real world use removes these limitations
-
---
-
-Simulate real world environments
-- Location and equipment may be unfamiliar to participant [Coyne & Nielsen 2001]
-- Observation may effect performance - “Hawthorne Effect” [Mayo 1933]
-- Participant may become fatigued and not take necessary rest - “Demand Effect” [Orne 1962]
-- Tasks frequently artificial and repetitive, which may bore participants and negatively effect performance
-Studying real world use removes these limitations
diff --git a/slides/wk08/undoSlides.html b/slides/wk08/undoSlides.html
deleted file mode 100644
index b70972746a79053d092664fadeed8c7a6bc968f3..0000000000000000000000000000000000000000
--- a/slides/wk08/undoSlides.html
+++ /dev/null
@@ -1,541 +0,0 @@
----
-layout: presentation
-title: Undo
-description: Why Undo/How Undo/What Undo
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Undo reasoning and implementation
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout: false
-
-[//]: # (Outline Slide)
-# Today's goals
-
-- Introduce need for Undo by reviewing mental models
-- Introduce Undo conceptually
-- Describe Implementation details for assignment
-
-
----
-.left-column[
-# Review: Every system has at least 3 different models
-]
-
-.right-column[
-<div class="mermaid">
-graph TD
-  S[System Image: <br>Your Implementation&nbsp;] --> |System Feedback&nbsp;| U[User Model: How the user thinks&nbsp; <br>the system works]
-  D[Design Model: How you <br>intend the system to work&nbsp;]-->S
-  U -->|User Feedback&nbsp;| S
-</div>
-
-]
-
----
-# Relating the Human and the Interaction
-
-
-.left-column-half[
-
-![img: Gym doors with few affordances of where you can open them and whether there is an accessible way to use the doors,10%](img/undo/gym-doors.png)
-
-]
-
---
-
-.right-column-half[
-![img: Don Norman's Human Action Cycle,10%](img/undo/norman-d-human-action-cycle.png)
-]
-
-.footnote[[Don Norman, When Three World Collide: A model of the Tangible Interaction Process, 2009](https://www.researchgate.net/publication/221332102_When_three_worlds_collide_A_model_of_the_tangible_interaction_process)]
-
-???
-Note to instructors: Need to change image  to mermaid
-
-
----
-# Relating the Human and the Interaction
-
-
-.left-column-half[
-<br>
-<br>
-
-**Gulf of Execution** is the user's believe in the functions the system _doesn't have_
-  - This is the users 'error' region
-
-**Gulf of Evaluation** is where the user _doesn't realize the system HAS a functionality_.
-]
-
-
-.right-column-half[
-![img: Don Norman's Human Action Cycle,10%](img/undo/norman-d-human-action-cycle.png)
-]
-
----
-
-# Model of Mental Models
-
-.left-column50[
-![:img A box showing the design (white),100%](img/undo/mental1.png)
-]
----
-# Model of Mental Models
-
-.left-column50[
-![:img A box showing the design (white) and actual function (blue missing a little bit of the white),100%](img/undo/mental2.png)
-]
----
-# Model of Mental Models
-
-.left-column50[
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System Functionality",100%](img/undo/mental3.png)
-]
----
-# Model of Mental Models
-
-.left-column50[
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System Functionality",100%](img/undo/mental4.png)
-]
-
----
-# Model of Mental Models
-
-.left-column50[
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System
-Functionality" a dark blue cloud labeled "Occasionally Used Part of
-System Functionality" around the user's well understood region,100%](img/undo/mental5.png)
-]
-
----
-# Model of Mental Models
-
-.left-column50[
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System
-Functionality" a dark blue cloud labeled "Occasionally Used Part of
-System Functionality" around the user's well understood region and
-another cloud further out with errors (regions outside the blue system
-box) labeled "Users full model of what the system does",100%](img/undo/mental6.png)
-]
-
-???
-- Where are the gulf of evaluation and gulf of execution in this
-  image?
-- Gulf of execution is the user 'error' region (user requests
-  function the __system DOESNT HAVE__), gulf of
-  evaluation is when the user __doesn't realize the system HAS a
-  functionality__.
-
-- How does undo help the user bridge them?
-
---
-.right-column50[
-<br>
-<Br>
-**Gulf of Execution** is the user's believe in the functions the system _doesn't have_
-  - This is the users 'error' region
-
-**Gulf of Evaluation** is where the user _doesn't realize the system HAS a functionality_.
-]
-
----
-# Model of Mental Models
-
-
-.left-column50[
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System
-Functionality" a cloud further out with errors (regions outside the blue system
-box) and an arrow pointing from the part they really understand to the part outside
-of the application,100%](img/undo/mental7.png)
-]
-.right-column50[
-What happens when the user does something they think is core but is really not supported?
-]
-
-???
-
-(Undo is needed)
---
-.right-column50[
-Undo helps with this
-]
-
----
-class: center, middle, inverse
-
-# How do we support Undo?
-
----
-layout:false
-
-.left-column-half[
-## Remember this?
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface, 100%](img/undo/callbacks.png)]
-.right-column-half[
-Dispatch Strategies
-- Bottom-first and top-down positional
-- Focus-based
-
-State Machine describes *within-view* response to events
-]
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface and a do_action() call
-happening below the line in response to a button_pressed(), 100%](img/undo/callbacks2.png)]
-.right-column-half[
-Callbacks handle *application* response to events
-- Update Application Model
-
-]
-
----
-.left-column-half[
-## Event Dispatch
-
-![:img Picture of interactor hierarchy connected to an interface and a
-dotted line indicating application interface with do_action() replaced
-with an actionListener, 100%](img/undo/callbacks3.png)]
-.right-column-half[
-Callbacks handle *application* response to events
-- Update Application Model
-- Best implemented using custom listeners
-
-]
----
-# What is `ActionPerformed`?
-`Higher level` input event (`Command` or `Action` object)
- - Puts some  separation between UI and translation objects
- - Application (or UI) can ‘listen’ for these events:
-
-Key advantage: interactors don’t need to know who/what got notification
-
-Same basic flow as simple callbacks
----
-# What should an Action object do?
-`doAction()`
-
-???
-seems like a lot of work when we could just directly do the
-action. Major reason for action objects
---
-`undoAction()`
-
-???
-What additional information do we need to undo an action?
-
----
-.left-column[
-## Advantages of an action object
-- can be stored on an undo stack
-- can create a consistent abstraction for reversing an action
-]
-.right-column[
-<div class="mermaid">
-classDiagram
-
-AbstractAction <|.. AbstractReversibleAction
-AbstractReversibleAction <|.. ChangeColorAction
-AbstractReversibleAction <|.. ChangeThicknessAction
-AbstractReversibleAction <|.. AbstractReversibleViewAction
-AbstractReversibleViewAction <|.. StrokeAction
-
-class AbstractAction {
-  doAction()
-}
-
-class AbstractReversibleAction {
-  +boolean done
-  +undoAction
-}
-
-class AbstractReversibleViewAction  {
-  +invalidate
-}
-
-
-</div>
-]
----
-# Where do we store actions? A stack
-
-.left-column50[
-<div class="mermaid">
-classDiagram
-
-AbstractStackHistory <|.. StackHistory
-class AbstractStackHistory {
-  addAction(AbstractReversibleAction action)
-  undo()
-  redo()
-  canUndo()
-  canRedo()
-}
-
-class StackHistory {
-   +capacity: "Max stack size"
-}
-
-
-</div>
-]
-.right-column50[
-Why a stack?
-]
-
-???
-Consider having some volunteers be actions and have them act it out?
----
-.left-column[
-## Undo and Redo]
-.right-column[
-1) new action object created and `doAction()` called
-
-2) Undo stack updated
-
-3) new action object created and `doAction()` called
-
-4) Undo stack updated
-
-5) `undo()` invoked
-
-6) Undo stack reduced and Redo stack increased
-
-7) `undo()` invoked
-
-8) Undo stack reduced and Redo stack increased
-]
-???
-draw sequence
----
-.left-column[
-## Undo and Redo]
-.right-column[
-9) `redo()` invoked
-
-10) Redo stack decreased and Undo stack increased
-
-11) new action object created and `doAction()` called
-
-12) Redo stack cleared and Undo stack stack increased
-]
----
-.left-column[
-## What if an action can't be undone?]
-.right-column[
-Actions that put system into a totally different context
-
-Clear both `undo` *and* `redo` stacks! Users may hate you]
-???
-example? Saving a file
----
-.left-column[
-## Implementing `undo()`
-]
-.right-column[
-
-System pops action off undo stack
-
-Calls `undoAction()` method on it
-
-Pushes it on redo stack
-]
----
-.left-column[
-## Why is `undoAction()` hard?
-]
-.right-column[
-Two ways to implement:
-
-- *Direct Code* (each action object has custom code)
- - Need parameters of original action
- - Better store in `doAction()` for later
- - This is what we will implement
-]
----
-.left-column[
-## Why is `undoAction()` hard?
-]
-.right-column[
-Two ways to implement:
-
-- *Direct Code* (each action object has custom code)
-- *Change Records* (Keep a record of the “old value” for everything
-changed by the application, then put all those values back to undo)
- - Like some version control systems
- - More general
- - Takes more space
- - `Action` object records `ChangeRecord` (changes which are abstracted into a
- common data format)
- - Application has to provide code to restore from change records
-]
----
-
-.left-column[
-## Implementing `redo()`
-]
-.right-column[
-
-System pops action off redo stack
-
-Calls `doAction()` method
-
-Pushes it on undo stack
-]
----
-.left-column[
-## More sophisticated forms of Undo
-]
-.right-column[
-Explicit visualization of steps
-
-Manipulation of action list
-
-Delete actions from the middle, reorder, etc.
-by undoing back to point of change then redoing forward
-
-But note: doAction() must be able to work in new context
-]
-
----
-.left-column[
-## Flatland: Semantic Undo
-
-![:img Picture of a map with multiple edits including deleting and adding roads,100%](img/undo/flatland-roads.png)
-]
-.right-column[
-![:img Picture of an undo history with a transaction stack that
-represents causality in a timeline, 80%](img/undo/flatland.png)
-]
-.footnote[
-Edwards, W. K. ; Igarashi, T. ; LaMarca, A .; Mynatt, E. D. A temporal model for multi-level undo and redo. UIST 2000, Proceedings of 13th Annual ACM Symposium on User Interface Software and Technology; 2000 November 5-8; San Diego, CA. NY: ACM; 2000; 31-40.
-]
----
-
-# Discussion of assignment
-
-Android Goals:
-- Be able to understand and modify an existing user interface
-  - Learn about floating action buttons
-  - Implement core data structure for Undo
-
-HCI Goals
-  - Modify and existing app in a consistent fashion
-  - Make your modifications accessible
-  - Make your modifications usable
-  - Use heuristic evaluation to assess an app
-
----
-# Discussion of assignment
-
-.left-column-half[
-![:youtube Video of assignment, F5FyW3YJ0x4]
-]
-.right-column-half[
-![:youtube Video of assignment, NhUE7GgH-vc]
-]
----
-
-# Discussion of assignment
-
-.left-column[
-First time you are modifying a fully working program
-
-Lots to explore/understand e.g. FAB buttons)
-]
---
-.right-column[
-<div class="mermaid">
-graph TD
-M[ReversibleDrawingActivity] --> D[DrawingView]
-M --> FUndo[FAB:Undo]
-M --> FRedo[FAB:Redo]
-M --> FColor[FAB:Color]
-M --> FThick[FAB:Thickness]
-FColor --> Red[Red]
-FColor --> Green[Green]
-FColor --> Blue[Blue]
-FThick --> Thin[Thin]
-FThick --> Med[Med]
-FThick --> Thick[Thick]
-
-
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-
-class M,D,FColor,FThick,Vis start
-class Red,Green,Blue,Thin,Med,Thick,Hid normal
-
-</div>
-]
-
----
-
-# Discussion of assignment
-
-.left-column[
-DrawingView: Holds strokes
-
-FABs:
-- Green ones are always visible
-- Purple ones are only visible when active
-]
-.right-column[
-<div class="mermaid">
-graph TD
-M[ReversibleDrawingActivity] --> D[DrawingView]
-M --> FUndo[FAB:Undo]
-M --> FRedo[FAB:Redo]
-M --> FColor[FAB:Color]
-M --> FThick[FAB:Thickness]
-FColor --> Red[Red]
-FColor --> Green[Green]
-FColor --> Blue[Blue]
-FThick --> Thin[Thin]
-FThick --> Med[Med]
-FThick --> Thick[Thick]
-
-
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-
-class M,D,FColor,FThick,Vis start
-class Red,Green,Blue,Thin,Med,Thick,Hid normal
-
-</div>
-]
-
----
-# Code deliverables
-
-There are five parts for the coding part of this assignment:
-- Part 1: Implement `ChangeThicknessAction`
-- Part 2: Implement history
-- Part 3: Add a thickness 0 FAB to the thickness menu
-- Part 4: Integrate colorpicker
-- Part 5: Add a new feature to your app. Make sure it is accessible
-
-Later we will learn how to do a Heuristic Evaluation of the application!
----
diff --git a/slides/wk09/cse340-guestlecture-6mar20.pdf b/slides/wk09/cse340-guestlecture-6mar20.pdf
deleted file mode 100644
index 39501853fe68c732f784a87d25cbdac6eb0305de..0000000000000000000000000000000000000000
Binary files a/slides/wk09/cse340-guestlecture-6mar20.pdf and /dev/null differ
diff --git a/slides/wk09/cse340-guestlecture-june5.pdf b/slides/wk09/cse340-guestlecture-june5.pdf
deleted file mode 100644
index c9fec37970d9b5a6628e2ac6f1f25f9051d1c6f8..0000000000000000000000000000000000000000
Binary files a/slides/wk09/cse340-guestlecture-june5.pdf and /dev/null differ
diff --git a/slides/wk09/cse340-guestlecture-june5.pptx b/slides/wk09/cse340-guestlecture-june5.pptx
deleted file mode 100644
index 5aa95362a0a3a4368955c03c44be87556be67560..0000000000000000000000000000000000000000
Binary files a/slides/wk09/cse340-guestlecture-june5.pptx and /dev/null differ
diff --git a/slides/wk09/cse340-guestlecture-mar20.pptx b/slides/wk09/cse340-guestlecture-mar20.pptx
deleted file mode 100644
index fbc9c5897ac891f951fe38abb89751e8adee3435..0000000000000000000000000000000000000000
Binary files a/slides/wk09/cse340-guestlecture-mar20.pptx and /dev/null differ
diff --git a/slides/wk09/img/ml/Carat.jpg b/slides/wk09/img/ml/Carat.jpg
deleted file mode 100644
index 2d065755d3b2be286049076e52bab07548de114c..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/Carat.jpg and /dev/null differ
diff --git a/slides/wk09/img/ml/aipoly.jpg b/slides/wk09/img/ml/aipoly.jpg
deleted file mode 100644
index 9dcd75d04cd8002753683644bf253bf79fe62270..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/aipoly.jpg and /dev/null differ
diff --git a/slides/wk09/img/ml/bias.png b/slides/wk09/img/ml/bias.png
deleted file mode 100644
index 531eaaacd795fb9587d2d21e8cc58dfff031dbdd..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/bias.png and /dev/null differ
diff --git a/slides/wk09/img/ml/captioning.png b/slides/wk09/img/ml/captioning.png
deleted file mode 100644
index 2397234b76fe9605470d62ff287a2de4eb11d945..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/captioning.png and /dev/null differ
diff --git a/slides/wk09/img/ml/cross-validation.png b/slides/wk09/img/ml/cross-validation.png
deleted file mode 100644
index 8aaa3c2816b91dc8af0605c35eafd004639ea150..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/cross-validation.png and /dev/null differ
diff --git a/slides/wk09/img/ml/decisiontree.png b/slides/wk09/img/ml/decisiontree.png
deleted file mode 100644
index d70048fd94c67ba4dee4947494266980e412b2d8..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/decisiontree.png and /dev/null differ
diff --git a/slides/wk09/img/ml/gma.png b/slides/wk09/img/ml/gma.png
deleted file mode 100644
index 23af5ef8b20de432e227898a9ab4a1009be9ef7e..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/gma.png and /dev/null differ
diff --git a/slides/wk09/img/ml/google.jpg b/slides/wk09/img/ml/google.jpg
deleted file mode 100644
index 9ca6ebdcd0269a225d5f26b29cd3172cab0bc0ec..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/google.jpg and /dev/null differ
diff --git a/slides/wk09/img/ml/imprompdo.jpg b/slides/wk09/img/ml/imprompdo.jpg
deleted file mode 100644
index f13f4a3d85c7c38638cc6dc19db26a873f91b56a..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/imprompdo.jpg and /dev/null differ
diff --git a/slides/wk09/img/ml/leafsnap.jpg b/slides/wk09/img/ml/leafsnap.jpg
deleted file mode 100644
index a2149f1b9c60dd72c85e3444a4a2ede49cadc16e..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/leafsnap.jpg and /dev/null differ
diff --git a/slides/wk09/img/ml/mixed-initiative.png b/slides/wk09/img/ml/mixed-initiative.png
deleted file mode 100644
index 10c04f554bac0b6a8878ef0a7542df53f957a7fe..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/mixed-initiative.png and /dev/null differ
diff --git a/slides/wk09/img/ml/mixed2.png b/slides/wk09/img/ml/mixed2.png
deleted file mode 100644
index 871799ee6f4b116a68e7c0497555ec085f1d3b0e..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/mixed2.png and /dev/null differ
diff --git a/slides/wk09/img/ml/mixed3.png b/slides/wk09/img/ml/mixed3.png
deleted file mode 100644
index c1eca8c22e65eb1b9dd1ee66dd1a21e958147527..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/mixed3.png and /dev/null differ
diff --git a/slides/wk09/img/ml/overfitting.png b/slides/wk09/img/ml/overfitting.png
deleted file mode 100644
index f2ea67e6880780c274e3412b7f55502e93addeb8..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/overfitting.png and /dev/null differ
diff --git a/slides/wk09/img/ml/personal.png b/slides/wk09/img/ml/personal.png
deleted file mode 100644
index 82aa0ec0763dd8ad334e7be7ef83f71320a09d7a..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/personal.png and /dev/null differ
diff --git a/slides/wk09/img/ml/phone-bed.jpg b/slides/wk09/img/ml/phone-bed.jpg
deleted file mode 100644
index a423153082a753ab1aa2339bf9a812425e61b313..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/phone-bed.jpg and /dev/null differ
diff --git a/slides/wk09/img/ml/regression.png b/slides/wk09/img/ml/regression.png
deleted file mode 100644
index 0eae144ec64759e55fd8b06746ec19badc0a6e94..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/regression.png and /dev/null differ
diff --git a/slides/wk09/img/ml/sleep.png b/slides/wk09/img/ml/sleep.png
deleted file mode 100644
index 07a49fdb1c7fc4aefcd1ba7b724119b676406a2b..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/sleep.png and /dev/null differ
diff --git a/slides/wk09/img/ml/training.png b/slides/wk09/img/ml/training.png
deleted file mode 100644
index 14ec13e5b4f92746066ac21d64dd9b1b7546abec..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/training.png and /dev/null differ
diff --git a/slides/wk09/img/ml/wrong.png b/slides/wk09/img/ml/wrong.png
deleted file mode 100644
index 93a3549c8ba3f42058bdb1a81406047116eede35..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/ml/wrong.png and /dev/null differ
diff --git a/slides/wk09/img/web/animated-skeleton.gif b/slides/wk09/img/web/animated-skeleton.gif
deleted file mode 100644
index 366149f29f99f2b3e1d4d54e06c924a311541e9d..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/animated-skeleton.gif and /dev/null differ
diff --git a/slides/wk09/img/web/bones.png b/slides/wk09/img/web/bones.png
deleted file mode 100644
index cc36a5c3f74cd446cf3d07c1161312142397b96e..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/bones.png and /dev/null differ
diff --git a/slides/wk09/img/web/chrome-inspector.png b/slides/wk09/img/web/chrome-inspector.png
deleted file mode 100644
index 3a9aba34636e7d5284d4661e78f990174eaf3e26..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/chrome-inspector.png and /dev/null differ
diff --git a/slides/wk09/img/web/dom.png b/slides/wk09/img/web/dom.png
deleted file mode 100644
index 3dacc41a64334e458ac2f0ada02bc389d5a51718..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/dom.png and /dev/null differ
diff --git a/slides/wk09/img/web/dressed-skeleton.png b/slides/wk09/img/web/dressed-skeleton.png
deleted file mode 100644
index 2b18695ab67f05bf90ea1c599dc776a8f5efd726..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/dressed-skeleton.png and /dev/null differ
diff --git a/slides/wk09/img/web/flexbox.png b/slides/wk09/img/web/flexbox.png
deleted file mode 100644
index 40282210afae036fca7ee7d1fded5d6110b30650..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/flexbox.png and /dev/null differ
diff --git a/slides/wk09/img/web/full-skeleton.png b/slides/wk09/img/web/full-skeleton.png
deleted file mode 100644
index fa79f9691d037b698ac6193350f511b9645b9600..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/full-skeleton.png and /dev/null differ
diff --git a/slides/wk09/img/web/spottheheron-android.gif b/slides/wk09/img/web/spottheheron-android.gif
deleted file mode 100644
index 8cd77214db5c25fd769b05592c908e9040d836f4..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/spottheheron-android.gif and /dev/null differ
diff --git a/slides/wk09/img/web/spottheheron-web.gif b/slides/wk09/img/web/spottheheron-web.gif
deleted file mode 100644
index e47b7cc3794bb9c70009e8f46bbb31a43b893330..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/spottheheron-web.gif and /dev/null differ
diff --git a/slides/wk09/img/web/spottheheronscreen.png b/slides/wk09/img/web/spottheheronscreen.png
deleted file mode 100644
index 95458745f69650794ec867b65ab98cf1eb0747b9..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/spottheheronscreen.png and /dev/null differ
diff --git a/slides/wk09/img/web/viewpagesource.png b/slides/wk09/img/web/viewpagesource.png
deleted file mode 100644
index bf7a54811f5104150016f0773e6d07c7b2170880..0000000000000000000000000000000000000000
Binary files a/slides/wk09/img/web/viewpagesource.png and /dev/null differ
diff --git a/slides/wk09/ml.html b/slides/wk09/ml.html
deleted file mode 100644
index 772a7fbddbb5985f3721fcd2605b3e9d3b196d47..0000000000000000000000000000000000000000
--- a/slides/wk09/ml.html
+++ /dev/null
@@ -1,671 +0,0 @@
----
-layout: presentation
-title: Using Mobile Phones for Machine Learning
-description: Using Mobile Phones for Machine Learning
-class: middle, center, inve
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Google maps
-
-![![:img google maps,100%](img/ml/google.jpg)](img/ml/google.jpg)
-
-
-.footnote[Picture from [Machine Learning on your Phone](https://www.appypie.com/top-machine-learning-mobile-apps)]
-
-???
-fame/shame
-neighborhood traffic...
-shorter commutes...
----
-# Machine Learning and your Phone
-
-Jennifer Mankoff
-
-CSE 340 {{site.quarter}}
-
-.footnote[Slides credit: Jason Hong, Carnegie Mellon University
- [Are my Devices Spying on Me? Living in a World of
-Ubiquitous
-Computing](https://www.slideshare.net/jas0nh0ng/are-my-devices-spying-on-me-living-in-a-world-of-ubiquitous-computing);
-]
-
----
-layout: false
-
-.left-column[
-## Smartphones are Intimate Fun Facts about Millennials
-
-![:fa thumbs-down] 83% sleep with phones
-]
-.right-column[
-![:img Millenial with phone in bed, 100%](img/ml/phone-bed.jpg)
-]
----
-.left-column[
-## Smartphones are Intimate Fun Facts about Millennials
-
-![:fa thumbs-down] 83% sleep with phones
-
-![:fa thumbs-down]  90% check first thing in morning
-]
-.right-column[
-![:img Millenial with phone in bed, 100%](img/ml/phone-bed.jpg)
-]
----
-.left-column[
-## Smartphones are Intimate Fun Facts about Millennials
-
-![:fa thumbs-down] 83% sleep with phones
-
-![:fa thumbs-down] 90% check first thing in morning
-
-![:fa thumbs-down]  1 in 3 use in bathroom
-
-]
-.right-column[
-![:img Millenial with phone in bed, 100%](img/ml/phone-bed.jpg)
-
-]
----
-# Smartphone Data is Intimate
-
-![:img Picture of smart phone screens with phone numbers; map; and sensor data, 60%](img/ml/personal.png)
-
-| Who we know           | Sensors               | Where we go   |
-|-----------------------|-----------------------|---------------|
-| (contacts + call log) | (accel, sound, light) | (gps, photos) |
-
----
-# Some useful applications of this data
-
-![:img Picture of LeafSnap app, 60%](img/ml/leafsnap.jpg)
-
-.footnote[[LeafSnap](http://leafsnap.com/) uses computer vision to
-identify trees by their leaves]
-
----
-# Some useful applications of this data
-
-![:img Picture of Aipoly app, 60%](img/ml/aipoly.jpg)
-
-.footnote[[Vision AI](https://www.aipoly.com/) uses computer vision to
-identify images for the Blind and Visually Impaired]
-
----
-# Some useful applications of this data
-
-![:img Picture of Carat app, 60%](img/ml/Carat.jpg)
-
-.footnote[[Carat: Collaborative Energy
-Diagnosis](http://carat.cs.helsinki.fi/) uses machine learning to save
-battery life]
----
-# Some useful applications of this data
-
-![:img Picture of Imprompdo app, 50%](img/ml/imprompdo.jpg)
-
-.footnote[[Imprompdo](http://imprompdo.webflow.io/
-) uses machine learning to recommend activities to do, both fund and todos]
----
-# How do these systems work?
-
-
-Machine Learning is used to make these kinds of predictions 
-- Machine learning is one area of Artificial Intelligence 
-- This is the kind that’s been getting lots of press 
-
-The goal of machine learning is to develop systems that can improve
-performance with more experience 
-- Can use "example data" as "experience"
-- Uses these examples to discern patterns 
-- And to make predictions
----
-# Two main approaches
-
-![:fa eye] *Supervised learning* (we have lots of examples of what should be
- predicted)
- 
-![:fa eye-slash] *Unsupervised learning* (e.g. clustering into groups and inferring what
-they are about)
-
-![:fa low-vision] Can combine these (semi-supervised)
-
-![:fa history]  Can learn over time or train up front
-
----
-.left-column[
-## In class exercise
-
-![:fa bed, fa-7x] 
-]
-.right-column[
-How might you recognize sleep?
-
-- What recognition question
-- What sensors
-]
-???
-
-(sleep quality? length?...)
-
-How to interpret sensors?
-
----
-.left-column[
-## In class exercise
-
-- What recognition question (sleep quality? length?...)
-- What sensors
-- How to interpret sensors?
-]
-.right-column[
-![:img Sleep trace for accelerometer and sound, 80%](img/ml/sleep.png)
-]
-
----
-# How do we program this?
-
-Write down some rules
-
-Implement them
-
----
-# ML is a major shift in thinking
-
-Old Approach: Create software by hand
-- Use libraries (like JQuery) and frameworks
-- Create content, do layout, code up functionality
-- Deterministic (code does what you tell it to)
-
-New Approach: Collect data and train algorithms
-- Will still do the above, but will also have some functionality based
-on ML 
-- *Collect lots of examples and train a ML algorithm*
-- *Statistical way of thinking*
-
----
-# How Machine Learning is Typically Used
-
-Step 1: Gather lots of data (easy on a phone!)
---
-
-Step 2: Figure out useful features
-- Convert data to information (not knowledge!)
-- (typically) Collect labels
-
----
-# How Machine Learning is Typically Used
-
-Step 1: Gather lots of data (easy on a phone!)
-
-Step 2: Figure out useful features
-
-Step 3: Select and train the ML algorithm to make a prediction
-- Lots of toolkits for this
-- Lots of algorithms to choose from
-- Mostly treat as a "black box" 
-
----
-# Example: Decision tree for predicting premature birth
-
-![:img decision tree, 50%](img/ml/decisiontree.png)
-
-
----
-# Examwple: Deep Learning for Image Captioning
-
-![:img Captioning Images. Note the errors,
-40%](img/ml/captioning.png)
-
-.footnote[[Captioning images. Note the
-errors.](http://cs.stanford.edu/people/karpathy/deepimagesent/) Deep
-learning now
-[available on your phone!](https://www.tensorflow.org/lite)]
-
-???
-Note differences between these: one label vs many
----
-# Training process
-
-![:img ML Training Process, 60%](img/ml/training.png)
-
----
-# How Machine Learning is Typically Used
-
-Step 1: Gather lots of data (easy on a phone!)
-
-Step 2: Figure out useful features
-
-Step 3: Select and train the ML algorithm
-
-Step 4: Evaluate metrics (and iterate)
-
-???
-See how well algorithm does using several metrics
-Error analysis: what went wrong and why
-Iterate: get new data, make new features
----
-# Evaluation Concerns
-
-Accuracy: Might be too error-prone
-
----
-.left-column[
-## Assessing Accuracy]
-.right-column[
-
-Prior probabilities
-- Probability before any observations (ie just guessing)
-- Ex. ML classifier to guess if a person is male or female based on name
- - Just assume all names are female (50% will be right)
-- Your trained model needs to do better than prior
-
-Other baseline approaches
-- Cheap and dumb algorithms
-- Ex. Names that end in vowel are female
-- Your model needs to do better than these too
-]
-
-???
-We did this to study gender's impact on academic authorship; doctors reviews
-
----
-.left-column[
-## Assessing Accuracy]
-
-.right-column[
-Don't just measure accuracy (percent right)
-
-Sometimes we care about *False positives* vs *False negatives*
-]
----
-.left-column[
-## Assessing Accuracy
-
-## Confusion matrix helps show this]
-
-.right-column[
-
-|             |              | .red[Prediction]     |                      |
-|-------------|--------------|----------------------|----------------------|
-|             |              | **Positive**         | **Negative**         |
-| .red[Label] | **Positive** | True Positive (good) | False Negative (bad) |
-|             | **Negative** | False Positive (bad) | True Negative (good) |
-
-Accuracy is (TP + TN) / (TP + FP + TN + FN)
-
-]
----
-.left-column[
-## Assessing Accuracy
-
-## Precision
-]
-
-.right-column[
-
-|             |              | .red[Prediction]           |                      |
-|-------------|--------------|----------------------------|----------------------|
-|             |              | **Positive**               | **Negative**         |
-| .red[Label] | **Positive** | .red[True Positive (good)] | False Negative (bad) |
-|             | **Negative** | .ref[False Positive (bad)] | True Negative (good) |
-
-Precision = TP / (TP+FP)
-
-Intuition: Of the positive items, how many right?
-
-]
-
----
-.left-column[
-## Assessing Accuracy
-
-## Recall
-]
-.right-column[
-
-|        |              | Prediction                 |                            |
-|--------|--------------|----------------------------|----------------------------|
-| Actual |              | **Positive**               | **Negative**               |
-|        | **Positive** | .red[True Positive (good)] | .red[False Negative (bad)] |
-|        | **Negative** | False Positive (bad)       | True Negative (good)       |
-
-Recall = TP / (TP+FN)
-
-Intuition: Of all things that should have been positive, how many actually labeled correctly?
-]
-
----
-# Evaluation Concerns
-
-Accuracy: Might be too error-prone
-
-Overfitting: Your ML model is too specific for data you have
-- Might not generalize well
-
-![:img overfitting, 40%](img/ml/overfitting.png)
-
----
-# Avoiding Overfitting
-
-
-To avoid overfitting, typically split data into training set and test set
-
-Train model on training set, and test on test set
-
-Often do this through cross validation
-
-![:img cross validation, 40%](img/ml/cross-validation.png)
-
-
-
-
----
-# How Machine Learning is Typically Used
-
-Step 1: Gather lots of data (easy on a phone!)
-
-Step 2: Figure out useful features
-
-Step 3: Select and train the ML algorithm
-
-Step 4: Evaluate metrics (and iterate)
-
-Step 5: Deploy
----
-# What makes this work well?
-
-Typically more data is better
-
-Accurate labels important
-
-Quality of features determines quality of results
-
-.red[*NOT* as sophisticated as the media makes out]
---
-
-.red[*BUT* can infer all sorts of things]
----
-# AI / Machine Learning Not As Sophisticated as in Media
-
-
-A lot of people outside of computer science often ascribe human
-behaviors to AI systems 
-- Especially desires and intentions 
-- Works well for sci-fi, but not for today or near future 
-
-These systems only do: 
-- What we program them to do 
-- What they are trained to do (based on the (possibly biased) data) 
----
-# Concerns
-
-Significant Societal Challenges for Privacy
----
-.left-column[
-## Wide Range of Privacy Risks]
-.right-column[
-
-| Everyday Risks     | Medium Risk         | Extreme Risks     |
-|--------------------|---------------------|-------------------|
-| Friends, Family    | Employer/Government | Stalkers, Hackers |
-| Over-protection    | Over-monitoring     | Well-being        |
-| Social obligations | Discrimination      | Personal safety   |
-| Embarrassment      | Reputation          | Blackmail         |
-|                    | Civil Liberties     |                   |
-
-- It's not just Big Brother 
-- It-s not just corporations 
-- Privacy is about our relationships with every other individual and
-  organization out there
-  
-]
----
-# Five Reasons Why Privacy is Hard
-
-### 1 Strong Incentives to for Companies to Collect Data 
-### 2 Low Knowledge, Awareness, Motivation by Devs 
-### 3 Companies Get Little Pushback on Privacy 
-### 4 Unclear What the Right Thing To Do Is 
-### 5 Burden on End-Users is Too High 
-
-???
-- Barriers to collecting data are also really low 
-- More data means better predictive models 
-- Many developers don’t realize how much data their app is collecting (Or that it was collecting data at all)
- - In one study, over 40% of apps collect data only because of these  libraries
-- Lack of info means privacy does not influence customer purchases. Less than 0.1% of reviews on Google Play mention privacy concerns 
-- Individuals also   have to make too many decisions 
----
-# Concerns
-
-Significant Societal Challenges for Privacy
-
-Who should have the initiative?
-
----
-# Mixed-initiative interfaces
-
-Basically, who is in charge?
-- Does person initiate things? Or computer?
-- How much does computer system do on your behalf?
-
-Example: Autonomous vehicles
-- Some people think Tesla autopilot is full autonomous, leads to risky actions
-
-Why initiative matters
-- Potential major shift: instead of direct manipulation, some smarts (intelligent agent) for automation
----
-.left-column50[
-## Mixed-initiative best practices
-- Significant value-added automation
-- Considering uncertainty
-- Socially appropriate interaction w/ agent
-- Consider cost, benefit, uncertainty
-- Use dialog to resolve uncertainty
-- Support direct invocation and termination
-- Remember recent interactions
-]
-.right-column50[
-
-![:img mixed initiative figure, 100%](img/ml/mixed-initiative.png)
-]
----
-.left-column50[
-## Mixed-initiative best practices
-- Significant value-added automation
-- Considering uncertainty
-- Socially appropriate interaction w/ agent
-- Consider cost, benefit, uncertainty
-- Use dialog to resolve uncertainty
-- Support direct invocation and termination
-- Remember recent interactions
-]
-.right-column50[
-
-![:img mixed initiative figure, 100%](img/ml/mixed2.png)
-]
-???
-Can see what agent is suggesting, in terms of scheduling a meeting
-
----
-.left-column50[
-## Mixed-initiative best practices
-- Significant value-added automation
-- Considering uncertainty
-- Socially appropriate interaction w/ agent
-- Consider cost, benefit, uncertainty
-- Use dialog to resolve uncertainty
-- Support direct invocation and termination
-- Remember recent interactions
-]
-.right-column50[
-
-![:img mixed initiative figure, 100%](img/ml/mixed3.png)
-]
-???
-Uses anthropomorphized aganet
-Uses speech for input
-Uses mediation to help resolve conflict
----
-.left-column[
-## Mixed-initiative best practices
-]
-
-.right-column[
-Built-in cost-benefit model in system
-- If perceived benefit >> cost, then do the action
-- Otherwise wait
-
-Note that this is just one point in design space (1999), and still lots of open questions
-- Ex. Should “intelligence” be anthropomorphized?
-- Ex. How to learn what system can and can’t do?
-- Ex. What kinds of tasks should be automated / not?
-- Ex. What are strategies for showing state of system?
-- Ex. What are strategies for preventing errors?
-]
----
-
-# Concerns
-
-Significant Societal Challenges for Privacy
-
-Who should have the initiative?
-
-Bias in Machine Learning
----
-background-image: url(img/ml/gma.png)
-
-
-.quote[Johnson says his jaw dropped when he read one of the reasons American
-Express gave for lowering his credit limit:  
-
-![:fa quote-left] Other customers who have used their card at establishments
-where you recently shopped have a poor repayment history with American
-Express.
-]
----
-.right-column[
-
-![:img bias figure, 60%](img/ml/bias.png)
-]
----
-
-# Concerns
-
-Significant Societal Challenges for Privacy
-
-Who should have the initiative?
-
-Bias in Machine Learning
-
-Understanding ML
----
-# Understanding what is going on: Forming Mental Models
-
-How does a system know I am addressing it?
-
-How do I know a system is attending to me?
-
-When I issue a command/action, how does the system know what it relates to?
-
-How do I know that the system correctly understands my command and correctly executes my intended action?
-
-.footnote[
-Belloti et al., CHI 2002 ‘Making Sense of Sensing’
-]
----
-# Wrong location-based rec
-
-
-![:img wrong, 60%](img/ml/wrong.png)
-???
-Why did it not tell me about the Museum? How does it determine my location? 
-Providing explana7ons to these ques7ons can make Intelligent systems Intelligible 
-
-other examples: caregiving hours by insurance company, etc
-
----
-# Types of feedback
-
-Feedback: crucial to user’s understanding of how a system works and helping guide future action 
-- What did the system do?
-- What if I do W, what will the system do? 
-- Why did the system do X?
-- Why did the system not do Y
-- How do I get the system to do Z? 
----
-# Summary ML and ethics
-
-ML is powerful (but not perfect), often better than heuristics
-
-Basic approach is collect data, train, test, deploy
-
-Hard to understand what algorithms are doing (transparency)
-- ML algorithms just try to optimize, but might end up finding a proxy for race, gender, computer, etc
-- But hard to inspect these algorithms
-- Still a huge open question
-
-Privacy
-- How much data should be collected about people?
-- How to communicate this to people?
-- What kinds of inferences are ok?
-
----
-# End of deck
-
----
-.left-column[
-## Regression
-
-![:img Example of regression, 100%](img/ml/regression.png)
-]
-.right-column[
-Predicting a *continuous value* based on inputs
-- Ex. House price based on #rooms, #bathrooms, etc
-- Ex. #views based on page content
-
-Simple example: linear regression
-- Same as in statistics
-- Seeks to minimize errorin predictions
-
-Lots of algorithms
-- See Wikipedia
-]
-
----
-
-.left-column[
-## Example classification algorithms]
-.right-column[
-Naïve Bayes (probabilities)
-
-Neural Networks / Deep Learning (human brain)
-
-**Decision Tree (workflow)**
-
-Support Vector Machine (analogy / similarity)
-
-]
-
----
-.left-column[
-## Classification
-]
-.right-column[
-Predicting from a *set of categories*
-- Ex. {Spam, Ham}?
-- Ex. {Chalupa, Taco, Burrito}?
-
-Lots of variants
-- Multi-class (the examples above)
-- One-class (identifies all objects in that class)
-- Multi-label (it’s both a Chalupa and a Burrito)
-
-Also lots of algorithms
-- See Wikipedia
-]
-
diff --git a/slides/wk09/web.html b/slides/wk09/web.html
deleted file mode 100644
index f1b9ad651bf758d2e98857cc036b0c847a506743..0000000000000000000000000000000000000000
--- a/slides/wk09/web.html
+++ /dev/null
@@ -1,337 +0,0 @@
----
-layout: presentation
-title: Web Programming
-description: Interaction Programming in Web Development
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Interaction Programming in Web Development
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout: false
-
-[//]: # (Outline Slide)
-# Today's goals
-
-- Interaction Programming in Web Development
-  - Crash course on Web Programming
-  - Spot The Heron: web version
-
----
-# Spot The Heron review
-
-Code for the [Spot The Heron](https://gitlab.cs.washington.edu/cse340-20sp-students/cse340-spottheheron) case study.
-- Layout was achieved with high level tool which generated XML
-- Images were stored in the "drawable" directory
-- When app started the `AppCompatActivity#onCreate(Bundle savedInstanceState)` was called. This method:
-  - Set the app to use the XML defined layout
-  - Initialized some variables
-  - Registered callbacks for the three buttons - previous, slideshow, and next
-  - Used the `loadImage(int image)` to load the first image (0th index) in the list of file names
-- The `loadImage(int image)` method
-  - Got a handle on the image view interactor using an id `findViewById(R.id.heronView)`
-  - Set the image view's source to be the new image.
-  - Set the content description of the image view to be in line with the new image.
-- If the previous or next button was pressed, the `switchImage(boolean forward)` method is called.
-- If the slideshow button was pressed, a timer would start that changes the image every 1500 ms
-
----
-# Spot The Heron Comparison
-
-|Android Version | Web Version |
-| :--: | :--: |
-|![:img Spot The Heron Android Version, 32%](img/web/spottheheron-android.gif)|![:img Spot the Heron Web Version, 35%](img/web/spottheheron-web.gif)|
-
----
-# Interlude: What is a web page really?
-
-| Content | Structure | Style | Behavior |
-| :--: | :--: | :--: | :--: |
-|![:img bones, 20%](img/web/bones.png)|
-| Words and Images | HTML | CSS | JavaScript |
-
----
-# Interlude: What is a web page really?
-
-| Content | Structure | Style | Behavior |
-| :--: | :--: | :--: | :--: |
-|![:img bones, 40%](img/web/bones.png)|![:img Skeleton, 40%](img/web/full-skeleton.png)|
-| Words and Images | HTML | CSS | JavaScript |
-
----
-# Interlude: What is a web page really?
-
-| Content | Structure | Style | Behavior |
-| :--: | :--: | :--: | :--: |
-|![:img bones, 50%](img/web/bones.png)|![:img Skeleton, 50%](img/web/full-skeleton.png)|![:img Boundless Skeleton, 50%](img/web/dressed-skeleton.png)|
-| Words and Images | HTML | CSS | JavaScript |
-
-
----
-# Interlude: What is a web page really?
-
-| Content | Structure | Style | Behavior |
-| :--: | :--: | :--: | :--: |
-|![:img bones, 60%](img/web/bones.png)|![:img Skeleton, 60%](img/web/full-skeleton.png)|![:img Boundless Skeleton, 60%](img/web/dressed-skeleton.png)|![:img Animated Boundless Skeleton, 60%](img/web/animated-skeleton.gif)|
-| Words and Images | HTML | CSS | JavaScript |
-
----
-# Vocabulary
-
-- **Internet** - Hardware infrastructure of connected computers and wires
-- **World Wide Web (WWW) (http)** - The information on the Internet made up of files and folders stored on computers
-- **Hyper Text Markup Language (HTML), Cascading Style Sheets (CSS), & JavaScript (JS)** - The languages that we use to program our webpages
-- **Web Browser** An application (Chrome, Netscape, Safari) that interprets our web languages and renders it visually
-
----
-# Languages
-
-Java != JavaScript
-
-| Java | JavaScript | HTML/CSS |
-| -- | -- | -- |  |
-| Compiled &nbsp;&nbsp;  | Interpreted  | Rendered Data |
-| Type safe | Not type safe &nbsp;&nbsp;  | N/A |
-
----
-# Lifecycle of a browser* loading a page
-
-1. Fetch the page
-2. Parse the page
-3. Build up an internal representation of the web page
-4. Display the page
-
-.footnote[*: As seen by Chrome]
-
----
-# Fetch the Page
-
-1. Connect to the **Internet** and ask for the URL
-2. As a **DNS** (Domain name service) to find the machine with the appropriate resources
-3. Ask the machine with the resources for the web page with a **GET request**
-4. Transfer file(s) the internet using the **TCP/IP** protocol back to your machine.
-
----
-.left-column[# View Page Source
-
-[Spot The Heron Solution](webpages/spottheheron-solution.html)
-]
-
-.right-column[
-![:img Viewing the page source for the spot the heron app, 90%](img/web/viewpagesource.png)
-]
-
-
----
-# Parse and Display the Page
-
-.left-column[
-![:img Initial screen for the spot the heron app, 90%](img/web/spottheheronscreen.png)
-
-]
-
-.right-column[
-1. First line: <!DOCTYPE html>
-   -  Ok: need to build an internal representation of the page
-2. Line-by-line, go through the HTML
-   - If one of the tags links to a cascading style sheet (CSS) file, load and parse it
-   - If one of the tags links to Javascript (JS) for behavior, load and parse it
-3. FINALLY display the page…
-]
-
----
-# Hypertext Markup Language (HTML)
-
-- A subset of XML
-- Keywords that are surrounded by the ‘<‘ and ‘>’ (“alligators”) are Tags
-- Tags label the structure of parts of your web page
-  - You put the associated content within the tags
-- There are two types of tags
-  - Open and closing pairs
-    - Ex: <body>This is some text for my body</body>
-    - Most content tags will be of this type
-  - Self-closing tags
-    - `<img />`, `<hr />`, `<br />`, `<link />`
-- Every tag must be a pair or self-closing!
-- Tags can be nested!
-
-
----
-# Basic HTML Skeleton
-
-```html
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8">
-    <title></title>
-  </head>
-  <body>
-
-  </body>
-</html>
-```
-
-
----
-# Adding content
-
-- There are 100s of tags! See [Mozilla Developer Network](https://developer.mozilla.org/en-US/docs/Web/HTML/Element)!
-- Some simple tags include
-  - Title `<title></title>` (which nests inside your `<head></head>`)
-  - Headings `<h1></h1>` .. `<h6></h6>`
-  - Paragraphs `<p>`
-  - Ordered or unordered lists: `<ol></ol>`, `<ul></ul>`, with list elements `<li></li>`
-  - Horizontal rules `<hr />`
-  - Strong `<strong></strong>` which defaults to a bold style and emphasis `<em></em>` which defaults to italicized in most browsers.
-- Some tags add semantic context
-  - `<header></header>`: The header or banner that displays the title of the page
-  - `<main></main>`: The bulk of the content of the page
-  - `<footer></footer>`: The footer is optional but you can put contact info and copyright date in there.
-- Some tags need additional information, added to a tag with attributes
-  - Links to other pages `&lt;a href="filename"&gt;&lt;/a&gt;`
-  - Links to other pages `<img src="img.jpg" alt="Description!"/>`
-- Some tags (comments) are important for documentation `<!-- -->`
-
-
-
----
-# Document Object Model (DOM)
-
-.left-column[
-![:img DOM Example](img/web/dom.png)
-
-]
-
-.right-column[
-- This builds a hierarchy of document elements in what we call the **Document Object Model**
-- Looks very much like the Android Interactor Hierarchy
-
-
-]
-
----
-# Cascading Style Sheets (CSS)
-
-- Allows us to change the look and feel of the content on the page
-- Style is separated into a .css file
-  - Makes styling multiple pages easier
-  - Allows changing multiple pages easier
-- Style sheets must be linked to an html page in the <head> for the styles to work
-     `&lt;link href=“style.css” rel=“stylesheet” /&gt;`
-- Great example is [CSS Zen Garden](http://www.csszengarden.com/)
-
----
-# CSS
-
-.left-column[
-- Files consist of one or more rule sets
-- Each rule set has a selector which chooses which HTML elements you want to style
-- Style properties are set with rules which are  property/value pairs
-- Syntax is important
-- More on [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS)
-
-]
-
-.right-column[
-![:img CSS rules description](https://code.makery.ch/library/html-css/part3/css-rule.png)
-
-From [W3Schools](https://code.makery.ch/library/html-css/part3/)
-]
-
----
-# Layout in CSS
-
-Layout can be [complicated](https://www.amazon.com/CSS-Awesome-Mug-Programmer-Developer/dp/B06Y13QC8N),
-fortunately there is CSS [Flexbox](https://courses.cs.washington.edu/courses/cse154/flexboxducky/) or Grid!!
-
-![:img Sample screen from flexbox ducky game, 50%](img/web/flexbox.png)
-
-
----
-# Spot The Heron Conversion
-.left-column[
-Mind blowing demo time!
-]
-
-.right-column[
-![:img Goole chrome with the pet gallery loaded on the left and the element view on the right, 80%](img/web/chrome-inspector.png)
-]
-
----
-# Some Comparisons
-
-| Android | Web |
-| --- | --- |
-| Java | HTML/CSS/JS |
-| Layouts | CSS Flexbox or Grid |
-| Interactor Hierarchy   | Document Object Model (DOM) |
-| Content Description | alt text |
-| Paint objects on a canvas | CSS |
-| `onCreate`   | `window.addEventListener("load", init);` |
-| `View.OnClickListener#onClick`   | `domElement.addEventListener("click", callback);` |
-
----
-# The Application Stack for Devices - Review
-.left-column[.font-smaller[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-class ap,w,o,h yellow
-class hlt,t green
-
-</div>
-]]
-
-.right-column[
-- **Application Program** - An application designed for an end user to perform specific tasks.
-- **High Level Tools** - Graphical interfaces that that let you specify parts of your interface (such as layout). Subject to Worfian Effects
-- **Toolkit** - A set of libraries and tools you use to develop applications.
-- **Window System** - Manages window size and visibility across applications
-- **OS** - The operating system that is running on the device, providing system services such as acceess to displays, input devices, file I/O
-- **Hardware** - The device that is running software, such as an Android Phone
-
-High level tools and the the Toolkit are generally packaged as part of a toolkit but really should be thought of as separate things. (You can program the toolkit without the tools. )
-]
----
-# The Application Stack for Web Programming
-.left-column[.font-smaller[
-<div class="mermaid">
-  graph LR
-  ap[Application Program]
-  hlt[High Level Tools]
-  t[Toolkit]
-  w[Window System]
-  o[OS]
-  h[Hardware]
-
-class ap,w,o,h yellow
-class hlt,t green
-
-</div>
-]]
-
-.right-column[
-- **Application Program** - A web page
-- **High Level Tools** - Dream Weaver, Adobe XD, Google Web Designer, etc
-- **Toolkit** - HTML/CSS/JavaScript, jQuery, React, etc. Browser tools.
-- **Window System** - Browser running in a Windowing system.
-- **OS** - The web browser itself? Or the browser and the OS combined?
-- **Hardware** - The device that is running OS and browser, such as a Mac, PC or Phone.
-
-You can do web programming with a notepad editor and a browser, nothing more.
-]
----
-# End of Deck
diff --git a/slides/wk09/webpages/img/after.svg b/slides/wk09/webpages/img/after.svg
deleted file mode 100644
index ec2fa420965037676613a51722eeb6d321a0c630..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/img/after.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<svg
-    xmlns="http://www.w3.org/2000/svg"
-    viewBox="0 0 24 24"
-    id="vector">
-    <path
-        id="path"
-        d="M 10 6 L 8.59 7.41 L 13.17 12 L 8.59 16.59 L 10 18 L 16 12 Z"
-        fill="#000000"/>
-    <path
-        id="path_1"
-        d="M 0 0 L 24 0 L 24 24 L 0 24 Z"
-        fill="none"/>
-</svg>
diff --git a/slides/wk09/webpages/img/before.svg b/slides/wk09/webpages/img/before.svg
deleted file mode 100644
index fb07fa0cf6f2d3392cdb144a64311b7c87e0e5cc..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/img/before.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<svg
-    xmlns="http://www.w3.org/2000/svg"
-    viewBox="0 0 24 24"
-    id="vector">
-    <path
-        id="path"
-        d="M 15.41 7.41 L 14 6 L 8 12 L 14 18 L 15.41 16.59 L 10.83 12 Z"
-        fill="#000000"/>
-    <path
-        id="path_1"
-        d="M 0 0 L 24 0 L 24 24 L 0 24 Z"
-        fill="none"/>
-</svg>
diff --git a/slides/wk09/webpages/img/cold.jpg b/slides/wk09/webpages/img/cold.jpg
deleted file mode 100644
index 9b13846a9d5450f4b1cae09f1282440dfcac9b71..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/cold.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/dontcare.jpg b/slides/wk09/webpages/img/dontcare.jpg
deleted file mode 100644
index 7a0cdf895ad662528c4aafe1019e4dfd3659a982..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/dontcare.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/fishing.jpg b/slides/wk09/webpages/img/fishing.jpg
deleted file mode 100644
index a7dfe9604be5f6275fba6782f1c3b5e8476e9615..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/fishing.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/flying.jpg b/slides/wk09/webpages/img/flying.jpg
deleted file mode 100644
index e92fe38845efa6affa4ade9b96479488e3fc12c3..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/flying.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/gru.jpg b/slides/wk09/webpages/img/gru.jpg
deleted file mode 100644
index 0d1372fe6cdebfea639355a7d57158372cff3b31..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/gru.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/hidden.jpg b/slides/wk09/webpages/img/hidden.jpg
deleted file mode 100644
index 0fd03f0b2224951780af489ae16e8d25a54895ac..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/hidden.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/ic_navigate_next.xml b/slides/wk09/webpages/img/ic_navigate_next.xml
deleted file mode 100644
index 932261b4e108eaa248b3a65ab554e36c3aa640ef..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/img/ic_navigate_next.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-   <path
-        android:fillColor="#000000"
-        android:pathData="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
-    <path
-        android:pathData="M0 0h24v24H0z"
-        />
-</vector>
\ No newline at end of file
diff --git a/slides/wk09/webpages/img/ic_slideshow.xml b/slides/wk09/webpages/img/ic_slideshow.xml
deleted file mode 100644
index 47e37eb4105558fd5cc0b1226853fd7cd2be44f4..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/img/ic_slideshow.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt"
-    android:width="24dp"
-    android:height="24dp"
-    android:viewportWidth="24"
-    android:viewportHeight="24">
-    <path
-        android:fillColor="#000000"
-        d="M0 0h24v24H0z" />
-    <path
-        android:fillColor="#000000"
-        android:pathData="M10 8v8l5-4-5-4zm9-5H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/>
-</vector>
\ No newline at end of file
diff --git a/slides/wk09/webpages/img/log.jpg b/slides/wk09/webpages/img/log.jpg
deleted file mode 100644
index f68258248cd9496190a27722af1b4ec1efae5b8a..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/log.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/lonely.jpg b/slides/wk09/webpages/img/lonely.jpg
deleted file mode 100644
index 7b0c82a3d832979bfda248b5563f5bf1eb78d24c..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/lonely.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/reeds.jpg b/slides/wk09/webpages/img/reeds.jpg
deleted file mode 100644
index 6b11581e06ddddebda2dcc506bc141bcca2a55e3..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/reeds.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/reflection.jpg b/slides/wk09/webpages/img/reflection.jpg
deleted file mode 100644
index 18ded76e174597bf106d016612373a34e919c9c1..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/reflection.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/slideshow.svg b/slides/wk09/webpages/img/slideshow.svg
deleted file mode 100644
index d187b03ac8f66c779b8fed1f892f4955ffdd0cab..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/img/slideshow.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg
-    xmlns="http://www.w3.org/2000/svg"
-    viewBox="0 0 24 24"
-    id="vector">
-    <path
-        id="path_1"
-        d="M 10 8 L 10 16 L 15 12 L 10 8 Z M 19 3 L 5 3 C 3.9 3 3 3.9 3 5 L 3 19 C 3 20.1 3.9 21 5 21 L 19 21 C 20.1 21 21 20.1 21 19 L 21 5 C 21 3.9 20.1 3 19 3 Z M 19 19 L 5 19 L 5 5 L 19 5 L 19 19 Z"
-        fill="#000000"/>
-</svg>
diff --git a/slides/wk09/webpages/img/sunrise.jpg b/slides/wk09/webpages/img/sunrise.jpg
deleted file mode 100644
index d1b3e5f482a4e88c9de234695fe7eef91c0f73f6..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/sunrise.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/treebird.jpg b/slides/wk09/webpages/img/treebird.jpg
deleted file mode 100644
index 582e5d677d4da1b9b5846f7d8be2b7b5bc03fa3f..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/treebird.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/img/wading.jpg b/slides/wk09/webpages/img/wading.jpg
deleted file mode 100644
index 38198c303fe104efa44a10059419b43129e7c54a..0000000000000000000000000000000000000000
Binary files a/slides/wk09/webpages/img/wading.jpg and /dev/null differ
diff --git a/slides/wk09/webpages/spottheheron-solution.html b/slides/wk09/webpages/spottheheron-solution.html
deleted file mode 100644
index 7206ed583167fa1319d332d16419892f665c3e7f..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/spottheheron-solution.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-  Lauren Bricker
-   Interaction Programming in Web Programming Lecture
-  Spot the Heron as a web page
--->
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Spot the Heron</title>
-    <link rel="stylesheet" href="spottheheron.css">
-    <!-- <script src="spottheheron.js"></script> -->
-    <script src="spottheheron-solution.js"></script>
-  </head>
-  <body>
-    <section>
-      <h1>Spot The Heron</h1>
-      <img id="heron-pic" src="img/cold.jpg" alt="A very cold heron">
-      <div>
-        <button id="prev-btn"><img src="img/before.svg" alt="Go to previous pet"></button>
-        <button id="play-btn"><img src="img/slideshow.svg" alt="Run slideshow"></button>
-        <button id="next-btn"><img src="img/after.svg" alt="Go to next pet"></button>
-      </div>
-    </section>
-  </body>
-</html>
diff --git a/slides/wk09/webpages/spottheheron-solution.js b/slides/wk09/webpages/spottheheron-solution.js
deleted file mode 100644
index 607fab3619e6c456267d3e01155025ae22eb6c41..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/spottheheron-solution.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
-  Lauren Bricker
-  Interaction Programming in Web Programming Lecture
-  Spot the Heron as a web page
-  Javascript to add the behavior to the static web page.
-*/
-
-"use strict";
-(function() {
-
-  /** List of images in the img directory */
-  let images = ["cold", "dontcare", "fishing", "flying",
-            "gru", "hidden", "log", "lonely", "reeds", "reflection", "sunrise",
-            "treebird", "wading"];
-
-  /** Index of currently selected Image */
-  let whichImage;
-
-
-  /** Whether we're in the slideshow or not */
-  let inSlideshow = false;
-
-  /** How many seconds between flipping images in the image view */
-  const SLIDESHOW_TIME = 1500;
-
-  let timer = null;
-
-  window.addEventListener("load", init);
-
-  // Note: This function is called as soon as the window is loaded (and the browser
-  // has created the HTML DOM for the page)
-  function init() {
-    // Add event listeners for clicking the #prev-btn, #next-btn, and #play-btn.
-    id("prev-btn").addEventListener("click", function() {switchImage(false);} );
-    id("next-btn").addEventListener("click", function() {switchImage(true);} );
-    id("play-btn").addEventListener("click", doSlideshow);
-    inSlideshow = false;
-    whichImage = 0;
-    loadImage(whichImage);
-  }
-
-  // Callback to handle the slideshow button
-  function doSlideshow () {
-      if (!inSlideshow) {
-          //sets image to flip in SLIDESHOW_TIME ms.
-          timer = setInterval(intervalImage, SLIDESHOW_TIME);
-      }
-      else {
-          //turns off auto flipping
-          clearInterval(timer);
-          timer = null;
-      }
-      inSlideshow = !inSlideshow;
-  }
-
-
-  // Add the rest of the functions here!
-  /** Method to load an image from the images array into the heronView ImageView interactor
-   *
-   * @param img the number of the image to load, assumes 0 <= img < images.length
-   */
-  function loadImage(img) {
-      let heronView = id("heron-pic");
-      heronView.src = "img/" + images[img] + ".jpg";
-      heronView.alt = images[img];
-  }
-
-  /** Method to move onto the next or previous image, depending on the flag passed in
-   *
-   * @param forward true if you are to go to the next image, false if not.
-   */
-  function switchImage(forward) {
-      if (forward) {
-          if (whichImage == images.length - 1)
-              whichImage = 0;
-          else
-              whichImage++;
-      }
-      else {
-          if (whichImage == 0)
-              whichImage = images.length - 1;
-          else
-              whichImage--;
-      }
-      loadImage(whichImage);
-  }
-
-  /** Method to keep flipping the images.
-    *
-    */
-  function intervalImage() {
-    // Switches image
-    switchImage(true);
-
-  }
-
-  /** -------------------------- Helper functions -------------------------- */
-  /**
-   * Returns the element that has the ID attribute with the specified value.
-   * @param {string} idName - element ID
-   * @returns {object} DOM object associated with id.
-   */
-  function id(idName) {
-    return document.getElementById(idName);
-  }
-
-})();
diff --git a/slides/wk09/webpages/spottheheron.css b/slides/wk09/webpages/spottheheron.css
deleted file mode 100644
index 5f83d96865f934651ac9933e9283917ddd970148..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/spottheheron.css
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-  Lauren Bricker
-   Interaction Programming in Web Programming Lecture
-  Spot the Heron as a web page
-  Styles to make the Spot the Heron app look purty.
-*/
-
-body {
-  /* simulating the screen size */
-  width: 540px;
-  height: 960px;
-  border-radius: 10px;
-  border: 2px solid black;
-  margin: 1em auto 0 auto;
-}
-
-
-section {
-  margin: 1.5em;
-  display: flex;
-  flex-direction: column;
-  justify-content: flex-start;
-  height: 95%;
-}
-
-h1 {
-  background-color: #c0FFEE;
-  font-size: 2em;
-  color: #303F9F;
-  text-align: center;
-  font-weight: bold;
-  font-family: roboto, sans-serif;
-  margin: 0;
-  padding: .1em;
-  margin-bottom: .8em;
-}
-
-img {
-  margin: 0;
-}
-
-div {
-  display: flex;
-  justify-content: space-between;
-  margin-top: auto;
-  margin-bottom:
-}
-
-button {
-  height: 100px;
-  width: 100px;
-  text-align: center;
-  vertical-align: center;
-  border: 0;
-  padding: 0;
-}
diff --git a/slides/wk09/webpages/spottheheron.html b/slides/wk09/webpages/spottheheron.html
deleted file mode 100644
index 1dd9ba0d63f24b04eae09ed79b958c4e22b95e33..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/spottheheron.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-  Lauren Bricker
-   Interaction Programming in Web Programming Lecture
-  Spot the Heron as a web page
--->
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Spot the Heron</title>
-  </head>
-  <body>
-    <section>
-      <h1>Spot The Heron</h1>
-      <img id="heron-pic" src="img/cold.jpg" alt="A very cold heron">
-      <div>
-        <button id="prev-btn"><img src="img/before.svg" alt="Go to previous pet"></button>
-        <button id="play-btn"><img src="img/slideshow.svg" alt="Run slideshow"></button>
-        <button id="next-btn"><img src="img/after.svg" alt="Go to next pet"></button>
-      </div>
-    </section>
-  </body>
-</html>
diff --git a/slides/wk09/webpages/spottheheron.js b/slides/wk09/webpages/spottheheron.js
deleted file mode 100644
index fe18db8747228e56ce1a333372956dc967e3a968..0000000000000000000000000000000000000000
--- a/slides/wk09/webpages/spottheheron.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-  Lauren Bricker
-  Interaction Programming in Web Programming Lecture
-  Spot the Heron as a web page
-  Javascript to add the behavior to the static web page.
-*/
-
-"use strict";
-(function() {
-
-  window.addEventListener("load", init);
-
-  // Note: This function is called as soon as the window is loaded (and the browser
-  // has created the HTML DOM for the page)
-  function init() {
-    // Add event listeners for clicking the #prev-btn, #next-btn, and $play-btn.
-  }
-
-  // Add the rest of the functions here!
-
-
-
-  /** -------------------------- Helper functions -------------------------- */
-  /**
-   * Returns the element that has the ID attribute with the specified value.
-   * @param {string} idName - element ID
-   * @returns {object} DOM object associated with id.
-   */
-  function id(idName) {
-    return document.getElementById(idName);
-  }
-
-})();
diff --git a/slides/wk10/final.html b/slides/wk10/final.html
deleted file mode 100644
index 9d263d283d741332158ac48bac06ce280de83920..0000000000000000000000000000000000000000
--- a/slides/wk10/final.html
+++ /dev/null
@@ -1,446 +0,0 @@
----
-layout: presentation
-title: Final Exam Review
-description: Final Exam Review
-class: middle, center, inverse
----
-name: inverse
-layout: true
-class: center, middle, inverse
----
-# Final Exam Review
-
-Jennifer Mankoff
-
-CSE 340 Spring 2019 
-
----
-layout: false
-
-.title[Plan for Final (Monday 8:30-10)]
-.body[
-Will cover material from whole course
-
-Emphasis on second half
-
-Same basic structure, more questions
-- Long answer questions
-- Short answer questions
-- Coding questions
-- 'Cheat Sheet' allowed (2 sided, hand written)
-
-Nothing on sustainability; augmented reality
-
-
-]
----
-.title[Subjective exam question advice]
-.body[
-Study by synthesizing and summarizing material
-
-An adequate answer can get you around 85%
-Ex:
-Human eyes have cones that can see red green and blue. Yellow is just
-a mix of these. 
-
-A complete, deeper answer can get you an A 
-Ex:
-Our eyes can only detect red, green and blue wavelengths of light
-(with cones) and greyscale (with rods). They see color as a
-combination of these wavelengths. Thus, displaying “true” yellow
-pixels won’t make a difference since our eyes will see them as a
-combination of red and green anyway. 
-
-
-When writing: Aim to stay within 10% of suggested length, make a point
-and then provide support for it. A verbose answer may get you back to
-B (if redundant or wrong)  
-
-
-Show your work extra important 
-]
-
----
-.title[Core concepts from first half]
-.body[
-
-Input
-- Input models (events)
-- Event dispatch
-- Event handling (PPS) likely coding problem
-- Callbacks to application likely coding problem
-
-Output
-- Interactor Hierarchy design & use
-- Drawing models (`onDraw()`) likely coding problem
-- Layout (`onLayout()` or `XML`) likely coding problem
-- Damage and redraw process
-]
----
-.title[And Introduced Model View Controller]
-.body[
-Model
-- Model of a single interactor: Typically a field
-- Application model
- - Separate from view model
-- Typically more persistent (e.g., saved with bundler)
-
-View
-- `onDraw()` in a single interactor
-- Interactor hierarchy in an application
-
-Controller
-- PPS in a single interactor
-- callbacks (e.g., custom listeners) in an application
-]
----
-.left-column50[
-## 2D Drawing -> 3D modeling
-
-Same core concepts
-
-Now in OpenSCAD
-
-Key ideas:
-- 3D
- - `cube (size)`
- - `cylinder (h, r|d, center)`
- - `polyhedron (points, triangles, convexity)`
- - `sphere (radius | d=diameter)`
- ]
- 
-.right-column50[
-## Similar Transformations
-
-- Transformations
- - `translate ([x, y, z])`
- - `rotate ([x, y, z])`
- - `scale ([x, y, z])`
- - `resize ([x, y, z], auto)`
-- Boolean operations
- - `union()`
- - `difference()` (subtract second from first)
- - `intersection()`
-]
-
-???
-Limitations of 3D printing?
-
-cost for large scale manufacturing
-
-
----
-.title[Studies]
-
-.body[
-
-<div class="mermaid">
-graph LR
-S((.)) --> Hypothesis((Hypothesis:<br>Decreased seek <br>time and errors))
-Hypothesis -- "Study Design" --> Method((2 menu x <br> 3 task conditions ))
-Method -- "Run Study" --> Data((Consent<br>Consistency))
-Data -- "Clean and Prep" --> Analysis((Clean<br>Compute))
-Analysis --> Conclusions((Conclusions))
-
-classDef finish outline-style:double,fill:#d1e0e0,stroke:#333,stroke-width:2px;
-classDef normal fill:#e6f3ff,stroke:#333,stroke-width:2px;
-classDef start fill:#d1e0e0,stroke:#333,stroke-width:4px;
-classDef invisible fill:#FFFFFF,stroke:#FFFFFF,color:#FFFFFF
-
-linkStyle 0 stroke-width:4px;
-linkStyle 1 stroke-width:4px;
-linkStyle 2 stroke-width:4px;
-linkStyle 3 stroke-width:4px;
-linkStyle 4 stroke-width:4px;
-
-
-class S invisible
-class Hypothesis,Conclusions start
-class Method,Data,Analysis normal
-</div>
-
-method:
-conditions | sessions | trials
-
-ethics:
-beneficence | respect for persons | justice
-
-- Which is violated by a coercive statement in a consent form?
-- Which is violated by an inequitable selection of participants?
-- Which is violated by risky, pointless research?
-
-analysis:
-How do we determine causality?
-   - correlation
-   - intervention
-]
-
----
-.title[Accessibility]
-.body[
-**Disability** is a
-mismatched interaction
-between someone and
-their context
-]
----
-.title[Example Q1: Which is true about disability?]
-.body[
-A personal attribute
-Context dependent
-Permanent
-]
----
-.title[Example Q2: Is using a phone while holding a dog leash]
-.body[
-Temporary impairment
-Permanent impairment
-Situational impairment?
-]
----
-.title[Example Q3: List three examples of Assistive technologies]
-
-???
-Screen reader
-Zooming
-Speech input
-Sticky keys
-Xbox adaptive controller
-High contrast interaction
-
----
-.title[Accessibility Testing]
-.body[
-
-| Error                | Description                                                                                                                   |
-|----------------------|-------------------------------------------------------------------------------------------------------------------------------|
-| Clickable Items      | Overlapping clickable items                                                                                                   |
-| Editable Image Label | TextView has a content description. This might interfere with a screen reader’s ability to read the content of the text field |
-| Image Contrast       | Low contrast in image or icon                                                                                                 |
-| Item Descriptions    | Items with identical speakable text                                                                                           |
-| Item Label           | Missing element label                                                                                                         |
-| Item Type Label      | Item label ends with type, e.g., “Play Button.” TalkBack automatically announces item type, so information is redundant       |
-| Link                 | URL in link may be invalid                                                                                                    |
-| Text Contrast        | Low text contrast between foreground and background                                                                           |
-| Touch Target         | Item is too small|
-
-]
-???
-minimum to fix each problem (legal accessibility)
-
-true accessibility
-
----
-.title[Affordances & Feedback
-]
-.body[
-Good Affordance| Bad Affordance
-----|----
-![:img Picture of a round doorknob, 40%](img/final/round-doorknob.png) | ![:img Picture of a flat doorknob, 40%](img/final/flat-doorknob.png) 
-
-Well-designed objects have affordances
-- Clues to their operation that are readily apparent
-- Often visual, but not always (e.g., speech)
-- Allows and promotes certain actions
-]
-???
-Opportunities to act which are readily apparent to the user ... and
-appropriate to the user’s abilities 
-
-relationship of affordence and feedback
-
-Form “affords” certain actions and makes that apparent
-
----
-.title[# Model of Mental Models]
-.body[
-![:img A box showing the design (white) and actual function (blue missing
-a little bit of the white) with a grey circle added in the center
-labeled "Frequently Used (Well understood) Part of System
-Functionality" a dark blue cloud labeled "Occasionally Used Part of
-System Functionality" around the user's well understood region and
-another cloud further out with errors (regions outside the blue system
-box) labeled "Users full model of what the system does",100%](img/final/mental6.png)
-]
-
-???
-- Where are the gulf of evaluation and gulf of execution in this
-  image?  Gulf of execution is the user 'error' region (user requests
-  function the __system DOESNT HAVE__), gulf of
-  evaluation is when the user __doesn't realize the system HAS a
-  functionality__. 
-  
-- How does undo help the user bridge them? 
-
----
-
-.title[Undo Sample Q]
-.body[
-Something other than drawing! Let's try text
-
-What should be the "action"? Characters or words?
-]
---
-.body[
-
-- type "helo"
-- type "world"
-- undo
-- undo
-- type "hello"
-- redo
-- type "world"
-]
-
----
-.left-column[
-### Heuristic Evaluation
-- H1: Visibility of system status
-- H2: Match between system and the real world
-- H3: User control and freedom
-- H4: Consistency and standards
-- H5: Error prevention
-- H6: Recognition vs. recall
-- H7: Flexibility and efficiency of use
-- H8: Aesthetic and minimalist design
-- H9: Error recovery
-- H10: Help and Documentation
-]
-.right-column[
-## UAR
-- Which heuristic
-- Explanation
-- Severity
- - Frequency
- - Impact
- - Persistence
-- Scale: 
- - 0 - Not a problem at all
- - 1 - Cosmetic problem only
- - 2 - Minor usability problem (fix with low priority)
- - 3 - Major usability problem (fix with high priority)
- - 4 - Usability catastrophe (imperative to fix before release)
-
-]
-.upper_right[![:img Four dialogue boxes with different locations for
-ok; cancel and help (inconsistent), 80%](img/final/consistency.png)]
----
-.title[HE pros and cons?]
----
-.left-column50[
-## Pros
-
-Discount usability engineering
-
-Intimidation low
-
-Don't need to identify tasks, activities
-
-Can identify some fairly obvious fixes
-
-Can expose problems user testing doesn’t expose
-
-Provides a language for justifying usability recommendations
-]
-.right-column50[
-## Cons
-
-Un-validated
-
-Unreliable
-
-Should use usability experts
-
-Problems unconnected with tasks
-
-Heuristics may be hard to apply to new technology
-
-Coordination costs]
----
-.title[Sensing and context-awareness]
-.body[
-What makes an app context-aware?
-
-]
-???
-*use of implicit input*
----
-.title[Sensing and context-awareness]
-.body[
-What makes an app context-aware?
-
-
-*use of implicit input*
-]
----
-.title[Types of context-aware apps]
---
-.body[
-Capture and Access
-
-Adaptive Services (changing operation or timing)
-
-Novel Interaction
-
-Behavioral Imaging
-
-General Solutions for Data Collection and Response
-
-Challenges?
-]
-???
-- Battery
-- Raw sensors not behavior data
-- Not the sensors we always want
-- Computational complexity
-- Latency in communication
-- Basic software framework to support apps that can adapt to user behavior
-- Apps that drive innovation
-- How people use phones
-
----
-.title[Fences and snapshots]
-.body[
-When to use each?]
-
----
-.left-column[
-## Behavior Change
-
-![:img five part model of personal informatics with stages
-preparation; collection; integration; reflection; action ,
-150%](img/final/personal-informatics-model.png)
-]
-.right-column[
-- Example Q: What stage does the leader board engage with?
-- Example Q: What stage do the icons support 
-- Example Q: What aspect of this interface supports action?
-
-![:img cscw, 70%](img/final/android.png)
-
-]
----
-.left-column[
-## Machine Learning
-
-![:img decision tree, 80%](img/ml/decisiontree.png)
-]
-
-.right-column[
-
-<div class="mermaid">
-graph TD
-  T[Time] -- "10pm-8am" -->  N[Noise]
-  T[Time] -- "8am-10pm" --> Aw2[Awake y=35,n=2]
-  N -- "Low" --> As[Asleep y=20,n=5]
-  N -- "High" --> Aw3[Awake y=10,n=2]
-  
-</div>
-
-- Q1: What is this recognizing
-- Q2: What features are being used?
-- Q3: What are the labels?
-- Q4: What will be predicted if there is noise between 10am and noon?
-- Q5: What is the accuracy of this decision tree?
-]
----
diff --git a/slides/wk10/heuristic.html b/slides/wk10/heuristic.html
deleted file mode 100644
index e480672b76a9eba90217d235a195d3b0e295dce6..0000000000000000000000000000000000000000
--- a/slides/wk10/heuristic.html
+++ /dev/null
@@ -1,695 +0,0 @@
----
-layout: presentation
-title: Heuristic Evaluation --Week 7, Friday--
-description: Heuristic Evaluation for Analyzing Interfaces
-class: middle, center, inverse
----
-
-layout: false
-
-# Hall of Shame?
-
-What do you think happened here?
-.left-column50[
-![:img Funimation web page with a large image and an interface to add items to a queue and remove items from a queue, 100%](img/heuristic/funimation1.png)
-]
-.right-column40[
-![:img Large red remove from queue button, 50%](img/heuristic/funimation2.png)
-![:img Large red add to queue button, 80%](img/heuristic/funimation3.png)
-
-]
-
-???
-Thanks to Jeremy Zhang for the find.
-
-
----
-
-name: inverse
-layout: true
-class: center, middle, inverse
-
-# Heuristic Evaluation for Analyzing Interfaces
-
-{{site.author.name}}
-
-CSE 340 {{site.quarter}}
----
-layout: false
-
-[//]: # (Outline Slide)
-# Today's goals
-
-- [Combined data from Menus](https://docs.google.com/spreadsheets/d/1neu_22-YTI3TsP5uHKMsiEs4yxxz4xtghk69bYIgoJo/edit?usp=sharing)
-- Introduce Heuristic Evaluation
-- Describe UARs
-- Time at the end to fill out the [course eval](https://uw.iasystem.org/survey/227053)
-
----
-.left-column[
-## Introducing Heuristic Evaluation]
-.right-column[
-.quote[Discount usability engineering methods]
-
--- Jakob Nielsen
-
-Involves a small team of evaluators to evaluate an interface based on recognized usability principles
-
-Heuristics–”rules of thumb”
-
-]
-???
-"serving to discover or find out," 1821, irregular formation from Gk. heuretikos "inventive," related to heuriskein "to find" (cognate with O.Ir. fuar "I have found"). Heuristics "study of heuristic methods," first recorded 1959.
-
----
-.left-column[
-## Introducing Heuristic Evaluation]
-.right-column[
-
-First introduced in 1990 by Nielsen & Molich
-
-Quick, inexpensive, popular technique
-
-~5 experts find 70-80% of problems
-n
-Based on 10 heuristics
-
-Does not require working interface
-]
----
-<div class="mermaid">
-gantt
-	title Typical Heuristic Evaluation Process
-	section Evaluation
-	dateFormat DD
-	Designer Provides Setting (Description of Interface and List of Tasks) :list, 22, 5d
-	5ish evaluators Try tasks and record problems     :evals, after list, 5d
-	Designer conducts synthesis and analysis :synthesis, 28, 5d
-	Designer writes report :30, 5d
-</div>
-
----
-.left-column[
-## So what are the heuristics?]
---
-.right-column[
-- H1: Visibility of system status
-- H2: Match between system and the real world
-- H3: User control and freedom
-- H4: Consistency and standards
-- H5: Error prevention
-- H6: Recognition vs. recall
-- H7: Flexibility and efficiency of use
-- H8: Aesthetic and minimalist design
-- H9: Error recovery
-- H10: Help and documentation
-]
-???
-These should not be hugely surprising after everything we've talked about...
----
-.left-column[
-## H1: Visibility of System Status
-
-Keep users informed about what is going on
-
-]
-.right-column[
-
-What does this interface tell you?
-
-![:img feedback being shown about how much time is left until a
-database search returns, 80%](img/heuristic/visibility.png)
-
-]
---
-.right-column[
-- What input has been received--Does the interface above say what the search input was?
-- What processing it is currently doing--Does it say what it is currently doing?
-- What the results of processing are--Does it give the results of processing?
-
-Feedback allows user to monitor progress towards solution of their
-task, allows the closure of tasks and reduces user anxiety (Lavery et
-al)
-]
-
----
-.left-column[
-## H2: Match between system and real world
-
-Speak the users’ language
-
-Follow real world conventions
-]
-.right-column[
-![:img two error messages returned by a bank machine-- one in terms the
-user can understand relating to dollars available and the other
-uninterpretable, 80%](img/heuristic/match.png)
-
-- Use concepts, language and real-world conventions that are familiar to the user.
-- Developers will need to understand the task from the point of view of users.
-- Cultural issues relevant for the design of systems that are expected to be used globally.
-
-A good match minimizes the extra knowledge required to use the system,
-simplying all task action mappings (re-expression of users’ intuitions
-into system concepts)
-]
-
-
----
-.left-column[
-## H2: Match between system and real world
-
-Example of a huge violation of this H2
-
-]
-.right-column[
-
-| | |
-|--|--|
-| ![:img Picture of macintosh desktop with old style floppy disk to be dragged over trash to be ejected, 100%](img/heuristic/mactrash.png) |Possibly the biggest usability in problem in the Macintosh. Heuristic violation--people want to get their disk out of the machine--not discard it.|
-
-]
----
-.left-column[
-## H2: Match between system and real world
-
-Example of a mismatch depends on knowledge about users
-]
-.right-column[
-
-Would an icon with a red flag for new mail be appropriate in all cultures?
-
-![:img Picture of a mailbox with red flag raised, 50%](img/heuristic/mailbox.png)
-]
----
-.left-column[
-## H3: User Control and Freedom
-“Exits” for mistaken choices, undo, redo
-
-Don’t force down fixed paths
-
-]
-.right-column[
-![:img Dialog box with lots of exits for mistaken choices--
-undo;redo;Don’t force down fixed paths, 60%](img/heuristic/control.png)
-
-Users choose actions by mistake
-
-]
-
-
----
-.left-column[
-## H4: Consistency and Standards
-]
-
-.right-column[
-![:img Four dialogue boxes with different locations for ok; cancel and help (inconsistent), 50%](img/heuristic/consistency.png)
-
-Same words, situations, actions, should mean the same thing in similar
-situations; same things look the same, be located in the same place.
-
-Different things should be different
-]
----
-.left-column[
-## H4: Consistency and Standards
-]
-
-.right-column[
-- Both H2 (Match between system and the real world) and H4 related to user’s prior knowledge. The difference is
-  - H2 is knowledge of world
-  - H4 of knowledge others parts of application and other applications on the same platform.
-- Consistency within an application and within a platform. Developers need to know platform conventions.
-- Consistency with old interface
-
-Consistency maximizes the user knowledge required to use the systems
-by letting users generalize from existing experience of the system to
-other systems
-]
----
-.left-column[
-## H4: Consistency and Standards
-]
-.right-column[
-
-Evidence: Should include at least
-- two inconsistent elements in the same interface, or
-- an element that is inconsisten with a platform guideline
-
-Explanation: What inconsistent element is and what it is inconsistent with
-
-![:img Four dialogue boxes with different locations for ok; cancel and help (inconsistent), 50%](img/heuristic/consistency.png)
-]
----
-.left-column[
-## H5: Error Prevention
-
-Careful design which prevents a problem from occurring in the first place
-]
-
-.right-column[
-![:img Picture of a calendar entry interface with text entry (error
-prone) vs data selection (less error prone), 65%](img/heuristic/error.png)
-
-- Help users select among legal actions (e.g., greying out inappropirate
-buttons) rather than letting them select and then telling them that
-they have made an error (gotcha!).
-- Subset of H1 (Visibility of system status) but so important it gets a separate heuristic.
-
-Motivation: Errors are a main source of frustration, inefficiency and
-ineffectiveness during system usage (Lavery et al)
-
-Explanation in terms of tasks and system details such as adjacency of
-function keys and menu options, discriminability of icons and labels.
-]
----
-.left-column[
-## H6: Recognition Rather than Recall
-
-Make objects, actions and options visible or easily retrievable
-
-]
-.right-column[
-
-![:img Compuserve connect old school interface, 30%](img/heuristic/recognition.png)
-
-- Classic examples:
-  - command line interfaces  (`rm *`)
-  - Arrows on keys that people can’t map to functions
-- Much easier for people to remember what to do if there are cues in the environment
-
-Goes into working memory through perceptions
-]
----
-.left-column[
-## H7: Flexibility and Efficiency of Use
-
-Accelerators for experts (e.g., gestures, keyboard shortcuts)
-
-Allow users to tailor frequent actions (e.g., macros)
-
-]
-.right-column[
-![:img ,40%](img/heuristic/flexibility.png)
-
-- Typing single keys is typically faster than continually switching the
-hand between the keyboard and the mouse and point to things on the
-screen.
-- Skilled users develop plans of action, which they will want
-to execute frequently, so tailoring can capture these plans in the
-interface.
-]
----
-.left-column[
-## H8: Aesthetic and Minimalist design
-
-Dialogs should not contain irrelevant or rarely needed information
-
-]
-.right-column[
-
-![:img ,80%](img/heuristic/minimalist.png)
-
-- Visual search--eyes must search through more. More (irrelevant info) interferes with Long Term Memory (LTM)
-retrieval of information that is relevant to task.
-- Cluttered displays have the effect of increasing search times for commands or users missing features on the screen (Lavery et al)
-
-_Chartjunk_ (Tufte): "The interior decoration of graphics generates a lot of ink that does not tell
-the viewer anything new."
-
-]
----
-.left-column[
-## H9: Help users recognize, diagnose, and recover from errors
-
-]
-.right-column[
-
-![:img ,40%](img/heuristic/error2.png)
-
-- Error messages in language user will understand
-- Precisely indicate the problem
-- Constructively suggest a solution
-
-]
-
----
-.left-column[
-## H10: Help and Documentation
-
-Easy to search
-
-Focused on the user’s task
-
-List concrete steps to carry out
-
-Always available
-]
-
-.right-column[
-![:img ,40%](img/heuristic/help.png)
-
-Allow search by gist--people do not remember exact system terms
-
-]
-
-???
-If user ever even knew system terms.
-
-
----
-<div class="mermaid">
-gantt
-	title Typical Heuristic Evaluation Process
-	section Evaluation
-	dateFormat DD
-	Designer Provides Setting (Description of Interface and List of Tasks) :list, 22, 5d
-	5ish evaluators Try tasks and record problems     :evals, after list, 5d
-</div>
-
-Why 5 or more people?
-
--4 or 5 are recommended by Nielsen (this is a point of contention. I
-aim for *saturation*).
-- A single person will not be able to find all usability problems
-- Different people find different usability problems
-- Successful evaluators may find both easy and hard problems
-
-
-???
-You can estimate how many you need (see NM book, pp 32-35).
-
-4 or 5 are recommended by Nielsen
-
----
-<div class="mermaid">
-gantt
-	title Typical Heuristic Evaluation Process
-	section Evaluation
-	dateFormat DD
-	Designer Provides Setting (Description of Interface and List of Tasks) :list, 22, 5d
-	5ish evaluators Try tasks and record problems     :evals, after list, 5d
-</div>
-
-How should the Designer "provide a setting"? How should the evaluator evaluate?
-
----
-<div class="mermaid">
-gantt
-	title Typical Heuristic Evaluation Process
-	section Evaluation
-	dateFormat DD
-	Designer Provides Setting (Description of Interface and List of Tasks) :list, 22, 5d
-	5ish evaluators Try tasks and record problems     :evals, after list, 5d
-</div>
-.left-column[
-## What does the evaluator do?]
-.right-column[
-
-Designer: Briefing (HE method, Domain, Scenario)
-
-Evaluator:
-- Two passes through interface (video in our case)
-- Inspect flow
-- Inspect each screen, one at a time against heuristics
-- Fill out a *Usability Action Report* (we'll keep this simple in peer review)
-]
-???
-
-NOT a single-user empirical test that is, do not say “I tried it and
-it didn’t work therefore I’ll search for a heuristic this violates”
-
----
-<div class="mermaid">
-gantt
-	title Typical Heuristic Evaluation Process
-	section Evaluation
-	dateFormat DD
-	Designer Provides Setting (Description of Interface and List of Tasks) :list, 22, 5d
-	5ish evaluators Try tasks and record problems     :evals, after list, 5d
-</div>
-
-.left-column[
-## Usability Action Report
-]
-.right-column[
-UAR rather than “Problem report” because you report good aspects as
-well as problems -- you want to preserve them in the next iteration of
-the system!
-
-- **UAR Identifier** (Type-Number) Problem or Good Aspect
-- *Describe:* Succinct description of the usability aspect
-- *Heuristics:* What heuristics are violated
-- **Evidence:** support material for the aspect
-- **Explanation:** your own interpretation
-- *Severity:* your reasoning about importance
-- **Solution:** if the aspect is a problem, include a possible solution and potential trade-offs
-- **Relationships:** to other usability aspects (if any)
-]
-???
-
-We'll ask you to do the things in italics in peer grading
----
-<div class="mermaid">
-gantt
-	title Typical Heuristic Evaluation Process
-	section Evaluation
-	dateFormat DD
-	Designer Provides Setting (Description of Interface and List of Tasks) :list, 22, 5d
-	5ish evaluators Try tasks and record problems     :evals, after list, 5d
-</div>
-.left-column[
-## Writing a description]
-.right-column[
-Should be *A PROBLEM*, not a solution
-
-Don't be misleading (e.g., “User couldn’t find state in the list” when
-the state wasn’t in the list)
-
-Don't be overly narrow (e.g., “PA not listed” when there is nothing
-special about PA and other states are not listed)
-
-Don't be too broad, not distinctive (e.g., “User can’t find item”)
-]
----
-<div class="mermaid">
-gantt
-	title Typical Heuristic Evaluation Process
-	section Evaluation
-	dateFormat DD
-	Designer Provides Setting (Description of Interface and List of Tasks) :list, 22, 5d
-	5ish evaluators Try tasks and record problems     :evals, after list, 5d
-</div>
-.left-column[
-## Picking a Heuristic]
-.right-column[
-Ok to list more than one
-
-This is subjective. Use your best judgement
-]
----
-<div class="mermaid">
-gantt
-	title Typical Heuristic Evaluation Process
-	section Evaluation
-	dateFormat DD
-	Designer Provides Setting (Description of Interface and List of Tasks) :list, 22, 5d
-	5ish evaluators Try tasks and record problems     :evals, after list, 5d
-</div>
-.left-column[
-## Deciding on a severity]
-.right-column[
-- Make a claim about factors and support it with reasons
-- Consider *Frequency* (e.g., All
-users would probably experience this problem because…)
-- Consider *Impact*  Will it be easy or hard to overcome. NOT is the task the user
-is doing important (put importance of task in explanation and in
-justification of weighting, if relevant).
-- Consider *Persistence* Once the problem is known, is it a one-time problem or
-will the user be continually bothered? NOT low persistence because the
-user abandons goal (that is impact--can’t overcome it.  If can’t
-detect and can’t overcome, problem persists).
-
-]
-???
-Why? Make claim (All users would PROBABLY experience this problem BECAUSE…) and IMMEDIATELY
----
-<div class="mermaid">
-gantt
-	title Typical Heuristic Evaluation Process
-	section Evaluation
-	dateFormat DD
-	Designer Provides Setting (Description of Interface and List of Tasks) :list, 22, 5d
-	5ish evaluators Try tasks and record problems     :evals, after list, 5d
-</div>
-.left-column[
-## Rating Severity
-
-5-point scale
-
-]
-.right-column[
-
-0 - Not a problem at all (or a good feature)
-
-1 - Cosmetic problem only
-
-2 - Minor usability problem (fix with low priority)
-
-3 - Major usability problem (fix with high priority)
-
-4 - Usability catastrophe (imperative to fix before release)
-
-]
-
----
-<div class="mermaid">
-gantt
-	title Heuristic Evaluation Process
-	section Evaluation
-	dateFormat MM-DD
-	Designer Provides Setting (>Description of Interface and List of Tasks) :list, 03-02, 9d
-	Videos distributed  :vids, after list, 1d
-	Tasks--5 evaluators     :evals, after vids, 2d
-	Section Problems
-	E1--Problem1...        :after vids, 2d
-    E1--Problem2...        :after vids, 2d
-    E2--Problem3...        :after vids, 2d
-		...                :after vids, 2d
-	Section Synthesis and Analysis
-    Group like problems :analysis, 03-14, 2d
-	Summarize problems :summarize, after analysis, 2d
-	Write report :after summarize, 1d
-</div>
-
-Group like problems
-- Important thing is whether they have similar description
-- This is for you to decide
-- Similarity may be conceptual (e.g. the same problem may show up in multiple parts of your interface)
-
----
-<div class="mermaid">
-gantt
-	title Heuristic Evaluation Process
-	section Evaluation
-	dateFormat MM-DD
-	Designer Provides Setting (>Description of Interface and List of Tasks) :list, 03-02, 9d
-	Videos distributed  :vids, after list, 1d
-	Tasks--5 evaluators     :evals, after vids, 2d
-	Section Problems
-	E1--Problem1...        :after vids, 2d
-    E1--Problem2...        :after vids, 2d
-    E2--Problem3...        :after vids, 2d
-		...                :after vids, 2d
-	Section Synthesis and Analysis
-    Group like problems :analysis, 03-14, 2d
-	Summarize problems :summarize, after analysis, 2d
-	Write report :after summarize, 1d
-</div>
-
-Summarize problems
-- Average severities
-- List all relevant heuristics
-- List all areas of website affected
-- Also prioritize at this point
-
----
-<div class="mermaid">
-gantt
-	title Heuristic Evaluation Process
-	section Evaluation
-	dateFormat MM-DD
-	Designer Provides Setting (>Description of Interface and List of Tasks) :list, 03-02, 9d
-	Videos distributed  :vids, after list, 1d
-	Tasks--5 evaluators     :evals, after vids, 2d
-	Section Problems
-	E1--Problem1...        :after vids, 2d
-    E1--Problem2...        :after vids, 2d
-    E2--Problem3...        :after vids, 2d
-		...                :after vids, 2d
-	Section Synthesis and Analysis
-    Group like problems :analysis, 03-14, 2d
-	Summarize problems :summarize, after analysis, 2d
-	Write report :after summarize, 1d
-</div>
-
-Write report
-
-We've provided a [template](../../assignments/undo-report)
-
----
-.left-column[
-## Advantages of HE]
-.right-column[
-
-“Discount usability engineering”
-
-Intimidation low
-
-Don’t need to identify tasks, activities
-
-Can identify some fairly obvious fixes
-
-Can expose problems user testing doesn’t expose
-
-Provides a language for justifying usability recommendations
-
-]
----
-.left-column[
-## Disadvantages of HE]
-.right-column[
-Un-validated
-
-Unreliable
-
-Should use usability experts
-
-Problems unconnected with tasks
-
-Heuristics may be hard to apply to new technology
-
-Coordination costs
-]
-
----
-.left-column[
-## Summary]
-.right-column[
-Heuristic Evaluation can be used to evaluate & improve user interfaces
-
-10 heuristics
-
-Heuristic Evaluation process
-
-Individual: Flow & screens
-
-Group: Consensus report, severity
-
-Usability Aspect Reports
-
-Structured way to record good & bad
-]
----
-
-# Hall of Shame?
-
-Cycling back: What would you say in your HE of this interface?
-
-![:youtube Video of funimation problems, 1zDMh3NHDjw]
-
-
----
-# Hall of Shame?
-
-Cycling back: What would you say in your HE of this interface?
-
-.left-column50[
-![:img Funimation web page with a large image and an interface to add items to a queue and remove items from a queue, 100%](img/heuristic/funimation1.png)
-]
-.right-column40[
-![:img Large red remove from queue button, 50%](img/heuristic/funimation2.png)
-![:img Large red add to queue button, 80%](img/heuristic/funimation3.png)
-
-]
diff --git a/slides/wk10/img/final/android.png b/slides/wk10/img/final/android.png
deleted file mode 100644
index c05abc897a6ba254f4bf90cfa088dfb9de0d2569..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/final/android.png and /dev/null differ
diff --git a/slides/wk10/img/final/consistency.png b/slides/wk10/img/final/consistency.png
deleted file mode 100644
index 0ff8ff37943bd763d0afc16950d27425276161fd..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/final/consistency.png and /dev/null differ
diff --git a/slides/wk10/img/final/decisiontree.png b/slides/wk10/img/final/decisiontree.png
deleted file mode 100644
index d70048fd94c67ba4dee4947494266980e412b2d8..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/final/decisiontree.png and /dev/null differ
diff --git a/slides/wk10/img/final/flat-doorknob.png b/slides/wk10/img/final/flat-doorknob.png
deleted file mode 100644
index b7fa0fcc0b4a0daed1e12d9f5fdb49318a4aed07..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/final/flat-doorknob.png and /dev/null differ
diff --git a/slides/wk10/img/final/mental6.png b/slides/wk10/img/final/mental6.png
deleted file mode 100644
index 5baea3ac170bd237ee0c35101160347918f32c04..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/final/mental6.png and /dev/null differ
diff --git a/slides/wk10/img/final/personal-informatics-model.png b/slides/wk10/img/final/personal-informatics-model.png
deleted file mode 100644
index b7ec7714d914b333ceda3cb2146c805e38cd7107..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/final/personal-informatics-model.png and /dev/null differ
diff --git a/slides/wk10/img/final/round-doorknob.png b/slides/wk10/img/final/round-doorknob.png
deleted file mode 100644
index 8413e79008f7f0537894d637cd1810b0b460239e..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/final/round-doorknob.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/consistency.png b/slides/wk10/img/heuristic/consistency.png
deleted file mode 100644
index 0ff8ff37943bd763d0afc16950d27425276161fd..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/consistency.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/control.png b/slides/wk10/img/heuristic/control.png
deleted file mode 100644
index 7f0ffd0ff7430cfeb48ee48dfb8fecb497e97aba..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/control.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/error.png b/slides/wk10/img/heuristic/error.png
deleted file mode 100644
index ad009d6088f7c37219f73da52c210ecb0e76eb0a..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/error.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/error2.png b/slides/wk10/img/heuristic/error2.png
deleted file mode 100644
index 5cdddd5a43b172eaa38e99e774110ef02a171278..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/error2.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/flexibility.png b/slides/wk10/img/heuristic/flexibility.png
deleted file mode 100644
index 0c21d4ffc1261db1092157291bbee76d9437bbdc..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/flexibility.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/funimation1.png b/slides/wk10/img/heuristic/funimation1.png
deleted file mode 100644
index 046f837cf7661e7f3fb1c6d19fe1284570068981..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/funimation1.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/funimation2.png b/slides/wk10/img/heuristic/funimation2.png
deleted file mode 100644
index 3440a441f71940bb3ca4dc03a433fb734c1a6f1a..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/funimation2.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/funimation3.png b/slides/wk10/img/heuristic/funimation3.png
deleted file mode 100644
index 7ace94a18212ae587673e3426735fa04f4c80fde..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/funimation3.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/help.png b/slides/wk10/img/heuristic/help.png
deleted file mode 100644
index 26ee35f713c90875590da8eb098cfc590dc9eaae..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/help.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/mactrash.png b/slides/wk10/img/heuristic/mactrash.png
deleted file mode 100644
index c08482003ca9e3c4bf641b7bf5d6918471ab5759..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/mactrash.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/mailbox.png b/slides/wk10/img/heuristic/mailbox.png
deleted file mode 100644
index 0c75a10406b3976cce65d0262d6833905814305b..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/mailbox.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/match.png b/slides/wk10/img/heuristic/match.png
deleted file mode 100644
index 6b84fb7c1706daca865c35504c624abd62d9308a..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/match.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/minimalist.png b/slides/wk10/img/heuristic/minimalist.png
deleted file mode 100644
index c32b6646c92c7761fdc83b830cb9e095fa2d0f8b..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/minimalist.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/recognition.png b/slides/wk10/img/heuristic/recognition.png
deleted file mode 100644
index d1fb5cd5ddf8b92fe1acd7f9a0b82c9115bd9213..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/recognition.png and /dev/null differ
diff --git a/slides/wk10/img/heuristic/visibility.png b/slides/wk10/img/heuristic/visibility.png
deleted file mode 100644
index 21dae906da003a422d64c43fb8fc1fe538d989d6..0000000000000000000000000000000000000000
Binary files a/slides/wk10/img/heuristic/visibility.png and /dev/null differ
diff --git a/slides/wk10/pui2016-slides-23-usable-privacy-and-security.pptx b/slides/wk10/pui2016-slides-23-usable-privacy-and-security.pptx
deleted file mode 100644
index f3995476ae662f9c8779ae5de169ca642d0bf336..0000000000000000000000000000000000000000
Binary files a/slides/wk10/pui2016-slides-23-usable-privacy-and-security.pptx and /dev/null differ