Repository: tivac/modular-css
Pull request #636 (2019-07-07 06:37:22)

docs: split guide into overview + API
Also fixed some bad links.

codecov[bot]: # [Codecov](https://codecov.io/gh/tivac/modular-css/pull/636?src=pr&el=h1) Report
> Merging [#636](https://codecov.io/gh/tivac/modular-css/pull/636?src=pr&el=desc) into [master](https://codecov.io/gh/tivac/modular-css/commit/d64b7f681876570c81583879ffc88419259b8294?src=pr&el=desc) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/tivac/modular-css/pull/636/graphs/tree.svg?width=650&token=EIUJKcuTE8&height=150&src=pr)](https://codecov.io/gh/tivac/modular-css/pull/636?src=pr&el=tree)

```diff
@@           Coverage Diff           @@
##           master     #636   +/-   ##
=======================================
  Coverage   99.02%   99.02%           
=======================================
  Files          49       49           
  Lines        1230     1230           
  Branches      187      187           
=======================================
  Hits         1218     1218           
  Misses         12       12
```



------

[Continue to review full report at Codecov](https://codecov.io/gh/tivac/modular-css/pull/636?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/tivac/modular-css/pull/636?src=pr&el=footer). Last update [d64b7f6...c4e738d](https://codecov.io/gh/tivac/modular-css/pull/636?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7fe1e367..70e04f7c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,17 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+
+### Bug Fixes
+
+* generate parsers before publishing ([2c72008](https://github.com/tivac/modular-css/commit/2c72008))
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 
diff --git a/jest.config.js b/jest.config.js
index b7d817fb..ab03cd88 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -22,6 +22,7 @@ module.exports = {
                 "<rootDir>/packages/test-utils/expect/toMatchDiffSnapshot.js",
                 "<rootDir>/packages/test-utils/expect/toMatchRollupSnapshot.js",
                 "<rootDir>/packages/test-utils/expect/toMatchRollupCodeSnapshot.js",
+                "<rootDir>/packages/test-utils/expect/toMatchRollupAssetSnapshot.js",
             ],
 
             snapshotSerializers : [
diff --git a/lerna.json b/lerna.json
index bc11dcd2..35fc16a7 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
 {
-  "version": "24.2.0",
+  "version": "24.2.2",
   "command": {
     "publish": {
       "conventionalCommits": true,
diff --git a/package-lock.json b/package-lock.json
index 14e0566d..99bfb61d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1714,7 +1714,6 @@
     "@modular-css/browserify": {
       "version": "file:packages/browserify",
       "requires": {
-        "@modular-css/processor": "file:packages/processor",
         "mkdirp": "^0.5.1",
         "p-each-series": "^2.0.0",
         "sink-transform": "^2.0.0",
@@ -1739,8 +1738,6 @@
     "@modular-css/cli": {
       "version": "file:packages/cli",
       "requires": {
-        "@modular-css/glob": "file:packages/glob",
-        "@modular-css/processor": "file:packages/processor",
         "meow": "^5.0.0",
         "mkdirp": "^0.5.1"
       }
@@ -1748,7 +1745,6 @@
     "@modular-css/glob": {
       "version": "file:packages/glob",
       "requires": {
-        "@modular-css/processor": "file:packages/processor",
         "globule": "^1.1.0"
       }
     },
@@ -1781,7 +1777,6 @@
     "@modular-css/postcss": {
       "version": "file:packages/postcss",
       "requires": {
-        "@modular-css/processor": "file:packages/processor",
         "mkdirp": "^0.5.1",
         "postcss": "^7.0.0"
       }
@@ -1820,7 +1815,6 @@
     "@modular-css/rollup": {
       "version": "file:packages/rollup",
       "requires": {
-        "@modular-css/processor": "file:packages/processor",
         "dedent": "0.7.0",
         "esutils": "^2.0.2",
         "rollup-pluginutils": "^2.0.1",
@@ -1858,7 +1852,6 @@
     "@modular-css/svelte": {
       "version": "file:packages/svelte",
       "requires": {
-        "@modular-css/processor": "file:packages/processor",
         "escape-string-regexp": "^2.0.0",
         "is-url": "^1.2.4",
         "resolve-from": "^5.0.0"
@@ -1883,7 +1876,6 @@
     "@modular-css/webpack": {
       "version": "file:packages/webpack",
       "requires": {
-        "@modular-css/processor": "file:packages/processor",
         "esutils": "^2.0.2",
         "loader-utils": "^1.1.0",
         "lodash": "^4.17.0",
@@ -1894,10 +1886,6 @@
       "version": "file:packages/www",
       "dev": true,
       "requires": {
-        "@modular-css/processor": "file:packages/processor",
-        "@modular-css/rollup": "file:packages/rollup",
-        "@modular-css/shortnames": "file:packages/namer",
-        "@modular-css/svelte": "file:packages/svelte",
         "babel-eslint": "^10.0.1",
         "codemirror": "^5.42.2",
         "cssnano": "^4.1.8",
@@ -1908,6 +1896,7 @@
         "lazyload-css": "^1.0.5",
         "lznext": "^0.1.0",
         "markdown-it": "^8.4.2",
+        "markdown-it-container": "^2.0.0",
         "markdown-it-include": "^1.0.0",
         "markdown-it-prism": "^2.0.1",
         "markdown-it-toc-and-anchor": "^4.2.0",
@@ -1919,6 +1908,7 @@
         "postcss-color-function": "^4.0.1",
         "postcss-import": "^12.0.1",
         "postcss-nested": "^4.1.1",
+        "require-from-string": "^2.0.2",
         "rollup-plugin-alias": "^1.5.1",
         "rollup-plugin-commonjs": "^10.0.0",
         "rollup-plugin-json": "^4.0.0",
@@ -1928,6 +1918,7 @@
         "rollup-plugin-node-resolve": "^5.0.0",
         "rollup-plugin-svelte": "^5.0.1",
         "rollup-plugin-terser": "^5.0.0",
+        "rollup-pluginutils": "^2.8.1",
         "svelte": "^2.16.0"
       },
       "dependencies": {
@@ -2014,13 +2005,20 @@
           }
         },
         "rollup-pluginutils": {
-          "version": "2.7.1",
-          "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.7.1.tgz",
-          "integrity": "sha512-3nRf3buQGR9qz/IsSzhZAJyoK663kzseps8itkYHr+Z7ESuaffEPfgRinxbCRA0pf0gzLqkNKkSb8aNVTq75NA==",
+          "version": "2.8.1",
+          "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz",
+          "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==",
           "dev": true,
           "requires": {
-            "estree-walker": "^0.6.0",
-            "micromatch": "^3.1.10"
+            "estree-walker": "^0.6.1"
+          },
+          "dependencies": {
+            "estree-walker": {
+              "version": "0.6.1",
+              "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+              "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
+              "dev": true
+            }
           }
         },
         "terser": {
@@ -9974,12 +9972,12 @@
       "dev": true
     },
     "lodash.template": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
-      "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+      "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
       "dev": true,
       "requires": {
-        "lodash._reinterpolate": "~3.0.0",
+        "lodash._reinterpolate": "^3.0.0",
         "lodash.templatesettings": "^4.0.0"
       }
     },
@@ -10161,6 +10159,12 @@
         "uc.micro": "^1.0.5"
       }
     },
+    "markdown-it-container": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-2.0.0.tgz",
+      "integrity": "sha1-ABm0P9Au7+zi8ZYKKJX7qBpARpU=",
+      "dev": true
+    },
     "markdown-it-include": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/markdown-it-include/-/markdown-it-include-1.1.0.tgz",
@@ -12550,6 +12554,12 @@
       "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
       "dev": true
     },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "dev": true
+    },
     "require-main-filename": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
diff --git a/package.json b/package.json
index df6e47f8..d616af74 100644
--- a/package.json
+++ b/package.json
@@ -14,12 +14,14 @@
     "outdated": "lerna exec --no-bail --stream -- npm outdated",
     "parsers": "node parsers/build.js",
     "release": "env-cmd lerna publish",
+    "prepublishOnly": "npm run parsers",
     "pretest": "npm run parsers",
     "test": "jest",
     "watch": "jest --watch",
     "www:build": "lerna run --stream build packages/www",
     "www:start": "lerna run --stream start packages/www",
-    "www:deploy": "cd ./packages/www && npm run production"
+    "prewww:deploy": "npm run parsers",
+    "www:deploy": "lerna run --stream deploy packages/www"
   },
   "devDependencies": {
     "@modular-css/test-utils": "file:packages/test-utils",
diff --git a/packages/browserify/CHANGELOG.md b/packages/browserify/CHANGELOG.md
index 9f3ba598..f43937a9 100644
--- a/packages/browserify/CHANGELOG.md
+++ b/packages/browserify/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+**Note:** Version bump only for package @modular-css/browserify
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 **Note:** Version bump only for package @modular-css/browserify
diff --git a/packages/browserify/package.json b/packages/browserify/package.json
index d6804fff..bc0f2d4e 100644
--- a/packages/browserify/package.json
+++ b/packages/browserify/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@modular-css/browserify",
-  "version": "24.2.0",
+  "version": "24.2.2",
   "description": "Browserify transform for modular-css",
   "main": "./browserify.js",
   "repository": {
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 5d25ad85..958e06bb 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+**Note:** Version bump only for package @modular-css/cli
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 **Note:** Version bump only for package @modular-css/cli
diff --git a/packages/cli/package.json b/packages/cli/package.json
index ace8e953..dc23ab70 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@modular-css/cli",
-  "version": "24.2.0",
+  "version": "24.2.2",
   "description": "CLI for modular-css",
   "main": "./cli.js",
   "bin": {
diff --git a/packages/glob/.npmignore b/packages/glob/.npmignore
index 57e63c71..84a60e42 100644
--- a/packages/glob/.npmignore
+++ b/packages/glob/.npmignore
@@ -2,3 +2,4 @@ coverage/
 profiling/
 test/
 .*
+CHANGELOG.md
diff --git a/packages/glob/CHANGELOG.md b/packages/glob/CHANGELOG.md
index 748196b3..2928c872 100644
--- a/packages/glob/CHANGELOG.md
+++ b/packages/glob/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+**Note:** Version bump only for package @modular-css/glob
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 **Note:** Version bump only for package @modular-css/glob
diff --git a/packages/glob/package.json b/packages/glob/package.json
index 87bd11f2..31bf57fd 100644
--- a/packages/glob/package.json
+++ b/packages/glob/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@modular-css/glob",
-  "version": "24.2.0",
+  "version": "24.2.2",
   "description": "Glob support for modular-css",
   "main": "./glob.js",
   "repository": {
diff --git a/packages/postcss/CHANGELOG.md b/packages/postcss/CHANGELOG.md
index 28d821db..6e14e770 100644
--- a/packages/postcss/CHANGELOG.md
+++ b/packages/postcss/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+**Note:** Version bump only for package @modular-css/postcss
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 **Note:** Version bump only for package @modular-css/postcss
diff --git a/packages/postcss/package.json b/packages/postcss/package.json
index 60741bcb..ef73814e 100644
--- a/packages/postcss/package.json
+++ b/packages/postcss/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@modular-css/postcss",
-  "version": "24.2.0",
+  "version": "24.2.2",
   "description": "Use modular-css via postcss",
   "main": "./postcss.js",
   "repository": {
diff --git a/packages/processor/.npmignore b/packages/processor/.npmignore
index 63cda01e..84a60e42 100644
--- a/packages/processor/.npmignore
+++ b/packages/processor/.npmignore
@@ -2,5 +2,4 @@ coverage/
 profiling/
 test/
 .*
-**/*.pegjs
 CHANGELOG.md
diff --git a/packages/processor/CHANGELOG.md b/packages/processor/CHANGELOG.md
index 3398187a..2180eb7f 100644
--- a/packages/processor/CHANGELOG.md
+++ b/packages/processor/CHANGELOG.md
@@ -3,6 +3,17 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+
+### Bug Fixes
+
+* generate parsers before publishing ([2c72008](https://github.com/tivac/modular-css/commit/2c72008))
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 
diff --git a/packages/processor/package.json b/packages/processor/package.json
index c701872d..2ab7bfaf 100644
--- a/packages/processor/package.json
+++ b/packages/processor/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@modular-css/processor",
-  "version": "24.2.0",
+  "version": "24.2.2",
   "description": "A streamlined reinterpretation of CSS Modules",
   "main": "./processor.js",
   "repository": {
diff --git a/packages/processor/parsers/.gitignore b/packages/processor/parsers/.gitignore
index 64f58773..a49af0c5 100644
--- a/packages/processor/parsers/.gitignore
+++ b/packages/processor/parsers/.gitignore
@@ -1,5 +1,6 @@
 # Ignore everything in this directory
 *
 
-# Except this file
+# Except this file & the .npmignore
 !.gitignore
+!.npmignore
diff --git a/packages/processor/parsers/.npmignore b/packages/processor/parsers/.npmignore
new file mode 100644
index 00000000..6c7b69a0
--- /dev/null
+++ b/packages/processor/parsers/.npmignore
@@ -0,0 +1,1 @@
+.gitignore
diff --git a/packages/rollup/CHANGELOG.md b/packages/rollup/CHANGELOG.md
index 1d78a28a..cebe713b 100644
--- a/packages/rollup/CHANGELOG.md
+++ b/packages/rollup/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+**Note:** Version bump only for package @modular-css/rollup
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 **Note:** Version bump only for package @modular-css/rollup
diff --git a/packages/rollup/package.json b/packages/rollup/package.json
index 36c71409..5bd702e8 100644
--- a/packages/rollup/package.json
+++ b/packages/rollup/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@modular-css/rollup",
-  "version": "24.2.0",
+  "version": "24.2.2",
   "description": "Add modular-css support to rollup",
   "main": "./rollup.js",
   "repository": {
diff --git a/packages/rollup/rollup.js b/packages/rollup/rollup.js
index b124d714..f15f093a 100644
--- a/packages/rollup/rollup.js
+++ b/packages/rollup/rollup.js
@@ -199,6 +199,9 @@ module.exports = (opts) => {
 
                 entries.add(entry);
 
+                // TODO: this needs to check if the graph already has a value for entry and
+                // append the entry to the end of it if necessary. Support for inline <style> in
+                // @modular-css/svelte is broken atm because this just splats over the top of it
                 graph.addNode(entry, [ entry ]);
 
                 css.forEach((file) => graph.addDependency(entry, processor.normalize(file)));
diff --git a/packages/scratchpad/.npmignore b/packages/scratchpad/.npmignore
deleted file mode 100644
index 84a60e42..00000000
--- a/packages/scratchpad/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-coverage/
-profiling/
-test/
-.*
-CHANGELOG.md
diff --git a/packages/scratchpad/CHANGELOG.md b/packages/scratchpad/CHANGELOG.md
deleted file mode 100644
index 9bc9e28b..00000000
--- a/packages/scratchpad/CHANGELOG.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file.
-See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
-
-# [24.0.0](https://github.com/tivac/modular-css/compare/v23.0.6...v24.0.0) (2019-05-08)
-
-**Note:** Version bump only for package @modular-css/scratchpad
-
-
-
-
-
-# [23.0.0](https://github.com/tivac/modular-css/compare/v22.3.0...v23.0.0) (2019-03-28)
-
-**Note:** Version bump only for package @modular-css/scratchpad
-
-
-
-
-
-## [22.1.4](https://github.com/tivac/modular-css/compare/v22.1.3...v22.1.4) (2019-02-16)
-
-
-### Bug Fixes
-
-* add homepage & repo directory fields ([f9c1606](https://github.com/tivac/modular-css/commit/f9c1606))
-
-
-
-
-
-## [22.1.3](https://github.com/tivac/modular-css/compare/v22.1.2...v22.1.3) (2019-02-10)
-
-
-### Bug Fixes
-
-* clean up netlify deploys ([#566](https://github.com/tivac/modular-css/issues/566)) ([39c11d5](https://github.com/tivac/modular-css/commit/39c11d5))
-
-
-
-
-
-# [22.1.0](https://github.com/tivac/modular-css/compare/v22.0.2...v22.1.0) (2019-02-06)
-
-
-### Features
-
-* processor.normalize() & corrected chunking logic ([#562](https://github.com/tivac/modular-css/issues/562)) ([e0c5eee](https://github.com/tivac/modular-css/commit/e0c5eee)), closes [#559](https://github.com/tivac/modular-css/issues/559) [#560](https://github.com/tivac/modular-css/issues/560)
diff --git a/packages/scratchpad/LICENSE b/packages/scratchpad/LICENSE
deleted file mode 100644
index 76aab6f2..00000000
--- a/packages/scratchpad/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2019 Pat Cavit
-
-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/packages/scratchpad/chunks.js b/packages/scratchpad/chunks.js
deleted file mode 100644
index fd158201..00000000
--- a/packages/scratchpad/chunks.js
+++ /dev/null
@@ -1,135 +0,0 @@
-/* eslint-disable no-loop-func */
-"use strict";
-
-const merge = (graph, original, target) => {
-    const incoming = graph.incomingEdges[original];
-    const outgoing = graph.outgoingEdges[original];
-
-    graph.getNodeData(target).unshift(original);
-
-    incoming.forEach((src) => {
-        graph.removeDependency(src, original);
-
-        if(src !== target) {
-            graph.addDependency(src, target);
-        }
-    });
-
-    outgoing.forEach((dest) => {
-        graph.removeDependency(original, dest);
-
-        if(dest !== target) {
-            graph.addDependency(target, dest);
-        }
-    });
-
-    // Bye bye
-    graph.removeNode(original);
-};
-
-const setsContain = (a, b) => {
-    for(const val of a) {
-        if(!b.has(val)) {
-            return false;
-        }
-    }
-
-    return true;
-};
-
-const setsMatch = (a, b) => {
-    if(a.size !== b.size) {
-        return false;
-    }
-
-    return setsContain(a, b);
-};
-
-const chunks = ({ entries, graph }) => {
-    const result = graph.clone();
-
-    // Lookups
-    const nodeToEntries = new Map();
-    const entryToNodes = new Map();
-
-    // Keeping track of nodes we've already handled
-    const chunked = new Set();
-
-    // First build up a map of entry -> set of deps for comparisons
-    entries.forEach((entry) => {
-        const deps = result.dependenciesOf(entry).reverse();
-
-        if(!entryToNodes.has(entry)) {
-            entryToNodes.set(entry, new Set());
-        }
-
-        deps.forEach((node) => {
-            if(!nodeToEntries.has(node)) {
-                nodeToEntries.set(node, new Set());
-            }
-
-            nodeToEntries.get(node).add(entry);
-            entryToNodes.get(entry).add(node);
-        });
-    });
-
-    // Keep looping until all nodes have been chunked (even if that's just into themselves)
-    while(chunked.size < nodeToEntries.size) {
-        // Iterate the nodes associated with each entry,
-        // and figure out if the node can be collapsed
-        entryToNodes.forEach((nodes, entry) => {
-            // Nodes that will be merged at the end of this iteration
-            const queued = new Set();
-
-            // This will be the first set of entries found in the walk,
-            // any subsequent nodes in this pass must match this to be combined
-            let branches;
-
-            // If all the nodes for this branch are handled, skip it
-            if(setsContain(nodes, chunked)) {
-                return;
-            }
-
-            // Walk the dependencies of the current entry in order
-            const branch = result.dependenciesOf(entry).reverse();
-
-            for(const node of branch) {
-                if(chunked.has(node)) {
-                    continue;
-                }
-
-                // Figure out the entries that reference this node
-                const containers = nodeToEntries.get(node);
-
-                if(!branches) {
-                    branches = containers;
-                } else if(!setsMatch(branches, containers)) {
-                    // TODO: Can we get the order to have leaf nodes first so we could stop
-                    // TODO: iteration on this branch at this point
-                    continue;
-                }
-
-                queued.add(node);
-            }
-
-            // Merge all the queued nodes into the first node in the queue
-            let base;
-
-            queued.forEach((node) => {
-                chunked.add(node);
-
-                if(!base) {
-                    base = node;
-
-                    return;
-                }
-
-                merge(result, node, base);
-            });
-        });
-    }
-
-    return result;
-};
-
-module.exports = chunks;
diff --git a/packages/scratchpad/package.json b/packages/scratchpad/package.json
deleted file mode 100644
index 19334826..00000000
--- a/packages/scratchpad/package.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "name": "@modular-css/scratchpad",
-  "version": "24.0.0",
-  "private": true,
-  "description": "Testing area for new ideas modular-css",
-  "main": "compare.js",
-  "author": "Pat Cavit <npm@patcavit.com>",
-  "homepage": "https://m-css.com",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/tivac/modular-css.git",
-    "directory": "packages/scratchpad"
-  },
-  "license": "MIT"
-}
diff --git a/packages/svelte/CHANGELOG.md b/packages/svelte/CHANGELOG.md
index 0da1c42b..44a77f67 100644
--- a/packages/svelte/CHANGELOG.md
+++ b/packages/svelte/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+**Note:** Version bump only for package @modular-css/svelte
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 **Note:** Version bump only for package @modular-css/svelte
diff --git a/packages/svelte/package.json b/packages/svelte/package.json
index 8403e0a3..4516e5e3 100644
--- a/packages/svelte/package.json
+++ b/packages/svelte/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@modular-css/svelte",
-  "version": "24.2.0",
+  "version": "24.2.2",
   "description": "Add modular-css support to svelte",
   "main": "./svelte.js",
   "repository": {
diff --git a/packages/svelte/svelte.js b/packages/svelte/svelte.js
index ce1d8523..55a5272b 100644
--- a/packages/svelte/svelte.js
+++ b/packages/svelte/svelte.js
@@ -219,7 +219,7 @@ module.exports = (config = false) => {
         return {
             code : missing({
                 source,
-                file : css
+                file : css,
             }),
             dependencies,
         };
diff --git a/packages/webpack/CHANGELOG.md b/packages/webpack/CHANGELOG.md
index 7b6cb485..e1fe87cd 100644
--- a/packages/webpack/CHANGELOG.md
+++ b/packages/webpack/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+**Note:** Version bump only for package @modular-css/webpack
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 **Note:** Version bump only for package @modular-css/webpack
diff --git a/packages/webpack/package.json b/packages/webpack/package.json
index 453f4204..8574e032 100644
--- a/packages/webpack/package.json
+++ b/packages/webpack/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@modular-css/webpack",
-  "version": "24.2.0",
+  "version": "24.2.2",
   "description": "Webpack support for modular-css",
   "main": "./index.js",
   "repository": {
diff --git a/packages/www/CHANGELOG.md b/packages/www/CHANGELOG.md
index 17a122a5..7777e1a4 100644
--- a/packages/www/CHANGELOG.md
+++ b/packages/www/CHANGELOG.md
@@ -3,6 +3,14 @@
 All notable changes to this project will be documented in this file.
 See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
 
+## [24.2.2](https://github.com/tivac/modular-css/compare/v24.2.0...v24.2.2) (2019-07-08)
+
+**Note:** Version bump only for package @modular-css/website
+
+
+
+
+
 # [24.2.0](https://github.com/tivac/modular-css/compare/v24.1.0...v24.2.0) (2019-07-06)
 
 
diff --git a/packages/www/build/html/changelog.js b/packages/www/build/html/changelog.js
deleted file mode 100644
index 92ad135f..00000000
--- a/packages/www/build/html/changelog.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-
-const fs = require("fs");
-const path = require("path");
-
-const get = require("import-fresh");
-const { default : toc } = require("markdown-it-toc-and-anchor");
-
-const { dest } = require("../environment.js");
-const css = require("./css.js");
-
-module.exports = ({ graph, bundle }) => {
-    const md = require("./markdown.js")();
-    
-    // Set up markdown plugins
-    md.use(toc, {
-        tocFirstLevel   : 2,
-        tocLastLevel    : 2,
-        tocClassName    : "toc",
-        anchorClassName : "anchor",
-    });
-
-    const entry = "changelog.cjs.js";
-    const file = path.join(dest, "./changelog/index.html");
-
-    const changelog = fs.readFileSync(
-        require.resolve("../../../../CHANGELOG.md"),
-        "utf8"
-    );
-
-    const Changelog = get(path.join(dest, entry));
-
-    // Write out guide page
-    return {
-        file,
-        html : Changelog.render({
-            content : md.render(changelog),
-            styles  : css(entry, {
-                graph,
-                bundle,
-                file,
-            }),
-        })
-    };
-};
diff --git a/packages/www/build/html/css.js b/packages/www/build/html/css.js
deleted file mode 100644
index 3cccab6b..00000000
--- a/packages/www/build/html/css.js
+++ /dev/null
@@ -1,45 +0,0 @@
-"use strict";
-
-const path = require("path");
-
-const isUrl = require("is-url");
-
-const { dest } = require("../environment.js");
-
-const aliases = new Map([
-    [ "prism", "https://unpkg.com/prismjs@1.15.0/themes/prism-tomorrow.css" ],
-]);
-
-module.exports = (entry, { file, graph, bundle, styles = [] }) => {
-    const modules = [
-        ...graph.dependenciesOf(entry),
-        entry,
-    ];
-
-    const css = modules.reduce((out, key) => {
-        const { assets = false } = bundle[key] || false;
-
-        if(!assets) {
-            return out;
-        }
-
-        out.push(...assets);
-
-        return out;
-    }, styles);
-
-    const links = css.map((key) => {
-        if(aliases.has(key)) {
-            key = aliases.get(key);
-        }
-        
-        const href = isUrl(key) ?
-            key :
-            path.relative(file, path.join(dest, key)).replace(/\\/g, "/");
-
-        return `<link href="${href}" rel="stylesheet" />`;
-    });
-
-    return links;
-};
-
diff --git a/packages/www/build/html/guide.js b/packages/www/build/html/guide.js
deleted file mode 100644
index eff97533..00000000
--- a/packages/www/build/html/guide.js
+++ /dev/null
@@ -1,55 +0,0 @@
-"use strict";
-
-const fs = require("fs");
-const path = require("path");
-
-const get = require("import-fresh");
-const { default : toc } = require("markdown-it-toc-and-anchor");
-const include = require("markdown-it-include");
-
-const { src, dest } = require("../environment.js");
-const css = require("./css.js");
-
-module.exports = ({ graph, bundle }) => {
-    const md = require("./markdown.js")();
-    
-    // Set up markdown plugins
-    md.use(toc, {
-        tocFirstLevel   : 2,
-        tocLastLevel    : 3,
-        tocClassName    : "toc",
-        anchorClassName : "anchor",
-    });
-
-    md.use(include, path.join(src, "./guide"));
-
-    const entry = "guide.cjs.js";
-    const file = path.join(dest, "./guide/index.html");
-    let tocs;
-
-    // Have to render ahead-of-time so TOCs can be mapped for sidebar
-    const html = md.render(fs.readFileSync(path.join(src, "./guide/guide.md"), "utf8"), {
-        tocCallback : (tocmd, headings, tochtml) => {
-            tocs = tochtml;
-        },
-    });
-
-    const Guide = get(path.join(dest, entry));
-
-    // Write out guide page
-    return {
-        file,
-        html : Guide.render({
-            tocs,
-            content : html,
-            styles  : css(entry, {
-                graph,
-                bundle,
-                file,
-                styles : [
-                    "prism",
-                ]
-        }),
-        })
-    };
-};
diff --git a/packages/www/build/html/home.js b/packages/www/build/html/home.js
deleted file mode 100644
index 2dc51d50..00000000
--- a/packages/www/build/html/home.js
+++ /dev/null
@@ -1,44 +0,0 @@
-"use strict";
-
-const fs = require("fs");
-const path = require("path");
-
-const get = require("import-fresh");
-
-const { src, dest } = require("../environment.js");
-
-const css = require("./css.js");
-
-// Create home page markup
-module.exports = ({ bundle, graph }) => {
-    const md = require("./markdown.js")();
-
-    const entry = "home.cjs.js";
-    const file = path.join(dest, "./index.html");
-
-    const example = md.render(
-        fs.readFileSync(path.join(src, "./home/example.md"), "utf8")
-    );
-    
-    const intro = md.render(
-        fs.readFileSync(path.join(src, "./home/intro.md"), "utf8")
-    );
-    
-    const Home = get(path.join(dest, entry));
-
-    return {
-        file,
-        html : Home.render({
-            example,
-            intro,
-            styles : css(entry, {
-                file,
-                graph,
-                bundle,
-                styles : [
-                    "prism"
-                ]
-            }),
-        }),
-    };
-};
diff --git a/packages/www/build/html/markdown.js b/packages/www/build/html/markdown.js
deleted file mode 100644
index 20ec14fb..00000000
--- a/packages/www/build/html/markdown.js
+++ /dev/null
@@ -1,11 +0,0 @@
-module.exports = () => {
-    const md = require("markdown-it")({
-        html        : true,
-        linkify     : true,
-        typographer : true,
-    });
-
-    md.use(require("markdown-it-prism"));
-
-    return md;
-};
diff --git a/packages/www/build/html/repl.js b/packages/www/build/html/repl.js
deleted file mode 100644
index 3169c627..00000000
--- a/packages/www/build/html/repl.js
+++ /dev/null
@@ -1,45 +0,0 @@
-const path = require("path");
-
-const get = require("import-fresh");
-const dedent = require("dedent");
-
-const { dest } = require("../environment.js");
-
-const css = require("./css.js");
-
-module.exports = ({ graph, bundle, previous }) => {
-    const entry = "page.cjs.js";
-    const file = path.join(dest, "./repl/index.html");
-
-    const Page = get(path.join(dest, entry));
-
-    const [ js ] = Object.entries(previous())
-        .find(([ , { isAsset, name }]) => !isAsset && name === "repl");
-
-    return {
-        file : path.join(dest, "./repl/index.html"),
-        html : Page.render({
-            title : "REPL",
-            
-            styles : css("repl.cjs.js", { file, graph, bundle }),
-            
-            script : dedent(`
-                <script>
-                function shimport(src) {
-                    try {
-                        new Function('import("' + src + '")')();
-                    } catch (e) {
-                        var s = document.createElement('script');
-                        s.src = 'https://unpkg.com/shimport';
-                        s.dataset.main = src;
-                        document.head.appendChild(s);
-                    }
-                }
-
-                shimport("../${js}");
-        
-                </script>
-            `),
-        })
-    };
-};
diff --git a/packages/www/build/repl-renderer.js b/packages/www/build/repl-renderer.js
new file mode 100644
index 00000000..df3fd75a
--- /dev/null
+++ b/packages/www/build/repl-renderer.js
@@ -0,0 +1,79 @@
+"use strict";
+
+const lz = require("lznext");
+const dedent = require("dedent");
+
+const hash = (data) => lz.compressToEncodedURIComponent(JSON.stringify(data));
+
+module.exports = (tokens, idx) => {
+    const token = tokens[idx];
+
+    // Closing tags/info
+    if(token.nesting !== 1) {
+        return `</div>\n`;
+    }
+
+    // Find fenced code token
+    let code;
+
+    for(let i = idx; i < tokens.length; i++) {
+        if(tokens[i].type !== "fence") {
+            continue;
+        }
+        
+        code = tokens[i].content;
+            
+        break;
+    }
+
+    // split into triplets, "", filename, code
+    const parts = code.split(/\/\* =+ ([\w-]+\.css) =+ \*\/\r?\n/g);
+
+    let files;
+
+    if(parts.length > 1) {
+        files = parts.reduce((acc, curr) => {
+            // Handle ""
+            if(!curr.length) {
+                return acc;
+            }
+
+            // Handle filename
+            if(curr.endsWith(".css")) {
+                let file = curr;
+
+                if(file[0] !== "/") {
+                    file = `/${file}`;
+                }
+
+                acc.push([ file ]);
+
+                return acc;
+            }
+
+            // Handle code
+            acc[acc.length - 1].push(curr);
+
+            return acc;
+        }, []);
+
+        // Because the file demonstrating the feature always comes last
+        // it's worth reversing the list here before hashing it
+        files.reverse();
+    } else {
+        files = [
+            [
+                "./style.css",
+                code,
+            ],
+        ];
+    }
+
+    const href = `/repl/#${hash(files)}`;
+
+    // Opening tag
+    return dedent`
+        <div class="repl-code">
+            <a class="repl-link" href="${href}">Edit in REPL</a>
+    `;
+};
diff --git a/packages/www/build/rollup-plugin-generate-html.js b/packages/www/build/rollup-plugin-generate-html.js
index 79edea1a..47ee2b4c 100644
--- a/packages/www/build/rollup-plugin-generate-html.js
+++ b/packages/www/build/rollup-plugin-generate-html.js
@@ -3,46 +3,79 @@
 const fs = require("fs");
 const path = require("path");
 
-const Graph = require("dependency-graph").DepGraph;
 const shell = require("shelljs");
 
-const repl = require("./html/repl.js");
-const guide = require("./html/guide.js");
-const home = require("./html/home.js");
-const changelog = require("./html/changelog.js");
+const { dest } = require("./environment.js");
+
+const script = (src) => `
+    <script>
+        function shimport(src) {
+            try {
+                new Function('import("' + src + '")')();
+            } catch (e) {
+                var s = document.createElement('script');
+                s.src = 'https://unpkg.com/shimport';
+                s.dataset.main = src;
+                document.head.appendChild(s);
+            }
+        }
+
+        shimport("/${src}");
+    </script>
+`;
+
+const stylesheet = (href) => `<link href="/${href}" rel="stylesheet" />`;
 
 module.exports = ({ bundle : previous }) => ({
     name : "rollup-plugin-generate-html",
 
     async writeBundle(bundle) {
-        const graph = new Graph();
+        const prev = previous();
 
-        Object.entries(bundle).forEach(([ entry, { isAsset, imports }]) => {
-            if(isAsset) {
+        Object.entries(prev).forEach(([ id, { isEntry, assets = [], imports = [], name }]) => {
+            if(!isEntry) {
                 return;
             }
 
-            graph.addNode(entry, 0);
+            const page = require(path.join(dest, id));
+            let dir = path.join(dest, name);
+
+            if(name === "home") {
+                dir = dest;
+            }
+
+            const styles = new Set();
 
             imports.forEach((dep) => {
-                graph.addNode(dep);
-                graph.addDependency(entry, dep);
+                const { assets : css = [] } = prev[dep];
+                
+                css.forEach((href) => styles.add(stylesheet(href)));
             });
-        });
 
-        const args = { bundle, graph, previous };
+            assets.forEach((href) => styles.add(stylesheet(href)));
+
+            const data = {
+                styles,
+            };
+
+            // The REPL is special, need to go find the JS generated by the second build
+            // as well as any assets and ensure they get passed to the page
+            if(name === "repl") {
+                const [ js, { assets : css = [] }] = Object.entries(bundle)
+                    .find(([ , { isEntry : entry, name : ident }]) => entry && ident === "repl");
+                
+                data.script = script(js);
+
+                css.forEach((href) => styles.add(stylesheet(href)));
+            }
+
+            data.styles = [ ...data.styles.values() ];
 
-        [
-            repl(args),
-            guide(args),
-            home(args),
-            changelog(args),
-        ].forEach(({ file, html }) => {
-            const dir = path.dirname(file);
+            const { html } = page.render(data);
 
             shell.mkdir("-p", dir);
 
-            fs.writeFileSync(file, html, "utf8");
+            fs.writeFileSync(path.join(dir, "index.html"), html, "utf8");
         });
     },
 });
diff --git a/packages/www/build/rollup-plugin-md.js b/packages/www/build/rollup-plugin-md.js
new file mode 100644
index 00000000..87754486
--- /dev/null
+++ b/packages/www/build/rollup-plugin-md.js
@@ -0,0 +1,75 @@
+"use strict";
+
+const path = require("path");
+
+const markdown = require("markdown-it");
+const { default : toc } = require("markdown-it-toc-and-anchor");
+const includer = require("markdown-it-include");
+const container = require("markdown-it-container");
+const prism = require("markdown-it-prism");
+
+const { createFilter } = require("rollup-pluginutils");
+
+const replRenderer = require("./repl-renderer.js");
+
+module.exports = ({ include = "**/*.md", exclude } = false) => {
+    const filter = createFilter(include, exclude, { resolve : false });
+
+    return {
+        name : "rollup-plugin-md",
+
+        transform(code, id) {
+            if(!filter(id)) {
+                return;
+            }
+            
+            const { dir } = path.parse(id);
+
+            const md = markdown({
+                html        : true,
+                linkify     : true,
+                typographer : true,
+            });
+            
+            // Prism highlighting for codeblocks
+            md.use(prism);
+    
+            // TOC support
+            md.use(toc, {
+                tocFirstLevel   : 2,
+                tocLastLevel    : 3,
+                tocClassName    : "toc",
+                anchorClassName : "anchor",
+            });
+
+            // Including other MD files inline
+            md.use(includer, dir);
+
+            // Custom containers
+            md.use(container, "repl", {
+                render : replRenderer,
+            });
+
+            // Have to render ahead-of-time so TOCs can be mapped for sidebar
+            let tocs;
+
+            const html = md.render(code, {
+                tocCallback : (tocmd, headings, tochtml) => {
+                    tocs = tochtml;
+                },
+            });
+
+            // Can't use dedent for this or rollup freaks out & ignores it? Weird.
+            // eslint-disable-next-line consistent-return
+            return `
+                const tocs = ${JSON.stringify(tocs)};
+                const content = ${JSON.stringify(html)};
+                
+                export {
+                    tocs,
+                    content,
+                };
+            `;
+        },
+    };
+};
diff --git a/packages/www/build/rollup-plugin-postcss.js b/packages/www/build/rollup-plugin-postcss.js
index 1aebc384..f1d729c5 100644
--- a/packages/www/build/rollup-plugin-postcss.js
+++ b/packages/www/build/rollup-plugin-postcss.js
@@ -52,5 +52,5 @@ module.exports = () => ({
                 });
             });
         });
-    }
+    },
 });
diff --git a/packages/www/package-lock.json b/packages/www/package-lock.json
new file mode 100644
index 00000000..8bb0e88e
--- /dev/null
+++ b/packages/www/package-lock.json
@@ -0,0 +1,2232 @@
+{
+  "name": "@modular-css/website",
+  "version": "24.2.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+      "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+      "requires": {
+        "@babel/highlight": "^7.0.0"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+      "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
+      "requires": {
+        "chalk": "^2.0.0",
+        "esutils": "^2.0.2",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "@types/estree": {
+      "version": "0.0.39",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
+      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
+    },
+    "@types/node": {
+      "version": "12.6.3",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.3.tgz",
+      "integrity": "sha512-7TEYTQT1/6PP53NftXXabIZDaZfaoBdeBm8Md/i7zsWRoBe0YwOXguyK8vhHs8ehgB/w9U4K/6EWuTyp0W6nIA=="
+    },
+    "@types/resolve": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
+      "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "anymatch": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+      "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+      "requires": {
+        "micromatch": "^2.1.5",
+        "normalize-path": "^2.0.0"
+      }
+    },
+    "arr-diff": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+      "requires": {
+        "arr-flatten": "^1.0.1"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+    },
+    "array-unique": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+    },
+    "async-each": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
+    },
+    "braces": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+      "requires": {
+        "expand-range": "^1.8.1",
+        "preserve": "^0.2.0",
+        "repeat-element": "^1.1.2"
+      }
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
+    },
+    "builtin-modules": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
+      "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw=="
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "chokidar": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+      "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+      "requires": {
+        "anymatch": "^1.3.0",
+        "async-each": "^1.0.0",
+        "fsevents": "^1.0.0",
+        "glob-parent": "^2.0.0",
+        "inherits": "^2.0.1",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^2.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.0.0"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+    },
+    "commander": {
+      "version": "2.20.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+      "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ=="
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "estree-walker": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+      "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+    },
+    "expand-brackets": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+      "requires": {
+        "is-posix-bracket": "^0.1.0"
+      }
+    },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "requires": {
+        "fill-range": "^2.1.0"
+      }
+    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+      "requires": {
+        "is-extglob": "^1.0.0"
+      }
+    },
+    "filename-regex": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
+    },
+    "fill-range": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+      "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+      "requires": {
+        "is-number": "^2.1.0",
+        "isobject": "^2.0.0",
+        "randomatic": "^3.0.0",
+        "repeat-element": "^1.1.2",
+        "repeat-string": "^1.5.2"
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+    },
+    "for-own": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+      "requires": {
+        "for-in": "^1.0.1"
+      }
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fsevents": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
+      "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
+      "optional": true,
+      "requires": {
+        "nan": "^2.12.1",
+        "node-pre-gyp": "^0.12.0"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "bundled": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
+          }
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "chownr": {
+          "version": "1.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true,
+          "optional": true
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true,
+          "optional": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "debug": {
+          "version": "4.1.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "deep-extend": {
+          "version": "0.6.0",
+          "bundled": true,
+          "optional": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.3",
+          "bundled": true,
+          "optional": true
+        },
+        "fs-minipass": {
+          "version": "1.2.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.3",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "ignore-walk": {
+          "version": "3.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minimatch": "^3.0.4"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true,
+          "optional": true
+        },
+        "ini": {
+          "version": "1.3.5",
+          "bundled": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true,
+          "optional": true
+        },
+        "minipass": {
+          "version": "2.3.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "1.2.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "needle": {
+          "version": "2.3.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "debug": "^4.1.0",
+            "iconv-lite": "^0.4.4",
+            "sax": "^1.2.4"
+          }
+        },
+        "node-pre-gyp": {
+          "version": "0.12.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "^1.0.2",
+            "mkdirp": "^0.5.1",
+            "needle": "^2.2.1",
+            "nopt": "^4.0.1",
+            "npm-packlist": "^1.1.6",
+            "npmlog": "^4.0.2",
+            "rc": "^1.2.7",
+            "rimraf": "^2.6.1",
+            "semver": "^5.3.0",
+            "tar": "^4"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.6",
+          "bundled": true,
+          "optional": true
+        },
+        "npm-packlist": {
+          "version": "1.4.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.8",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "^0.6.0",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.3",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "bundled": true,
+          "optional": true
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true,
+          "optional": true
+        },
+        "sax": {
+          "version": "1.2.4",
+          "bundled": true,
+          "optional": true
+        },
+        "semver": {
+          "version": "5.7.0",
+          "bundled": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "4.4.8",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "chownr": "^1.1.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.3.4",
+            "minizlib": "^1.1.1",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.2",
+            "yallist": "^3.0.2"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "wide-align": {
+          "version": "1.1.3",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "string-width": "^1.0.2 || 2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "yallist": {
+          "version": "3.0.3",
+          "bundled": true,
+          "optional": true
+        }
+      }
+    },
+    "get-port": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.0.0.tgz",
+      "integrity": "sha512-imzMU0FjsZqNa6BqOjbbW6w5BivHIuQKopjpPqcnx0AVHJQKCxK1O+Ab3OrVXhrekqfVMjwA9ZYu062R+KcIsQ==",
+      "requires": {
+        "type-fest": "^0.3.0"
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+    },
+    "glob-base": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+      "requires": {
+        "glob-parent": "^2.0.0",
+        "is-glob": "^2.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+      "requires": {
+        "is-glob": "^2.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz",
+      "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg=="
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+        }
+      }
+    },
+    "is-dotfile": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
+    },
+    "is-equal-shallow": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+      "requires": {
+        "is-primitive": "^2.0.0"
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+    },
+    "is-extglob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+    },
+    "is-glob": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+      "requires": {
+        "is-extglob": "^1.0.0"
+      }
+    },
+    "is-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
+      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE="
+    },
+    "is-number": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "requires": {
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "is-posix-bracket": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
+    },
+    "is-primitive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
+    },
+    "is-reference": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.3.tgz",
+      "integrity": "sha512-W1iHHv/oyBb2pPxkBxtaewxa1BC58Pn5J0hogyCdefwUIvb6R+TGbAcIa4qPNYLqLhb3EnOgUf2MQkkF76BcKw==",
+      "requires": {
+        "@types/estree": "0.0.39"
+      }
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+      "requires": {
+        "isarray": "1.0.0"
+      }
+    },
+    "jest-worker": {
+      "version": "24.6.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz",
+      "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==",
+      "requires": {
+        "merge-stream": "^1.0.1",
+        "supports-color": "^6.1.0"
+      },
+      "dependencies": {
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "requires": {
+        "is-buffer": "^1.1.5"
+      }
+    },
+    "livereload": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.7.0.tgz",
+      "integrity": "sha512-PHnIGczQEvmCctDvRTWylA+1wSwE0/eFm+LkNhlmlAFus/aCRlVE97UOLOf6TUGLmZyfg7z7twG37ZiOgNJAyQ==",
+      "requires": {
+        "chokidar": "^1.7.0",
+        "opts": ">= 1.2.0",
+        "ws": "^1.1.5"
+      }
+    },
+    "magic-string": {
+      "version": "0.25.3",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz",
+      "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==",
+      "requires": {
+        "sourcemap-codec": "^1.4.4"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "math-random": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
+      "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A=="
+    },
+    "merge-stream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
+      "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
+      "requires": {
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "micromatch": {
+      "version": "2.3.11",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+      "requires": {
+        "arr-diff": "^2.0.0",
+        "array-unique": "^0.2.1",
+        "braces": "^1.8.2",
+        "expand-brackets": "^0.1.4",
+        "extglob": "^0.3.1",
+        "filename-regex": "^2.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.1",
+        "kind-of": "^3.0.2",
+        "normalize-path": "^2.0.1",
+        "object.omit": "^2.0.0",
+        "parse-glob": "^3.0.4",
+        "regex-cache": "^0.4.2"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "nan": {
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
+      "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "requires": {
+        "remove-trailing-separator": "^1.0.1"
+      }
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "requires": {
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "object.omit": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+      "requires": {
+        "for-own": "^0.1.4",
+        "is-extendable": "^0.1.1"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "requires": {
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "options": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
+      "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8="
+    },
+    "opts": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/opts/-/opts-1.2.6.tgz",
+      "integrity": "sha1-0YXAQlz9652h0YKQi2W1wCOP67M="
+    },
+    "p-debounce": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-debounce/-/p-debounce-2.1.0.tgz",
+      "integrity": "sha512-M9bMt62TTnozdZhqFgs+V7XD2MnuKCaz+7fZdlu2/T7xruI3uIE5CicQ0vx1hV7HIUYF0jF+4/R1AgfOkl74Qw=="
+    },
+    "parse-glob": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+      "requires": {
+        "glob-base": "^0.3.0",
+        "is-dotfile": "^1.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.0"
+      }
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+    },
+    "preserve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "randomatic": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+      "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+      "requires": {
+        "is-number": "^4.0.0",
+        "kind-of": "^6.0.0",
+        "math-random": "^1.0.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "requires": {
+            "debug": "^2.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "requires": {
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "requires": {
+            "array-unique": "^0.3.2",
+            "define-property": "^1.0.0",
+            "expand-brackets": "^2.1.4",
+            "extend-shallow": "^2.0.1",
+            "fragment-cache": "^0.2.1",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        }
+      }
+    },
+    "regex-cache": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+      "requires": {
+        "is-equal-shallow": "^0.1.3"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+    },
+    "resolve": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz",
+      "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==",
+      "requires": {
+        "path-parse": "^1.0.6"
+      },
+      "dependencies": {
+        "path-parse": {
+          "version": "1.0.6",
+          "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+          "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+        }
+      }
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+    },
+    "rollup-plugin-commonjs": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.0.0.tgz",
+      "integrity": "sha512-B8MoX5GRpj3kW4+YaFO/di2JsZkBxNjVmZ9LWjUoTAjq8N9wc7HObMXPsrvolVV9JXVtYSscflXM14A19dXPNQ==",
+      "requires": {
+        "estree-walker": "^0.6.0",
+        "is-reference": "^1.1.2",
+        "magic-string": "^0.25.2",
+        "resolve": "^1.10.1",
+        "rollup-pluginutils": "^2.7.0"
+      }
+    },
+    "rollup-plugin-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz",
+      "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==",
+      "requires": {
+        "rollup-pluginutils": "^2.5.0"
+      }
+    },
+    "rollup-plugin-livereload": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-1.0.0.tgz",
+      "integrity": "sha512-73vtOWMcQEOKyk5jgDTEFYGf4d4GWraDt/onTiauE7WALAO+6nIWKD7p47yDiCiz/pTOKvh38SQ2HZ8KkpaNew==",
+      "requires": {
+        "livereload": "^0.7.0"
+      }
+    },
+    "rollup-plugin-node-resolve": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.0.0.tgz",
+      "integrity": "sha512-JUFr7DkFps3div9DYwpSg0O+s8zuSSRASUZUVNx6h6zhw2m8vcpToeS68JDPsFbmisMVSMYK0IxftngCRv7M9Q==",
+      "requires": {
+        "@types/resolve": "0.0.8",
+        "builtin-modules": "^3.1.0",
+        "is-module": "^1.0.0",
+        "resolve": "^1.10.1",
+        "rollup-pluginutils": "^2.7.0"
+      }
+    },
+    "rollup-plugin-terser": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.0.0.tgz",
+      "integrity": "sha512-W+jJ4opYnlmNyVW0vtRufs+EGf68BIJ7bnOazgz8mgz8pA9lUyrEifAhPs5y9M16wFeAyBGaRjKip4dnFBtXaw==",
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "jest-worker": "^24.6.0",
+        "serialize-javascript": "^1.7.0",
+        "terser": "^4.0.0"
+      }
+    },
+    "rollup-pluginutils": {
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz",
+      "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==",
+      "requires": {
+        "estree-walker": "^0.6.1"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "serialize-javascript": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz",
+      "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA=="
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "requires": {
+        "kind-of": "^3.2.0"
+      }
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
+    "source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+      "requires": {
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.5.12",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
+      "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+    },
+    "sourcemap-codec": {
+      "version": "1.4.6",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz",
+      "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg=="
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "terser": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-4.0.0.tgz",
+      "integrity": "sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==",
+      "requires": {
+        "commander": "^2.19.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.10"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+        }
+      }
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        }
+      }
+    },
+    "type-fest": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
+      "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ=="
+    },
+    "ultron": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
+      "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "ws": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
+      "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
+      "requires": {
+        "options": ">=0.0.5",
+        "ultron": "1.0.x"
+      }
+    }
+  }
+}
diff --git a/packages/www/package.json b/packages/www/package.json
index c639224f..f380bea4 100644
--- a/packages/www/package.json
+++ b/packages/www/package.json
@@ -1,13 +1,13 @@
 {
   "name": "@modular-css/website",
-  "version": "24.2.0",
+  "version": "24.2.2",
   "private": true,
   "description": "web site for modular-css",
   "main": "index.js",
   "scripts": {
     "build": "rollup --config",
     "markdown": "node build/markdown.js",
-    "production": "rollup --config --environment=NODE_ENV:production",
+    "deploy": "rollup --config --environment=NODE_ENV:production",
     "start": "rollup --config --watch",
     "test": "echo \"no tests ¯\\_(ツ)_/¯\""
   },
@@ -39,6 +39,7 @@
     "lazyload-css": "^1.0.5",
     "lznext": "^0.1.0",
     "markdown-it": "^8.4.2",
+    "markdown-it-container": "^2.0.0",
     "markdown-it-include": "^1.0.0",
     "markdown-it-prism": "^2.0.1",
     "markdown-it-toc-and-anchor": "^4.2.0",
@@ -50,6 +51,7 @@
     "postcss-color-function": "^4.0.1",
     "postcss-import": "^12.0.1",
     "postcss-nested": "^4.1.1",
+    "require-from-string": "^2.0.2",
     "rollup-plugin-alias": "^1.5.1",
     "rollup-plugin-commonjs": "^10.0.0",
     "rollup-plugin-json": "^4.0.0",
@@ -59,6 +61,7 @@
     "rollup-plugin-node-resolve": "^5.0.0",
     "rollup-plugin-svelte": "^5.0.1",
     "rollup-plugin-terser": "^5.0.0",
+    "rollup-pluginutils": "^2.8.1",
     "svelte": "^2.16.0"
   }
 }
diff --git a/packages/www/rollup.config.js b/packages/www/rollup.config.js
index 4984cab1..ffb33848 100644
--- a/packages/www/rollup.config.js
+++ b/packages/www/rollup.config.js
@@ -40,50 +40,63 @@ const shared = (store) => {
 const bundle = shared();
 
 module.exports = [
-    // Browser build of the REPL runs first, we need to know what the filename will be
+    // CJS Build of home/guide for node generation
     {
         input : {
-            repl : "./src/repl/index.js",
+            api       : "./src/api/api.html",
+            guide     : "./src/guide/guide.html",
+            home      : "./src/home/home.html",
+            repl      : "./src/repl/index.html",
+            changelog : "./src/changelog/changelog.html",
         },
 
+        // Don't need to bundle any of this, so purposefully exclude it
+        external : [
+            "fs",
+            "path",
+            "crypto",
+            "module",
+            "postcss",
+            "@modular-css/processor",
+            "lznext",
+        ],
+
         output : {
             dir    : dest,
-            format : "esm",
+            format : "cjs",
 
-            sourcemap : true,
+            sourcemap : false,
 
-            entryFileNames : "[name]-[hash].js",
+            entryFileNames : "[name].[format].js",
+            chunkFileNames : "[name].[format].js",
         },
 
         plugins : [
             // Wipe the destination dir on each rebuild
             require("./build/rollup-plugin-clean")(),
 
-            require("rollup-plugin-alias")({
-                fs   : require.resolve("./stubs/fs.js"),
-                path : require.resolve("./stubs/path.js"),
-            }),
+            // Watch .md files for chanegs as well
+            require("./build/rollup-plugin-add-watch-files.js")(),
 
             require("rollup-plugin-node-resolve")({
-                mainFields : [ "module", "browser", "main" ],
-
                 preferBuiltins : false,
             }),
-            
-            // Run webpack INSIDE ROLLUP to bundle postcss because it's fuckered otherwise
-            require("./build/rollup-plugin-postcss.js")(),
+
+            // Transform .md files
+            require("./build/rollup-plugin-md.js")(),
             
             require("rollup-plugin-commonjs")(),
-            require("rollup-plugin-node-globals")(),
-            require("rollup-plugin-node-builtins")(),
             require("rollup-plugin-json")(),
             
             require("rollup-plugin-svelte")({
                 preprocess,
+                generate : "ssr",
+                dev      : isProduction,
             }),
 
             require("@modular-css/rollup")({
                 processor,
+                dev : isProduction,
             }),
 
             // Weird little inline plugin to make the previous bundle available
@@ -94,69 +107,69 @@ module.exports = [
                     bundle(chunks);
                 },
             },
-            
+
             // Start a local server if in watch mode
             isWatch && require("./build/rollup-plugin-sirv.js")(),
-
-            // Compress JS in production mode
-            isProduction && require("rollup-plugin-terser").terser(),
         ],
     },
-    // CJS Build of home/guide for node generation
+    // Browser build of the REPL
     {
         input : {
-            guide     : "./src/guide/guide.html",
-            home      : "./src/home/home.html",
-            repl      : "./src/repl/repl.html",
-            changelog : "./src/changelog/changelog.html",
-
-            // REPL builds using generic page container
+            repl : "./src/repl/index.js",
+            
+            // Including to force the CSS to be split apart so the REPL CSS
+            // doesn't duplicate things it doesn't need to
             page : "./src/page.html",
         },
 
-        // Don't need to bundle any of this, so purposefully exclude it
-        external : [
-            "fs",
-            "path",
-            "crypto",
-            "module",
-            "postcss",
-            "@modular-css/processor",
-            "lznext",
-        ],
-
         output : {
             dir    : dest,
-            format : "cjs",
+            format : "esm",
 
-            sourcemap : false,
+            sourcemap : true,
 
-            entryFileNames : "[name].[format].js",
-            chunkFileNames : "[name].[format].js",
+            entryFileNames : "[name]-[hash].js",
         },
 
         plugins : [
-            require("./build/rollup-plugin-add-watch-files.js")(),
+            require("rollup-plugin-alias")({
+                fs   : require.resolve("./stubs/fs.js"),
+                path : require.resolve("./stubs/path.js"),
+            }),
 
             require("rollup-plugin-node-resolve")({
+                mainFields : [
+                    "module",
+                    "browser",
+                    "main",
+                ],
+
                 preferBuiltins : false,
             }),
             
+            // Run webpack INSIDE ROLLUP to bundle postcss because it's fuckered otherwise
+            require("./build/rollup-plugin-postcss.js")(),
+            
             require("rollup-plugin-commonjs")(),
+            require("rollup-plugin-node-globals")(),
+            require("rollup-plugin-node-builtins")(),
             require("rollup-plugin-json")(),
             
             require("rollup-plugin-svelte")({
                 preprocess,
-                generate : "ssr",
+                dev : isProduction,
             }),
 
             require("@modular-css/rollup")({
                 processor,
+                dev : isProduction,
             }),
 
             // Generate HTML for all the static pages
             require("./build/rollup-plugin-generate-html.js")({ bundle }),
+
+            // Compress JS in production mode
+            isProduction && require("rollup-plugin-terser").terser(),
         ],
     },
-    
 ];
diff --git a/packages/www/src/api/api.css b/packages/www/src/api/api.css
new file mode 100644
index 00000000..9601ccf5
--- /dev/null
+++ b/packages/www/src/api/api.css
@@ -0,0 +1,31 @@
+@value contentWidth, sidebarWidth, narrow from "../site.css";
+
+.guide {
+    composes: content from "../site.css";
+}
+
+.bd {
+    composes: bd from "../site.css";
+
+    max-width: contentWidth;
+    margin: 1rem 1rem 0 calc(sidebarWidth + 1.5rem);
+
+    @media narrow {
+        margin-left: 2rem;
+        max-width: 100%;
+    }
+}
+
+.bd a,
+.bd a:hover {
+    text-decoration: underline;
+}
+
+.bd li + li {
+    margin-top: 0.5rem;
+}
+
+.bd img {
+    width: 100%;
+    height: auto;
+}
diff --git a/packages/www/src/api/api.html b/packages/www/src/api/api.html
new file mode 100644
index 00000000..8212206a
--- /dev/null
+++ b/packages/www/src/api/api.html
@@ -0,0 +1,27 @@
+<link href="./api.css" />
+
+<Page title="Guide" {styles}>
+    <div class="{css.guide}">
+        <Sidebar {tocs} />
+
+        <div class="{css.bd}">
+            {@html content}
+        </div>
+    </div>
+</Page>
+
+<script>
+import { content, tocs } from "./api.md";
+
+export default {
+    components : {
+        Page    : "../page.html",
+        Sidebar : "../sidebar.html",
+    },
+
+    data : () => ({
+        content,
+        tocs,
+    }),
+};
+</script>
diff --git a/packages/www/src/api/api.md b/packages/www/src/api/api.md
new file mode 100644
index 00000000..b37e1e72
--- /dev/null
+++ b/packages/www/src/api/api.md
@@ -0,0 +1,6 @@
+# `modular-css` API
+
+!!!include(usage.md)!!!
+
+!!!include(extending.md)!!!
+
diff --git a/packages/www/src/guide/extending-after.md b/packages/www/src/api/extending-after.md
similarity index 78%
rename from packages/www/src/guide/extending-after.md
rename to packages/www/src/api/extending-after.md
index fec39f92..1171a3bf 100644
--- a/packages/www/src/guide/extending-after.md
+++ b/packages/www/src/api/extending-after.md
@@ -1,6 +1,6 @@
 ### `after` hook
 
-The `after` hook is run once the output location for the CSS is known, but before all the files are combined. By default it will run [`postcss-url`](https://github.com/postcss/postcss-url) to rebase file references based on the final output location, but this can be disabled using the [`rewrite`](api.md#rewrite) option.
+The `after` hook is run once the output location for the CSS is known, but before all the files are combined. By default it will run [`postcss-url`](https://github.com/postcss/postcss-url) to rebase file references based on the final output location, but this can be disabled using the [`rewrite`](#rewrite) option.
 
 Since all manipulations on the file are complete at this point it is a good place to run plugins like [`postcss-import`](https://github.com/postcss/postcss-import) to inline `@import` rules. The rules inlined in this way won't be scoped so it's a convenient way to pull in 3rd party code which can be included in the selector heirarchy via `composes`.
 
@@ -13,13 +13,13 @@ Since all manipulations on the file are complete at this point it is a good plac
 }
 ```
 
-#### `after` usage
+#### Using the `after` hook
 
 Specify an array of PostCSS plugins to be run after files are processed, but before they are combined. Plugin will be passed a `to` and `from` option.
 
 **Default**: `[]`
 
-:warning: [`postcss-url`](https://www.npmjs.com/package/postcss-url) automatically runs after any plugins defined in the `after` hook. To disable it use the [`rewrite`](#rewrite) option.
+⚠ [`postcss-url`](https://www.npmjs.com/package/postcss-url) automatically runs after any plugins defined in the `after` hook. To disable it use the [`rewrite`](#rewrite) option.
 
 ```js
 new Processor({
diff --git a/packages/www/src/guide/extending-before.md b/packages/www/src/api/extending-before.md
similarity index 94%
rename from packages/www/src/guide/extending-before.md
rename to packages/www/src/api/extending-before.md
index 9c9ebf75..0a736bb5 100644
--- a/packages/www/src/guide/extending-before.md
+++ b/packages/www/src/api/extending-before.md
@@ -3,7 +3,7 @@
 The `before` hook is run before a CSS file is ever processed by `modular-css`, so it provides access to rewrite files if they aren't actually CSS or contain non-standard syntax. Plugins like [`postcss-nested`](https://github.com/postcss/postcss-nested) go well here.
 
 
-#### `before` usage
+#### Using the `before` hook
 
 Specify an array of PostCSS plugins to be run against each file before it is processed. Plugin will be passed a `from` option.
 
diff --git a/packages/www/src/guide/extending-done.md b/packages/www/src/api/extending-done.md
similarity index 94%
rename from packages/www/src/guide/extending-done.md
rename to packages/www/src/api/extending-done.md
index 2729e2c6..479447c1 100644
--- a/packages/www/src/guide/extending-done.md
+++ b/packages/www/src/api/extending-done.md
@@ -2,7 +2,7 @@
 
 The `done` hook is run after all of the constituent files are combined into a single stylesheet. This makes it a good place to add tools like [`cssnano`](http://cssnano.co/) that need access to the entire stylesheet to be able to accurately optimize the CSS.
 
-#### `done` usage
+#### Using the `done` hook
 
 Specify an array of PostCSS plugins to be run against the complete combined CSS. Plugin will be passed a `to` option.
 
diff --git a/packages/www/src/guide/extending-processing.md b/packages/www/src/api/extending-processing.md
similarity index 78%
rename from packages/www/src/guide/extending-processing.md
rename to packages/www/src/api/extending-processing.md
index 79c27f87..89ababcf 100644
--- a/packages/www/src/guide/extending-processing.md
+++ b/packages/www/src/api/extending-processing.md
@@ -1,6 +1,6 @@
 ### `processing` hook
 
-The `processing` hook is run after `modular-css` has parsed the file, but before any response to [`processor.string`](api.md#string) or [`processor.file`](api.md#file) is returned. Plugins in this hook have a special power: they can change the exports of the file.
+The `processing` hook is run after `modular-css` has parsed the file, but before any response to [`processor.string`](#proccesorstringname-css) or [`processor.file`](#processorfilepath) is returned. Plugins in this hook have a special power: they can change the exports of the file.
 
 This works by having the plugin push an object onto the `result.messages` array. Here's a very simple example:
 
@@ -22,7 +22,7 @@ new Processor({
 
 The `plugin` field must begin with "modular-css-export", and the `exports` field should be the object to be mixed into the exports of the CSS file. It will be added last, so it can be used to override the default exports if desired.
 
-#### `processing` usage
+#### Using the `processing` hook
 
 Specify an array of PostCSS plugins to be run against each file during processing. Plugin will be passed a `from` option.
 
diff --git a/packages/www/src/guide/extending.md b/packages/www/src/api/extending.md
similarity index 100%
rename from packages/www/src/guide/extending.md
rename to packages/www/src/api/extending.md
diff --git a/packages/www/src/guide/usage-browserify.md b/packages/www/src/api/usage-browserify.md
similarity index 100%
rename from packages/www/src/guide/usage-browserify.md
rename to packages/www/src/api/usage-browserify.md
diff --git a/packages/www/src/guide/usage-cli.md b/packages/www/src/api/usage-cli.md
similarity index 98%
rename from packages/www/src/guide/usage-cli.md
rename to packages/www/src/api/usage-cli.md
index 01a9cab4..6669179a 100644
--- a/packages/www/src/guide/usage-cli.md
+++ b/packages/www/src/api/usage-cli.md
@@ -1,4 +1,4 @@
-### CLI
+## CLI
 
 CLI interface to [`modular-css`](https://github.com/tivac/modular-css).
 
diff --git a/packages/www/src/guide/usage-glob-api.md b/packages/www/src/api/usage-glob-api.md
similarity index 100%
rename from packages/www/src/guide/usage-glob-api.md
rename to packages/www/src/api/usage-glob-api.md
diff --git a/packages/www/src/guide/usage-js.md b/packages/www/src/api/usage-js.md
similarity index 94%
rename from packages/www/src/guide/usage-js.md
rename to packages/www/src/api/usage-js.md
index 91eac4d5..2f4bda29 100644
--- a/packages/www/src/guide/usage-js.md
+++ b/packages/www/src/api/usage-js.md
@@ -37,6 +37,14 @@ Promise.all([
 });
 ```
 
+##### `processor.file(<path>)`
+
+Pass a file path to the processor instance for processing. Returns a promise that resolves to details about the file that was added.
+
+##### `processor.string(<name>, <css>)`
+
+Pass a name and `css` string to the processor instance for processing. Returns a promise that resolves to details about the file that was added.
+
 #### Processor Options
 
 ##### `rewrite`
diff --git a/packages/www/src/guide/usage-postcss.md b/packages/www/src/api/usage-postcss.md
similarity index 100%
rename from packages/www/src/guide/usage-postcss.md
rename to packages/www/src/api/usage-postcss.md
diff --git a/packages/www/src/guide/usage-rollup.md b/packages/www/src/api/usage-rollup.md
similarity index 100%
rename from packages/www/src/guide/usage-rollup.md
rename to packages/www/src/api/usage-rollup.md
diff --git a/packages/www/src/guide/usage-svelte.md b/packages/www/src/api/usage-svelte.md
similarity index 100%
rename from packages/www/src/guide/usage-svelte.md
rename to packages/www/src/api/usage-svelte.md
diff --git a/packages/www/src/guide/usage-webpack.md b/packages/www/src/api/usage-webpack.md
similarity index 100%
rename from packages/www/src/guide/usage-webpack.md
rename to packages/www/src/api/usage-webpack.md
diff --git a/packages/www/src/guide/usage.md b/packages/www/src/api/usage.md
similarity index 54%
rename from packages/www/src/guide/usage.md
rename to packages/www/src/api/usage.md
index 2a53be63..adbe9b34 100644
--- a/packages/www/src/guide/usage.md
+++ b/packages/www/src/api/usage.md
@@ -1,4 +1,6 @@
-## Usage
+You can use `modular-css` a variety of ways. The easiest is with one of the bundler integrations, which exist for most popular bundlers in use today.
+
+## Bundlers
 
 !!!include(usage-rollup.md)!!!
 
@@ -6,13 +8,20 @@
 
 !!!include(usage-browserify.md)!!!
 
-!!!include(usage-svelte.md)!!!
+## API
 
-!!!include(usage-postcss.md)!!!
+!!!include(usage-js.md)!!!
+
+!!!include(usage-glob-api.md)!!!
+
+<!-- No header -->
 
 !!!include(usage-cli.md)!!!
 
-!!!include(usage-js.md)!!!
+## Other Integrations
+
+!!!include(usage-svelte.md)!!!
+
+!!!include(usage-postcss.md)!!!
 
-!!!include(usage-glob-api.md)!!!
 
diff --git a/packages/www/src/changelog/changelog.css b/packages/www/src/changelog/changelog.css
new file mode 100644
index 00000000..91fabbe0
--- /dev/null
+++ b/packages/www/src/changelog/changelog.css
@@ -0,0 +1,21 @@
+@value contentWidth from "../site.css";
+
+.changelog {
+    composes: content, bd from "../site.css";
+
+    max-width: contentWidth;
+    margin-left: 5rem;
+}
+
+.changelog a,
+.changelog a:hover {
+    text-decoration: underline;
+}
+
+.changelog ul {
+    margin: 2rem 0;
+}
+
+.changelog li + li {
+    margin-top: 1rem;
+}
diff --git a/packages/www/src/changelog/changelog.html b/packages/www/src/changelog/changelog.html
index 1e53bc27..741ecd59 100644
--- a/packages/www/src/changelog/changelog.html
+++ b/packages/www/src/changelog/changelog.html
@@ -1,26 +1,4 @@
-<style>
-@value contentWidth from "../site.css";
-
-.changelog {
-    composes: content, bd from "../site.css";
-
-    max-width: contentWidth;
-    margin-left: 5rem;
-}
-
-.changelog a,
-.changelog a:hover {
-    text-decoration: underline;
-}
-
-.changelog ul {
-    margin: 2rem 0;
-}
-
-.changelog li + li {
-    margin-top: 1rem;
-}
-</style>
+<link href="./changelog.css" />
 
 <Page title="Changelog" {styles}>
     <div class="{css.changelog}">
@@ -29,13 +7,15 @@
 </Page>
 
 <script>
+import { content } from "../../../../CHANGELOG.md";
+
 export default {
     components : {
-        Page   : "../page.html",
+        Page    : "../page.html",
     },
 
     data : () => ({
-        content : "",
-    })
+        content,
+    }),
 };
 </script>
diff --git a/packages/www/src/guide/comparison.md b/packages/www/src/guide/comparison.md
index 03527dd0..0ccfa893 100644
--- a/packages/www/src/guide/comparison.md
+++ b/packages/www/src/guide/comparison.md
@@ -43,17 +43,19 @@ Discussion around potential solutions was happening in [css-modules/css-modules#
 
 `modular-css` has implemented the `:external()` proposal from that issue. More context is available in the [Overriding Styles section](#overriding-styles).
 
+::: repl
 ```css
-/* input.css */
+/* === input.css === */
 .input {
     width: 100%;
 }
 
-/* fieldset.css */
+/* === fieldset.css === */
 .fieldset :external(input from "./input.css") {
     width: 50%;
 }
 ```
+:::
 
 ### Namespaces
 
@@ -71,15 +73,22 @@ CSS Modules allows for importing multiple values from an external file.
 
 `modular-css` implements a suggestion made in [css-modules/css-modules#186](https://github.com/css-modules/css-modules/issues/186#issuecomment-257421710) to allow importing all of a file's exported values and aliasing it for easy use. More documentation can be found in the [Namespaced values section](#namespaced-values).
 
+::: repl
 ```css
-/* modular-css */
-@value * as constants from "./constants.css";
+/* === constants.css === */
+@value red: #F00;
+@value small: 0.5rem;
+/* ... */
+
+/* === namespaced.css === */
+@value * as constants from "/constants.css";
 
 .a {
   color: constants.red;
   width: constants.small;
 }
 ```
+:::
 
 ### Support
 
diff --git a/packages/www/src/guide/feature-composing-files.md b/packages/www/src/guide/feature-composing-files.md
index 1271bcc6..4a691d73 100644
--- a/packages/www/src/guide/feature-composing-files.md
+++ b/packages/www/src/guide/feature-composing-files.md
@@ -2,6 +2,7 @@
 
 When necessary you can also use the `@composes` at-rule to enable composing an entire CSS file, instead of going rule-by-rule. This is mostly useful when you've got a base style you want to apply to a component but you need to modify just a single style from the base. Instead of manually creating shadowed versions of all the classes in the base CSS, you can use `@composes` to save a bunch of repetition and potential for fat-fingering.
 
+::: repl
 ```css
 /* == base.css == */
 .header {
@@ -22,8 +23,8 @@ When necessary you can also use the `@composes` at-rule to enable composing an e
 
     background: red;
 }
-
 ```
+:::
 
 When `custom.css` is required the JS object will contain the selectors defined in that file as well as any selectors from `base.css`. It also allowed for the `.title` class in `custom.css` to use `composes: header` even though `.header` wasn't defined in that file at all.
 
diff --git a/packages/www/src/guide/feature-composing-styles.md b/packages/www/src/guide/feature-composing-styles.md
index 3b9ccc6f..e5d1e27e 100644
--- a/packages/www/src/guide/feature-composing-styles.md
+++ b/packages/www/src/guide/feature-composing-styles.md
@@ -2,25 +2,25 @@
 
 Selector limitations mean that it's difficult to use complicated selectors, so to enable building anything of complexity you can compose selectors. These compositions can be within a file or even pull in classes defined in other files.
 
+::: repl
 ```css
-/* == styles.css == */
-.single {
-    composes: other from "./other.css";
-    color: red;
+.composable {
+    background: black;
 }
 
-.multiple {
-    composes: more, than, one from "./multiple.css";
-    /*
-    Since .multiple doesn't declare any rules other than composes
-    aggregate styles from other rules it will be stripped from the output
-    */
+.local {
+    composes: composable;
+    
+    color: red;
 }
 
-.local {
-    composes: single;
+/* Will be stripped from the CSS output because it doesn't */
+/* contain any actual rules */
+.removed {
+    composes: local;
 }
 ```
+:::
 
 When this file is required the JS object will contain the expected keys, but the arrays will now contain more values.
 
@@ -41,22 +41,30 @@ var css = require("./styles.css");
 
 If you're going to be doing a lot of composition with another file you can store the filename into a value for ease of referencing.
 
+::: repl
 ```css
-@value guide: "../style-guide.css";
+/* === style-guide.css === */
+.heading {
+    font-size: 140%;
+}
+
+.body {
+    margin: 10px;
+    height: 100%;
+}
+
+/* === home-page.css === */
+@value guide: "/style-guide.css";
 
 .head {
     composes: heading from guide;
+    
     font-size: 120%;
 }
 
 .body {
     composes: body from guide;
+    
     padding: 10px;
 }
 ```
-
-You can also get access to variables defined in other files for simple sharing of useful information.
-
-```css
-@value first, second from "./somewhere-else.css";
-```
diff --git a/packages/www/src/guide/feature-overriding-styles.md b/packages/www/src/guide/feature-overriding-styles.md
index e41f6fc3..162a301e 100644
--- a/packages/www/src/guide/feature-overriding-styles.md
+++ b/packages/www/src/guide/feature-overriding-styles.md
@@ -4,6 +4,7 @@ Sometimes a component will need some customization for use in a specific locatio
 
 In this case we've got an `input` component that is normally 100% of the width of its container, but when it's within the `fieldset` component it should only be half as wide.
 
+::: repl
 ```css
 /* == input.css == */
 .input {
@@ -15,3 +16,16 @@ In this case we've got an `input` component that is normally 100% of the width o
     width: 50%;
 }
 ```
+:::
+
+will create output like this
+
+```css
+.mcd8e24dd1_input {
+    width: 100%;
+}
+
+.mcf250d69f_fieldset .mcd8e24dd1_input {
+    width: 50%;
+}
+```
diff --git a/packages/www/src/guide/feature-scoped-selectors.md b/packages/www/src/guide/feature-scoped-selectors.md
index c5d813bf..60fb3292 100644
--- a/packages/www/src/guide/feature-scoped-selectors.md
+++ b/packages/www/src/guide/feature-scoped-selectors.md
@@ -2,12 +2,20 @@
 
 By default all CSS selectors live in the global scope of the page and are chosen based on specificity rules. This has proven to be a model that makes it difficult to succeed and incredibly easy to dig yourself into a hole you can't climb out of. `modular-css` scopes all selectors to the local file by default, ensuring that your CSS is always exactly as specific as it should be.
 
+::: repl
 ```css
-.wooga { color: red; }
+.wooga {
+    color: red;
+}
+```
+:::
 
-/* Becomes */
+will be output as
 
-.f5507abd_wooga { color: red; }
+```css
+.mcf250d69f_wooga {
+    color: red;
+}
 ```
 
 By default the selector scoping is based off hashing the contents of the file but you can also provide your own custom function.
@@ -20,25 +28,36 @@ var css = require("./styles.css");
 // css is:
 /*
 {
-    wooga : "f5507abd3_wooga",
+    wooga : "mcf250d69f_wooga",
+    booga : "mcf250d69f_wooga mcf250d69f_booga",
     ...
 }
 */
 
-// so mithril code (or any templating code!) can do the following
-m("div", { class : css.wooga });
-// which would output
-// <div class="f5507abd_wooga"></div>
+// So then you can render that class trivially
+const html = `<div class="${css.wooga}">Wooga</div>`;
+
+// which then has the properly scoped selector
+// <div class="mcf250d69f_wooga">Wooga</div>
+
+// Also easy-to-use with JSX!
+const jsx = <div class={css.wooga}>Wooga</div>;
 ```
 
 These arrays of selectors can then be applied to elements using the much more nicely-named object keys and you're off to the races.
 
 You can opt out of selector scoping by wrapping your classes/ids in the `:global()` pseudo-class, this will prevent them from being renamed but they will still be available in the module's exported object.
 
+::: repl
 ```css
-/* == styles.css == */
-:global(.global) { color: red; }
+:global(.global) {
+    color: red;
+}
 ```
+:::
+
+when transformed to JS looks like this
+
 ```js
 var css = require("./styles.css");
 
@@ -54,6 +73,7 @@ Selector scoping is **only** done on simple classes/ids, any selectors containin
 
 `:global()` is treated the same as a CSS pseudo-class and therefore cannot wrap multiple comma seperated rules. For example if you're using a CSS reset the following is required:
 
+::: repl
 ```css
 /* Local Scoped */
 ol, ul {
@@ -70,5 +90,6 @@ ol, ul {
     list-style: none;
 }
 ```
+:::
 
-Adding `:global()` to every comma seperated rule would be tedious when using something like [Eric Meyer's CSS Reset](http://meyerweb.com/eric/tools/css/reset/). Therefore it is recommended that you seperate the reset in to its own file, and make use of the [postcss-import](https://github.com/postcss/postcss-import) module with the [after](https://github.com/tivac/modular-css/blob/master/docs/api.md#after) or [done](https://github.com/tivac/modular-css/blob/master/docs/api.md#done) hooks to include the file when modular-css has finished processing. You would then need to include `@import "reset.css";` somewhere in one of your CSS files.
+Adding `:global()` to every comma seperated rule would be tedious when using something like [Eric Meyer's CSS Reset](http://meyerweb.com/eric/tools/css/reset/). Therefore it is recommended that you seperate the reset in to its own file, and make use of the [postcss-import](https://github.com/postcss/postcss-import) module with the [after](/api#after-hook) or [done](/api#done-hook) hooks to include the file when modular-css has finished processing. You would then need to include `@import "reset.css";` somewhere in one of your CSS files.
diff --git a/packages/www/src/guide/feature-values-importing.md b/packages/www/src/guide/feature-values-importing.md
index 73ef1c3e..f5a8cfab 100644
--- a/packages/www/src/guide/feature-values-importing.md
+++ b/packages/www/src/guide/feature-values-importing.md
@@ -2,27 +2,30 @@
 
 `@value`s can be imported from another file by using a slightly different syntax.
 
+::: repl
 ```css
-/* == colors.css == */
+/* === colors.css === */
 @value main: red;
 @value bg: white;
 
-/* == site.css == */
+/* === site.css === */
 @value main from "./colors.css";
 
 body {
     color: main;
 }
 ```
+:::
 
 It's also possible to import multiple values at once.
 
+::: repl
 ```css
-/* == colors.css == */
+/* === colors.css === */
 @value main: red;
 @value bg: white;
 
-/* == site.css == */
+/* === site.css === */
 @value main, bg from "./colors.css";
 
 body {
@@ -30,3 +33,4 @@ body {
     background: bg;
 }
 ```
+:::
diff --git a/packages/www/src/guide/feature-values-namespaced.md b/packages/www/src/guide/feature-values-namespaced.md
index 8bf4262b..73280408 100644
--- a/packages/www/src/guide/feature-values-namespaced.md
+++ b/packages/www/src/guide/feature-values-namespaced.md
@@ -2,12 +2,13 @@
 
 `@value`s can be imported as a namespace which provides a convenient shorthand way to access a bunch of shared values from a file.
 
+::: repl
 ```css
-/* == colors.css == */
+/* === colors.css === */
 @value main: red;
 @value bg: white;
 
-/* == site.css == */
+/* === site.css === */
 @value * as colors from "./colors.css";
 
 body {
@@ -15,3 +16,4 @@ body {
     background: colors.bg;
 }
 ```
+:::
diff --git a/packages/www/src/guide/feature-values-wildcard.md b/packages/www/src/guide/feature-values-wildcard.md
index f93be65d..7547365a 100644
--- a/packages/www/src/guide/feature-values-wildcard.md
+++ b/packages/www/src/guide/feature-values-wildcard.md
@@ -2,37 +2,45 @@
 
 It's possible to import all the `@value` definitions from another file into the current one. Any local `@value` declarations will override the imported values.
 
+::: repl
 ```css
-/* == colors.css == */
+/* === colors.css === */
 @value main: red;
 @value bg: white;
 
-/* == site.css == */
+/* === site.css === */
 @value * from "./colors.css";
 @value bg: black;
 
 body {
-    background: bg; /* black */
-    color: main; /* red */
+    /* black */
+    background: bg;
+    /* red */
+    color: main;
 }
 ```
+:::
 
 Since all files in `modular-css` with `@value` declaration make that value available to other files it's possible to use the wildcard imports feature to build complex theming systems. When using wildcard imports all the `@value`s from the source file are re-exported by the file doing the importing.
 
+::: repl
 ```css
-/* == colors.css == */
+/* === colors.css === */
 @value main: red;
 @value bg: white;
 
-/* == mobile-colors.css == */
+/* === mobile-colors.css === */
 @value * from "./colors.css";
 @value bg: gray;
 
-/* == site.css == */
+/* === site.css === */
 @value * as colors from "./mobile-colors.css";
 
 body {
-    background: colors.bg; /* gray */
-    color: colors.main; /* red */
+    /* gray */
+    background: colors.bg;
+    /* red */
+    color: colors.main;
 }
 ```
+:::
diff --git a/packages/www/src/guide/feature-values.md b/packages/www/src/guide/feature-values.md
index e4f63dad..5da98f1c 100644
--- a/packages/www/src/guide/feature-values.md
+++ b/packages/www/src/guide/feature-values.md
@@ -2,17 +2,20 @@
 
 Values are re-usable pieces of content that can be used instead of hardcoding colors, sizes, media queries, or most other forms of CSS values. They're automatically replaced during the build with their defined value, and can also be composed between files for further re-use or overriding. They're effectively static versions of CSS variables, but with a few extra build-time powers we'll get into later.
 
+::: repl
 ```css
-/* == values.css == */
 @value alert: #F00;
 @value small: (max-width: 600px);
 
 @media small {
     .alert { color: alert; }
 }
+```
+:::
 
-/* will be output as */
+will output
 
+```css
 @media (max-width: 600px) {
     .alert { color: #F00; }
 }
diff --git a/packages/www/src/guide/guide.css b/packages/www/src/guide/guide.css
new file mode 100644
index 00000000..9601ccf5
--- /dev/null
+++ b/packages/www/src/guide/guide.css
@@ -0,0 +1,31 @@
+@value contentWidth, sidebarWidth, narrow from "../site.css";
+
+.guide {
+    composes: content from "../site.css";
+}
+
+.bd {
+    composes: bd from "../site.css";
+
+    max-width: contentWidth;
+    margin: 1rem 1rem 0 calc(sidebarWidth + 1.5rem);
+
+    @media narrow {
+        margin-left: 2rem;
+        max-width: 100%;
+    }
+}
+
+.bd a,
+.bd a:hover {
+    text-decoration: underline;
+}
+
+.bd li + li {
+    margin-top: 0.5rem;
+}
+
+.bd img {
+    width: 100%;
+    height: auto;
+}
diff --git a/packages/www/src/guide/guide.html b/packages/www/src/guide/guide.html
index 076a8d39..5d3962a9 100644
--- a/packages/www/src/guide/guide.html
+++ b/packages/www/src/guide/guide.html
@@ -1,36 +1,4 @@
-<style>
-@value contentWidth, sidebarWidth, narrow from "../site.css";
-
-.guide {
-    composes: content from "../site.css";
-}
-
-.bd {
-    composes: bd from "../site.css";
-
-    max-width: contentWidth;
-    margin: 1rem 1rem 0 calc(sidebarWidth + 1.5rem);
-
-    @media narrow {
-        margin-left: 2rem;
-        max-width: 100%;
-    }
-}
-
-.bd a,
-.bd a:hover {
-    text-decoration: underline;
-}
-
-.bd li + li {
-    margin-top: 0.5rem;
-}
-
-.bd img {
-    width: 100%;
-    height: auto;
-}
-</style>
+<link href="./guide.css" />
 
 <Page title="Guide" {styles}>
     <div class="{css.guide}">
@@ -43,15 +11,17 @@
 </Page>
 
 <script>
+import { content, tocs } from "./guide.md";
+
 export default {
     components : {
         Page    : "../page.html",
-        Sidebar : "./sidebar.html",
+        Sidebar : "../sidebar.html",
     },
 
     data : () => ({
-        tocs    : false,
-        content : "",
-    })
+        content,
+        tocs,
+    }),
 };
 </script>
diff --git a/packages/www/src/guide/guide.md b/packages/www/src/guide/guide.md
index a3bf7827..8185821e 100644
--- a/packages/www/src/guide/guide.md
+++ b/packages/www/src/guide/guide.md
@@ -4,8 +4,4 @@
 
 !!!include(features.md)!!!
 
-!!!include(usage.md)!!!
-
-!!!include(extending.md)!!!
-
 !!!include(comparison.md)!!!
diff --git a/packages/www/src/guide/introduction.md b/packages/www/src/guide/introduction.md
index d58774ee..b77dc45d 100644
--- a/packages/www/src/guide/introduction.md
+++ b/packages/www/src/guide/introduction.md
@@ -20,11 +20,11 @@ Also because this:
 
 There are a lot of different ways to use `modular-css`, pick your favorite!
 
-- [Rollup](#rollup) - Tiny bundles, code-splitting, and first-class `modular-css` support. 👌🏻
-- [Webpack](#webpack) - Not as full-featured or well-supported as the rollup plugin but works pretty ok.
-- [Browserify](#browserify) - The old standby. Supports `factor-bundle` for painless CSS bundle splitting!
-- [Svelte](#svelte) - Take your svelte components and power them up using `modular-css`! ⚡
-- [JS API](#js-api) - The core of `modular-css`, reasonably usable and powers literally everything else.
-- [CLI](#cli) - `modular-css` via CLI, for those times where you need to try something really quickly.
-- [PostCSS Plugin](#postcss-plugin) - Postcss-within-postcss, because sometimes you just need to do a thing. 😵
-- [Globbing API](#globbing-api)- Grab `**/*.css` and get a move on. The globbing API is here for you!
+- [Rollup](/api/#rollup) - Tiny bundles, code-splitting, and first-class `modular-css` support. 👌🏻
+- [Webpack](/api/#webpack) - Not as full-featured or well-supported as the rollup plugin but works pretty ok.
+- [Browserify](/api/#browserify) - The old standby. Supports `factor-bundle` for painless CSS bundle splitting!
+- [Svelte](/api/#svelte) - Take your svelte components and power them up using `modular-css`! ⚡
+- [JS API](/api/#js-api) - The core of `modular-css`, reasonably usable and powers literally everything else.
+- [CLI](/api/#cli) - `modular-css` via CLI, for those times where you need to try something really quickly.
+- [PostCSS Plugin](/api/#postcss) - Postcss-within-postcss, because sometimes you just need to do a thing. 😵
+- [Globbing API](/api/#glob-api)- Grab `**/*.css` and get a move on. The globbing API is here for you!
diff --git a/packages/www/src/header.css b/packages/www/src/header.css
new file mode 100644
index 00000000..e3566c1d
--- /dev/null
+++ b/packages/www/src/header.css
@@ -0,0 +1,87 @@
+@value headerHeight, headerColor, hoverColor, accentColor from "./site.css";
+@value skinny from "./site.css";
+
+@value tabHeight: 2.5rem;
+
+.header {
+    position: fixed;
+    top: 0;
+    right: 0;
+    left: 0;
+    height: headerHeight;
+
+    display: flex;
+    flex-direction: row;
+    align-items: stretch;
+    
+    padding: 1rem;
+
+    color: headerColor;
+    background-color: hsl(0, 0%, 20%);
+
+    border-bottom: 2px solid accentColor;
+
+    z-index: 1;
+
+    @media skinny {
+        padding: 0.5rem 1rem;
+    }
+}
+
+.header a {
+    color: headerColor;
+}
+
+.header a:hover {
+    color: hoverColor;
+}
+
+.title {
+    font-size: 1.5rem;
+    flex: 1;
+}
+
+.name {
+    /* NO-OP for now */
+}
+
+.version {
+    display: inline-block;
+    
+    margin-left: 0.25rem;
+
+    font-size: 0.9rem;
+
+    @media skinny {
+        display: block;
+
+        margin-left: 0;
+    }
+}
+
+.navitems {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+
+    margin: 0;
+    padding: 0;
+}
+
+.navitem {
+    position: relative;
+
+    list-style-type: none;
+}
+
+.navitem + .navitem {
+    margin-left: 0.5rem;
+    padding-left: 0.5rem;
+
+    border-left: 2px solid hsl(0, 0%, 54%);
+}
+
+.link {
+    text-transform: uppercase;
+}
diff --git a/packages/www/src/header.html b/packages/www/src/header.html
index fe5ab3ef..732dd864 100644
--- a/packages/www/src/header.html
+++ b/packages/www/src/header.html
@@ -1,93 +1,4 @@
-<style>
-@value headerHeight, headerColor, hoverColor, accentColor from "./site.css";
-@value skinny from "./site.css";
-
-@value tabHeight: 2.5rem;
-
-.header {
-    position: fixed;
-    top: 0;
-    right: 0;
-    left: 0;
-    height: headerHeight;
-
-    display: flex;
-    flex-direction: row;
-    align-items: stretch;
-    
-    padding: 1rem;
-
-    color: headerColor;
-    background-color: hsl(0, 0%, 20%);
-
-    border-bottom: 2px solid accentColor;
-
-    z-index: 1;
-
-    @media skinny {
-        padding: 0.5rem 1rem;
-    }
-}
-
-.header a {
-    color: headerColor;
-}
-
-.header a:hover {
-    color: hoverColor;
-}
-
-.title {
-    font-size: 1.5rem;
-    flex: 1;
-}
-
-.name {
-    /* NO-OP for now */
-}
-
-.version {
-    display: inline-block;
-    
-    margin-left: 0.25rem;
-
-    font-size: 0.9rem;
-
-    @media skinny {
-        display: block;
-
-        margin-left: 0;
-    }
-}
-
-.navitems {
-    display: flex;
-    flex-direction: row;
-    justify-content: space-between;
-    align-items: center;
-
-    margin: 0;
-    padding: 0;
-}
-
-.navitem {
-    position: relative;
-
-    list-style-type: none;
-}
-
-.navitem + .navitem {
-    margin-left: 0.5rem;
-    padding-left: 0.5rem;
-
-    border-left: 2px solid hsl(0, 0%, 54%);
-}
-
-.link {
-    text-transform: uppercase;
-}
-
-</style>
+<link href="./header.css" />
 
 <div class="{css.header}">
     <div class="{css.title}">
@@ -113,9 +24,13 @@ export default {
 
         links : [
             {
-                text : "Guide",
+                text : "Overview",
                 url  : "/guide/",
             },
+            {
+                text : "API",
+                url  : "/api/",
+            },
             {
                 text : "REPL",
                 url  : "/repl/",
diff --git a/packages/www/src/home/example.md b/packages/www/src/home/example.md
index 2aaeaae8..de8eddc5 100644
--- a/packages/www/src/home/example.md
+++ b/packages/www/src/home/example.md
@@ -1,8 +1,15 @@
+::: repl
 ```css
+/* === input.css === */
+.input {
+    width: 100%;
+}
+
+/* === example.css === */
 /* Values */
-@value alert: rgb(250, 128, 114);
+@value warning: rgb(250, 128, 114);
 
-.alert { background: alert; }
+.alert { background: warning; }
 
 /* Scoping */
 :global(.alertBanner) {
@@ -17,3 +24,4 @@
     width: 50%;
 }
 ```
+:::
diff --git a/packages/www/src/home/home.css b/packages/www/src/home/home.css
new file mode 100644
index 00000000..a0442b2b
--- /dev/null
+++ b/packages/www/src/home/home.css
@@ -0,0 +1,87 @@
+@value * as site from "../site.css";
+
+.home {
+    composes: content from "../site.css";
+
+    flex: 0;
+
+    display: grid;
+    grid-template:
+        " title    title  " auto
+        " intro   example " auto /
+        50% 50%;
+
+    @media site.narrow {
+        display: flex;
+        flex-flow: column nowrap;
+    }
+}
+
+.title {
+    grid-area: title;
+}
+
+.head {
+    font-size: 3rem;
+    font-weight: bold;
+
+    margin-bottom: 1rem;
+}
+
+.headline {
+    margin: 0;
+    font-weight: 400;
+}
+
+.intro {
+    grid-area: intro;
+
+    margin: 2rem 1rem 0 0;
+}
+
+.introtext {
+    line-height: 2rem;
+}
+
+.introtext a {
+    color: site.hoverColor;
+    font-weight: bold;
+}
+
+.introtext a:hover {
+    color: site.textColor;
+}
+
+.example {
+    grid-area: example;
+}
+
+.learn {
+    composes: center from "../site.css";
+
+    margin-top: 1rem;
+}
+
+.cta {
+    composes: center from "../site.css";
+
+    margin-top: 2rem;
+
+    width: 12rem;
+    height: 3rem;
+    background: site.hoverColor;
+    
+    color: site.headerColor;
+    font-weight: bold;
+
+    border-radius: 0.25rem;
+
+    transition: background-color site.hoverOutTime ease-in;
+}
+
+.cta:hover {
+    background: color(site.hoverColor lightness(+20%));
+    color: site.headerColor;
+
+    transition: background-color site.hoverInTime ease-out;
+}
diff --git a/packages/www/src/home/home.html b/packages/www/src/home/home.html
index ffdbf3dc..72680c8b 100644
--- a/packages/www/src/home/home.html
+++ b/packages/www/src/home/home.html
@@ -1,93 +1,4 @@
-<style>
-@value * as site from "../site.css";
-
-.home {
-    composes: content from "../site.css";
-
-    flex: 0;
-
-    display: grid;
-    grid-template:
-        " title    title  " auto
-        " intro   example " auto /
-        50% 50%;
-
-    @media site.narrow {
-        display: flex;
-        flex-flow: column nowrap;
-    }
-}
-
-.title {
-    grid-area: title;
-}
-
-.head {
-    font-size: 3rem;
-    font-weight: bold;
-
-    margin-bottom: 1rem;
-}
-
-.headline {
-    margin: 0;
-    font-weight: 400;
-}
-
-.intro {
-    grid-area: intro;
-
-    margin: 2rem 1rem 0 0;
-}
-
-.introtext {
-    line-height: 2rem;
-}
-
-.introtext a {
-    color: site.hoverColor;
-    font-weight: bold;
-}
-
-.introtext a:hover {
-    color: site.textColor;
-}
-
-.example {
-    grid-area: example;
-}
-
-.learn {
-    composes: center from "../site.css";
-
-    margin-top: 1rem;
-}
-
-.cta {
-    composes: center from "../site.css";
-
-    margin-top: 2rem;
-
-    width: 12rem;
-    height: 3rem;
-    background: site.hoverColor;
-    
-    color: site.headerColor;
-    font-weight: bold;
-
-    border-radius: 0.25rem;
-
-    transition: background-color site.hoverOutTime ease-in;
-}
-
-.cta:hover {
-    background: color(site.hoverColor lightness(+20%));
-    color: site.headerColor;
-
-    transition: background-color site.hoverInTime ease-out;
-}
-
-</style>
+<link href="./home.css" />
 
 <Page {styles}>
 <div class="{css.home}">
@@ -115,14 +26,17 @@
 </Page>
 
 <script>
+import { content as intro } from "./intro.md";
+import { content as example } from "./example.md";
+
 export default {
     components : {
         Page   : "../page.html"
     },
 
     data : () => ({
-        intro : "",
-        example : "",
+        intro,
+        example,
     })
 };
 </script>
diff --git a/packages/www/src/home/intro.md b/packages/www/src/home/intro.md
index fb7bc3fb..ff2b7a88 100644
--- a/packages/www/src/home/intro.md
+++ b/packages/www/src/home/intro.md
@@ -1,1 +1,1 @@
-Use the features you know and love like [selector scoping](/guide/#selector-scoping), [selector compositions](/guide/#composition), or [shared values](/guide/#values) alongside brand new ones like [styling overrides](/guide/#overrides) and extensible [lifecycle hooks](/guide/#extending). All from the comfort of tools you're already using like [rollup](/guide/#rollup), [webpack](/guide/#webpack), [browserify](/guide/#browserify), [postcss](/guide/#postcss), [cli](/using/#cli), and more!
+Use the features you know and love like [selector scoping](/guide/#selector-scoping), [selector compositions](/guide/#style-composition), or [shared values](/guide/#values) alongside brand new ones like [styling overrides](/guide/#overriding-styles) and extensible [lifecycle hooks](/api/#extending). All from the comfort of tools you're already using like [rollup](/api/#rollup), [webpack](/api/#webpack), [browserify](/api/#browserify), [postcss](/api/#postcss), the [cli](/api/#cli-install), and more!
diff --git a/packages/www/src/page.html b/packages/www/src/page.html
index b04ef5a7..d0c71733 100644
--- a/packages/www/src/page.html
+++ b/packages/www/src/page.html
@@ -12,6 +12,7 @@
 
     <link href="https://unpkg.com/normalize.css@8.0.1/normalize.css" rel="stylesheet" />
     <link href="https://fonts.googleapis.com/css?family=Inconsolata|Roboto" rel="stylesheet">
+    <link href="https://unpkg.com/prismjs@1.15.0/themes/prism-tomorrow.css" rel="stylesheet">
 
     {#if styles}
         {#each styles as style}
diff --git a/packages/www/src/repl/codemirror.css b/packages/www/src/repl/codemirror.css
new file mode 100644
index 00000000..65264bc4
--- /dev/null
+++ b/packages/www/src/repl/codemirror.css
@@ -0,0 +1,33 @@
+@import "codemirror/lib/codemirror.css";
+@import "codemirror/theme/base16-light.css";
+
+@value monospaced from "../site.css";
+
+.editor {
+    flex: 1;
+
+    display: flex;
+    flex-direction: column;
+    align-items: stretch;
+}
+
+.editor :global(.CodeMirror) {
+    flex: 1;
+}
+
+.errorLocation {
+    position: relative;
+    border-bottom: 2px solid rgb(200, 0, 0);
+}
+
+.errorLine {
+    background-color: rgba(200, 0, 0, 0.05);
+}
+
+.loading {}
+.loaderror {}
+
+:global(.CodeMirror) pre {
+    font-family: monospaced;
+    font-size: 80%;
+}
diff --git a/packages/www/src/repl/codemirror.html b/packages/www/src/repl/codemirror.html
index 1fb87576..0837957a 100644
--- a/packages/www/src/repl/codemirror.html
+++ b/packages/www/src/repl/codemirror.html
@@ -1,34 +1,9 @@
-<style>
-@import "codemirror/lib/codemirror.css";
-@import "codemirror/theme/base16-light.css";
-
-.editor {
-    flex: 1;
-
-    display: flex;
-    flex-direction: column;
-    align-items: stretch;
-}
-
-.editor :global(.CodeMirror) {
-    flex: 1;
-}
-
-.errorLocation {
-    position: relative;
-    border-bottom: 2px solid rgb(200, 0, 0);
-}
-
-.errorLine {
-    background-color: rgba(200, 0, 0, 0.05);
-}
-
-.loading {}
-.loaderror {}
-</style>
+<link href="./codemirror.css" />
 
 {#await loading}
+    {#if slow}
     <div class="{css.loading}">Loading editor...</div>
+    {/if}
 {:then _}
     <div class="{css.editor}">
         <textarea ref:textarea></textarea>
@@ -45,6 +20,7 @@ import listen from "./listen.js";
 export default {
     data : () => ({
         loading : import("./codemirror.js"),
+        slow : false,
         
         config  : {
             lineNumbers : true,
@@ -101,8 +77,14 @@ export default {
     oncreate() {
         const { loading } = this.get();
 
+        const ticking = setTimeout(() => this.set({
+            slow : true,
+        }), 100);
+
         // Instantiate codemirror once it's loaded
         loading.then((mod) => {
+            clearTimeout(ticking);
+
             const { config } = this.get();
             const { codemirror, theme } = mod;
 
@@ -127,7 +109,7 @@ export default {
                 this.fire("change", {
                     content : this.cm.getValue(),
                 });
-            }, 100));
+            }, 250));
         });
     },
     
diff --git a/packages/www/src/repl/error.css b/packages/www/src/repl/error.css
new file mode 100644
index 00000000..1e25be72
--- /dev/null
+++ b/packages/www/src/repl/error.css
@@ -0,0 +1,23 @@
+.error {
+    /* lol */
+    z-index: 1000;
+
+    position: absolute;
+
+    right: 0;
+    bottom: 0;
+    left: 0;
+
+    padding: 0 1rem;
+
+    background: hsl(6, 93%, 71%);
+    color: hsl(0, 0%, 94%);
+
+    visibility: hidden;
+}
+
+.erroron {
+    composes: error;
+
+    visibility: visible;
+}
diff --git a/packages/www/src/repl/error.html b/packages/www/src/repl/error.html
index 61f77d24..ff414056 100644
--- a/packages/www/src/repl/error.html
+++ b/packages/www/src/repl/error.html
@@ -1,28 +1,4 @@
-<style>
-.error {
-    /* lol */
-    z-index: 1000;
-
-    position: absolute;
-
-    right: 0;
-    bottom: 0;
-    left: 0;
-
-    padding: 1rem;
-
-    background: hsl(6, 93%, 71%);
-    color: hsl(0, 0%, 94%);
-
-    visibility: hidden;
-}
-
-.erroron {
-    composes: error;
-
-    visibility: visible;
-}
-</style>
+<link href="./error.css" />
 
 <div class="{$error ? css.erroron : css.error}">
     <pre>{$error ? $error.toString() : ""}</pre>
@@ -34,4 +10,4 @@ import store from "./store.js";
 export default {
     store : () => store,
 };
-</script>
\ No newline at end of file
+</script>
diff --git a/packages/www/src/repl/index.html b/packages/www/src/repl/index.html
new file mode 100644
index 00000000..e8e4fff4
--- /dev/null
+++ b/packages/www/src/repl/index.html
@@ -0,0 +1,9 @@
+<Page title="REPL" {styles} {script} />
+
+<script>
+export default {
+    components : {
+        Page : "../page.html",
+    },
+};
+</script>
diff --git a/packages/www/src/repl/input.css b/packages/www/src/repl/input.css
new file mode 100644
index 00000000..65204fc2
--- /dev/null
+++ b/packages/www/src/repl/input.css
@@ -0,0 +1,5 @@
+.input {
+    composes: column from "./repl.css";
+
+    grid-area: input;
+}
diff --git a/packages/www/src/repl/input.html b/packages/www/src/repl/input.html
index d96e56d3..7c8905da 100644
--- a/packages/www/src/repl/input.html
+++ b/packages/www/src/repl/input.html
@@ -1,15 +1,11 @@
-<style type="text/css">
-.input {
-    composes: column from "./repl.css";
-
-    grid-area: input;
-}
-</style>
+<link href="./input.css" />
 
 <Tabs />
 
 <div class="{css.input}">
     <Editor />
+
+    <Error />
 </div>
 
 <script>
@@ -18,6 +14,7 @@ import store from "./store.js";
 export default {
     components : {
         Editor : "./editor.html",
+        Error  : "./error.html",
         Tabs   : "./tabs.html",
     },
 };
diff --git a/packages/www/src/repl/output.css b/packages/www/src/repl/output.css
new file mode 100644
index 00000000..f1c9570a
--- /dev/null
+++ b/packages/www/src/repl/output.css
@@ -0,0 +1,7 @@
+.output {
+    composes: column from "./repl.css";
+
+    grid-area: output;
+
+    position: relative;
+}
diff --git a/packages/www/src/repl/output.html b/packages/www/src/repl/output.html
index be5fcc88..c84f70ab 100644
--- a/packages/www/src/repl/output.html
+++ b/packages/www/src/repl/output.html
@@ -1,12 +1,4 @@
-<style>
-.output {
-    composes: column from "./repl.css";
-
-    grid-area: output;
-
-    position: relative;
-}
-</style>
+<link href="./output.css" />
 
 <div class="{css.output}">
     <CodeMirror config={cmconfig} ref:codemirror/>
diff --git a/packages/www/src/repl/repl.css b/packages/www/src/repl/repl.css
index c632035d..0bacaeee 100644
--- a/packages/www/src/repl/repl.css
+++ b/packages/www/src/repl/repl.css
@@ -10,6 +10,7 @@
 
     display: grid;
 
+    margin-bottom: 0;
     margin-left: 0;
 
     grid-template:
diff --git a/packages/www/src/repl/repl.html b/packages/www/src/repl/repl.html
index 6d881424..ca465c6a 100644
--- a/packages/www/src/repl/repl.html
+++ b/packages/www/src/repl/repl.html
@@ -5,12 +5,8 @@
     <Output />
 </div>
 
-<Error />
 
 <script>
-// Unused export to force the CSS to load correctly
-import Page from "../page.html";
-
 import store from "./store.js";
 import listen from "./listen.js";
 
@@ -18,7 +14,6 @@ export default {
     components : {
         Input  : "./input.html",
         Output : "./output.html",
-        Error  : "./error.html",
     },
 
     store : () => store,
diff --git a/packages/www/src/repl/store.js b/packages/www/src/repl/store.js
index 03811a78..f31f678e 100644
--- a/packages/www/src/repl/store.js
+++ b/packages/www/src/repl/store.js
@@ -140,7 +140,7 @@ class CssStore extends Store {
     add() {
         const { files } = this.get();
 
-        let idx = files.size + 1;
+        let idx = files.size;
         let name;
 
         do {
@@ -186,7 +186,7 @@ class CssStore extends Store {
         // Update location.hash with fs state
         const hash = [ ...files.values() ].map((value) => ([
             value,
-            fs.readFileSync(value, "utf8")
+            fs.readFileSync(value, "utf8"),
         ]));
 
         location.hash = lz.compressToEncodedURIComponent(JSON.stringify(hash));
diff --git a/packages/www/src/repl/tabs.css b/packages/www/src/repl/tabs.css
new file mode 100644
index 00000000..a52ec125
--- /dev/null
+++ b/packages/www/src/repl/tabs.css
@@ -0,0 +1,98 @@
+@value hoverInTime from "../site.css";
+
+.tabs {
+    grid-area: tabs;
+
+    display: flex;
+    flex-direction: row;
+    justify-content: flex-start;
+    align-items: stretch;
+}
+
+.button {
+    composes: button from "../site.css";
+
+    align-self: center;
+
+    padding: 5px;
+
+    opacity: 0.25;
+
+    transition: opacity hoverInTime ease-out;
+}
+
+.button:hover {
+    opacity: 1;
+}
+
+.add {
+    composes: button;
+}
+
+.clear {
+    composes: button;
+}
+
+.tabs {
+    flex: 1;
+}
+
+.tab {
+    padding: 0 5px;
+
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+
+    border-bottom: 1px solid transparent;
+}
+
+.add + .tab,
+.tab + .tab {
+    margin-left: 0.25rem;
+}
+
+.tabon {
+    composes: tab;
+
+    border-bottom-color: hsl(0, 0%, 0%);
+}
+
+.file {
+    composes: button from "../site.css";
+
+    flex: 1;
+
+    height: 100%;
+    margin-right: 10px;
+
+    text-decoration: none;
+    color: hsl(0, 0%, 60%);
+}
+
+.tabon .file {
+    color: hsl(0, 0%, 20%);
+}
+
+.remove {
+    composes: button from "../site.css";
+
+    width: 20px;
+
+    filter: grayscale();
+    
+    transition: opacity hoverInTime ease-in;
+}
+
+.tab .remove {
+    opacity: 0.1;
+}
+
+.tabon .remove {
+    opacity: 0.3;
+}
+
+.remove:hover {
+    filter: brightness(1.2);
+    opacity: 1;
+}
diff --git a/packages/www/src/repl/tabs.html b/packages/www/src/repl/tabs.html
index 4ecb64a7..681538be 100644
--- a/packages/www/src/repl/tabs.html
+++ b/packages/www/src/repl/tabs.html
@@ -1,103 +1,4 @@
-<style type="text/css">
-@value hoverInTime from "../site.css";
-
-.tabs {
-    grid-area: tabs;
-
-    display: flex;
-    flex-direction: row;
-    justify-content: flex-start;
-    align-items: stretch;
-}
-
-.button {
-    composes: button from "../site.css";
-
-    align-self: center;
-
-    padding: 5px;
-
-    opacity: 0.25;
-
-    transition: opacity hoverInTime ease-out;
-}
-
-.button:hover {
-    opacity: 1;
-}
-
-.add {
-    composes: button;
-}
-
-.clear {
-    composes: button;
-}
-
-.tabs {
-    flex: 1;
-}
-
-.tab {
-    padding: 0 5px;
-
-    display: flex;
-    flex-direction: row;
-    align-items: center;
-
-    border-bottom: 1px solid transparent;
-}
-
-.add + .tab,
-.tab + .tab {
-    margin-left: 0.25rem;
-}
-
-.tabon {
-    composes: tab;
-
-    border-bottom-color: hsl(0, 0%, 0%);
-}
-
-.file {
-    composes: button from "../site.css";
-
-    flex: 1;
-
-    height: 100%;
-    margin-right: 10px;
-
-    text-decoration: none;
-    color: hsl(0, 0%, 60%);
-}
-
-.tabon .file {
-    color: hsl(0, 0%, 20%);
-}
-
-.remove {
-    composes: button from "../site.css";
-
-    width: 20px;
-
-    filter: grayscale();
-    
-    transition: opacity hoverInTime ease-in;
-}
-
-.tab .remove {
-    opacity: 0.1;
-}
-
-.tabon .remove {
-    opacity: 0.3;
-}
-
-.remove:hover {
-    filter: brightness(1.2);
-    opacity: 1;
-}
-</style>
+<link href="./tabs.css" />
 
 <div class="{css.tabs}">
     <button
diff --git a/packages/www/src/guide/sidebar.html b/packages/www/src/sidebar.css
similarity index 74%
rename from packages/www/src/guide/sidebar.html
rename to packages/www/src/sidebar.css
index 7adbf34b..97ca6b1c 100644
--- a/packages/www/src/guide/sidebar.html
+++ b/packages/www/src/sidebar.css
@@ -1,5 +1,4 @@
-<style>
-@value narrow, borderColor, headerHeight, sidebarWidth from "../site.css";
+@value narrow, borderColor, headerHeight, sidebarWidth from "./site.css";
 
 .sidebar {
     position: fixed;
@@ -44,18 +43,3 @@
 .sidebar :global(.toc) li ul li + li {
     margin-top: 0.3rem;
 }
-</style>
-
-{#if tocs}
-<div class="{css.sidebar}">
-    {@html tocs}
-</div>
-{/if}
-
-<script>
-export default {
-    data : () => ({
-        tocs : false,
-    }),
-};
-</script>
diff --git a/packages/www/src/sidebar.html b/packages/www/src/sidebar.html
new file mode 100644
index 00000000..42575ed1
--- /dev/null
+++ b/packages/www/src/sidebar.html
@@ -0,0 +1,15 @@
+<link href="./sidebar.css" />
+
+{#if tocs}
+<div class="{css.sidebar}">
+    {@html tocs}
+</div>
+{/if}
+
+<script>
+export default {
+    data : () => ({
+        tocs : false,
+    }),
+};
+</script>
diff --git a/packages/www/src/site.css b/packages/www/src/site.css
index 793a8cab..0a5f47b7 100644
--- a/packages/www/src/site.css
+++ b/packages/www/src/site.css
@@ -12,6 +12,8 @@
 @value narrow: all and (max-width: 50rem);
 @value skinny: all and (max-width: 30rem);
 
+@value monospaced: 'Inconsolata', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+
 html {
     box-sizing: border-box;
     
@@ -38,9 +40,8 @@ pre,
 pre[class*="language-"],
 textarea,
 code,
-code[class*="language-"],
-:global(.CodeMirror) {
-    font-family: 'Inconsolata', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+code[class*="language-"] {
+    font-family: monospaced;
 }
 
 a {
@@ -127,37 +128,59 @@ a:hover {
 .bd h5,
 .bd h6 {
     position: relative;
-}
 
-.bd h1 :global(.anchor),
-.bd h2 :global(.anchor),
-.bd h3 :global(.anchor),
-.bd h4 :global(.anchor),
-.bd h5 :global(.anchor),
-.bd h6 :global(.anchor) {
-    position: absolute;
-    left: -1.5rem;
-    top: 50%;
-    
-    display: block;
+    & :global(.anchor) {
+        position: absolute;
+        left: -1.5rem;
+        top: 50%;
+        
+        display: block;
 
-    width: 1.4rem;
-    font-size: 1.4rem;
+        width: 1.4rem;
+        font-size: 1.4rem;
 
-    opacity: 0;
-    transition: opacity 150ms;
+        opacity: 0;
+        transition: opacity 150ms;
 
-    text-decoration: none;
-    transform: translateY(-50%);
+        text-decoration: none;
+        transform: translateY(-50%);
+    }
+    
+    &:hover :global(.anchor) {
+        opacity: 1;
+    
+        text-decoration: none;
+    }
 }
 
-.bd h1:hover :global(.anchor),
-.bd h2:hover :global(.anchor),
-.bd h3:hover :global(.anchor),
-.bd h4:hover :global(.anchor),
-.bd h5:hover :global(.anchor),
-.bd h6:hover :global(.anchor) {
-    opacity: 1;
+/* Examples that link off to the REPL */
+:global(.repl-code) {
+    position: relative;
 
-    text-decoration: none;
+    & :global(.repl-link) {
+        position: absolute;
+        top: 0;
+        right: 0;
+
+        padding: 0.35rem 0.5rem;
+
+        background: #666;
+        color: #FFF;
+
+        font-size: 0.85rem;
+
+        opacity: 0;
+
+        transition: opacity 250ms ease-in;
+
+        &:hover {
+            text-decoration: underline;
+        }
+    }
+
+    &:hover :global(.repl-link) {
+        opacity: 1;
+
+        transition: opacity 100ms ease-out;
+    }
 }


Test patch:
diff --git a/packages/scratchpad/chunktest.js b/packages/scratchpad/chunktest.js
deleted file mode 100644
index 566a6af8..00000000
--- a/packages/scratchpad/chunktest.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* eslint-disable no-console */
-const chunks = require("./chunks.js");
-const construct = require("./test/construct.js");
-
-// const { entries, graph } = construct([ "a", "b", "c" ], `
-// a -> A
-// b -> B
-// c -> C
-// A -> B
-// B -> C
-// `);
-
-// const { entries, graph } = construct([ "a", "b" ], `
-//     a -> A
-//     b -> B
-//     A -> C
-//     A -> D
-//     C -> E
-//     E -> F
-//     B -> F
-//     F -> G
-// `);
-
-const { entries, graph } = construct([ "a", "b" ], `
-a -> A
-b -> B
-A -> D
-A -> C
-B -> D
-D -> E
-E -> F
-E -> G
-C -> F
-`);
-
-const result = chunks({ entries, graph });
-
-console.log("FILE OUTPUT");
-
-entries.forEach((entry) => {
-    console.log("ENTRY:", entry);
-
-    result.dependenciesOf(entry)
-    .map((node) => console.log(node, " ", result.getNodeData(node)));
-});
-
-console.log("====");
diff --git a/packages/scratchpad/test/__snapshots__/chunks.test.js.snap b/packages/scratchpad/test/__snapshots__/chunks.test.js.snap
deleted file mode 100644
index 10a70372..00000000
--- a/packages/scratchpad/test/__snapshots__/chunks.test.js.snap
+++ /dev/null
@@ -1,135 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`chunking algorithm should handle more complicated chunking 1`] = `
-Array [
-  Object {
-    "node": "F",
-    "nodes": Array [
-      "G",
-      "F",
-    ],
-  },
-  Object {
-    "node": "A",
-    "nodes": Array [
-      "E",
-      "C",
-      "D",
-      "A",
-    ],
-  },
-  Object {
-    "node": "a",
-    "nodes": null,
-  },
-  Object {
-    "node": "B",
-    "nodes": Array [
-      "B",
-    ],
-  },
-  Object {
-    "node": "b",
-    "nodes": null,
-  },
-]
-`;
-
-exports[`chunking algorithm should handle more simple chunking 1`] = `
-Array [
-  Object {
-    "node": "D",
-    "nodes": Array [
-      "D",
-    ],
-  },
-  Object {
-    "node": "A",
-    "nodes": Array [
-      "A",
-    ],
-  },
-  Object {
-    "node": "a",
-    "nodes": null,
-  },
-  Object {
-    "node": "B",
-    "nodes": Array [
-      "C",
-      "B",
-    ],
-  },
-  Object {
-    "node": "b",
-    "nodes": null,
-  },
-]
-`;
-
-exports[`chunking algorithm should handle unmergable chunks 1`] = `
-Array [
-  Object {
-    "node": "C",
-    "nodes": Array [
-      "C",
-    ],
-  },
-  Object {
-    "node": "B",
-    "nodes": Array [
-      "B",
-    ],
-  },
-  Object {
-    "node": "A",
-    "nodes": Array [
-      "A",
-    ],
-  },
-  Object {
-    "node": "a",
-    "nodes": null,
-  },
-  Object {
-    "node": "b",
-    "nodes": null,
-  },
-  Object {
-    "node": "c",
-    "nodes": null,
-  },
-]
-`;
-
-exports[`chunking algorithm should handle very simple chunking 1`] = `
-Array [
-  Object {
-    "node": "D",
-    "nodes": Array [
-      "D",
-    ],
-  },
-  Object {
-    "node": "A",
-    "nodes": Array [
-      "C",
-      "A",
-    ],
-  },
-  Object {
-    "node": "a",
-    "nodes": null,
-  },
-  Object {
-    "node": "B",
-    "nodes": Array [
-      "B",
-    ],
-  },
-  Object {
-    "node": "b",
-    "nodes": null,
-  },
-]
-`;
diff --git a/packages/scratchpad/test/chunks.test.js b/packages/scratchpad/test/chunks.test.js
deleted file mode 100644
index a120ab9a..00000000
--- a/packages/scratchpad/test/chunks.test.js
+++ /dev/null
@@ -1,60 +0,0 @@
-"use strict";
-
-const construct = require("./construct.js");
-
-require("./snapshot.js");
-
-const chunks = require("../chunks.js");
-
-describe("chunking algorithm", () => {
-    it("should handle very simple chunking", () => {
-        const { entries, graph } = construct([ "a", "b" ], `
-            a -> A
-            A -> C
-            A -> D
-            b -> B
-            B -> D
-        `);
-
-        expect(chunks({ entries, graph })).toMatchChunksSnapshot();
-    });
-    
-    it("should handle more simple chunking", () => {
-        const { entries, graph } = construct([ "a", "b" ], `
-            a -> A
-            A -> D
-            b -> B
-            B -> C
-            C -> D
-        `);
-
-        expect(chunks({ entries, graph })).toMatchChunksSnapshot();
-    });
-    
-    it("should handle more complicated chunking", () => {
-        const { entries, graph } = construct([ "a", "b" ], `
-            a -> A
-            b -> B
-            A -> C
-            A -> D
-            C -> E
-            E -> F
-            B -> F
-            F -> G
-        `);
-
-        expect(chunks({ entries, graph })).toMatchChunksSnapshot();
-    });
-    
-    it("should handle unmergable chunks", () => {
-        const { entries, graph } = construct([ "a", "b", "c" ], `
-            a -> A
-            b -> B
-            c -> C
-            A -> B
-            B -> C
-        `);
-    
-        expect(chunks({ entries, graph })).toMatchChunksSnapshot();
-    });
-});
diff --git a/packages/scratchpad/test/construct.js b/packages/scratchpad/test/construct.js
deleted file mode 100644
index f6c170df..00000000
--- a/packages/scratchpad/test/construct.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-const dedent = require("dedent");
-const { DepGraph } = require("dependency-graph");
-
-const construct = (entries, tmpl) => {
-    const graph = new DepGraph();
-
-    const rows = dedent(tmpl).split(/\r?\n/);
-
-    rows.forEach((row) => {
-        const [ src, tgt ] = row.trim().split(/\s*->\s*/);
-        
-        if(entries.indexOf(src) > -1) {
-            graph.addNode(src, null);
-        } else {
-            graph.addNode(src, [ src ]);
-        }
-        
-        if(entries.indexOf(tgt) > -1) {
-            graph.addNode(tgt, null);
-        } else {
-            graph.addNode(tgt, [ tgt ]);
-        }
-
-        graph.addDependency(src, tgt);
-    });
-
-    return {
-        entries,
-        graph,
-    };
-};
-
-module.exports = construct;
diff --git a/packages/scratchpad/test/snapshot.js b/packages/scratchpad/test/snapshot.js
deleted file mode 100644
index bfb25bc1..00000000
--- a/packages/scratchpad/test/snapshot.js
+++ /dev/null
@@ -1,18 +0,0 @@
-"use strict";
-
-const { toMatchSnapshot } = require("jest-snapshot");
-
-expect.extend({
-    toMatchChunksSnapshot(graph, ...args) {
-        const nodes = graph.overallOrder();
-
-        return toMatchSnapshot.call(
-            this,
-            nodes.map((node) => ({
-                node,
-                nodes : graph.getNodeData(node),
-            })),
-            ...args,
-        );
-    }
-});
diff --git a/packages/svelte/test/__snapshots__/rollup.test.js.snap b/packages/svelte/test/__snapshots__/rollup.test.js.snap
index 6893db93..461619a9 100644
--- a/packages/svelte/test/__snapshots__/rollup.test.js.snap
+++ b/packages/svelte/test/__snapshots__/rollup.test.js.snap
@@ -1,5 +1,36 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
+exports[`/svelte.js rollup chunking should correctly chunk svelte files using inline <style> 1`] = `
+Object {
+  "a.css": "
+/* packages/svelte/test/specimens/inline-chunking/a-dep.css */
+.mc6ca450b0_adep {
+    margin: 5px;
+}
+/* packages/svelte/test/specimens/inline-chunking/a.html */
+.mc80aa5044_a {
+    color: aqua;
+}
+",
+  "b.css": "
+/* packages/svelte/test/specimens/inline-chunking/b-dep.css */
+.mcf56d52f6_bdep {
+    padding: 5px;
+}
+/* packages/svelte/test/specimens/inline-chunking/b.html */
+.mcbb945b2f_b {
+    color: blue;
+}
+",
+  "shared.css": "
+/* packages/svelte/test/specimens/inline-chunking/shared.css */
+.mcfef68931_shared {
+    background: black;
+}
+",
+}
+`;
+
 exports[`/svelte.js rollup watching should generate updated output 1`] = `
 Snapshot Diff:
 - First value
diff --git a/packages/svelte/test/rollup.test.js b/packages/svelte/test/rollup.test.js
index d71da09d..35fa44f2 100644
--- a/packages/svelte/test/rollup.test.js
+++ b/packages/svelte/test/rollup.test.js
@@ -196,7 +196,7 @@ describe("/svelte.js", () => {
                                         import Component from "./error-${type}.html";
 
                                         console.log(Component);
-                                    `
+                                    `,
                                 },
 
                                 allowFallthrough : true,
@@ -207,7 +207,7 @@ describe("/svelte.js", () => {
                             require("@modular-css/rollup")({
                                 processor,
                             }),
-                        ]
+                        ],
                     });
                 } catch(e) {
                     expect(e.toString()).toMatch(/\.wooga/);
@@ -215,4 +215,34 @@ describe("/svelte.js", () => {
             }
         );
     });
+
+    describe("rollup chunking", () => {
+        it("should correctly chunk svelte files using inline <style>", async () => {
+            const { preprocess, processor } = plugin();
+
+            const bundle = await rollup({
+                input : [
+                    require.resolve("./specimens/inline-chunking/a.html"),
+                    require.resolve("./specimens/inline-chunking/b.html"),
+                ],
+
+                plugins : [
+                    require("rollup-plugin-svelte")({
+                        preprocess,
+                    }),
+                    require("@modular-css/rollup")({
+                        processor,
+                    }),
+                ],
+            });
+
+            const out = await bundle.generate({
+                format         : "esm",
+                assetFileNames : "[name][extname]",
+                chunkFileNames : "[name]",
+            });
+
+            expect(out).toMatchRollupAssetSnapshot();
+        });
+    });
 });
diff --git a/packages/svelte/test/specimens/inline-chunking/a-dep.css b/packages/svelte/test/specimens/inline-chunking/a-dep.css
new file mode 100644
index 00000000..5e5f96a1
--- /dev/null
+++ b/packages/svelte/test/specimens/inline-chunking/a-dep.css
@@ -0,0 +1,3 @@
+.adep {
+    margin: 5px;
+}
diff --git a/packages/svelte/test/specimens/inline-chunking/a.html b/packages/svelte/test/specimens/inline-chunking/a.html
new file mode 100644
index 00000000..c1ce8cf5
--- /dev/null
+++ b/packages/svelte/test/specimens/inline-chunking/a.html
@@ -0,0 +1,10 @@
+<div class="{css.a}">A.HTML</div>
+
+<style>
+.a {
+    composes: shared from "./shared.css";
+    composes: adep from "./a-dep.css";
+    
+    color: aqua;
+}
+</style>
diff --git a/packages/svelte/test/specimens/inline-chunking/b-dep.css b/packages/svelte/test/specimens/inline-chunking/b-dep.css
new file mode 100644
index 00000000..7e1e04b5
--- /dev/null
+++ b/packages/svelte/test/specimens/inline-chunking/b-dep.css
@@ -0,0 +1,3 @@
+.bdep {
+    padding: 5px;
+}
diff --git a/packages/svelte/test/specimens/inline-chunking/b.html b/packages/svelte/test/specimens/inline-chunking/b.html
new file mode 100644
index 00000000..4bb1ca83
--- /dev/null
+++ b/packages/svelte/test/specimens/inline-chunking/b.html
@@ -0,0 +1,10 @@
+<div class="{css.b}">B.HTML</div>
+
+<style>
+.b {
+    composes: shared from "./shared.css";
+    composes: bdep from "./b-dep.css";
+    
+    color: blue;
+}
+</style>
diff --git a/packages/svelte/test/specimens/inline-chunking/shared.css b/packages/svelte/test/specimens/inline-chunking/shared.css
new file mode 100644
index 00000000..6d9dfaac
--- /dev/null
+++ b/packages/svelte/test/specimens/inline-chunking/shared.css
@@ -0,0 +1,3 @@
+.shared {
+    background: black;
+}
diff --git a/packages/test-utils/expect/toMatchRollupAssetSnapshot.js b/packages/test-utils/expect/toMatchRollupAssetSnapshot.js
new file mode 100644
index 00000000..68be88ea
--- /dev/null
+++ b/packages/test-utils/expect/toMatchRollupAssetSnapshot.js
@@ -0,0 +1,22 @@
+"use strict";
+
+const { toMatchSnapshot } = require("jest-snapshot");
+
+expect.extend({
+    toMatchRollupAssetSnapshot({ output }) {
+        const out = Object.create(null);
+        
+        output.forEach(({ isAsset, fileName, source }) => {
+            if(!isAsset) {
+                return;
+            }
+
+            out[fileName] = `\n${source}`;
+        });
+
+        return toMatchSnapshot.call(
+            this,
+            out,
+        );
+    },
+});
diff --git a/packages/test-utils/expect/toMatchRollupCodeSnapshot.js b/packages/test-utils/expect/toMatchRollupCodeSnapshot.js
index 2c991bcf..e334cca1 100644
--- a/packages/test-utils/expect/toMatchRollupCodeSnapshot.js
+++ b/packages/test-utils/expect/toMatchRollupCodeSnapshot.js
@@ -6,12 +6,12 @@ expect.extend({
     toMatchRollupCodeSnapshot({ output }) {
         const out = Object.create(null);
         
-        output.forEach((chunk) => {
-            if(chunk.isAsset) {
+        output.forEach(({ isAsset, name, code }) => {
+            if(isAsset) {
                 return;
             }
 
-            out[chunk.name] = chunk.code;
+            out[name] = code;
         });
 
         return toMatchSnapshot.call(