From 45543f14c2c59eae2e673accd735d8f0068f2eb7 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Fri, 28 Jul 2017 23:08:10 -0700
Subject: [PATCH 001/158] add babel-polyfill to examples

---
 examples/parallax-example/client.js | 1 +
 examples/parallax-example/server.js | 2 ++
 examples/parallax-test/client.js    | 1 +
 examples/parallax-test/server.js    | 2 ++
 4 files changed, 6 insertions(+)

diff --git a/examples/parallax-example/client.js b/examples/parallax-example/client.js
index 2129b126b..5054b2d9b 100644
--- a/examples/parallax-example/client.js
+++ b/examples/parallax-example/client.js
@@ -1,3 +1,4 @@
+import 'babel-polyfill';
 import React from 'react';
 import ReactDOM from 'react-dom';
 import { ParallaxExample } from 'components';
diff --git a/examples/parallax-example/server.js b/examples/parallax-example/server.js
index 31b258527..b3be7c746 100644
--- a/examples/parallax-example/server.js
+++ b/examples/parallax-example/server.js
@@ -6,6 +6,8 @@ import React from 'react';
 import ReactServer from 'react-dom/server';
 import { ParallaxExample } from 'components';
 
+import 'babel-polyfill';
+
 const app = express();
 
 app.use('/static', express.static(path.resolve(__dirname, './dist')));
diff --git a/examples/parallax-test/client.js b/examples/parallax-test/client.js
index 72183b97a..c52c2b5e4 100644
--- a/examples/parallax-test/client.js
+++ b/examples/parallax-test/client.js
@@ -1,3 +1,4 @@
+import 'babel-polyfill';
 import React from 'react';
 import ReactDOM from 'react-dom';
 import { ParallaxTest } from 'components';
diff --git a/examples/parallax-test/server.js b/examples/parallax-test/server.js
index 728422136..15438c3af 100644
--- a/examples/parallax-test/server.js
+++ b/examples/parallax-test/server.js
@@ -6,6 +6,8 @@ import React from 'react';
 import ReactServer from 'react-dom/server';
 import { ParallaxTest } from 'components';
 
+import 'babel-polyfill';
+
 const app = express();
 
 app.use('/static', express.static(path.resolve(__dirname, './dist')));

From 61906831ba6234170feb9004711ddce8666fa757 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Fri, 28 Jul 2017 23:11:30 -0700
Subject: [PATCH 002/158] remove `will-change` inline style

---
 src/libs/ParallaxController.js | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/src/libs/ParallaxController.js b/src/libs/ParallaxController.js
index 7dd25e05c..6415b83ad 100644
--- a/src/libs/ParallaxController.js
+++ b/src/libs/ParallaxController.js
@@ -288,8 +288,7 @@ function ParallaxController() {
         // Apply styles
         const el = element.elInner;
         el.style.cssText =
-           `will-change:transform;
-            position:relative;
+           `position:relative;
             transform:translate3d(${offsets.x.value}${offsets.x.unit}, ${offsets.y.value}${offsets.y.unit}, 0)`;
     }
 
@@ -300,8 +299,7 @@ function ParallaxController() {
     function _resetStyles(element) {
         const el = element.elInner;
         el.style.cssText =
-           `will-change:none;
-            position:relative;
+           `position:relative;
             transform:translate3d(0, 0, 0)`;
     }
 

From d600741f57cc37483c109d6ffe046536c26d643d Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Fri, 28 Jul 2017 23:16:32 -0700
Subject: [PATCH 003/158] add `init` method to readme

---
 README.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/README.md b/README.md
index f46455720..cfeb54841 100644
--- a/README.md
+++ b/README.md
@@ -113,6 +113,10 @@ Optionally pass a tag name to be applied to the outer most parallax element. For
 
 The following are public methods available on the `ParallaxController` global:
 
+**`init()`**
+
+Initilize the `ParallaxController` on the client with the `init` static method.
+
 **`update()`**
 
 Updates all cached attributes for parallax elements then updates their positions.

From 662dff2bb517cda596c5a36b318473e1ed82114d Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Fri, 28 Jul 2017 23:31:12 -0700
Subject: [PATCH 004/158] add browser support to readme

---
 README.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/README.md b/README.md
index cfeb54841..eabf5828a 100644
--- a/README.md
+++ b/README.md
@@ -125,6 +125,10 @@ Updates all cached attributes for parallax elements then updates their positions
 
 Removes window scroll and resize listeners, resets all styles applied to parallax elements, and sets the global `ParallaxController` to `null`.
 
+## Support
+
+React scroll parallax should support the last two versions of all major browsers and has been tested on desktop Chrome, Firefox, Safari and Edge, as well as the following: iOS 9, iOS 10, Android 4 and IE11. If you encounter any errors for browsers that should be supported please post an issue.
+
 ## Development
 
 Install node modules and start webpack:

From 98db15f865388ea069dc3c13fb33e7e43da711b3 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Fri, 28 Jul 2017 23:34:01 -0700
Subject: [PATCH 005/158] add CodePen example to readme

---
 README.md | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index eabf5828a..0b93b5236 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,9 @@ Provides a React component and single global passive scroll listener to add **ve
 
 ## Examples
 
-🔗 [Example](https://jscottsmith.github.io/react-scroll-parallax/examples/parallax-example/)
+🔗 [CodePen Parallax](https://codepen.io/jscottsmith/pen/eREbwz)
+
+🔗 [Example Site](https://jscottsmith.github.io/react-scroll-parallax/examples/parallax-example/)
 
 🔗 [Parallax Testing](https://jscottsmith.github.io/react-scroll-parallax/examples/parallax-test/)
 

From c6d108565f9373398be850abee1c5a6d696a2ec1 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 5 Aug 2017 16:04:16 -0700
Subject: [PATCH 006/158] use correct `prop-types` package

---
 package.json               | 4 ++--
 src/components/Parallax.js | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package.json b/package.json
index 3b07d3619..0ba08a6c5 100644
--- a/package.json
+++ b/package.json
@@ -28,9 +28,9 @@
   "author": "J Scott Smith",
   "license": "ISC",
   "dependencies": {
+    "prop-types": "^15.5.10",
     "react": "^15.4.2",
-    "react-dom": "^15.4.2",
-    "react-proptypes": "^1.0.0"
+    "react-dom": "^15.4.2"
   },
   "devDependencies": {
     "babel-cli": "^6.24.1",
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 4b393d861..f03151c4a 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -1,5 +1,5 @@
 import React, { Component } from 'react';
-import PropTypes from 'react-proptypes';
+import PropTypes from 'prop-types';
 import { offsetMin, offsetMax } from '../utils/propValidation';
 
 export default class Parallax extends Component {

From c9e29142f5f494bf413130b9205fb2190323bab6 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 5 Aug 2017 16:26:03 -0700
Subject: [PATCH 007/158] add `prettier` npm script

---
 package.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/package.json b/package.json
index 0ba08a6c5..c67403205 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
     "dev-server": "node ./examples/parallax-example/dist/server",
     "gh-pages": "NODE_ENV=production webpack --progress --colors",
     "test": "jest",
+    "prettier": "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
     "prepublish": "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports"
   },
   "jest": {

From 08b160a2204bbb9cfc3d1b9977d5c9e82002789f Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 5 Aug 2017 16:29:20 -0700
Subject: [PATCH 008/158] run prettier on src, examples, and tests

---
 __tests__/clamp.test.js                       |  9 ++--
 __tests__/getParallaxOffsets.test.js          | 32 +++++++++++--
 __tests__/parseValueAndUnit.test.js           | 18 +++-----
 __tests__/scaleBetween.test.js                | 14 +++---
 .../components/Intro/Intro.js                 | 19 ++------
 .../components/Marquee/Marquee.js             |  5 +--
 .../components/Overlap/Overlap.js             |  8 +---
 .../ParallaxExample/ParallaxExample.js        |  6 +--
 .../components/ShapeField/ShapeField.js       | 22 +++------
 .../parallax-example/components/Svg/Svg.js    |  4 +-
 .../components/TriangleGrid/TriangleGrid.js   | 27 +++++------
 examples/parallax-example/server.js           |  4 +-
 .../components/ParallaxTest/ParallaxTest.js   | 45 ++++++++++++++-----
 examples/parallax-test/server.js              |  4 +-
 src/components/Parallax.js                    | 21 +++------
 src/libs/ParallaxController.js                | 40 ++++++++++-------
 src/utils/getParallaxOffsets.js               | 13 +++---
 src/utils/isElementInView.js                  |  6 +--
 src/utils/parseValueAndUnit.js                |  4 +-
 src/utils/propValidation.js                   | 22 ++++++---
 20 files changed, 170 insertions(+), 153 deletions(-)

diff --git a/__tests__/clamp.test.js b/__tests__/clamp.test.js
index 18d3a375c..f6f572afe 100644
--- a/__tests__/clamp.test.js
+++ b/__tests__/clamp.test.js
@@ -4,12 +4,9 @@ const max = 100;
 const min = 10;
 
 test('Clamps a value within a range', () => {
-    expect(clamp(50, min, max))
-        .toBe(50);
+    expect(clamp(50, min, max)).toBe(50);
 
-    expect(clamp(110, min, max))
-        .toBe(max);
+    expect(clamp(110, min, max)).toBe(max);
 
-    expect(clamp(0, min, max))
-        .toBe(min);
+    expect(clamp(0, min, max)).toBe(min);
 });
diff --git a/__tests__/getParallaxOffsets.test.js b/__tests__/getParallaxOffsets.test.js
index 79f508797..0caa1ce05 100644
--- a/__tests__/getParallaxOffsets.test.js
+++ b/__tests__/getParallaxOffsets.test.js
@@ -13,22 +13,46 @@ const percentMoved = 44;
 test('Gets offsets based on percent in view', () => {
     expect(getParallaxOffsets(offset, percentMoved, false)).toEqual({
         x: {
-            value: scaleBetween(percentMoved, offset.xMax.value, offset.xMin.value, 0, 100),
+            value: scaleBetween(
+                percentMoved,
+                offset.xMax.value,
+                offset.xMin.value,
+                0,
+                100
+            ),
             unit: offset.xMax.unit,
         },
         y: {
-            value: scaleBetween(percentMoved, offset.yMax.value, offset.yMin.value, 0, 100),
+            value: scaleBetween(
+                percentMoved,
+                offset.yMax.value,
+                offset.yMin.value,
+                0,
+                100
+            ),
             unit: offset.yMax.unit,
         },
     });
 
     expect(getParallaxOffsets(offset, percentMoved, true)).toEqual({
         x: {
-            value: scaleBetween(percentMoved, offset.xMin.value, offset.xMax.value, 0, 100),
+            value: scaleBetween(
+                percentMoved,
+                offset.xMin.value,
+                offset.xMax.value,
+                0,
+                100
+            ),
             unit: offset.xMax.unit,
         },
         y: {
-            value: scaleBetween(percentMoved, offset.yMin.value, offset.yMax.value, 0, 100),
+            value: scaleBetween(
+                percentMoved,
+                offset.yMin.value,
+                offset.yMax.value,
+                0,
+                100
+            ),
             unit: offset.yMax.unit,
         },
     });
diff --git a/__tests__/parseValueAndUnit.test.js b/__tests__/parseValueAndUnit.test.js
index da6b715bd..40db9ec2b 100644
--- a/__tests__/parseValueAndUnit.test.js
+++ b/__tests__/parseValueAndUnit.test.js
@@ -1,16 +1,10 @@
 import parseValueAndUnit from 'utils/parseValueAndUnit';
 
 test('Parse a string to get the value and unit in either pixels or percent', () => {
-    expect(parseValueAndUnit('5px'))
-        .toEqual({ unit: 'px', value: 5 });
-    expect(parseValueAndUnit('52%'))
-        .toEqual({ unit: '%', value: 52 });
-    expect(parseValueAndUnit(13.333))
-        .toEqual({ unit: '%', value: 13.333 });
-    expect(parseValueAndUnit('75.8%'))
-        .toEqual({ unit: '%', value: 75 });
-    expect(parseValueAndUnit('23.1px'))
-        .toEqual({ unit: 'px', value: 23 });
-    expect(() => parseValueAndUnit(false))
-        .toThrow();
+    expect(parseValueAndUnit('5px')).toEqual({ unit: 'px', value: 5 });
+    expect(parseValueAndUnit('52%')).toEqual({ unit: '%', value: 52 });
+    expect(parseValueAndUnit(13.333)).toEqual({ unit: '%', value: 13.333 });
+    expect(parseValueAndUnit('75.8%')).toEqual({ unit: '%', value: 75 });
+    expect(parseValueAndUnit('23.1px')).toEqual({ unit: 'px', value: 23 });
+    expect(() => parseValueAndUnit(false)).toThrow();
 });
diff --git a/__tests__/scaleBetween.test.js b/__tests__/scaleBetween.test.js
index 6cc2629c3..35cb71bd0 100644
--- a/__tests__/scaleBetween.test.js
+++ b/__tests__/scaleBetween.test.js
@@ -7,12 +7,10 @@ const newMin = 0;
 const newMax = 100;
 
 test('Scales a value from a given range to a new range', () => {
-    expect(scaleBetween(0.4, newMin, newMax, oldMin, oldMax))
-        .toBe(40);
-    expect(scaleBetween(0.1, newMin, newMax, oldMin, oldMax))
-        .toBe(10);
-    expect(scaleBetween(0.3, newMin, newMax, oldMin, oldMax))
-        .toBe(30);
-    expect(scaleBetween(0.333, newMin, newMax, oldMin, oldMax))
-        .toBeCloseTo(33.3);
+    expect(scaleBetween(0.4, newMin, newMax, oldMin, oldMax)).toBe(40);
+    expect(scaleBetween(0.1, newMin, newMax, oldMin, oldMax)).toBe(10);
+    expect(scaleBetween(0.3, newMin, newMax, oldMin, oldMax)).toBe(30);
+    expect(scaleBetween(0.333, newMin, newMax, oldMin, oldMax)).toBeCloseTo(
+        33.3
+    );
 });
diff --git a/examples/parallax-example/components/Intro/Intro.js b/examples/parallax-example/components/Intro/Intro.js
index 936238b4c..f0d0b9cc0 100644
--- a/examples/parallax-example/components/Intro/Intro.js
+++ b/examples/parallax-example/components/Intro/Intro.js
@@ -8,24 +8,13 @@ import hemispheres from '!!raw-loader!./hemispheres.svg';
 const Intro = () => (
     <div className={style.root}>
         <div className={style.container}>
-            <Parallax
-                offsetYMin={-100}
-                offsetYMax={100}
-                className={style.ring}
-            >
+            <Parallax offsetYMin={-100} offsetYMax={100} className={style.ring}>
                 <Svg svg={ring} />
             </Parallax>
-            <Parallax
-                offsetYMin={-50}
-                offsetYMax={50}
-                className={style.circle}
-            >
-                <div className={style.circleInner}/>
+            <Parallax offsetYMin={-50} offsetYMax={50} className={style.circle}>
+                <div className={style.circleInner} />
             </Parallax>
-            <Svg
-                className={style.hemispheres}
-                svg={hemispheres}
-            />
+            <Svg className={style.hemispheres} svg={hemispheres} />
         </div>
         <p className={style.scroll}>Scroll</p>
     </div>
diff --git a/examples/parallax-example/components/Marquee/Marquee.js b/examples/parallax-example/components/Marquee/Marquee.js
index 465ca212e..16dc49c72 100644
--- a/examples/parallax-example/components/Marquee/Marquee.js
+++ b/examples/parallax-example/components/Marquee/Marquee.js
@@ -10,10 +10,7 @@ const Marquee = () => (
     <div className={style.root}>
         <Svg svg={divider} className={style.divider} />
         <div className={style.container}>
-            <Svg
-                svg={boxBg}
-                className={style.boxBg}
-            />
+            <Svg svg={boxBg} className={style.boxBg} />
             <Parallax
                 className={style.text}
                 offsetYMax={70}
diff --git a/examples/parallax-example/components/Overlap/Overlap.js b/examples/parallax-example/components/Overlap/Overlap.js
index 6cffc90b1..5692215a5 100644
--- a/examples/parallax-example/components/Overlap/Overlap.js
+++ b/examples/parallax-example/components/Overlap/Overlap.js
@@ -15,9 +15,7 @@ const Overlap = () => (
                 offsetXMin={20}
                 className={style.circle}
             >
-                <Svg
-                    svg={circle}
-                />
+                <Svg svg={circle} />
             </Parallax>
             <Parallax
                 offsetYMax={150}
@@ -26,9 +24,7 @@ const Overlap = () => (
                 offsetXMin={-20}
                 className={style.circleRings}
             >
-                <Svg
-                    svg={circleRings}
-                />
+                <Svg svg={circleRings} />
             </Parallax>
         </div>
     </div>
diff --git a/examples/parallax-example/components/ParallaxExample/ParallaxExample.js b/examples/parallax-example/components/ParallaxExample/ParallaxExample.js
index f11fde9d6..726b5bce4 100644
--- a/examples/parallax-example/components/ParallaxExample/ParallaxExample.js
+++ b/examples/parallax-example/components/ParallaxExample/ParallaxExample.js
@@ -1,7 +1,7 @@
 import React, { Component } from 'react';
 import {
-	Intro,
-	IntroCopy,
+    Intro,
+    IntroCopy,
     Marquee,
     TriangleGrid,
     Overlap,
@@ -15,7 +15,6 @@ import noisePattern from '!!raw-loader!../shared/noise-pattern.svg';
 import dotPattern from '!!raw-loader!../shared/dot-pattern.svg';
 
 export default class ParallaxExample extends Component {
-
     render() {
         return (
             <div className={style.root}>
@@ -34,5 +33,4 @@ export default class ParallaxExample extends Component {
             </div>
         );
     }
-
 }
diff --git a/examples/parallax-example/components/ShapeField/ShapeField.js b/examples/parallax-example/components/ShapeField/ShapeField.js
index 077014647..47a2ca7d9 100644
--- a/examples/parallax-example/components/ShapeField/ShapeField.js
+++ b/examples/parallax-example/components/ShapeField/ShapeField.js
@@ -1,8 +1,6 @@
 import React, { Component } from 'react';
 import { Parallax } from 'react-scroll-parallax';
-import {
-    Svg,
-} from 'components';
+import { Svg } from 'components';
 
 import style from './ShapeField.scss';
 
@@ -12,10 +10,12 @@ import cluster01Rect from '!!raw-loader!./cluster-01-rect.svg';
 
 import cluster02Hemi from '!!raw-loader!./cluster-02-hemi.svg';
 import cluster02TriangleBig from '!!raw-loader!./cluster-02-triangle-big.svg';
-import cluster02TriangleSmall from '!!raw-loader!./cluster-02-triangle-small.svg';
+import cluster02TriangleSmall
+    from '!!raw-loader!./cluster-02-triangle-small.svg';
 
 import cluster03TriangleTop from '!!raw-loader!./cluster-03-triangle-top.svg';
-import cluster03TriangleBottom from '!!raw-loader!./cluster-03-triangle-bottom.svg';
+import cluster03TriangleBottom
+    from '!!raw-loader!./cluster-03-triangle-bottom.svg';
 import cluster03TriangleBig from '!!raw-loader!./cluster-03-triangle-big.svg';
 
 import cluster04Triangle from '!!raw-loader!./cluster-04-triangle.svg';
@@ -23,7 +23,6 @@ import cluster04Square from '!!raw-loader!./cluster-04-square.svg';
 import cluster04HemiRight from '!!raw-loader!./cluster-04-hemi-right.svg';
 
 export default class ShapeField extends Component {
-
     render() {
         return (
             <div className={style.root}>
@@ -48,10 +47,7 @@ export default class ShapeField extends Component {
                 </div>
 
                 <div className={style.shapeCluster02}>
-                    <Svg
-                        svg={cluster02Hemi}
-                        className="hemi"
-                    />
+                    <Svg svg={cluster02Hemi} className="hemi" />
                     <Parallax
                         offsetYMax={30}
                         offsetYMin={-30}
@@ -93,10 +89,7 @@ export default class ShapeField extends Component {
                 </div>
 
                 <div className={style.shapeCluster04}>
-                    <Svg
-                        svg={cluster04Square}
-                        className="square"
-                    />
+                    <Svg svg={cluster04Square} className="square" />
                     <Parallax
                         offsetYMax={60}
                         offsetYMin={-60}
@@ -116,5 +109,4 @@ export default class ShapeField extends Component {
             </div>
         );
     }
-
 }
diff --git a/examples/parallax-example/components/Svg/Svg.js b/examples/parallax-example/components/Svg/Svg.js
index b4d730b7d..a9535d555 100644
--- a/examples/parallax-example/components/Svg/Svg.js
+++ b/examples/parallax-example/components/Svg/Svg.js
@@ -4,7 +4,9 @@ import style from './Svg.scss';
 
 export default function Svg(props) {
     const Element = props.el;
-    const className = `svg-container ${style.root}` + (props.className ? ` ${props.className}` : '');
+    const className =
+        `svg-container ${style.root}` +
+        (props.className ? ` ${props.className}` : '');
 
     return (
         <Element
diff --git a/examples/parallax-example/components/TriangleGrid/TriangleGrid.js b/examples/parallax-example/components/TriangleGrid/TriangleGrid.js
index 8e15b8d2c..fb1325968 100644
--- a/examples/parallax-example/components/TriangleGrid/TriangleGrid.js
+++ b/examples/parallax-example/components/TriangleGrid/TriangleGrid.js
@@ -8,27 +8,23 @@ import angleTop from '!!raw-loader!../shared/angle-dark-top.svg';
 
 const TriangleGrid = () => (
     <div className={style.root}>
-        <Svg
-            svg={angleTop}
-            className={style.angleTop}
-        />
+        <Svg svg={angleTop} className={style.angleTop} />
         <article className={style.copy}>
             <p>
                 <code>npm i react-scroll-parallax</code>
             </p>
             <p>
-                <a className="btn" href="https://github.com/jscottsmith/react-scroll-parallax">View on GitHub</a>
+                <a
+                    className="btn"
+                    href="https://github.com/jscottsmith/react-scroll-parallax"
+                >
+                    View on GitHub
+                </a>
             </p>
         </article>
         <div className={style.container}>
-            <Parallax
-                offsetYMax={25}
-                offsetYMin={-25}
-            >
-                <Svg
-                    svg={gridPurple}
-                    className={style.trianglesPurple}
-                />
+            <Parallax offsetYMax={25} offsetYMin={-25}>
+                <Svg svg={gridPurple} className={style.trianglesPurple} />
             </Parallax>
             <Parallax
                 offsetYMax={50}
@@ -36,10 +32,7 @@ const TriangleGrid = () => (
                 offsetXMax={13}
                 offsetXMin={-13}
             >
-                <Svg
-                    svg={gridWhite}
-                    className={style.trianglesWhite}
-                />
+                <Svg svg={gridWhite} className={style.trianglesWhite} />
             </Parallax>
         </div>
     </div>
diff --git a/examples/parallax-example/server.js b/examples/parallax-example/server.js
index b3be7c746..ce4c5d91b 100644
--- a/examples/parallax-example/server.js
+++ b/examples/parallax-example/server.js
@@ -13,7 +13,9 @@ const app = express();
 app.use('/static', express.static(path.resolve(__dirname, './dist')));
 
 app.get('*', (req, res) => {
-    const html = fs.readFileSync(path.resolve(__dirname, './index.html')).toString();
+    const html = fs
+        .readFileSync(path.resolve(__dirname, './index.html'))
+        .toString();
     const markup = ReactServer.renderToString(<ParallaxExample />);
 
     res.send(html.replace('$react', markup));
diff --git a/examples/parallax-test/components/ParallaxTest/ParallaxTest.js b/examples/parallax-test/components/ParallaxTest/ParallaxTest.js
index db1e6c35c..45b4917a4 100644
--- a/examples/parallax-test/components/ParallaxTest/ParallaxTest.js
+++ b/examples/parallax-test/components/ParallaxTest/ParallaxTest.js
@@ -6,7 +6,6 @@ const INC_AMOUNT = 10;
 const START_NUM_ELEMENTS = 10;
 
 export default class ParallaxTest extends React.Component {
-
     state = {
         elements: new Array(START_NUM_ELEMENTS).fill(null).map((x, i) => i),
         offsetY: INC_AMOUNT,
@@ -23,7 +22,10 @@ export default class ParallaxTest extends React.Component {
     };
 
     handleRemove = () => {
-        const elements = this.state.elements.slice(0, this.state.elements.length - 1);
+        const elements = this.state.elements.slice(
+            0,
+            this.state.elements.length - 1
+        );
         this.setState({
             elements,
         });
@@ -37,7 +39,9 @@ export default class ParallaxTest extends React.Component {
     };
 
     decreaseOffsetY = () => {
-        const offsetY = this.state.offsetY - INC_AMOUNT < 0 ? 0 : this.state.offsetY - INC_AMOUNT;
+        const offsetY = this.state.offsetY - INC_AMOUNT < 0
+            ? 0
+            : this.state.offsetY - INC_AMOUNT;
         this.setState({
             offsetY,
         });
@@ -101,7 +105,9 @@ export default class ParallaxTest extends React.Component {
                     <div className={style.currentState}>
                         <h4>
                             Parallax Elements:
-                            <span className="value">{this.state.elements.length}</span>
+                            <span className="value">
+                                {this.state.elements.length}
+                            </span>
                         </h4>
                         <button onClick={this.handleAdd}>Add</button>
                         <button onClick={this.handleRemove}>Remove</button>
@@ -109,7 +115,10 @@ export default class ParallaxTest extends React.Component {
                     <div className={style.currentState}>
                         <h4>
                             Y Offsets:
-                            <span className="value">{this.state.offsetY}{this.state.unitPercent ? '%' : 'px'}</span>
+                            <span className="value">
+                                {this.state.offsetY}
+                                {this.state.unitPercent ? '%' : 'px'}
+                            </span>
                         </h4>
                         <button onClick={this.increaseOffsetY}>Increase</button>
                         <button onClick={this.decreaseOffsetY}>Decrease</button>
@@ -117,23 +126,37 @@ export default class ParallaxTest extends React.Component {
                     <div className={style.currentState}>
                         <h4>
                             Speed:
-                            <span className="value">{this.state.slowerScrollRate ? 'Slower' : 'Faster'}</span>
+                            <span className="value">
+                                {this.state.slowerScrollRate
+                                    ? 'Slower'
+                                    : 'Faster'}
+                            </span>
                         </h4>
-                        <button onClick={this.toggleSpeed}>{this.state.slowerScrollRate ? 'Faster' : 'Slower'}</button>
+                        <button onClick={this.toggleSpeed}>
+                            {this.state.slowerScrollRate ? 'Faster' : 'Slower'}
+                        </button>
                     </div>
                     <div className={style.currentState}>
                         <h4>
                             Unit:
-                            <span className="value">{this.state.unitPercent ? 'Percent' : 'Pixels'}</span>
+                            <span className="value">
+                                {this.state.unitPercent ? 'Percent' : 'Pixels'}
+                            </span>
                         </h4>
-                        <button onClick={this.toggleValue}>{this.state.unitPercent ? 'Pixels' : 'Percent'}</button>
+                        <button onClick={this.toggleValue}>
+                            {this.state.unitPercent ? 'Pixels' : 'Percent'}
+                        </button>
                     </div>
                     <div className={style.currentState}>
                         <h4>
                             Disabled:
-                            <span className="value">{this.state.disabled ? 'True' : 'False'}</span>
+                            <span className="value">
+                                {this.state.disabled ? 'True' : 'False'}
+                            </span>
                         </h4>
-                        <button onClick={this.toggleDisabled}>{this.state.disabled ? 'Enable' : 'Disable'}</button>
+                        <button onClick={this.toggleDisabled}>
+                            {this.state.disabled ? 'Enable' : 'Disable'}
+                        </button>
                     </div>
                 </div>
             </div>
diff --git a/examples/parallax-test/server.js b/examples/parallax-test/server.js
index 15438c3af..3f3caf445 100644
--- a/examples/parallax-test/server.js
+++ b/examples/parallax-test/server.js
@@ -13,7 +13,9 @@ const app = express();
 app.use('/static', express.static(path.resolve(__dirname, './dist')));
 
 app.get('*', (req, res) => {
-    const html = fs.readFileSync(path.resolve(__dirname, './index.html')).toString();
+    const html = fs
+        .readFileSync(path.resolve(__dirname, './index.html'))
+        .toString();
     const markup = ReactServer.renderToString(<ParallaxTest />);
 
     res.send(html.replace('$react', markup));
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index f03151c4a..382d8ec9d 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -3,7 +3,6 @@ import PropTypes from 'prop-types';
 import { offsetMin, offsetMax } from '../utils/propValidation';
 
 export default class Parallax extends Component {
-
     static defaultProps = {
         disabled: false,
         offsetYMax: 0,
@@ -29,7 +28,9 @@ export default class Parallax extends Component {
     componentDidMount() {
         // add this Parallax element to the global listener
         if (typeof ParallaxController === 'undefined') {
-            throw new Error('Must initialize the ParallaxController before adding React Parallax components.');
+            throw new Error(
+                'Must initialize the ParallaxController before adding React Parallax components.'
+            );
         }
         // create a new parallax element and save the reference
         this.element = ParallaxController.createElement({
@@ -80,23 +81,13 @@ export default class Parallax extends Component {
     };
 
     render() {
-        const {
-            children,
-            className,
-            tag: Tag,
-        } = this.props;
+        const { children, className, tag: Tag } = this.props;
 
         const rootClass = 'parallax-outer' + (className ? ` ${className}` : '');
 
         return (
-            <Tag
-                className={rootClass}
-                ref={this.mapRefOuter}
-            >
-                <div
-                    className="parallax-inner"
-                    ref={this.mapRefInner}
-                >
+            <Tag className={rootClass} ref={this.mapRefOuter}>
+                <div className="parallax-inner" ref={this.mapRefInner}>
                     {children}
                 </div>
             </Tag>
diff --git a/src/libs/ParallaxController.js b/src/libs/ParallaxController.js
index 6415b83ad..63416427d 100644
--- a/src/libs/ParallaxController.js
+++ b/src/libs/ParallaxController.js
@@ -18,7 +18,6 @@ import {
  *
  */
 function ParallaxController() {
-
     // All parallax elements to be updated
     const elements = [];
 
@@ -41,12 +40,20 @@ function ParallaxController() {
     const supportsPassive = testForPassiveScroll();
 
     function _addListeners() {
-        window.addEventListener('scroll', _handleScroll, supportsPassive ? { passive: true } : false);
+        window.addEventListener(
+            'scroll',
+            _handleScroll,
+            supportsPassive ? { passive: true } : false
+        );
         window.addEventListener('resize', _handleResize, false);
     }
 
     function _removeListeners() {
-        window.removeEventListener('scroll', _handleScroll, supportsPassive ? { passive: true } : false);
+        window.removeEventListener(
+            'scroll',
+            _handleScroll,
+            supportsPassive ? { passive: true } : false
+        );
         window.removeEventListener('resize', _handleResize, false);
     }
 
@@ -153,12 +160,7 @@ function ParallaxController() {
      * @param {object} element
      */
     function _cacheAttributes(element) {
-        const {
-            yMin,
-            yMax,
-            xMax,
-            xMin,
-        } = element.offsets;
+        const { yMin, yMax, xMax, xMin } = element.offsets;
 
         const { slowerScrollRate } = element.props;
 
@@ -210,8 +212,8 @@ function ParallaxController() {
             top = rect.top + scrollY + yMinPx;
             bottom = rect.bottom + scrollY + yMaxPx;
         } else {
-            top = rect.top + scrollY + (yMaxPx * -1);
-            bottom = rect.bottom + scrollY + (yMinPx * -1);
+            top = rect.top + scrollY + yMaxPx * -1;
+            bottom = rect.bottom + scrollY + yMinPx * -1;
         }
 
         // NOTE: Total distance the element will move from when
@@ -251,7 +253,9 @@ function ParallaxController() {
         const xMax = parseValueAndUnit(offsetXMin);
 
         if (xMin.unit !== xMax.unit || yMin.unit !== yMax.unit) {
-            throw new Error('Must provide matching units for the min and max offset values of each axis.');
+            throw new Error(
+                'Must provide matching units for the min and max offset values of each axis.'
+            );
         }
 
         const xUnit = xMin.unit || '%';
@@ -283,12 +287,15 @@ function ParallaxController() {
         const { slowerScrollRate } = element.props;
 
         // Get the parallax X and Y offsets
-        const offsets = getParallaxOffsets(element.offsets, percentMoved, slowerScrollRate);
+        const offsets = getParallaxOffsets(
+            element.offsets,
+            percentMoved,
+            slowerScrollRate
+        );
 
         // Apply styles
         const el = element.elInner;
-        el.style.cssText =
-           `position:relative;
+        el.style.cssText = `position:relative;
             transform:translate3d(${offsets.x.value}${offsets.x.unit}, ${offsets.y.value}${offsets.y.unit}, 0)`;
     }
 
@@ -298,8 +305,7 @@ function ParallaxController() {
      */
     function _resetStyles(element) {
         const el = element.elInner;
-        el.style.cssText =
-           `position:relative;
+        el.style.cssText = `position:relative;
             transform:translate3d(0, 0, 0)`;
     }
 
diff --git a/src/utils/getParallaxOffsets.js b/src/utils/getParallaxOffsets.js
index 800b7ca18..39fafaaf7 100644
--- a/src/utils/getParallaxOffsets.js
+++ b/src/utils/getParallaxOffsets.js
@@ -7,13 +7,12 @@ import { scaleBetween } from './index';
  * @returns {Object}
  */
 
-export default function getParallaxOffsets(offsets, percentMoved, slowerScrollRate) {
-    const {
-        yMin,
-        yMax,
-        xMin,
-        xMax,
-    } = offsets;
+export default function getParallaxOffsets(
+    offsets,
+    percentMoved,
+    slowerScrollRate
+) {
+    const { yMin, yMax, xMin, xMax } = offsets;
 
     const yUnit = yMax.unit;
     const xUnit = xMax.unit;
diff --git a/src/utils/isElementInView.js b/src/utils/isElementInView.js
index 9575590ce..945d9a6df 100644
--- a/src/utils/isElementInView.js
+++ b/src/utils/isElementInView.js
@@ -9,9 +9,9 @@ export default function isElementInView(element, windowHeight, scrollY) {
     const top = element.attributes.top - scrollY;
     const bottom = element.attributes.bottom - scrollY;
 
-    const topInView     = top    >= 0 && top    <= windowHeight;
-    const bottomInView  = bottom >= 0 && bottom <= windowHeight;
-    const covering      = top    <= 0 && bottom >= windowHeight;
+    const topInView = top >= 0 && top <= windowHeight;
+    const bottomInView = bottom >= 0 && bottom <= windowHeight;
+    const covering = top <= 0 && bottom >= windowHeight;
 
     const isInView = topInView || bottomInView || covering;
 
diff --git a/src/utils/parseValueAndUnit.js b/src/utils/parseValueAndUnit.js
index 49f925abb..37d78f215 100644
--- a/src/utils/parseValueAndUnit.js
+++ b/src/utils/parseValueAndUnit.js
@@ -11,7 +11,9 @@ export default function parseValueAndUnit(value) {
     const isNumb = typeof value === 'number';
 
     if (isBool || isObject) {
-        throw new Error('Ivalid value provided. Must provide a value as a string with % or px units.');
+        throw new Error(
+            'Ivalid value provided. Must provide a value as a string with % or px units.'
+        );
     }
 
     if (isNumb) {
diff --git a/src/utils/propValidation.js b/src/utils/propValidation.js
index ab49731d1..e6f059c72 100644
--- a/src/utils/propValidation.js
+++ b/src/utils/propValidation.js
@@ -2,7 +2,9 @@ export function offsetMin(props, propName, componentName) {
     componentName = componentName || 'ANONYMOUS';
 
     if (!typeof value === 'string' || !typeof value === 'number') {
-        return new Error(`[${propName}] in ${componentName} must be a string with with "%"" or "px" units or number`);
+        return new Error(
+            `[${propName}] in ${componentName} must be a string with with "%"" or "px" units or number`
+        );
     }
 
     if (props[propName]) {
@@ -10,7 +12,11 @@ export function offsetMin(props, propName, componentName) {
         if (typeof value === 'string') {
             value = parseInt(value, 10);
         }
-        return value <= 0 ? null : new Error(`[${propName}] in ${componentName} is greater than zero. [${propName}] must be less than or equal to zero.`);
+        return value <= 0
+            ? null
+            : new Error(
+                  `[${propName}] in ${componentName} is greater than zero. [${propName}] must be less than or equal to zero.`
+              );
     }
     return null;
 }
@@ -19,7 +25,9 @@ export function offsetMax(props, propName, componentName) {
     componentName = componentName || 'ANONYMOUS';
 
     if (!typeof value === 'string' || !typeof value === 'number') {
-        return new Error(`[${propName}] in ${componentName} must be a string with with "%"" or "px" units or number`);
+        return new Error(
+            `[${propName}] in ${componentName} must be a string with with "%"" or "px" units or number`
+        );
     }
 
     if (props[propName]) {
@@ -27,7 +35,11 @@ export function offsetMax(props, propName, componentName) {
         if (typeof value === 'string') {
             value = parseInt(value, 10);
         }
-        return value >= 0 ? null : new Error(`[${propName}] in ${componentName} is less than zero. [${propName}] must be greater than or equal to zero.`);
+        return value >= 0
+            ? null
+            : new Error(
+                  `[${propName}] in ${componentName} is less than zero. [${propName}] must be greater than or equal to zero.`
+              );
     }
     return null;
-}
\ No newline at end of file
+}

From 20c819f62184f2898e5e4d6bd5ee89b08f06a846 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 5 Aug 2017 17:13:53 -0700
Subject: [PATCH 009/158] remove examples and associated dependencies

---
 {examples/parallax-test => example}/client.js |   0
 .../components/ParallaxTest/ParallaxTest.js   |   0
 .../components/ParallaxTest/ParallaxTest.scss |   0
 .../components/index.js                       |   0
 .../parallax-test => example}/index.html      |   0
 {examples/parallax-test => example}/server.js |   0
 examples/parallax-example/client.js           |  11 -
 .../components/Intro/Intro.js                 |  23 -
 .../components/Intro/Intro.scss               |  68 --
 .../components/Intro/hemispheres.svg          |   7 -
 .../components/Intro/ring-of-dots.svg         |   5 -
 .../components/IntroCopy/IntroCopy.js         |  30 -
 .../components/IntroCopy/IntroCopy.scss       |  38 -
 .../components/Marquee/Marquee.js             |  36 -
 .../components/Marquee/Marquee.scss           |  48 --
 .../components/Marquee/box-bg.svg             |   4 -
 .../components/Marquee/box-outline.svg        |  11 -
 .../components/Overlap/Overlap.js             |  33 -
 .../components/Overlap/Overlap.scss           |  31 -
 .../components/Overlap/circle-rings.svg       |  27 -
 .../components/Overlap/circle.svg             |   6 -
 .../ParallaxExample/ParallaExample.scss       |  77 --
 .../ParallaxExample/ParallaxExample.js        |  36 -
 .../components/ShapeField/ShapeField.js       | 112 ---
 .../components/ShapeField/ShapeField.scss     | 110 ---
 .../ShapeField/cluster-01-hemi-left.svg       |   4 -
 .../ShapeField/cluster-01-hemi-right.svg      |   4 -
 .../components/ShapeField/cluster-01-rect.svg |   4 -
 .../components/ShapeField/cluster-02-hemi.svg |   4 -
 .../ShapeField/cluster-02-triangle-big.svg    |   4 -
 .../ShapeField/cluster-02-triangle-small.svg  |   4 -
 .../ShapeField/cluster-02-triangle.svg        |   4 -
 .../ShapeField/cluster-03-triangle-big.svg    |   4 -
 .../ShapeField/cluster-03-triangle-bottom.svg |   4 -
 .../ShapeField/cluster-03-triangle-top.svg    |   4 -
 .../ShapeField/cluster-04-hemi-right.svg      |   4 -
 .../ShapeField/cluster-04-square.svg          |   4 -
 .../ShapeField/cluster-04-triangle.svg        |   4 -
 .../parallax-example/components/Svg/Svg.js    |  29 -
 .../parallax-example/components/Svg/Svg.scss  |  12 -
 .../components/TriangleGrid/TriangleGrid.js   |  41 -
 .../components/TriangleGrid/TriangleGrid.scss |  48 --
 .../components/TriangleGrid/grid-purple.svg   |  21 -
 .../components/TriangleGrid/grid-white.svg    |  19 -
 examples/parallax-example/components/index.js |   8 -
 .../components/shared/angle-dark-top.svg      |   6 -
 .../components/shared/divider.svg             |   6 -
 .../components/shared/dot-pattern.svg         | 543 -------------
 .../components/shared/noise-pattern.svg       | 749 ------------------
 examples/parallax-example/index.html          |  25 -
 examples/parallax-example/server.js           |  26 -
 examples/parallax-example/styles/colors.scss  |   3 -
 package.json                                  |   5 +-
 webpack.config.js                             |  46 +-
 54 files changed, 13 insertions(+), 2339 deletions(-)
 rename {examples/parallax-test => example}/client.js (100%)
 rename {examples/parallax-test => example}/components/ParallaxTest/ParallaxTest.js (100%)
 rename {examples/parallax-test => example}/components/ParallaxTest/ParallaxTest.scss (100%)
 rename {examples/parallax-test => example}/components/index.js (100%)
 rename {examples/parallax-test => example}/index.html (100%)
 rename {examples/parallax-test => example}/server.js (100%)
 delete mode 100644 examples/parallax-example/client.js
 delete mode 100644 examples/parallax-example/components/Intro/Intro.js
 delete mode 100644 examples/parallax-example/components/Intro/Intro.scss
 delete mode 100644 examples/parallax-example/components/Intro/hemispheres.svg
 delete mode 100644 examples/parallax-example/components/Intro/ring-of-dots.svg
 delete mode 100644 examples/parallax-example/components/IntroCopy/IntroCopy.js
 delete mode 100644 examples/parallax-example/components/IntroCopy/IntroCopy.scss
 delete mode 100644 examples/parallax-example/components/Marquee/Marquee.js
 delete mode 100644 examples/parallax-example/components/Marquee/Marquee.scss
 delete mode 100644 examples/parallax-example/components/Marquee/box-bg.svg
 delete mode 100644 examples/parallax-example/components/Marquee/box-outline.svg
 delete mode 100644 examples/parallax-example/components/Overlap/Overlap.js
 delete mode 100644 examples/parallax-example/components/Overlap/Overlap.scss
 delete mode 100644 examples/parallax-example/components/Overlap/circle-rings.svg
 delete mode 100644 examples/parallax-example/components/Overlap/circle.svg
 delete mode 100644 examples/parallax-example/components/ParallaxExample/ParallaExample.scss
 delete mode 100644 examples/parallax-example/components/ParallaxExample/ParallaxExample.js
 delete mode 100644 examples/parallax-example/components/ShapeField/ShapeField.js
 delete mode 100644 examples/parallax-example/components/ShapeField/ShapeField.scss
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-01-hemi-left.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-01-hemi-right.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-01-rect.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-02-hemi.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-02-triangle-big.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-02-triangle-small.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-02-triangle.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-03-triangle-big.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-03-triangle-bottom.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-03-triangle-top.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-04-hemi-right.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-04-square.svg
 delete mode 100644 examples/parallax-example/components/ShapeField/cluster-04-triangle.svg
 delete mode 100644 examples/parallax-example/components/Svg/Svg.js
 delete mode 100644 examples/parallax-example/components/Svg/Svg.scss
 delete mode 100644 examples/parallax-example/components/TriangleGrid/TriangleGrid.js
 delete mode 100644 examples/parallax-example/components/TriangleGrid/TriangleGrid.scss
 delete mode 100644 examples/parallax-example/components/TriangleGrid/grid-purple.svg
 delete mode 100644 examples/parallax-example/components/TriangleGrid/grid-white.svg
 delete mode 100644 examples/parallax-example/components/index.js
 delete mode 100644 examples/parallax-example/components/shared/angle-dark-top.svg
 delete mode 100644 examples/parallax-example/components/shared/divider.svg
 delete mode 100644 examples/parallax-example/components/shared/dot-pattern.svg
 delete mode 100644 examples/parallax-example/components/shared/noise-pattern.svg
 delete mode 100644 examples/parallax-example/index.html
 delete mode 100644 examples/parallax-example/server.js
 delete mode 100644 examples/parallax-example/styles/colors.scss

diff --git a/examples/parallax-test/client.js b/example/client.js
similarity index 100%
rename from examples/parallax-test/client.js
rename to example/client.js
diff --git a/examples/parallax-test/components/ParallaxTest/ParallaxTest.js b/example/components/ParallaxTest/ParallaxTest.js
similarity index 100%
rename from examples/parallax-test/components/ParallaxTest/ParallaxTest.js
rename to example/components/ParallaxTest/ParallaxTest.js
diff --git a/examples/parallax-test/components/ParallaxTest/ParallaxTest.scss b/example/components/ParallaxTest/ParallaxTest.scss
similarity index 100%
rename from examples/parallax-test/components/ParallaxTest/ParallaxTest.scss
rename to example/components/ParallaxTest/ParallaxTest.scss
diff --git a/examples/parallax-test/components/index.js b/example/components/index.js
similarity index 100%
rename from examples/parallax-test/components/index.js
rename to example/components/index.js
diff --git a/examples/parallax-test/index.html b/example/index.html
similarity index 100%
rename from examples/parallax-test/index.html
rename to example/index.html
diff --git a/examples/parallax-test/server.js b/example/server.js
similarity index 100%
rename from examples/parallax-test/server.js
rename to example/server.js
diff --git a/examples/parallax-example/client.js b/examples/parallax-example/client.js
deleted file mode 100644
index 5054b2d9b..000000000
--- a/examples/parallax-example/client.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import 'babel-polyfill';
-import React from 'react';
-import ReactDOM from 'react-dom';
-import { ParallaxExample } from 'components';
-import { ParallaxController } from 'react-scroll-parallax';
-
-ParallaxController.init();
-
-const root = document.getElementById('root');
-
-ReactDOM.render(<ParallaxExample />, root);
diff --git a/examples/parallax-example/components/Intro/Intro.js b/examples/parallax-example/components/Intro/Intro.js
deleted file mode 100644
index f0d0b9cc0..000000000
--- a/examples/parallax-example/components/Intro/Intro.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import React from 'react';
-import style from './Intro.scss';
-import { Svg } from 'components';
-import { Parallax } from 'react-scroll-parallax';
-import ring from '!!raw-loader!./ring-of-dots.svg';
-import hemispheres from '!!raw-loader!./hemispheres.svg';
-
-const Intro = () => (
-    <div className={style.root}>
-        <div className={style.container}>
-            <Parallax offsetYMin={-100} offsetYMax={100} className={style.ring}>
-                <Svg svg={ring} />
-            </Parallax>
-            <Parallax offsetYMin={-50} offsetYMax={50} className={style.circle}>
-                <div className={style.circleInner} />
-            </Parallax>
-            <Svg className={style.hemispheres} svg={hemispheres} />
-        </div>
-        <p className={style.scroll}>Scroll</p>
-    </div>
-);
-
-export default Intro;
diff --git a/examples/parallax-example/components/Intro/Intro.scss b/examples/parallax-example/components/Intro/Intro.scss
deleted file mode 100644
index 4c611d6b8..000000000
--- a/examples/parallax-example/components/Intro/Intro.scss
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// Intro
-// ---------------------------
-
-@import '../../styles/colors';
-
-:local(.root) {
-    display: flex;
-    flex-flow: row wrap;
-    align-items: center;
-    justify-content: center;
-    height: 100vh;
-}
-
-:local(.scroll) {
-    position: absolute;
-    bottom: 5em;
-    left: 50%;
-    transform: translateX(-50%);
-    color: $plum;
-    font-weight: 500;
-}
-
-:local(.container) {
-    position: relative;
-    width: 25em;
-}
-
-:local(.ring) {
-    position: relative;
-    z-index: 2;
-}
-
-:local(.circle) {
-    position: absolute;
-    top: 15%;
-    left: 15%;
-    width: 70%;
-    height: 70%;
-    z-index: 1;
-
-    .parallax-inner {
-        position: absolute;
-        top: 0;
-        left: 0;
-        width: 100%;
-        height: 100%;
-        border: 3px solid $plum;
-        border-radius: 50%;
-    }
-}
-
-:local(.circleInner) {
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    border: 3px solid $plum;
-    border-radius: 50%;
-}
-
-:local(.hemispheres) {
-    position: absolute;
-    top: 25%;
-    left: 25%;
-    width: 50%;
-}
diff --git a/examples/parallax-example/components/Intro/hemispheres.svg b/examples/parallax-example/components/Intro/hemispheres.svg
deleted file mode 100644
index 8d9198dd8..000000000
--- a/examples/parallax-example/components/Intro/hemispheres.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 184.2 184.2" enable-background="new 0 0 184.2 184.2" xml:space="preserve">
-<path fill="#FBFBFB" d="M92.1,184.2c50.9,0,92.1-41.2,92.1-92.1S143,0,92.1,0V184.2z"/>
-<path fill="#A179AF" d="M92.1,184.2C41.2,184.2,0,143,0,92.1S41.2,0,92.1,0V184.2z"/>
-</svg>
diff --git a/examples/parallax-example/components/Intro/ring-of-dots.svg b/examples/parallax-example/components/Intro/ring-of-dots.svg
deleted file mode 100644
index 29fffe153..000000000
--- a/examples/parallax-example/components/Intro/ring-of-dots.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 402.4 402.4" enable-background="new 0 0 402.4 402.4" xml:space="preserve">
-	<path fill="url(#dot-pattern)" d="M201.2,0C90.1,0,0,90.1,0,201.2s90.1,201.2,201.2,201.2s201.2-90.1,201.2-201.2S312.4,0,201.2,0
-		z M201.2,366.5c-91.3,0-165.3-74-165.3-165.3s74-165.3,165.3-165.3s165.3,74,165.3,165.3S292.5,366.5,201.2,366.5z"/>
-</svg>
diff --git a/examples/parallax-example/components/IntroCopy/IntroCopy.js b/examples/parallax-example/components/IntroCopy/IntroCopy.js
deleted file mode 100644
index 45431ee45..000000000
--- a/examples/parallax-example/components/IntroCopy/IntroCopy.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import React from 'react';
-import style from './IntroCopy.scss';
-import { Parallax } from 'react-scroll-parallax';
-
-// function modulo(a, b) {
-//     return ((a % b) + b) % b;
-// }
-// const modulo = copy.length % 2;
-
-const copy = 'Parallax'.split('');
-
-const IntroCopy = () => (
-    <div className={style.root}>
-        <div className={style.barTop} />
-        <h1 className={style.copy}>
-            {copy.map((letter, i) => (
-                <Parallax
-                    key={`copy-${i}`}
-                    offsetXMax={100 * (i - 3)}
-                    className={style.letter}
-                >
-                    {letter}
-                </Parallax>
-            ))}
-        </h1>
-        <div className={style.barBottom} />
-    </div>
-);
-
-export default IntroCopy;
diff --git a/examples/parallax-example/components/IntroCopy/IntroCopy.scss b/examples/parallax-example/components/IntroCopy/IntroCopy.scss
deleted file mode 100644
index fedfc89f6..000000000
--- a/examples/parallax-example/components/IntroCopy/IntroCopy.scss
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// Intro Copy
-// ---------------------------
-
-@import '../../styles/colors';
-
-:local(.root) {
-    display: flex;
-    flex-flow: column wrap;
-    align-items: space-around;
-    justify-content: center;
-    align-items: center;
-    height: 50vh;
-}
-
-:local(.copy) {
-    margin: 0.2em 0;
-    text-align: center;
-}
-
-:local(.barTop) {
-    margin-left: 0.8em;
-    width: 20em;
-    height: 1.5em;
-    border-top: 0.45em solid $purple;
-    border-bottom: 0.45em solid $purple;
-    transform: skew(-10deg);
-}
-
-:local(.barBottom) {
-    composes: barTop;
-    margin-left: 0;
-    margin-right: 0.8em;
-}
-
-:local(.letter) {
-    display: inline-block;
-}
diff --git a/examples/parallax-example/components/Marquee/Marquee.js b/examples/parallax-example/components/Marquee/Marquee.js
deleted file mode 100644
index 16dc49c72..000000000
--- a/examples/parallax-example/components/Marquee/Marquee.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import React from 'react';
-import style from './Marquee.scss';
-import { Svg } from 'components';
-import { Parallax } from 'react-scroll-parallax';
-import boxBg from '!!raw-loader!./box-bg.svg';
-import boxOutline from '!!raw-loader!./box-outline.svg';
-import divider from '!!raw-loader!../shared/divider.svg';
-
-const Marquee = () => (
-    <div className={style.root}>
-        <Svg svg={divider} className={style.divider} />
-        <div className={style.container}>
-            <Svg svg={boxBg} className={style.boxBg} />
-            <Parallax
-                className={style.text}
-                offsetYMax={70}
-                offsetYMin={-70}
-                offsetXMax={-30}
-                offsetXMin={30}
-            >
-                <h1>
-                    Horizontal
-                </h1>
-            </Parallax>
-            <Parallax
-                className={style.boxOutline}
-                offsetYMax={35}
-                offsetYMin={-35}
-            >
-                <Svg svg={boxOutline} />
-            </Parallax>
-        </div>
-    </div>
-);
-
-export default Marquee;
diff --git a/examples/parallax-example/components/Marquee/Marquee.scss b/examples/parallax-example/components/Marquee/Marquee.scss
deleted file mode 100644
index 68eaff9ce..000000000
--- a/examples/parallax-example/components/Marquee/Marquee.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// Marquee
-// ---------------------------
-
-@import '../../styles/colors';
-
-:local(.root) {
-    position: relative;
-    display: flex;
-    flex-flow: column wrap;
-    justify-content: space-between;
-    align-items: center;
-    min-height: 50vh;
-    margin-bottom: 50vh;
-}
-
-:local(.divider) {
-    display: block;
-    width: 100%;
-    margin-top: 25vh;
-    margin-bottom: 25vh;
-}
-
-:local(.container) {
-    position: relative;
-    width: 40em;
-}
-
-:local(.boxOutline) {
-    position: absolute;
-    top: 20%;
-    right: 7%;
-    width: 100%;
-    height: 100%;
-    z-index: 1;
-}
-
-:local(.boxBg) {
-    width: 100%;
-}
-
-:local(.text) {
-    position: absolute;
-    top: 28%;
-    left: 0;
-    width: 100%;
-    text-align: center;
-}
diff --git a/examples/parallax-example/components/Marquee/box-bg.svg b/examples/parallax-example/components/Marquee/box-bg.svg
deleted file mode 100644
index d6f8cefb7..000000000
--- a/examples/parallax-example/components/Marquee/box-bg.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 930 288" enable-background="new 0 0 930 288" xml:space="preserve">
-	<polygon fill="url(#noise-pattern)" points="878.9,288 0,288 51.1,0 930,0 "/>
-</svg>
diff --git a/examples/parallax-example/components/Marquee/box-outline.svg b/examples/parallax-example/components/Marquee/box-outline.svg
deleted file mode 100644
index 7f235e5c1..000000000
--- a/examples/parallax-example/components/Marquee/box-outline.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 946 301" enable-background="new 0 0 946 301" xml:space="preserve">
-<g>
-	<polygon fill="#3D3547" points="892.3,301 0.2,301 53.7,0 64.6,13 15.8,288 881.4,288 	"/>
-</g>
-<g>
-	<polygon fill="#FFFFFF" points="892.3,301 881.4,288 930.2,13 64.6,13 53.7,0 945.8,0 	"/>
-</g>
-</svg>
diff --git a/examples/parallax-example/components/Overlap/Overlap.js b/examples/parallax-example/components/Overlap/Overlap.js
deleted file mode 100644
index 5692215a5..000000000
--- a/examples/parallax-example/components/Overlap/Overlap.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import React from 'react';
-import style from './Overlap.scss';
-import { Svg } from 'components';
-import { Parallax } from 'react-scroll-parallax';
-import circle from '!!raw-loader!./circle.svg';
-import circleRings from '!!raw-loader!./circle-rings.svg';
-
-const Overlap = () => (
-    <div className={style.root}>
-        <div className={style.container}>
-            <Parallax
-                offsetYMax={150}
-                offsetYMin={-50}
-                offsetXMax={-40}
-                offsetXMin={20}
-                className={style.circle}
-            >
-                <Svg svg={circle} />
-            </Parallax>
-            <Parallax
-                offsetYMax={150}
-                offsetYMin={-50}
-                offsetXMax={40}
-                offsetXMin={-20}
-                className={style.circleRings}
-            >
-                <Svg svg={circleRings} />
-            </Parallax>
-        </div>
-    </div>
-);
-
-export default Overlap;
diff --git a/examples/parallax-example/components/Overlap/Overlap.scss b/examples/parallax-example/components/Overlap/Overlap.scss
deleted file mode 100644
index 1da0cd5f9..000000000
--- a/examples/parallax-example/components/Overlap/Overlap.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-//
-// Intro Copy
-// ---------------------------
-
-@import '../../styles/colors';
-
-:local(.root) {
-    position: relative;
-    display: flex;
-    flex-flow: column wrap;
-    align-items: space-around;
-    justify-content: center;
-    align-items: center;
-    paddin-top: 25vh;
-    z-index: 1;
-}
-
-:local(.container) {
-    position: relative;
-    width: 30em;
-}
-
-:local(.circle) {
-}
-
-:local(.circleRings) {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-}
\ No newline at end of file
diff --git a/examples/parallax-example/components/Overlap/circle-rings.svg b/examples/parallax-example/components/Overlap/circle-rings.svg
deleted file mode 100644
index 9244b6168..000000000
--- a/examples/parallax-example/components/Overlap/circle-rings.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 550 550" style="enable-background:new 0 0 550 550;" xml:space="preserve">
-	<path fill="#FBFCFC" d="M276.1,25l-86.3,485.1c26.6,9.6,55.3,14.9,85.2,14.9c138.1,0,250-111.9,250-250C525,137.3,413.7,25.6,276.1,25
-		z"/>
-	<g fill="#FFFFFF">
-		<path d="M73.3,273.5c0,81.3,50.1,155.1,125.4,186.1l0.7-4C126,424.9,77.3,352.9,77.3,273.5
-			c0-106.2,84.4-193.1,189.7-197.2l0.7-4C159.9,76,73.3,164.8,73.3,273.5z"/>
-		<path d="M101.6,272.7c0-91.4,71.2-166.5,161.1-172.6l0.7-4C171,101.9,97.7,178.9,97.7,272.7
-			c0,69.5,41.9,132.8,105.6,161.4l0.7-4C142.2,402,101.6,340.4,101.6,272.7z"/>
-		<path d="M249.6,173.6l0.8-4.3c-45.6,11.1-79.7,52.3-79.7,101.3c0,21.6,7.2,42.5,20.7,60.5
-			c7.2,9.5,15.9,17.8,25.8,24.6l0.8-4.3c-8.9-6.3-16.8-14-23.4-22.7c-13-17.3-19.9-37.4-19.9-58.1
-			C174.7,224,206.6,184.8,249.6,173.6z"/>
-		<path d="M126,272c0-76.5,58.1-139.7,132.4-147.9l0.7-4.1c-76.9,7.8-137.1,73-137.1,152c0,57.7,33.8,110.5,85.8,136.5
-			l0.7-4.1C158.5,378.9,126,327.8,126,272z"/>
-		<path d="M190.5,506.1c-47-17.1-87.2-47.7-116.3-88.5c-29.8-41.8-45.6-91.1-45.6-142.7c0-65.7,25.6-127.4,72-173.9
-			C147,54.6,208.8,29,274.5,29l0.9,0l0.2-1l0-3l-0.5,0c-0.2,0-0.4,0-0.6,0C207.7,25,145,51,97.8,98.2S24.6,208.2,24.6,274.9
-			c0,52.4,16,102.5,46.3,145c29.7,41.6,70.6,72.7,118.4,90l1-2.8L190.5,506.1z"/>
-		<path d="M244.9,200.1l0.8-4.6c-29.6,11.7-50.6,40.6-50.6,74.3c0,21.7,10.4,42.7,27.1,57.8l0.8-4.6
-			c-14.9-14.2-24-33.4-24-53.2C199.1,238.7,218,211.8,244.9,200.1z"/>
-		<path d="M48.9,274.2c0,47.2,14.5,92.5,42.1,130.9c26.1,36.4,61.7,63.9,103.2,79.8l0.7-4
-			c-40.5-15.7-75.3-42.6-100.7-78.2c-27-37.7-41.3-82.2-41.3-128.6c0-59.2,23.1-114.9,64.9-156.7c41.1-41.1,95.4-64,153.3-64.9
-			l0.7-4c-59.3,0.7-114.9,24.1-156.9,66C72.4,157.3,48.9,213.9,48.9,274.2z"/>
-		<path d="M174.6,343.5c-15.8-21.4-24.2-46.3-24.2-72.2c0-61.6,44.9-112.8,103.7-122.8l0.7-4.1
-			c-61.4,9.6-108.4,62.9-108.4,126.9c0,26.7,8.6,52.5,25,74.6c11,14.8,25.1,27.3,41.1,36.5l0.7-4.1
-			C198.2,369.3,184.9,357.5,174.6,343.5z"/>
-	</g>
-</svg>
diff --git a/examples/parallax-example/components/Overlap/circle.svg b/examples/parallax-example/components/Overlap/circle.svg
deleted file mode 100644
index cd9b5ce59..000000000
--- a/examples/parallax-example/components/Overlap/circle.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 550 550" enable-background="new 0 0 550 550" xml:space="preserve">
-	<circle fill="url(#dot-pattern)" cx="275" cy="275" r="250"/>
-</svg>
diff --git a/examples/parallax-example/components/ParallaxExample/ParallaExample.scss b/examples/parallax-example/components/ParallaxExample/ParallaExample.scss
deleted file mode 100644
index ff97e6b93..000000000
--- a/examples/parallax-example/components/ParallaxExample/ParallaExample.scss
+++ /dev/null
@@ -1,77 +0,0 @@
-@import '../../styles/colors';
-
-:local(.root) {
-    background-color: $tan;
-}
-
-:global {
-    body {
-        margin: 0;
-        font-family: 'Roboto Mono', san-serif;
-        color: $tan;
-        font-size: 12px;
-        font-weight: 300;
-    }
-
-    h1 {
-        text-transform: uppercase;
-        font-size: 4em;
-        font-weight: 700;
-        font-style: italic;
-        letter-spacing: 0.3em;
-        color: $plum;
-    }
-
-    code {
-        font-family: 'Roboto Mono', san-serif;
-        background-color: lighten($plum, 10%);
-        padding: 0.2em 0.4em;
-        border-radius: 3px;
-    }
-
-    p {
-        margin: 2em 0;
-        font-size: 1.2em;
-    }
-
-    * {
-        box-sizing: border-box;
-    }
-
-    a {
-        color: $tan;
-        text-decoration: none;
-        &:hover {
-            color: $purple;
-        }
-    }
-
-    hr {
-        width: 100%;
-        height: 3em;
-        background-color: #fff;
-        border: none;
-    }
-
-    .btn {
-        display: inline-block;
-        border: 2px solid $purple;
-        padding: 0.6em 1em;
-        color: $purple;
-        font-weight: 500;
-
-        &:hover {
-            background-color: $purple;
-            color: $tan;
-        }
-    }
-
-    .visually-hidden {
-        position: absolute;
-        top: 0;
-        left: 0;
-        height: 0;
-        width: 0;
-        overflow: hidden;
-    }
-}
diff --git a/examples/parallax-example/components/ParallaxExample/ParallaxExample.js b/examples/parallax-example/components/ParallaxExample/ParallaxExample.js
deleted file mode 100644
index 726b5bce4..000000000
--- a/examples/parallax-example/components/ParallaxExample/ParallaxExample.js
+++ /dev/null
@@ -1,36 +0,0 @@
-import React, { Component } from 'react';
-import {
-    Intro,
-    IntroCopy,
-    Marquee,
-    TriangleGrid,
-    Overlap,
-    Svg,
-    ShapeField,
-} from 'components';
-
-import style from './ParallaExample.scss';
-
-import noisePattern from '!!raw-loader!../shared/noise-pattern.svg';
-import dotPattern from '!!raw-loader!../shared/dot-pattern.svg';
-
-export default class ParallaxExample extends Component {
-    render() {
-        return (
-            <div className={style.root}>
-                <Intro />
-                <IntroCopy />
-                <ShapeField />
-                <Marquee />
-                <Overlap />
-                <TriangleGrid />
-
-                {/** Shared SVG patterns */}
-                <div className="visually-hidden">
-                    <Svg svg={noisePattern} />
-                    <Svg svg={dotPattern} />
-                </div>
-            </div>
-        );
-    }
-}
diff --git a/examples/parallax-example/components/ShapeField/ShapeField.js b/examples/parallax-example/components/ShapeField/ShapeField.js
deleted file mode 100644
index 47a2ca7d9..000000000
--- a/examples/parallax-example/components/ShapeField/ShapeField.js
+++ /dev/null
@@ -1,112 +0,0 @@
-import React, { Component } from 'react';
-import { Parallax } from 'react-scroll-parallax';
-import { Svg } from 'components';
-
-import style from './ShapeField.scss';
-
-import cluster01HemiLeft from '!!raw-loader!./cluster-01-hemi-left.svg';
-import cluster01HemiRight from '!!raw-loader!./cluster-01-hemi-right.svg';
-import cluster01Rect from '!!raw-loader!./cluster-01-rect.svg';
-
-import cluster02Hemi from '!!raw-loader!./cluster-02-hemi.svg';
-import cluster02TriangleBig from '!!raw-loader!./cluster-02-triangle-big.svg';
-import cluster02TriangleSmall
-    from '!!raw-loader!./cluster-02-triangle-small.svg';
-
-import cluster03TriangleTop from '!!raw-loader!./cluster-03-triangle-top.svg';
-import cluster03TriangleBottom
-    from '!!raw-loader!./cluster-03-triangle-bottom.svg';
-import cluster03TriangleBig from '!!raw-loader!./cluster-03-triangle-big.svg';
-
-import cluster04Triangle from '!!raw-loader!./cluster-04-triangle.svg';
-import cluster04Square from '!!raw-loader!./cluster-04-square.svg';
-import cluster04HemiRight from '!!raw-loader!./cluster-04-hemi-right.svg';
-
-export default class ShapeField extends Component {
-    render() {
-        return (
-            <div className={style.root}>
-
-                <div className={style.shapeCluster01}>
-                    <Parallax
-                        offsetYMax={100}
-                        offsetYMin={-100}
-                        className="hemi-left"
-                        slowerScrollRate
-                    >
-                        <Svg svg={cluster01HemiLeft} />
-                    </Parallax>
-                    <Svg svg={cluster01Rect} />
-                    <Parallax
-                        offsetYMax={100}
-                        offsetYMin={-100}
-                        className="hemi-right"
-                    >
-                        <Svg svg={cluster01HemiRight} />
-                    </Parallax>
-                </div>
-
-                <div className={style.shapeCluster02}>
-                    <Svg svg={cluster02Hemi} className="hemi" />
-                    <Parallax
-                        offsetYMax={30}
-                        offsetYMin={-30}
-                        className="triangle-big"
-                    >
-                        <Svg svg={cluster02TriangleBig} />
-                    </Parallax>
-                    <Parallax
-                        offsetYMax={30}
-                        offsetYMin={-30}
-                        className="triangle-small"
-                        slowerScrollRate
-                    >
-                        <Svg svg={cluster02TriangleSmall} />
-                    </Parallax>
-                </div>
-
-                <div className={style.shapeCluster03}>
-                    <Parallax
-                        offsetYMax={60}
-                        offsetYMin={-20}
-                        className="triangle-top"
-                        slowerScrollRate
-                    >
-                        <Svg svg={cluster03TriangleTop} />
-                    </Parallax>
-
-                    <Svg
-                        svg={cluster03TriangleBottom}
-                        className="triangle-top"
-                    />
-                    <Parallax
-                        offsetYMax={60}
-                        offsetYMin={-60}
-                        className="triangle-big"
-                    >
-                        <Svg svg={cluster03TriangleBig} />
-                    </Parallax>
-                </div>
-
-                <div className={style.shapeCluster04}>
-                    <Svg svg={cluster04Square} className="square" />
-                    <Parallax
-                        offsetYMax={60}
-                        offsetYMin={-60}
-                        className="triangle"
-                    >
-                        <Svg svg={cluster04Triangle} />
-                    </Parallax>
-                    <Parallax
-                        offsetYMax={30}
-                        offsetYMin={-30}
-                        className="hemi-right"
-                    >
-                        <Svg svg={cluster04HemiRight} />
-                    </Parallax>
-                </div>
-
-            </div>
-        );
-    }
-}
diff --git a/examples/parallax-example/components/ShapeField/ShapeField.scss b/examples/parallax-example/components/ShapeField/ShapeField.scss
deleted file mode 100644
index e7326b6b1..000000000
--- a/examples/parallax-example/components/ShapeField/ShapeField.scss
+++ /dev/null
@@ -1,110 +0,0 @@
-@import '../../styles/colors';
-
-:local(.root) {
-    position: relative;
-    margin-top: 25vh;
-    height: 75vh;
-}
-
-:local(.shapeCluster01) {
-    position: absolute;
-    top: 0%;
-    left: 40%;
-    width: 8em;
-
-    .hemi-left {
-        position: absolute;
-        right: 0;
-        top: 0;
-        width: 50%;
-    }
-
-    .hemi-right {
-        position: absolute;
-        left: 0;
-        bottom: 0;
-        width: 50%;
-    }
-}
-
-:local(.shapeCluster02) {
-    position: absolute;
-    left: 5%;
-    top: 25%;
-    width: 18em;
-    height: 30em;
-
-    .triangle-big {
-        position: absolute;
-        left: 0;
-        top: 20%;
-        width: 60%;
-    }
-
-    .triangle-small {
-        position: absolute;
-        right: 0;
-        top: 0;
-        width: 60%;
-    }
-
-    .hemi {
-        position: absolute;
-        right: 0;
-        bottom: 30%;
-        width: 40%;
-    }
-}
-
-:local(.shapeCluster03) {
-    position: absolute;
-    top: 90%;
-    left: 45%;
-    width: 17em;
-    height: 10em;
-
-    .triangle-top {
-        position: absolute;
-        left: 0;
-        bottom: 0;
-        width: 100%;
-    }
-    .triangle-bottom {
-        position: absolute;
-        left: 0;
-        bottom: 0;
-        width: 100%;
-    }
-    .triangle-big {
-        position: absolute;
-        left: 0;
-        bottom: 0;
-        width: 80%;
-    }
-}
-
-:local(.shapeCluster04) {
-    position: absolute;
-    top: 25%;
-    right: 5%;
-    width: 16em;
-
-    .triangle {
-        position: absolute;
-        width: 66.666%;
-        top: 0;
-        left: 0;
-    }
-    .square {
-        position: absolute;
-        width: 66.666%;
-        right: 0;
-        top: 0;
-    }
-    .hemi-right {
-        position: absolute;
-        width: 33.333%;
-        right: 0;
-        top: 0;
-    }
-}
diff --git a/examples/parallax-example/components/ShapeField/cluster-01-hemi-left.svg b/examples/parallax-example/components/ShapeField/cluster-01-hemi-left.svg
deleted file mode 100644
index 32ce6ffba..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-01-hemi-left.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 72 144" style="enable-background:new 0 0 72 144;" xml:space="preserve">
-	<path fill="#FBFBFB" d="M72,144c-39.8,0-72-32.2-72-72S32.2,0,72,0V144z"/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-01-hemi-right.svg b/examples/parallax-example/components/ShapeField/cluster-01-hemi-right.svg
deleted file mode 100644
index 136d46b18..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-01-hemi-right.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 72 144" style="enable-background:new 0 0 72 144;" xml:space="preserve">
-	<path fill="#3D3547" d="M0,0c39.8,0,72,32.2,72,72s-32.2,72-72,72V0z"/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-01-rect.svg b/examples/parallax-example/components/ShapeField/cluster-01-rect.svg
deleted file mode 100644
index 988590244..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-01-rect.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 150 228" style="enable-background:new 0 0 150 228;" xml:space="preserve">
-	<rect fill="url(#noise-pattern)" width="150" height="228"/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-02-hemi.svg b/examples/parallax-example/components/ShapeField/cluster-02-hemi.svg
deleted file mode 100644
index 421f1c5c0..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-02-hemi.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 91.8 183.7" style="enable-background:new 0 0 91.8 183.7;" xml:space="preserve">
-	<path fill="#3D3547" d="M0,0l0,183.7c50.7,0,91.8-41.1,91.8-91.8S50.7,0,0,0"/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-02-triangle-big.svg b/examples/parallax-example/components/ShapeField/cluster-02-triangle-big.svg
deleted file mode 100644
index 51711b0ce..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-02-triangle-big.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 176.8 274" style="enable-background:new 0 0 176.8 274;" xml:space="preserve">
-	<polygon fill="url(#noise-pattern)" points="176.8,274 0,0 176.8,0 "/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-02-triangle-small.svg b/examples/parallax-example/components/ShapeField/cluster-02-triangle-small.svg
deleted file mode 100644
index 7448f01fd..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-02-triangle-small.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 182.2 182.2" style="enable-background:new 0 0 182.2 182.2;" xml:space="preserve">
-	<polygon fill="#FBFBFB" points="182.2,182.2 0,182.2 182.2,0 "/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-02-triangle.svg b/examples/parallax-example/components/ShapeField/cluster-02-triangle.svg
deleted file mode 100644
index 0d1e7a166..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-02-triangle.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 176.8 274" style="enable-background:new 0 0 176.8 274;" xml:space="preserve">
-	<polygon fill="#3D3547" points="176.8,274 0,0 176.8,0 "/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-03-triangle-big.svg b/examples/parallax-example/components/ShapeField/cluster-03-triangle-big.svg
deleted file mode 100644
index f4bdaf38c..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-03-triangle-big.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 266.2 517.8" style="enable-background:new 0 0 266.2 517.8;" xml:space="preserve">
-<polygon fill="url(#noise-pattern)" points="266.2,0 266.2,517.8 0,517.8 "/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-03-triangle-bottom.svg b/examples/parallax-example/components/ShapeField/cluster-03-triangle-bottom.svg
deleted file mode 100644
index 60503366d..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-03-triangle-bottom.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 332 332" style="enable-background:new 0 0 332 332;" xml:space="preserve">
-<polygon fill="#FBFBFB" points="332,0 332,332 0,332 "/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-03-triangle-top.svg b/examples/parallax-example/components/ShapeField/cluster-03-triangle-top.svg
deleted file mode 100644
index 701a351a7..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-03-triangle-top.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 332 332" style="enable-background:new 0 0 332 332;" xml:space="preserve">
-	<polygon fill="#3D3547" points="0,332 0,0 332,0 "/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-04-hemi-right.svg b/examples/parallax-example/components/ShapeField/cluster-04-hemi-right.svg
deleted file mode 100644
index d2503a3a4..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-04-hemi-right.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 113.8 227.6" style="enable-background:new 0 0 113.8 227.6;" xml:space="preserve">
-	<path fill="#FBFBFB" d="M0,0l0,227.6c62.9,0,113.8-51,113.8-113.8S62.9,0,0,0z"/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-04-square.svg b/examples/parallax-example/components/ShapeField/cluster-04-square.svg
deleted file mode 100644
index d1a729cb3..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-04-square.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 227.6 227.6" style="enable-background:new 0 0 227.6 227.6;" xml:space="preserve">
-	<rect fill="#3D3547" width="227.6" height="227.6"/>
-</svg>
diff --git a/examples/parallax-example/components/ShapeField/cluster-04-triangle.svg b/examples/parallax-example/components/ShapeField/cluster-04-triangle.svg
deleted file mode 100644
index 7b820a88b..000000000
--- a/examples/parallax-example/components/ShapeField/cluster-04-triangle.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 221 342.4" style="enable-background:new 0 0 221 342.4;" xml:space="preserve">
-	<polygon fill="url(#noise-pattern)" points="221,342.4 0,0 221,0 "/>
-</svg>
diff --git a/examples/parallax-example/components/Svg/Svg.js b/examples/parallax-example/components/Svg/Svg.js
deleted file mode 100644
index a9535d555..000000000
--- a/examples/parallax-example/components/Svg/Svg.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import React from 'react';
-import PropTypes from 'react-proptypes';
-import style from './Svg.scss';
-
-export default function Svg(props) {
-    const Element = props.el;
-    const className =
-        `svg-container ${style.root}` +
-        (props.className ? ` ${props.className}` : '');
-
-    return (
-        <Element
-            style={props.style}
-            className={className}
-            dangerouslySetInnerHTML={{ __html: props.svg }}
-        />
-    );
-}
-
-Svg.propTypes = {
-    className: PropTypes.string,
-    el: PropTypes.string.isRequired,
-    style: PropTypes.object,
-    svg: PropTypes.string.isRequired,
-};
-
-Svg.defaultProps = {
-    el: 'span',
-};
diff --git a/examples/parallax-example/components/Svg/Svg.scss b/examples/parallax-example/components/Svg/Svg.scss
deleted file mode 100644
index 763049195..000000000
--- a/examples/parallax-example/components/Svg/Svg.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-//
-// Svg
-// ---------------------------
-
-:local(.root) {
-	display: block;
-	svg {
-		display: block;
-		width: 100%;
-		height: auto;
-	}
-}
\ No newline at end of file
diff --git a/examples/parallax-example/components/TriangleGrid/TriangleGrid.js b/examples/parallax-example/components/TriangleGrid/TriangleGrid.js
deleted file mode 100644
index fb1325968..000000000
--- a/examples/parallax-example/components/TriangleGrid/TriangleGrid.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import React from 'react';
-import style from './TriangleGrid.scss';
-import { Svg } from 'components';
-import { Parallax } from 'react-scroll-parallax';
-import gridPurple from '!!raw-loader!./grid-purple.svg';
-import gridWhite from '!!raw-loader!./grid-white.svg';
-import angleTop from '!!raw-loader!../shared/angle-dark-top.svg';
-
-const TriangleGrid = () => (
-    <div className={style.root}>
-        <Svg svg={angleTop} className={style.angleTop} />
-        <article className={style.copy}>
-            <p>
-                <code>npm i react-scroll-parallax</code>
-            </p>
-            <p>
-                <a
-                    className="btn"
-                    href="https://github.com/jscottsmith/react-scroll-parallax"
-                >
-                    View on GitHub
-                </a>
-            </p>
-        </article>
-        <div className={style.container}>
-            <Parallax offsetYMax={25} offsetYMin={-25}>
-                <Svg svg={gridPurple} className={style.trianglesPurple} />
-            </Parallax>
-            <Parallax
-                offsetYMax={50}
-                offsetYMin={-50}
-                offsetXMax={13}
-                offsetXMin={-13}
-            >
-                <Svg svg={gridWhite} className={style.trianglesWhite} />
-            </Parallax>
-        </div>
-    </div>
-);
-
-export default TriangleGrid;
diff --git a/examples/parallax-example/components/TriangleGrid/TriangleGrid.scss b/examples/parallax-example/components/TriangleGrid/TriangleGrid.scss
deleted file mode 100644
index 5d6d357d8..000000000
--- a/examples/parallax-example/components/TriangleGrid/TriangleGrid.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// Marquee
-// ---------------------------
-
-@import '../../styles/colors';
-
-:local(.root) {
-    position: relative;
-    display: flex;
-    flex-flow: row nowrap;
-    justify-content: flex-end;
-    align-items: center;
-    padding: 25vh 2em;
-    background-color: $plum;
-}
-
-:local(.container) {
-    position: relative;
-    width: 25em;
-    margin-right: 10vw;
-    flex-shrink: 0;
-}
-
-:local(.angleTop) {
-    position: absolute;
-    bottom: 100%;
-    left: 0;
-    right: 0;
-}
-
-:local(.copy) {
-    margin-right: 5em;
-    flex-grow: 1;
-    text-align: center;
-}
-
-:local(.trianglesPurple) {
-    position: absolute;
-    top: 0;
-    left: 0;
-    right: 0;
-}
-
-:local(.trianglesWhite) {
-    svg {
-
-    }
-}
diff --git a/examples/parallax-example/components/TriangleGrid/grid-purple.svg b/examples/parallax-example/components/TriangleGrid/grid-purple.svg
deleted file mode 100644
index 39a30a859..000000000
--- a/examples/parallax-example/components/TriangleGrid/grid-purple.svg
+++ /dev/null
@@ -1,21 +0,0 @@
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 486 712" style="enable-background:new 0 0 486 712;" xml:space="preserve">
-	<g fill="url(#noise-pattern)">
-		<polygon points="274.4,178.5 291.1,89.7 379.9,89.7 	"/>
-		<polygon points="363.1,178.5 379.9,89.7 468.6,89.7 	"/>
-		<polygon points="96.8,178.5 113.6,89.7 202.4,89.7 	"/>
-		<polygon points="185.6,178.5 202.4,89.7 291.1,89.7 	"/>
-		<polygon points="242.1,356 258.8,267.2 347.6,267.2 	"/>
-		<polygon points="330.9,356 347.6,267.2 436.4,267.2 	"/>
-		<polygon points="64.6,356 81.3,267.2 170.1,267.2 	"/>
-		<polygon points="153.3,356 170.1,267.2 258.8,267.2 	"/>
-		<polygon points="209.8,533.5 226.6,444.8 315.3,444.8 	"/>
-		<polygon points="298.6,533.5 315.3,444.8 404.1,444.8 	"/>
-		<polygon points="32.3,533.5 49,444.8 137.8,444.8 	"/>
-		<polygon points="121,533.5 137.8,444.8 226.6,444.8 	"/>
-		<polygon points="177.5,711 194.3,622.3 283,622.3 	"/>
-		<polygon points="266.3,711 283,622.3 371.8,622.3 	"/>
-		<polygon points="0,711 16.8,622.3 105.5,622.3 	"/>
-		<polygon points="88.8,711 105.5,622.3 194.3,622.3 	"/>
-	</g>
-</svg>
diff --git a/examples/parallax-example/components/TriangleGrid/grid-white.svg b/examples/parallax-example/components/TriangleGrid/grid-white.svg
deleted file mode 100644
index bb29d2039..000000000
--- a/examples/parallax-example/components/TriangleGrid/grid-white.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 486 712" enable-background="new 0 0 486 712" xml:space="preserve">
-		<polygon fill="#EDEAEA" points="308.2,0.9 291.4,89.7 202.7,89.7 		"/>
-		<polygon fill="#EDEAEA" points="218.2,0.9 201.4,89.7 112.7,89.7 		"/>
-		<polygon fill="#EDEAEA" points="396.9,0.9 380.2,89.7 291.4,89.7 		"/>
-		<polygon fill="#EDEAEA" points="485.7,0.9 468.9,89.7 380.2,89.7 		"/>
-		<polygon fill="#EDEAEA" points="275.9,178.5 259.1,267.2 170.4,267.2 		"/>
-		<polygon fill="#EDEAEA" points="185.9,178.5 169.2,267.2 80.4,267.2 		"/>
-		<polygon fill="#EDEAEA" points="364.7,178.5 347.9,267.2 259.1,267.2 		"/>
-		<polygon fill="#EDEAEA" points="453.4,178.5 436.7,267.2 347.9,267.2 		"/>
-		<polygon fill="#EDEAEA" points="242.4,356 225.6,444.8 136.9,444.8 		"/>
-		<polygon fill="#EDEAEA" points="153.6,356 136.9,444.8 48.1,444.8 		"/>
-		<polygon fill="#EDEAEA" points="332.4,356 315.6,444.8 226.9,444.8 		"/>
-		<polygon fill="#EDEAEA" points="421.1,356 404.4,444.8 315.6,444.8 		"/>
-		<polygon fill="#EDEAEA" points="210.1,533.5 193.4,622.3 104.6,622.3 		"/>
-		<polygon fill="#EDEAEA" points="121.3,533.5 104.6,622.3 15.8,622.3 		"/>
-		<polygon fill="#EDEAEA" points="300.1,533.5 283.3,622.3 194.6,622.3 		"/>
-		<polygon fill="#EDEAEA" points="388.9,533.5 372.1,622.3 283.3,622.3 		"/>
-</svg>
diff --git a/examples/parallax-example/components/index.js b/examples/parallax-example/components/index.js
deleted file mode 100644
index 1d89a1470..000000000
--- a/examples/parallax-example/components/index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-export Intro from './Intro/Intro.js';
-export IntroCopy from './IntroCopy/IntroCopy.js';
-export Marquee from './Marquee/Marquee.js';
-export ParallaxExample from './ParallaxExample/ParallaxExample.js';
-export Svg from './Svg/Svg.js';
-export ShapeField from './ShapeField/ShapeField.js';
-export Overlap from './Overlap/Overlap.js';
-export TriangleGrid from './TriangleGrid/TriangleGrid.js';
diff --git a/examples/parallax-example/components/shared/angle-dark-top.svg b/examples/parallax-example/components/shared/angle-dark-top.svg
deleted file mode 100644
index 35ac0a547..000000000
--- a/examples/parallax-example/components/shared/angle-dark-top.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 1439.5 229.5" enable-background="new 0 0 1439.5 229.5" xml:space="preserve">
-<polygon fill="#3D3547" points="1440.5,230 0,229.5 1440,-0.5 "/>
-</svg>
diff --git a/examples/parallax-example/components/shared/divider.svg b/examples/parallax-example/components/shared/divider.svg
deleted file mode 100644
index 9c65d3632..000000000
--- a/examples/parallax-example/components/shared/divider.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 1440 270" enable-background="new 0 0 1440 270" xml:space="preserve">
-<polygon fill="#FFFFFF" points="1440,0 0,230 0,270 1440,40 "/>
-</svg>
diff --git a/examples/parallax-example/components/shared/dot-pattern.svg b/examples/parallax-example/components/shared/dot-pattern.svg
deleted file mode 100644
index 8557edd69..000000000
--- a/examples/parallax-example/components/shared/dot-pattern.svg
+++ /dev/null
@@ -1,543 +0,0 @@
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 144 144" style="enable-background:new 0 0 144 144;" xml:space="preserve">
-<defs>
-    <pattern id="dot-pattern" width="142" height="142" patternUnits="userSpaceOnUse">
-		<path fill="#a179af" d="M99.8,144L99.8,144l-3.7,0l0,0C97.1,143,98.8,143,99.8,144z M127.3,144h2.2C128.8,143.7,128,143.7,127.3,144z
-			 M144,10.3C144,10.3,144,10.3,144,10.3L144,10.3C144,10.3,144,10.3,144,10.3z M144,69.8v-3c-0.3,0.4-0.5,1-0.5,1.5
-			C143.5,68.8,143.7,69.3,144,69.8z M144,52.8v-3c-0.3,0.4-0.5,1-0.5,1.5C143.5,51.8,143.7,52.3,144,52.8z M42.4,10.3
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0C42.7,9,42.4,9.6,42.4,10.3z M27.6,16.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8
-			c-1-1-2.7-1-3.7,0C25.2,13,25,13.6,25,14.3c0,0.7,0.3,1.4,0.8,1.8C26.2,16.6,26.9,16.9,27.6,16.9z M28.1,8.4c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C26.7,8.1,27.4,8.4,28.1,8.4z M32.2,12c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C34.9,11,33.2,11,32.2,12z M38.5,9.4c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C37.2,9.1,37.9,9.4,38.5,9.4z M48.5,7.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C47.2,7.6,47.9,7.9,48.5,7.9z M62,5.9c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C60.7,5.7,61.3,5.9,62,5.9z M54.7,7c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C57.4,6,55.7,6,54.7,7z M53.2,12.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C55.9,11.5,54.2,11.5,53.2,12.5z
-			 M49.2,18.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.3,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8C51.9,17.5,50.2,17.5,49.2,18.5z M43,19.4c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C41.7,19.1,42.4,19.4,43,19.4z M40.7,25.6c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C39.9,24.5,40.2,25.2,40.7,25.6z M30.7,20
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C33.4,19,31.7,19,30.7,20z M37.2,26.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C39.9,25.5,38.2,25.5,37.2,26.5z
-			 M41.7,32.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C44.4,31.9,42.7,31.9,41.7,32.9z M47.7,35.5c-0.5,0.5-0.8,1.2-0.8,1.8
-			s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8
-			C50.4,34.5,48.7,34.5,47.7,35.5z M53.7,32c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C56.4,31,54.6,31,53.7,32z M52.7,25.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C55.4,24.5,53.7,24.5,52.7,25.5z
-			 M56.7,21c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.3-0.8-1.8C59.4,20,57.7,20,56.7,21z M65.2,21c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C67.9,20,66.1,20,65.2,21z M65.3,30.5c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8S65.8,30.9,65.3,30.5z
-			 M66.2,37.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.3-0.8-1.8C68.9,36.5,67.1,36.5,66.2,37.4z M58.4,39.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C58.7,38.4,58.4,39.1,58.4,39.8z M54,43.9
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C52.7,43.6,53.3,43.9,54,43.9z M71.2,32.1c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8S70.7,31.7,71.2,32.1z M60.7,14
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C63.4,13,61.7,13,60.7,14z M64.7,11.7c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C63.9,10.5,64.2,11.2,64.7,11.7z M72,5.4
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C70.6,5.2,71.3,5.4,72,5.4z M71.7,7.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8C74.4,6.5,72.6,6.5,71.7,7.5z
-			 M71.2,13.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8C73.9,12.5,72.1,12.5,71.2,13.5z M71.7,21c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8
-			C74.4,20,72.6,20,71.7,21z M80.5,8.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C79.1,8.6,79.8,8.9,80.5,8.9z M80.1,12c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			C82.9,11,81.1,11,80.1,12z M79.1,20c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C81.9,19,80.1,19,79.1,20z M79.6,29c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C82.4,28,80.6,28,79.6,29z M82.6,36
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C85.4,35,83.6,35,82.6,36z M73.2,35.5c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C75.9,34.5,74.1,34.5,73.2,35.5z M75.7,44.4
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C78.4,43.5,76.6,43.5,75.7,44.4z M67.2,43.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C69.9,43,68.1,43,67.2,43.9z M90.6,38.9
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C93.4,38,91.6,38,90.6,38.9z M88.6,32c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C91.4,31,89.6,31,88.6,32z M88.5,29.4c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C87.1,29.1,87.8,29.4,88.5,29.4z M87.1,17c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C89.9,16,88.1,16,87.1,17z M86.6,8.5
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C89.3,7.5,87.6,7.5,86.6,8.5z M88,6.4c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C86.6,6.2,87.3,6.4,88,6.4z M98,4.4c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8h-3.7c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C96.6,4.2,97.3,4.4,98,4.4z
-			 M96.5,12.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C95.1,12.6,95.8,12.9,96.5,12.9z M103.5,12.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C102.1,12.6,102.8,12.9,103.5,12.9z
-			 M103,19.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C101.6,19.6,102.3,19.9,103,19.9z M95.5,19.4c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.1,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C94.1,19.1,94.8,19.4,95.5,19.4z M94.1,24
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C96.8,23,95.1,23,94.1,24z M101.1,27.6c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C100.4,26.5,100.6,27.2,101.1,27.6z
-			 M95.6,31c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C98.3,30,96.6,30,95.6,31z M97.9,41.3c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C98.1,39.9,97.9,40.6,97.9,41.3z M102.1,45.9
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C104.8,45,103.1,45,102.1,45.9z M107.1,40.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C109.8,39.5,108.1,39.5,107.1,40.4z
-			 M104.1,33.5c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C106.8,32.5,105.1,32.5,104.1,33.5z M108.6,31.1c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8S108.1,30.7,108.6,31.1z M110.9,23.4c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C109.6,23.1,110.3,23.4,110.9,23.4z M115.3,12.8c0,0.7,0.3,1.3,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C115.6,11.5,115.3,12.1,115.3,12.8z M121.9,8.4
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C120.6,8.1,121.3,8.4,121.9,8.4z M128.4,4.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-0.2-0.2-0.5-0.4-0.8-0.5h-2.2c-0.3,0.1-0.5,0.3-0.8,0.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C127.1,4.7,127.7,4.9,128.4,4.9z M129.8,6.3c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-0.9-1-2.7-1-3.7,0C130.1,5,129.8,5.7,129.8,6.3z M122.8,12.3
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-0.9-1-2.7-1-3.7,0C123.1,11,122.8,11.6,122.8,12.3z M123.9,22.4c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C122.6,22.1,123.3,22.4,123.9,22.4z
-			 M116.6,22.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C119.3,21.5,117.6,21.5,116.6,22.5z M121.6,31.6c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8S121.1,31.2,121.6,31.6
-			z M133.5,31.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C133.2,33.2,133.5,32.5,133.5,31.8z M124.3,36.3c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C124.6,34.9,124.3,35.6,124.3,36.3z M118.1,35.5
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C120.8,34.5,119.1,34.5,118.1,35.5z M112.6,34.5c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C115.3,33.5,113.6,33.5,112.6,34.5z M115.3,44.8
-			c0,0.7,0.3,1.3,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0C115.6,43.4,115.3,44.1,115.3,44.8z M126.9,44.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C125.6,44.6,126.2,44.9,126.9,44.9z
-			 M138,44.3c0-0.7-0.3-1.4-0.8-1.8c-0.9-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.3,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C137.7,45.6,138,45,138,44.3z M137.3,35.5c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8S137.7,35.9,137.3,35.5z M126.8,23.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			C127.1,22.4,126.8,23.1,126.8,23.8z M129.1,14.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C131.8,13.5,130.1,13.5,129.1,14.5z M137.9,14.9
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C136.6,14.6,137.2,14.9,137.9,14.9z M139.9,5.4c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.3,0.8,1.8C138.6,5.2,139.2,5.4,139.9,5.4z
-			 M137.9,27.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C136.6,27.6,137.2,27.9,137.9,27.9z M139.6,30.5c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.1,0.8-1.8v0c0-0.7-0.3-1.3-0.8-1.8C142.3,29.5,140.5,29.5,139.6,30.5
-			z M108.8,10.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0C109.1,9.5,108.8,10.1,108.8,10.8z M114.4,6.4c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C113.1,6.2,113.8,6.4,114.4,6.4z
-			 M106.5,7.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C105.1,7.6,105.8,7.9,106.5,7.9z M44.7,42.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C47.4,41.5,45.7,41.5,44.7,42.4z
-			 M36.7,40.6c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8C35.9,39.5,36.2,40.1,36.7,40.6z M32.6,35.4c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C31.2,35.1,31.9,35.4,32.6,35.4z M26.2,25
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.3-0.8-1.8C28.9,24,27.2,24,26.2,25z M21.7,19.5C21.2,20,21,20.6,21,21.3c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C24.4,18.5,22.7,18.5,21.7,19.5z M28,40.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8
-			c-1-1-2.7-1-3.7,0C28.2,39.4,28,40.1,28,40.8z M33.7,43.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C36.4,42.5,34.7,42.5,33.7,43.4z M24.7,46.4
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C27.4,45.5,25.7,45.5,24.7,46.4z M19,42.3c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0C19.2,40.9,19,41.6,19,42.3z M44.7,27.5c-0.5,0.5-0.8,1.2-0.8,1.8
-			s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8
-			C47.4,26.5,45.7,26.5,44.7,27.5z M2.6,12.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0
-			C0.3,9,0,9.6,0,10.3v0.1c0,0.7,0.3,1.3,0.8,1.8C1.2,12.6,1.9,12.9,2.6,12.9z M2.5,29.3c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			C2.8,27.9,2.5,28.6,2.5,29.3z M9.1,38.4c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C7.7,38.1,8.4,38.4,9.1,38.4z M4.3,20.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C6.9,19.5,5.2,19.5,4.3,20.5z
-			 M14.7,6C14.3,6.5,14,7.1,14,7.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C17.5,5,15.7,5,14.7,6z M7.5,8.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C7.8,7.5,7.5,8.1,7.5,8.8z M8.7,13.5C8.3,14,8,14.6,8,15.3
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8
-			C11.5,12.5,9.7,12.5,8.7,13.5z M18.2,12c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8C20.9,11,19.2,11,18.2,12z M6.1,5.9c0.7,0,1.4-0.3,1.8-0.8C8.4,4.7,8.7,4,8.7,3.3
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C3.8,2,3.5,2.7,3.5,3.3c0,0.7,0.3,1.4,0.8,1.8C4.7,5.7,5.4,5.9,6.1,5.9z M10.7,23
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.3-0.8-1.8C13.5,22,11.7,22,10.7,23z M15.5,20.3c0,0.7,0.3,1.3,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C15.8,19,15.5,19.6,15.5,20.3z M16.2,30.1c0.5,0.5,1.2,0.8,1.8,0.8
-			s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			C15.5,29,15.8,29.6,16.2,30.1z M21.7,32c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C24.4,31,22.7,31,21.7,32z M13.2,35.5c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8C16,34.5,14.2,34.5,13.2,35.5z M8.2,46.4
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C11,45.5,9.2,45.5,8.2,46.4z M6.7,44.1c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0C6.3,40.9,6,41.6,6,42.3C6,43,6.3,43.6,6.7,44.1z M31.2,139.7
-			c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C30.9,141,31.2,140.3,31.2,139.7z M33.7,135.8c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C36.4,134.9,34.7,134.9,33.7,135.8z
-			 M44.7,137.8c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C47.4,136.9,45.7,136.9,44.7,137.8z M55.2,136.8c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			C57.9,135.9,56.2,135.9,55.2,136.8z M62.2,137.8c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C64.9,136.9,63.2,136.9,62.2,137.8z M72.2,136.8
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C74.9,135.9,73.1,135.9,72.2,136.8z M90.3,135c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8C89.2,135.8,89.8,135.5,90.3,135z M96.1,134.8
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C98.8,133.9,97.1,133.9,96.1,134.8z M116.1,137.8c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.3,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			C118.8,136.8,117.1,136.9,116.1,137.8z M132.1,139.3c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C134.8,138.4,133,138.4,132.1,139.3z M107.8,137.5
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C106.6,138.3,107.3,138,107.8,137.5z M20.4,137.2c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8S20.9,137.7,20.4,137.2z M12.7,138.2
-			c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C12.4,139.5,12.7,138.8,12.7,138.2z M39.9,49.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C40.2,48.4,39.9,49.1,39.9,49.8z M48.9,51.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8
-			c-1-1-2.7-1-3.7,0C49.2,50.4,48.9,51.1,48.9,51.8z M56.4,47.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C56.7,46.4,56.4,47.1,56.4,47.8z M58.4,57.6
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C57.2,58.4,57.9,58.1,58.4,57.6z M49.2,61.6c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C48.4,60.4,48.7,61.1,49.2,61.6z
-			 M42.2,56.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C44.9,55.4,43.2,55.5,42.2,56.4z M35.7,57.9c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			C38.4,56.9,36.7,57,35.7,57.9z M32.7,50.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C35.4,49.5,33.7,49.5,32.7,50.4z M32.4,59.1
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C31.3,59.9,31.9,59.6,32.4,59.1z M24.1,57.4c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C22.7,57.1,23.4,57.4,24.1,57.4z
-			 M15.7,59.6c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8C15,58.4,15.3,59.1,15.7,59.6z M13,64.3c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C13.3,62.9,13,63.6,13,64.3z M23.6,70.3
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C22.2,70.1,22.9,70.3,23.6,70.3z M29.1,65.4c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C27.7,65.1,28.4,65.4,29.1,65.4z
-			 M34.7,65.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C37.4,64.5,35.7,64.5,34.7,65.4z M30.6,74.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C29.2,74.6,29.9,74.8,30.6,74.8z M24.6,80.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C23.2,80.1,23.9,80.3,24.6,80.3z M16.2,79.4c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.3,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C19,78.4,17.2,78.4,16.2,79.4z M20.4,70.9
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8C21.2,72.1,20.9,71.4,20.4,70.9z M10.2,73.9c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C13,72.9,11.2,72.9,10.2,73.9z M10.1,69.3
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C8.7,69.1,9.4,69.3,10.1,69.3z M9.6,58.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C7.3,54.9,7,55.6,7,56.3c0,0.7,0.3,1.4,0.8,1.8C8.2,58.6,8.9,58.9,9.6,58.9z M1.8,58.4
-			C1.3,58.9,1,59.6,1,60.3c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.3-0.8-1.8C4.5,57.5,2.7,57.5,1.8,58.4z M2.1,70.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.1,0.1-0.2,0.2-0.3,0.3v3c0.1,0.1,0.2,0.2,0.3,0.3C0.8,70.6,1.4,70.8,2.1,70.8z
-			 M2.1,53.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.1,0.1-0.2,0.2-0.3,0.3v3
-			c0.1,0.1,0.2,0.2,0.3,0.3C0.8,53.6,1.4,53.9,2.1,53.9z M2.8,73.4C2.3,73.9,2,74.6,2,75.2s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C5.5,72.4,3.7,72.4,2.8,73.4z M5.6,85.3c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C3.3,81.4,3,82,3,82.7c0,0.7,0.3,1.4,0.8,1.8
-			C4.3,85,4.9,85.3,5.6,85.3z M1.5,94.7c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C1.8,93.4,1.5,94,1.5,94.7z M6.1,103.3c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C4.7,103,5.4,103.3,6.1,103.3z M11.2,94.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C14,93.9,12.2,93.9,11.2,94.9z M7,88.7c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0
-			C7.3,87.4,7,88,7,88.7z M20.2,89.7c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0C15.3,88.4,15,89,15,89.7c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C19.9,91.1,20.2,90.4,20.2,89.7z M22.6,98.3c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0C20.2,94.4,20,95,20,95.7c0,0.7,0.3,1.4,0.8,1.8
-			C21.2,98,21.9,98.3,22.6,98.3z M28.6,100.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			C26.2,96.3,26,97,26,97.7c0,0.7,0.3,1.4,0.8,1.8C27.2,100,27.9,100.3,28.6,100.3z M34.1,103.3c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C32.7,103,33.4,103.3,34.1,103.3z M26.2,87.2c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8C25.9,88.6,26.2,87.9,26.2,87.2z M33.2,89.7c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0C28.2,88.4,28,89,28,89.7c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			C32.9,91.1,33.2,90.4,33.2,89.7z M38.9,89.9c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C39.6,91,39.4,90.4,38.9,89.9z M31.1,83.3
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			C29.7,83,30.4,83.3,31.1,83.3z M40.9,80.9c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C41.6,82,41.4,81.4,40.9,80.9z M43.1,74.2
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			C42.9,75.6,43.1,74.9,43.1,74.2z M48.1,80.2c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C47.9,81.6,48.1,80.9,48.1,80.2z M49.2,77.1c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8S48.7,76.6,49.2,77.1z
-			 M45.4,86.4c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8C46.1,87.5,45.9,86.9,45.4,86.4z M52.4,90.4c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C53.1,91.5,52.8,90.9,52.4,90.4z
-			 M52.4,98.4c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8C53.1,99.5,52.8,98.8,52.4,98.4z M40.7,94.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8C43.4,93.9,41.7,93.9,40.7,94.9z
-			 M57.5,96.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C56.2,96.5,56.8,96.8,57.5,96.8z M57.2,77.9c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C59.9,76.9,58.2,76.9,57.2,77.9z
-			 M60.9,69.9c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8C61.6,71.1,61.3,70.4,60.9,69.9z M55.1,68.2c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C54.8,69.6,55.1,68.9,55.1,68.2z
-			 M45.5,70.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C44.2,70.6,44.9,70.8,45.5,70.8z M58.5,63.9c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C57.2,63.6,57.8,63.9,58.5,63.9z
-			 M63.7,73.9c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C66.4,72.9,64.6,72.9,63.7,73.9z M64.9,83.2c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C65.2,81.9,64.9,82.5,64.9,83.2z M63.4,89.6
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C62.2,90.3,62.9,90,63.4,89.6z M69.8,88.9c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C70.6,90,70.3,89.4,69.8,88.9z M74,101.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C72.6,101.5,73.3,101.8,74,101.8z M66.6,97.2c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8C66.3,98.5,66.6,97.9,66.6,97.2z
-			 M75.5,93.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C74.2,93.5,74.8,93.8,75.5,93.8z M76.8,84.1c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8C75.7,84.8,76.4,84.5,76.8,84.1z M73.5,77.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			C72.2,77.6,72.8,77.8,73.5,77.8z M62.7,68.6c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C61.9,67.4,62.2,68.1,62.7,68.6z M73.1,67.7
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8
-			C72.8,69.1,73.1,68.4,73.1,67.7z M67.8,58.4c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C68.6,59.6,68.3,58.9,67.8,58.4z M66.8,54.1
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C65.7,54.9,66.4,54.6,66.8,54.1z M70.7,50.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C73.4,50,71.6,50,70.7,50.9z
-			 M72.2,59.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C74.9,59,73.1,58.9,72.2,59.9z M80.3,70.1c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			C79.2,70.8,79.8,70.6,80.3,70.1z M87.1,73.2c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C86.8,74.6,87.1,73.9,87.1,73.2z M81.6,78.9
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C84.4,77.9,82.6,77.9,81.6,78.9z M82,90.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C80.6,90.5,81.3,90.8,82,90.8z M86,97.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C84.6,97.5,85.3,97.8,86,97.8z M92,91.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C90.6,91.5,91.3,91.8,92,91.8z M92,100.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C90.6,100.5,91.3,100.8,92,100.8z M91.5,82.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C90.1,82,90.8,82.3,91.5,82.3z M96.6,73.7c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C96.3,75.1,96.6,74.4,96.6,73.7z
-			 M90.1,65.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.3-0.3,1.8-0.8C89.8,67.1,90.1,66.4,90.1,65.8z M80.1,60.5c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8C82.9,59.5,81.1,59.5,80.1,60.5z
-			 M78.2,54.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C80.9,53.5,79.1,53.4,78.2,54.4z M84.6,50.4c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			C87.4,49.5,85.6,49.5,84.6,50.4z M86.3,46.1c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8C85.2,46.9,85.8,46.6,86.3,46.1z M95.8,47.9
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8C96.6,49.1,96.3,48.4,95.8,47.9z M88.9,58.3c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0C89.2,56.9,88.9,57.6,88.9,58.3z M98.1,64.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C97.8,66.1,98.1,65.4,98.1,64.8z M102,72.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.3,0.8,1.8C100.6,72.1,101.3,72.3,102,72.3z
-			 M104.1,77.7c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.3,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C103.8,79.1,104.1,78.4,104.1,77.7z M102.1,85.7c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C101.8,87.1,102.1,86.4,102.1,85.7z
-			 M108.8,82.4c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8C109.5,83.5,109.3,82.9,108.8,82.4z M104.6,91.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C107.3,90.4,105.6,90.4,104.6,91.4z
-			 M111.9,101.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C110.6,101.5,111.3,101.8,111.9,101.8z M111.6,80.4c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C114.3,79.4,112.6,79.4,111.6,80.4z
-			 M111.4,76.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			s0.3,1.4,0.8,1.8C110.1,76.6,110.8,76.8,111.4,76.8z M55.6,84.2c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C55.3,85.6,55.6,84.9,55.6,84.2z M140.7,64.6
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C139.6,65.4,140.3,65.1,140.7,64.6z M143.5,54.3c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C143.2,55.6,143.5,54.9,143.5,54.3z
-			 M136.3,48.9c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8C137,50.1,136.7,49.4,136.3,48.9z M136.8,67.4c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C137.5,68.6,137.2,67.9,136.8,67.4z
-			 M132.6,74.9c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C135.3,73.9,133.6,73.9,132.6,74.9z M139.6,72.4c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.1,0.8-1.8v0c0-0.7-0.3-1.3-0.8-1.8C142.3,71.4,140.5,71.4,139.6,72.4
-			z M142.5,82.2c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C142.2,83.6,142.5,82.9,142.5,82.2z M140.2,95.4c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C141,96.5,140.7,95.9,140.2,95.4z
-			 M138.2,92.1c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C137.1,92.8,137.8,92.5,138.2,92.1z M129.6,60.1c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C128.8,58.9,129.1,59.6,129.6,60.1z
-			 M121.8,58.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0C122.1,57.4,121.8,58.1,121.8,58.8z M124.6,51.1c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C123.8,50,124.1,50.6,124.6,51.1z
-			 M121.3,50.4c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8C122,51.6,121.8,50.9,121.3,50.4z M110.1,48.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.1,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C112.8,47.5,111.1,47.5,110.1,48.4z
-			 M107.6,53.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C107.3,55.1,107.6,54.4,107.6,53.8z M100.8,57.6c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8C99.6,58.4,100.3,58.1,100.8,57.6z
-			 M101.6,61.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C104.3,60.5,102.6,60.5,101.6,61.4z M113.8,60.1c0.5-0.5,0.8-1.1,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			S113.3,60.6,113.8,60.1z M116.1,66.1c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C115.3,64.9,115.6,65.6,116.1,66.1z M107.9,67.2c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			C108.1,65.9,107.9,66.6,107.9,67.2z M121,72.7c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C120.8,74.1,121,73.4,121,72.7z M127.4,68.3
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C126.1,68.1,126.7,68.3,127.4,68.3z M125.1,74.1c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C124.3,72.9,124.6,73.6,125.1,74.1z
-			 M121.4,83.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			s0.3,1.4,0.8,1.8C120.1,83,120.8,83.3,121.4,83.3z M123.9,91.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C122.6,91,123.3,91.3,123.9,91.3z
-			 M111.6,87.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C114.3,86.9,112.6,86.9,111.6,87.9z M120.8,96c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.3,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8C119.6,96.8,120.3,96.5,120.8,96z
-			 M128.1,92.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C130.8,91.9,129.1,91.9,128.1,92.9z M127.6,81.4c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			C130.3,80.4,128.6,80.4,127.6,81.4z M100.3,92.4c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C101.1,93.5,100.8,92.9,100.3,92.4z M123.8,103.5
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C122.6,104.3,123.3,104,123.8,103.5z M12.1,116.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C10.7,116,11.4,116.3,12.1,116.3z
-			 M16.7,104.7c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C16.4,106.1,16.7,105.4,16.7,104.7z M23.2,102.2c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8C22.9,103.6,23.2,102.9,23.2,102.2z
-			 M18.6,112.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C17.2,112.5,17.9,112.8,18.6,112.8z M27.4,112.3c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C28.2,113.5,27.9,112.8,27.4,112.3z
-			 M23.7,120.3c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C26.4,119.4,24.7,119.4,23.7,120.3z M17.6,121.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C16.2,121,16.9,121.3,17.6,121.3z M32.6,118.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C31.2,118.5,31.9,118.8,32.6,118.8z M33.1,124.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C31.7,124.5,32.4,124.8,33.1,124.8z M44.4,107c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			C43.2,107.8,43.9,107.5,44.4,107z M36.5,112.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C35.2,112,35.9,112.3,36.5,112.3z M43,115.3
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C41.7,115,42.4,115.3,43,115.3z M49,123.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C47.7,123.5,48.4,123.8,49,123.8z M40.9,121c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			C39.7,121.8,40.4,121.5,40.9,121z M50.5,117.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C49.2,117.5,49.8,117.8,50.5,117.8z M51.9,108
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C50.7,108.8,51.4,108.5,51.9,108z M58.5,105.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C57.2,105,57.8,105.3,58.5,105.3z
-			 M57,111.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C55.7,111,56.3,111.3,57,111.3z M61.4,114.3c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C62.1,115.5,61.8,114.8,61.4,114.3z
-			 M65.2,109.4c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C67.9,108.4,66.1,108.4,65.2,109.4z M66.5,124.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C65.1,124.5,65.8,124.8,66.5,124.8z M67.5,106.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C66.2,106.5,66.8,106.8,67.5,106.8z M74.5,110.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C73.2,110,73.8,110.3,74.5,110.3z
-			 M30.7,106.2c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C30.4,107.6,30.7,106.9,30.7,106.2z M74.3,117.5c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8C73.2,118.3,73.9,118,74.3,117.5z
-			 M7.4,124.8c-1-1-2.7-1-3.7,0C3.3,125.3,3,126,3,126.7s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8S7.9,125.3,7.4,124.8z M1.8,132.8C1.3,133.3,1,134,1,134.7c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C4.5,131.9,2.7,131.9,1.8,132.8z M19.6,131.4
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.3-0.8-1.8C22.3,130.4,20.6,130.4,19.6,131.4z M19.1,128.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C17.7,128.5,18.4,128.8,19.1,128.8z M29.4,131.5
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			C28.3,132.3,28.9,132,29.4,131.5z M35,131.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C33.7,131,34.4,131.3,35,131.3z M43.5,129.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C42.2,129.5,42.9,129.8,43.5,129.8z M43.9,131.3c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8S44.4,131.8,43.9,131.3z M53.9,137.5
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C52.7,138.3,53.4,138,53.9,137.5z M52.5,131.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C51.2,131,51.8,131.3,52.5,131.3z M63.1,133.7
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			C62.8,135,63.1,134.3,63.1,133.7z M65.2,128.8c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8s1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C67.9,127.9,66.1,127.8,65.2,128.8z M13.1,133.3c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			C11.7,133,12.4,133.3,13.1,133.3z M84.1,100.7c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C83.8,102.1,84.1,101.4,84.1,100.7z M90.1,105.2
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C89.8,106.6,90.1,105.9,90.1,105.2z M98.8,105c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8C97.7,105.8,98.3,105.5,98.8,105z
-			 M98.5,115.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C97.1,115,97.8,115.3,98.5,115.3z M90.6,116.3c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C93.4,115.4,91.6,115.4,90.6,116.3z
-			 M84.1,119.8c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C86.9,118.9,85.1,118.9,84.1,119.8z M88.3,111.3c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8C89.1,112.5,88.8,111.8,88.3,111.3z M80.1,126.3
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C82.9,125.4,81.1,125.4,80.1,126.3z M89.6,125.8c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C92.4,124.9,90.6,124.9,89.6,125.8z
-			 M96.6,128.3c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.3-0.8-1.8C99.3,127.4,97.6,127.3,96.6,128.3z M97.1,119.3c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C99.8,118.4,98.1,118.4,97.1,119.3z
-			 M2.5,118.2c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8
-			c-1-1-2.7-1-3.7,0C2.8,116.8,2.5,117.5,2.5,118.2z M4.3,110.5c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8C3.5,109.4,3.8,110.1,4.3,110.5z
-			 M136.6,132.3c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C139.3,131.4,137.5,131.4,136.6,132.3z M133.8,133c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8C132.6,133.8,133.3,133.5,133.8,133z M141.3,129.2
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0,0,0.1,0,0.1,0v-5.1c-0.7,0-1.4,0.2-1.9,0.7C141.6,127.8,141.3,128.5,141.3,129.2z
-			 M136.9,116.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-0.9-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C135.6,116.5,136.2,116.8,136.9,116.8z M137.4,106.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C136.1,106,136.7,106.3,137.4,106.3z
-			 M140.4,124.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			s0.3,1.4,0.8,1.8C139,124,139.7,124.3,140.4,124.3z M75.2,124.5c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8S74.7,124,75.2,124.5z M72.2,126.8
-			c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			s-0.3-1.4-0.8-1.8C74.9,125.9,73.1,125.8,72.2,126.8z M105.5,128.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C104.1,128.5,104.8,128.8,105.5,128.8z M115.3,127.5
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			S114.8,128,115.3,127.5z M106.3,119c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8C105.2,119.8,105.8,119.5,106.3,119z M110.4,120.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			C109.1,120.5,109.8,120.8,110.4,120.8z M106,111.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C104.6,111.5,105.3,111.8,106,111.8z M115.8,114
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8S115.3,114.5,115.8,114z M118.4,121.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C117.1,121,117.8,121.3,118.4,121.3z M124.3,125
-			c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			C123.1,125.8,123.8,125.5,124.3,125z M126,131.2c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8C125.7,132.5,126,131.8,126,131.2z M127.4,118.8c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			C126.1,118.5,126.7,118.8,127.4,118.8z M123.9,113.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8
-			c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.3,0.8,1.8C122.6,113.5,123.3,113.8,123.9,113.8z M115.4,107.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C114.1,107.5,114.8,107.8,115.4,107.8z M131.4,111.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C130.1,111,130.7,111.3,131.4,111.3z
-			 M131.9,125.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			s0.3,1.4,0.8,1.8C130.6,125.5,131.2,125.8,131.9,125.8z M105.5,104.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C104.1,104.5,104.8,104.8,105.5,104.8z
-			 M117.5,132.7c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C117.3,134,117.5,133.3,117.5,132.7z M125.1,134.8c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C127.8,133.9,126,133.9,125.1,134.8z
-			 M128.9,104.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			c0,0.7,0.3,1.4,0.8,1.8C127.6,104,128.2,104.3,128.9,104.3z M15.7,46.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C18.5,46,16.7,46,15.7,46.9z
-			 M10.1,124.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.3-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8
-			s0.3,1.4,0.8,1.8C8.7,124,9.4,124.3,10.1,124.3z M57.2,121.8c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8C59.9,120.9,58.1,120.9,57.2,121.8z M82.1,112.7
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.7,0,1.4-0.3,1.8-0.8C81.8,114,82.1,113.4,82.1,112.7z M93,112.3c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8C91.6,112,92.3,112.3,93,112.3z
-			 M78.7,139.8c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.2,0.2,0.5,0.4,0.8,0.5h2.1c0.3-0.1,0.5-0.3,0.8-0.5
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C81.4,138.9,79.6,138.9,78.7,139.8z M20.7,144h2.6C22.5,143.6,21.5,143.6,20.7,144z
-			 M39.2,141.8c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.1,0,0.2,0,0.4h5.1c0-0.1,0-0.2,0-0.4c0-0.7-0.3-1.4-0.8-1.8
-			C41.9,140.8,40.2,140.8,39.2,141.8z M30.7,143.3c-0.2,0.2-0.4,0.4-0.5,0.7h4.6c-0.1-0.3-0.3-0.5-0.5-0.7
-			C33.4,142.3,31.7,142.3,30.7,143.3z M52.2,143.3c-0.2,0.2-0.4,0.4-0.5,0.7h4.6c-0.1-0.3-0.3-0.5-0.5-0.7
-			C54.9,142.3,53.2,142.3,52.2,143.3z M12.2,142.3c-0.4,0.4-0.7,1.1-0.7,1.7h5.2c0-0.6-0.3-1.2-0.7-1.7
-			C15,141.3,13.2,141.3,12.2,142.3z M106.6,141.3c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.3,0.1,0.6,0.2,0.9h4.9c0.1-0.3,0.2-0.6,0.2-0.9
-			c0-0.7-0.3-1.4-0.8-1.8C109.3,140.3,107.6,140.3,106.6,141.3z M141.6,15c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.2,0,0.4,0,0.6-0.1v-5C143.1,14.1,142.2,14.3,141.6,15z M141.3,23.3c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0,0,0.1,0,0.1,0v-5.1c-0.7,0-1.4,0.2-1.9,0.7C141.6,21.9,141.3,22.6,141.3,23.3z M141.8,37.8
-			c0,0.7,0.3,1.4,0.8,1.8c0.4,0.4,0.9,0.6,1.4,0.7v-5.1c-0.5,0.1-1,0.3-1.4,0.7C142.1,36.4,141.8,37.1,141.8,37.8z M141.1,42.4
-			c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0.4,0,0.8-0.1,1.1-0.3V42C143,41.5,141.8,41.7,141.1,42.4
-			z M141.3,140.2c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8c0,0,0.1,0,0.1,0v-5.1c-0.7,0-1.4,0.2-1.9,0.7
-			C141.6,138.8,141.3,139.5,141.3,140.2z M142.3,89.2c0,0.7,0.3,1.4,0.8,1.8c0.3,0.3,0.6,0.5,0.9,0.6v-4.8c-0.3,0.1-0.7,0.3-0.9,0.6
-			C142.6,87.9,142.3,88.5,142.3,89.2z M141.1,108.9c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8c0.5,0.5,1.2,0.8,1.8,0.8
-			c0.4,0,0.8-0.1,1.1-0.3v-4.7C143,107.9,141.8,108.1,141.1,108.9z M142.3,102.7c0,0.7,0.3,1.4,0.8,1.8c0.3,0.3,0.6,0.5,0.9,0.6v-4.8
-			c-0.3,0.1-0.7,0.3-0.9,0.6C142.6,101.3,142.3,102,142.3,102.7z M89.1,137.8c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.3-0.8-1.8C91.8,136.9,90.1,136.9,89.1,137.8z
-			 M81.3,136.5c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8c-1-1-2.7-1-3.7,0c-0.5,0.5-0.8,1.2-0.8,1.8c0,0.7,0.3,1.4,0.8,1.8
-			c0.5,0.5,1.2,0.8,1.8,0.8C80.2,137.3,80.8,137,81.3,136.5z M0,32.3L0,32.3C0,32.3,0,32.3,0,32.3C0,32.3,0,32.3,0,32.3z M0,74.2
-			L0,74.2C0,74.3,0,74.2,0,74.2C0,74.2,0,74.2,0,74.2z M2.5,129.2c0-0.7-0.3-1.4-0.8-1.8c-0.5-0.5-1.1-0.7-1.7-0.7v5.1
-			c0.6,0,1.3-0.3,1.7-0.7C2.2,130.5,2.5,129.8,2.5,129.2z M2,16.8c0-0.7-0.3-1.4-0.8-1.8c-0.3-0.3-0.8-0.6-1.2-0.7v5
-			c0.5-0.1,0.9-0.3,1.2-0.7C1.7,18.2,2,17.5,2,16.8z M2.5,23.3c0-0.7-0.3-1.4-0.8-1.8C1.3,21,0.6,20.8,0,20.8v5.1
-			c0.6,0,1.3-0.3,1.7-0.7C2.2,24.7,2.5,24,2.5,23.3z M2.2,39.6C2.7,39.1,3,38.5,3,37.8c0-0.7-0.3-1.4-0.8-1.8
-			c-0.6-0.6-1.4-0.8-2.2-0.7v5.1c0.1,0,0.3,0,0.4,0C1.1,40.4,1.8,40.1,2.2,39.6z M1.5,44.3c0-0.7-0.3-1.4-0.8-1.8
-			C0.5,42.2,0.3,42.1,0,42v4.7c0.3-0.1,0.5-0.3,0.7-0.5C1.2,45.6,1.5,45,1.5,44.3z M0,137.6v5.1c0.6,0,1.3-0.3,1.7-0.7
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C1.3,137.8,0.6,137.6,0,137.6z M2.7,91.1c0.5-0.5,0.8-1.2,0.8-1.8
-			c0-0.7-0.3-1.4-0.8-1.8C2,86.7,0.9,86.5,0,86.8v4.8c0.3,0.1,0.6,0.2,0.9,0.2C1.6,91.8,2.3,91.5,2.7,91.1z M1.5,110.7
-			c0-0.7-0.3-1.4-0.8-1.8c-0.2-0.2-0.5-0.4-0.7-0.5v4.7c0.3-0.1,0.5-0.3,0.7-0.5C1.2,112,1.5,111.4,1.5,110.7z M2.7,104.5
-			c0.5-0.5,0.8-1.2,0.8-1.8c0-0.7-0.3-1.4-0.8-1.8C2,100.2,0.9,100,0,100.3v4.8c0.3,0.1,0.6,0.2,0.9,0.2C1.6,105.3,2.3,105,2.7,104.5z
-			 M81.6,0h-2.1c0.3,0.2,0.7,0.2,1.1,0.2S81.2,0.2,81.6,0z M22,4.8c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8s-0.3-1.4-0.8-1.8
-			c-0.2-0.2-0.3-0.3-0.5-0.4h-2.6c-0.2,0.1-0.4,0.2-0.5,0.4c-0.5,0.5-0.8,1.2-0.8,1.8s0.3,1.4,0.8,1.8C20.6,4.5,21.3,4.8,22,4.8z
-			 M41,2.2c0.7,0,1.4-0.3,1.8-0.8c0.4-0.4,0.6-0.9,0.7-1.5h-5.1c0.1,0.6,0.3,1.1,0.7,1.5C39.7,2,40.4,2.2,41,2.2z M32.6,3.7
-			c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.4-0.1-0.8-0.3-1.1h-4.6C30.1,0.4,30,0.7,30,1.1c0,0.7,0.3,1.4,0.8,1.8
-			C31.2,3.5,31.9,3.7,32.6,3.7z M54,3.7c0.7,0,1.4-0.3,1.8-0.8c0.5-0.5,0.8-1.2,0.8-1.8c0-0.4-0.1-0.8-0.3-1.1h-4.6
-			c-0.2,0.4-0.3,0.7-0.3,1.1c0,0.7,0.3,1.4,0.8,1.8C52.7,3.5,53.3,3.7,54,3.7z M14.1,2.7c0.7,0,1.4-0.3,1.8-0.8
-			c0.5-0.5,0.8-1.2,0.8-1.8c0,0,0-0.1,0-0.1h-5.2c0,0,0,0.1,0,0.1c0,0.7,0.3,1.4,0.8,1.8C12.7,2.5,13.4,2.7,14.1,2.7z M108.5,1.7
-			c0.7,0,1.4-0.3,1.8-0.8c0.3-0.3,0.5-0.6,0.6-1H106c0.1,0.4,0.3,0.7,0.6,1C107.1,1.5,107.8,1.7,108.5,1.7z"/>
-		</pattern>
-	</defs>
-</svg>
diff --git a/examples/parallax-example/components/shared/noise-pattern.svg b/examples/parallax-example/components/shared/noise-pattern.svg
deleted file mode 100644
index 428e848da..000000000
--- a/examples/parallax-example/components/shared/noise-pattern.svg
+++ /dev/null
@@ -1,749 +0,0 @@
-<svg version="1.1" viewBox="0 0 142 142" height="142px" width="142px">
-    <defs>
-        <pattern id="noise-pattern" width="142" height="142" fill="" patternUnits="userSpaceOnUse">
-            <path fill="#a179af" d="M21,122.7l1.3-1.3c0.4-0.4,1-0.4,1.4,0c0.4,0.4,0.4,1,0.1,1.4c-0.2,0.3-0.5,0.5-0.7,0.8c-1,1-1.3,1.5-1.1,2.2
-                c0.1,0.4,0,0.9-0.4,1.1c-0.4,0.2-0.8,0.2-1.2-0.1c-0.3-0.2-0.5-0.5-0.8-0.7c-0.1-0.1-0.2-0.2-0.2-0.2c0,0.1-0.1,0.2-0.2,0.3l-2,2
-                c-0.2,0.2-0.4,0.3-0.7,0.3s-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4l3.9-4c0.4-0.4,1-0.4,1.4,0L21,122.7z M34,105.6l-2.8-0.5
-                c-0.3-0.1-0.6,0-0.8,0.2c-0.2,0.2-0.3,0.5-0.3,0.8v1.6c-2.3-0.3-4.3,0.4-6.1,1c-0.5,0.2-1.1,0.4-1.6,0.5c-0.5,0.1-0.8,0.7-0.7,1.2
-                c0.1,0.5,0.6,0.8,1.1,0.8l1.5-0.2c-0.1,0.6-0.1,1.3,0.1,2c-0.6,0.4-1,0.8-0.8,1.4c0.1,0.4,0.5,0.7,1,0.7c0.7,0,2.9-1.4,3.6-3
-                c0.4-0.8,0.4-1.6,0.1-2.3c0.7-0.1,1.5-0.1,2.3,0c0.1,0,0.3,0.1,0.4,0.1c0.1,0,0.3,0,0.4,0c1.5,0.2,2.7,0.6,3.1,0.7
-                c0.3,0.1,0.4,0.2,0.6,0.2c0.5,0,0.9-0.4,1-0.8c0.1-0.7-0.3-0.9-0.7-1.1l0,0l-0.1,0c-0.1,0-0.1-0.1-0.2-0.1l-0.1,0v-2.1
-                C34.8,106.1,34.5,105.7,34,105.6z M71,81.2c-0.1-0.4-0.4-0.6-0.8-0.7c-0.4-0.1-0.7,0.1-0.9,0.4l-3.5,5.3c0-0.3-0.1-0.7-0.5-0.9
-                L61.5,83l0-0.1l0.9-1.5c0.3-0.4,0.2-1-0.2-1.3c-0.3-0.2-0.6-0.4-0.9-0.6c-0.6-0.4-1.1-0.7-1.4-1.1c-0.1-0.4-0.1-0.7-0.2-1
-                c-0.1-0.5-0.5-0.9-1-0.9c0,0,0,0,0,0c-0.5,0-0.9,0.4-1,0.9c-0.1,0.6,0,1.2,0.3,1.7c0.3,1,0.7,2.2,1.2,3.6l0,0
-                c-0.1,0.2-0.2,0.5-0.1,0.7c0.1,0.3,0.2,0.5,0.4,0.6l0.4,0.2c0.8,1.9,1.7,3.7,2.4,5c0.2,0.4,0.3,0.7,0.5,0.9c-0.1,0.3,0,0.6,0.2,0.8
-                c0.3,0.4,0.6,0.8,1.1,0.8h0c0.3,0,0.7-0.2,0.8-0.5c0-0.1,0.1-0.2,0.1-0.2l0.8-0.2c0.4-0.1,0.7-0.4,0.7-0.8c0.1-0.4-0.1-0.8-0.5-1
-                l-1.5-1l0.5-0.8c0,0.2,0,0.3,0.1,0.5c0.2,0.3,0.5,0.5,0.9,0.5h3.9c0.4,0,0.8-0.2,0.9-0.6c0.2-0.4,0.1-0.8-0.2-1.1l-1.3-1.3
-                c0,0,0,0,0,0C70.4,84.5,71.7,83.2,71,81.2z M48.1,80.3l1.9-0.7c0.5-0.2,0.7-0.7,0.6-1.1c-0.1-0.6-0.3-1.2-0.6-1.7
-                c-0.2-1.1-0.9-2.3-2.3-3.6c-0.2-0.2-0.4-0.2-0.6-0.3L46,72.8c-1.7-0.7-3.8-0.9-5.9-0.4c-0.5,0.1-0.8,0.5-0.8,1
-                c0,0.5,0.4,0.9,0.9,0.9l5.3,0.4c1.2,0.5,2.1,1.4,2.6,2.6c0,0.3-0.2,0.7-0.9,1.2l-2.3,0.8c-0.6-1.4-2-2.2-3.2-2.7
-                c-0.2-0.1-0.5-0.2-0.7-0.3c-0.3-0.1-0.6-0.2-0.9-0.3l-0.8-0.3c-0.3-0.1-0.6-0.1-0.9,0.1c-0.3,0.2-0.4,0.5-0.4,0.8
-                c0,0.6-0.4,0.8-1.8,1.3c-0.3,0.1-0.7,0.2-1,0.4c-0.5,0.2-0.6,0.7-0.5,1.2c0.1,0.5,0.7,0.8,1.2,0.7c0.4,0,0.7,0.3,1,0.5
-                c1,2.1,1.3,2.4,1.9,2.4c0.4,0,0.8-0.2,0.9-0.6c0.3-0.8-0.5-2-1-2.7c0.5-1.1,1.1-1.7,1.8-1.7c0.1,0.1,0.3,0.1,0.4,0.2
-                c0.8,0.5,1.7,1.8,2.1,3c-0.1,0.1-0.1,0.1-0.2,0.2c-0.3,0.4-0.4,0.9,0,1.3c0.3,0.4,0.8,0.9,1.4,0.9c0.3,0,0.7-0.2,0.9-0.4
-                c0.2-0.3,0.3-0.7,0.2-1.2c0.5-0.3,1-0.6,1.5-0.9C47.2,80.9,47.7,80.6,48.1,80.3z M1.4,73.3c0.1-0.4-0.2-0.8-0.5-1L0,71.9v2.3
-                c0.2,0,0.4,0,0.6-0.1C1,74.1,1.3,73.7,1.4,73.3z M17.2,117.5c-0.2-0.4-0.8-0.6-1.2-0.4l-5.2,2.1c-0.2,0.1-0.4,0.3-0.5,0.5
-                c-0.1,0.2-0.1,0.5,0,0.8l0.4,1.1L9,123c-0.4,0.3-0.5,0.8-0.2,1.3c0.2,0.3,0.5,0.5,0.8,0.5c0.1,0,0.2,0,0.4-0.1l2.6-1
-                c0.2-0.1,0.4-0.3,0.5-0.5c0.1-0.2,0.1-0.5,0-0.8l-0.1-0.2l3.9-3.4C17.4,118.4,17.4,117.9,17.2,117.5z M27.6,71.7
-                c-0.2,0.1-0.3,0.1-0.4,0.1c-0.6,0-1.1-0.5-1.8-1.2c-0.3-0.3-0.5-0.5-0.8-0.7c-0.3-0.2-0.7-0.3-1-0.1C23.3,70,23,70.3,23,70.7V76
-                c-0.2,0.2-0.4,0.5-0.6,0.7c-0.3,0.3-0.6,0.7-0.9,1c-1,1.2-1.9,2.2-3.1,1.9c-0.3-0.1-0.6,0-0.9,0.2c-0.2,0.2-0.4,0.5-0.4,0.8v2
-                c0,0.4,0.2,0.7,0.5,0.9c-0.4-0.2-0.8-0.1-1.1,0.2l-0.9,0.9c-0.2,0.2-0.3,0.5-0.3,0.7c0,0.3,0.2,0.5,0.4,0.7l4.7,3.8
-                c0.4,0.3,1,0.3,1.3-0.1l0.5-0.5l2.7,0.8c0.1,0,0.2,0,0.3,0c0.4,0,0.7-0.2,0.9-0.6c0.2-0.5,0-1-0.4-1.2l-7.9-4.8
-                c0.1,0,0.2,0.1,0.3,0.1h3.9c0.5,0,1-0.4,1-1l0-2c0-0.9,0.2-1.7,0.9-2.5c0.2-0.2,0.4-0.4,0.7-0.6c0.2-0.1,0.3-0.3,0.4-0.6
-                c0.4-0.4,0.8-0.7,1.2-1.1c0.9-0.8,1.8-1.6,2.5-2.5c0.3-0.3,0.3-0.8,0-1.2C28.5,71.8,28,71.6,27.6,71.7z M32.6,65.4
-                c0.3-0.4,0.3-0.9,0-1.3c-0.3-0.4-0.9-0.4-1.3-0.2c-1.7,1.1-2.5,2.3-2.5,3.7c-0.1,0.5,0,0.9,0.2,1.4c0,0.1,0.1,0.3,0.2,0.4
-                c0.3,0.6,0.6,1.2,1,1.8c0.2,0.4,0.5,0.8,0.7,1.2c-0.1,0.3,0,0.7,0.3,0.9l0.2,0.2c0.2,0.9,0.1,1.7-0.4,2.6c-0.2,0.4-0.1,1,0.3,1.3
-                c0.2,0.1,0.4,0.2,0.6,0.2c0.3,0,0.5-0.1,0.7-0.3l2-2c0.4-0.4,0.4-1,0-1.4l-1.3-1.3l1.2-1.2c0.8-0.4,1.4-1,1.8-1.8l0.1-0.1
-                c0.7-0.1,1.3,0.4,2,1.1c0.3,0.3,0.5,0.5,0.8,0.7c0.4,0.3,1,0.3,1.3-0.1l1.4-1.4c0.4-0.4,0.4-1,0-1.4l-3.2-3.3c0.2-0.3,0.2-0.6,0.1-1
-                c-0.2-0.4-0.5-0.6-0.9-0.6h-2c-0.5,0-1,0.4-1,1l0,0.8c0,0.3,0,0.6,0,0.9c0,0.1,0,0.1,0,0.2c0,0.1,0,0.1,0,0.2c0,0.7-0.1,1.3-0.3,1.7
-                l-1.2,1.2c-0.1,0-0.2,0-0.2,0c-0.6,0-1.1-0.5-1.8-1.2c-0.1-0.1-0.3-0.3-0.4-0.4c-0.1-0.2-0.1-0.3-0.1-0.5c0.1-0.5,0.6-1,1.1-1.6
-                C32.2,65.9,32.4,65.7,32.6,65.4z M14,62.8c-0.3-0.1-0.6-0.1-0.9,0.1c-0.3,0.2-0.4,0.5-0.4,0.8v2c0,0,0,0,0,0v2c0,0.5,0.4,1,1,1h2
-                c0.4,0,0.8-0.2,0.9-0.6c0.2-0.4,0.1-0.8-0.2-1.1l-1.3-1.3l3.2-3.3c0,0,0,0,0,0l2-2c0.4-0.4,0.4-1,0-1.4L19,57.8l1.3-1.3
-                c0.2-0.2,0.3-0.6,0.3-0.9c-0.1-0.3-0.3-0.6-0.6-0.7c-0.4-0.1-0.7-0.2-1.1-0.2c-1.4,0-2.4,0.9-3.1,1.7c-0.2,0.2-0.4,0.4-0.7,0.6
-                c-0.4,0.3-0.5,1-0.1,1.4c0.2,0.3,0.5,0.5,0.7,0.8c0.8,0.9,1.2,1.4,1.1,2c-0.2,0.2-0.4,0.3-0.5,0.5C15.4,62.5,14.8,63.1,14,62.8z
-                 M30.2,90.9c1.3-0.3,2.6-0.7,3.7-1.3c0.8,0,2-0.1,2-1.2c0-1.1-1.2-1.1-1.9-1.1c-0.3,0-0.5,0.1-0.6,0.2c0,0,0,0-0.1,0
-                c-1.1,0-2.1-0.2-2.8-0.6c-0.3-1-0.9-1.7-1.9-2.1c-0.3-0.1-0.7-0.1-1,0.1c-0.3,0.2-0.4,0.6-0.3,1c0.2,0.9,0.7,1.6,1.5,2.2
-                c0,0.3,0,0.5,0.1,0.8c0,0.1,0,0.1,0,0.2c-1.7,0.5-3.4,1.1-4.4,2.4l-3.1,1.6l-0.1-1.3c0,0,0,0,0,0c0-0.2-0.1-0.4-0.3-0.6v0l0,0
-                c0,0,0,0,0,0c-0.1-0.1-0.2-0.2-0.3-0.2c0,0,0,0,0,0c0,0,0,0,0,0C20.5,91,20.4,91,20.2,91c-0.6,0-1.2,0.1-1.8,0.1
-                c-1,0.1-2,0.1-2.8,0.1l-0.3-4.5c0-0.4-0.3-0.7-0.7-0.9c-0.4-0.1-0.8,0-1.1,0.3L11,89c-0.3,0.3-0.3,0.8-0.1,1.2
-                c0.7,1.2,1.7,2.1,2.9,2.5c0.2,0.4,0.5,0.6,1,0.6l4.6-0.3l0.1,1.8c0,0,0,0,0,0.1c0.1,0.5,0.5,0.9,1,0.9c0,0,0,0,0,0l0.2,0
-                c0.3,0,0.6,0,0.8,0c0.3,0,0.5,0,0.8,0c0.9,0,1.3,0.2,1.6,0.7c0.2,0.3,0.5,0.5,0.8,0.5c0.1,0,0.2,0,0.4-0.1c0.5-0.2,0.7-0.7,0.6-1.1
-                c-0.2-1.1-0.2-1.9,0.1-2.5L30.2,90.9z M59.3,46.8c0,0.3,0.1,0.6,0.3,0.8l2,2c0.2,0.2,0.4,0.3,0.7,0.3c0.2,0,0.4,0,0.5-0.1
-                c0.4-0.2,0.6-0.7,0.4-1.2c-0.3-0.8,0.1-1.2,1.1-2.2c0.1-0.1,0.2-0.2,0.3-0.3c0.5,0.1,1.1,0.3,1.7,0.4c0.2,0.1,0.3,0.3,0.5,0.5
-                c0.3,0.3,0.5,0.5,0.8,0.7c0.4,0.3,1,0.3,1.3-0.1l0.3-0.3c0.5,0.1,1,0.3,1.6,0.4c0.8,0.9,1.8,1.4,2.8,1.4c1.2,0,2.3-0.6,3.3-1.2
-                c1.5-0.4,2.7-1.1,3.8-2.2c0.3-0.3,0.4-0.8,0.1-1.2s-0.7-0.6-1.1-0.4c-1.2,0.4-2.2,1-3.2,1.7L76,45.9c-1.2,0.2-2.6,0.2-4.3-0.1
-                c-0.3-0.4-0.5-0.8-0.8-1.4c-0.1-0.3-0.4-0.5-0.7-0.5c-0.3-0.1-0.6,0.1-0.9,0.3L68.5,45c-0.4-0.1-0.7-0.2-1.1-0.3l-0.3-0.1
-                c-0.7-0.5-1.8-1.1-3.1-0.8c-0.6-0.1-1.1-0.2-1.5-0.2C60.6,43.7,59.5,44.8,59.3,46.8z M93.1,58.2c-3.1,0-3.6,2.8-3.9,4.8
-                c-0.2,1-0.3,1.8-0.6,2.4L87,66.6c-0.2,0-0.3,0-0.6,0c-0.5,0-1,0.4-1,1c0,0.5,0.4,1,1,1c3.7,0,4.2-3.1,4.6-5.3l4.5-3.6
-                c-0.6-0.2-1.1-0.3-1.6-0.4c0,0,0-0.1,0-0.1C94.1,58.6,93.6,58.2,93.1,58.2z M63.8,35.6c-0.2,0.3-0.3,0.8,0,1.1
-                c0.1,0.2,0.3,0.4,0.4,0.6c1.1,1.6,1.7,2.6,0.8,4.1c-0.2,0.4-0.2,0.9,0.2,1.2c0.2,0.2,0.4,0.3,0.7,0.3c0.2,0,0.4-0.1,0.6-0.2l1.7-1.3
-                c0.3-0.2,0.4-0.6,0.4-0.9c-0.2-2.3-1.1-3.9-2.4-5c-0.1-0.1-0.2-0.1-0.3-0.2l-0.9-0.3C64.4,35.1,64,35.2,63.8,35.6z M104.6,81
-                c0.5,0.1,1-0.1,1.2-0.6c0.2-0.5,0-1-0.5-1.2c-1.3-0.7-1.7-1.7-2.1-2.9c-0.1-0.4-0.3-0.7-0.4-1c0,0,0-0.1-0.1-0.1
-                c0-0.1-0.1-0.1-0.2-0.2c-0.1-0.1-0.3-0.2-0.4-0.3c0,0-0.1,0-0.1,0l-2.4-0.4l-1.8-5c-0.1-0.3-0.4-0.6-0.7-0.6
-                c-0.9-1.3-2.1-2.3-3.7-3.1c-0.4-0.2-0.9-0.1-1.2,0.2l-2,2.3c-0.2,0.3-0.3,0.6-0.2,1c0.1,0.3,0.4,0.6,0.8,0.6l5.2,0.8
-                c0.6,1,1,2.1,1.4,3.2c0.2,0.6,0.4,1.2,0.7,1.8c0,0.1,0.1,0.2,0.1,0.3c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0v0c0,0,0,0,0,0v0
-                c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0v0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0,0,0,0,0,0c0,0,0,0,0,0v0c0,0,0,0,0,0l0,0c0,0,0,0,0,0v0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0v0c0,0,0,0,0,0v0c0,0,0,0,0,0v0
-                c0,0,0,0,0,0v0c0,0,0,0,0,0v0c0,0,0,0,0,0v0c0,0,0,0,0,0v0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0v0c0,0,0,0,0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0
-                c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0c0.1,0.1,0.2,0.1,0.4,0.2
-                c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0h0
-                c0,0,0,0,0,0h0l0,0h0h0c0,0,0,0,0,0h0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0,0,0,0,0,0c0,0,0,0,0,0l2.1,0.3l-0.3,3.1c-0.9,0.9-0.9,2.4-0.7,3.8c-0.3,0-0.6-0.1-0.8-0.2c-0.9-0.8-1.8-1.4-2.8-1.7
-                c-0.4-0.1-0.9,0.1-1.1,0.4c-0.2,0.4-0.2,0.8,0.1,1.2c0.7,0.9,1.6,1.5,2.7,1.8c1,1.1,1.7,2.5,2.1,3.2c-0.1,0.2-0.1,0.5,0,0.7
-                c0.4,0.8,0.7,1.5,1.4,1.5c0.3,0,0.7-0.2,0.8-0.5c0.2-0.4,0.3-0.7-0.2-1.9c0.2-1,0-2.3-0.2-3.5l0.4-3.8
-                C102.8,80.6,103.6,80.7,104.6,81z M69.4,36.4l0.9,5.2c0.1,0.3,0.3,0.6,0.6,0.8c0.1,0,0.2,0.1,0.4,0.1c0.2,0,0.4-0.1,0.6-0.2
-                c2.7-2.1,0.6-5.1-0.6-6.6L69.7,27c-0.1-0.3-0.3-0.6-0.5-0.7c-0.3-0.1-0.6-0.1-0.9,0C66.8,27,66,28,65.7,29.2c-0.4,2.2,1.3,4.3,3,6.4
-                C68.9,35.9,69.1,36.1,69.4,36.4z M81.3,96.7c0.6,0,0.8-0.4,1-0.8c0-0.1,0.1-0.2,0.1-0.3c1.3-2.9,2.1-5.6,2.2-7.7
-                c0.5-2.4-0.2-4.2-2.2-5.4c0,0,0,0,0,0c-0.5-0.3-1.1-0.1-1.3,0.3c-0.1,0.2-0.1,0.3-0.1,0.5c0,0.3,0.2,0.7,0.5,0.9c0,0,0.1,0,0.1,0.1
-                c0.4,0.3,1.3,1,1.1,3.3c-0.2,0.9-0.6,1.8-1,2.7c-0.6,1.6-1.3,3.2-1.3,4.8c-0.1,0.3-0.2,0.7,0,1.1C80.7,96.5,81,96.7,81.3,96.7z
-                 M91.2,76.1c-0.2-0.4-0.7-0.6-1.1-0.5c-6,1.4-10.1,3-12.1,3.8c-0.3-0.1-0.6,0-0.9,0.1c-0.5,0.4-1.1,0.8-0.9,1.5
-                c0.1,0.4,0.5,0.7,1,0.7c0.2,0,0.4,0,0.8-0.2c0.7,0.2,1.3,0.4,2,0.4c2,0,3.5-1.1,4.6-2c0.5-0.4,1.1-0.8,1.4-0.8c0,0,0.3,0.1,0.9,1.4
-                c0.2,0.5,0.7,0.7,1.2,0.6c0.5-0.1,0.8-0.6,0.7-1.1c-0.1-0.8,0.3-1.2,1.4-2c0.3-0.2,0.6-0.4,0.8-0.6C91.3,77,91.4,76.5,91.2,76.1z
-                 M87.5,90.4c0.1,0,0.2,0.1,0.3,0.1c0.4,0,0.8-0.3,0.9-0.7l2-5.9c0.2-0.5-0.1-1-0.6-1.2c-0.5-0.2-1,0-1.3,0.5l-1.4,2.7l-1-1
-                c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1-0.1,1.4c0.2,0.3,0.5,0.5,0.7,0.8c1,1,1.3,1.5,1.1,2.2C86.7,89.6,86.9,90.2,87.5,90.4z
-                 M81.2,86.8c0-0.3-0.2-0.5-0.4-0.7l-1-0.8c-0.2-0.1-0.4-0.2-0.6-0.2l-2-0.1c-0.3,0-0.5,0.1-0.7,0.3c-0.2,0.2-0.3,0.4-0.3,0.7l-0.1,2
-                c0,0.5,0.4,1,0.9,1l2,0.1c0,0,0,0,0,0c0.3,0,0.6-0.1,0.7-0.3l1.1-1.2C81.1,87.3,81.2,87.1,81.2,86.8z M78.2,75.8
-                c0.1,0,0.3,0.1,0.4,0.1c0.1,0,0.3,0,0.4,0c1.5,0.2,2.8,0.6,3.2,0.7c0.3,0.1,0.4,0.2,0.6,0.2c0.5,0,0.9-0.4,1-0.8
-                c0.1-0.7-0.3-0.9-0.7-1.1l0,0l-0.1,0c-0.1,0-0.1-0.1-0.2-0.1l-0.1,0v-2.1c0-0.5-0.3-0.9-0.8-1L79,71.2c-0.3-0.1-0.6,0-0.8,0.2
-                s-0.3,0.5-0.3,0.8v1.6c-2.3-0.3-4.3,0.4-6.1,1c-0.5,0.2-1.1,0.4-1.6,0.5c-0.5,0.1-0.8,0.7-0.7,1.2c0.1,0.5,0.6,0.8,1.1,0.8L72,77
-                c-0.1,0.6-0.1,1.3,0.1,2c-0.6,0.4-1,0.8-0.8,1.4c0.1,0.4,0.5,0.7,1,0.7c0.7,0,2.9-1.4,3.6-3c0.4-0.8,0.4-1.6,0.1-2.3
-                C76.5,75.7,77.4,75.7,78.2,75.8z M36.5,88.1c0.1,0.2,0.4,0.4,0.6,0.4l0.4,0.1c2,1.5,3.8,2.7,5.2,3.6c0.6,0.4,1.2,0.8,1.9,1.1
-                c0.1,0.1,0.3,0.1,0.4,0.1c0.4,0,0.7-0.2,0.9-0.5c0.2-0.5,0.1-1-0.4-1.3c-0.5-0.3-1-0.6-1.6-1c-0.8-0.6-1.3-1.3-1.8-2.1
-                c-0.2-0.3-0.5-0.7-0.7-1c-0.1-0.2-0.4-0.3-0.6-0.4l-2.5-0.4l-0.8-0.6l-3.1-4.4c-0.1-0.2-0.4-0.4-0.6-0.4l-2.9-0.5l-1.6-2.3
-                C29,78.2,28.7,78,28.4,78c-0.3,0-0.6,0.1-0.8,0.4l-0.1,0.2c-0.5-0.2-1.1,0.1-1.3,0.6c-0.3,0.7,0.1,1,0.8,1.6
-                c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0.3,1,0.8,1.7,1.3c1.8,1.4,4.3,3.3,6.8,5.2L36.5,88.1z M12.7,115.6c0.1,0.3,0.2,0.5,0.5,0.6
-                c0.5,0.3,0.7,0.3,1,0.3c0.4,0,0.8-0.3,0.9-0.7c0.1-0.2,0.1-0.4,0-0.5l0.5-0.4c0.3-0.2,0.4-0.6,0.3-1c-0.1-0.4-0.4-0.7-0.8-0.7
-                l-2-0.3V111c0-0.5-0.3-0.9-0.8-1l-4.6-0.8L7.6,109v-1.8c0-0.5-0.3-0.8-0.7-1c-0.3-0.1-0.7-0.2-1.1-0.2c-0.7-0.1-1.4-0.3-1.9-0.6
-                c-0.3-0.3-0.5-0.6-0.7-0.9c-0.3-0.4-0.9-0.5-1.3-0.3c-0.4,0.3-0.6,0.8-0.4,1.3c0.3,0.6,0.6,1,1.1,1.4c0.8,0.9,1.8,1.9,3,3v0.1
-                c0,0.5,0.3,0.9,0.8,1l0.5,0.1c1.7,1.5,3.5,2.8,4.8,3.8C12.1,115.2,12.4,115.4,12.7,115.6z M20.1,98.3c-0.5,0.2-1.1,0.3-1.7,0.4
-                c-2.2,0.5-5,1.1-5.9,3.5c-0.4,0.4-0.7,0.9-0.9,1.4l-0.9-0.2c-0.4-0.1-0.8,0.1-1,0.5c-0.2,0.4-0.2,0.8,0.1,1.1l1.4,1.6
-                c0.2,0.2,0.5,0.3,0.7,0.3c0.1,0,0.2,0,0.3,0c0.4-0.1,0.6-0.4,0.7-0.8c0-0.1,0-0.2,0.1-0.3l0.2,0c0.3,0.1,0.6-0.1,0.9-0.3
-                c0.2-0.2,0.3-0.6,0.3-0.9c-0.1-0.6-0.1-1.1,0-1.5c1.3-1.2,3.3-1.4,5.7-0.3c0.3,0.1,0.7,0.1,0.9-0.1c0.3-0.2,0.4-0.5,0.4-0.8v-2.8
-                c0-0.3-0.1-0.6-0.4-0.8S20.4,98.2,20.1,98.3z M17.3,104.1c-0.3-0.3-0.8-0.3-1.2,0c-1.4,1-2.6,5.4-2.3,6.4c0.1,0.4,0.6,0.8,1,0.8
-                c0.6,0,1-0.5,1.3-1.1l1.2-0.1l0.1,1.7c0,1,0,2,0.1,3.1c0.1,0.5,0.5,0.8,1,0.8c0,0,0.1,0,0.1,0c0.5-0.1,0.9-0.5,0.9-1l-0.1-2.9l0-0.4
-                C19.4,108.8,19.5,105.9,17.3,104.1z M2.5,117.2c0.7,0.1,1,0.4,1.1,1.1c0.1,0.3,0.3,0.6,0.6,0.8c0.3,0.1,0.7,0.1,1-0.2l2.8-2.3
-                c0.3-0.2,0.4-0.6,0.3-1c-0.1-0.4-0.4-0.7-0.8-0.7c-1-0.2-2.4-0.1-3.6,0.1c-0.5,0.1-1,0.1-1.5,0.2c-0.4-0.1-0.9-0.1-1.4,0
-                c-0.4-0.1-0.8-0.2-1.2-0.4v2.6c0.4-0.1,0.8-0.2,1.1-0.2C1.6,117.3,2,117.3,2.5,117.2z M11.9,61.2c-1.1,0.6-2.2,1.1-3.4,1.3
-                c-2.7-1.3-5.9-1.4-8.5-1.4v2.5c2.5,0.8,5.5,1.4,8.2,1C8.5,64.8,8.7,65,9,65.2c0.2,0.1,0.4,0.2,0.6,0.2c0.2,0,0.4-0.1,0.6-0.2
-                l2.8-2.3c0.4-0.3,0.5-0.9,0.2-1.3C12.9,61.1,12.3,61,11.9,61.2z M25.1,65.8l-2.3,0.2c-0.2-0.5-0.3-1.1-0.4-1.5
-                c-0.1-0.5-0.2-1.3-1.1-1.3c-0.9,0-1,0.3-1.3,2.6l-1.2,0.6c-0.4,0.2-0.6,0.7-0.5,1.2c0.1,0.5,0.6,0.8,1,0.7l2.4-0.2
-                c0.5,0.5,1.1,0.6,1.5,0.6c0.8,0,1.6-0.4,2.5-1.1c0.3-0.3,0.4-0.7,0.3-1.1C25.9,66,25.5,65.7,25.1,65.8z M59.1,72.6l4.6,4.3l0.1,2.8
-                c0,0.3,0.2,0.6,0.4,0.8c0.2,0.1,0.4,0.2,0.5,0.2c0.1,0,0.2,0,0.3-0.1l1.2-0.5c0.3-0.1,0.5-0.3,0.6-0.6s0.1-0.5,0-0.8l-1.3-2.7
-                c0,0,0,0,0-0.1l-1.3-2.7c-0.2-0.3-0.5-0.6-0.9-0.6c-0.3,0-0.6,0.1-0.8,0.3c-0.4-0.2-1-0.8-1.4-1.1c-0.3-0.2-0.5-0.5-0.8-0.7
-                c-1-1.6-1-2.8-1.1-4.2c0-0.4,0-0.8-0.1-1.2c0-0.3-0.2-0.5-0.4-0.7c-0.3-0.2-0.6-0.5-0.8-0.7c-1-0.9-1.9-1.7-2.9-1.7
-                c-0.6,0-1.1,0.3-1.4,0.9c-0.2,0.4-0.1,0.9,0.2,1.2l2.2,2l0.1,2.8c0,0.3,0.1,0.5,0.3,0.7L59.1,72.6C59.1,72.5,59.1,72.6,59.1,72.6z
-                 M34,50.2c-0.2,0.2-0.3,0.5-0.2,0.8c0,0.3,0.2,0.5,0.4,0.7l5.9,4c0.2,0.1,0.4,0.2,0.5,0.2c0.3,0,0.5-0.1,0.7-0.3
-                c0.3-0.3,0.4-0.9,0.1-1.3c-0.5-0.8-1.2-1.4-1.9-2c-1.3-1.1-2.1-1.8-1.9-2.9c0.2-0.2,0.4-0.3,0.5-0.5c0.1-0.1,0.2-0.2,0.3-0.3
-                c1,0.3,1.9,0.4,2.8,0.4c0.5,0.6,0.6,1,0.4,1.5c-0.1,0.4,0,0.8,0.3,1.1c0.3,0.3,0.8,0.3,1.1,0.1c1.3-0.8,2.3-2,3.2-3.2
-                c0.8-1,1.6-2,2.5-2.5l0.4-0.2c0.9-0.4,1.7-0.4,2.8,0.1c0.4,0.2,0.8,0.1,1.1-0.2l2-2c0.3-0.3,0.4-0.7,0.2-1.1c-0.2-0.4-0.6-0.6-1-0.6
-                c-2.6,0.3-4.5,1.2-6,2.1c-0.2,0.1-0.4,0.2-0.5,0.3l-0.9,0.6c-1.6,1-3,1.9-4.7,2.1l0,0c-0.2-0.2-0.4-0.4-0.6-0.7
-                c-0.1-0.1-0.3-0.2-0.4-0.3c-1.1-0.4-2.2,0-2.9,0.4c-0.3-0.1-0.6-0.2-0.9-0.4c-0.4-0.2-0.8-0.1-1.1,0.2c-0.3,0.3-0.4,0.7-0.3,1
-                c0.3,0.8-0.1,1.2-1.1,2.2C34.4,49.6,34.2,49.9,34,50.2z M0,95.1v1.2l0,0C0.3,95.9,0.3,95.4,0,95.1z M56,79.5c0.1,0,0.2,0.1,0.3,0.1
-                c0.2,0,0.5-0.1,0.6-0.2c0.3-0.2,0.4-0.6,0.3-0.9c-0.6-2.7-2.2-3.6-3.6-4.4c-0.5-0.2-0.9-0.5-1.2-0.8c-0.3-0.7-0.7-1.4-1-2.2
-                c0.1-0.1,0.2-0.2,0.4-0.4c0.8-0.8,1.4-1.4,2.2-1.1c0.4,0.1,0.9,0,1.1-0.4c0.2-0.4,0.2-0.9-0.1-1.2l-2-2c-0.3-0.3-0.8-0.4-1.2-0.1
-                c-0.4,0.2-0.6,0.7-0.4,1.2c0.2,0.7-0.1,1.2-0.9,2c-1.2-2.6-2.7-5.1-5.5-6.5l2-1c1.1-0.3,2.3-0.7,3.2-1.4c0,0,0,0,0,0
-                c0.2,0.2,0.3,0.3,0.5,0.5l0.6,2.3c0.1,0.4,0.5,0.7,0.9,0.7c0.5,0,0.8-0.3,1-0.7c0.5-1.5-0.1-2.5-0.7-3.3l-0.8-3.2
-                c-0.1-0.6-0.2-1.3-0.5-2.1c-0.2-0.5-0.7-0.8-1.2-0.6c-0.5,0.2-0.8,0.7-0.7,1.2l0.5,1.9c0,0.6-0.1,0.9-0.2,1.1l-3.3,1.7
-                c0,0,0,0-0.1,0c-1.7,0.5-3.5,1-4.6,2.4c0,0,0,0,0,0.1l0,0c-0.1,0.1-0.1,0.2-0.1,0.3c0,0,0,0,0,0c0,0.1,0,0.2,0,0.3
-                c0,0.2,0.1,0.3,0.1,0.5c0,0,0,0,0,0c0,0.1,0.1,0.1,0.1,0.2c0,0,0,0,0,0c0,0,0,0,0,0l7.4,7.4l0.2,0.5c0.1,1.3,0.6,2.3,1.4,3.1
-                C51.8,76.3,53.2,78.5,56,79.5z M43.3,58.7c0.2,0.1,0.4,0.2,0.5,0.2c0.3,0,0.6-0.1,0.7-0.3l6-7.1c0.3-0.4,0.3-0.9,0-1.2l-0.8-1
-                c-0.2-0.2-0.4-0.4-0.7-0.4c-0.3,0-0.5,0.1-0.7,0.2l-4.5,4.1c-0.4,0.3-0.4,0.9-0.1,1.3l0.4,0.5L43,57.5
-                C42.8,57.9,42.9,58.5,43.3,58.7z M19.8,75.6c0.1,0,0.2,0,0.2,0c0.3,0,0.7-0.2,0.9-0.5c0.2-0.4,0.2-0.9-0.2-1.2l-3.9-4
-                c-0.3-0.3-0.8-0.4-1.1-0.2l-3.9,2c-0.4,0.2-0.6,0.6-0.5,1c0,0.4,0.3,0.8,0.7,0.9L19.8,75.6z M0,65.2v5L1.4,71
-                c0.2,0.1,0.3,0.1,0.5,0.1c0.3,0,0.5-0.1,0.7-0.3c0.3-0.3,0.4-0.8,0.1-1.2L0,65.2z M6.3,76.6c0-0.5-0.2-0.9-0.7-1l-2.1-0.7
-                c-0.2-0.1-0.4-0.1-0.6,0c-0.2-0.1-0.5-0.1-0.7,0l-2.2,1v3.9l1.1-0.1c0.5-0.1,0.9-0.5,0.9-1l0-0.4l0.4-0.6l3-0.3
-                C5.9,77.4,6.2,77.1,6.3,76.6z M1,94.2c1.4,0.2,2.2,0.4,2.4,0.4c0,0,0,0,0.1,0c0.1,0,0.2,0,0.2,0c0.5,0,0.9-0.4,1-0.9
-                c0-0.5-0.4-1-0.9-1.1c-0.2,0-0.9-0.2-1.7-0.5v-4.5c0-0.4-0.2-0.7-0.6-0.9c-0.3-0.2-0.7-0.1-1,0.1c-0.2,0.1-0.3,0.3-0.5,0.4v6
-                c0.1,0,0.1,0.1,0.2,0.1C0.3,93.9,0.6,94.2,1,94.2z M4.8,83.2c0.3-0.5,0.2-1.1-0.3-1.4c-0.2-0.2-0.5-0.3-0.7-0.4
-                c-1.4-0.8-2.5-1.2-3.5-1.2c-0.1,0-0.2,0-0.3,0v2.6c0.8-0.4,1.8-0.3,2.9,0.3c0.2,0.1,0.4,0.2,0.6,0.3C3.9,83.8,4.5,83.7,4.8,83.2z
-                 M9.9,99.1c0.1,0,0.2,0.1,0.3,0.1c0.2,0,0.4-0.1,0.6-0.2l2.8-2.3c0.3-0.2,0.4-0.6,0.3-1c-0.1-0.4-0.4-0.7-0.8-0.7l-2-0.4
-                c0-0.1,0-0.1,0-0.2c0-1.3,0-3-1.8-4.2c-0.3-0.2-0.8-0.2-1.1,0c-0.3,0.2-0.5,0.6-0.4,1l1.4,7.1C9.4,98.7,9.6,99,9.9,99.1z M13.7,83.9
-                c0.2,0.1,0.4,0.2,0.6,0.2c0.2,0,0.3,0,0.5-0.1l1.6-0.9c0.3-0.2,0.5-0.4,0.5-0.8c0-0.3-0.1-0.6-0.3-0.8c-0.8-0.7-0.7-1.4-0.6-2.7
-                c0-0.4,0.1-0.7,0.1-1.1c0-0.4-0.3-0.9-0.7-1l-2.4-0.8c-0.5-0.5-1.3-0.9-2.2-1l0.2-1.6c0.1-0.5-0.2-0.9-0.7-1.1l-1.9-0.6
-                c-0.3-0.1-0.6-0.1-0.8,0.1c-0.1,0-0.1,0.1-0.2,0.1l-1.6-4.7c-0.1-0.6-0.3-1.1-0.5-1.6c-0.2-0.5-0.8-0.7-1.3-0.5
-                c-0.5,0.2-0.7,0.7-0.6,1.2l0.5,1.4c0.2,0.8,0.2,1.7,0.2,2.5c0.1,2.1,0.1,4.4,2.6,5.8l0.4,1.2c0.1,0.3,0.3,0.5,0.6,0.6
-                c0.3,0.1,0.6,0.1,0.8-0.1L9.7,77l2,0.7c0.3,0.6,0.4,1.4,0.5,2.3c0.1,0.9,0.2,2,0.7,2.9c-0.3-0.1-0.5,0-0.8,0.1l-1.1,0.7
-                c-1.5,1-3,1.9-4.4,2.5v0c0,0-0.1-0.1-0.1-0.1c0.1-0.1,0.2-0.2,0.3-0.4c1.4-1.7,2.5-3.2,2.3-4.5c-0.1-0.4-0.3-0.9-1-1.2
-                c-0.5-0.2-1.1-0.1-1.3,0.4l-3.4,6.6c0,0,0,0,0,0c-0.1,0.2-0.1,0.5-0.1,0.7c0,0,0,0.1,0,0.1c0,0,0,0,0,0c0,0,0,0,0,0
-                c0.1,0.2,0.2,0.3,0.4,0.5c0,0,0.1,0,0.1,0.1c0.1,0,0.2,0.1,0.3,0.1c0.3,0,0.5,0.1,0.8,0c0.1,0.2,0.1,0.4,0.3,0.5
-                c0.2,0.3,0.6,0.4,1,0.4c0.8,0,1.9-0.4,7-5C13.6,84.4,13.7,84.1,13.7,83.9z M3.7,101.7c0.9,0,2,0.3,3.2,0.8c0.5,0.2,1.1,0,1.3-0.5
-                c0.2-0.5,0-1.1-0.5-1.3c-0.7-0.4-1.3-0.8-1.6-1.2c0.3-0.9,0.4-1.9,0.2-3.1c0.3-0.4,0.5-0.8,0.3-1.3c-0.2-0.4-0.5-0.6-0.9-0.6
-                c-0.5,0-0.8,0.3-1.2,1c-0.1,0.1-0.1,0.2-0.2,0.3c-0.6,1.2-0.8,2.5-0.5,3.6c-0.1,0.1-0.3,0.3-0.5,0.4c-0.5,0-1,0.1-1.5,0.2
-                c-0.5,0-1.2-0.1-1.8-0.3v3.9c0.7-0.8,1.3-1.3,2.1-1.6C2.7,101.9,3.2,101.9,3.7,101.7z M2.4,108.5c0-0.9-0.6-1.2-2.4-1.3v2.3
-                c0.4,0,0.7,0.1,1,0.1C2.2,109.5,2.4,108.8,2.4,108.5z M118.5,71.3c0.2,0.2,0.5,0.3,0.7,0.3c0.4,0.4,0.8,0.9,1.1,1.5
-                c0.2,0.3,0.5,0.5,0.9,0.5c0.1,0,0.2,0,0.3,0c0.4-0.1,0.7-0.5,0.7-1v-4c0-0.4-0.2-0.8-0.6-0.9c-0.4-0.2-0.8-0.1-1.1,0.2l-1.2,1.2
-                c-0.2-0.1-0.4-0.2-0.5-0.3l-0.8-0.9c-0.1-0.1-0.2-0.2-0.4-0.2c-1-0.3-1.9-0.2-2.9,0.4c-0.6,0.1-1.3,0.3-1.9,0.5c0,0-0.1,0-0.1,0
-                l-0.7-0.7c-0.3-0.3-0.7-0.4-1.1-0.2c0,0,0,0,0,0c-0.5-0.4-1-0.7-1.7-1.1c0-0.4,0-0.9,0.2-1.5c0.1-0.4-0.1-0.9-0.4-1.1
-                c-0.4-0.2-0.8-0.2-1.2,0.1c-0.5,0.5-1.2,0.7-2,0.7c-0.2,0-0.4,0-0.6,0l-0.7-0.2l-2.7-0.5c-0.7-0.2-1.3-0.3-1.8-0.4l-0.3-2
-                c-0.1-0.5-0.5-0.9-1-0.8c-0.5,0-0.9,0.5-0.9,1v2.8c0,0,0,0,0,0c0,0.1,0,0.1,0,0.2l1.4,7.1c0.1,0.5,0.6,0.9,1.1,0.8
-                c0.5-0.1,0.9-0.6,0.8-1.1l-0.8-5.7l1.6,0.3c1,0.2,2,0.5,2.9,0.6c0.1,0,0.3,0.1,0.4,0.2c0,0-0.1,0-0.1,0.1c-2.6,1.7-1.3,4.3-0.4,6.2
-                c1.1,2.3,1.3,3.1,0.4,3.7c-0.4,0.3-0.5,0.8-0.3,1.2c0.2,0.3,0.5,0.5,0.9,0.5c0.1,0,0.2,0,0.3-0.1c1.5-0.5,2.5-0.8,3.3-0.2
-                c0.3,0.3,0.8,0.3,1.2,0.1c0.4-0.3,0.5-0.7,0.4-1.1c-0.6-1.7-1.8-3.1-2.9-4.4c-1.9-2.2-2.6-3.3-1.6-4.5c0.2-0.3,0.3-0.7,0.2-1
-                c0.4,0.2,0.8,0.4,1.2,0.6c0.5,1.2,1.6,1.8,2.7,2.1v0.6c0,0.4,0.2,0.7,0.5,0.9c0.2,0.1,0.5,0.1,0.8,0c0.1,0.3,0.2,0.6,0.1,0.9
-                c0,0.3,0.1,0.5,0.2,0.7c0.2,0.2,0.4,0.3,0.7,0.3c0.3,0,0.6,0.1,0.9,0.1c0.5,0.1,1.1,0.2,1.6,0.2c1.2,0,2.1-0.5,2.7-1.4
-                c0.2-0.3,0.2-0.7,0-1c-0.3-0.4-0.6-0.8-1-1.1c0.2,0.1,0.5,0.1,0.7,0.2L118.5,71.3z M0,2.4c0.2-0.1,0.4-0.2,0.5-0.4l0.6-1.1
-                c0.1-0.2,0.2-0.5,0.1-0.8c0,0,0,0,0-0.1H0V2.4z M7.5,27.9c-0.2-0.6-0.4-1.2-0.6-1.8c0,0,0,0,0,0c-0.2-2.1-0.1-2.9,0.8-3.2
-                c0.4-0.2,0.7-0.6,0.6-1S8,21,7.6,21l-1.9-0.3c-0.1-0.4-0.1-0.9-0.1-1.2v-0.7c0-0.5-0.4-1-1-1c-0.6,0-1,0.4-1,0.9c0,0.2,0,0.5,0,0.8
-                v2c0,0.3,0.1,0.6,0.4,0.8C4.2,23.5,4.6,25,5,26.4c0.1,0.8,0.1,1.4,0,2c0,0.3,0,0.5,0.2,0.7c0.1,0.2,0.4,0.4,0.6,0.4l0.3,0
-                c0.1,0.3,0.3,0.7,0.4,1c0.1,0.3,0.3,0.5,0.6,0.6c0.8,0.3,1.5,0.4,2.1,0.4c0,0,0,0,0,0c1,0,1.9-0.3,2.5-1c0.2,0,0.3-0.1,0.5-0.2
-                c0.2-0.2,0.4-0.4,0.4-0.7c0-0.3,0.1-0.7,0.1-1c0.3-1.2,0.3-2.7,0.3-4.1c0-1.3,0-2.5,0.2-3.2c0.1-0.2,0.3-0.3,0.4-0.4
-                c0.4-0.3,0.5-0.8,0.3-1.3c-0.2-0.4-0.7-0.7-1.2-0.5c-0.4,0.1-0.9,0.4-1.3,1.1c-1.2,1.6-1,3.9-0.9,6c0.1,0.7,0.1,1.4,0.1,2.1
-                c0,0,0,0,0,0L7.5,27.9z M2.4,8l-2-0.3c-0.1,0-0.3,0-0.4,0v5.7c0.1,0.2,0.3,0.4,0.6,0.4c0.3,0.1,0.6,0,0.8-0.2l1.1-0.9l2.1,0.4
-                c0.4,0.5,0.6,1.3,0.9,2.2c0.3,1.2,0.7,2.6,1.7,3.6c0.2,0.2,0.4,0.3,0.7,0.3c0.2,0,0.4-0.1,0.6-0.2l1.4-1.1c0.2-0.2,0.4-0.5,0.4-0.8
-                c0-0.3-0.2-0.6-0.4-0.8C9,15.7,8.9,15,8.9,13.7c0-0.4,0-0.7,0-1.1c0-0.4-0.4-0.8-0.8-0.9l-2.5-0.4c-0.6-0.4-1.4-0.7-2.3-0.7V9
-                C3.2,8.5,2.9,8.1,2.4,8z M46,135.9c0-0.1,0-0.1-0.1-0.2c0-0.1,0.1-0.2,0.1-0.4c0-0.2-0.1-0.3-0.2-0.5c0.4-0.1,0.7-0.4,0.7-0.8
-                l0.1-1.3c0.6,0,1,0.1,1.4,0.1l0.3,0.1c0.5,0.1,1.1-0.1,1.2-0.7c0.2-0.5-0.1-1.1-0.6-1.2c-0.1,0-0.2-0.1-0.4-0.1l-2.4-0.7
-                c-0.3-0.1-0.6,0-0.8,0.1c-0.2,0.1-0.3,0.2-0.3,0.4c-0.3,0-0.5,0-0.8,0l-0.4,0c-0.4-0.1-0.8-0.1-1.3-0.2c-0.9-0.2-1.9-0.8-2.4-3
-                c-0.1-0.3-0.4-0.6-0.7-0.7c-0.3-0.1-0.7,0-1,0.3l-5.1,5.2l-0.2,0.1c-0.6,0.2-1.3,0.3-1.9,0.5c-0.8-0.3-1.4-0.6-1.6-1.4
-                c-0.1-0.4-0.6-0.7-1-0.7c-0.5,0.1-0.8,0.4-0.9,0.9l-0.3,2.7c0,0.3,0.1,0.6,0.3,0.8c0.2,0.2,0.4,0.3,0.7,0.3c0.1,0,0.1,0,0.2,0
-                c0.8-0.1,1.7-0.3,2.6-0.6l0.2,0.1c0.3,0.1,0.6,0.2,0.9,0.3c0.4,0.1,0.8,0.1,1.1-0.2l1-1c2.9-0.8,5.7-1.5,7.9-1.5
-                c0.4,0.1,0.8,0.1,1.3,0.2c0.6,0.2,0.9,0.5,1,0.9l-0.9-0.7c-0.2-0.2-0.5-0.2-0.7-0.2c-0.3,0-0.5,0.2-0.7,0.4c-1.4,1.7-2,3.4-2.7,5
-                c-0.5,1.2-0.9,2.3-1.6,3.4l-0.1,0.2c0-0.3-0.1-0.6-0.4-0.8c-0.3-0.2-0.8-0.3-1.1,0l-1.7,1.1h6.2l4.8-5.3
-                C45.9,136.5,46,136.2,46,135.9z M63.1,125.3c-0.4-0.4-1-0.4-1.4-0.1l-7.2,6c-0.4,0.3-0.5,1-0.1,1.4c0.2,0.2,0.5,0.4,0.8,0.4
-                c0.2,0,0.4-0.1,0.6-0.2c0,0,0,0,0,0l0,0c1.5-1.2,2.7-1.4,4.1-1.7c0.4-0.1,0.8-0.1,1.2-0.2c0.5-0.1,0.9-0.6,0.8-1.1
-                c-0.1-0.5-0.6-0.9-1.1-0.8l-0.1,0l2.3-2.2C63.4,126.3,63.4,125.7,63.1,125.3z M47.1,30.6h-2c-0.1,0-0.2,0-0.3,0.1l-5.9,2
-                c-0.5,0.2-0.7,0.6-0.7,1.1c0.1,0.5,0.5,0.8,1,0.8h7.9c0.5,0,1-0.4,1-1v-2C48.1,31.1,47.6,30.6,47.1,30.6z M22.1,25.1
-                c0.2,0.3,0.5,0.5,0.8,0.5c0.1,0,0.2,0,0.3-0.1c0.6-0.2,1.2-0.4,1.7-0.6c2-0.6,4.1-1.3,5.8-2.9l0.7,0.7c0.2,0.5,0.3,1.1,0.3,1.7
-                c0,0.5,0.5,1,1,0.9c0.5,0,1-0.5,0.9-1.1c0-0.2,0-0.7,0-1.7c0-0.3-0.1-0.5-0.3-0.7l-0.3-0.3c-0.2-0.5-0.5-0.9-0.7-1.2
-                c0.4-0.4,0.8-0.8,1.1-1.2l3.8-3.9c0,0,0.1-0.1,0.1-0.2c0,0,0,0,0,0c0,0,0,0,0,0c0.1-0.1,0.1-0.3,0.2-0.4c0-0.1,0-0.2,0-0.4
-                c0-0.1,0-0.2-0.1-0.2c-0.3-0.6-0.7-1.1-1.2-1.5c0.5-0.4,0.9-0.9,1.2-1.5c0.2-0.4,0.1-1-0.3-1.2C36.9,9.6,36.3,9.7,36,10l-1.4,1.4
-                c-0.3,0.1-0.8,0.2-1.3,0.3c-0.3,0-0.6,0-0.8,0l-1.7,0c-0.5,0-1,0.4-1,1c0,0.5,0.4,1,1,1l1.7,0c0.3,0,0.6,0,0.8,0
-                c0.5,0,0.9,0.1,1.3,0.3l0.7,0.7c-0.9,0.8-1.7,1.7-2.5,2.6l-2.5,2.6c-1,0.9-2,1.5-3,1.7c-0.1-0.1-0.2-0.2-0.3-0.3
-                c-0.7-0.7-1.1-1.2-1.1-1.7c0.2-0.3,0.4-0.6,0.6-0.8c0.9-0.8,1.4-1.2,2.1-1c0.5,0.2,1-0.1,1.2-0.6c0.2-0.5,0-1-0.5-1.3
-                c-0.7-0.4-1.1-0.9-1.3-1.8c0.1-1.1,0.1-2.2-0.1-3.4c-0.1-0.5-0.5-0.9-1-0.8c-0.5,0-0.9,0.5-0.9,1l0,0.8c0,0.8,0,1.7,0.1,2.6
-                c-0.1,1.2-0.5,2.3-1.1,3.2c-0.2,0.2-0.4,0.4-0.6,0.6C24.1,18,24,18.1,24,18.3c0,0.1,0,0.1-0.1,0.2c-0.4,0.4-0.9,0.9-1.5,1.2
-                C22.1,20,22,20.2,22,20.5c0,0.3,0.1,0.6,0.3,0.8l1.3,1.3l-1.3,1.3C21.9,24.2,21.9,24.7,22.1,25.1z M37,18c0,0.3,0.2,0.5,0.3,0.7
-                c0.2,0.2,0.5,0.3,0.8,0.3c0.2,0,0.4,0,0.8-0.2l0.8,0.8l-1.2,1.2c-0.7,0.6-1.5,1.4-2.1,2.2c-0.3,0.4-0.3,1,0.1,1.3
-                c0.2,0.2,0.4,0.2,0.6,0.2c0.3,0,0.5-0.1,0.7-0.3l2-2l0.3-0.3c1.9-1.6,4-3.5,3.9-6.4c0-0.4-0.3-0.8-0.8-0.9c-0.2,0-0.3-0.1-0.5-0.1
-                C41.5,14.7,37,16.5,37,18z M24.9,49.1c-0.3-0.2-0.8-0.2-1.1,0l-1.5,1l-1-1.5c-0.1-0.2-0.4-0.4-0.6-0.4c-0.3,0-0.5,0-0.7,0.2L16.3,51
-                l-1.1-1.4c-0.3-0.4-0.9-0.5-1.3-0.3c-0.3,0.2-0.6,0.4-0.9,0.6c-0.6,0.4-1.1,0.7-1.6,0.8c-0.4-0.1-0.7-0.1-1-0.2
-                c-0.5-0.1-1,0.1-1.2,0.6c-0.2,0.5,0,1,0.4,1.3c0.5,0.3,1,0.4,1.5,0.4c0,0,0.1,0,0.1,0c1,0.2,2.3,0.3,3.8,0.3l0,0
-                c0.1,0.2,0.4,0.4,0.6,0.4c0.1,0,0.1,0,0.2,0c0.2,0,0.4-0.1,0.6-0.2l0.4-0.3c2.1,0,4-0.1,5.5-0.2c0.4,0,0.7,0,1-0.1
-                c0.2,0.2,0.6,0.2,0.8,0.2c0.4-0.1,1.4-0.4,1.2-1.3c0-0.2-0.1-0.4-0.3-0.6l0.1-0.8C25.4,49.7,25.3,49.3,24.9,49.1z M51.5,27.7
-                c0.4,0,0.7,0,1.1,0c0,0,0,0,0,0c0.2,0,0.4-0.2,0.6-0.3c0,0,0.1-0.1,0.1-0.1c0,0,0,0,0,0c0,0,0,0,0,0c0.1-0.2,0.2-0.4,0.1-0.6l-1-6.7
-                c0-0.3-0.2-0.6-0.5-0.7c-0.3-0.1-0.6-0.2-0.9,0c-0.8,0.3-1.1,0.9-1.3,1.3c-0.5,1.2,0.2,2.7,0.9,4.2c0.1,0.1,0.1,0.2,0.2,0.4
-                c-0.2,0.1-0.3,0.2-0.5,0.3c-1.1-0.5-2.3-1.5-3.4-2.5l-0.8-0.7c-0.4-0.3-0.9-0.3-1.3,0.1c-0.4,0.3-0.4,0.9-0.1,1.3
-                c3.3,4.3,4.5,5.1,5.4,5.1C50.9,28.7,51.3,28.2,51.5,27.7z M34.8,32.4c0.2,0.3,0.5,0.4,0.8,0.4c0.2,0,0.3,0,0.5-0.1
-                c0.4-0.2,0.6-0.8,0.5-1.2l-1.3-3.7c0.2,0,0.3-0.1,0.5-0.1l6.8,1.1c0.2,0,0.3,0,0.5,0c2.1-0.8,1.3-3,0.9-4.2
-                c-0.1-0.3-0.2-0.6-0.3-0.9c-0.1-0.3-0.2-0.5-0.5-0.6c-0.2-0.1-0.5-0.1-0.8-0.1c-1.6,0.6-1.5,1.9-1.3,3.1c-2-0.7-3.5-0.8-5.4-0.4
-                l-1.8-0.3c-0.3-0.1-0.7,0.1-0.9,0.3c-0.2,0.2-0.2,0.5-0.2,0.7c-0.1,0-0.2,0-0.2,0.1c-0.3,0.1-0.6,0.3-0.7,0.6
-                c-0.1,0.3-0.1,0.7,0.1,0.9L34.8,32.4z M96.1,137.8c-0.1,0.5,0.2,1.1,0.8,1.2c0.1,0,0.1,0,0.2,0c0.5,0,0.9-0.3,1-0.8l0.3-1.5
-                c0.2-0.1,0.3-0.2,0.5-0.3c0.9-0.6,1.6-1.1,2.4-0.6c0.4,0.2,0.9,0.2,1.2-0.2c0.3-0.3,0.4-0.8,0.1-1.2L101,132c0,0,0,0,0,0l-3.1-4.7
-                c-0.1-0.2-0.4-0.4-0.6-0.4c-0.3-0.1-0.5,0-0.7,0.1l-1.6,1.1c-0.2,0.1-0.4,0.4-0.4,0.6c-0.1,0.3,0,0.5,0.1,0.7l2.7,4
-                c-0.6,1.1-0.9,2.3-1.1,3.5L96.1,137.8z M122.5,142h3.8c0.3-0.4,0.6-0.9,0.7-1.4c0.3,0,0.6-0.2,0.8-0.4c0.2-0.3,0.2-0.6,0.1-0.9
-                c-0.1-0.3-0.2-0.6-0.3-0.9c-0.4-1.2-0.9-2.9-2.8-3.4l0.3-0.5c0.3-0.5,0.1-1.1-0.3-1.3c-0.5-0.3-1-0.7-1.5-1.2c0,0,0,0,0,0
-                c0-0.4-0.2-0.7-0.5-0.9c-0.2-0.1-0.4-0.2-0.7-0.4c-1.4-1.7-2.2-3.7-2-5.1c0.5-1.1,1.4-2,2.7-2.7c0.5-0.2,0.7-0.8,0.5-1.3
-                c-0.2-0.5-0.7-0.7-1.2-0.6c-0.4,0.1-0.6,0.3-1,0.4c0.3-0.2,0.5-0.6,0.5-0.8c0-0.5-0.5-1-1-1l-0.2,0l-0.4-2c-0.1-0.5-0.6-0.9-1.1-0.8
-                l-2.7,0.5c-0.5,0.1-0.9,0.6-0.8,1.2l0.3,1.8c-2.3,0.5-4,1.9-5.7,3.2c-0.5,0.4-0.9,0.8-1.4,1.1c-0.4,0.3-0.5,0.9-0.3,1.3
-                c0.3,0.4,0.9,0.6,1.3,0.3l1.1-0.6c0,0.6,0.2,1.2,0.5,1.8c-0.6,0.7-0.8,1.1-0.6,1.6c0.2,0.4,0.5,0.6,0.9,0.6c1,0,2.6-2.6,3-3.8
-                c0.4-1.4,0.1-2.3-0.3-2.8c0.6-0.4,1.4-0.7,2.3-0.9c0.1,0,0.3,0,0.4-0.1c0.1,0,0.3-0.1,0.4-0.1c1.4-0.3,2.6-0.4,3-0.4l0.3,0
-                c0.1,0,0.2,0,0.4-0.1c-1.5,0.8-2.4,1.9-2.7,3.5c-0.9,2.5,0,5.2,2.4,6.9c-0.2,0.2-0.4,0.3-0.6,0.5c-1.1,0.9-2.5,2-3.4,2
-                c-0.2,0-0.6,0-1.2-1c-0.1-0.3-0.4-0.5-0.7-0.5c-0.3-0.1-0.6,0.1-0.9,0.3l-1.4,1.4c-0.4,0.4-0.4,1,0,1.4l2,2c0.4,0.4,1,0.4,1.4,0
-                l1.2-1.2c2.8-1.1,4-1.3,4.4-1.2c-0.1,1-2.2,3.6-3.2,4.9c-0.4,0.5-0.8,1-1.1,1.4h3.5l3.2-5.3c0.7,0.9,1.2,1.7,1.3,2.4
-                C124,139.7,123.2,140.9,122.5,142z M110.9,140.7c-0.1-0.3-0.4-0.7-1-1c-0.2-0.1-0.3-0.1-0.5-0.1l-0.8,0.1l0.6-0.8
-                c0.3-0.4,0.2-0.9-0.1-1.3c-0.3-0.3-0.8-0.4-1.2-0.2l-5.2,3.2c-0.4,0.3-0.6,0.8-0.4,1.2h3.2c0.1,0,0.2-0.1,0.3-0.1
-                c0.1,0,0.1,0.1,0.2,0.1h1.1l0.9-0.1c0.2,0,0.3,0.1,0.4,0.1h2.5C111,141.6,111.1,141.1,110.9,140.7z M142,141.1l-4.6-2.3
-                c1.2,0.2,1.9,0.3,2.2,0.4c0,0,0,0,0.1,0c0,0,0,0,0,0v0c0.1,0,0.2,0,0.2,0c0.5,0,0.9-0.4,1-0.9c0-0.5-0.4-1-0.9-1.1
-                c-0.1,0-0.5-0.1-0.9-0.2c0.1-0.1,0.1-0.3,0.1-0.4c0-0.3-0.2-0.5-0.4-0.7l-2-1.6c-0.4-0.3-0.9-0.3-1.2,0c-0.1-0.3-0.1-0.5-0.2-0.7
-                l0.1-0.2c0.1-0.2,0.3-0.3,0.4-0.5c0,0,0-0.1,0.1-0.1c0.3,0.1,0.7,0,0.9-0.3l1.3-1.3c0.2,0.2,0.4,0.4,0.5,0.6l0.1,0.1
-                c0.2,0.5,0.3,1.1,0.4,1.8c0,0.5,0.5,0.9,1,0.9c0,0,0,0,0,0c0.5,0,1-0.5,0.9-1.1c0-0.1,0-0.5,0-1.2c0.3-0.3,0.6-0.6,0.9-0.9v-4.2
-                l-1.9,2.9c-0.3-0.4-0.6-0.8-1-1c-0.1-0.3-0.1-0.6,0-0.9c0.2-0.5-0.1-1-0.6-1.2c-0.5-0.2-1,0-1.3,0.5l-1.9,3.9c-0.2,0-0.3,0-0.5,0
-                c-0.7,0.2-1.2,0.7-1.3,1.4c-0.2,0.3-0.5,0.5-0.8,0.6c-0.7-0.2-1.2-0.3-1.7-0.4c-0.1-0.8-0.2-1.6-0.1-2.3c0.3-0.7,0.4-1.5,0.4-2.2
-                l0-0.2c0.6-1.3,1.8-1.4,3.7-0.5c0.2,0.1,0.5,0.2,0.7,0.4c0.5,0.2,1.1,0.1,1.3-0.4c0.2-0.5,0.1-1.1-0.4-1.3c-0.3-0.1-0.5-0.3-0.8-0.4
-                c-1.6-0.8-2.8-1.1-3.8-1.1c-2.3,0-2.6,2-2.7,3c-0.2,0.6-0.4,1.4-0.5,2.3c-0.1,0.1-0.3,0.2-0.6,0.2c-0.5,0-1.1-0.1-1.8-0.4
-                c-0.4-0.1-0.8,0-1,0.2c-0.3,0.3-0.3,0.7-0.2,1l0.7,1.9c0.1,0.3,0.4,0.6,0.8,0.6l1.7,0.3l0.1,1.2c0,0.2,0,0.4,0.1,0.6l0.6,6.2
-                c0,0,0,0.1,0,0.1h2.2c0.8-1.2,0.2-3.1-0.3-4.7c-0.2-0.7-0.4-1.3-0.5-1.8l0-0.3c0.7,0.2,1.4,0.3,2,0.2c0.6,1.1,1.9,2,3.8,2.7
-                c0.1,0.2,0.3,0.4,0.6,0.5c-0.3,0-0.6,0.2-0.8,0.5l-0.3,0.6l-2.8-0.2c-0.5,0-0.9,0.3-1,0.8c-0.1,0.5,0.2,1,0.7,1.1l1.7,0.6h7.8V141.1
-                z M86.8,138.9c-0.4-0.3-1-0.3-1.3,0.1l-3,3h3.3l1.2-1.8C87.2,139.8,87.2,139.3,86.8,138.9z M40.9,0h-6.2l-0.2,0.1
-                C34.2,0.3,34,0.6,34,1c0.1,1.8-1.8,4.4-3.4,6.6l-0.8,1c-0.2,0.3-0.2,0.6-0.1,0.8c-0.1,0.4,0,0.7,0.3,1c0.2,0.2,0.4,0.3,0.7,0.3
-                c0.3,0,0.5-0.1,0.7-0.3l6.3-6.6c0.2-0.2,0.5-0.5,0.7-0.7c0.2,0.4,0.6,0.7,1,0.6l0.4-0.1c0.2,0,0.3,0,0.5,0l-0.6,0.8
-                c-0.3,0.4-0.2,1,0.2,1.4C39.9,5.9,40.1,6,40.3,6l-2.4,1.5c-0.4,0.3-0.6,0.8-0.3,1.3l2.4,4.5c0.2,0.3,0.5,0.5,0.9,0.5
-                c0.1,0,0.1,0,0.2,0c0.4-0.1,0.7-0.4,0.8-0.8l0.8-5c0-0.2,0-0.4-0.1-0.6l-0.6-1.1c-0.1-0.2-0.3-0.4-0.6-0.5c-0.1,0-0.2,0-0.3,0
-                c0,0,0.1,0,0.1-0.1c0.8-0.9,1.7-1.5,2.8-1.6c0.4,0,0.9,0,1.3,0c1.7,0.2,3.6,1.1,5.5,2.2l0,0.8c0,0.3,0.2,0.6,0.4,0.7
-                c0.2,0.2,0.5,0.2,0.8,0.2c0.4-0.1,0.7-0.1,1.1-0.2l0.2,0c0.7,0.4,1.3,0.7,1.9,0.9c0.1,0,0.2,0.1,0.3,0.1c0.3,0,0.6-0.1,0.8-0.4
-                l2-2.8c0.1-0.1,0.1-0.3,0.2-0.4c0.2,0.3,0.5,0.4,0.8,0.4c0,0,0,0,0,0c0.3,0,0.5-0.1,0.6-0.2l7.8,5.9c0.1,0.1,0.2,0.1,0.3,0.1
-                c-0.4,0-0.7,0.3-0.8,0.6c-0.2,0.7-0.1,0.8,1.7,2.4v1.5c0,0.5,0.3,0.9,0.8,1c0.1,0,0.1,0,0.2,0c0.4,0,0.8-0.3,0.9-0.7l0.8-2.5
-                c0.4-0.2,0.6-0.4,0.9-0.7c0.5-0.7,0.6-1.8,0.3-3.3c-0.1-0.4-0.5-0.8-0.9-0.8c-0.5,0-0.8,0.3-1,0.7L70,11.8c-0.4-0.1-0.9-0.3-1.2-0.4
-                c-0.1-0.1-0.3-0.1-0.4-0.1c0.2,0,0.4-0.1,0.5-0.3c0.3-0.4,0.3-1,0-1.3l-5-5.1l4.9-3.3C69.2,1,69.3,0.4,69.1,0h-2.2l-6,3
-                c0.1-0.2,0.2-0.5,0.4-0.8c0.3-0.5,0.6-1,0.9-1.5c0.2-0.3,0.3-0.5,0.5-0.8h-2.5c-0.2,0.4-0.4,0.9-0.6,1.3c-0.3,0.6-0.5,1-0.6,1.4
-                l-0.2,0.4c-0.3,0.5-0.4,0.9-0.5,1.1c0,0-0.1-0.1-0.1-0.1c-0.4-0.3-0.9-0.4-1.3,0c-1.2,1-2.3,1.3-3.2,1.5c-0.3-0.2-0.7-0.4-1-0.6
-                L52.3,0h-2.9c-2,1.6-3.3,2-4.2,2.1c-0.5,0-0.9,0-1.4,0c-0.2,0-0.3,0-0.5-0.1c0-0.1-0.1-0.2-0.1-0.3c-0.2-0.3-0.6-0.5-1-0.5l-2.8,0.4
-                c0,0,0,0-0.1,0c0.1-0.1,0.2-0.2,0.2-0.3L40.9,0z M111.2,103.4l-0.3-0.3c0-0.2-0.1-0.3-0.3-0.4c-0.2-0.2-0.4-0.4-0.7-0.7
-                c-0.3-0.3-0.6-0.5-0.8-0.8c-1.7-2.1-1.8-3.5-0.4-5c0.3-0.3,0.4-0.9,0.1-1.3c-0.3-0.4-0.8-0.5-1.2-0.3c-1.4,0.8-2.3,1.7-2.4,2.9
-                c-0.3,1.9,1.1,3.6,2.5,5c0.3,0.3,0.5,0.6,0.8,1l-1.2,1.2c-0.3,0.3-0.4,0.8-0.1,1.2c0.2,0.4,0.7,0.6,1.1,0.4c0.8-0.3,1.4,0.3,2.2,1.1
-                c0,0,0,0,0,0c-0.2,0.2-0.4,0.4-0.5,0.5c-0.2,0.2-0.3,0.3-0.5,0.5c0-0.3-0.2-0.5-0.4-0.7c-0.4-0.3-1-0.2-1.3,0.2
-                c-2.1,2.5-6.2,3.8-10.3,5.1c-2,0.6-4.2,1.3-6,2.1c-0.4,0.2-0.7,0.7-0.6,1.1c0.1,0.5,0.5,0.8,1,0.7c0.1,0,0.1,0,0.2,0
-                c-0.3,0.3-0.3,0.7-0.1,1.1c0.7,1.3,1.5,2.5,2.6,3.6l4.6,6.5c0.3,0.4,0.7,0.5,1.1,0.3c0.4-0.2,0.7-0.6,0.6-1l-0.1-0.5
-                c0.9,0.5,1.8,0.9,2.8,1.3c1.7,1.1,3.1,2.2,4.1,3.4l-0.9-0.3c-0.3-0.1-0.7-0.1-0.9,0.2c0,0,0,0.1-0.1,0.1c-0.2-0.4-0.8-0.6-1.2-0.4
-                c-0.4,0.2-0.6,0.5-0.6,0.9c0,0.1,0,0.3,0.1,0.4c0.6,1.3,0.1,2.8-1.5,4.7c-0.4,0.3-0.8,0.7-1.2,1c-1,0.8-2,1.7-2.8,2.7
-                c-0.4,0.4-0.8,0.7-0.8,1.1h2.6c1-0.8,2.4-2,3.6-3.4c1-0.9,2-2.1,2.3-3.6c0,0,0,0,0.1,0l3.1,1.1c0.1,0,0.2,0.1,0.3,0.1
-                c0.2,0,0.4-0.1,0.6-0.2c0.3-0.2,0.4-0.5,0.4-0.9l-0.2-1.7c0.7-4-3-5.6-6.1-7c-0.6-0.4-1.2-0.7-1.8-1.1c-2.4-1.5-4.8-2.9-6.7-5
-                l-2.4-3.4c-0.1-0.1-0.1-0.2-0.2-0.2c0.5-0.1,0.9-0.1,1.2-0.1c0,0.4,0.3,0.8,0.7,0.9c0.1,0,0.2,0,0.3,0c0.4,0,0.7-0.2,0.9-0.6
-                c0.8-1.7,3.4-2.6,5.9-3.6c1.6-0.6,3.3-1.2,4.6-2.1c0,0.1,0,0.2,0.1,0.2c-0.5,1.2-0.5,2.5,0,3.9c0.1,0.4,0.5,0.7,0.9,0.7h2
-                c0.5,0,1-0.4,1-1v-3.7c2-0.7,3-1.5,3.3-2.6C114.8,107.1,113.1,105.3,111.2,103.4z M103,117.8c0.5,0,1.1,0.2,1.5,0.3
-                c1.1,0.8,2.1,1.4,3.1,1.7l0.3,2.5c0,0.4,0.3,0.7,0.7,0.8c0.4,0.1,0.8,0,1-0.3l2.6-3.4c0.8-0.5,1.4-1.3,1.7-2.4
-                c0.1-0.5-0.1-0.9-0.5-1.2c-0.4-0.2-0.9-0.1-1.2,0.3l-1.3,1.7c-1,0.3-2.7-0.4-4.3-1c-0.5-0.2-0.9-0.4-1.4-0.5
-                c-1.6-1.1-2.8-1.8-3.7-1.8c-0.6,0-1,0.2-1.4,0.6c-0.6,0.8-0.6,2,0,4.1l0.3,2.2c0,0.3,0.2,0.5,0.4,0.7l2.7,2.1
-                c0.2,0.1,0.4,0.2,0.6,0.2c0.2,0,0.3,0,0.5-0.1c0.3-0.2,0.5-0.6,0.5-1l-0.3-2.2c0-0.3-0.2-0.5-0.4-0.7l-2.3-1.8
-                C102.4,117.8,102.7,117.8,103,117.8z M79.4,0.2c1,1.7,1.6,3.5,1.9,4.3c0.2,0.5,0.4,1.1,1.1,1.1c0,0,0,0,0,0c0.3,0,0.6-0.1,0.8-0.4
-                c0.3-0.3,0.3-0.5,0.1-1.4L85.8,0h-3.3l-0.3,0.3L82,0h-2.8L79.4,0.2z M90,114c-0.4-0.3-1-0.2-1.3,0.2c-0.3,0.3-0.5,0.7-0.8,1
-                c-0.6,0.9-1.2,1.7-2.1,2.3l-3.1,0.5l0.7-1c0.8-0.8,1.9-1.5,2.8-2c0,0,0,0,0,0c0,0,0,0,0,0v0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0.5-0.3,1-0.6,1.4-0.9l1.1-0.7c0.4-0.3,0.6-0.8,0.4-1.3l-0.6-1.1c-0.2-0.3-0.5-0.5-0.8-0.5c-0.4,0-0.7,0.1-0.9,0.4l-0.4,0.5
-                l-5.9,0.9c-0.3,0-0.5,0.2-0.6,0.4l-1.4,1.9c-0.2,0.3-0.2,0.7-0.1,1.1c0.2,0.3,0.6,0.5,0.9,0.5c0.4,0,0.8-0.1,1.2-0.1
-                c0.4-0.1,0.8-0.1,1.2-0.1c-0.8,0.7-1.3,1.5-1.6,2.2l-1.6,2.2c-0.1,0.1-0.3,0.1-0.4,0.2l-2.4,0.4c-0.3,0-0.5,0.2-0.6,0.4l-2,2.8
-                c-0.3,0.4-0.2,1,0.2,1.3c0.2,0.2,0.4,0.2,0.6,0.2c0.3,0,0.5-0.1,0.7-0.3c1.2-1.2,2.5-2.2,4.1-2.9l0.5-0.1c0.3,0,0.5-0.2,0.6-0.4
-                c0.8-0.3,1.6-0.5,2.4-0.8c0.1,0,0.3-0.1,0.4-0.1l3.4,2c0.2,0.1,0.3,0.1,0.5,0.1c0.1,0,0.2,0,0.3-0.1c0.3-0.1,0.5-0.3,0.6-0.6
-                l1.4-3.9c0.1-0.3,0.1-0.7-0.2-0.9c0.6-0.7,1.1-1.4,1.6-2.3C90.6,114.8,90.5,114.3,90,114z M47.4,109.8c-1.3-0.9-3-1.5-4.6-2.2
-                c-3-1.2-6-2.4-6.2-4.6c0-0.5-0.4-0.9-0.9-0.9c-0.5,0-0.9,0.3-1,0.8c-0.7,2.8,1.9,4.1,4,5.2c2.3,1.1,3.3,1.8,3,2.9
-                c-0.1,0.5,0.1,1,0.6,1.2c0.1,0,0.2,0.1,0.4,0.1c0.3,0,0.7-0.2,0.9-0.5c0.2-0.3,0.4-0.4,0.9-0.4c0.1,0,0.2,0,0.4,0
-                c-0.3,0.7-0.3,1.5-0.3,2.2c0,0.3,0,0.6,0,0.9l1,0.1l1,0.1c0-0.3,0-0.7,0-1.1c0-1.5,0.1-1.8,0.7-2c0.3-0.1,0.5-0.3,0.6-0.6
-                C48,110.5,47.8,110.1,47.4,109.8z M89.6,95.3c-0.2-0.3-0.5-0.5-0.8-0.5h-3.9c-0.5,0-0.9,0.3-1,0.8c-0.1,0.4,0.1,0.9,0.5,1.1l2.3,1.1
-                l-0.7,1.5c-1.1,1.2-1.7,1.8-2.8,1.5c-0.5-0.1-1.1,0.2-1.2,0.7c-0.2,0.5,0.1,1.1,0.7,1.2c0.9,0.3,1,0.7,1,1.1c-1,1.4-1.2,1.8-0.9,2.4
-                c0.2,0.3,0.5,0.6,0.9,0.6c0.9,0,1.6-1.4,1.8-2.1l0.3-0.3c0-0.1,0.1-0.1,0.1-0.2l1.9-3.7l0.2-0.2c0.5-0.6,1-1.2,1.6-1.6
-                c0.3-0.2,0.4-0.5,0.4-0.9c0-0.3-0.2-0.6-0.5-0.8l0.3-0.7C89.8,96,89.8,95.6,89.6,95.3z M50.5,114.9c-0.1-0.4-0.4-0.6-0.8-0.7
-                c-0.4-0.1-0.7,0.1-0.9,0.4l-3.9,5.9c-0.2,0.3-0.2,0.7,0,1c0.2,0.3,0.5,0.5,0.9,0.5h3.9c0.4,0,0.8-0.2,0.9-0.6
-                c0.2-0.4,0.1-0.8-0.2-1.1l-1.3-1.3c0,0,0,0,0,0C49.9,118.2,51.1,116.9,50.5,114.9z M35.2,117.1l1.2,0c0.7,0,1.4,0,2,0.3
-                c0.5,0.6,1,1.1,1.6,1.6c0.4,0.3,0.9,0.2,1.2-0.1c0.3-0.3,0.4-0.8,0.2-1.2c-0.4-0.9-1-1.5-1.8-1.9l0,0c-1-1.2-2.2-2.7-4.1-2.7
-                c-0.4,0-0.7,0.1-1.1,0.2c-0.5,0.1-0.8,0.6-0.7,1c0,0.5,0,1,0,1.3c-0.5,0.4-0.9,0.8-1.2,1.2c-1-0.5-2.2-0.4-3.6,0.2
-                c-1.5-0.4-2.8-1.1-3.4-1.6c-0.4-0.3-1-0.3-1.4,0.1c-0.3,0.4-0.3,1,0.1,1.4c0.8,0.7,1.4,1.5,1.9,2.5c-0.4,0.4-0.4,0.9-0.1,1.3
-                c0.2,0.3,0.5,0.5,0.7,0.8l0.2,0.3l0.2,0.8c0.1,0.4,0.2,0.8,0.4,1.2c-0.1,0.1-0.2,0.2-0.3,0.3c-0.8,0.8-1.4,1.4-2.2,1.1
-                c-0.4-0.1-0.9,0-1.1,0.4c-0.2,0.4-0.2,0.9,0.1,1.2c0.2,0.3,0.5,0.5,0.7,0.8c1,1,1.3,1.5,1.1,2.2c-0.1,0.4,0,0.9,0.4,1.2
-                c0.4,0.2,0.9,0.2,1.2-0.1l1.8-1.8c0,0,0,0,0,0l2.9,1.9c0.2,0.1,0.4,0.2,0.5,0.2c0.3,0,0.6-0.1,0.8-0.4c0.3-0.4,0.2-1-0.2-1.4
-                c-0.2-0.2-0.5-0.4-0.7-0.6c-0.7-0.7-1.6-1.5-2.8-1.7l-1.5-1l1.1-1.1c0,0,0,0,0.1-0.1c0.1-0.1,0.1-0.2,0.2-0.3c0.6-1.7-0.4-3-1-3.6
-                c-0.1-0.3-0.2-0.6-0.3-0.9l0.8-0.8c0.6,0.1,1.2,0.2,1.8,0.2c0.4,0,0.8,0,1.2-0.1c0.2,0.7,0.6,1.4,1.2,2.3l0,0.1
-                c0.6,1.6,1.3,3.4,3.1,3.5c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0h0c0,0,0,0,0,0c0.2,0,0.4-0.1,0.6-0.2
-                c0,0,0.1-0.1,0.1-0.1l2-2c0.4-0.4,0.4-1,0-1.4L38,120c-0.4-0.4-1-0.4-1.4,0l-1,1c-0.1-0.2-0.2-0.3-0.4-0.5c-0.3-0.8-0.6-1.5-1-2.1
-                C34.6,118,35,117.6,35.2,117.1z M62.9,102.5l-1.6,6.2c-0.1,0.4,0,0.8,0.3,1c0.2,0.2,0.4,0.2,0.6,0.2c0.1,0,0.3,0,0.4-0.1
-                c1.9-0.9,2-3.2,2.1-5.1c0-0.7,0-1.3,0.1-1.8l0.1-0.5c0-0.1,0.1-0.2,0.1-0.2c0.7,0.3,1.3,0.4,1.9,0.3c0.3,0.8,1,1.8,2.7,2.6
-                c0.1,0.4,0.4,0.6,0.8,0.7c1.4,0.2,2.1,0.4,2.4,0.4c0,0,0.1,0,0.1,0c0.1,0,0.2,0,0.2,0c0,0,0,0,0,0c0.5,0,0.9-0.4,1-0.9
-                c0-0.5-0.4-1-0.9-1.1c-0.1,0-0.2-0.1-0.4-0.1c0.1-0.1,0.1-0.3,0.1-0.4c0-0.3-0.1-0.5-0.2-0.7l-1.4-1.6c-0.3-0.3-0.7-0.4-1.1-0.3
-                c0-0.1,0-0.2,0.1-0.3l0.9-0.7c0.4-0.3,0.5-0.8,0.3-1.2c-0.2-0.4-0.7-0.6-1.2-0.5c-0.7,0.2-1.2,0.6-1.6,1.2c-0.4,0.3-0.9,0.6-1.3,0.8
-                c-0.4-0.2-0.9-0.3-1.2-0.3c0.2-0.7,0.4-1.4,0.7-2.1c0.5-0.6,0.9-1.4,1.2-2.1l0.1-0.3c1.2-1.5,2.5-1.7,4.2-0.8
-                c0.2,0.1,0.4,0.2,0.6,0.3c0.5,0.3,1.1,0.2,1.3-0.3c0.3-0.5,0.2-1.1-0.3-1.4c-0.1-0.1-0.2-0.1-0.3-0.2c0.2,0,0.4,0.1,0.6,0
-                c0.8-0.3,1.4,0.3,2.2,1.1c0.3,0.3,0.5,0.5,0.8,0.7c0.2,0.2,0.4,0.2,0.6,0.2c0.2,0,0.4-0.1,0.6-0.2c0.4-0.3,0.5-0.7,0.4-1.1
-                c-0.5-1.4-1.4-2.8-2.2-4.2c-1.9-3.1-3-5.2-1.9-6.7c0.3-0.4,0.3-0.9,0-1.3c-0.3-0.4-0.9-0.4-1.3-0.2c-2.6,1.7-1.3,4.3-0.4,6.2
-                c1.1,2.3,1.3,3.1,0.4,3.7c-0.4,0.3-0.6,0.8-0.4,1.3c0,0.1,0.1,0.2,0.2,0.2c-1.3-0.8-2.5-1.1-3.4-1.1c-2.1,0-2.9,1.7-3.3,2.7
-                c-0.5,0.7-0.9,1.4-1.3,2.4c-0.3,0.3-0.6,0.4-1.1,0.4c0,0,0,0,0,0c-0.4,0-1-0.1-1.6-0.4c-0.3-0.1-0.6-0.1-0.9,0.1
-                c-0.3,0.2-0.4,0.5-0.4,0.8v1.9c0,0.5,0.3,0.9,0.8,1l1.3,0.2l-0.2,0.9C63,102.1,63,102.3,62.9,102.5z M49,125.2
-                c-0.1-0.5-0.3-1.2-1.1-1.2c-0.9,0-1,0.3-1.2,2.8l-1.2,0.9c-0.4,0.3-0.5,0.8-0.3,1.2c0.2,0.4,0.5,0.6,0.9,0.6c0.1,0,0.2,0,0.3,0
-                l2.5-0.7c1.1,0.7,2.4,0.3,3.9-1.3c0.3-0.3,0.4-0.8,0.1-1.2c-0.2-0.4-0.7-0.6-1.1-0.4l-2.3,0.7C49.2,126,49.1,125.5,49,125.2z
-                 M21.7,132.6c0.2-0.2,0.3-0.6,0.2-0.9c-0.1-0.3-0.3-0.6-0.6-0.7c-0.6-0.2-1.3-0.4-1.9-0.4c-1.6,0-3.1,0.7-4.3,1.3c-1,0.5-2,1-2.8,1
-                c-0.4,0-1-0.1-1.7-0.8c1.6-1.4,1.6-3.7,1.5-5.3l0-0.8c0-0.4-0.2-0.7-0.5-0.9c-0.3-0.2-0.7-0.1-1,0.1c-2.5,1.7-3.7,3.6-3.7,5.6
-                c0,3.3,3.2,5.7,4.9,6.9c0.1,0.1,0.2,0.2,0.4,0.3c0,0.1,0,0.1,0.1,0.2c0.1,0.4,0.5,0.7,0.9,0.7c0.8,0,1.1-0.6,1.1-0.7
-                c0.2-0.5,0-0.9-0.3-1.1c0.1-0.5,0.5-1,1.1-1.7c0.2-0.2,0.3-0.4,0.5-0.5c0.7-0.1,1.3,0.4,2,1.1c0.3,0.3,0.5,0.5,0.8,0.7
-                c0.3,0.3,0.8,0.3,1.2,0.1c0.4-0.2,0.5-0.7,0.4-1.1c-0.3-0.8,0.1-1.2,1.1-2.2C21.3,133.1,21.5,132.9,21.7,132.6z M2.5,50.1
-                c0.1-0.7-0.1-1.2-0.3-1.4C1.6,48,0.7,48,0.4,48c-0.1,0-0.1,0-0.2,0l0-0.7c0-0.2-0.1-0.3-0.2-0.5v8.7c0.2-0.1,0.5-0.2,0.7-0.2
-                c0.9-0.3,1.8-0.6,2.7-0.9c0,0,0,0,0,0c0.1,0,0.2,0,0.3-0.1c0.5-0.2,1-0.5,1.5-0.8c1.5-0.9,2.7-2.2,3.5-4c0.2-0.5,0.1-1-0.3-1.3
-                c-0.4-0.3-1-0.2-1.3,0.2c-0.3,0.3-0.5,0.7-0.8,1c-0.6,0.9-1.3,1.7-2.2,2.4c-0.4,0.2-0.8,0.4-1.2,0.6c-0.3,0-0.5,0.1-0.8,0.1
-                c-0.4,0.1-0.9,0.1-1.3,0.1l1.5-2.1C2.4,50.4,2.5,50.3,2.5,50.1z M28.2,142H32c0.1-0.5,0-1.1,0-1.6c0.4-1.2,0.3-2.6-0.2-4
-                c-0.1-0.4-0.6-0.7-1-0.6c-0.4,0-0.8,0.3-0.9,0.8c-0.2,1-0.1,2.2,0.1,3.3l0,0.3C29.7,140.8,29.1,141.4,28.2,142z M28.8,137.2l-4.9-3
-                c-0.3-0.2-0.6-0.2-0.8-0.1c-0.3,0.1-0.5,0.3-0.6,0.6l-1.4,3.9c-0.1,0.3-0.1,0.7,0.2,1c0.2,0.2,0.5,0.4,0.8,0.4c0,0,0.1,0,0.1,0
-                l6.4-0.9c0.4-0.1,0.7-0.4,0.8-0.8C29.3,137.9,29.1,137.4,28.8,137.2z M114.2,75.5c-0.1-0.4-0.6-0.7-1-0.6c-0.4,0-0.8,0.3-0.9,0.8
-                c-0.2,1-0.1,2.2,0.1,3.4l0,0.3c-0.3,0.7-1,1.4-1.9,2c-0.5-0.2-1.2-0.4-1.9-0.7c-0.4-0.2-0.8-0.1-1.1,0.2c-0.3,0.3-0.4,0.7-0.2,1.1
-                l0.3,0.9c-0.1,0.1-0.3,0.1-0.4,0.2l-0.2,0.1c-1.6-0.1-2.3,0.6-2.6,1.3c-0.7,0.4-1.4,1.1-1.5,2.1c-0.1,1.3,0.9,2.4,1.7,3.1
-                c0.1,0.1,0.3,0.2,0.5,0.2l3,0.5c0.1,0,0.1,0,0.2,0c0.4,0,0.8-0.3,0.9-0.7c0.2-0.5,0-1-0.5-1.2c-1.3-0.7-1.7-1.7-2.1-2.9
-                c0-0.1,0-0.1-0.1-0.2c0.3-0.1,0.5-0.3,0.8-0.4c0.2,0,0.5,0.1,0.7,0.1c0.4,0.1,0.8,0.1,1.1,0.1c0.3,0,0.7-0.1,0.9-0.4
-                c0.2-0.3,0.3-0.6,0.1-0.9l-0.1-0.2c0.2-0.1,0.5-0.2,0.7-0.4c1.4,0.3,2.4,0.1,3-0.7c0.7-0.8,0.7-2,0.6-3.2
-                C114.9,78.3,114.8,77,114.2,75.5z M98.1,4.2c0,0,0.1,0,0.1,0c1,0.3,2,1.2,2.8,2.1c0.6,0.7,1.2,1.3,1.8,1.8c0.1,0.1,0.3,0.2,0.4,0.2
-                c0,0,0,0,0,0c0.1,0,0.1,0,0.2,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0.2,0,0.5-0.1,0.7-0.3l2-2c0.2-0.2,0.3-0.4,0.3-0.7
-                c0-0.3-0.1-0.5-0.3-0.7l-1.4-1.4c-0.4-0.4-1-0.4-1.4,0l-1.2,1.2c-0.9-1.1-2-2.2-3.6-2.3c-1-0.2-2.1-0.2-3.2,0.2
-                c-0.1,0-0.3,0.1-0.4,0.2c-0.7,0.6-1.3,1.8-0.4,3.8c0,0.4,0,0.8,0.2,1.2c0,0.2,0.1,0.3,0.3,0.4c1,1,1.5,1.5,1.7,1.7c0,0,0,0,0.1,0.1
-                c0.2,0.2,0.5,0.3,0.7,0.3c0.4,0,0.7-0.2,0.9-0.6c0.2-0.4,0-0.8-0.2-1.1v0c-0.2-0.2-1-1.1-1.5-2.2c0.2-0.5,0.6-0.9,1.1-1.4
-                C97.8,4.5,98,4.4,98.1,4.2z M31.1,40.3l4.5-5.8c0.2-0.3,0.6-0.4,0.9-0.4c0.4,0.1,0.6,0.3,0.8,0.6c0.8,2.1,1.8,2.6,2.7,2.7
-                c0.5,0,1,0,1.4,0c0.4,0,0.7-0.1,1.1-0.1c0.1-0.2,0.2-0.3,0.3-0.4c0.2-0.2,0.5-0.3,0.8-0.2l2.5,0.4c0.1,0,0.3,0,0.4,0.1
-                c0.5,0.1,0.9,0.6,0.8,1.2c0,0.1,0,0.1-0.1,0.1c0.3-0.4,0.8-0.6,1.2-0.3c0.3,0.1,0.6,0.3,0.9,0.4c0.4,0,0.9-0.3,1.4-0.6
-                c0.3-0.2,0.6-0.4,0.9-0.5c0.5-0.2,1-0.1,1.3,0.4l1.1,1.7l3.4-2.2c0.2-0.1,0.5-0.2,0.8-0.1c0.3,0.1,0.5,0.2,0.6,0.5l0,0l1.5-3.4
-                c-0.5-0.8-0.9-0.8-1-0.8c-0.5,0-1.3,0.4-2,0.9c-1,0.6-2.1,1.2-3.2,1.2c-0.2,0-0.3,0-0.4,0c-0.9,0-1.4,0-1.5,0c0,0-0.1,0-0.1,0
-                c-0.5,0-1-0.4-1-0.9c0-0.5,0.4-1,0.9-1c0.8-0.1,1.4-0.2,1.8-0.4c-0.4-0.2-0.7-0.5-0.8-0.7c-0.3-0.4-0.5-1.2-0.1-2.3
-                c0.1-0.3,0.4-0.5,0.7-0.6c0.3-0.1,0.7,0,0.9,0.3l1.7,1.7c2.1-0.2,5.2-1.6,7-3.6l1-2.3c-0.1,0.1-0.2,0.3-0.4,0.4l-0.8,0.4
-                c0,0.1,0,0.2-0.1,0.3c-0.2,0.3-0.5,0.6-0.9,0.6c0,0,0,0,0,0c-0.4,0-0.7-0.2-1.1-0.5c-0.2-0.2-0.4-0.5-0.4-0.8
-                c-0.2-0.2-0.4-0.5-0.7-0.8c-0.9-1.2-2.2-2.7-3.4-4.4l-0.4-0.2c-0.5-0.2-0.8-0.8-0.6-1.3l0,0c-0.8-1.2-1.5-2.3-1.9-3.3
-                c-0.3-0.5-0.6-1-0.6-1.6c-0.1-0.5,0.3-1,0.8-1.1c0.5-0.1,1,0.2,1.1,0.6c0.1,0.3,0.2,0.6,0.4,0.9c0.3,0.3,0.9,0.6,1.6,0.8
-                c0.3,0.1,0.7,0.3,1,0.4c0.5,0.2,0.7,0.7,0.5,1.2L57.4,19l0.1,0.1l4.2,1.5c0.5,0.2,0.8,0.8,0.6,1.3l-0.6,1.7l1.7,0.6
-                c0.4,0.1,0.6,0.5,0.6,0.9c0,0.2,0,0.3-0.1,0.4l0.5-1.2c0.2-0.4,0.6-0.7,1.1-0.6c0.5,0.1,0.8,0.5,0.8,1c0,1.5-0.6,3-1.8,4.3l-2.2,5.2
-                c0.6,2-0.6,3.3-1.5,4.2c-0.2,0.2-0.4,0.4-0.6,0.7c0,0.1-0.1,0.1-0.2,0.1l1-0.6c0.3-0.2,0.7-0.2,1.1,0c0.3,0.2,0.5,0.6,0.4,1l-0.1,1
-                c0.2,0.2,0.3,0.4,0.3,0.7c0,0.9-0.9,1.1-1.3,1.1c0,0-0.1,0-0.1,0c-0.3,0-0.5-0.1-0.7-0.3c0,0,0,0,0,0c-0.3,0-0.6,0-1-0.1
-                c-1.4-0.1-3.3-0.2-5.2-0.5L54,41.8C53.8,42,53.5,42,53.2,42c-0.3-0.1-0.5-0.2-0.6-0.5l-0.1-0.1c-1.4-0.2-2.6-0.5-3.6-0.8
-                c-0.5-0.1-1.1-0.3-1.6-0.7c-0.3-0.3-0.5-0.7-0.3-1.1c-0.2,0.3-0.6,0.5-1,0.4l-0.3-0.1c-0.4-0.1-0.9,0-1.4,0v1.3c0,0.5-0.4,0.9-0.9,1
-                c-0.5,0-1-0.3-1-0.8c-0.1-0.7-0.4-1-1.1-1.1c-0.5,0-0.9,0-1.3,0c-2,0.2-4.8,1.3-7.6,2.4L31.5,43c-0.2,0.3-0.6,0.5-1,0.3
-                c-0.3-0.1-0.6-0.1-0.9-0.2l-0.2,0c-0.9,0.4-1.8,0.7-2.5,0.9c-0.1,0-0.2,0-0.3,0c-0.2,0-0.4-0.1-0.6-0.2c-0.2-0.2-0.4-0.5-0.4-0.8
-                v-2.8c0-0.5,0.3-0.9,0.8-1c0.4-0.1,0.9,0.1,1.1,0.5c0.3,0.7,0.9,1,1.8,1.2c0.6-0.2,1.2-0.5,1.8-0.7L31.1,40.3z M59.6,39.5L59.6,39.5
-                l0.1,0C59.7,39.5,59.7,39.5,59.6,39.5z M71.7,5.5L72.2,6C73,6.9,73.7,8.4,74,9.6c-0.2,0.1-0.4,0.3-0.5,0.5c-0.1,0.3-0.1,0.6,0.1,0.8
-                c0.3,0.6,0.7,1.3,1.5,1.3c0.3,0,0.6-0.2,0.8-0.4c0.2-0.2,0.3-0.4,0.3-0.7c0.3,0,0.7,0,1-0.1c-0.1,0-0.2,0.1-0.2,0.2l-1,1.1
-                c-0.2,0.2-0.3,0.5-0.2,0.7c0,0.3,0.2,0.5,0.4,0.7l0.9,0.7c0.3,0.3,0.7,0.5,1,0.8c0.1,0.1,0.2,0.2,0.3,0.2c0.6,0.5,1.3,1.2,1.8,1.8
-                l0.6,1.6c-0.1,0-0.2,0-0.4,0c-0.4,0-0.9-0.1-1.3-0.1c-0.3,0-0.5-0.1-0.8-0.1c-0.3-0.2-0.6-0.4-0.9-0.6c-0.6-0.6-0.9-1.4-1.2-2.2
-                c-0.1-0.4-0.3-0.7-0.4-1.1c-0.2-0.4-0.7-0.7-1.2-0.5c-0.5,0.1-0.8,0.6-0.7,1.1c0.3,1.8,1,3.2,2.2,4.2c0.4,0.3,0.8,0.6,1.3,0.9
-                c0.1,0.1,0.2,0.1,0.4,0.1c0.7,0.4,1.5,0.6,2.3,0.9c0.6,0.2,1.3,0.4,1.9,0.7c0.1,0.2,0.4,0.4,0.7,0.5l0.4,0.1
-                c1.3,0.7,2.2,1.6,2.9,2.7c0.2,0.3,0.5,0.5,0.8,0.5c0.1,0,0.3,0,0.4-0.1c0.5-0.2,0.7-0.8,0.5-1.2l-1-2.8c-0.1-0.3-0.4-0.6-0.8-0.6
-                l-2.3-0.4c-0.1,0-0.1-0.1-0.2-0.1l-0.7-2c0-0.8-0.3-1.6-0.9-2.5l0,0c0.2-0.1,1,0,1.7,0.1c0.4,0.1,0.8,0.1,1.1,0.1
-                c0.3,0,0.7-0.1,0.9-0.4c0.2-0.3,0.3-0.6,0.1-0.9l-0.7-1.9c-0.1-0.3-0.4-0.6-0.8-0.6l-5.4-0.9l-0.1-0.3c-0.1-0.2-0.3-0.4-0.5-0.5
-                c0.4,0,0.8,0,1.1-0.1l2.1,0.3c0.3,0.1,0.6,0,0.8-0.2c0.2-0.2,0.3-0.5,0.3-0.8c0-0.6-0.1-1.2-0.3-1.8c0-1-0.6-2.4-1.8-4.2
-                C80.2,4.1,80.1,4,80,3.9l-1.2-0.7C77,1.8,75,0.7,72.8,0.1c-0.5-0.1-1,0.1-1.2,0.6c-0.2,0.5,0,1,0.5,1.2l5.5,3
-                c1.2,1.1,2.1,2.4,2.6,3.7c-0.1,0.1-0.3,0.2-0.9,0.3l-2.9-0.5c-0.3-1.6-1.6-2.9-2.9-4c-0.2-0.2-0.4-0.4-0.7-0.6l-1.7-1.4
-                c-0.3-0.2-0.6-0.2-1-0.1c-0.3,0.1-0.6,0.4-0.6,0.8c0,0-0.1,0.1-0.5,0.1c-0.4,0-0.9-0.1-1.3-0.1C67.3,3.1,66.9,3,66.6,3
-                c-0.5,0-1,0.3-1,0.8c-0.1,0.5,0.2,1,0.7,1.1c0.5,0.1,1,0.6,1.4,1.3c0.7,2.3,1,2.9,1.8,2.9c0.4,0,0.7-0.2,0.9-0.5
-                c0.4-0.7-0.2-2-0.6-2.8C70.3,5.4,71,5.1,71.7,5.5z M56.6,11.7c-0.5,0.2-0.8,0.6-0.7,1.1c0.1,0.5,0.6,0.8,1.1,0.8
-                c0.8-0.1,1.6,0.1,2.4,0.7l0.5,0.5c0.4,0.4,0.9,0.9,1.3,1.3l0.4,0.5c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.1,0.2,0.2,0.3,0.3l0.1,0.1
-                c0.4,0.5,0.8,1.1,1.2,1.6l-0.6,0.6c-0.3,0.3-0.4,0.7-0.2,1.1c0.2,0.4,0.5,0.6,0.9,0.6c0,0,0,0,0.1,0l4.3-0.3c0.5,0,0.8-0.4,0.9-0.8
-                c0.1-0.5-0.2-0.9-0.6-1.1c-0.6-0.3-1.2-0.5-1.7-0.9V18c0.7,0.1,1.4,0.3,1.9,0.7c0.2,0.2,0.3,0.4,0.5,0.7c0.2,0.5,0.8,0.7,1.3,0.4
-                c0.5-0.2,0.7-0.8,0.5-1.3c-0.2-0.5-0.5-0.9-0.9-1.2c-1.2-1.2-2.9-1.4-4.4-1.5c-0.3,0-0.5-0.1-0.8-0.1c-0.1-0.3-0.2-0.6-0.2-0.9
-                c0.2-0.2,0.4-0.4,0.6-0.6c0.2-0.3,0.5-0.5,0.7-0.8c0.2-0.2,0.3-0.5,0.2-0.8c0-0.3-0.2-0.5-0.4-0.7l-0.2-0.1c0.1-0.1,0.1-0.2,0.2-0.3
-                c0.2-0.3,0.3-0.7,0.1-1.1c-0.2-0.3-0.6-0.5-0.9-0.5l-2.1,0.1c-0.4,0-0.8,0.3-0.9,0.7c-0.1,0.4,0,0.8,0.4,1.1l0.8,0.6
-                c-0.2,0.6-0.3,1.1-0.4,1.7c0,0,0,0.1-0.1,0.1c-0.5-0.6-1-1.1-1.6-1.5c-0.6-0.6-1.2-1.2-1.5-1.8c0-0.4,0.1-0.8,0.1-1.2
-                c0-0.3,0-0.6,0-0.9c0-0.5-0.3-0.9-0.7-1c-0.5-0.1-0.9,0.1-1.1,0.5c-0.5,0.9-0.6,1.9-0.3,2.8C57,11.5,56.8,11.6,56.6,11.7z
-                 M92.4,41.1c-0.2-0.3-0.6-0.4-1-0.4l-5.5,1c-1.7-0.5-3.4-0.9-5.1-1.2c-2.5-1.8-2.8-2.5-2.8-2.7c0,0,0,0,0,0c0.1-0.5-0.1-1.1-0.7-1.2
-                c-0.5-0.2-1.1,0.1-1.2,0.6c0,0,0,0,0,0l0,0c0,0,0,0,0,0l-1,3.4c-0.1,0.3,0,0.6,0.2,0.9c0.2,0.2,0.5,0.4,0.8,0.4c0.9,0,2.3,0.2,4,0.5
-                l0.3,0.2c0.7,0.5,1.5,1.1,1.7,1.4c0.2,0.3,0.6,0.4,0.9,0.3l2.8-0.5c1.9,0.6,3.5,1.2,4.9,1.8c0.7,1.1,2,1.8,3.2,2.4
-                c0.2,0.3,0.1,0.5-0.1,0.8c-0.3,0.4-0.2,1,0.2,1.3c0.2,0.2,0.4,0.2,0.6,0.2c0.3,0,0.5-0.1,0.7-0.3l1-1c0.5,0.2,1,0.5,1.4,0.8
-                c0,0,0,0,0,0c-0.1,1,0.1,1.9,0.2,2.8c0,0.2,0.1,0.5,0.1,0.7l-0.4,0c-0.3,0-0.5,0.1-0.7,0.3l-2,2c-0.3,0.3-0.4,0.7-0.2,1.1
-                c0.1,0.4,0.5,0.6,0.9,0.6l0.5,0c2.1,0,3.4-0.7,3.8-2c1.3,0.1,2.2,0.4,2.8,1.4c0.2,0.4,0.6,0.6,1.1,0.5c0.4-0.1,0.8-0.5,0.8-1v-2
-                c0-0.4-0.2-0.7-0.6-0.9c-0.9-0.4-1.7-0.7-2.2-0.9c-0.2-0.6-0.8-1.5-2.2-3.1c0-0.3,0-0.6-0.2-0.8c-0.1-0.1-0.1-0.2-0.2-0.2l-1.8-1.8
-                c-0.4-0.4-1-0.4-1.4,0l0,0l-0.7-0.3c-0.6-0.8-1.6-1.5-3-2.2c-0.2-0.5,0-1.2,0.3-2C92.7,41.8,92.6,41.4,92.4,41.1z M123.5,2.2
-                c0.9-0.5,2-1.2,2.8-2.2h-3.8c-0.1,0.2-0.3,0.5-0.4,0.7C123.5,2.2,122.1,2.1,123.5,2.2z M70.7,63.1c-0.1,0.5,0.2,1,0.7,1.2
-                c0.3,0.1,0.7,0.2,1.1,0.2c1.3,0.2,2.1,0.4,2.5,1.3l0,0v0c0.2,0.4,0.5,0.6,0.9,0.6c0.1,0,0.3,0,0.4-0.1c0.5-0.2,0.7-0.8,0.5-1.3
-                L74,59c-0.2-0.5-0.8-0.7-1.3-0.5c-0.5,0.2-0.7,0.7-0.6,1.2l0.9,2.8l-1.2-0.2C71.3,62.2,70.8,62.6,70.7,63.1z M136.6,103.8
-                c-0.4-0.2-0.8-0.1-1.1,0.2c-0.3,0.3-0.4,0.7-0.2,1.1l0.7,1.9c0.1,0.3,0.4,0.6,0.8,0.6l1.7,0.3c0.3,0.3,0.7,0.6,1.2,0.9
-                c0.1,0.1,0.2,0.1,0.4,0.2c0.6,0.2,1.3,0.4,1.9,0.5v-2.3c-0.3,0-0.7-0.1-1-0.1l-0.1-0.2c0,0,0,0,0,0l-0.5-1.3
-                c0.2-0.2,0.4-0.4,0.6-0.6c0.2-0.2,0.4-0.5,0.7-0.8l0.2-0.2c0.1-0.1,0.1-0.2,0.2-0.2v-3.9c-0.4-0.1-0.9-0.3-1.4-0.4
-                c-0.3-0.1-0.6-0.1-0.8,0.1l2.2-3.1v-1.2c0,0-0.1-0.1-0.1-0.1c-0.3-0.2-0.6-0.3-0.9-0.2c-0.3-0.1-0.7,0-0.9,0.2l-7.9,7.1
-                c-0.4,0.3-0.4,0.8-0.2,1.2c0.2,0.3,0.5,0.5,0.8,0.5c0.1,0,0.2,0,0.3,0c0.1,0,0.2,0,0.3,0c0.1,0,0.2,0,0.3-0.1l3.7-1.4
-                c0.2-0.1,0.3-0.2,0.5-0.3l1.5-2c0,0.2,0,0.4,0,0.6l0.8,2.2l-0.6,0.7C138.7,104.3,137.9,104.4,136.6,103.8z M131,1.9
-                c-0.2-0.3-0.6-0.6-0.9-0.5l-2.1,0.1c-0.4,0-0.8,0.3-0.9,0.7c-0.1,0.4,0,0.8,0.4,1.1l0.8,0.6c-0.2,0.6-0.3,1.1-0.4,1.7
-                c-0.6,0.9-0.6,1.9-0.1,2.8c0.1,0.1,0.2,0.3,0.3,0.4l1,0.7c0.1,0.1,0.2,0.2,0.3,0.4l-1,1c-0.3,0.3-0.4,0.7-0.2,1.1
-                c0.2,0.4,0.5,0.6,0.9,0.6c0,0,0,0,0.1,0l4.3-0.2c0.5,0,0.8-0.4,0.9-0.8c0.1-0.5-0.2-0.9-0.6-1.1c-0.6-0.3-1.2-0.6-1.7-0.9
-                c0-0.3-0.2-0.5-0.4-0.7l-1.1-0.8c-0.4-0.6-0.6-1.2-0.6-1.8c0.2-0.2,0.4-0.4,0.6-0.6c0.3-0.3,0.5-0.5,0.7-0.8
-                c0.2-0.2,0.3-0.5,0.2-0.8c0-0.3-0.2-0.5-0.4-0.7l-0.2-0.1c0.1-0.1,0.1-0.2,0.2-0.3C131.1,2.7,131.2,2.3,131,1.9z M48.6,5.6
-                c-0.3-0.3-0.8-0.4-1.2-0.1l-3.6,2.3c-0.3,0.2-0.5,0.6-0.4,1c0.1,0.4,0.4,0.7,0.8,0.8l1.4,0.2c0,0.2,0,0.3,0,0.5l-0.4,1.2
-                c0,0.1-0.1,0.3,0,0.5c0.2,1,0.7,1.8,1.7,2.2c0.4,0.4,0.8,0.8,1.3,1.2l-0.3,0.9c-0.1,0.4,0,0.8,0.3,1.1c0.2,0.1,0.4,0.2,0.6,0.2
-                c0.2,0,0.4-0.1,0.5-0.2l1.8-1.2c0.3-0.2,0.5-0.6,0.4-1c-0.1-0.4-0.3-0.7-0.7-0.8c-0.1,0-0.2-0.1-0.3-0.1l0.1-0.2
-                c0.1-0.3,0.1-0.5-0.1-0.8c-0.1-0.2-0.4-0.4-0.6-0.5c-0.3-0.1-0.7-0.1-1-0.2c-0.3,0-0.6-0.1-0.8-0.2c-0.3-0.5-0.5-1.2-0.5-1.8L48,9.4
-                C48,9.1,48,8.8,47.9,8.6c0.2-0.6,0.5-1.2,0.9-1.7C49,6.5,49,6,48.6,5.6z M8.7,138.9c0.4-0.1,0.7-0.4,0.8-0.7c0.1-0.4-0.1-0.8-0.4-1
-                l-3.4-2.5c-0.5-0.8-1.3-1.4-2.4-1.7c-0.5-0.1-0.9,0.1-1.1,0.5c-0.2,0.4-0.1,0.9,0.3,1.2l1.7,1.2c0.3,1-0.3,2.8-0.8,4.4
-                c-0.2,0.5-0.3,0.9-0.5,1.4c-0.1,0.1-0.1,0.2-0.2,0.3H5c0.6-1,1.1-1.9,1.3-2.7L8.7,138.9z M71.6,17.3l-2,5.9c-0.1,0.3,0,0.6,0.1,0.9
-                c0.2,0.3,0.5,0.4,0.8,0.4h1.8c0.2,0.1,0.4,0.1,0.6,0.2c0.3,1,0.6,1.8,0.9,2.7c-0.1,0.1-0.2,0.3-0.4,0.4c-1,1.1-2.2,2.3-1.9,3.8
-                c0.1,0.4,0.3,0.7,0.7,0.8c0.4,0.1,0.7,0,1-0.2l1.2-1.2c0.6,0.6,1.2,1.1,1.8,1.7c1.7,1.5,3.3,2.8,3.2,4.8c0,0.4,0.2,0.8,0.6,1
-                c0.1,0,0.2,0.1,0.3,0.1c0.3,0,0.6-0.1,0.8-0.4l1.2-1.5l3.5-0.1c0.5,0,0.9-0.4,1-1c0-0.5-0.4-1-0.9-1c-4.6-0.3-7.7-2.4-9.7-6.7
-                c0.5-0.7,0.8-1.5,0.6-2.4c-0.3-1.1-1.3-1.7-2.1-2.1c-0.4-1.7-0.7-3.5-1-5l-0.1-0.8c-0.1-0.4-0.4-0.8-0.9-0.8
-                C72.1,16.6,71.8,16.9,71.6,17.3z M3.7,128.8c0.4,0.1,0.9-0.1,1.1-0.5c0.2-0.4,0.2-0.9-0.2-1.2l-2-2c-0.2-0.2-0.5-0.3-0.8-0.3
-                c-0.3,0-0.6,0.2-0.7,0.4L0,127.2v4.2c0.2-0.2,0.4-0.5,0.6-0.7C1.7,129.5,2.5,128.5,3.7,128.8z M103.6,0.5c0.7-0.2,1.4-0.4,2-0.5
-                h-3.2c0,0,0,0,0,0C102.6,0.5,103.1,0.7,103.6,0.5z M25.3,33.6L24,34.3c-0.1-0.1-0.2-0.3-0.2-0.4l-0.4-1.2c0-0.2-0.1-0.3-0.2-0.4
-                c-0.7-0.8-1.6-1-2.7-0.8c-0.5-0.1-1.1-0.2-1.7-0.2l-0.3-0.9c-0.1-0.4-0.5-0.7-0.9-0.7c-0.4,0-0.8,0.2-1,0.6l-0.8,2
-                c-0.1,0.4-0.1,0.8,0.2,1.1c0.3,0.3,0.7,0.4,1,0.3c0.1,0,0.2-0.1,0.3-0.1l0.1,0.2c0.1,0.3,0.3,0.5,0.5,0.6c0.2,0.1,0.5,0.1,0.8,0
-                c0.3-0.1,0.6-0.3,0.9-0.4c0.3-0.1,0.5-0.3,0.8-0.4c0.6,0.2,1.1,0.6,1.5,1.2l0.4,1.3c0.1,0.3,0.3,0.5,0.5,0.6
-                c0.2,0.6,0.3,1.2,0.3,1.9c0,0.1,0,0.3,0.1,0.4c0,0,0,0-0.1-0.1c-0.3-0.1-0.8-0.1-1,0.2c-2.7,2.5-4.4,3-5.5,3.1c-0.5,0-0.9,0-1.4,0
-                c-0.2,0-0.3,0-0.5-0.1c0-0.1-0.1-0.2-0.1-0.3c-0.2-0.3-0.6-0.5-1-0.5l-2.8,0.4c-0.1,0-0.3,0-0.4,0.1C10,42,9.6,42.5,9.7,43
-                c0.1,0.5,0.6,0.9,1.1,0.8l0.4-0.1c0.2,0,0.3,0,0.5,0l-0.6,0.8c-0.3,0.4-0.2,1,0.2,1.4c0.4,0.3,1,0.3,1.4-0.1
-                c0.8-0.9,1.7-1.5,2.8-1.6c0.4,0,0.9,0,1.3,0c1.7,0.2,3.6,1.1,5.5,2.2l0,0.8c0,0.3,0.2,0.6,0.4,0.7c0.2,0.2,0.5,0.2,0.8,0.2
-                c0.4-0.1,0.7-0.1,1.1-0.2l0.2,0c0.7,0.4,1.3,0.7,1.9,0.9c0.1,0,0.2,0.1,0.3,0.1c0.3,0,0.6-0.1,0.8-0.4l2-2.8c0.3-0.4,0.2-1-0.1-1.3
-                c-0.4-0.3-0.9-0.4-1.3,0c-1.2,1-2.3,1.3-3.2,1.5c-0.3-0.2-0.7-0.4-1-0.6l-0.3-5.4c0-0.1-0.1-0.2-0.1-0.4c0.1,0.1,0.2,0.1,0.3,0.1
-                c0.1,0,0.1,0,0.2,0c0.4,0,0.8-0.2,0.9-0.6l1.6-4c0.2-0.4,0.1-0.8-0.2-1.1C26.1,33.5,25.7,33.4,25.3,33.6z M13.1,30.9
-                c-1.7,0.5-2,2-2,3.2c-1.9-0.8-3.4-1-5.7-0.5l-1.7-0.3c-0.3-0.1-0.6,0-0.8,0.2c-0.2,0.2-0.3,0.5-0.3,0.8v0c-0.2,0-0.4,0.1-0.6,0.1
-                c-0.3,0.1-0.5,0.2-0.7,0.5c-0.1,0.2-0.2,0.5-0.1,0.8l1.4,4.4c0.1,0.4,0.5,0.7,0.9,0.7c0,0,0.1,0,0.2,0c0.5-0.1,0.8-0.5,0.8-1v-3.9
-                c0.3-0.1,0.6-0.2,0.9-0.2l6.4,1.1c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0c0,0,0,0,0,0s0,0,0,0c0.1,0,0.2,0,0.3,0c0,0,0,0,0,0h0h0l0,0
-                c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c2-0.6,2-2.6,2.1-3.9c0-0.3,0-0.6,0-0.9c0-0.3-0.1-0.7-0.4-0.9
-                C13.8,30.8,13.4,30.8,13.1,30.9z M66.9,126.4c0.3-0.1,0.6-0.4,0.7-0.7c0.4-2.1-1.1-3.8-2.4-5.1c-0.2-0.2-0.3-0.4-0.5-0.6
-                c-0.1-0.8-0.4-1.7-0.7-2.6c0.2-0.3,0.6-0.6,1.2-0.9c0.1-0.1,0.2-0.2,0.3-0.4c0.1,0,0.2,0.1,0.3,0.1c0.6,0,1.6-0.8,3-2.5
-                c0.6-0.7,1.1-1.6,1.6-2.4l5.7-1.4l-5.2-0.8c-0.1-0.7-0.6-1.9-2.8-1.9c-0.5,0-1,0.4-1,1c0,0,0,0,0,0.1c-0.3,0-0.5,0.1-0.8,0.1
-                l0.9,0.1c0.1,0.4,0.5,0.6,0.9,0.6c0.7,0,0.8,0.2,0.8,0.2c0,0,0,0,0,0.1c0,1.3-2.6,4.4-3.4,4.9c-0.2,0.1-0.4,0.3-0.5,0.5
-                c-0.1-0.1-0.3-0.1-0.5-0.1c-0.9,0-1.7-0.3-2.6-1.1c-0.1-0.2-0.2-0.3-0.4-0.6l-1.9-1.9c-0.3-0.4-0.7-0.8-1.1-1.2l1.1-1.5
-                c0.3-0.4,0.2-1-0.1-1.3c-0.4-0.3-1-0.3-1.3,0l-2,2c0,0-0.1,0.1-0.1,0.2l-3,4.5c0.1-0.2,0.2-0.6,0.2-1.4c0.6-1,0.9-2.3,1.1-3.5
-                l1.9-4.1c0.6-0.2,1.4-0.1,2.5,0.2c0.5,0.1,1-0.1,1.2-0.5c0.2-0.4,0.1-1-0.3-1.3c-0.9-0.6-0.9-1.3-0.9-2.6c0-0.4,0-0.7,0-1
-                c0-0.1,0-0.3-0.1-0.4c0,0,0,0,0,0c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.2-0.3-0.3-0.6-0.4h0c0,0,0,0,0,0c0,0,0,0,0,0l-2-0.3v-4.7
-                c0-0.4-0.2-0.8-0.6-0.9c-0.5-1.3-1.4-2.3-2.7-3.2c-0.4-0.2-0.8-0.2-1.2,0l-2.8,2.3c-0.3,0.2-0.4,0.6-0.3,1c0.1,0.4,0.4,0.7,0.8,0.7
-                l4.7,0.8c0.2,0.9,0.2,1.9,0.2,2.9c0,0.6,0,1.2,0,1.8c0,0.1,0,0.3,0.1,0.4c0,0,0,0,0,0c0,0,0,0,0,0v0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0,0.1,0.1,0.2,0.2,0.3c0.1,0.1,0.3,0.2,0.5,0.3c0,0,0,0,0,0h0c0,0,0,0,0,0s0,0,0,0c0,0,0,0,0,0h0c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0
-                c0,0,0,0,0,0h0c0,0,0,0,0,0c0,0,0,0,0,0h0c0,0,0,0,0,0s0,0,0,0s0,0,0,0c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0,0,0,0,0,0l1.5,0.3l-1.4,2.9c-1.3,0.9-1.8,2.5-2.1,4.1c0,0-0.1,0-0.1,0c-0.3-0.1-0.6-0.1-0.9-0.2c-0.6-0.8-1.4-1.4-2.3-1.7
-                c-0.4-0.1-0.8,0-1,0.3c-0.3,0.3-0.3,0.7-0.1,1.1c0.4,0.9,1.2,1.6,2.2,2c0.5,1,0.7,2.3,0.8,2.9c-0.2,0.2-0.2,0.5-0.2,0.7
-                c0.1,0.7,0.1,1.8,1.2,1.8c0.3,0,0.5-0.1,0.7-0.3c0,0,0,0,0.1-0.1L52,115c-0.3,0.4-0.2,1,0.2,1.4c0.4,0.3,1,0.2,1.4-0.2l3.5-4.7
-                l1.2,1.3c0.6,0.7,1.3,1.5,2,2.1c0.5,0.8,1,1.7,1.4,2.4c-0.5,1.5,0.4,2.8,1,3.5c0,0.9-0.2,1.5-0.7,1.9c-0.2,0.2-0.3,0.5-0.3,0.8
-                c0,0.3,0.1,0.6,0.4,0.8c0.2,0.2,0.4,0.4,0.7,0.6c0.8,0.8,1.7,1.7,3.1,1.7C66.1,126.6,66.5,126.5,66.9,126.4z M51.1,134.2
-                c2.7-1.7,3.8-4,4.5-5.8c0.4-0.8,0.7-1.6,0.8-2.3l0-0.2l0.1-0.3c0.7-2.6,1.4-5,3.5-6.7c0.3-0.3,0.4-0.7,0.3-1
-                c-0.1-0.4-0.4-0.7-0.8-0.7c-1.6-0.2-2.8,0.2-3.7,1.1c-1.5,1.6-1.4,4.4-1.4,6.7l0,0.8c-0.2,0.7-0.4,1.3-0.6,1.9
-                c-0.9,1.7-2.6,3.7-3.9,5.1c-0.3,0.1-0.5,0.3-0.8,0.4c-0.1,0.1-0.2,0.2-0.3,0.3c-0.6,0.7-1,1.2-0.7,1.9c0.2,0.4,0.6,0.6,0.9,0.6
-                C49.3,135.8,49.6,135.8,51.1,134.2z M26.2,141.4c-0.4-0.2-0.8-0.1-1.1,0.2c-0.1,0.1-0.2,0.2-0.2,0.4h2.8
-                C27.2,141.9,26.7,141.7,26.2,141.4z M15.9,140.8c-0.3-0.5-0.8-0.6-1.3-0.4c-0.2,0.1-0.5,0.3-0.7,0.4c-0.5,0.4-1,0.7-1.4,1.1h3.2
-                C16.1,141.7,16.1,141.2,15.9,140.8z M98.9,1.1c0.2,0,0.4-0.1,0.7-0.2c0.2-0.1,0.3-0.2,0.4-0.4c0-0.1,0.1-0.1,0.1-0.2
-                c0.1-0.1,0.2-0.2,0.4-0.3h-2.6c0,0.1,0,0.3,0.1,0.4C98.1,0.8,98.5,1.1,98.9,1.1z M118.6,91.8c-0.2,0.2-0.3,0.5-0.3,0.8v0
-                c-0.2,0-0.4,0.1-0.6,0.1c-0.3,0.1-0.5,0.2-0.7,0.5c-0.1,0.2-0.2,0.5-0.1,0.8l1.4,4.4c0.1,0.4,0.5,0.7,0.9,0.7c0,0,0.1,0,0.2,0
-                c0.5-0.1,0.8-0.5,0.8-1v-3.9c0.3-0.1,0.6-0.2,0.9-0.2l6.4,1.1c0,0,0,0,0.1,0c0,0,0,0,0,0h0h0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0.1,0,0.1,0,0.2,0c0,0,0,0,0,0h0v0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0
-                c0.1,0,0.1,0,0.2,0c2-0.6,2-2.6,2.1-3.8c0-0.3,0-0.6,0-0.9c0-0.3-0.1-0.7-0.4-0.9c-0.3-0.2-0.6-0.3-0.9-0.2c-1.7,0.5-2,2-2,3.2
-                c-1.9-0.8-3.4-1-5.7-0.5l-1.7-0.3C119.1,91.5,118.8,91.6,118.6,91.8z M132.6,82.7l0-0.5c0.1-0.2,0.1-0.3,0.1-0.5c0-0.3,0-0.6,0-1
-                c0-0.4,0-0.8-0.1-1.2c0.2-2.7,1.1-3.9,3.1-4c0.5,0,0.9-0.4,0.9-0.9c0.1-0.5-0.2-0.9-0.7-1.1c-1.8-0.5-3.1-0.2-4.1,0.7
-                c-1.2,1.2-1.3,3.3-1.2,5.1c0,0.4,0,0.8,0,1.3l-1.7,0.1c-0.5,0-0.8,0.3-0.9,0.8c-0.1,0.4,0.1,0.9,0.6,1.1c0.7,0.3,0.8,0.9,0.9,2.3
-                c0,0,0,0,0,0c-0.2,0-0.5,0-0.7,0c-1.1,0-2.2,0-3.2,0.3l0,0c-0.4-0.3-1-0.2-1.3,0.2c-0.1,0.1-0.1,0.2-0.1,0.3c-1.2,0.6-2,1.5-2.7,2.8
-                c-0.2,0.4-0.1,0.9,0.2,1.2l1.4,1.4c0.2,0.2,0.4,0.3,0.7,0.3c0.3,0,0.5-0.1,0.7-0.3l2.5-2.7c2.3,1.1,3.8,1,4.7,0
-                C132.8,87.2,132.7,85.1,132.6,82.7z M90.7,25.2c1.8-2.1,3.7-4.3,6.3-5.4l2-0.6c0.5-0.2,0.8-0.7,0.7-1.2c-0.1-0.5-0.6-0.8-1.1-0.7
-                c-0.7,0.1-1.5,0.4-2.2,0.7l-8.6,2.6c-0.4,0.1-0.7,0.5-0.7,1c0,0.5,0.3,0.8,0.8,0.9l1.3,0.3c-0.4,0.8-0.7,1.6-0.9,2.5
-                c-1.3,1.5-2.5,2.6-3.8,3.1l-0.7-1.8c-0.1-0.3-0.4-0.5-0.7-0.6L81,25.5c-0.5-0.1-1,0.2-1.2,0.8l-0.5,2.7c-0.1,0.3,0,0.5,0.1,0.7
-                c0.1,0.2,0.4,0.4,0.6,0.4l2.1,0.4l0.4,0c0.6,0,1.2-0.1,1.7-0.2c0.6,0.2,1.1,0.3,1.5,0.3c2.7,0,3.5-2.6,4.2-4.5
-                C90.2,25.8,90.5,25.5,90.7,25.2z M107.1,0H106c0.2,0.1,0.3,0.1,0.5,0.1L107.1,0z M136.3,1.3l0.7,1.6c0.3,0.8,0.4,1.7,0.6,2.6
-                c0,0.1,0.1,0.3,0.1,0.4c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.1-0.2-0.3-0.4-0.4c-0.3-0.8-0.8-1.4-1.4-1.7c-0.1-0.3-0.1-0.6,0-0.9
-                c0.2-0.5-0.1-1-0.6-1.2c-0.5-0.2-1,0-1.3,0.5l-2,4c-0.2,0.4-0.1,1,0.3,1.2c0.4,0.3,0.9,0.2,1.3-0.1l1.3-1.3c0.2,0.2,0.4,0.4,0.5,0.6
-                l0.1,0.1c0.2,0.5,0.3,1.1,0.4,1.8c0,0.5,0.5,0.9,1,0.9c0.3,0,0.5-0.1,0.7-0.3c0.2-0.2,0.3-0.5,0.3-0.8c0-0.2,0-0.6,0-1.5
-                c0.5,2.2,1.2,4.5,3.5,5.5l0.5,1.2c0,0,0.1,0.1,0.1,0.1V7.7c-0.1,0-0.3,0.1-0.4,0.2c0,0,0,0,0,0l-2.7-5.8c-0.1-0.3-0.2-0.5-0.3-0.7
-                l2.8,0.9c0.1,0,0.2,0.1,0.3,0.1c0.1,0,0.2,0,0.4-0.1V0h-7.8l2,0.7C136.2,0.9,136.2,1.1,136.3,1.3z M119.9,81.2l2.8,0.5
-                c0.1,0,0.1,0,0.2,0c0.4,0,0.8-0.2,0.9-0.6c0.2-0.4,0-0.9-0.4-1.2c-0.9-0.6-0.9-1.3-0.9-2.6c0-0.1,0-0.2,0-0.3
-                c0.4-0.2,0.9-0.4,1.4-0.6c0.2,0,0.4,0.1,0.7,0.1c0.4,0.1,0.7,0.1,1.1,0.1c0.3,0,0.5-0.1,0.7-0.3c0.2-0.2,0.3-0.5,0.3-0.7v-0.3
-                c0.4-0.2,0.8-0.4,1.2-0.5c0.4,0.1,0.7,0.1,1.1,0.1c2.6,0,3.2-2.3,3.6-3.7c0.2-0.2,0.3-0.5,0.4-0.7v1.2c0,0.4,0.3,0.8,0.7,0.9
-                c0.4,0.1,0.8,0,1.1-0.3c0.5-0.6,0.9-0.7,1.1-0.7c0.6,0,1.4,0.5,2.2,1c1.1,0.7,2.3,1.5,3.8,1.5c0.1,0,0.1,0,0.2,0v-2.3l-7.6-3.8
-                c-0.2-0.1-0.5-0.1-0.7,0c0-0.3,0.1-0.5,0.1-0.8c0-0.4-0.3-0.8-0.7-1c-0.4-0.1-0.9,0.1-1.1,0.5c-0.6,1-0.9,2.2-1.1,3.3l-0.1,0.4
-                c-0.7,0.8-1.6,1.6-3,2.3c-0.5-0.2-1-0.4-1.6-0.7c-0.3-0.2-0.7-0.1-1,0c-0.3,0.2-0.5,0.5-0.5,0.8V74c-0.3,0.1-0.6,0.2-0.9,0.3
-                l-0.3,0.1c-1.3-0.1-2.2,0.3-2.8,1.2c-1,0.5-2,1.2-2.3,2.4c-0.2,0.9,0.1,1.8,0.8,2.8C119.4,81,119.6,81.1,119.9,81.2z M87.7,37.3
-                c-0.2-0.1-0.4-0.2-0.6-0.2l-2-0.1c-0.6,0-1,0.4-1,0.9L84,40c0,0.5,0.4,1,0.9,1l2,0.1c0,0,0,0,0,0c0.3,0,0.6-0.1,0.7-0.3l1.1-1.2
-                c0.2-0.2,0.3-0.5,0.2-0.7c0-0.3-0.2-0.5-0.4-0.7L87.7,37.3z M116.1,2.7c0.2,0.4,0.6,0.6,1.1,0.6c0.4,0,0.9-0.2,1.6-0.5
-                c0.2-0.1,0.3-0.2,0.4-0.4l1.5-2.5h-3.5C116.1,1.4,115.8,2.1,116.1,2.7z M106.1,26.3l1.4,1.6c0,0,0.1,0.1,0.1,0.1
-                c-0.2-0.3-0.2-0.6-0.1-0.9c0.2-0.4,0.5-0.6,0.9-0.6h3.9c0.4,0,0.8,0.3,0.9,0.7c0.4,1.4,0.4,2.6,0,3.9c0.2,0.4,0.1,0.8-0.2,1.1
-                l-3.2,3.3l1.3,1.3c0,0,0,0,0.1,0.1c0.1,0.2,0.2,0.4,0.2,0.6v0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0
-                c0,0,0,0,0,0c0,0,0,0,0,0s0,0,0,0c0,0,0,0,0,0v0c0,0,0,0,0,0c0,0,0,0,0,0c0,0.2-0.1,0.5-0.2,0.6c-0.2,0.3-0.5,0.5-0.7,0.8
-                c-1,1-1.3,1.5-1.1,2.2c0.2,0.5-0.1,1-0.5,1.2c-0.4,0.2-1,0.1-1.2-0.3c-0.7-0.9-1.3-1.4-2-1.6l-4.6,1.8c-1.1,0.8-2.3,1.5-3.5,1.9
-                c-0.9,1-1.2,1-1.5,1c-0.4,0-0.8-0.2-0.9-0.6c-0.3-0.7,0.2-1.2,0.7-1.8c0.2-0.2,0.4-0.3,0.6-0.3c0,0,0,0,0.1,0
-                c0.4-0.5,1.1-1.5,1.4-2.5c-0.5-0.9-0.6-1.8-0.3-2.8c0-0.1,0.1-0.2,0.2-0.3c-0.1,0-0.2,0.1-0.3,0.1c-0.8,0.4-1.6,0.5-2.2,0.5
-                c-1.1,0-1.7-0.5-2-0.9c-0.3-0.3-0.3-0.8-0.1-1.1c0.2-0.4,0.6-0.5,1-0.4c0.6,0.1,1.1,0.2,1.6,0.2c0.4,0,0.7,0,1-0.1
-                c0.3-0.1,0.7-0.3,1-0.5c0.7-0.6,1.2-1.8,1.7-3c0.2-0.5,0.4-1,0.6-1.5c0-0.2,0.1-0.4,0.3-0.6c0.7-1.4,2-3.1,4.7-3.7
-                C105.5,25.9,105.9,26,106.1,26.3z M102.3,30.6l-0.2,0.2v0.7c0.4,0,0.8,0.3,1,0.7c0.3,1.3-3.4,3.6-4.1,4c-0.1,0.1-0.2,0.2-0.4,0.2
-                c0.3,0,0.6,0.1,0.8,0.4c0.5,0.7,0.8,1.6,0.7,2.6c0.2,0.2,0.3,0.4,0.5,0.6c0,0,0.1,0.1,0.1,0.1c1.5-1,3-1.9,4.7-1.7l3.2-1.3l-0.9-0.9
-                c-0.1-0.1-0.1-0.1-0.1-0.2v0c0,0,0,0,0,0c-0.1-0.2-0.1-0.3-0.1-0.5c0,0,0,0,0,0c0,0,0,0,0,0c0-0.1,0-0.2,0.1-0.3c0,0,0,0,0,0
-                c0,0,0,0,0,0l0,0c0,0,0,0,0,0c0,0,0,0,0,0c0-0.1,0.1-0.2,0.2-0.3c0,0,0,0,0,0c0.4-0.5,0.8-0.9,1.3-1.3c0.7-0.7,1.4-1.4,1.9-2.1
-                l-3.1-3.2c0,0,0,0,0,0c0.1,0.3,0.1,0.7-0.1,0.9c-0.3,0.4-0.8,0.5-1.2,0.3C104.8,28.6,103.6,29.5,102.3,30.6z M68.1,134h3.9
-                c0.4,0,0.8-0.3,0.9-0.7c0.1-0.4,0-0.8-0.3-1.1c-1.9-1.6-1.9-3-1.6-4.3c0.9-1.8,1.8-3.6,2-5.6c0.4-1.9-0.1-3.5-1.4-5l8.7-5.3
-                c0.5-0.3,0.6-0.9,0.4-1.3c-0.3-0.5-0.8-0.6-1.3-0.4l-11.8,5.9c-0.4,0.2-0.6,0.7-0.5,1.1c0.1,0.4,0.5,0.8,1,0.8h1.5
-                c1.1,1.2,1.6,2.5,1.5,3.9c-0.2,0.8-0.6,1.7-1,2.6c-0.4,0.8-0.7,1.7-1,2.5c-0.9,1.8-1.8,3.7-2.1,5.7c0,0.3,0.1,0.6,0.2,0.8
-                C67.6,133.8,67.8,134,68.1,134z M7.6,39.4l-1,0.1c-0.4,0-0.7,0.3-0.8,0.6c-1.9,0.8-3.4,1.5-4.6,2.1c-0.4,0.2-0.8,0.4-1.1,0.6v2
-                c0.1,0,0.1,0,0.2,0c0.2,0,0.4,0,0.5-0.2c0.3-0.2,0.7-0.4,1.2-0.7c0.9-0.3,2.1-0.4,3.3-0.6c0.5-0.1,1.1-0.1,1.6-0.2
-                c0.5-0.1,0.8-0.5,0.8-1l0-0.8l0.4-0.2l7.2-0.7c0.5-0.1,0.9-0.5,0.9-1l0-0.9l3.4-0.3c0.5,0,0.8-0.4,0.9-0.9c0-0.5-0.2-0.9-0.7-1
-                l-0.7-0.2c-0.1-0.4-0.5-0.7-1-0.7c-0.2,0-0.3,0-1,0.2c-0.2,0.1-0.4,0.2-0.6,0.4c-0.4,0.2-1,0.4-1.6,0.6
-                C13.1,37.4,10.3,38.4,7.6,39.4z M62.6,142c0.5-0.8,0.9-1.5,1.1-2.2c0.2,0.2,0.5,0.4,0.8,0.3c0.4,0,0.8-0.1,1.2-0.1
-                c0.6-0.1,1.2-0.2,1.5-0.1c0,0.4,0.3,0.8,0.7,0.9c0.1,0,0.2,0,0.3,0c0.4,0,0.7-0.2,0.9-0.6c0.8-1.7,3.4-2.6,5.9-3.6
-                c2.9-1.1,5.8-2.1,7-4.6c0.2-0.5,0.1-1-0.4-1.3c-0.4-0.3-1-0.2-1.3,0.2c-2.1,2.5-6.3,3.8-10.3,5.1c-2,0.6-4.2,1.3-6,2.1
-                c-0.1,0-0.1,0.1-0.2,0.1c0-0.1-0.1-0.3-0.1-0.4c0.4-1.2,0.8-2.4,1.1-3.6c0.1-0.5-0.1-0.9-0.5-1.1c-0.4-0.2-0.9-0.1-1.2,0.3
-                c-0.3,0.3-0.5,0.7-0.8,1c-0.9,1.2-1.7,2.3-3.4,3.1c-0.1,0.1-0.3,0.2-0.3,0.3l0.7-2c0.1-0.3,0.1-0.7-0.2-1c-0.2-0.3-0.6-0.4-0.9-0.4
-                l-6.3,1c-0.4,0.1-0.7,0.4-0.8,0.8c-0.1,0.4,0.1,0.8,0.5,1l4.9,2.9c0.2,0.1,0.3,0.1,0.5,0.1c0.1,0,0.2,0,0.3-0.1
-                c0.3-0.1,0.5-0.3,0.6-0.6l0.5-1.3c0,0.1,0,0.2,0.1,0.3c0.2,0.5,0.7,0.8,1.2,0.6c0.7-0.2,1.3-0.3,1.7-0.4c-0.4,1-0.8,1.9-1.2,2.9
-                H62.6z M1.2,142c-0.1-0.2-0.3-0.4-0.5-0.5L0,141.1v0.9H1.2z M52.3,141.6c0-0.4-0.3-0.7-0.6-0.9c-0.3-0.1-0.8-0.1-1,0.2
-                c-0.4,0.4-0.9,0.7-1.2,1.1h2.9L52.3,141.6z M15.1,0.5c0.2-0.1,0.3-0.2,0.5-0.3c0.1,0,0.1-0.1,0.2-0.2h-3.2c-1.3,1.2-2,2.4-2.3,3.8
-                c-0.6,1-1.2,2-1.8,2.8c-0.2,0.3-0.3,0.7-0.1,1C8.5,8,8.8,8.2,9.2,8.2h1.2c0.4,1.1,1.2,2.1,2,3l0.8,1.3c0.3,0.5,0.6,1,0.9,1.5
-                c0.1,0.3,0,0.6-0.2,1c-0.8-0.4-1.7-0.7-2.6-0.9c-0.4-0.1-0.9,0.1-1.1,0.5c-0.2,0.4-0.1,0.9,0.2,1.2l2,2c0.3,0.3,0.8,0.4,1.2,0.1
-                c0.2-0.1,0.4-0.2,0.5-0.4c1.9,1.5,3,3.8,3.8,5.9c-0.2,0.6-0.1,1.2,0.1,1.9c0,0.1,0.1,0.3,0.2,0.4c0.2,0.2,0.5,0.5,0.8,0.8l0,0.1
-                c0.3,1,0.6,1.9,1,2.8c0,0.1,0.1,0.1,0.1,0.2c1.6,2.4,7.7,3,9.1,3c0.6,0,1.7,0,1.8-1c0-0.4-0.1-0.7-0.4-0.9c0.3-0.3,0.6-0.6,0.9-1
-                c0.3-0.4,0.3-1-0.1-1.4c-0.4-0.4-1-0.3-1.4,0L29,29.4c-0.6,0.4-1.2,0.6-1.8,0.6c-2.1,0-4.5-2.5-6.4-4.5l0,0
-                c-0.2-0.6-0.4-1.3-0.7-1.9c0.2-0.3,0.5-0.7,0.9-1c0.3-0.3,0.5-0.5,0.7-0.8c0.3-0.4,0.3-1-0.1-1.3l-1.2-1.2c0.5-0.5,1-1,1.5-1.6
-                l1.7-1.7c0.1-0.1,0.1-0.1,0.2-0.2c0-0.1,0.1-0.1,0.1-0.2c0.2-0.5,0.2-1,0.1-1.5c-0.2-1.7-1.5-2.8-2.6-3.7c-0.5-0.4-1-0.8-1.3-1.3
-                l0-0.1c0-0.2,0-0.4,0-0.6c0-1.1,0-1.9-0.2-2.6c-0.1-0.7-0.1-1.5,0.1-2c0.3-0.3,0.6-0.5,0.9-0.8c0.2-0.2,0.4-0.4,0.7-0.6
-                c0.4-0.3,0.5-0.8,0.2-1.3c-0.2-0.4-0.8-0.6-1.2-0.4c-1,0.4-1.7,1-2.2,1.9c-0.4,0.2-0.7,0.2-1.1,0.1c-0.5-0.2-1,0.1-1.2,0.5
-                c-0.2,0.5,0,1,0.4,1.3c0.7,0.4,1.2,1,1.4,1.8L18,6.5c0.1,0.6,0.1,1.1,0.1,1.6l0,0.5c0,0.1,0,0.2-0.1,0.3c0,0.1,0,0.3,0,0.4l0,0.1
-                c-0.1,1.3-0.2,2.6,0,3.8c0.1,0.4,0.3,0.7,0.7,0.8c0.4,0.1,0.7,0,1-0.2l1.2-1.3c0.5,0.5,1,1.1,1.1,1.6c0,0.1,0,0.2,0,0.4
-                c-0.6,0.5-1.1,1.1-1.6,1.6L18.8,18c-0.3,0.2-0.6,0.3-0.8,0.3c-0.3-1.8-1.1-3.5-2-5c-0.3-1-1-2-1.8-3c-1.1-1.8-2.2-3.9-2-5.8
-                C13.1,2.9,14.2,1.2,15.1,0.5z M5,0H2.7c-1,1.7-1.8,3.2-1.2,4.3c0.2,0.4,0.7,0.9,1.9,0.9C4,5.2,4.9,5,6.1,4.7
-                c0.5-0.1,0.7-0.6,0.6-1.1C6.6,3.1,6.1,2.7,5.6,2.7c-0.6,0-1-0.1-1.1-0.3c-0.1-0.2-0.2-0.7,0.2-2C4.8,0.3,4.9,0.2,5,0z M80.6,136.8
-                c0,0.2,0,0.3,0.2,0.4l2,1.2c0.1,0,0.1,0.1,0.2,0.1c0,0,0.1,0,0.1,0c0.1,0,0.2-0.1,0.2-0.2l0.6-1.6c0-0.1,0-0.3-0.1-0.4
-                c-0.1-0.1-0.2-0.2-0.4-0.1l-2.5,0.4C80.7,136.6,80.6,136.7,80.6,136.8z M90.3,140.6c-0.2,0.5-0.5,0.9-0.8,1.4h2.4l0.2-0.7
-                c0.2-0.5,0.4-1,0.5-1.4c0,0,0.1,0,0.1,0c0.1,0,0.1,0,0.2,0c0.3-0.1,0.5-0.2,0.6-0.5c0.9-1.5,1.2-3,0.9-4.6l0-0.2
-                c0.1-0.3,0.1-0.6,0.2-0.9c0-0.2,0.1-0.4,0-0.5c-0.2-0.8-0.7-1.4-1.4-1.9c-0.4-1.1-0.7-2.2-0.4-3.4l0.1-0.2c0.1-0.5-0.1-1.1-0.7-1.2
-                c-0.5-0.1-1.1,0.1-1.2,0.7l0,0v0l-0.1,0.3c0,0,0,0,0,0c-0.1,0.2-0.1,0.5-0.2,0.7c-0.3,1.3-0.5,1.9-1.2,2.1c-0.4,0.1-0.7,0.5-0.7,0.9
-                c0,0.4,0.3,0.8,0.7,1c0.3,0.1,0.7,0.2,1,0.2c0.4,0.1,0.8,0.2,1.1,0.3l0,0.1c0.3,0.7,0.5,1.3,0.6,2c-0.2,0.9-0.4,1.3-0.9,1.5
-                c-3.3-1.1-4.8-2.5-4.9-4.7c0.3-0.8,0.4-1.7,0.5-2.6c0.1-0.7,0.1-1.3,0.3-1.8c0.8-0.4,1.5-1,2.1-1.5c1.4-1.2,2.7-2.2,4.1-1.2
-                c0.4,0.3,0.9,0.2,1.3-0.1c0.3-0.3,0.4-0.9,0.1-1.3l-1.1-1.6c-0.3-0.4-0.8-0.6-1.2-0.3l-12.5,6.1c-0.5,0.2-0.7,0.8-0.5,1.2
-                c0.2,0.5,0.7,0.7,1.2,0.6l4.2-1.2c-0.3,1.3-0.5,2.4-0.5,3.4c-0.2,0.4-0.5,0.7-1,0.9c-0.4,0.1-0.6,0.4-0.7,0.8
-                c-0.1,0.4,0.1,0.7,0.4,1l7.5,5.1c0,0.1-0.1,0.1-0.1,0.2L90.3,140.6z M24.9,0.7l0.3,0.9c-0.1,0.1-0.3,0.1-0.4,0.2l-0.2,0.1
-                c-1.6-0.1-2.3,0.6-2.6,1.3c-0.7,0.4-1.4,1.1-1.5,2.1c-0.1,1.3,0.9,2.4,1.7,3.1c0.1,0.1,0.3,0.2,0.5,0.2l3,0.5c0.1,0,0.1,0,0.2,0
-                c0.4,0,0.8-0.3,0.9-0.7c0.2-0.5,0-1-0.5-1.2c-1.3-0.7-1.7-1.7-2.1-2.9c0-0.1,0-0.1-0.1-0.2c0.3-0.1,0.5-0.3,0.8-0.4
-                c0.2,0,0.5,0.1,0.7,0.1C26,4,26.4,4.1,26.7,4.1c0.3,0,0.7-0.1,0.9-0.4c0.2-0.3,0.3-0.6,0.1-0.9l-0.1-0.2c0.2-0.1,0.5-0.2,0.7-0.4
-                c1.4,0.3,2.4,0.1,3-0.7C31.8,1.1,32,0.6,32,0h-3.8c-0.1,0-0.1,0.1-0.2,0.1c-0.1,0-0.3-0.1-0.4-0.1h-2.8C24.8,0.2,24.8,0.5,24.9,0.7z
-                 M73.9,130.4l0.8,0.1l0.6,0.8c0.2,0.2,0.5,0.4,0.8,0.4c0.2,0,0.4,0,0.5-0.1l1.5-0.9c0.4-0.2,0.5-0.7,0.4-1.1
-                c-0.1-0.4-0.5-0.7-0.9-0.8l-2-0.2l-1.5-1.9c-0.3-0.4-0.8-0.5-1.2-0.3c-0.4,0.2-0.6,0.7-0.5,1.1l0.6,2.2
-                C73.2,130.1,73.5,130.4,73.9,130.4z M67.8,141.5l-0.9,0.5h2.2c0,0,0-0.1,0-0.1C68.8,141.5,68.2,141.3,67.8,141.5z M81,141
-                c-1.3-2.2-2.7-3.6-4.3-4.2c-0.4-0.2-0.9,0-1.2,0.4c-0.2,0.4-0.2,0.9,0.1,1.2l3.6,3.6H82L81,141z M116.8,114.3
-                C116.8,114.3,116.8,114.3,116.8,114.3l1.3,0c0.2,0.3,0.5,0.5,1,0.7c0.1,0,0.2,0.1,0.2,0.1c0.4,0.1,0.9,0.2,1.5,0.2
-                c2.3,0,2.6-0.7,2.6-1.2c0-0.7-0.5-1.1-1.5-1.1c-0.4,0-0.8,0-1.4,0.1l0-1.3c0.3-0.3,0.7-0.7,1-1.1c0.3-0.3,0.6-0.6,0.9-0.9l0.3-0.3
-                c1-1,2-2,3.2-2.6c0.6-0.1,1.1-0.3,1.6-0.5c0.8-0.1,1.8-0.1,2.7,0.3c0.5,0.2,1-0.1,1.2-0.6c0.2-0.5,0-1.1-0.5-1.3
-                c-0.5-0.2-0.7-0.5-0.9-0.7c0.7-1,1.1-2.2,1.3-3.5c0.6-0.7,0.9-1,0.7-1.6c-0.2-0.4-0.5-0.6-0.9-0.6c-0.4,0-0.7,0.2-1.4,1c0,0,0,0,0,0
-                c-0.1,0.1-0.1,0.1-0.2,0.2c-0.8,1-1.6,2.5-1.6,3.9c-0.3,0.4-0.7,0.7-1.2,0.9c-0.5,0.1-1.1,0.3-1.6,0.5c-0.9,0.1-1.8,0.1-2.8-0.2
-                c-0.3-0.1-0.6,0-0.9,0.2c-0.2,0.2-0.4,0.5-0.4,0.8l0,2.4l-1.1,1.2c-1.2,1.2-2,1.5-3.1,1.1c-0.3-0.1-0.6,0-0.9,0.1
-                c-0.3,0.2-0.4,0.5-0.4,0.8l0,2C115.8,113.9,116.2,114.3,116.8,114.3z M116.2,101.7h1.5c0.1,0.1,0.3,0.3,0.4,0.4c1,1,1.3,1.5,1.1,2.2
-                c-0.1,0.4,0,0.9,0.4,1.2c0.2,0.1,0.3,0.1,0.5,0.1c0.3,0,0.5-0.1,0.7-0.3l2-2c0,0,0,0,0,0l3.9-4c0.4-0.4,0.4-1,0-1.4l-1.4-1.4
-                c-0.4-0.4-1-0.4-1.4,0l-3.4,3.4c-0.9-0.3-1.8-0.4-2.7-0.4l-1.7,0c-0.2,0-0.4,0.1-0.5,0.2c-0.2-0.2-0.6-0.3-0.9-0.3
-                c-1.2,0.2-2.2,0.2-2.5,0.1c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.5,0.3-1.7,0.5-2.5c0.2-0.5,0.3-1,0.4-1.4c0,0,0,0.1,0,0.1
-                c0.2,0.3,0.5,0.5,0.8,0.5c0,0,0,0,0,0c0.5,0,0.8-0.3,1.3-1c0.1-0.2,0.2-0.4,0.2-0.7c0,0,0-0.1,0-0.3c0.2-0.4,0.4-0.8,0.6-1.2
-                c0.3-0.5,0.6-1,0.9-1.5c1.1-1.8,2.2-3.6,1.6-4.8c0.4-1.2,0.8-2.4,1.1-3.6c0.1-0.5-0.1-0.9-0.5-1.1c-0.4-0.2-0.9-0.1-1.2,0.3
-                c-0.3,0.3-0.5,0.7-0.8,1c-0.9,1.2-1.7,2.3-3.4,3.1c-0.5,0.2-0.7,0.8-0.5,1.3c0.2,0.5,0.7,0.8,1.2,0.6c0.7-0.2,1.3-0.3,1.7-0.4
-                c-0.5,1.4-1.1,2.9-1.7,4.3c-0.3,0.6-0.5,1-0.6,1.4l-0.2,0.4c-0.1,0.1-0.1,0.2-0.1,0.3c0.1-2.3-1.3-3.2-2.6-3.5
-                c-0.3-0.1-0.5,0-0.7,0.1l-2.6,1.6c-0.4,0.3-0.6,0.8-0.4,1.3s0.7,0.7,1.2,0.5c0.7-0.2,1.2-0.4,1.7-0.4c0.6,0,0.8,0.2,1.2,1.1l-1,1.3
-                c-0.5-0.2-1.2,0.1-1.4,0.6c-0.4,1,0.9,3,1.7,3.9c0.3,0.4,0.6,0.7,1.1,0.9c0.6,0.4,1.3,0.6,2,0.6c0.7,0,1.5-0.2,2.2-0.7
-                C115.6,101.6,115.9,101.7,116.2,101.7z M88.9,0.8c-1.4,2.1-3,4.5-1.7,7l-0.4,1.1c-0.1,0.3,0,0.6,0.1,0.9c0.2,0.3,0.5,0.4,0.8,0.4
-                h1.6l1.4,1.4c-0.1,0.5-0.5,1.2-0.8,1.9c-0.6,1.1-1.3,2.4-1.1,3.7c0.1,0.5,0.5,0.8,1,0.8h2c0.3,0,0.6-0.2,0.8-0.4
-                c0.2-0.3,0.2-0.6,0.1-0.9c-0.3-0.8,0.1-1.2,1.1-2.2c0.3-0.3,0.5-0.5,0.7-0.8c0,0,0.1-0.1,0.1-0.1c0,0,0,0,0,0c0,0.5,0.4,1,0.9,1.1
-                l6.6,0.7c0.4,0,0.7-0.1,0.9-0.4l0,0c-2.3,3-3.1,6.5-3.7,9.3l0,0.2c-0.7,1.2-1.6,2.4-2.4,3.7l-0.6,0.8c0-0.1,0-0.1,0-0.2
-                c0.3-1.5-0.4-3-2.3-4.5c-0.4-0.3-0.9-0.3-1.2,0c-0.4,0.3-0.5,0.8-0.3,1.2l1.6,3.3c-0.5,0.4-0.9,0.9-1.3,1.4c-1,1.2-1.9,2.2-3.1,1.9
-                c-0.3-0.1-0.6,0-0.9,0.2c-0.2,0.2-0.4,0.5-0.4,0.8l0,0.8c0,2-0.1,4.7,2.5,6C91,40,91.2,40,91.3,40c0.3,0,0.5-0.1,0.7-0.3
-                c0.3-0.3,0.3-0.8,0.1-1.2c-1.7-2.5-0.5-3.9,1.6-6.1c0.8-0.8,1.5-1.6,2-2.4l0,0c0.1,0,0.1-0.1,0.1-0.2c0,0.2,0,0.3,0.1,0.5
-                c0.2,0.3,0.5,0.5,0.8,0.5c0,0,0.1,0,0.1,0c2.6,0,3.3-2.7,4-5.4c1.9-3,3.7-6.3,3.9-9.6c0.2-0.3,0.5-0.6,0.8-0.9
-                c0.3-0.3,0.4-0.7,0.2-1.1c-0.1-0.4-0.5-0.6-0.9-0.6l-0.3,0c-0.1-0.6-0.3-1.3-0.5-1.9c-0.1-0.4-0.5-0.6-0.9-0.6
-                c-0.3,0-0.8,0.2-0.9,0.6l-0.8,1.8l-6.1-0.3c-0.4,0-0.7,0.2-0.9,0.5c0-0.3-0.1-0.6-0.3-0.8l-1.7-1.8C92.4,10.1,92,9.5,91.3,9l1.1-1.1
-                c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L91,5.2c-0.2-0.2-0.5-0.3-0.8-0.3L91.9,0h-2.4C89.3,0.3,89.1,0.5,88.9,0.8z
-                 M93.1,107.3c0.6,0.3,1.3,0.8,2.1,1.4c0.1,0.1,0.2,0.2,0.3,0.3s0.2,0.2,0.3,0.2c1,1,1.8,2,2,2.3c0.2,0.4,0.5,0.7,1,0.7
-                c0.4,0,0.7-0.2,0.9-0.5c0.3-0.5,0-0.9-0.2-1.2l1.4-1.4c0.4-0.4,0.4-1,0-1.4l-2-2c-0.4-0.4-1-0.4-1.4,0l-1.3,1.3
-                c-1.8-1.7-3.8-2.3-5.8-2.9c-0.6-0.2-1.2-0.4-1.7-0.6c-0.5-0.2-1,0.1-1.2,0.5c-0.2,0.5,0,1,0.5,1.3l1.2,0.6c-0.5,0.4-0.9,0.8-1.3,1.4
-                c-0.3,0-0.5,0-0.7,0c-0.5,0-1.1,0.5-1.1,1c0,0.9,0.7,1.2,2.7,1.2C91.1,109.4,92.7,108.6,93.1,107.3z M124.8,125.1
-                c0.2,0.3,0.5,0.5,0.9,0.5c0.1,0,0.3,0,0.4-0.1l1.8-0.9c0.5-0.2,0.7-0.8,0.4-1.3l-0.9-1.8c0-0.1-0.1-0.2-0.2-0.3l-4.4-4.4
-                c-0.3-0.3-0.9-0.4-1.3-0.1c-0.4,0.3-0.5,0.8-0.3,1.2L124.8,125.1z M136,124.7c1,0.2,2,0.3,3,0.3c1.1,0,2-0.1,3-0.3V122l-0.7-0.4
-                c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.4-0.6-0.7-1.1-0.7c-0.9,0-3.8,1.4-4.7,2.6c-0.4,0.6-0.4,1.1-0.3,1.4
-                C135.3,124.4,135.6,124.6,136,124.7z M129.7,0.7c0.1,0.1,0.3,0.1,0.5,0.1c0.2,0,0.3,0,0.5-0.1c0.3-0.2,0.6-0.4,0.7-0.7h-2.2
-                C129.3,0.3,129.4,0.6,129.7,0.7z M129.6,121.8c0.1,0,0.2,0,0.3,0c0.8-0.2,1.6-0.5,2.5-0.9l0.2,0c0.3,0.1,0.6,0.1,0.9,0.2
-                c0.4,0.1,0.8,0,1-0.3l0.9-1.1c2.4-1,4.7-1.8,6.5-2.2v-2.6c-0.6-0.4-1.1-1-1.6-2.3c-0.1-0.3-0.4-0.6-0.8-0.6
-                c-0.3-0.1-0.7,0.1-0.9,0.4l-4.5,5.8l-0.2,0.1c-0.6,0.2-1.2,0.5-1.8,0.7c-0.9-0.2-1.4-0.5-1.8-1.2c-0.2-0.4-0.7-0.6-1.1-0.5
-                c-0.4,0.1-0.8,0.5-0.8,1v2.8c0,0.3,0.1,0.6,0.4,0.8C129.2,121.7,129.4,121.8,129.6,121.8z M133.7,115.8c0.2,0.3,0.4,0.5,0.8,0.5
-                c0,0,0.1,0,0.1,0c0.3,0,0.6-0.1,0.8-0.4c0.2-0.2,0.4-0.5,0.6-0.7c0.9-1,2.2-2.3,1.5-4.2c-0.1-0.4-0.5-0.7-0.9-0.7
-                c-0.4,0-0.8,0.2-0.9,0.6c-0.5,1.1-1,2-1.5,2.4c-1.3-0.9-3.1-0.9-4.6-0.9l-0.3-0.2c-0.8-0.5-1.7-1-2.5-1.4c0.3-0.2,0.5-0.4,0.8-0.5
-                h1.3c0.5,0,0.9-0.4,1-0.8c0.1-0.5-0.2-0.9-0.7-1.1c-0.7-0.2-1.3-0.2-1.9-0.1h-2.3c-0.5,0-0.9,0.4-1,0.9c-0.1,0.7,0,1.3,0,1.8
-                c0,0.2-0.1,0.4,0,0.5c0,0.2,0.1,0.3,0.3,0.4c0.8,2.2,3.2,2.4,4.8,2.4C130.4,115.3,132.1,116.1,133.7,115.8z M141.1,61.2l-0.2,0
-                c-1.1-0.4-2.3-0.9-3.6-1.4l-0.9-0.4c-0.3-0.1-0.6-0.1-0.9,0.1c-0.3,0.2-0.4,0.4-0.5,0.7c-0.1,0.8,0.1,1.4,0.5,1.9
-                c0.8,0.9,2.2,1.1,4.3,1.1l0.8,0c0.4,0.2,0.9,0.3,1.4,0.5v-2.5C141.7,61.2,141.4,61.2,141.1,61.2z M108.6,0.1
-                c-0.2,0.3-0.4,0.5-0.6,0.8c-0.2,0.3-0.5,0.7-0.7,1c-0.2,0.3-0.2,0.7,0,1l0.6,1.1c0.2,0.3,0.5,0.5,0.8,0.5c0,0,0,0,0,0
-                c0.3,0,0.7-0.2,0.8-0.5c0.9-1.5,1.2-2.7,1.1-3.8c0.1-0.1,0.1-0.2,0.2-0.4h-2.5C108.5,0,108.6,0.1,108.6,0.1z M51.4,84.6
-                C51.4,84.5,51.4,84.5,51.4,84.6l0.2-0.3c0.1,0.1,0.3,0.1,0.4,0.2c1.4,2.8,4.4,4.8,6.7,6.4L59,91c0.6,1,1.3,2,1.9,3.1l0.5,0.8
-                c0.1,0.2,0.4,0.4,0.7,0.5c0.1,0,0.1,0,0.2,0c0.2,0,0.4-0.1,0.6-0.2c0.8-0.6,1-1.3,1-1.8c0-1.3-1.3-2.3-3.4-3.8
-                c-1.7-2.5-3.7-5.1-6.8-6.6c-0.1-0.2-0.2-0.5-0.2-0.7c-0.1-0.3-0.3-0.6-0.6-0.7c-0.3-0.1-0.7-0.1-0.9,0.1l-0.5,0.4
-                c-0.8-0.3-1.8-0.4-2.7-0.6c-0.4-0.1-0.8,0.2-1,0.5c-0.2,0.4-0.1,0.8,0.2,1.1l0.9,0.9L44,87.6c-0.4,0.3-0.5,0.9-0.2,1.4
-                c0.3,0.4,0.9,0.5,1.3,0.3l5.9-4C51.2,85.1,51.4,84.9,51.4,84.6z M7.3,123c0.5-0.1,0.8-0.6,0.8-1.1C8,121.3,7.5,121,7,121
-                c-1.3,0.2-2.5,0.5-3.5,0.8l-2.8,0.6L0,122v2.7c1.2-0.2,2.3-0.5,3.4-0.8L7.3,123z M76.3,104.9c0.4,1.3,1,3,2.8,3.8
-                c0.1,0.1,0.3,0.1,0.4,0.1c0.3,0,0.5-0.1,0.7-0.3c0.3-0.3,0.4-0.8,0.2-1.1l-3.9-7.9c-0.1-0.3-0.4-0.5-0.7-0.5
-                c-0.3-0.1-0.6,0.1-0.9,0.3l-2,2c-0.3,0.3-0.4,0.8-0.2,1.2c0.2,0.4,0.6,0.6,1,0.5C75.2,102.5,75.6,103,76.3,104.9z M2.3,40.3
-                c-0.2-0.4-0.6-0.7-1.1-0.6c-0.4,0.1-0.8,0.1-1.2,0.2v2.3c0.7,0,1.3-0.3,1.9-0.7C2.3,41.2,2.5,40.7,2.3,40.3z M3.2,29.4
-                C3.7,29.3,4,28.9,4,28.4c0-0.3,0-0.6,0-0.9c0-1.3,0-3-1.9-4.3L0,17.8v6.7c0.1,0,0.3,0.1,0.5,0.2l1.6,4.2C2.3,29.3,2.7,29.6,3.2,29.4
-                z M104.3,107c0.1,0.1,0.2,0.2,0.3,0.2c0,0,0.1,0,0.1,0c0.2,0,0.3-0.2,0.3-0.4l0.1-4.5c0-0.1,0-0.2-0.1-0.3c-0.1-0.1-0.2-0.1-0.3-0.1
-                l-2.5,0.4c-0.1,0-0.2,0.1-0.3,0.2s0,0.3,0,0.4L104.3,107z M93,104.6c0.6,0.3,1.2,0.5,1.8,0.7c0.1,0.1,0.3,0.1,0.4,0.1
-                c0,0,0.1,0,0.1,0c0.1,0,0.2,0,0.2,0c2.5,0.1,3.5-2,4.2-3.6c1.2-0.9,2.8-2.2,3.1-4c0.3,0,0.6-0.2,0.7-0.5c0.1-0.3,0.1-0.6,0-0.9
-                c-0.1-0.3-0.3-0.6-0.4-0.8c-0.5-1.2-1.2-2.9-3.3-3c-0.4,0-0.8,0.2-1,0.6c-0.2,0.4-0.1,0.8,0.2,1.1c0.9,0.9,1.4,1.6,1.7,2.3
-                c-1.3,0.9-2,2.5-2.6,4l-0.3,0.2c-0.8,0.6-1.6,1.2-2.2,1.8c-0.1-0.3-0.2-0.6-0.2-0.9l0.5-1.2c0.2-0.4,0-1-0.4-1.2s-0.9-0.2-1.3,0.2
-                c-0.5,0.5-0.7,1.1-0.8,1.8l-0.9,2.1C92.4,103.8,92.6,104.4,93,104.6z M81.1,101.1l1.4-1.3c0.4-0.4,0.4-1,0.1-1.4l-1.3-1.5
-                c-0.2-0.2-0.5-0.3-0.8-0.3l-1.6,0.1c-0.3,0-0.5,0.1-0.7,0.4c-0.2,0.2-0.2,0.5-0.2,0.8l0.2,1.2c0,0.2,0.1,0.4,0.2,0.5l1.3,1.5
-                c0.2,0.2,0.4,0.3,0.7,0.3c0,0,0,0,0,0C80.7,101.3,80.9,101.3,81.1,101.1z M91.2,94.6c0.3,0,0.6-0.1,1-0.2c0.3,0.3,0.7,0.5,1.1,0.8
-                c0.1,0,0.1,0.1,0.2,0.1v0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0,0,0,0,0,0s0,0,0,0c0,0,0,0,0,0c0,0,0.1,0,0.1,0c0.2,0,0.4-0.1,0.5-0.2
-                c0,0,0,0,0,0l5.9-4c0.3-0.2,0.5-0.6,0.4-1c-0.1-0.4-0.3-0.7-0.7-0.8c-0.4-0.1-0.7-0.2-1.1-0.2c-1.9,0-3,1.4-4.1,2.7
-                c-0.2,0.2-0.3,0.4-0.5,0.6c-0.2-0.2-0.7-0.4-1.2-0.3c-0.3-0.8-0.3-1.9-0.3-3l0-0.8c0-0.5-0.3-0.9-0.8-1c-0.5-0.1-0.9,0.2-1.1,0.6
-                c-1.5,3.8-1.5,5.1-1,5.9C90,94.2,90.4,94.6,91.2,94.6z M57.1,46.3c-0.5-0.1-0.9,0.1-1.1,0.5l-1,2.1l-1.3,0.3
-                c-0.3,0.1-0.5,0.2-0.6,0.5C53,49.9,53,50.2,53,50.4l1.2,4.1c0.1,0.4,0.5,0.7,0.9,0.7c0.1,0,0.2,0,0.2,0l1.8-0.4
-                c0.4-0.1,0.8-0.5,0.8-1l0-6.6C57.9,46.8,57.5,46.4,57.1,46.3z M89.5,46.1c-0.2-0.3-0.6-0.4-0.9-0.3c-2.2,0.4-3.8,1.4-4.7,2.9
-                c-0.1,0.1-0.1,0.2-0.1,0.3l-0.2,1c-0.1,0.4,0.1,0.8,0.5,1c0.2,0.1,0.3,0.1,0.5,0.1c0.2,0,0.4-0.1,0.6-0.2c0.2-0.2,0.4-0.3,0.6-0.5
-                c1.3-1.1,2.4-2,4-1.2c0.4,0.2,0.9,0.1,1.2-0.3c0.3-0.4,0.3-0.9,0-1.3L89.5,46.1z M90.8,50.4h-2c-0.4,0-0.8,0.3-0.9,0.7L86,57
-                c-0.1,0.4,0,0.9,0.4,1.2c0.2,0.1,0.3,0.1,0.5,0.1c0.3,0,0.5-0.1,0.7-0.3l1.7-1.7h1.6c0.5,0,1-0.4,1-1v-4
-                C91.8,50.9,91.4,50.4,90.8,50.4z M62.6,59c-0.4-0.4-1-0.4-1.4,0l-1.4,1.4c-0.3,0.3-0.4,0.8-0.2,1.1l2.8,5.6c0.2,0.3,0.5,0.5,0.9,0.5
-                c0.1,0,0.1,0,0.2,0c0.4-0.1,0.8-0.5,0.8-1v-2.4l1.1-1.1c0.4-0.4,0.4-1,0-1.4L62.6,59z M83.7,46.7c-0.4-0.3-1-0.1-1.3,0.3
-                c-0.8,1.1-1.3,2.2-1.6,3.4l-2.7,5.9c-0.2,0.4-0.1,0.9,0.2,1.2c0.3,0.3,0.8,0.3,1.2,0.1l1.1-0.7c0.2,0.8,0.6,1.7,1,2.5
-                c0.3,1.8,0.3,3.2-0.5,4.3l-0.8-1.3c-0.3-0.5-0.9-0.6-1.4-0.3l-1.7,1c-0.2,0.1-0.4,0.4-0.4,0.6c-0.1,0.3,0,0.5,0.1,0.7l1.5,2.4
-                c0.1,0.2,0.4,0.4,0.6,0.4c0.1,0,0.1,0,0.2,0c0.2,0,0.4-0.1,0.5-0.1l1.6-1c1.6-0.6,2.5-1.4,3-2.4c0.7-1.7-0.1-3.5-0.9-5.1
-                c-0.1-0.5-0.2-1-0.3-1.6c-0.5-2-0.9-4.1-0.5-6.2l1.4-3.1C84.3,47.5,84.1,47,83.7,46.7z M6.3,54c-0.4,0.1-0.7,0.4-0.8,0.8l-0.4,2
-                c-0.1,0-0.1,0-0.2,0c-0.2,0-0.5,0-0.7,0c-1.1,0-2.5,0.2-3.6,1.6c-0.2,0.3-0.3,0.8,0,1.1C0.8,59.9,1.1,60,1.4,60c0,0,0.1,0,0.1,0
-                l7.1-1.1c0.3-0.1,0.6-0.3,0.8-0.6c0.1-0.3,0.1-0.7-0.1-1l-2.1-3C7,54.1,6.6,54,6.3,54z M92.8,76c0,0.4,0,0.7,0,1.1
-                c0,0.3,0.2,0.5,0.4,0.7C93.4,78,93.7,78,94,78l0.2,0c0,0.1,0,0.2,0.1,0.3c0.1,0.4,0.3,0.7,0.7,0.8c0.1,0,0.2,0,0.3,0
-                c0.3,0,0.5-0.1,0.7-0.3l1.4-1.6c0.3-0.3,0.3-0.8,0.1-1.1c-0.2-0.4-0.6-0.6-1-0.5l-0.9,0.2c-0.3-0.5-0.6-1-0.9-1.5
-                c-0.3-1.1-0.9-1.8-1.9-2.1c-0.1,0-0.3-0.1-0.5,0L91,72.3c-0.1,0-0.3,0-0.5,0v-1.5c0-0.4-0.3-0.8-0.6-0.9c-0.4-0.1-0.8,0-1.1,0.3
-                L86,73.4c-0.3,0.3-0.3,0.9-0.1,1.2c0.3,0.4,0.8,0.5,1.2,0.3c0.6-0.3,1.3-0.5,1.8-0.6c0.2,0.2,0.5,0.2,0.7,0.2l1.3-0.2
-                c0.7,0.1,1.2,0.4,1.7,0.8C92.8,75.4,92.8,75.7,92.8,76z M33.1,43c-0.4-0.2-0.8-0.1-1.1,0.2c-1.7,1.8-2.5,3.7-2.9,5.2
-                c-0.1,0.2-0.1,0.4-0.2,0.6l-0.3,1c-0.4,1.7-0.8,3.2-1.8,4.3l0,0c-0.3-0.1-0.6-0.1-0.9-0.2c-0.2,0-0.4,0-0.5,0
-                c-1.3,0.4-1.7,1.3-1.9,2.1c-0.3,0.1-0.5,0.1-0.8,0.2c-0.4,0.1-0.7,0.4-0.8,0.8c-0.1,0.4,0.1,0.8,0.4,1c0.9,0.6,0.9,1.3,0.9,2.6
-                c0,0.4,0,0.7,0,1.1c0,0.5,0.5,0.9,1,0.9c0,0,0,0,0,0l7.1-0.2c0.5,0,0.9-0.4,0.9-0.8c0.1-0.5-0.2-0.9-0.7-1.1
-                c-0.9-0.3-1.8-0.4-2.8-0.5c-1.8-0.2-2.9-0.3-3.6-1.4c0-0.2,0-0.5,0-0.7c0-0.1,0-0.2,0-0.3c0.8-0.3,1.5-0.7,2.2-1.2
-                c0.8,0.2,1.3,0.5,1.6,1.1c0.2,0.4,0.5,0.6,1,0.6c0.4,0,0.8-0.3,0.9-0.7c0.4-1.4,0.2-3,0.1-4.5c-0.1-1.3-0.3-2.5-0.1-3.5l0.1-0.5
-                c0.2-0.5,0.6-1.1,1.9-1.4c0.5-0.1,0.8-0.5,0.8-1V44C33.7,43.6,33.5,43.2,33.1,43z M33,56.3c-0.1,0.4,0,0.8,0.3,1l5.3,4.8
-                c0.2,0.2,0.4,0.3,0.7,0.3c0.1,0,0.2,0,0.3-0.1c0.3-0.1,0.6-0.4,0.6-0.8l0.6-3.9c0.1-0.4-0.1-0.8-0.5-1c-0.3-0.2-0.8-0.2-1.1,0.1
-                l-1.5,1.1c0,0,0,0,0,0c-0.8-1.1-1.9-2.5-3.9-2.1C33.4,55.6,33.1,55.9,33,56.3z M115.2,62.1c-1.1-2-2.5-3-4.3-3.8l-1.2-1.2
-                c-0.4-0.4-1-0.4-1.4,0l-0.1,0.1c-0.2-0.1-0.5-0.2-0.8-0.3c-0.5-0.2-1,0-1.3,0.5l-2,4c-0.2,0.4-0.1,1,0.3,1.2
-                c0.4,0.3,0.9,0.2,1.3-0.1l2.9-2.9l0,0c0.4,0.1,0.7,0.3,1.1,0.4l4.4,4.5c0,0,0,0,0,0c0,0,0,0,0,0c0.1,0.1,0.2,0.2,0.4,0.2
-                c0.4,0.1,0.7,0.2,1,0.2c1.4,0,2.4-0.9,3.1-1.7c0.2-0.2,0.4-0.4,0.7-0.6c0.3-0.2,0.4-0.6,0.3-0.9c0-0.2-0.2-0.4-0.3-0.5
-                c0.3,0,0.6-0.2,0.7-0.4c0.3-0.4,0.2-1-0.2-1.3l-0.8-0.7c-1.8-1.4-3.8-3-3.8-4.6c0-0.5-0.3-0.9-0.8-1l-2.1-0.3
-                c-0.3-0.1-0.7,0.1-0.9,0.3c-0.2,0.3-0.3,0.6-0.2,1l0.1,0.4l-0.6-0.4c-0.7-0.7-1.2-1.6-1.8-2.4c-0.8-1.3-1.6-2.6-3.2-3.8
-                c-0.4-0.3-1-0.2-1.3,0.2l-2,2.3c-0.2,0.2-0.3,0.5-0.2,0.8c0,0.3,0.2,0.6,0.5,0.7l6.8,3.9c0.7,0.6,1.4,1.1,2.3,1.5
-                c0.1,0,0.2,0.1,0.3,0.1l0.4,0.1l5.8,3.3C117.1,60.6,116,61.3,115.2,62.1z M56,59.5c0.1,0.4,0.4,0.7,0.8,0.8c0.2,0,0.5,0.1,0.7,0.1
-                c0,0,0,0,0,0c1.8,0,3.2-1.3,4.4-2.5c0.5-0.5,1-0.9,1.4-1.2l0.4-0.3c0.2-0.1,0.3-0.1,0.5-0.1c0.3,0.5,0.8,1,1.3,1.3
-                c-0.3,0.8-0.3,1.9,0.4,3.4c0,0,0,0,0,0c-0.1,0.4-0.1,0.8,0.2,1.1c1,1,1.5,1.5,1.7,1.7c0,0,0,0,0.1,0.1c0.2,0.2,0.5,0.3,0.8,0.3
-                c0,0,0,0,0,0c0.4,0,0.7-0.3,0.9-0.6c0.1-0.4,0-0.8-0.3-1.1c0,0,0,0,0,0c0,0-0.1-0.1-0.1-0.1c0.4-0.1,0.6-0.5,0.6-0.9v-2
-                c0-0.4-0.2-0.7-0.5-0.9c0.1,0,0.1-0.1,0.2-0.1l1.3,0c0.5,0,0.9-0.4,1-0.8c0.1-0.5-0.2-0.9-0.7-1.1c-0.7-0.2-1.4-0.2-2,0
-                c-0.6,0-1.2,0-1.8-0.2c-0.2-0.3-0.4-0.6-0.6-0.8c0.7-0.4,1.3-0.8,2-1.1c0.9-0.1,1.7-0.5,2.5-0.8l0.3-0.1c2.1-0.4,3.4,0.2,4.1,1.8
-                c0.1,0.2,0.1,0.4,0.2,0.6c0.2,0.5,0.7,0.8,1.2,0.6c0.5-0.2,0.8-0.7,0.6-1.2c-0.1-0.2-0.2-0.5-0.3-0.7c-1-2.4-2.3-3.5-4-3.5
-                c-0.9,0-1.7,0.3-2.5,0.6c-0.9,0.2-1.8,0.5-2.8,0.9c-0.6,0.1-1.4,0-2.3-1.5c-0.2-0.3-0.4-0.4-0.7-0.4c-0.3,0-0.6,0.1-0.8,0.3
-                l-1.4,1.4c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.7,0.7l-0.7,0.4c-0.2,0.1-0.4,0.2-0.5,0.3l-5.8,3.5
-                C56.1,58.7,55.9,59.1,56,59.5z M49.4,100l-0.3-1c0.1-1.8-0.5-3.6-1.8-5.3c-0.3-0.4-0.8-0.5-1.2-0.3c-0.4,0.2-0.6,0.7-0.5,1.2
-                l1.5,4.6c-0.1,1.1-0.7,2.2-1.6,3.1c-0.5,0.2-1,0.1-1.8-0.4l-1.5-1.5c1.1-1.1,1.4-2.5,1.4-3.7c0-0.3,0-0.5,0-0.8c0-0.3,0-0.6,0-0.8
-                l0-0.8c0-0.3-0.2-0.6-0.4-0.8c-0.3-0.2-0.6-0.2-0.9-0.1c-0.2,0.1-0.3,0.1-0.4,0.1c-0.6,0-1.1-0.5-1.8-1.2c-0.3-0.3-0.5-0.5-0.8-0.7
-                c-0.4-0.3-0.9-0.3-1.3,0c-0.4,0.3-0.4,0.9-0.1,1.3c0.2,0.2,0,0.6-0.2,0.9c-1.7,1.5-2,2-1.8,2.6c-0.5,0.7-1,1.3-1.8,1.8
-                c-0.4,0.2-0.8,0.4-1.2,0.6c-0.3,0-0.5,0.1-0.8,0.1c-0.4,0.1-0.9,0.1-1.3,0.1l1-1.5c0.8-0.8,1.9-1.5,2.8-2c0,0,0,0,0,0c0,0,0,0,0,0v0
-                c0,0,0,0,0,0c0,0,0,0,0,0c0,0,0,0,0,0c0.5-0.3,1-0.6,1.4-0.9l1.1-0.7c0.4-0.3,0.6-0.8,0.4-1.3L37,91.7c-0.2-0.3-0.5-0.5-0.8-0.5
-                c-0.4,0-0.7,0.1-0.9,0.4L35,92l-5.9,0.9c-0.3,0-0.5,0.2-0.6,0.4L27,95.3c-0.2,0.3-0.2,0.7-0.1,1.1c0.2,0.3,0.5,0.5,0.9,0.5
-                c0.4,0,0.8-0.1,1.2-0.1c0.4-0.1,0.8-0.1,1.2-0.1c-0.8,0.7-1.3,1.5-1.6,2.2l-1.6,2.2c-0.1,0.1-0.3,0.1-0.4,0.2l-2.4,0.4
-                c-0.3,0-0.5,0.2-0.6,0.4l-2,2.8c-0.3,0.4-0.2,1,0.2,1.3c0.2,0.2,0.4,0.2,0.6,0.2c0.3,0,0.5-0.1,0.7-0.3c1.2-1.2,2.5-2.2,4.1-2.9
-                l0.5-0.1c0.3,0,0.5-0.2,0.6-0.4c0.8-0.3,1.6-0.5,2.4-0.8c0.9-0.3,1.8-0.6,2.7-0.9c0,0,0,0,0,0c0.1,0,0.2,0,0.3-0.1
-                c0.6-0.2,1-0.5,1.5-0.9c1.5-0.9,2.6-2.2,3.5-4c0.1-0.1,0.1-0.2,0.1-0.4c0.1-0.1,0.1-0.2,0.2-0.2c1.7,0.1,2.4,0.5,2.5,0.8
-                c0,0.1,0,0.2,0,0.4c-0.2,0.9-1.3,2.1-2.3,2.9c-0.1,0-0.2-0.1-0.3-0.1c-0.4-0.1-0.9,0-1.1,0.4c-0.2,0.3-0.7,1-0.4,1.7
-                c0.2,0.3,0.6,0.6,1,0.6c0.2,0,0.5,0,1-0.3c0.5,0.3,1.1,0.6,1.6,1c0.5,0.3,1,0.6,1.4,0.9l1.4,1.4c0.2,0.2,0.4,0.3,0.7,0.3
-                c0.2,0,0.3,0,0.5-0.1c0.6-0.3,1.1-0.7,1.5-1.1c1-0.5,1.9-1.6,2.8-3.3C49.5,100.5,49.5,100.2,49.4,100z M141.4,44.5
-                c0.2,0.2,0.4,0.3,0.6,0.3v-2c-0.2,0.1-0.3,0.2-0.5,0.4C141.1,43.5,141.1,44.1,141.4,44.5z M122.3,27.5L122.3,27.5
-                c0.4-0.3,0.5-0.7,0.4-1.1c0.3-1.5-0.4-3-2.3-4.5c-0.4-0.3-0.9-0.3-1.2,0c-0.4,0.3-0.5,0.8-0.3,1.2l1.6,3.3c-0.5,0.4-0.9,0.9-1.3,1.4
-                c-1,1.2-1.9,2.2-3.1,1.9c-0.3-0.1-0.6,0-0.9,0.2c-0.2,0.2-0.4,0.5-0.4,0.8l0,0.8c0,2-0.1,4.7,2.5,6c0.1,0.1,0.3,0.1,0.4,0.1
-                c0.3,0,0.5-0.1,0.7-0.3c0.3-0.3,0.3-0.8,0.1-1.2c-1.7-2.5-0.5-3.9,1.6-6.1C121.1,29.1,121.8,28.4,122.3,27.5z M140.7,39.8
-                c-0.1-0.1-0.2-0.2-0.4-0.3c-0.1-0.5,0.3-1.7,0.5-2.5c0.2-0.5,0.3-1,0.4-1.5c0.1-0.2,0.1-0.4,0.1-0.5c0.6-3-1-4-2.5-4.3
-                c-0.3-0.1-0.5,0-0.7,0.1l-2.6,1.6c-0.4,0.3-0.6,0.8-0.4,1.3c0.2,0.5,0.7,0.7,1.2,0.5c0.7-0.2,1.2-0.4,1.7-0.4c0.6,0,0.8,0.2,1.2,1.1
-                l-1,1.3c-0.5-0.2-1.2,0.1-1.4,0.6c-0.4,1,0.8,3,1.7,3.9c0.3,0.4,0.6,0.7,1.1,0.9c0.6,0.4,1.3,0.6,2,0.6c0.1,0,0.2,0,0.3,0v-2.3
-                C141.4,39.9,140.9,39.8,140.7,39.8z M67.5,68.1c-0.6,0.1-1.3,0.3-1.9,0.6l-0.7-0.7c-0.3-0.3-0.7-0.4-1.1-0.2
-                c-0.4,0.2-0.6,0.5-0.6,0.9v2c0,0.4,0.2,0.7,0.5,0.9c0.3,0.2,0.7,0.1,1-0.1c0.1-0.1,0.3-0.2,0.4-0.3l0.2,0.2c0.2,0.2,0.5,0.3,0.8,0.3
-                c0.3,0,0.6-0.2,0.7-0.4c0.3-0.5,0.7-0.9,1.1-1.1c2-0.2,3.9,0.9,5.1,3.1c0.2,0.3,0.4,0.4,0.7,0.5c0,0,0.1,0,0.1,0
-                c0.3,0,0.5-0.1,0.7-0.3l2-2c0.2-0.2,0.3-0.6,0.3-0.9c-0.1-0.3-0.3-0.6-0.6-0.7c-0.5-0.2-1.1-0.4-1.7-0.7c-1.5-0.6-3.3-1.4-5-1.4
-                C68.9,67.6,68.1,67.8,67.5,68.1z M133.8,78.6c-0.4,0-0.8,0.3-0.9,0.8c-0.1,0.4,0.1,0.8,0.4,1.1l1,0.6c0.2,0.1,0.3,0.1,0.5,0.1
-                c0.1,0,0.2,0,0.2-0.1c0.1,0,0.2,0.1,0.3,0.1c0.1,0,0.3,0,0.4-0.1l1.9-0.8l4.4-0.4v-3.9l-5.4,2.4L133.8,78.6z M103.1,46.8
-                c0.1,0,0.2,0,0.2-0.1l4-2.9c0.2-0.1,0.2-0.3,0.1-0.5c-0.1-0.2-0.3-0.3-0.5-0.2l-6,1.8c-0.1,0-0.3,0.2-0.3,0.3c0,0.2,0.1,0.3,0.2,0.4
-                l2,1.2C102.9,46.8,103,46.8,103.1,46.8z M124.8,35.9c1.3,0.7,1.7,1.7,2.1,2.9c0.1,0.4,0.3,0.7,0.4,1c0.2,0.4,0.5,0.6,0.9,0.6
-                c0,0,0,0,0,0l7-0.2c0.5,0,0.9-0.4,0.9-0.9c0.1-0.5-0.2-0.9-0.7-1.1c-1-0.3-1.9-0.4-2.9-0.5c-1.7-0.2-3.2-0.3-4.5-1.7
-                c-0.1-0.3-0.2-0.5-0.3-0.8c0-0.1,0-0.1-0.1-0.2c0.6-0.3,1-0.6,1.4-1c0.9,0.2,1.6,0.6,2.2,1.3c0.3,0.3,0.7,0.4,1.1,0.3
-                c0.4-0.2,0.6-0.6,0.6-1c-0.1-1.4-0.8-2.9-1.5-4.5c-0.6-1.2-1.2-2.5-1.3-3.5l0-0.4c0-0.4,0.1-0.9,1.1-1.1c0.3-0.1,0.5-0.2,0.6-0.5
-                c0.1-0.2,0.2-0.5,0.1-0.8l-1-2.8c-0.1-0.4-0.4-0.6-0.8-0.6c-0.4,0-0.7,0.1-0.9,0.5c-1.1,1.9-1.2,3.9-1.1,5.4c0,0.2,0,0.4,0,0.6
-                l0.1,1c0.2,1.5,0.3,2.9-0.1,3.9c-0.3-0.1-0.6-0.1-0.9-0.2c-0.2,0-0.4,0-0.6,0c-0.6,0.2-1.4,0.7-1.4,2.1c-0.2,0-0.3,0.1-0.5,0.1
-                c-0.4,0.1-0.7,0.4-0.8,0.8C124.2,35.3,124.4,35.7,124.8,35.9z M115,22.1c-0.5,2-0.2,3.5,0.9,4.8c0.2,0.2,0.5,0.3,0.7,0.3
-                c0.2,0,0.4-0.1,0.6-0.2c0.4-0.3,0.5-0.9,0.2-1.3c-0.6-0.9-0.7-1.9-0.5-3.2c0.2-0.8,0.5-1.6,0.9-2.3c0.8-1.9,1.6-3.8,0.8-5.5
-                c-0.5-1.1-1.6-1.9-3.3-2.5c-0.5-0.1-0.9,0-1.2,0.5c-0.2,0.4-0.1,0.9,0.2,1.2c2.3,1.9,1.8,3.8,1.1,6.2
-                C115.3,20.7,115.1,21.4,115,22.1z M122.2,4.8l-6.3,3.7c-0.2-0.3-0.3-0.7-0.5-1.2c-0.1-0.4-0.3-0.8-0.4-1.2c0,0,0,0,0-0.1
-                c0-0.1-0.1-0.2-0.2-0.2c0,0,0,0,0,0s0,0,0,0c-0.1-0.1-0.3-0.2-0.4-0.3c-0.1,0-0.2-0.1-0.4,0c-0.1,0-0.2,0-0.4,0.1c0,0-0.1,0-0.1,0
-                l-1.3,0.8l0.7-1.8c0.7-2.9-1.7-1.1-1.7-1.1c-0.9,0.9-2.2,1.8-4,2.7c-0.5,0.2-0.7,0.8-0.5,1.3c0.2,0.5,0.7,0.7,1.2,0.6
-                c0.4-0.1,0.7-0.2,0.9-0.2c0.2,0,0.2,0,0.4,0.5c0.1,0.3,0.2,0.5,0.3,0.7c0,0,0,0.1,0.1,0.1v0c0,0,0,0,0,0c0.1,0.1,0.3,0.3,0.4,0.3
-                c0.1,0,0.1,0,0.2,0.1c0.2,0,0.5,0,0.7-0.1c0,0,0,0,0,0l2.7-1.6l0.8,2.4c0.1,0.3,0.3,0.5,0.6,0.6c0.3,0.1,0.6,0.1,0.8-0.1l0,0
-                c0.4,0.1,0.8,0.2,1.3,0.2c0.8,0,1.7-0.2,2.8-0.5c0.2-0.1,0.4-0.2,0.5-0.3l3.1-3.9c0.3-0.4,0.3-0.9,0-1.3
-                C123.1,4.7,122.6,4.6,122.2,4.8z M121.7,33.6c0.2,0,0.4-0.1,0.6-0.2l1.5-0.6c0.1-0.1,0.2-0.3,0.3-0.4l3.7-6.1c0.2-0.5-0.1-1-0.5-1.2
-                c-0.5-0.2-1,0-1.3,0.4l-5.2,6.7c-0.2,0.4-0.1,0.9,0.3,1.2C121.3,33.6,121.5,33.6,121.7,33.6z M141.5,46.4c-0.4-0.1-0.8,0-1.1,0.4
-                l-1.4,1.9c-0.2,0.3-0.2,0.7-0.1,1.1c0.2,0.3,0.6,0.5,0.9,0.5c0.2,0,0.4,0,0.5-0.1l0.2,2.2l-1.4,2c-0.1,0.1-0.3,0.1-0.4,0.2l-2.4,0.4
-                c-0.3,0-0.5,0.2-0.6,0.4l-2,2.8c-0.3,0.4-0.2,1,0.2,1.3c0.2,0.2,0.4,0.2,0.6,0.2c0.3,0,0.5-0.1,0.7-0.3c1.2-1.2,2.5-2.2,4.1-2.9
-                l0.5-0.1c0.3,0,0.5-0.2,0.6-0.4c0.5-0.2,1.1-0.4,1.6-0.6v-8.7C141.9,46.7,141.7,46.5,141.5,46.4z M132.2,19c0,0.1,0.1,0.1,0.1,0.2
-                c-0.1,0.6,0,1.5,0.1,2.8c0,0.4,0.3,0.8,0.8,0.9l1.9,0.5c0.1,0,0.1,0,0.2,0c0.2,0,0.5-0.1,0.6-0.2c0.2-0.2,0.4-0.5,0.3-0.8L136,19
-                c0-0.1,0-0.2-0.1-0.4c0.2-0.1,0.3-0.2,0.5-0.3c0.2-0.2,0.4-0.4,0.4-0.7c0-0.3,0-0.5-0.2-0.8c-0.1-0.2,0.1-1.2,0.2-1.6
-                c0.2-0.7,0.4-1.5,0.2-2.1l0.7-1.3c0.2-0.4,0.1-1-0.3-1.3c-0.4-0.3-1-0.2-1.3,0.2l-1.5,1.7c-0.3,0.3-0.3,0.7-0.1,1.1
-                c0,0,0,0.1,0.1,0.1l-2.3,4.6C132.1,18.4,132.1,18.8,132.2,19z M113.8,19.6c0.3-0.1,0.5-0.4,0.5-0.7c0.1-0.3,0-0.6-0.3-0.9l-1.4-1.4
-                c-0.2-0.2-0.4-0.3-0.7-0.3s-0.5,0.1-0.7,0.3l-0.9,0.9l-0.2-0.8c0.1-0.7,0.5-1.3,1-2c0.7-1.1,1.5-2.4,1.3-4.1c-0.1-0.5-0.5-0.9-1-0.9
-                h-3.9c-0.3,0-0.6,0.1-0.8,0.4c-0.2,0.2-0.2,0.6-0.2,0.9l1.6,5.8c-0.1,0.7,0,1.5,0.4,2.2c0,0.1,0.1,0.2,0.2,0.3l0.2,0.2l1.5,5.3
-                c0.1,0.4,0.5,0.7,0.9,0.7c0,0,0.1,0,0.1,0c0.5-0.1,0.8-0.5,0.8-1l0-0.8C112.4,21.7,112.4,20.3,113.8,19.6z M126.9,9.5
-                c0.4-0.4,0.4-1,0-1.4c-0.4-0.4-1-0.4-1.4-0.1c-0.2,0.2-0.4,0.4-0.6,0.6l-1.4,1.4c-0.2,0.2-0.3,0.5-0.3,0.8c-0.7,1.1-1.4,2.3-2.1,3.6
-                c-0.5,0.6-0.9,1.1-1.4,1.4c-0.2,0.2-0.4,0.4-0.4,0.7c0,0.3,0.1,0.6,0.3,0.8l0.1,0.1c-0.1,0.3-0.2,0.5-0.3,0.8
-                c-0.1,0.3-0.1,0.7,0.1,0.9c1.2,1.7,2.7,2.4,4.2,2.2c0.2,0.1,0.3,0.2,0.5,0.2c0.2,0,0.4-0.1,0.6-0.2c0.3-0.2,0.5-0.4,0.8-0.7
-                c1.1-0.7,2.2-1.8,3.1-2.8c0.9-0.9,1.8-1.9,2.5-2.2c0.2,0,0.4,0,0.7,0c0.5,0,0.9-0.3,1-0.8c0.1-0.5-0.2-1-0.7-1.1
-                c-0.5-0.2-1.1-0.1-1.7,0.1c-2.1,0.5-3.5,2.1-4.9,3.8c-0.5,0.5-0.9,1.1-1.4,1.6c-0.1,0-0.1,0.1-0.2,0.1l-2.2-2.2
-                c0.2-0.5,0.5-1,0.7-1.5c0,0,0,0,0,0c1-1.2,1.9-2.2,3.1-1.9c0.4,0.1,0.9-0.1,1.1-0.4c0.2-0.4,0.2-0.9-0.2-1.2l-1.2-1.2
-                c0.2-0.3,0.5-0.6,0.7-0.8L126.9,9.5z M112.9,49.5l-0.7-2.1c-0.1-0.3-0.4-0.6-0.8-0.6l-2.1-0.3c-0.3-0.1-0.7,0.1-0.9,0.3
-                c-0.2,0.3-0.3,0.6-0.2,1l1,2.8c0.1,0.3,0.4,0.6,0.8,0.6l2,0.3c1,0.3,1.9,0.5,2.5,0.5c0.9,0,1.6-0.3,2-0.9c0.8-1.1,0.4-2.7,0-4.4
-                c0-0.4,0-0.9,0-1.4c0-1.7,0-3.5,0.9-4.6l1.4-0.8c0,0.1,0.1,0.1,0.1,0.2c0.1,0.1,0.2,0.2,0.2,0.2c-0.1,0.1-0.2,0.3-0.3,0.4
-                c-0.2,0.2-0.3,0.5-0.2,0.8c0,0.3,0.2,0.5,0.5,0.7c1.6,1,2.7,1.9,3.3,2.6c0.2,1.2-0.5,2.2-1.7,3.8c-0.8,1-1.7,2.2-2.4,3.7
-                c0,0,0,0.1-0.1,0.1c0,0.1-0.1,0.2,0,0.3c0,0.1,0,0.3,0.1,0.4c0,0,0,0.1,0.1,0.1c0.4,0.6,0.8,1.1,1.3,1.4l-1.2,1.3
-                c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.4,0.3,0.7,0.3c0.3,0,0.5-0.1,0.7-0.3l1.9-1.9c2.2-0.2,3.9-2.9,5.7-5.8c0.3-0.5,0.6-1,0.9-1.5l3-3.2
-                c0,0,0.1,0,0.1,0c0,0,0,0,0,0c1.2,1.3,3.3,2.6,4,2.6c0.5,0,0.9-0.3,1-0.8c0.2-0.9-0.4-1.2-2.3-2.2c-0.5-0.6-1-1.1-1.5-1.3
-                c-0.1-0.1-0.2-0.2-0.2-0.4c-0.1-0.3-0.4-0.5-0.7-0.5c-0.3,0-0.6,0.1-0.8,0.3l-0.6,0.6c-1.3,0.6-2.4,2.1-3.4,3.6l-5.8,6.2l-0.5-0.5
-                l3.2-3.3c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3,0.1-0.6,0.3-1c0.4-0.9,0.9-2.2-0.1-3.8c-0.3-1.2-1.1-2.4-2.3-3.7c0.5-0.7,1.1-1.8,0.6-3.2
-                c-0.1-0.3-0.4-0.6-0.7-0.7c-0.3-0.1-0.7,0-0.9,0.3l-1.1,1.1c-0.2-0.2-0.5-0.3-0.8-0.2c-1.2,0.3-2.1,0.8-2.8,1.6l-4.4,2.6
-                c-0.4,0.2-0.6,0.6-0.5,1c0.1,0.4,0.4,0.7,0.8,0.8l2,0.3c0,0.9,0.2,1.9,0.5,2.9C114.5,48.6,114.1,49.3,112.9,49.5z M134.8,67.4
-                c0.6,0.7,1.4,1.1,2.4,1.4c0.4,0,0.8,0,1.1-0.1c1,0.2,2,0.5,2.7,1l1,0.6v-5l-0.5-0.9c-0.2-0.3-0.5-0.5-0.8-0.5
-                c-0.3,0-0.6,0.1-0.8,0.4c-0.2,0.3-0.4,0.6-0.6,0.9c-0.4,0.6-0.7,1.1-1.1,1.4c-0.8-0.2-1.5-0.4-2.1-0.7c-0.5-0.7-0.7-1.8-1-2.8
-                l-0.2-0.8c-0.1-0.5-0.5-0.7-1-0.8c-0.5,0-0.9,0.3-0.9,0.8C132.6,64.6,133.2,66.3,134.8,67.4z M135.3,24.4c-0.3-0.1-0.7,0.1-0.9,0.4
-                c-0.2,0.3-0.3,0.7-0.1,1c0.6,1.6,1.7,1.8,2.3,1.8c0.2,0,0.4,0,0.6-0.1c-0.2,0.5-0.6,1-1.1,1.5c-0.3,0.3-0.4,0.7-0.2,1.1
-                c0.2,0.4,0.5,0.6,0.9,0.6c0,0,0,0,0,0c0.2,0,0.5-0.1,0.7-0.3c0.1-0.1,0.5-0.4,1-0.9c1.2-0.7,1.6-2,1.9-3.2c0.4-1.5,0.7-1.9,1.2-1.9
-                c0.1,0,0.3,0,0.5,0.1v-6.7l-0.1-0.3c-0.2-1.7-0.7-3.3-1.8-4.5c-0.3-0.4-0.8-0.5-1.3-0.2c-0.4,0.2-0.6,0.8-0.4,1.2L140,18
-                c0.1,2.6-1,5.4-2.3,6.8L135.3,24.4z M132.6,56.2c0.7-0.5,1.4-1.2,1.9-1.9c1-1.2,1.9-2.2,3.1-1.9c0.4,0.1,0.9-0.1,1.1-0.4
-                c0.2-0.4,0.2-0.9-0.2-1.2l-2-2c-0.2-0.2-0.5-0.3-0.8-0.3c-0.3,0-0.6,0.2-0.7,0.4l-3.9,5.9c-0.3,0.4-0.2,0.9,0.1,1.3
-                c0.2,0.2,0.4,0.3,0.7,0.3C132.3,56.4,132.5,56.3,132.6,56.2z M127.5,62.1c-2.1,1.4-3.7,1.4-5.6,1.5c-1,0-2,0-3,0.2
-                c-0.5,0.1-0.8,0.5-0.8,1c0,0.5,0.4,0.9,0.9,0.9l6.9,0.7c0,0,0.1,0,0.1,0c0.3,0,0.5-0.1,0.7-0.3c0.3-0.3,0.6-0.6,0.9-1
-                c1-1.1,1.8-2.2,3.6-2.8c0.4-0.1,0.7-0.5,0.6-1s-0.3-0.8-0.7-0.9c0,0,0,0-0.1,0c0.1-0.4,0.2-0.8,0.1-1.2c-0.1-0.3-0.3-0.8-0.9-1.1
-                c-0.2-0.1-0.4-0.1-0.6-0.1c-0.2,0-0.5,0.1-0.7,0.1c0.2-1,0.9-2.2,1.5-3.4l0.5-1c0.1-0.2,0.2-0.4,0.3-0.6c0.8-1.6,1.6-3.5,1.3-5.4
-                c-0.1-0.4-0.3-0.7-0.7-0.8c-0.4-0.1-0.8,0-1,0.3l-2.2,2.6c-0.2,0.3-0.3,0.6-0.2,0.9c0.1,0.3,0.3,0.6,0.6,0.7
-                c0.4,0.1,0.5,0.3,0.5,0.3c0,0,0,0.2-0.1,0.5l-0.2,0.4c-0.6,1-1.8,2.2-2.9,3.4c-1.3,1.4-2.7,2.9-3.4,4.1c-0.2,0.4-0.1,0.9,0.2,1.2
-                c0.3,0.3,0.8,0.3,1.2,0.1c1.1-0.8,2.1-1.1,3-1.2c0.2,0.3,0.4,0.6,0.7,0.8c0,0-0.1,0.1-0.1,0.1C127.9,61.5,127.7,61.8,127.5,62.1z
-                 M135.4,90.9l-1.6,6.2c-0.1,0.4,0,0.8,0.3,1c0.2,0.2,0.4,0.2,0.6,0.2c0.1,0,0.3,0,0.4-0.1c1.9-0.9,2-3.2,2.1-5.1
-                c0-0.7,0-1.3,0.1-1.8l0.1-0.5c0-0.1,0.1-0.2,0.1-0.2c0.7,0.3,1.3,0.4,1.9,0.3c0.3,1,1.2,1.8,2.6,2.5v-6c0,0-0.1,0.1-0.1,0.1
-                c-0.7,0.6-1.3,1.1-2,1.3c-0.4-0.2-0.9-0.3-1.2-0.3c0.2-0.7,0.4-1.4,0.7-2.1c0.5-0.6,0.9-1.4,1.2-2.1l0.1-0.3
-                c0.4-0.5,0.9-0.9,1.3-1.1v-2.6c-1.8,0.2-2.6,1.7-3,2.6c-0.5,0.7-0.9,1.4-1.3,2.4c-0.6,0.5-1.4,0.5-2.7,0c-0.3-0.1-0.6-0.1-0.9,0.1
-                c-0.3,0.2-0.4,0.5-0.4,0.8v1.9c0,0.5,0.3,0.9,0.8,1l1.3,0.2l-0.2,0.8C135.5,90.4,135.4,90.7,135.4,90.9z"/>
-        </pattern>
-
-        <!-- <mask id="noise-mask">
-            <rect height="100%" width="100%" fill="url(#noise-pattern)" />
-        </mask> -->
-    </defs>
-</svg>
diff --git a/examples/parallax-example/index.html b/examples/parallax-example/index.html
deleted file mode 100644
index 89ae54f29..000000000
--- a/examples/parallax-example/index.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>React Scroll Parallax</title>
-    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/6.0.0/normalize.css">
-    <link href="https://fonts.googleapis.com/css?family=Roboto+Mono:300,500,700i" rel="stylesheet">
-    <style>
-        .star {
-            position: fixed;
-            top: 1em;
-            right: 1em;
-        }
-    </style>
-</head>
-<body>
-    <div id="root">$react</div>
-    <div class="star">
-        <a class="github-button" href="https://github.com/jscottsmith/react-scroll-parallax" data-icon="octicon-star" aria-label="Star jscottsmith/react-scroll-parallax on GitHub">Star</a>
-    </div>
-    <script src="/static/bundle.js"></script>
-    <script async defer src="https://buttons.github.io/buttons.js"></script>
-</body>
-</html>
diff --git a/examples/parallax-example/server.js b/examples/parallax-example/server.js
deleted file mode 100644
index ce4c5d91b..000000000
--- a/examples/parallax-example/server.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import path from 'path';
-import fs from 'fs';
-import express from 'express';
-
-import React from 'react';
-import ReactServer from 'react-dom/server';
-import { ParallaxExample } from 'components';
-
-import 'babel-polyfill';
-
-const app = express();
-
-app.use('/static', express.static(path.resolve(__dirname, './dist')));
-
-app.get('*', (req, res) => {
-    const html = fs
-        .readFileSync(path.resolve(__dirname, './index.html'))
-        .toString();
-    const markup = ReactServer.renderToString(<ParallaxExample />);
-
-    res.send(html.replace('$react', markup));
-});
-
-app.listen(3000, () => {
-    console.log('Listening on: http://localhost:3000');
-});
diff --git a/examples/parallax-example/styles/colors.scss b/examples/parallax-example/styles/colors.scss
deleted file mode 100644
index 48fc4c02c..000000000
--- a/examples/parallax-example/styles/colors.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-$plum: #3d3547;
-$purple: #a179af;
-$tan: #edeaea;
\ No newline at end of file
diff --git a/package.json b/package.json
index c67403205..0f6399bd6 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,7 @@
   "main": "lib/index.js",
   "scripts": {
     "dev": "jest && webpack --progress --colors --watch",
-    "dev-server": "node ./examples/parallax-example/dist/server",
+    "dev-server": "node ./example/dist/server",
     "gh-pages": "NODE_ENV=production webpack --progress --colors",
     "test": "jest",
     "prettier": "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
@@ -46,15 +46,12 @@
     "cross-env": "^3.1.4",
     "css-loader": "^0.28.0",
     "express": "^4.14.1",
-    "file-loader": "^0.11.1",
     "jest": "^20.0.4",
     "node-sass": "^4.5.0",
     "postcss-loader": "^1.3.3",
-    "raw-loader": "^0.5.1",
     "regenerator-runtime": "^0.10.5",
     "sass-loader": "^6.0.3",
     "style-loader": "^0.16.1",
-    "url-loader": "^0.5.8",
     "webpack": "^2.2.1",
     "webpack-merge": "^4.1.0",
     "webpack-node-externals": "^1.5.4"
diff --git a/webpack.config.js b/webpack.config.js
index 530e8662b..655344557 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,6 +1,4 @@
-// Change this root to point to the desired example when
-const EXAMPLE_ROOT = './examples/parallax-example/';
-
+const ROOT = './example/';
 const createBabelConfig = require('./babelrc');
 const merge = require('webpack-merge');
 const nodeExternals = require('webpack-node-externals');
@@ -11,18 +9,16 @@ const baseConfig = {
     resolve: {
         alias: {
             'react-scroll-parallax': path.resolve('./src'),
-            'components': path.resolve(EXAMPLE_ROOT + 'components'),
+            components: path.resolve(ROOT + 'components'),
         },
     },
 };
 
 const clientConfig = merge(baseConfig, {
-    entry: path.resolve(EXAMPLE_ROOT + 'client.js'),
+    entry: path.resolve(ROOT + 'client.js'),
 
     output: {
-        path: path.resolve(
-            EXAMPLE_ROOT + 'dist'
-        ),
+        path: path.resolve(ROOT + 'dist'),
         filename: 'bundle.js',
     },
 
@@ -30,25 +26,13 @@ const clientConfig = merge(baseConfig, {
         rules: [
             {
                 test: /\.js$/,
-                include: [
-                    path.resolve(EXAMPLE_ROOT),
-                    path.resolve('./src'),
-                ],
+                include: [path.resolve(ROOT), path.resolve('./src')],
                 loader: 'babel-loader',
                 query: createBabelConfig(),
             },
-            {
-                test: /\.(png|jpg|jpeg|gif|svg|cur)$/,
-                loader: 'url-loader',
-                include: [
-                    path.resolve(EXAMPLE_ROOT),
-                ],
-            },
             {
                 test: /\.scss$/,
-                include: [
-                    path.resolve(EXAMPLE_ROOT),
-                ],
+                include: [path.resolve(ROOT)],
                 loaders: [
                     'style-loader',
                     {
@@ -82,12 +66,10 @@ const serverConfig = merge(baseConfig, {
         __dirname: true,
     },
 
-    entry: path.resolve(EXAMPLE_ROOT + 'server.js'),
+    entry: path.resolve(ROOT + 'server.js'),
 
     output: {
-        path: path.resolve(
-            EXAMPLE_ROOT + 'dist'
-        ),
+        path: path.resolve(ROOT + 'dist'),
         filename: 'server.js',
     },
 
@@ -95,18 +77,13 @@ const serverConfig = merge(baseConfig, {
         rules: [
             {
                 test: /\.js$/,
-                include: [
-                    path.resolve(EXAMPLE_ROOT),
-                    path.resolve('./src'),
-                ],
+                include: [path.resolve(ROOT), path.resolve('./src')],
                 loader: 'babel-loader',
                 query: createBabelConfig({ server: true }),
             },
             {
                 test: /\.scss$/,
-                include: [
-                    path.resolve(EXAMPLE_ROOT),
-                ],
+                include: [path.resolve(ROOT)],
                 loaders: [
                     {
                         loader: 'css-loader/locals',
@@ -115,7 +92,8 @@ const serverConfig = merge(baseConfig, {
                             sourceMap: false,
                         },
                     },
-                    'postcss-loader', {
+                    'postcss-loader',
+                    {
                         loader: 'sass-loader',
                         query: {
                             outputStyle: 'expanded',

From 454d21fc87e8d74e0e48eaa5e934f118092bcc5e Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 5 Aug 2017 17:14:47 -0700
Subject: [PATCH 010/158] update example links

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 0b93b5236..d761c85b3 100644
--- a/README.md
+++ b/README.md
@@ -8,9 +8,9 @@ Provides a React component and single global passive scroll listener to add **ve
 
 🔗 [CodePen Parallax](https://codepen.io/jscottsmith/pen/eREbwz)
 
-🔗 [Example Site](https://jscottsmith.github.io/react-scroll-parallax/examples/parallax-example/)
+🔗 [Example Site](https://jscottsmith.github.io/react-scroll-parallax-examples/examples/parallax-example/)
 
-🔗 [Parallax Testing](https://jscottsmith.github.io/react-scroll-parallax/examples/parallax-test/)
+🔗 [Parallax Testing](https://jscottsmith.github.io/react-scroll-parallax-examples/examples/parallax-test/)
 
 ## Install
 

From 4868ae44046b870c2126a5137942a28b9ed33741 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 5 Aug 2017 21:53:31 -0700
Subject: [PATCH 011/158] remove beta from readme

---
 README.md | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/README.md b/README.md
index d761c85b3..15fdcdd46 100644
--- a/README.md
+++ b/README.md
@@ -14,12 +14,8 @@ Provides a React component and single global passive scroll listener to add **ve
 
 ## Install
 
-⚠️ **Warning: This is a beta pre-release**
-
-[1.0.0 Release goals](https://github.com/jscottsmith/react-scroll-parallax/issues/3)
-
 ```
-npm i --save react-scroll-parallax@beta
+npm i react-scroll-parallax --save
 ```
 
 ## Usage

From 37ea157f3c623e3b865fbda1fd341d7bdcbbadfb Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 5 Aug 2017 22:12:16 -0700
Subject: [PATCH 012/158] add a note in Usage about updating the
 ParallaxController when page height changes

---
 README.md | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 15fdcdd46..eb96991d1 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # React Scroll Parallax
 
-Provides a React component and single global passive scroll listener to add **vertical** scrolling based offsets to elements based on their position in the viewport. Works with server-side rendering and universal React apps.
+Provides a React component and single global passive scroll listener to add **vertical** scrolling based offsets to elements based on their position in the viewport. Works with universal (server-side rendered)  React apps.
 
 [View on NPM](https://www.npmjs.com/package/react-scroll-parallax)
 
@@ -48,6 +48,8 @@ import { Parallax } from 'react-scroll-parallax';
 </Parallax>
 ```
 
+NOTE: `ParallaxController` caches the scroll state and positions of elements on the page for performance reasons. This means that if the page height changes (perhaps by images loading) after `<Parallax />` components are mounted it won't properly determine when the elements are in view. To correct this call the `update()` once every thing has loaded and ready.
+
 ## Parallax Component Props
 
 The following are all props that can be passed to the React `<Parallax />` component:
@@ -151,4 +153,4 @@ React Scroll Parallax uses a single [passive scroll listener](https://developer.
 
 **PSA**
 
-It's 2017 and you probably shouldn't be building parallax sites—but if you do (like I did) and you use this package try and use it responsibly. Keeping images small and optimized, reducing the number of moving elements in view and on the page, and disabling scroll effects on mobile devices should help achieve silky smooth animations and minimize annoying visitors.
+It's 2017 and you probably shouldn't be building parallax sites—but if you do (like I did) and you use this package try and use it responsibly. Keeping images small and optimized, reducing the number of moving elements in view and on the page, and disabling scroll effects on mobile devices should help achieve silky smooth animations.

From 11ea6a0d66c0afa058cfa0b12732609e3410e8ea Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Mon, 14 Aug 2017 00:16:21 -0700
Subject: [PATCH 013/158] update readme to clarify that the
 `ParallaxController` is a global on the window (#4)

---
 README.md | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index eb96991d1..b47965cb2 100644
--- a/README.md
+++ b/README.md
@@ -20,7 +20,7 @@ npm i react-scroll-parallax --save
 
 ## Usage
 
-Import `ParallaxController` on the client side and call `ParallaxController.init()` to create the global `ParallaxController` which will handle updating all parallax elements on scroll.
+Import `ParallaxController` on the client side and call `ParallaxController.init()` to create the global `ParallaxController` on the `window` which will handle controlling all parallax elements on scroll. Ideally, this would be called at the root of your react app on the client.
 
 ```javascript
 import { ParallaxController } from 'react-scroll-parallax';
@@ -48,7 +48,7 @@ import { Parallax } from 'react-scroll-parallax';
 </Parallax>
 ```
 
-NOTE: `ParallaxController` caches the scroll state and positions of elements on the page for performance reasons. This means that if the page height changes (perhaps by images loading) after `<Parallax />` components are mounted it won't properly determine when the elements are in view. To correct this call the `update()` once every thing has loaded and ready.
+**NOTE:** `ParallaxController` caches the scroll state and positions of elements on the page for performance reasons. This means that if the page height changes (perhaps from images loading) after `<Parallax />` components are mounted it won't properly determine when the elements are in view. To correct this call the `update()` from the global `ParallaxController` once every thing has loaded and is ready.
 
 ## Parallax Component Props
 
@@ -111,12 +111,14 @@ Optionally pass a tag name to be applied to the outer most parallax element. For
 
 ## Parallax Controller
 
-The following are public methods available on the `ParallaxController` global:
-
 **`init()`**
 
 Initilize the `ParallaxController` on the client with the `init` static method.
 
+**NOTE:** Calling `ParallaxController.init()` creates an instance of the controller on the `window` using the same name, e.g. `window.ParallaxController`.
+
+The following are public methods available on the `window.ParallaxController` global:
+
 **`update()`**
 
 Updates all cached attributes for parallax elements then updates their positions.

From f50eafe14d208e6cf4ede594376537033ecb8ea2 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 16 Aug 2017 01:15:08 -0700
Subject: [PATCH 014/158] add `ParallaxProvider` component that uses context to
 pass children a reference to controller instance

---
 src/components/ParallaxProvider.js | 42 ++++++++++++++++++++++++++++++
 src/index.js                       |  1 +
 2 files changed, 43 insertions(+)
 create mode 100644 src/components/ParallaxProvider.js

diff --git a/src/components/ParallaxProvider.js b/src/components/ParallaxProvider.js
new file mode 100644
index 000000000..ad8eac063
--- /dev/null
+++ b/src/components/ParallaxProvider.js
@@ -0,0 +1,42 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { ParallaxController } from 'react-scroll-parallax';
+
+export default class ParallaxProvider extends Component {
+    static propTypes = {
+        children: PropTypes.node.isRequired,
+    };
+
+    static childContextTypes = {
+        parallaxController: PropTypes.object,
+    };
+
+    getChildContext() {
+        // Passes down the reference to the controller
+        const { parallaxController } = this;
+        return { parallaxController };
+    }
+
+    componentWillMount() {
+        // Don't initialize on the server
+        const isServer = typeof window === 'undefined';
+
+        if (!isServer) {
+            // Must not be the server so kick it off...
+            this.parallaxController = ParallaxController.init();
+        }
+    }
+
+    componentWillUnmount() {
+        if (this.parallaxController) {
+            // Remove scroll and resize listener if the provider is unmounted
+            this.parallaxController.destroy();
+        }
+    }
+
+    render() {
+        const { children } = this.props;
+
+        return children;
+    }
+}
diff --git a/src/index.js b/src/index.js
index dbd15a8da..584182883 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,2 +1,3 @@
 export Parallax from './components/Parallax';
+export ParallaxProvider from './components/ParallaxProvider';
 export ParallaxController from './libs/ParallaxController';

From d736541080c6c26d9502a80cd4d46f5f7a7b77c6 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 16 Aug 2017 01:16:27 -0700
Subject: [PATCH 015/158] Remove window globals and only return the instance
 from the ParallaxController `init` method.

---
 src/libs/ParallaxController.js | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/libs/ParallaxController.js b/src/libs/ParallaxController.js
index 63416427d..4a087dba0 100644
--- a/src/libs/ParallaxController.js
+++ b/src/libs/ParallaxController.js
@@ -385,20 +385,16 @@ function ParallaxController() {
     this.destroy = function() {
         _removeListeners();
         _removeParallaxStyles();
-        window.ParallaxController = null;
     };
 }
 
 /**
  * Static method to instantiate the ParallaxController.
- * Returns a new or existing instance of the ParallaxController.
+ * Returns a new instance of the ParallaxController.
  * @returns {Object} ParallaxController
  */
 ParallaxController.init = function() {
-    if (!window.ParallaxController) {
-        window.ParallaxController = new ParallaxController();
-    }
-    return window.ParallaxController;
+    return new ParallaxController();
 };
 
 export default ParallaxController;

From 9cd48a2247d799e88495334f7a286d211ce22c5d Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 16 Aug 2017 01:17:56 -0700
Subject: [PATCH 016/158] update Parallax component to use context to access
 the controller

---
 src/components/Parallax.js | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 382d8ec9d..3a563a489 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -1,6 +1,7 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import { offsetMin, offsetMax } from '../utils/propValidation';
+import { ParallaxController } from 'react-scroll-parallax';
 
 export default class Parallax extends Component {
     static defaultProps = {
@@ -25,15 +26,20 @@ export default class Parallax extends Component {
         tag: PropTypes.string.isRequired,
     };
 
+    static contextTypes = {
+        parallaxController: PropTypes.object, // not required because this could be rendered on the server.
+    };
+
     componentDidMount() {
-        // add this Parallax element to the global listener
-        if (typeof ParallaxController === 'undefined') {
+        // Make sure the provided context is an instance of the controller
+        if (!(this.context.parallaxController instanceof ParallaxController)) {
             throw new Error(
-                'Must initialize the ParallaxController before adding React Parallax components.'
+                "Must wrap your application's <Parallax /> components in a <ParallaxProvider />."
             );
         }
+
         // create a new parallax element and save the reference
-        this.element = ParallaxController.createElement({
+        this.element = this.context.parallaxController.createElement({
             elInner: this._inner,
             elOuter: this._outer,
             props: {
@@ -50,7 +56,7 @@ export default class Parallax extends Component {
     componentWillReceiveProps(nextProps) {
         // updates the elements props when changed
         if (this.props !== nextProps) {
-            ParallaxController.updateElement(this.element, {
+            this.context.parallaxController.updateElement(this.element, {
                 props: {
                     disabled: nextProps.disabled,
                     offsetXMax: nextProps.offsetXMax,
@@ -63,12 +69,12 @@ export default class Parallax extends Component {
         }
         // resets element styles when disabled
         if (this.props.disabled !== nextProps.disabled && nextProps.disabled) {
-            ParallaxController.resetElementStyles(this.element);
+            this.context.parallaxController.resetElementStyles(this.element);
         }
     }
 
     componentWillUnmount() {
-        ParallaxController.removeElement(this.element);
+        this.context.parallaxController.removeElement(this.element);
     }
 
     // refs

From 63fd84fc69dfc5486a1ad8a6e5f01a023a0d32f2 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 16 Aug 2017 01:19:28 -0700
Subject: [PATCH 017/158] add App component with ParallaxProvider, update
 server to use server side rendering

---
 example/client.js             |  7 ++-----
 example/components/App/App.js | 14 ++++++++++++++
 example/components/index.js   |  1 +
 example/server.js             | 13 +++++++------
 4 files changed, 24 insertions(+), 11 deletions(-)
 create mode 100644 example/components/App/App.js

diff --git a/example/client.js b/example/client.js
index c52c2b5e4..97c08772f 100644
--- a/example/client.js
+++ b/example/client.js
@@ -1,11 +1,8 @@
 import 'babel-polyfill';
 import React from 'react';
 import ReactDOM from 'react-dom';
-import { ParallaxTest } from 'components';
-import { ParallaxController } from 'react-scroll-parallax';
-
-ParallaxController.init();
+import { App } from 'components';
 
 const root = document.getElementById('root');
 
-ReactDOM.render(<ParallaxTest />, root);
+ReactDOM.render(<App />, root);
diff --git a/example/components/App/App.js b/example/components/App/App.js
new file mode 100644
index 000000000..53ac4a3b9
--- /dev/null
+++ b/example/components/App/App.js
@@ -0,0 +1,14 @@
+import React, { Component } from 'react';
+// import PropTypes from 'prop-types';
+import { ParallaxProvider } from 'react-scroll-parallax';
+import { ParallaxTest } from 'components';
+
+export default class App extends Component {
+    render() {
+        return (
+            <ParallaxProvider>
+                <ParallaxTest />
+            </ParallaxProvider>
+        );
+    }
+}
diff --git a/example/components/index.js b/example/components/index.js
index 8275f7a2b..042910546 100644
--- a/example/components/index.js
+++ b/example/components/index.js
@@ -1 +1,2 @@
 export ParallaxTest from './ParallaxTest/ParallaxTest.js';
+export App from './App/App.js';
diff --git a/example/server.js b/example/server.js
index 3f3caf445..f59e85e24 100644
--- a/example/server.js
+++ b/example/server.js
@@ -4,23 +4,24 @@ import express from 'express';
 
 import React from 'react';
 import ReactServer from 'react-dom/server';
-import { ParallaxTest } from 'components';
+import { App } from 'components';
 
 import 'babel-polyfill';
 
-const app = express();
+const server = express();
 
-app.use('/static', express.static(path.resolve(__dirname, './dist')));
+server.use('/static', express.static(path.resolve(__dirname, './dist')));
 
-app.get('*', (req, res) => {
+server.get('*', (req, res) => {
     const html = fs
         .readFileSync(path.resolve(__dirname, './index.html'))
         .toString();
-    const markup = ReactServer.renderToString(<ParallaxTest />);
+
+    const markup = ReactServer.renderToString(<App />);
 
     res.send(html.replace('$react', markup));
 });
 
-app.listen(3000, () => {
+server.listen(3000, () => {
     console.log('Listening on: http://localhost:3000');
 });

From 143df9c9d1666950714d68395575ebbf3420c197 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 16 Aug 2017 01:54:47 -0700
Subject: [PATCH 018/158] =?UTF-8?q?add=20destroy=20call=20via=20context=20?=
 =?UTF-8?q?to=20`ParallaxTest`=20=F0=9F=92=A5=E2=98=A0=EF=B8=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../components/ParallaxTest/ParallaxTest.js   | 21 +++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/example/components/ParallaxTest/ParallaxTest.js b/example/components/ParallaxTest/ParallaxTest.js
index 45b4917a4..443917044 100644
--- a/example/components/ParallaxTest/ParallaxTest.js
+++ b/example/components/ParallaxTest/ParallaxTest.js
@@ -1,11 +1,16 @@
-import React from 'react';
+import React, { Component } from 'react';
+import { PropTypes } from 'prop-types';
 import { Parallax } from 'react-scroll-parallax';
 import style from './ParallaxTest.scss';
 
 const INC_AMOUNT = 10;
 const START_NUM_ELEMENTS = 10;
 
-export default class ParallaxTest extends React.Component {
+export default class ParallaxTest extends Component {
+    static contextTypes = {
+        parallaxController: PropTypes.object.isRequired,
+    };
+
     state = {
         elements: new Array(START_NUM_ELEMENTS).fill(null).map((x, i) => i),
         offsetY: INC_AMOUNT,
@@ -14,6 +19,10 @@ export default class ParallaxTest extends React.Component {
         disabled: false,
     };
 
+    triggerDestroy = () => {
+        this.context.parallaxController.destroy();
+    };
+
     handleAdd = () => {
         const elements = [...this.state.elements, this.state.elements.length];
         this.setState({
@@ -158,6 +167,14 @@ export default class ParallaxTest extends React.Component {
                             {this.state.disabled ? 'Enable' : 'Disable'}
                         </button>
                     </div>
+                    <div className={style.currentState}>
+                        <h4>
+                            Destroys the ParallaxController. :-(
+                        </h4>
+                        <button onClick={this.triggerDestroy}>
+                            Destroy
+                        </button>
+                    </div>
                 </div>
             </div>
         );

From 09899e47665606185482459d2fe68f2532633447 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 16 Aug 2017 01:56:57 -0700
Subject: [PATCH 019/158] update readme with documentation  on the
 `ParallaxProvider` and parallax controller context access

---
 README.md | 40 +++++++++++++++++++++++++++++-----------
 1 file changed, 29 insertions(+), 11 deletions(-)

diff --git a/README.md b/README.md
index b47965cb2..011f807fe 100644
--- a/README.md
+++ b/README.md
@@ -20,12 +20,22 @@ npm i react-scroll-parallax --save
 
 ## Usage
 
-Import `ParallaxController` on the client side and call `ParallaxController.init()` to create the global `ParallaxController` on the `window` which will handle controlling all parallax elements on scroll. Ideally, this would be called at the root of your react app on the client.
+Wrap your component tree that will contain `<Parallax />` components with the `<ParallaxProvider />`;
 
 ```javascript
-import { ParallaxController } from 'react-scroll-parallax';
+...
+import { ParallaxProvider } from 'react-scroll-parallax';
+
+class App extends Component {
+    render() {
+        return (
+            <ParallaxProvider>
+                <StuffWithParallax />
+            </ParallaxProvider>
+        );
+    }
+}
 
-ParallaxController.init();
 ```
 
 Import the `Parallax` component...
@@ -48,7 +58,7 @@ import { Parallax } from 'react-scroll-parallax';
 </Parallax>
 ```
 
-**NOTE:** `ParallaxController` caches the scroll state and positions of elements on the page for performance reasons. This means that if the page height changes (perhaps from images loading) after `<Parallax />` components are mounted it won't properly determine when the elements are in view. To correct this call the `update()` from the global `ParallaxController` once every thing has loaded and is ready.
+**NOTE:** The Parallax Controller caches the scroll state and positions of elements on the page for performance reasons. This means that if the page height changes (perhaps from images loading) after `<Parallax />` components are mounted it won't properly determine when the elements are in view. To correct this you can call the `update()` method from any child component of the `<ParallaxProvider />` via context once every thing has loaded and is ready. More details on how here: [Parallax Controller Context](#parallax-controller-context)
 
 ## Parallax Component Props
 
@@ -109,15 +119,23 @@ Determines whether the scroll rate of the parallax component will move faster or
 
 Optionally pass a tag name to be applied to the outer most parallax element. For example: `<Parallax tag="figure" />`.
 
-## Parallax Controller
+## Parallax Controller Context
 
-**`init()`**
+Access the Parallax Controller via context in any components rendered within a `<ParallaxProvider />` by defining the `contextTypes` like so:
 
-Initilize the `ParallaxController` on the client with the `init` static method.
+```
+class Foo extends Component {
+
+    static contextTypes = {
+        parallaxController: PropTypes.object.isRequired,
+    };
+
+    ...
+```
 
-**NOTE:** Calling `ParallaxController.init()` creates an instance of the controller on the `window` using the same name, e.g. `window.ParallaxController`.
+### Available Methods
 
-The following are public methods available on the `window.ParallaxController` global:
+Access the following method via context such as `this.context.parallaxController`.
 
 **`update()`**
 
@@ -125,9 +143,9 @@ Updates all cached attributes for parallax elements then updates their positions
 
 **`destroy()`**
 
-Removes window scroll and resize listeners, resets all styles applied to parallax elements, and sets the global `ParallaxController` to `null`.
+Removes window scroll and resize listeners then resets all styles applied to parallax elements.
 
-## Support
+## Browser Support
 
 React scroll parallax should support the last two versions of all major browsers and has been tested on desktop Chrome, Firefox, Safari and Edge, as well as the following: iOS 9, iOS 10, Android 4 and IE11. If you encounter any errors for browsers that should be supported please post an issue.
 

From 66feee694bbfcbd1a3638240b1686d6770c19c8b Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 16 Aug 2017 11:10:19 -0700
Subject: [PATCH 020/158] update and clarify some notes in docs

---
 README.md | 52 ++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 36 insertions(+), 16 deletions(-)

diff --git a/README.md b/README.md
index 011f807fe..e6aadef6e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # React Scroll Parallax
 
-Provides a React component and single global passive scroll listener to add **vertical** scrolling based offsets to elements based on their position in the viewport. Works with universal (server-side rendered)  React apps.
+Provides a React component and single passive scroll listener to add **vertical** scrolling based offsets to elements based on their position in the viewport. Works with universal (server-side rendered) React apps.
 
 [View on NPM](https://www.npmjs.com/package/react-scroll-parallax)
 
@@ -22,7 +22,7 @@ npm i react-scroll-parallax --save
 
 Wrap your component tree that will contain `<Parallax />` components with the `<ParallaxProvider />`;
 
-```javascript
+```jsx
 ...
 import { ParallaxProvider } from 'react-scroll-parallax';
 
@@ -58,7 +58,7 @@ import { Parallax } from 'react-scroll-parallax';
 </Parallax>
 ```
 
-**NOTE:** The Parallax Controller caches the scroll state and positions of elements on the page for performance reasons. This means that if the page height changes (perhaps from images loading) after `<Parallax />` components are mounted it won't properly determine when the elements are in view. To correct this you can call the `update()` method from any child component of the `<ParallaxProvider />` via context once every thing has loaded and is ready. More details on how here: [Parallax Controller Context](#parallax-controller-context)
+**NOTE:** The Parallax Controller caches the scroll state and positions of elements on the page for performance reasons. This means that if the page height changes (perhaps from images loading) after `<Parallax />` components are mounted it won't properly determine when the elements are in view. To correct this you can call the `parallaxController.update()` method from any child component of the `<ParallaxProvider />` via context once every thing has loaded and is ready. More details on how here: [Parallax Controller Context](#parallax-controller-context)
 
 ## Parallax Component Props
 
@@ -123,32 +123,32 @@ Optionally pass a tag name to be applied to the outer most parallax element. For
 
 Access the Parallax Controller via context in any components rendered within a `<ParallaxProvider />` by defining the `contextTypes` like so:
 
-```
+```jsx
 class Foo extends Component {
 
     static contextTypes = {
         parallaxController: PropTypes.object.isRequired,
     };
 
+    doSomething() {
+        // do stuff with this.context.parallaxController
+    }
+
     ...
 ```
 
-### Available Methods
-
-Access the following method via context such as `this.context.parallaxController`.
-
-**`update()`**
+or for stateless functional components like:
 
-Updates all cached attributes for parallax elements then updates their positions.
-
-**`destroy()`**
-
-Removes window scroll and resize listeners then resets all styles applied to parallax elements.
+```jsx
+const Bar = (props, context) => (
 
-## Browser Support
+    // do stuff with context.parallaxController
 
-React scroll parallax should support the last two versions of all major browsers and has been tested on desktop Chrome, Firefox, Safari and Edge, as well as the following: iOS 9, iOS 10, Android 4 and IE11. If you encounter any errors for browsers that should be supported please post an issue.
+    ...
+);
 
+Bar.contextTypes = {
+    parallaxController: PropTypes.object.isRequired,
 ## Development
 
 Install node modules and start webpack:
@@ -167,6 +167,26 @@ Run Jest tests:
 
 `npm run test`
 
+};
+
+```
+
+### Available Methods
+
+Access the following methods on `parallaxController` via context:
+
+**`update()`**
+
+Updates all cached attributes for parallax elements then updates their positions.
+
+**`destroy()`**
+
+Removes window scroll and resize listeners then resets all styles applied to parallax elements.
+
+## Browser Support
+
+React scroll parallax should support the last two versions of all major browsers and has been tested on desktop Chrome, Firefox, Safari and Edge, as well as the following: iOS 9, iOS 10, Android 4 and IE11. If you encounter any errors for browsers that should be supported please post an issue.
+
 ## Optimizations to Reduce Jank
 
 React Scroll Parallax uses a single [passive scroll listener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners) (dependent on browser support) with the minimal amount of work done on the scroll event to prevent [jank](http://jankfree.org/) (calculations that cause layout, reflow and paint are cached initially and only updated when layout changes). Request animation frame is then used to decouple the scroll handler and further reduce jank. All offsets are applied with 3D transforms to utilize the GPU and prevent paints. If you have ideas to further optimize scrolling please PR or post an issue.

From 487b85ade8a9b217f744a34fc0a2dbaa1e8fe454 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 16 Aug 2017 11:10:46 -0700
Subject: [PATCH 021/158] move development notes to docs

---
 README.md           | 18 ------------------
 docs/development.md | 17 +++++++++++++++++
 2 files changed, 17 insertions(+), 18 deletions(-)
 create mode 100644 docs/development.md

diff --git a/README.md b/README.md
index e6aadef6e..008d12431 100644
--- a/README.md
+++ b/README.md
@@ -149,24 +149,6 @@ const Bar = (props, context) => (
 
 Bar.contextTypes = {
     parallaxController: PropTypes.object.isRequired,
-## Development
-
-Install node modules and start webpack:
-
-`npm i`
-
-Run webpack watch:
-
-`npm run dev`
-
-Run dev server:
-
-`npm run dev-server`
-
-Run Jest tests:
-
-`npm run test`
-
 };
 
 ```
diff --git a/docs/development.md b/docs/development.md
new file mode 100644
index 000000000..c45b493e0
--- /dev/null
+++ b/docs/development.md
@@ -0,0 +1,17 @@
+# Development
+
+Install node modules and start webpack:
+
+`npm i`
+
+Run webpack watch:
+
+`npm run dev`
+
+Run dev server:
+
+`npm run dev-server`
+
+Run Jest tests:
+
+`npm run test`

From 1b24aef9c26515fa20903e74348eda8c615f547d Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 13:14:26 -0700
Subject: [PATCH 022/158] add test watch script and react-test-renderer

---
 package.json | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/package.json b/package.json
index 0f6399bd6..40a6eb197 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,7 @@
     "dev-server": "node ./example/dist/server",
     "gh-pages": "NODE_ENV=production webpack --progress --colors",
     "test": "jest",
+    "test:watch": "jest --watch",
     "prettier": "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
     "prepublish": "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports"
   },
@@ -49,6 +50,7 @@
     "jest": "^20.0.4",
     "node-sass": "^4.5.0",
     "postcss-loader": "^1.3.3",
+    "react-test-renderer": "^15.6.1",
     "regenerator-runtime": "^0.10.5",
     "sass-loader": "^6.0.3",
     "style-loader": "^0.16.1",

From 63606b3ec2aa29727723bb989201ed127a4c2af3 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 13:21:38 -0700
Subject: [PATCH 023/158] add `ScrollController` and `ScrollProvider` with
 tests

---
 __tests__/ScrollProvider.test.js              | 62 +++++++++++++++
 .../__snapshots__/ScrollProvider.test.js.snap |  8 ++
 src/components/ScrollProvider.js              | 42 ++++++++++
 src/libs/ScrollController.js                  | 76 +++++++++++++++++++
 4 files changed, 188 insertions(+)
 create mode 100644 __tests__/ScrollProvider.test.js
 create mode 100644 __tests__/__snapshots__/ScrollProvider.test.js.snap
 create mode 100644 src/components/ScrollProvider.js
 create mode 100644 src/libs/ScrollController.js

diff --git a/__tests__/ScrollProvider.test.js b/__tests__/ScrollProvider.test.js
new file mode 100644
index 000000000..1eb7da2c3
--- /dev/null
+++ b/__tests__/ScrollProvider.test.js
@@ -0,0 +1,62 @@
+/* global describe, it */
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import ReactDOM from 'react-dom';
+import { ScrollProvider, ScrollPosition, ScrollController } from 'index';
+import renderer from 'react-test-renderer';
+
+describe('A <ScrollProvider>', () => {
+    it('to render children', () => {
+        const component = renderer.create(
+            <ScrollProvider>
+                <img src="foo" alt="bar" />
+            </ScrollProvider>
+        );
+        let tree = component.toJSON();
+        expect(tree).toMatchSnapshot();
+    });
+
+    it('to pass context', () => {
+        const node = document.createElement('div');
+
+        let rootContext;
+        const ContextChecker = (props, context) => {
+            rootContext = context;
+            return null;
+        };
+
+        const testController = ScrollController.init();
+
+        ContextChecker.contextTypes = {
+            scrollController: PropTypes.shape({
+                destroy: PropTypes.func.isRequired,
+                subscribe: PropTypes.func.isRequired,
+                unsubscribe: PropTypes.func.isRequired,
+            }),
+        };
+
+        // afterEach(() => {
+        //     rootContext = undefined;
+        // });
+
+        ReactDOM.render(
+            <ScrollProvider>
+                <ContextChecker />
+            </ScrollProvider>,
+            node
+        );
+
+        // Expected methods and state
+        expect(rootContext.scrollController.state.scrollY).toBe(0);
+        expect(rootContext.scrollController.subscribe).toBe(
+            testController.subscribe
+        );
+        expect(rootContext.scrollController.unsubscribe).toBe(
+            testController.unsubscribe
+        );
+        expect(rootContext.scrollController.destroy).toBe(
+            testController.destroy
+        );
+    });
+});
diff --git a/__tests__/__snapshots__/ScrollProvider.test.js.snap b/__tests__/__snapshots__/ScrollProvider.test.js.snap
new file mode 100644
index 000000000..b455d14e7
--- /dev/null
+++ b/__tests__/__snapshots__/ScrollProvider.test.js.snap
@@ -0,0 +1,8 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`A <ScrollProvider> to render children 1`] = `
+<img
+  alt="bar"
+  src="foo"
+/>
+`;
diff --git a/src/components/ScrollProvider.js b/src/components/ScrollProvider.js
new file mode 100644
index 000000000..2e3baecaf
--- /dev/null
+++ b/src/components/ScrollProvider.js
@@ -0,0 +1,42 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import ScrollController from '../libs/ScrollController.js';
+
+export default class ScrollProvider extends Component {
+    static propTypes = {
+        children: PropTypes.node.isRequired,
+    };
+
+    static childContextTypes = {
+        scrollController: PropTypes.object,
+    };
+
+    getChildContext() {
+        // Passes down the reference to the controller
+        const { scrollController } = this;
+        return { scrollController };
+    }
+
+    componentWillMount() {
+        // Don't initialize on the server
+        const hasWindow = typeof window !== 'undefined';
+
+        if (hasWindow) {
+            // Must not be the server so kick it off...
+            this.scrollController = ScrollController.init();
+        }
+    }
+
+    componentWillUnmount() {
+        if (this.scrollController) {
+            // Remove scroll and resize listener if the provider is unmounted
+            this.scrollController.destroy();
+        }
+    }
+
+    render() {
+        const { children } = this.props;
+
+        return children;
+    }
+}
diff --git a/src/libs/ScrollController.js b/src/libs/ScrollController.js
new file mode 100644
index 000000000..7109845f6
--- /dev/null
+++ b/src/libs/ScrollController.js
@@ -0,0 +1,76 @@
+import { testForPassiveScroll } from '../utils/index';
+
+/**
+ * -------------------------------------------------------
+ * Scroll Controller
+ * -------------------------------------------------------
+ *
+ * The scroll controller for setting up window
+ * scroll event and storing the scroll position
+ *
+ */
+
+class ScrollController {
+    constructor() {
+        this._addListeners();
+    }
+
+    static init() {
+        return new ScrollController();
+    }
+
+    // Tracks current scroll y distance
+    state = {
+        scrollY: 0,
+    };
+
+    // Subscriptions to the controller
+    subscriptions = [];
+
+    // Passive support test
+    supportsPassive = testForPassiveScroll();
+
+    // Window scroll handler. Sets the 'scrollY'
+    _handleScroll = () => {
+        // Save current scroll
+        const scrollY = window.pageYOffset; // Supports IE 9 and up.
+
+        this.state = {
+            scrollY,
+        };
+
+        // update subscribers
+        this.subscriptions.forEach(f => f(this.state));
+    };
+
+    _addListeners() {
+        window.addEventListener(
+            'scroll',
+            this._handleScroll,
+            this.supportsPassive ? { passive: true } : false
+        );
+    }
+
+    _removeListeners() {
+        window.removeEventListener(
+            'scroll',
+            this._handleScroll,
+            this.supportsPassive ? { passive: true } : false
+        );
+    }
+
+    destroy() {
+        this._removeListeners();
+    }
+
+    subscribe(f) {
+        this.subscriptions.push(f);
+    }
+
+    unsubscribe(f) {
+        const idx = this.subscriptions.indexOf(f);
+        this.subscriptions = this.subscriptions.splice(idx, 1);
+    }
+}
+
+export default ScrollController;

From 4c1de161714abfe0e222f301792a5a4e436bd4c6 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 13:22:03 -0700
Subject: [PATCH 024/158] remove old parallax components

---
 src/components/Parallax.js         | 102 --------
 src/components/ParallaxProvider.js |  42 ---
 src/libs/ParallaxController.js     | 400 -----------------------------
 3 files changed, 544 deletions(-)
 delete mode 100644 src/components/Parallax.js
 delete mode 100644 src/components/ParallaxProvider.js
 delete mode 100644 src/libs/ParallaxController.js

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
deleted file mode 100644
index 3a563a489..000000000
--- a/src/components/Parallax.js
+++ /dev/null
@@ -1,102 +0,0 @@
-import React, { Component } from 'react';
-import PropTypes from 'prop-types';
-import { offsetMin, offsetMax } from '../utils/propValidation';
-import { ParallaxController } from 'react-scroll-parallax';
-
-export default class Parallax extends Component {
-    static defaultProps = {
-        disabled: false,
-        offsetYMax: 0,
-        offsetYMin: 0,
-        offsetXMax: 0,
-        offsetXMin: 0,
-        slowerScrollRate: false, // determines whether scroll rate is faster or slower than standard scroll
-        tag: 'div',
-    };
-
-    static propTypes = {
-        children: PropTypes.node,
-        className: PropTypes.string,
-        disabled: PropTypes.bool.isRequired,
-        offsetXMax: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
-        offsetXMin: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
-        offsetYMax: offsetMax,
-        offsetYMin: offsetMin,
-        slowerScrollRate: PropTypes.bool.isRequired,
-        tag: PropTypes.string.isRequired,
-    };
-
-    static contextTypes = {
-        parallaxController: PropTypes.object, // not required because this could be rendered on the server.
-    };
-
-    componentDidMount() {
-        // Make sure the provided context is an instance of the controller
-        if (!(this.context.parallaxController instanceof ParallaxController)) {
-            throw new Error(
-                "Must wrap your application's <Parallax /> components in a <ParallaxProvider />."
-            );
-        }
-
-        // create a new parallax element and save the reference
-        this.element = this.context.parallaxController.createElement({
-            elInner: this._inner,
-            elOuter: this._outer,
-            props: {
-                disabled: this.props.disabled,
-                offsetXMax: this.props.offsetXMax,
-                offsetXMin: this.props.offsetXMin,
-                offsetYMax: this.props.offsetYMax,
-                offsetYMin: this.props.offsetYMin,
-                slowerScrollRate: this.props.slowerScrollRate,
-            },
-        });
-    }
-
-    componentWillReceiveProps(nextProps) {
-        // updates the elements props when changed
-        if (this.props !== nextProps) {
-            this.context.parallaxController.updateElement(this.element, {
-                props: {
-                    disabled: nextProps.disabled,
-                    offsetXMax: nextProps.offsetXMax,
-                    offsetXMin: nextProps.offsetXMin,
-                    offsetYMax: nextProps.offsetYMax,
-                    offsetYMin: nextProps.offsetYMin,
-                    slowerScrollRate: nextProps.slowerScrollRate,
-                },
-            });
-        }
-        // resets element styles when disabled
-        if (this.props.disabled !== nextProps.disabled && nextProps.disabled) {
-            this.context.parallaxController.resetElementStyles(this.element);
-        }
-    }
-
-    componentWillUnmount() {
-        this.context.parallaxController.removeElement(this.element);
-    }
-
-    // refs
-    mapRefOuter = ref => {
-        this._outer = ref;
-    };
-
-    mapRefInner = ref => {
-        this._inner = ref;
-    };
-
-    render() {
-        const { children, className, tag: Tag } = this.props;
-
-        const rootClass = 'parallax-outer' + (className ? ` ${className}` : '');
-
-        return (
-            <Tag className={rootClass} ref={this.mapRefOuter}>
-                <div className="parallax-inner" ref={this.mapRefInner}>
-                    {children}
-                </div>
-            </Tag>
-        );
-    }
-}
diff --git a/src/components/ParallaxProvider.js b/src/components/ParallaxProvider.js
deleted file mode 100644
index ad8eac063..000000000
--- a/src/components/ParallaxProvider.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import React, { Component } from 'react';
-import PropTypes from 'prop-types';
-import { ParallaxController } from 'react-scroll-parallax';
-
-export default class ParallaxProvider extends Component {
-    static propTypes = {
-        children: PropTypes.node.isRequired,
-    };
-
-    static childContextTypes = {
-        parallaxController: PropTypes.object,
-    };
-
-    getChildContext() {
-        // Passes down the reference to the controller
-        const { parallaxController } = this;
-        return { parallaxController };
-    }
-
-    componentWillMount() {
-        // Don't initialize on the server
-        const isServer = typeof window === 'undefined';
-
-        if (!isServer) {
-            // Must not be the server so kick it off...
-            this.parallaxController = ParallaxController.init();
-        }
-    }
-
-    componentWillUnmount() {
-        if (this.parallaxController) {
-            // Remove scroll and resize listener if the provider is unmounted
-            this.parallaxController.destroy();
-        }
-    }
-
-    render() {
-        const { children } = this.props;
-
-        return children;
-    }
-}
diff --git a/src/libs/ParallaxController.js b/src/libs/ParallaxController.js
deleted file mode 100644
index 4a087dba0..000000000
--- a/src/libs/ParallaxController.js
+++ /dev/null
@@ -1,400 +0,0 @@
-import {
-    getParallaxOffsets,
-    isElementInView,
-    parseValueAndUnit,
-    testForPassiveScroll,
-} from '../utils/index';
-
-/**
- * -------------------------------------------------------
- * Parallax Controller
- * -------------------------------------------------------
- *
- * The global controller for setting up window scroll/resize
- * listeners, managing and caching parallax element positions,
- * determining which elements are inside the viewport based on
- * scroll position, and then updating parallax element styles
- * based on min/max offsets and current scroll position.
- *
- */
-function ParallaxController() {
-    // All parallax elements to be updated
-    const elements = [];
-
-    // Tracks current scroll y distance
-    let scrollY = 0;
-
-    // Window inner height
-    let windowHeight = 0;
-
-    // ID to increment for elements
-    let id = 0;
-
-    // Ticking
-    let ticking = false;
-
-    // Scroll direction
-    // let scrollDown = null;
-
-    // Passive support
-    const supportsPassive = testForPassiveScroll();
-
-    function _addListeners() {
-        window.addEventListener(
-            'scroll',
-            _handleScroll,
-            supportsPassive ? { passive: true } : false
-        );
-        window.addEventListener('resize', _handleResize, false);
-    }
-
-    function _removeListeners() {
-        window.removeEventListener(
-            'scroll',
-            _handleScroll,
-            supportsPassive ? { passive: true } : false
-        );
-        window.removeEventListener('resize', _handleResize, false);
-    }
-
-    _addListeners();
-
-    /**
-     * Window scroll handler. Sets the 'scrollY'
-     * and then calls '_updateElementPositions()'.
-     */
-    function _handleScroll() {
-        // reference to prev scroll y
-        // const prevScrollY = scrollY;
-
-        // Save current scroll
-        scrollY = window.pageYOffset; // Supports IE 9 and up.
-
-        // direction
-        // scrollDown = scrollY > prevScrollY;
-
-        // Only called if the last animation request has been
-        // completed and there are parallax elements to update
-        if (!ticking && elements.length > 0) {
-            ticking = true;
-            window.requestAnimationFrame(_updateElementPositions);
-        }
-    }
-
-    /**
-     * Window resize handler. Sets the new window inner height
-     * then updates parallax element attributes and positions.
-     */
-    function _handleResize() {
-        _setWindowHeight();
-        _updateElementAttributes();
-        _updateElementPositions();
-    }
-
-    /**
-     * Creates a unique id to distinguish parallax elements.
-     * @return {Number}
-     */
-    function _createID() {
-        ++id;
-        return id;
-    }
-
-    /**
-     * Update element positions.
-     * Determines if the element is in view based on the cached
-     * attributes, if so set the elements parallax styles.
-     */
-    function _updateElementPositions() {
-        elements.forEach(element => {
-            if (element.props.disabled) return;
-
-            // check if the element is in view then
-            const isInView = isElementInView(element, windowHeight, scrollY);
-
-            // set styles if it is
-            if (isInView) _setParallaxStyles(element);
-
-            // reset ticking so more animations can be called
-            ticking = false;
-        });
-    }
-
-    /**
-     * Update element attributes.
-     * Sets up the elements offsets based on the props passed from
-     * the component then caches the elements current position and
-     * other important attributes.
-     */
-    function _updateElementAttributes() {
-        elements.forEach(element => {
-            if (element.props.disabled) return;
-
-            _setupOffsets(element);
-
-            _cacheAttributes(element);
-        });
-    }
-
-    /**
-     * Remove parallax styles from all elements.
-     */
-    function _removeParallaxStyles() {
-        elements.forEach(element => {
-            _resetStyles(element);
-        });
-    }
-
-    /**
-     * Cache the window height.
-     */
-    function _setWindowHeight() {
-        const html = document.documentElement;
-        windowHeight = window.innerHeight || html.clientHeight;
-    }
-
-    /**
-     * Takes a parallax element and caches important values that
-     * cause layout reflow and paints. Stores the values as an
-     * attribute object accesible on the parallax element.
-     * @param {object} element
-     */
-    function _cacheAttributes(element) {
-        const { yMin, yMax, xMax, xMin } = element.offsets;
-
-        const { slowerScrollRate } = element.props;
-
-        // NOTE: Many of these cause layout and reflow so we're not
-        // calculating them on every frame -- instead these values
-        // are cached on the element to access later when determining
-        // the element's position and offset.
-        const el = element.elOuter;
-        const rect = el.getBoundingClientRect();
-        const elHeight = el.offsetHeight;
-        const elWidth = el.offsetWidth;
-        const scrollY = window.pageYOffset;
-
-        // NOTE: offsetYMax and offsetYMin are percents
-        // based of the height of the element. They must be
-        // calculated as px to correctly determine whether
-        // the element is in the viewport.
-        const yPercent = yMax.unit === '%' || yMin.unit === '%';
-        const xPercent = xMax.unit === '%' || xMin.unit === '%';
-
-        // X offsets
-        let yMinPx = yMin.value;
-        let yMaxPx = yMax.value;
-
-        if (yPercent) {
-            const h100 = elHeight / 100;
-            yMaxPx = yMax.value * h100;
-            yMinPx = yMin.value * h100; // negative value
-        }
-
-        // Y offsets
-        let xMinPx = xMax.value;
-        let xMaxPx = xMin.value;
-
-        if (xPercent) {
-            const w100 = elWidth / 100;
-            xMaxPx = xMax.value * w100;
-            xMinPx = xMin.value * w100; // negative value
-        }
-
-        // NOTE: must add the current scroll position when the
-        // element is checked so that we get its absolute position
-        // relative to the document and not the viewport then
-        // add the min/max offsets calculated above.
-        let top = 0;
-        let bottom = 0;
-
-        if (slowerScrollRate) {
-            top = rect.top + scrollY + yMinPx;
-            bottom = rect.bottom + scrollY + yMaxPx;
-        } else {
-            top = rect.top + scrollY + yMaxPx * -1;
-            bottom = rect.bottom + scrollY + yMinPx * -1;
-        }
-
-        // NOTE: Total distance the element will move from when
-        // the top enters the view to the bottom leaving
-        // accounting for elements height and max/min offsets.
-        const totalDist = windowHeight + (elHeight + Math.abs(yMinPx) + yMaxPx);
-
-        element.attributes = {
-            top,
-            bottom,
-            elHeight,
-            elWidth,
-            yMaxPx,
-            yMinPx,
-            xMaxPx,
-            xMinPx,
-            totalDist,
-        };
-    }
-
-    /**
-     * Takes a parallax element and parses the offset props to get the value
-     * and unit. Sets these values as offset object accessible on the element.
-     * @param {object} element
-     */
-    function _setupOffsets(element) {
-        const {
-            offsetYMin,
-            offsetYMax,
-            offsetXMax,
-            offsetXMin,
-        } = element.props;
-
-        const yMin = parseValueAndUnit(offsetYMin);
-        const yMax = parseValueAndUnit(offsetYMax);
-        const xMin = parseValueAndUnit(offsetXMax);
-        const xMax = parseValueAndUnit(offsetXMin);
-
-        if (xMin.unit !== xMax.unit || yMin.unit !== yMax.unit) {
-            throw new Error(
-                'Must provide matching units for the min and max offset values of each axis.'
-            );
-        }
-
-        const xUnit = xMin.unit || '%';
-        const yUnit = yMin.unit || '%';
-
-        element.offsets = {
-            xUnit,
-            yUnit,
-            yMin,
-            yMax,
-            xMin,
-            xMax,
-        };
-    }
-
-    /**
-     * Takes a parallax element and set the styles based on the
-     * offsets and percent the element has moved though the viewport.
-     * @param {object} element
-     */
-    function _setParallaxStyles(element) {
-        const top = element.attributes.top - scrollY;
-        const { totalDist } = element.attributes;
-
-        // Percent the element has moved based on current and total distance to move
-        const percentMoved = (top * -1 + windowHeight) / totalDist * 100;
-
-        // Scale percentMoved to min/max percent determined by offset props
-        const { slowerScrollRate } = element.props;
-
-        // Get the parallax X and Y offsets
-        const offsets = getParallaxOffsets(
-            element.offsets,
-            percentMoved,
-            slowerScrollRate
-        );
-
-        // Apply styles
-        const el = element.elInner;
-        el.style.cssText = `position:relative;
-            transform:translate3d(${offsets.x.value}${offsets.x.unit}, ${offsets.y.value}${offsets.y.unit}, 0)`;
-    }
-
-    /**
-     * Takes a parallax element and removes parallax offset styles.
-     * @param {object} element
-     */
-    function _resetStyles(element) {
-        const el = element.elInner;
-        el.style.cssText = `position:relative;
-            transform:translate3d(0, 0, 0)`;
-    }
-
-    /**
-     * -------------------------------------------------------
-     * Public methods
-     * -------------------------------------------------------
-     */
-
-    /**
-     * Creates a new parallax element object with new id
-     * and options to store in the 'elements' array.
-     * @param {object} options
-     * @return {object} element
-     */
-    this.createElement = function(options) {
-        const id = _createID();
-        const element = {
-            id,
-            ...options,
-        };
-
-        elements.push(element);
-        this.update();
-
-        return element;
-    };
-
-    /**
-     * Creates a new parallax element object with new id
-     * and options to store in the 'elements' array.
-     * @param {object} element
-     */
-    this.removeElement = function(element) {
-        const index = elements.indexOf(element);
-        if (index !== -1) {
-            elements.splice(index, 1);
-        }
-    };
-
-    /**
-     * Updates an existing parallax element object with new options.
-     * @param {object} element
-     * @param {object} options
-     */
-    this.updateElement = function(element, options) {
-        // gets the index of the element to update based on id
-        const index = elements.findIndex(el => el.id === element.id);
-
-        // create new element with options and replaces the old
-        elements[index] = Object.assign({}, elements[index], options);
-
-        // call update to set attributes and positions based on the new options
-        this.update();
-    };
-
-    /**
-     * Remove element styles.
-     * @param {object} element
-     */
-    this.resetElementStyles = function(element) {
-        _resetStyles(element);
-    };
-
-    /**
-     * Updates all parallax element attributes and postitions.
-     */
-    this.update = function() {
-        _setWindowHeight();
-        _updateElementAttributes();
-        _updateElementPositions();
-    };
-
-    /**
-     * Removes listeners, reset all styles then nullifies the global ParallaxController.
-     */
-    this.destroy = function() {
-        _removeListeners();
-        _removeParallaxStyles();
-    };
-}
-
-/**
- * Static method to instantiate the ParallaxController.
- * Returns a new instance of the ParallaxController.
- * @returns {Object} ParallaxController
- */
-ParallaxController.init = function() {
-    return new ParallaxController();
-};
-
-export default ParallaxController;

From 8dcf5dea3dd22dde84bc003289ac605e265722a0 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 13:22:30 -0700
Subject: [PATCH 025/158] update exports in index

---
 src/index.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/index.js b/src/index.js
index 584182883..2e9d3664d 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,3 +1,3 @@
-export Parallax from './components/Parallax';
-export ParallaxProvider from './components/ParallaxProvider';
-export ParallaxController from './libs/ParallaxController';
+export ScrollPosition from './components/ScrollPosition';
+export ScrollProvider from './components/ScrollProvider';
+export ScrollController from './libs/ScrollController';

From 1794cc49fd7efd56030434aec53aa109cd114460 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 13:50:10 -0700
Subject: [PATCH 026/158] add `withScrollPosition` higher order component and
 test

---
 __tests__/withScrollPosition.test.js | 33 +++++++++++++++++++
 src/hoc/withScrollPosition.js        | 49 ++++++++++++++++++++++++++++
 src/index.js                         |  1 +
 3 files changed, 83 insertions(+)
 create mode 100644 __tests__/withScrollPosition.test.js
 create mode 100644 src/hoc/withScrollPosition.js

diff --git a/__tests__/withScrollPosition.test.js b/__tests__/withScrollPosition.test.js
new file mode 100644
index 000000000..7ee0fb2a6
--- /dev/null
+++ b/__tests__/withScrollPosition.test.js
@@ -0,0 +1,33 @@
+/* global describe, it */
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import ReactDOM from 'react-dom';
+import { ScrollProvider, withScrollPosition } from 'index';
+
+describe('withScrollPosition() higher order component', () => {
+    it('provides a `scrollY` prop to a wrapped component', () => {
+        const node = document.createElement('div');
+
+        let testProps;
+
+        const ScrollPosition = withScrollPosition(props => {
+            testProps = props;
+            return null;
+        });
+
+        ScrollPosition.propTypes = {
+            scrollY: PropTypes.number, // isRequired is warning, not sure why.
+        };
+
+        ReactDOM.render(
+            <ScrollProvider>
+                <ScrollPosition />
+            </ScrollProvider>,
+            node
+        );
+
+        // Expected initial value
+        expect(testProps.scrollY).toBe(0);
+    });
+});
diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
new file mode 100644
index 000000000..a552d7a7a
--- /dev/null
+++ b/src/hoc/withScrollPosition.js
@@ -0,0 +1,49 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { ScrollController } from '../index.js';
+
+export default function withScrollPosition(WrappedComponent) {
+    return class WithScroll extends Component {
+        static contextTypes = {
+            scrollController: PropTypes.object, // not required because this could be rendered on the server.
+        };
+
+        constructor(props, context) {
+            super();
+            const { scrollY } = context.scrollController.state;
+            this.state = {
+                scrollY,
+            };
+        }
+
+        componentWillMount() {
+            const { scrollController } = this.context;
+            // Make sure the provided context is an instance of the controller
+            if (!(scrollController instanceof ScrollController)) {
+                throw new Error(
+                    "Must wrap your application's <ScrollPosition /> components in a <ScrollProvider />."
+                );
+            }
+
+            // @TODO: Subscribe to scroll updates
+            scrollController.subscribe(this.updateScroll);
+        }
+
+        componentWillUnmount() {
+            const { scrollController } = this.context;
+            // @TODO: Implement and test
+            scrollController.unsubscribe();
+        }
+
+        updateScroll = ({ scrollY }) => {
+            this.setState(() => ({
+                scrollY,
+            }));
+        };
+
+        render() {
+            const { scrollY } = this.state;
+            return <WrappedComponent scrollY={scrollY} />;
+        }
+    };
+}
diff --git a/src/index.js b/src/index.js
index 2e9d3664d..2fdf45a0a 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,3 +1,4 @@
 export ScrollPosition from './components/ScrollPosition';
 export ScrollProvider from './components/ScrollProvider';
 export ScrollController from './libs/ScrollController';
+export withScrollPosition from './hoc/withScrollPosition.js';

From fb538e792ae856fa23532898f840241ecd30e8d6 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 13:50:31 -0700
Subject: [PATCH 027/158] cleanup ScrollProvider test

---
 __tests__/ScrollProvider.test.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/__tests__/ScrollProvider.test.js b/__tests__/ScrollProvider.test.js
index 1eb7da2c3..13aea9327 100644
--- a/__tests__/ScrollProvider.test.js
+++ b/__tests__/ScrollProvider.test.js
@@ -3,7 +3,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ReactDOM from 'react-dom';
-import { ScrollProvider, ScrollPosition, ScrollController } from 'index';
+import { ScrollProvider, ScrollController } from 'index';
 import renderer from 'react-test-renderer';
 
 describe('A <ScrollProvider>', () => {
@@ -13,7 +13,7 @@ describe('A <ScrollProvider>', () => {
                 <img src="foo" alt="bar" />
             </ScrollProvider>
         );
-        let tree = component.toJSON();
+        const tree = component.toJSON();
         expect(tree).toMatchSnapshot();
     });
 

From 84ae016124eaa210a59bad5d8007a354e870bf75 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 14:58:19 -0700
Subject: [PATCH 028/158] fix usubscribe method

---
 src/libs/ScrollController.js | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/libs/ScrollController.js b/src/libs/ScrollController.js
index 7109845f6..f718132bc 100644
--- a/src/libs/ScrollController.js
+++ b/src/libs/ScrollController.js
@@ -68,8 +68,7 @@ class ScrollController {
     }
 
     unsubscribe(f) {
-        const idx = this.subscriptions.indexOf(f);
-        this.subscriptions = this.subscriptions.splice(idx, 1);
+        this.subscriptions = this.subscriptions.filter(x => f !== x);
     }
 }
 

From 335220c3f84c7414ac4a0edea722d3f3ef939d67 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 14:58:44 -0700
Subject: [PATCH 029/158] pass handler to usubscribe

---
 src/hoc/withScrollPosition.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
index a552d7a7a..392b46b0d 100644
--- a/src/hoc/withScrollPosition.js
+++ b/src/hoc/withScrollPosition.js
@@ -32,7 +32,7 @@ export default function withScrollPosition(WrappedComponent) {
         componentWillUnmount() {
             const { scrollController } = this.context;
             // @TODO: Implement and test
-            scrollController.unsubscribe();
+            scrollController.unsubscribe(this.updateScroll);
         }
 
         updateScroll = ({ scrollY }) => {

From b00460ae11f9f8d25c4880860074f0b75f10aa39 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 14:59:13 -0700
Subject: [PATCH 030/158] remove ScrollPosition from src

---
 src/index.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/index.js b/src/index.js
index 2fdf45a0a..f18946e9a 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,4 +1,3 @@
-export ScrollPosition from './components/ScrollPosition';
 export ScrollProvider from './components/ScrollProvider';
 export ScrollController from './libs/ScrollController';
 export withScrollPosition from './hoc/withScrollPosition.js';

From a3d5ef6dd8a8b4f5722bde82fccb7b89b96cc3cc Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 26 Aug 2017 17:55:42 -0700
Subject: [PATCH 031/158] fix ssr errors in `withScrollParallax`

---
 src/hoc/withScrollPosition.js | 38 ++++++++++++++++++++++++++---------
 1 file changed, 28 insertions(+), 10 deletions(-)

diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
index 392b46b0d..2057a9992 100644
--- a/src/hoc/withScrollPosition.js
+++ b/src/hoc/withScrollPosition.js
@@ -9,29 +9,47 @@ export default function withScrollPosition(WrappedComponent) {
         };
 
         constructor(props, context) {
-            super();
-            const { scrollY } = context.scrollController.state;
-            this.state = {
-                scrollY,
-            };
+            super(props, context);
+
+            // So that we can render on the server without prop errors
+            const hasWindow = typeof window !== 'undefined';
+
+            if (hasWindow) {
+                const { scrollY } = context.scrollController.state;
+                this.state = {
+                    scrollY,
+                };
+            } else {
+                this.state = {
+                    scrollY: 0, // value for server so no required props throw
+                };
+            }
         }
 
         componentWillMount() {
             const { scrollController } = this.context;
+
+            // Make sure this is server safe
+            const hasWindow = typeof window !== 'undefined';
+
             // Make sure the provided context is an instance of the controller
-            if (!(scrollController instanceof ScrollController)) {
+            const hasController = scrollController instanceof ScrollController;
+
+            // if this has the window and no controller throw an error
+            if (hasWindow && !hasController) {
                 throw new Error(
-                    "Must wrap your application's <ScrollPosition /> components in a <ScrollProvider />."
+                    "No scrollController exist in context. Must wrap your application's [[ parallax ]] components in a <ScrollProvider />."
                 );
             }
 
-            // @TODO: Subscribe to scroll updates
-            scrollController.subscribe(this.updateScroll);
+            // Subscribe to scroll updates by passing a handler to setState of current scroll
+            if (hasWindow) scrollController.subscribe(this.updateScroll);
         }
 
         componentWillUnmount() {
             const { scrollController } = this.context;
-            // @TODO: Implement and test
+
+            // Unsubscribe to scroll updates by passing the subscribed scroll handler
             scrollController.unsubscribe(this.updateScroll);
         }
 

From 85c617e3ee02cd0a4c41108db1fd3c8669ead3f9 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 27 Aug 2017 11:47:05 -0700
Subject: [PATCH 032/158] add `withObserver` hoc for determing element
 visibilty

---
 src/hoc/withObserver.js | 57 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 src/hoc/withObserver.js

diff --git a/src/hoc/withObserver.js b/src/hoc/withObserver.js
new file mode 100644
index 000000000..6481559a9
--- /dev/null
+++ b/src/hoc/withObserver.js
@@ -0,0 +1,57 @@
+import React, { PureComponent } from 'react';
+
+// With Observer creates a new IntersectionObserver
+// that passes an `isInView` prop to wrapped components
+// IntersectionObserver will require a polyfill
+
+export default function withObserver(
+    WrappedComponent,
+    options = {
+        root: null, // document.querySelector('#scrollArea')
+        rootMargin: '0px',
+        threshold: [0.1, 1.0], // 1.0 = 100% of the el is visible, can be an array of values. callback is invoke when each is true
+    }
+) {
+    return class Observed extends PureComponent {
+        state = {
+            isInView: null,
+        };
+
+        componentDidMount() {
+            this.createObserver();
+            this.observe();
+        }
+
+        createObserver() {
+            this.observer = new IntersectionObserver(
+                this.handleIntersection,
+                options
+            );
+        }
+
+        observe() {
+            this.observer.observe(this.el);
+        }
+
+        handleIntersection = (entries, observer) => {
+            entries.forEach(entry => {
+                const isInView = entry.intersectionRatio > 0;
+
+                this.setState(() => ({ isInView }));
+            });
+        };
+
+        mapRef = ref => {
+            this.el = ref;
+        };
+
+        render() {
+            const { isInView } = this.state;
+            return (
+                <div ref={this.mapRef}>
+                    <WrappedComponent isInView={isInView} {...this.props} />
+                </div>
+            );
+        }
+    };
+}

From 84a6172e8b59bc5b46df2dd5e0afc23d27c1ed35 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 27 Aug 2017 11:48:07 -0700
Subject: [PATCH 033/158] update `withScrollPosition` hoc to only update state
 when the `isInView` prop is true

---
 src/hoc/withScrollPosition.js | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
index 2057a9992..f1c9f6e92 100644
--- a/src/hoc/withScrollPosition.js
+++ b/src/hoc/withScrollPosition.js
@@ -1,13 +1,17 @@
-import React, { Component } from 'react';
+import React, { PureComponent } from 'react';
 import PropTypes from 'prop-types';
 import { ScrollController } from '../index.js';
 
 export default function withScrollPosition(WrappedComponent) {
-    return class WithScroll extends Component {
+    return class WithScroll extends PureComponent {
         static contextTypes = {
             scrollController: PropTypes.object, // not required because this could be rendered on the server.
         };
 
+        static propTypes = {
+            isInView: PropTypes.bool,
+        };
+
         constructor(props, context) {
             super(props, context);
 
@@ -54,14 +58,19 @@ export default function withScrollPosition(WrappedComponent) {
         }
 
         updateScroll = ({ scrollY }) => {
-            this.setState(() => ({
-                scrollY,
-            }));
+            const { isInView } = this.props;
+
+            // only updates the scrollY when the element is in view
+            if (isInView) {
+                this.setState(() => ({
+                    scrollY,
+                }));
+            }
         };
 
         render() {
             const { scrollY } = this.state;
-            return <WrappedComponent scrollY={scrollY} />;
+            return <WrappedComponent scrollY={scrollY} {...this.props} />;
         }
     };
 }

From fc36c66bd103ff80052c1faf0a12172804aa271a Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 27 Aug 2017 14:02:19 -0700
Subject: [PATCH 034/158] disconnect the observer on unmount

---
 src/hoc/withObserver.js | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/hoc/withObserver.js b/src/hoc/withObserver.js
index 6481559a9..6610991ce 100644
--- a/src/hoc/withObserver.js
+++ b/src/hoc/withObserver.js
@@ -22,6 +22,10 @@ export default function withObserver(
             this.observe();
         }
 
+        componentWillUnmount() {
+            this.disconnectObserver();
+        }
+
         createObserver() {
             this.observer = new IntersectionObserver(
                 this.handleIntersection,
@@ -29,6 +33,10 @@ export default function withObserver(
             );
         }
 
+        disconnectObserver() {
+            this.observer.disconnect();
+        }
+
         observe() {
             this.observer.observe(this.el);
         }

From 155804a0a2177f021bf8a6b17a1879387673b4de Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 27 Aug 2017 14:02:41 -0700
Subject: [PATCH 035/158] export `withObserver` from src index

---
 src/index.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/index.js b/src/index.js
index f18946e9a..a727ea7e1 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,3 +1,4 @@
 export ScrollProvider from './components/ScrollProvider';
 export ScrollController from './libs/ScrollController';
 export withScrollPosition from './hoc/withScrollPosition.js';
+export withObserver from './hoc/withObserver.js';

From 397002581165628333b08d3113b81fa0dd99eea3 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 27 Aug 2017 17:27:50 -0700
Subject: [PATCH 036/158] rename `libs` to `models`

---
 src/components/ScrollProvider.js         | 2 +-
 src/index.js                             | 2 +-
 src/{libs => models}/ScrollController.js | 5 +++++
 3 files changed, 7 insertions(+), 2 deletions(-)
 rename src/{libs => models}/ScrollController.js (92%)

diff --git a/src/components/ScrollProvider.js b/src/components/ScrollProvider.js
index 2e3baecaf..e44b56ec6 100644
--- a/src/components/ScrollProvider.js
+++ b/src/components/ScrollProvider.js
@@ -1,6 +1,6 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-import ScrollController from '../libs/ScrollController.js';
+import { ScrollController } from '../index.js';
 
 export default class ScrollProvider extends Component {
     static propTypes = {
diff --git a/src/index.js b/src/index.js
index a727ea7e1..cb1c57b7d 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,4 +1,4 @@
 export ScrollProvider from './components/ScrollProvider';
-export ScrollController from './libs/ScrollController';
+export ScrollController from './models/ScrollController';
 export withScrollPosition from './hoc/withScrollPosition.js';
 export withObserver from './hoc/withObserver.js';
diff --git a/src/libs/ScrollController.js b/src/models/ScrollController.js
similarity index 92%
rename from src/libs/ScrollController.js
rename to src/models/ScrollController.js
index f718132bc..76bf7f389 100644
--- a/src/libs/ScrollController.js
+++ b/src/models/ScrollController.js
@@ -40,6 +40,11 @@ class ScrollController {
         };
 
         // update subscribers
+        // window.requestAnimationFrame(this._updateSubscribers);
+        this._updateSubscribers();
+    };
+
+    _updateSubscribers = () => {
         this.subscriptions.forEach(f => f(this.state));
     };
 

From 988de90b067be752aefcf87ec87c588031aedc8c Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 29 Aug 2017 23:38:31 -0700
Subject: [PATCH 037/158] fix module alias resolving in jest with
 `babel-plugin-module-resolver`

---
 .babelrc                             | 21 +++++++++++++++------
 __tests__/ScrollProvider.test.js     |  2 +-
 __tests__/withScrollPosition.test.js |  2 +-
 package.json                         |  1 +
 src/components/ScrollProvider.js     |  2 +-
 src/components/index.js              |  3 +++
 src/hoc/withScrollPosition.js        |  4 ++--
 src/index.js                         | 11 +++++++++--
 8 files changed, 33 insertions(+), 13 deletions(-)
 create mode 100644 src/components/index.js

diff --git a/.babelrc b/.babelrc
index 20bbed7c2..31073c3c5 100644
--- a/.babelrc
+++ b/.babelrc
@@ -1,7 +1,16 @@
 {
-	"env": {
-	    "test": {
-			"presets": [ "es2015", "react", "stage-0" ]
-		}
-	}
-}
\ No newline at end of file
+    "env": {
+        "test": {
+            "presets": ["es2015", "react", "stage-0"],
+            "plugins": [
+                [
+                    "module-resolver", {
+                        "alias": {
+                            "react-scroll-parallax": "./src",
+                        },
+                    },
+                ],
+            ],
+        }
+    },
+}
diff --git a/__tests__/ScrollProvider.test.js b/__tests__/ScrollProvider.test.js
index 13aea9327..273744f9b 100644
--- a/__tests__/ScrollProvider.test.js
+++ b/__tests__/ScrollProvider.test.js
@@ -3,7 +3,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ReactDOM from 'react-dom';
-import { ScrollProvider, ScrollController } from 'index';
+import { ScrollProvider, ScrollController } from 'react-scroll-parallax';
 import renderer from 'react-test-renderer';
 
 describe('A <ScrollProvider>', () => {
diff --git a/__tests__/withScrollPosition.test.js b/__tests__/withScrollPosition.test.js
index 7ee0fb2a6..e8eed3ef5 100644
--- a/__tests__/withScrollPosition.test.js
+++ b/__tests__/withScrollPosition.test.js
@@ -3,7 +3,7 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ReactDOM from 'react-dom';
-import { ScrollProvider, withScrollPosition } from 'index';
+import { ScrollProvider, withScrollPosition } from 'react-scroll-parallax';
 
 describe('withScrollPosition() higher order component', () => {
     it('provides a `scrollY` prop to a wrapped component', () => {
diff --git a/package.json b/package.json
index 40a6eb197..a33c28622 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,7 @@
     "babel-jest": "^20.0.3",
     "babel-loader": "^6.3.2",
     "babel-plugin-add-module-exports": "^0.2.1",
+    "babel-plugin-module-resolver": "^2.7.1",
     "babel-preset-env": "^1.1.8",
     "babel-preset-es2015": "^6.24.1",
     "babel-preset-react": "^6.23.0",
diff --git a/src/components/ScrollProvider.js b/src/components/ScrollProvider.js
index e44b56ec6..518f8f324 100644
--- a/src/components/ScrollProvider.js
+++ b/src/components/ScrollProvider.js
@@ -1,6 +1,6 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-import { ScrollController } from '../index.js';
+import { ScrollController } from 'react-scroll-parallax';
 
 export default class ScrollProvider extends Component {
     static propTypes = {
diff --git a/src/components/index.js b/src/components/index.js
new file mode 100644
index 000000000..363793b4c
--- /dev/null
+++ b/src/components/index.js
@@ -0,0 +1,3 @@
+// Components
+export ScrollProvider from './ScrollProvider.js';
+export Translate from './Translate.js';
diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
index f1c9f6e92..1e1ed718c 100644
--- a/src/hoc/withScrollPosition.js
+++ b/src/hoc/withScrollPosition.js
@@ -1,9 +1,9 @@
 import React, { PureComponent } from 'react';
 import PropTypes from 'prop-types';
-import { ScrollController } from '../index.js';
+import { ScrollController } from 'react-scroll-parallax';
 
 export default function withScrollPosition(WrappedComponent) {
-    return class WithScroll extends PureComponent {
+    return class ScrollPosition extends PureComponent {
         static contextTypes = {
             scrollController: PropTypes.object, // not required because this could be rendered on the server.
         };
diff --git a/src/index.js b/src/index.js
index cb1c57b7d..fde3c26b9 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,4 +1,11 @@
-export ScrollProvider from './components/ScrollProvider';
-export ScrollController from './models/ScrollController';
+// Components
+export ScrollProvider from './components/ScrollProvider.js';
+export Translate from './components/Translate.js';
+
+// Models
+export ScrollController from './models/ScrollController.js';
+
+// HOC
 export withScrollPosition from './hoc/withScrollPosition.js';
+export withViewportPosition from './hoc/withViewportPosition.js';
 export withObserver from './hoc/withObserver.js';

From 3f1721652035d12ce47e386a02410e40385a487a Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 30 Aug 2017 00:19:03 -0700
Subject: [PATCH 038/158] add `withViewportProgress` hoc

---
 src/hoc/index.js                |   4 ++
 src/hoc/withViewportProgress.js | 117 ++++++++++++++++++++++++++++++++
 src/index.js                    |   2 +-
 3 files changed, 122 insertions(+), 1 deletion(-)
 create mode 100644 src/hoc/index.js
 create mode 100644 src/hoc/withViewportProgress.js

diff --git a/src/hoc/index.js b/src/hoc/index.js
new file mode 100644
index 000000000..37ac69a20
--- /dev/null
+++ b/src/hoc/index.js
@@ -0,0 +1,4 @@
+// HOC
+export withScrollPosition from './withScrollPosition.js';
+export withViewportProgress from './withViewportProgress.js';
+export withObserver from './withObserver.js';
diff --git a/src/hoc/withViewportProgress.js b/src/hoc/withViewportProgress.js
new file mode 100644
index 000000000..9a473c67e
--- /dev/null
+++ b/src/hoc/withViewportProgress.js
@@ -0,0 +1,117 @@
+import React, { PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import clamp from '../utils/clamp';
+
+// With Viewport Progress passes the progress prop
+// to wrapped components with a value ranging from
+// 0–1. 0 if the element has not entered the beggining
+// of the scroll area, 1 if the element has left.
+
+export default function withViewportProgress(WrappedComponent, range = [0, 1]) {
+    return class ViewportProgress extends PureComponent {
+        static propTypes = {
+            scrollY: PropTypes.number.isRequired,
+        };
+
+        state = {
+            progress: range[0],
+            window: false,
+        };
+
+        componentDidMount() {
+            this.setAttributeCache();
+            this.addListeners();
+        }
+
+        componentWillUnmount() {}
+
+        componentWillReceiveProps(nextProps) {
+            // if the scroll has changed, and the
+            // element is in view start updating state
+            // console.log(nextProps.scrollY);
+            if (
+                nextProps.isInView &&
+                nextProps.scrollY !== this.props.scrollY
+            ) {
+                this.setProgress();
+            }
+        }
+
+        addListeners() {
+            window.addEventListener('resize', this.setAttributeCache, false);
+        }
+
+        removeListeners() {
+            window.removeEventListener('resize', this.setAttributeCache, false);
+        }
+
+        setAttributeCache = () => {
+            // cache layout thrashers
+            // @TODO: update on resize
+
+            // Accesing the ref of the wrapped component
+            const el = this.wrapped.innerRef;
+
+            const _rect = el.getBoundingClientRect();
+            const elHeight = el.offsetHeight;
+            const elWidth = el.offsetWidth;
+            const scrollY = window.pageYOffset;
+            const html = document.documentElement;
+            const windowHeight = window.innerHeight || html.clientHeight;
+            const totalDist = windowHeight + elHeight;
+
+            // add current scroll state
+            const rect = {
+                top: _rect.top + scrollY,
+                bottom: _rect.bottom + scrollY,
+                left: _rect.left,
+                right: _rect.right,
+            };
+
+            this.cache = {
+                rect,
+                elHeight,
+                elWidth,
+                scrollY,
+                windowHeight,
+                totalDist,
+            };
+        };
+
+        setProgress() {
+            const currentScroll = window.pageYOffset;
+            const top = this.cache.rect.top - currentScroll; // this was the cached value so subtract the current scroll
+            const { totalDist, windowHeight } = this.cache;
+
+            // Percent the element has moved based on current and total distance to move
+            const movedValue = 1 - (windowHeight - top) / totalDist;
+
+            // clamp
+            // Why? I think because the isInView prop is *slightly*
+            // off since the observer is from 0.1 - 1.0. Shouldn't
+            // expect the Intersection Observer to be pixel-perfect
+            // accurate regardless.
+            const progress = clamp(movedValue, 0, 1);
+            // console.log(progress);
+
+            this.setState(() => ({
+                progress,
+            }));
+        }
+
+        mapRef = ref => {
+            this.wrapped = ref;
+        };
+
+        render() {
+            const { progress } = this.state;
+            return (
+                <WrappedComponent
+                    progress={progress}
+                    ref={this.mapRef}
+                    {...this.props}
+                />
+            );
+        }
+    };
+}
diff --git a/src/index.js b/src/index.js
index fde3c26b9..7371b0a42 100644
--- a/src/index.js
+++ b/src/index.js
@@ -7,5 +7,5 @@ export ScrollController from './models/ScrollController.js';
 
 // HOC
 export withScrollPosition from './hoc/withScrollPosition.js';
-export withViewportPosition from './hoc/withViewportPosition.js';
+export withViewportProgress from './hoc/withViewportProgress.js';
 export withObserver from './hoc/withObserver.js';

From 524dd6c997d1285cabc45ad113a5dfae0c4fdb29 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 2 Sep 2017 17:03:01 -0700
Subject: [PATCH 039/158] add a `compose` utility

---
 src/utils/compose.js | 3 +++
 src/utils/index.js   | 1 +
 2 files changed, 4 insertions(+)
 create mode 100644 src/utils/compose.js

diff --git a/src/utils/compose.js b/src/utils/compose.js
new file mode 100644
index 000000000..ec1b0d819
--- /dev/null
+++ b/src/utils/compose.js
@@ -0,0 +1,3 @@
+export default function compose(...funcs) {
+    return funcs.reduce((a, b) => (...args) => a(b(...args)));
+}
diff --git a/src/utils/index.js b/src/utils/index.js
index 94cdb2321..e54fa4691 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -1,4 +1,5 @@
 export clamp from './clamp';
+export compose from './compose';
 export getParallaxOffsets from './getParallaxOffsets';
 export isElementInView from './isElementInView';
 export parseValueAndUnit from './parseValueAndUnit';

From db127593b1065b4b12f4b15371d4341bcb29a413 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 15:41:06 -0700
Subject: [PATCH 040/158] remove initial state from context in
 withScrollPosition

---
 src/hoc/withScrollPosition.js | 33 +++++++++++++++------------------
 1 file changed, 15 insertions(+), 18 deletions(-)

diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
index 1e1ed718c..9c69595a9 100644
--- a/src/hoc/withScrollPosition.js
+++ b/src/hoc/withScrollPosition.js
@@ -2,7 +2,16 @@ import React, { PureComponent } from 'react';
 import PropTypes from 'prop-types';
 import { ScrollController } from 'react-scroll-parallax';
 
-export default function withScrollPosition(WrappedComponent) {
+// This HOC serves to connect a component via context
+// to the ScrollController which provides the current
+// scroll state that is then passed as props to the
+// <WrappedComponent />.
+
+// NOTE: Since the scroll state should only be updated when
+// the element is in view, this HOC should be composed
+// within a withObserver() HOC.
+
+function withScrollPosition(WrappedComponent) {
     return class ScrollPosition extends PureComponent {
         static contextTypes = {
             scrollController: PropTypes.object, // not required because this could be rendered on the server.
@@ -12,23 +21,9 @@ export default function withScrollPosition(WrappedComponent) {
             isInView: PropTypes.bool,
         };
 
-        constructor(props, context) {
-            super(props, context);
-
-            // So that we can render on the server without prop errors
-            const hasWindow = typeof window !== 'undefined';
-
-            if (hasWindow) {
-                const { scrollY } = context.scrollController.state;
-                this.state = {
-                    scrollY,
-                };
-            } else {
-                this.state = {
-                    scrollY: 0, // value for server so no required props throw
-                };
-            }
-        }
+        state = {
+            scrollY: 0, // value for server so no required props throw
+        };
 
         componentWillMount() {
             const { scrollController } = this.context;
@@ -74,3 +69,5 @@ export default function withScrollPosition(WrappedComponent) {
         }
     };
 }
+
+export default withScrollPosition;

From c4f74fe53198bd94f343870f27a6f972a990a99b Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 15:42:32 -0700
Subject: [PATCH 041/158] update on resize and use `getRef` prop for the the
 withViewportProgress hoc

---
 src/hoc/withViewportProgress.js | 67 ++++++++++++++++++---------------
 1 file changed, 36 insertions(+), 31 deletions(-)

diff --git a/src/hoc/withViewportProgress.js b/src/hoc/withViewportProgress.js
index 9a473c67e..b3d85d1d6 100644
--- a/src/hoc/withViewportProgress.js
+++ b/src/hoc/withViewportProgress.js
@@ -4,18 +4,20 @@ import clamp from '../utils/clamp';
 
 // With Viewport Progress passes the progress prop
 // to wrapped components with a value ranging from
-// 0–1. 0 if the element has not entered the beggining
-// of the scroll area, 1 if the element has left.
+// 0–1. 0 if the elements bounds has not entered
+// the beginning of the scroll area, 1 if the
+// element has left.
 
-export default function withViewportProgress(WrappedComponent, range = [0, 1]) {
+function withViewportProgress(WrappedComponent, range = [0, 1]) {
     return class ViewportProgress extends PureComponent {
         static propTypes = {
+            getRef: PropTypes.func.isRequired,
             scrollY: PropTypes.number.isRequired,
         };
 
         state = {
             progress: range[0],
-            window: false,
+            resizeKey: null, // a key to trigger a state change when the window resizes
         };
 
         componentDidMount() {
@@ -23,7 +25,9 @@ export default function withViewportProgress(WrappedComponent, range = [0, 1]) {
             this.addListeners();
         }
 
-        componentWillUnmount() {}
+        componentWillUnmount() {
+            this.removeListeners();
+        }
 
         componentWillReceiveProps(nextProps) {
             // if the scroll has changed, and the
@@ -38,19 +42,29 @@ export default function withViewportProgress(WrappedComponent, range = [0, 1]) {
         }
 
         addListeners() {
-            window.addEventListener('resize', this.setAttributeCache, false);
+            window.addEventListener('resize', this.handleResize, false);
         }
 
         removeListeners() {
-            window.removeEventListener('resize', this.setAttributeCache, false);
+            window.removeEventListener('resize', this.handleResize, false);
         }
 
-        setAttributeCache = () => {
-            // cache layout thrashers
-            // @TODO: update on resize
+        handleResize = () => {
+            const resizeKey = `resize-${window.innerWidth}`;
+
+            this.setState(
+                () => ({
+                    resizeKey,
+                }),
+                this.setAttributeCache // update cached attributes
+            );
+        };
+
+        setAttributeCache() {
+            // This caches properties that cause layout thrash
 
-            // Accesing the ref of the wrapped component
-            const el = this.wrapped.innerRef;
+            // Accessing the ref of the wrapped component
+            const el = this.props.getRef();
 
             const _rect = el.getBoundingClientRect();
             const elHeight = el.offsetHeight;
@@ -76,7 +90,7 @@ export default function withViewportProgress(WrappedComponent, range = [0, 1]) {
                 windowHeight,
                 totalDist,
             };
-        };
+        }
 
         setProgress() {
             const currentScroll = window.pageYOffset;
@@ -84,34 +98,25 @@ export default function withViewportProgress(WrappedComponent, range = [0, 1]) {
             const { totalDist, windowHeight } = this.cache;
 
             // Percent the element has moved based on current and total distance to move
-            const movedValue = 1 - (windowHeight - top) / totalDist;
+            let progress = 1 - (windowHeight - top) / totalDist;
 
-            // clamp
-            // Why? I think because the isInView prop is *slightly*
-            // off since the observer is from 0.1 - 1.0. Shouldn't
-            // expect the Intersection Observer to be pixel-perfect
+            // NOTE: Clamping
+            // Why? Because the isInView prop may be *slightly*
+            // off since Intersection Observer to be pixel-perfect
             // accurate regardless.
-            const progress = clamp(movedValue, 0, 1);
-            // console.log(progress);
+
+            progress = clamp(progress, 0, 1);
 
             this.setState(() => ({
                 progress,
             }));
         }
 
-        mapRef = ref => {
-            this.wrapped = ref;
-        };
-
         render() {
             const { progress } = this.state;
-            return (
-                <WrappedComponent
-                    progress={progress}
-                    ref={this.mapRef}
-                    {...this.props}
-                />
-            );
+            return <WrappedComponent progress={progress} {...this.props} />;
         }
     };
 }
+
+export default withViewportProgress;

From fa7bdecadcaf3e4dd5b65ecfa37b902d5e31f9c4 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 15:43:46 -0700
Subject: [PATCH 042/158] add `withBounds` hoc to calculate bounds of parallax
 elements and pass the getRef function to wrapped components

---
 src/hoc/index.js      |  1 +
 src/hoc/withBounds.js | 94 +++++++++++++++++++++++++++++++++++++++++++
 src/index.js          |  1 +
 3 files changed, 96 insertions(+)
 create mode 100644 src/hoc/withBounds.js

diff --git a/src/hoc/index.js b/src/hoc/index.js
index 37ac69a20..c8321dae9 100644
--- a/src/hoc/index.js
+++ b/src/hoc/index.js
@@ -2,3 +2,4 @@
 export withScrollPosition from './withScrollPosition.js';
 export withViewportProgress from './withViewportProgress.js';
 export withObserver from './withObserver.js';
+export withBounds from './withBounds.js';
diff --git a/src/hoc/withBounds.js b/src/hoc/withBounds.js
new file mode 100644
index 000000000..3fa5174f7
--- /dev/null
+++ b/src/hoc/withBounds.js
@@ -0,0 +1,94 @@
+import React, { PureComponent } from 'react';
+import PropTypes from 'prop-types';
+
+// The with bounds HOC wraps a component
+// and provides the bounds to be observed
+// based upon the [x, y] translations
+
+// @TODO: Hopefully this can also account
+// for future props past to parallax element
+// like scale and rotation. Not going to handle
+// z because that requires knowing the perspective
+// and would be difficult to calculate
+
+function withBounds(WrappedComponent) {
+    return class Bounds extends PureComponent {
+        static propTypes = {
+            className: PropTypes.string,
+            x: PropTypes.array,
+            y: PropTypes.array,
+        };
+
+        mapRef = ref => {
+            this.el = ref;
+        };
+
+        getRef = () => {
+            // NOTE: this ref is required so that
+            // the withViewportProgress() HOC and the
+            // withObserver() HOC can access the DOM
+            // element. It's not used within this class.
+            return this.el;
+        };
+
+        getBounds() {
+            const { x, y } = this.props;
+
+            const position = 'absolute';
+            const visibility = 'hidden';
+            const border = '1px dotted tomato';
+
+            let top = 0;
+            let bottom = 0;
+            let right = 0;
+            let left = 0;
+
+            if (y) {
+                const y0 = Math.abs(y[0]) * -1;
+                const y1 = Math.abs(y[1]) * -1;
+                top = `${y0}px`;
+                bottom = `${y1}px`;
+            }
+
+            if (x) {
+                const x0 = Math.abs(x[0]) * -1;
+                const x1 = Math.abs(x[1]) * -1;
+                left = `${x0}px`;
+                right = `${x1}px`;
+            }
+
+            return {
+                position,
+                border,
+                top,
+                right,
+                bottom,
+                left,
+                visibility,
+            };
+        }
+
+        render() {
+            const { className } = this.props;
+
+            return (
+                <div
+                    className={className}
+                    style={{
+                        position: 'relative',
+                    }}
+                >
+                    <span
+                        className="parallax__bounds"
+                        style={this.getBounds()}
+                        ref={this.mapRef}
+                    />
+
+                    <WrappedComponent getRef={this.getRef} {...this.props} />
+                </div>
+            );
+        }
+    };
+}
+
+export default withBounds;
diff --git a/src/index.js b/src/index.js
index 7371b0a42..d0acdd22b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -9,3 +9,4 @@ export ScrollController from './models/ScrollController.js';
 export withScrollPosition from './hoc/withScrollPosition.js';
 export withViewportProgress from './hoc/withViewportProgress.js';
 export withObserver from './hoc/withObserver.js';
+export withBounds from './hoc/withBounds.js';

From c8f6b4bad52f20d563d3e1aaf639c2a33d81c233 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 15:44:31 -0700
Subject: [PATCH 043/158] use `getRef` prop func in the withObserver hoc

---
 src/hoc/withObserver.js | 33 ++++++++++++++++++---------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/hoc/withObserver.js b/src/hoc/withObserver.js
index 6610991ce..bae562583 100644
--- a/src/hoc/withObserver.js
+++ b/src/hoc/withObserver.js
@@ -1,20 +1,25 @@
 import React, { PureComponent } from 'react';
+import PropTypes from 'prop-types';
 
 // With Observer creates a new IntersectionObserver
 // that passes an `isInView` prop to wrapped components
 // IntersectionObserver will require a polyfill
 
-export default function withObserver(
+function withObserver(
     WrappedComponent,
     options = {
         root: null, // document.querySelector('#scrollArea')
-        rootMargin: '0px',
-        threshold: [0.1, 1.0], // 1.0 = 100% of the el is visible, can be an array of values. callback is invoke when each is true
+        rootMargin: '0px', // this needs to be set based on the offsets
+        threshold: [0, 0.2, 0.4, 0.6, 0.8, 1.0], // 1.0 = 100% of the el is visible, can be an array of values. callback is invoke when each is true
     }
 ) {
     return class Observed extends PureComponent {
+        static propTypes = {
+            getRef: PropTypes.func.isRequired,
+        };
+
         state = {
-            isInView: null,
+            isInView: true, // initial state should be visible so that the scrollY is updated.
         };
 
         componentDidMount() {
@@ -38,28 +43,26 @@ export default function withObserver(
         }
 
         observe() {
-            this.observer.observe(this.el);
+            // NOTE: gets the ref of the element to observe
+            const el = this.props.getRef();
+
+            this.observer.observe(el);
         }
 
         handleIntersection = (entries, observer) => {
             entries.forEach(entry => {
-                const isInView = entry.intersectionRatio > 0;
+                const isInView = entry.intersectionRatio > 0.01;
 
                 this.setState(() => ({ isInView }));
             });
         };
 
-        mapRef = ref => {
-            this.el = ref;
-        };
-
         render() {
             const { isInView } = this.state;
-            return (
-                <div ref={this.mapRef}>
-                    <WrappedComponent isInView={isInView} {...this.props} />
-                </div>
-            );
+
+            return <WrappedComponent isInView={isInView} {...this.props} />;
         }
     };
 }
+
+export default withObserver;

From 1eea10b7c55d98baae9038ebf39e463165142686 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 16:48:38 -0700
Subject: [PATCH 044/158] fix export

---
 src/components/index.js | 2 +-
 src/index.js            | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/components/index.js b/src/components/index.js
index 363793b4c..45d5edf4d 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -1,3 +1,3 @@
 // Components
 export ScrollProvider from './ScrollProvider.js';
-export Translate from './Translate.js';
+export Parallax from './Parallax.js';
diff --git a/src/index.js b/src/index.js
index d0acdd22b..9611481b2 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,6 +1,6 @@
 // Components
 export ScrollProvider from './components/ScrollProvider.js';
-export Translate from './components/Translate.js';
+export Parallax from './components/Parallax.js';
 
 // Models
 export ScrollController from './models/ScrollController.js';

From 53f66fcc1236e39868a8ec4767a6e9f122d087f9 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 16:48:50 -0700
Subject: [PATCH 045/158] update error message

---
 src/hoc/withScrollPosition.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
index 9c69595a9..6b2d98149 100644
--- a/src/hoc/withScrollPosition.js
+++ b/src/hoc/withScrollPosition.js
@@ -37,7 +37,7 @@ function withScrollPosition(WrappedComponent) {
             // if this has the window and no controller throw an error
             if (hasWindow && !hasController) {
                 throw new Error(
-                    "No scrollController exist in context. Must wrap your application's [[ parallax ]] components in a <ScrollProvider />."
+                    "No scrollController exist in context. Must wrap your application's <Parallax> components in a <ScrollProvider />."
                 );
             }
 

From 739eac9975681ddf9465af9e2c647cf65e0d3083 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 16:49:25 -0700
Subject: [PATCH 046/158] add Parallax component

---
 src/components/Parallax.js | 77 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 77 insertions(+)
 create mode 100644 src/components/Parallax.js

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
new file mode 100644
index 000000000..7613f7b4e
--- /dev/null
+++ b/src/components/Parallax.js
@@ -0,0 +1,77 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import {
+    withScrollPosition,
+    withObserver,
+    withViewportProgress,
+    withBounds,
+} from '../hoc';
+import { scaleBetween, compose } from '../utils';
+
+class Parallax extends Component {
+    static propTypes = {
+        children: PropTypes.node.isRequired,
+        progress: PropTypes.number.isRequired,
+        x: PropTypes.array,
+        y: PropTypes.array,
+        // @TODO: these should also be available
+        // scale
+        // rotation
+        // opacity
+        // tag
+    };
+
+    scaleValues() {
+        const { progress, x: _x, y: _y } = this.props;
+
+        // @TODO: allow numbers with units and parse to determine
+
+        // Only scale a value if one exists
+        const hasX = typeof _x !== 'undefined';
+        const hasY = typeof _y !== 'undefined';
+
+        let x = 0;
+        let y = 0;
+
+        if (hasX) {
+            x = scaleBetween(progress, _x[0], _x[1], 1, 0);
+        }
+        if (hasY) {
+            y = scaleBetween(progress, _y[0], _y[1], 1, 0);
+        }
+
+        return { x, y };
+    }
+
+    getTransform() {
+        const { x, y } = this.scaleValues();
+        return `translate3d(${x}px, ${y}px, 0)`;
+    }
+
+    render() {
+        const { children } = this.props;
+
+        const style = {
+            transform: this.getTransform(),
+        };
+
+        return (
+            <div style={style}>
+                {children}
+            </div>
+        );
+    }
+}
+
+// Compose together all HOCs
+// The order of which is important since some
+// rely on props provided by the others.
+
+const enhancements = compose(
+    withBounds,
+    withObserver,
+    withScrollPosition,
+    withViewportProgress
+);
+
+export default enhancements(Parallax);

From 4574907828134c2948a3d35223a397a93540238a Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 16:51:59 -0700
Subject: [PATCH 047/158] update eslint globals

---
 .eslintrc | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.eslintrc b/.eslintrc
index 29f5b22f3..88f22283d 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,6 +1,5 @@
 {
   "globals" : {
-    "ParallaxController": true,
     "test": true,
     "expect": true
   },

From fd604b3f827214d6bab27c7a71a903ffb73dfcab Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 22:05:12 -0700
Subject: [PATCH 048/158] update example code to use new v2 components

---
 example/components/App/App.js                 |   6 +-
 example/components/Element/Element.js         |  12 ++
 example/components/Element/Element.scss       |  38 +++++
 .../components/ParallaxTest/ParallaxTest.js   | 135 ++++--------------
 .../components/ParallaxTest/ParallaxTest.scss |  54 ++++---
 example/components/index.js                   |   1 +
 6 files changed, 112 insertions(+), 134 deletions(-)
 create mode 100644 example/components/Element/Element.js
 create mode 100644 example/components/Element/Element.scss

diff --git a/example/components/App/App.js b/example/components/App/App.js
index 53ac4a3b9..f2ca63a14 100644
--- a/example/components/App/App.js
+++ b/example/components/App/App.js
@@ -1,14 +1,14 @@
 import React, { Component } from 'react';
 // import PropTypes from 'prop-types';
-import { ParallaxProvider } from 'react-scroll-parallax';
+import { ScrollProvider } from 'react-scroll-parallax';
 import { ParallaxTest } from 'components';
 
 export default class App extends Component {
     render() {
         return (
-            <ParallaxProvider>
+            <ScrollProvider>
                 <ParallaxTest />
-            </ParallaxProvider>
+            </ScrollProvider>
         );
     }
 }
diff --git a/example/components/Element/Element.js b/example/components/Element/Element.js
new file mode 100644
index 000000000..31cc6f1ce
--- /dev/null
+++ b/example/components/Element/Element.js
@@ -0,0 +1,12 @@
+import React from 'react';
+import styles from './Element.scss';
+
+export default function Element(props) {
+    return (
+        <div className={styles.ratio}>
+            <div className={styles.inner}>
+                <div className={styles.box}>{props.index}</div>
+            </div>
+        </div>
+    );
+}
diff --git a/example/components/Element/Element.scss b/example/components/Element/Element.scss
new file mode 100644
index 000000000..65b3ecea4
--- /dev/null
+++ b/example/components/Element/Element.scss
@@ -0,0 +1,38 @@
+:local(.ratio) {
+    display: flex;
+    position: relative;
+    width: 100%;
+    height: 0;
+    padding-top: 100%;
+    background: slateblue;
+    // border: 1px solid lightgreen;
+}
+
+// .is-in-view {
+//     :local(.ratio) {
+//         background: slateblue;
+//     }
+// }
+
+:local(.inner) {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+:local(.box) {
+    width: 3rem;
+    height: 3rem;
+    border-radius: 1.5rem;
+    text-align: center;
+    line-height: 3rem;
+    color: #333;
+    font-weight: bold;
+    background: lightgreen;
+}
diff --git a/example/components/ParallaxTest/ParallaxTest.js b/example/components/ParallaxTest/ParallaxTest.js
index 443917044..5cef06ab6 100644
--- a/example/components/ParallaxTest/ParallaxTest.js
+++ b/example/components/ParallaxTest/ParallaxTest.js
@@ -1,26 +1,23 @@
-import React, { Component } from 'react';
+import React, { PureComponent } from 'react';
 import { PropTypes } from 'prop-types';
+import Element from '../Element/Element.js';
 import { Parallax } from 'react-scroll-parallax';
 import style from './ParallaxTest.scss';
 
-const INC_AMOUNT = 10;
-const START_NUM_ELEMENTS = 10;
+const START_NUM_ELEMENTS = 50;
 
-export default class ParallaxTest extends Component {
+export default class ParallaxTest extends PureComponent {
     static contextTypes = {
-        parallaxController: PropTypes.object.isRequired,
+        scrollController: PropTypes.object,
     };
 
     state = {
         elements: new Array(START_NUM_ELEMENTS).fill(null).map((x, i) => i),
-        offsetY: INC_AMOUNT,
-        slowerScrollRate: false,
-        unitPercent: false,
         disabled: false,
     };
 
     triggerDestroy = () => {
-        this.context.parallaxController.destroy();
+        this.context.scrollController.destroy();
     };
 
     handleAdd = () => {
@@ -40,36 +37,6 @@ export default class ParallaxTest extends Component {
         });
     };
 
-    increaseOffsetY = () => {
-        const offsetY = this.state.offsetY + INC_AMOUNT;
-        this.setState({
-            offsetY,
-        });
-    };
-
-    decreaseOffsetY = () => {
-        const offsetY = this.state.offsetY - INC_AMOUNT < 0
-            ? 0
-            : this.state.offsetY - INC_AMOUNT;
-        this.setState({
-            offsetY,
-        });
-    };
-
-    toggleSpeed = () => {
-        const slowerScrollRate = !this.state.slowerScrollRate;
-        this.setState({
-            slowerScrollRate,
-        });
-    };
-
-    toggleValue = () => {
-        const unitPercent = !this.state.unitPercent;
-        this.setState({
-            unitPercent,
-        });
-    };
-
     toggleDisabled = () => {
         const disabled = !this.state.disabled;
         this.setState({
@@ -78,27 +45,25 @@ export default class ParallaxTest extends Component {
     };
 
     mapToParallax() {
-        const offsetY = this.state.offsetY;
-        const slowerScrollRate = this.state.slowerScrollRate;
-
+        let row = 0;
         return this.state.elements.map((number, i) => {
-            const unit = this.state.unitPercent ? '%' : 'px';
-            const offsetYMin = offsetY * -1 * i + unit;
-            const offsetYMax = offsetY * i + unit;
+            const odd = i % 2 ? -1 : 1;
+            const offset = 200;
+
+            row = i % 4 === 0 ? row + 1 : row;
+
+            const props = {};
+            if (row % 3) {
+                props.x = [-offset * odd, offset * odd];
+            } else if (row % 2) {
+                props.y = [-offset * odd, offset * odd];
+            } else {
+                props.z = [-offset * odd, offset * odd];
+            }
 
             return (
-                <Parallax
-                    key={i}
-                    tag="span"
-                    disabled={this.state.disabled}
-                    offsetYMax={offsetYMax}
-                    offsetYMin={offsetYMin}
-                    offsetXMax={0}
-                    offsetXMin={0}
-                    className={style.item}
-                    slowerScrollRate={slowerScrollRate}
-                >
-                    {number}
+                <Parallax key={i} className={style.item} {...props}>
+                    <Element index={i} />
                 </Parallax>
             );
         });
@@ -107,10 +72,10 @@ export default class ParallaxTest extends Component {
     render() {
         return (
             <div className={style.parallaxTest}>
-                <h1 className={style.h1}>
+                <main className={style.items}>
                     {this.mapToParallax()}
-                </h1>
-                <div className={style.buttons}>
+                </main>
+                <nav className={style.buttons}>
                     <div className={style.currentState}>
                         <h4>
                             Parallax Elements:
@@ -123,59 +88,13 @@ export default class ParallaxTest extends Component {
                     </div>
                     <div className={style.currentState}>
                         <h4>
-                            Y Offsets:
-                            <span className="value">
-                                {this.state.offsetY}
-                                {this.state.unitPercent ? '%' : 'px'}
-                            </span>
-                        </h4>
-                        <button onClick={this.increaseOffsetY}>Increase</button>
-                        <button onClick={this.decreaseOffsetY}>Decrease</button>
-                    </div>
-                    <div className={style.currentState}>
-                        <h4>
-                            Speed:
-                            <span className="value">
-                                {this.state.slowerScrollRate
-                                    ? 'Slower'
-                                    : 'Faster'}
-                            </span>
-                        </h4>
-                        <button onClick={this.toggleSpeed}>
-                            {this.state.slowerScrollRate ? 'Faster' : 'Slower'}
-                        </button>
-                    </div>
-                    <div className={style.currentState}>
-                        <h4>
-                            Unit:
-                            <span className="value">
-                                {this.state.unitPercent ? 'Percent' : 'Pixels'}
-                            </span>
-                        </h4>
-                        <button onClick={this.toggleValue}>
-                            {this.state.unitPercent ? 'Pixels' : 'Percent'}
-                        </button>
-                    </div>
-                    <div className={style.currentState}>
-                        <h4>
-                            Disabled:
-                            <span className="value">
-                                {this.state.disabled ? 'True' : 'False'}
-                            </span>
-                        </h4>
-                        <button onClick={this.toggleDisabled}>
-                            {this.state.disabled ? 'Enable' : 'Disable'}
-                        </button>
-                    </div>
-                    <div className={style.currentState}>
-                        <h4>
-                            Destroys the ParallaxController. :-(
+                            Destroys the scrollController. :-(
                         </h4>
                         <button onClick={this.triggerDestroy}>
                             Destroy
                         </button>
                     </div>
-                </div>
+                </nav>
             </div>
         );
     }
diff --git a/example/components/ParallaxTest/ParallaxTest.scss b/example/components/ParallaxTest/ParallaxTest.scss
index adeffd130..75668371f 100644
--- a/example/components/ParallaxTest/ParallaxTest.scss
+++ b/example/components/ParallaxTest/ParallaxTest.scss
@@ -1,20 +1,10 @@
 :local(.parallaxTest) {
-    margin: 100vh 0;
+    margin: 200vh 0;
     display: flex;
     flex-flow: row wrap;
     align-items: center;
 }
 
-:local(.h1) {
-    width: 100%;
-    font-size: 9vw;
-    text-align: center;
-}
-
-:local(.item) {
-    display: inline-block;
-}
-
 :local(.buttons) {
     position: fixed;
     top: 0;
@@ -23,6 +13,24 @@
     padding: 1em;
 }
 
+:local(.items) {
+    display: flex;
+    flex-flow: row wrap;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+    padding: 0 20%;
+}
+
+:local(.item) {
+    position: relative;
+    perspective: 400px;
+    width: 20%;
+    margin: 20% 2%;
+    // background-color: rgba(tomato, 0.2);
+    border: 1px solid lightgreen;
+}
+
 :local(.currentState) {
     margin-bottom: 1em;
 
@@ -53,23 +61,23 @@
 :global {
     body {
         background-color: #222;
-        background-image: 
-            linear-gradient(0deg, 
-                    transparent 24%, 
-                    #333 25%, 
-                    #333 26%, 
+        background-image:
+            linear-gradient(0deg,
+                    transparent 24%,
+                    #333 25%,
+                    #333 26%,
                     transparent 27%,
-                    transparent 74%, 
-                    #333 75%, 
+                    transparent 74%,
+                    #333 75%,
                     #333 76%,
                     transparent 77%,
-                    transparent), 
-            linear-gradient(90deg, transparent 24%, 
-                    #333 25%, 
+                    transparent),
+            linear-gradient(90deg, transparent 24%,
+                    #333 25%,
                     #333 26%,
                     transparent 27%,
-                    transparent 74%, 
-                    #333 75%, 
+                    transparent 74%,
+                    #333 75%,
                     #333 76%,
                     transparent 77%,
                     transparent);
diff --git a/example/components/index.js b/example/components/index.js
index 042910546..44e83eac9 100644
--- a/example/components/index.js
+++ b/example/components/index.js
@@ -1,2 +1,3 @@
 export ParallaxTest from './ParallaxTest/ParallaxTest.js';
+export Element from './Element/Element.js';
 export App from './App/App.js';

From 297d399279c7eb50ed4e3b1febfc6988a9e121bf Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 22:05:38 -0700
Subject: [PATCH 049/158] start updating the readme with v2 differences

---
 README.md | 146 ++++++++++--------------------------------------------
 1 file changed, 26 insertions(+), 120 deletions(-)

diff --git a/README.md b/README.md
index 008d12431..6c56f74bd 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,10 @@
-# React Scroll Parallax
+# React Scroll Parallax v2
 
-Provides a React component and single passive scroll listener to add **vertical** scrolling based offsets to elements based on their position in the viewport. Works with universal (server-side rendered) React apps.
-
-[View on NPM](https://www.npmjs.com/package/react-scroll-parallax)
+Provides a React component and single passive scroll listener to add **vertical** scrolling based effects to elements based on their position in the viewport. Works with universal (server-side rendered) React apps.
 
 ## Examples
 
-🔗 [CodePen Parallax](https://codepen.io/jscottsmith/pen/eREbwz)
-
-🔗 [Example Site](https://jscottsmith.github.io/react-scroll-parallax-examples/examples/parallax-example/)
-
-🔗 [Parallax Testing](https://jscottsmith.github.io/react-scroll-parallax-examples/examples/parallax-test/)
+@TODO
 
 ## Install
 
@@ -20,25 +14,37 @@ npm i react-scroll-parallax --save
 
 ## Usage
 
-Wrap your component tree that will contain `<Parallax />` components with the `<ParallaxProvider />`;
+### Overview
+
+There are two main components to be utilized in this library:
+
+1. `<ScrollProvider>`
+    - Responsible for providing the current scroll position to all `<Parallax>` components via context.
+
+2. `<Parallax>`
+    - Handles updating the styles of a DOM element such as translations, scale, or opacity.
+
+### How to
+
+Wrap your component tree that will contain `<Parallax>` components with the `<ScrollProvider>`. Most commonly this will be at the root of your application.
 
 ```jsx
 ...
-import { ParallaxProvider } from 'react-scroll-parallax';
+import { ScrollProvider } from 'react-scroll-parallax';
 
 class App extends Component {
     render() {
         return (
-            <ParallaxProvider>
+            <ScrollProvider>
                 <StuffWithParallax />
-            </ParallaxProvider>
+            </ScrollProvider>
         );
     }
 }
 
 ```
 
-Import the `Parallax` component...
+Import the `<Parallax>` component...
 
 ```javascript
 import { Parallax } from 'react-scroll-parallax';
@@ -48,130 +54,30 @@ import { Parallax } from 'react-scroll-parallax';
 
 ```jsx
 <Parallax
-    className="custom-class"
-    offsetYMax={20}
-    offsetYMin={-20}
-    slowerScrollRate
-    tag="figure"
+    @TODO: TBD...
 >
     <img src="/image" />
 </Parallax>
 ```
 
-**NOTE:** The Parallax Controller caches the scroll state and positions of elements on the page for performance reasons. This means that if the page height changes (perhaps from images loading) after `<Parallax />` components are mounted it won't properly determine when the elements are in view. To correct this you can call the `parallaxController.update()` method from any child component of the `<ParallaxProvider />` via context once every thing has loaded and is ready. More details on how here: [Parallax Controller Context](#parallax-controller-context)
-
 ## Parallax Component Props
 
 The following are all props that can be passed to the React `<Parallax />` component:
 
-**`className`**
-
-- type: `String`
-
-Optionally pass additional class names to be added to the outer parallax element.
-
-**`disabled`**
+**`example`**
 
 - type: `Boolean`
 - default: `false`
 
-Determines if the component will have parallax offsets applied. If `true` parallax styles are completely removed from the element and it is no longer updated.
-
-**`offsetXMax`**
-
-- type: `Number` or `String`
-- default: `0`
-
-Maximum **x** offset in `%` or `px`. If no unit is passed percent is assumed. Percent is based on the elements width.
-
-**`offsetXMin`**
-
-- type: `Number` or `String`
-- default: `0`
-
-Minimum **x** offset in `%` or `px`. If no unit is passed percent is assumed. Percent is based on the elements width.
-
-**`offsetYMax`**
-
-- type: `Number` or `String`
-- default: `0`
-
-Maximum **y** offset in `%` or `px`. If no unit is passed percent is assumed. Percent is based on the elements height.
-
-**`offsetYMin`**
-
-- type: `Number` or `String`
-- default: `0`
-
-Minimum **y** offset in `%` or `px`. If no unit is passed percent is assumed. Percent is based on the elements height.
-
-**`slowerScrollRate`**
-
-- type: `Boolean`
-- default `false`
-
-Determines whether the scroll rate of the parallax component will move faster or slower than the default rate of scroll.
-
-**`tag`**
-
-- type: `String`
-- default `div`
-
-Optionally pass a tag name to be applied to the outer most parallax element. For example: `<Parallax tag="figure" />`.
-
-## Parallax Controller Context
-
-Access the Parallax Controller via context in any components rendered within a `<ParallaxProvider />` by defining the `contextTypes` like so:
-
-```jsx
-class Foo extends Component {
-
-    static contextTypes = {
-        parallaxController: PropTypes.object.isRequired,
-    };
-
-    doSomething() {
-        // do stuff with this.context.parallaxController
-    }
-
-    ...
-```
-
-or for stateless functional components like:
-
-```jsx
-const Bar = (props, context) => (
-
-    // do stuff with context.parallaxController
-
-    ...
-);
-
-Bar.contextTypes = {
-    parallaxController: PropTypes.object.isRequired,
-};
-
-```
-
-### Available Methods
-
-Access the following methods on `parallaxController` via context:
-
-**`update()`**
-
-Updates all cached attributes for parallax elements then updates their positions.
-
-**`destroy()`**
-
-Removes window scroll and resize listeners then resets all styles applied to parallax elements.
+@TODO: Document props of the `<Parallax>` component.
 
-## Browser Support
+## Scroll Controller Context
 
-React scroll parallax should support the last two versions of all major browsers and has been tested on desktop Chrome, Firefox, Safari and Edge, as well as the following: iOS 9, iOS 10, Android 4 and IE11. If you encounter any errors for browsers that should be supported please post an issue.
+@TODO: Document any public methods (if any) of the `scrollController` context.
 
 ## Optimizations to Reduce Jank
 
-React Scroll Parallax uses a single [passive scroll listener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners) (dependent on browser support) with the minimal amount of work done on the scroll event to prevent [jank](http://jankfree.org/) (calculations that cause layout, reflow and paint are cached initially and only updated when layout changes). Request animation frame is then used to decouple the scroll handler and further reduce jank. All offsets are applied with 3D transforms to utilize the GPU and prevent paints. If you have ideas to further optimize scrolling please PR or post an issue.
+React Scroll Parallax uses a single [passive scroll listener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners) (dependent on browser support) with the minimal amount of work done on the scroll event to prevent [jank](http://jankfree.org/) (calculations that cause layout, reflow and paint are cached initially and only updated when layout changes). All offsets are applied with 3D transforms to utilize the GPU and prevent paints. If you have ideas to further optimize scrolling please PR or post an issue.
 
 **PSA**
 

From 0156c990cc8cf443759bc81893bf57e26100cc11 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 22:13:42 -0700
Subject: [PATCH 050/158] remove unused utils and tests

---
 __tests__/getParallaxOffsets.test.js | 59 ----------------------------
 __tests__/isElementInView.test.js    | 24 -----------
 __tests__/parseValueAndUnit.test.js  | 10 -----
 src/utils/getParallaxOffsets.js      | 43 --------------------
 src/utils/index.js                   |  3 --
 src/utils/isElementInView.js         | 19 ---------
 src/utils/parseValueAndUnit.js       | 41 -------------------
 src/utils/propValidation.js          | 45 ---------------------
 8 files changed, 244 deletions(-)
 delete mode 100644 __tests__/getParallaxOffsets.test.js
 delete mode 100644 __tests__/isElementInView.test.js
 delete mode 100644 __tests__/parseValueAndUnit.test.js
 delete mode 100644 src/utils/getParallaxOffsets.js
 delete mode 100644 src/utils/isElementInView.js
 delete mode 100644 src/utils/parseValueAndUnit.js
 delete mode 100644 src/utils/propValidation.js

diff --git a/__tests__/getParallaxOffsets.test.js b/__tests__/getParallaxOffsets.test.js
deleted file mode 100644
index 0caa1ce05..000000000
--- a/__tests__/getParallaxOffsets.test.js
+++ /dev/null
@@ -1,59 +0,0 @@
-import getParallaxOffsets from 'utils/getParallaxOffsets.js';
-import { parseValueAndUnit, scaleBetween } from 'utils';
-
-const offset = {
-    xMin: parseValueAndUnit('-100px'),
-    xMax: parseValueAndUnit('40px'),
-    yMin: parseValueAndUnit('-80%'),
-    yMax: parseValueAndUnit('50%'),
-};
-
-const percentMoved = 44;
-
-test('Gets offsets based on percent in view', () => {
-    expect(getParallaxOffsets(offset, percentMoved, false)).toEqual({
-        x: {
-            value: scaleBetween(
-                percentMoved,
-                offset.xMax.value,
-                offset.xMin.value,
-                0,
-                100
-            ),
-            unit: offset.xMax.unit,
-        },
-        y: {
-            value: scaleBetween(
-                percentMoved,
-                offset.yMax.value,
-                offset.yMin.value,
-                0,
-                100
-            ),
-            unit: offset.yMax.unit,
-        },
-    });
-
-    expect(getParallaxOffsets(offset, percentMoved, true)).toEqual({
-        x: {
-            value: scaleBetween(
-                percentMoved,
-                offset.xMin.value,
-                offset.xMax.value,
-                0,
-                100
-            ),
-            unit: offset.xMax.unit,
-        },
-        y: {
-            value: scaleBetween(
-                percentMoved,
-                offset.yMin.value,
-                offset.yMax.value,
-                0,
-                100
-            ),
-            unit: offset.yMax.unit,
-        },
-    });
-});
diff --git a/__tests__/isElementInView.test.js b/__tests__/isElementInView.test.js
deleted file mode 100644
index cff37da6d..000000000
--- a/__tests__/isElementInView.test.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import isElementInView from 'utils/isElementInView.js';
-
-const element1 = {
-    attributes: {
-        top: 0,
-        bottom: 500,
-    },
-};
-
-const element2 = {
-    attributes: {
-        top: 2500,
-        bottom: 4000,
-    },
-};
-
-const windowHeight = 1000;
-
-test('Returns whether an element is in view', () => {
-    expect(isElementInView(element1, windowHeight, 1500)).toBe(false);
-    expect(isElementInView(element1, windowHeight, 0)).toBe(true);
-    expect(isElementInView(element2, 4000, 0)).toBe(true);
-    expect(isElementInView(element2, windowHeight, 6500)).toBe(false);
-});
diff --git a/__tests__/parseValueAndUnit.test.js b/__tests__/parseValueAndUnit.test.js
deleted file mode 100644
index 40db9ec2b..000000000
--- a/__tests__/parseValueAndUnit.test.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import parseValueAndUnit from 'utils/parseValueAndUnit';
-
-test('Parse a string to get the value and unit in either pixels or percent', () => {
-    expect(parseValueAndUnit('5px')).toEqual({ unit: 'px', value: 5 });
-    expect(parseValueAndUnit('52%')).toEqual({ unit: '%', value: 52 });
-    expect(parseValueAndUnit(13.333)).toEqual({ unit: '%', value: 13.333 });
-    expect(parseValueAndUnit('75.8%')).toEqual({ unit: '%', value: 75 });
-    expect(parseValueAndUnit('23.1px')).toEqual({ unit: 'px', value: 23 });
-    expect(() => parseValueAndUnit(false)).toThrow();
-});
diff --git a/src/utils/getParallaxOffsets.js b/src/utils/getParallaxOffsets.js
deleted file mode 100644
index 39fafaaf7..000000000
--- a/src/utils/getParallaxOffsets.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import { scaleBetween } from './index';
-
-/**
- * Gets the parallax X and Y offsets to be applied to an element
- * based upon the percent the element has moved in the viewport
- * and the min/max offsets
- * @returns {Object}
- */
-
-export default function getParallaxOffsets(
-    offsets,
-    percentMoved,
-    slowerScrollRate
-) {
-    const { yMin, yMax, xMin, xMax } = offsets;
-
-    const yUnit = yMax.unit;
-    const xUnit = xMax.unit;
-
-    // sets parallax to faster or slower than the rate of scroll
-    let x = 0;
-    let y = 0;
-
-    if (slowerScrollRate) {
-        x = scaleBetween(percentMoved, xMin.value, xMax.value, 0, 100);
-        y = scaleBetween(percentMoved, yMin.value, yMax.value, 0, 100);
-    } else {
-        // flipped max/min
-        x = scaleBetween(percentMoved, xMax.value, xMin.value, 0, 100);
-        y = scaleBetween(percentMoved, yMax.value, yMin.value, 0, 100);
-    }
-
-    return {
-        x: {
-            value: x,
-            unit: xUnit,
-        },
-        y: {
-            value: y,
-            unit: yUnit,
-        },
-    };
-}
diff --git a/src/utils/index.js b/src/utils/index.js
index e54fa4691..499ad8663 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -1,7 +1,4 @@
 export clamp from './clamp';
 export compose from './compose';
-export getParallaxOffsets from './getParallaxOffsets';
-export isElementInView from './isElementInView';
-export parseValueAndUnit from './parseValueAndUnit';
 export scaleBetween from './scaleBetween';
 export testForPassiveScroll from './testForPassiveScroll';
diff --git a/src/utils/isElementInView.js b/src/utils/isElementInView.js
deleted file mode 100644
index 945d9a6df..000000000
--- a/src/utils/isElementInView.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Takes a parallax element and returns whether the element
- * is in view based on the cached position of the element,
- * current scroll position and the window height.
- * @param {object} element
- * @return {boolean} isInView
- */
-export default function isElementInView(element, windowHeight, scrollY) {
-    const top = element.attributes.top - scrollY;
-    const bottom = element.attributes.bottom - scrollY;
-
-    const topInView = top >= 0 && top <= windowHeight;
-    const bottomInView = bottom >= 0 && bottom <= windowHeight;
-    const covering = top <= 0 && bottom >= windowHeight;
-
-    const isInView = topInView || bottomInView || covering;
-
-    return isInView;
-}
diff --git a/src/utils/parseValueAndUnit.js b/src/utils/parseValueAndUnit.js
deleted file mode 100644
index 37d78f215..000000000
--- a/src/utils/parseValueAndUnit.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Determines the unit of a string and parses the value
- *
- * @param {string} value
- * @return {object} The parsed value and the unit if any
- */
-export default function parseValueAndUnit(value) {
-    const isBool = typeof value === 'boolean';
-    const isObject = typeof value === 'object';
-    const isString = typeof value === 'string';
-    const isNumb = typeof value === 'number';
-
-    if (isBool || isObject) {
-        throw new Error(
-            'Ivalid value provided. Must provide a value as a string with % or px units.'
-        );
-    }
-
-    if (isNumb) {
-        return {
-            value,
-            unit: '%', // defaults to percent if not unit is passed
-        };
-    } else if (isString && value.slice(-1) === '%') {
-        // remove % then parse
-        value = parseInt(value.slice(0, -1), 10);
-
-        return {
-            value,
-            unit: '%',
-        };
-    } else if (isString && value.slice(-2) === 'px') {
-        // remove px then parse
-        value = parseInt(value.slice(0, -2), 10);
-
-        return {
-            value,
-            unit: 'px',
-        };
-    }
-}
diff --git a/src/utils/propValidation.js b/src/utils/propValidation.js
deleted file mode 100644
index e6f059c72..000000000
--- a/src/utils/propValidation.js
+++ /dev/null
@@ -1,45 +0,0 @@
-export function offsetMin(props, propName, componentName) {
-    componentName = componentName || 'ANONYMOUS';
-
-    if (!typeof value === 'string' || !typeof value === 'number') {
-        return new Error(
-            `[${propName}] in ${componentName} must be a string with with "%"" or "px" units or number`
-        );
-    }
-
-    if (props[propName]) {
-        let value = props[propName];
-        if (typeof value === 'string') {
-            value = parseInt(value, 10);
-        }
-        return value <= 0
-            ? null
-            : new Error(
-                  `[${propName}] in ${componentName} is greater than zero. [${propName}] must be less than or equal to zero.`
-              );
-    }
-    return null;
-}
-
-export function offsetMax(props, propName, componentName) {
-    componentName = componentName || 'ANONYMOUS';
-
-    if (!typeof value === 'string' || !typeof value === 'number') {
-        return new Error(
-            `[${propName}] in ${componentName} must be a string with with "%"" or "px" units or number`
-        );
-    }
-
-    if (props[propName]) {
-        let value = props[propName];
-        if (typeof value === 'string') {
-            value = parseInt(value, 10);
-        }
-        return value >= 0
-            ? null
-            : new Error(
-                  `[${propName}] in ${componentName} is less than zero. [${propName}] must be greater than or equal to zero.`
-              );
-    }
-    return null;
-}

From 4683aaccdd9e6b849c86062678e61b7e419c85dd Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 22:24:50 -0700
Subject: [PATCH 051/158] cleanup

---
 src/hoc/withScrollPosition.js | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
index 6b2d98149..822a7bb37 100644
--- a/src/hoc/withScrollPosition.js
+++ b/src/hoc/withScrollPosition.js
@@ -41,14 +41,18 @@ function withScrollPosition(WrappedComponent) {
                 );
             }
 
-            // Subscribe to scroll updates by passing a handler to setState of current scroll
-            if (hasWindow) scrollController.subscribe(this.updateScroll);
+            // Subscribe to scroll updates by passing
+            // a handler to setState of current scroll
+            if (hasWindow) {
+                scrollController.subscribe(this.updateScroll);
+            }
         }
 
         componentWillUnmount() {
             const { scrollController } = this.context;
 
-            // Unsubscribe to scroll updates by passing the subscribed scroll handler
+            // Unsubscribe to scroll updates by passing
+            // the subscribed scroll handler
             scrollController.unsubscribe(this.updateScroll);
         }
 

From 8d3f97b9ef88d0f26924f763fcb447506c90e446 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 22:25:05 -0700
Subject: [PATCH 052/158] test for throw in withScrollPosition

---
 __tests__/withScrollPosition.test.js | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/__tests__/withScrollPosition.test.js b/__tests__/withScrollPosition.test.js
index e8eed3ef5..56d47419c 100644
--- a/__tests__/withScrollPosition.test.js
+++ b/__tests__/withScrollPosition.test.js
@@ -30,4 +30,18 @@ describe('withScrollPosition() higher order component', () => {
         // Expected initial value
         expect(testProps.scrollY).toBe(0);
     });
+
+    it('throws if not wrapped in a <ScrollProvider>', () => {
+        const node = document.createElement('div');
+
+        const ScrollPosition = withScrollPosition(() => {
+            return null;
+        });
+
+        expect(() => {
+            ReactDOM.render(<ScrollPosition />, node);
+        }).toThrowError(
+            "No scrollController exist in context. Must wrap your application's <Parallax> components in a <ScrollProvider />."
+        );
+    });
 });

From 2de2cff9bdfeb09ca6f79002a961b19eefec0bdc Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 22:37:55 -0700
Subject: [PATCH 053/158] require `isInView` prop in withScrollPosition

---
 src/hoc/withScrollPosition.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
index 822a7bb37..f49c63f4e 100644
--- a/src/hoc/withScrollPosition.js
+++ b/src/hoc/withScrollPosition.js
@@ -18,7 +18,7 @@ function withScrollPosition(WrappedComponent) {
         };
 
         static propTypes = {
-            isInView: PropTypes.bool,
+            isInView: PropTypes.bool.isRequired,
         };
 
         state = {

From f700a95926b3b0e8e9ddd047038b21d35c7eae50 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 22:42:14 -0700
Subject: [PATCH 054/158] cleanup

---
 src/hoc/withObserver.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/hoc/withObserver.js b/src/hoc/withObserver.js
index bae562583..02d26b70c 100644
--- a/src/hoc/withObserver.js
+++ b/src/hoc/withObserver.js
@@ -1,3 +1,5 @@
+/* global IntersectionObserver */
+
 import React, { PureComponent } from 'react';
 import PropTypes from 'prop-types';
 
@@ -9,7 +11,7 @@ function withObserver(
     WrappedComponent,
     options = {
         root: null, // document.querySelector('#scrollArea')
-        rootMargin: '0px', // this needs to be set based on the offsets
+        rootMargin: '0px',
         threshold: [0, 0.2, 0.4, 0.6, 0.8, 1.0], // 1.0 = 100% of the el is visible, can be an array of values. callback is invoke when each is true
     }
 ) {

From c35d08b71b09beaab72768ef101e99342ecee220 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 23:32:58 -0700
Subject: [PATCH 055/158] add the `intersection-observer` polyfill as a dev
 dependency

---
 package.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/package.json b/package.json
index a33c28622..164d76d6f 100644
--- a/package.json
+++ b/package.json
@@ -48,6 +48,7 @@
     "cross-env": "^3.1.4",
     "css-loader": "^0.28.0",
     "express": "^4.14.1",
+    "intersection-observer": "^0.4.2",
     "jest": "^20.0.4",
     "node-sass": "^4.5.0",
     "postcss-loader": "^1.3.3",

From 58473f2e3832006b9ef0dd5fdd5c74440c1b49e8 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 23:35:06 -0700
Subject: [PATCH 056/158] throw on browsers without the IntersectionObserver in
 `withObserver` hoc

---
 src/hoc/withObserver.js | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/hoc/withObserver.js b/src/hoc/withObserver.js
index 02d26b70c..3e4a3bc16 100644
--- a/src/hoc/withObserver.js
+++ b/src/hoc/withObserver.js
@@ -34,6 +34,13 @@ function withObserver(
         }
 
         createObserver() {
+            const hasObserver = 'IntersectionObserver' in window;
+            if (!hasObserver) {
+                throw new Error(
+                    'Must provide an IntersectionObserver polyfill for browsers that do not yet support the technology.'
+                );
+            }
+
             this.observer = new IntersectionObserver(
                 this.handleIntersection,
                 options
@@ -41,7 +48,9 @@ function withObserver(
         }
 
         disconnectObserver() {
-            this.observer.disconnect();
+            if (this.observer) {
+                this.observer.disconnect();
+            }
         }
 
         observe() {

From 2bbdd6173c35ae405434fe77aea34cc7b00de336 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 23:36:09 -0700
Subject: [PATCH 057/158] tests for `withObserver` hoc

---
 __tests__/withObserver.test.js | 52 ++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)
 create mode 100644 __tests__/withObserver.test.js

diff --git a/__tests__/withObserver.test.js b/__tests__/withObserver.test.js
new file mode 100644
index 000000000..01d0f7f55
--- /dev/null
+++ b/__tests__/withObserver.test.js
@@ -0,0 +1,52 @@
+/* global describe, it */
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import ReactDOM from 'react-dom';
+import { withObserver } from 'react-scroll-parallax';
+
+describe('withObserver() higher order component', () => {
+    const node = document.createElement('div');
+    const ref = document.createElement('div');
+
+    it("throws if the browser doesn't support the Intersection Observer API", () => {
+        const Observed = withObserver(() => null);
+
+        expect(() => {
+            ReactDOM.render(<Observed getRef={() => ref} />, node);
+        }).toThrowError(
+            'Must provide an IntersectionObserver polyfill for browsers that do not yet support the technology.'
+        );
+    });
+
+    it('provides an `isInView` prop to a wrapped component', () => {
+        require('intersection-observer');
+
+        let testProps;
+
+        const Observed = withObserver(props => {
+            testProps = props;
+            return null;
+        });
+
+        Observed.propTypes = {
+            isInView: PropTypes.bool.isRequired,
+        };
+
+        ReactDOM.render(<Observed getRef={() => ref} />, node);
+
+        expect(testProps.isInView).toBe(true);
+    });
+
+    it('requires a `getRef` prop func', () => {
+        const Observed = withObserver(() => null);
+
+        Observed.propTypes = {
+            isInView: PropTypes.bool.isRequired,
+        };
+
+        expect(() => {
+            ReactDOM.render(<Observed />, node);
+        }).toThrowError();
+    });
+});

From a25b6fe7980ee7e846a7292a235d6f09d79fc1c4 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 23:55:44 -0700
Subject: [PATCH 058/158] begin documenting Intersection Observer requirements
 in readme

---
 README.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/README.md b/README.md
index 6c56f74bd..af3a4abf7 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,12 @@ Provides a React component and single passive scroll listener to add **vertical*
 npm i react-scroll-parallax --save
 ```
 
+This package also requires [support](https://caniuse.com/#search=IntersectionObserver) for the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API). Since this isn't supported in older browsers you will need to add a [polyfill](https://github.com/w3c/IntersectionObserver/tree/gh-pages/polyfill).
+
+```
+npm i intersection-observer --save
+```
+
 ## Usage
 
 ### Overview

From 7991d6c3adece90af39b690067819e4a74beb5ec Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 3 Sep 2017 23:56:43 -0700
Subject: [PATCH 059/158] add the IntersectionObserver polyfill in the example

---
 example/client.js             | 2 ++
 example/components/App/App.js | 1 -
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/example/client.js b/example/client.js
index 97c08772f..d1e716aae 100644
--- a/example/client.js
+++ b/example/client.js
@@ -1,4 +1,6 @@
 import 'babel-polyfill';
+import 'intersection-observer';
+
 import React from 'react';
 import ReactDOM from 'react-dom';
 import { App } from 'components';
diff --git a/example/components/App/App.js b/example/components/App/App.js
index f2ca63a14..5aa2c34d5 100644
--- a/example/components/App/App.js
+++ b/example/components/App/App.js
@@ -1,5 +1,4 @@
 import React, { Component } from 'react';
-// import PropTypes from 'prop-types';
 import { ScrollProvider } from 'react-scroll-parallax';
 import { ParallaxTest } from 'components';
 

From d1b13b9eb443879af31af91b2e9a16c63e739018 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sat, 23 Sep 2017 16:42:27 -0700
Subject: [PATCH 060/158] update new subscriber with state in ScrollController

---
 src/models/ScrollController.js | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/models/ScrollController.js b/src/models/ScrollController.js
index 76bf7f389..f3a260291 100644
--- a/src/models/ScrollController.js
+++ b/src/models/ScrollController.js
@@ -48,6 +48,10 @@ class ScrollController {
         this.subscriptions.forEach(f => f(this.state));
     };
 
+    _updateSingleSubscriber = f => {
+        f(this.state);
+    };
+
     _addListeners() {
         window.addEventListener(
             'scroll',
@@ -70,6 +74,7 @@ class ScrollController {
 
     subscribe(f) {
         this.subscriptions.push(f);
+        this._updateSingleSubscriber(f);
     }
 
     unsubscribe(f) {

From 787894c6aee81f2ce574942eef14104d8d2e0e24 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 26 Sep 2017 00:36:00 -0700
Subject: [PATCH 061/158] add parseUnit util

---
 src/utils/index.js     |  1 +
 src/utils/parseUnit.js | 14 ++++++++++++++
 2 files changed, 15 insertions(+)
 create mode 100644 src/utils/parseUnit.js

diff --git a/src/utils/index.js b/src/utils/index.js
index 499ad8663..f6c942e0e 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -1,4 +1,5 @@
 export clamp from './clamp';
 export compose from './compose';
+export parseUnit from './parseUnit';
 export scaleBetween from './scaleBetween';
 export testForPassiveScroll from './testForPassiveScroll';
diff --git a/src/utils/parseUnit.js b/src/utils/parseUnit.js
new file mode 100644
index 000000000..b1f469812
--- /dev/null
+++ b/src/utils/parseUnit.js
@@ -0,0 +1,14 @@
+export function parseUnit(str, out) {
+    if (!out) {
+        out = { value: 0, unit: '' };
+    }
+
+    str = String(str);
+
+    const value = parseFloat(str, 10);
+
+    out.value = value;
+    out.unit = str.match(/[\d.\-\+]*\s*(.*)/)[1] || '';
+
+    return out;
+}

From f1b59118076e1681d823073808bd3abe25fd66e8 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 26 Sep 2017 00:37:23 -0700
Subject: [PATCH 062/158] move observer support check to method

---
 src/hoc/withObserver.js | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/hoc/withObserver.js b/src/hoc/withObserver.js
index 3e4a3bc16..c255a22fe 100644
--- a/src/hoc/withObserver.js
+++ b/src/hoc/withObserver.js
@@ -34,17 +34,24 @@ function withObserver(
         }
 
         createObserver() {
+            this.checkForObserver();
+
+            this.observer = new IntersectionObserver(
+                this.handleIntersection,
+                options
+            );
+        }
+
+        checkForObserver() {
+            // NOTE: Error handling if the observer is not available
+            // This should be provided by the user via a polyfill
+
             const hasObserver = 'IntersectionObserver' in window;
             if (!hasObserver) {
                 throw new Error(
                     'Must provide an IntersectionObserver polyfill for browsers that do not yet support the technology.'
                 );
             }
-
-            this.observer = new IntersectionObserver(
-                this.handleIntersection,
-                options
-            );
         }
 
         disconnectObserver() {

From 73ae8a246097b72e8b9bde4a031704fedb19f0ab Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 26 Sep 2017 00:41:44 -0700
Subject: [PATCH 063/158] update withBounds method names, add some todos/notes

---
 src/hoc/withBounds.js | 99 +++++++++++++++++++++++--------------------
 1 file changed, 53 insertions(+), 46 deletions(-)

diff --git a/src/hoc/withBounds.js b/src/hoc/withBounds.js
index 3fa5174f7..195a1b685 100644
--- a/src/hoc/withBounds.js
+++ b/src/hoc/withBounds.js
@@ -1,90 +1,97 @@
 import React, { PureComponent } from 'react';
 import PropTypes from 'prop-types';
 
-// The with bounds HOC wraps a component
+// NOTE: The with bounds HOC wraps a component
 // and provides the bounds to be observed
-// based upon the [x, y] translations
+// based upon the [x, y] translations. This HOC
+// should be composed within the withObserver().
 
 // @TODO: Hopefully this can also account
 // for future props past to parallax element
 // like scale and rotation. Not going to handle
 // z because that requires knowing the perspective
-// and would be difficult to calculate
+// and would be difficult to calculate the bounds
+//
+// Currently the bounds only accounts for x, y
 
 function withBounds(WrappedComponent) {
     return class Bounds extends PureComponent {
         static propTypes = {
             className: PropTypes.string,
+            isInView: PropTypes.bool.isRequired,
+            innerRef: PropTypes.func.isRequired,
             x: PropTypes.array,
             y: PropTypes.array,
         };
 
-        mapRef = ref => {
-            this.el = ref;
-        };
-
-        getRef = () => {
-            // NOTE: this ref is required so that
-            // the withViewportProgress() HOC and the
-            // withObserver() HOC can access the DOM
-            // element. It's not used within this class.
-            return this.el;
-        };
+        getBoundsStyle() {
+            // @TODO: Cache these values, only
+            // update if relevant props have updated
 
-        getBounds() {
             const { x, y } = this.props;
 
-            const position = 'absolute';
-            const visibility = 'hidden';
-            const border = '1px dotted tomato';
+            // NOTE: Temporary border added to debug
+            let border;
+            if (this.props.isInView) {
+                border = '1px dotted lightgreen';
+            } else {
+                border = '1px dotted tomato';
+            }
+
+            let marginTop = 0;
+            let marginBottom = 0;
+            let marginLeft = 0;
+            let marginRight = 0;
 
-            let top = 0;
-            let bottom = 0;
-            let right = 0;
-            let left = 0;
+            let paddingTop = 0;
+            let paddingBottom = 0;
+            let paddingLeft = 0;
+            let paddingRight = 0;
 
             if (y) {
                 const y0 = Math.abs(y[0]) * -1;
                 const y1 = Math.abs(y[1]) * -1;
-                top = `${y0}px`;
-                bottom = `${y1}px`;
+                marginTop = `${y0}px`;
+                marginBottom = `${y1}px`;
+                paddingTop = `${Math.abs(y0)}px`;
+                paddingBottom = `${Math.abs(y1)}px`;
             }
 
             if (x) {
                 const x0 = Math.abs(x[0]) * -1;
                 const x1 = Math.abs(x[1]) * -1;
-                left = `${x0}px`;
-                right = `${x1}px`;
+                marginLeft = `${x0}px`;
+                marginRight = `${x1}px`;
+                paddingLeft = `${Math.abs(x0)}px`;
+                paddingRight = `${Math.abs(x1)}px`;
             }
 
             return {
-                position,
+                marginTop,
+                marginBottom,
+                marginLeft,
+                marginRight,
+                paddingTop,
+                paddingBottom,
+                paddingLeft,
+                paddingRight,
                 border,
-                top,
-                right,
-                bottom,
-                left,
-                visibility,
             };
         }
 
         render() {
-            const { className } = this.props;
+            const { className, innerRef, isInView } = this.props;
+            const _className = isInView ? `${className} is-in-view` : className;
 
             return (
-                <div
-                    className={className}
-                    style={{
-                        position: 'relative',
-                    }}
-                >
-                    <span
-                        className="parallax__bounds"
-                        style={this.getBounds()}
-                        ref={this.mapRef}
-                    />
-
-                    <WrappedComponent getRef={this.getRef} {...this.props} />
+                <div className={_className}>
+                    <div
+                        className="parallax-bounds"
+                        style={this.getBoundsStyle()}
+                        ref={innerRef}
+                    >
+                        <WrappedComponent {...this.props} />
+                    </div>
                 </div>
             );
         }

From 70d6e89f7275c115c94182d0eb8bc528e765c1b0 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 26 Sep 2017 00:44:02 -0700
Subject: [PATCH 064/158] pass `mapInnerRef` func to wrapped component in
 withObserver

---
 src/hoc/withObserver.js | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/hoc/withObserver.js b/src/hoc/withObserver.js
index c255a22fe..b8327d4f6 100644
--- a/src/hoc/withObserver.js
+++ b/src/hoc/withObserver.js
@@ -16,10 +16,6 @@ function withObserver(
     }
 ) {
     return class Observed extends PureComponent {
-        static propTypes = {
-            getRef: PropTypes.func.isRequired,
-        };
-
         state = {
             isInView: true, // initial state should be visible so that the scrollY is updated.
         };
@@ -33,6 +29,12 @@ function withObserver(
             this.disconnectObserver();
         }
 
+        mapInnerRef = ref => {
+            // NOTE: This ref will be the bounds of the
+            // element and be provided by the withBounds HOC
+            this.el = ref;
+        };
+
         createObserver() {
             this.checkForObserver();
 
@@ -61,9 +63,7 @@ function withObserver(
         }
 
         observe() {
-            // NOTE: gets the ref of the element to observe
-            const el = this.props.getRef();
-
+            const el = this.el;
             this.observer.observe(el);
         }
 
@@ -78,7 +78,13 @@ function withObserver(
         render() {
             const { isInView } = this.state;
 
-            return <WrappedComponent isInView={isInView} {...this.props} />;
+            return (
+                <WrappedComponent
+                    isInView={isInView}
+                    innerRef={this.mapInnerRef}
+                    {...this.props}
+                />
+            );
         }
     };
 }

From 4845da6bfa380a8ea0a24cd2f035ae78c6a471b7 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 26 Sep 2017 00:44:37 -0700
Subject: [PATCH 065/158] pass `mapInnerRef` func to wrapped component in
 withViewportProgress

---
 src/hoc/withViewportProgress.js | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/hoc/withViewportProgress.js b/src/hoc/withViewportProgress.js
index b3d85d1d6..ab923c284 100644
--- a/src/hoc/withViewportProgress.js
+++ b/src/hoc/withViewportProgress.js
@@ -11,7 +11,6 @@ import clamp from '../utils/clamp';
 function withViewportProgress(WrappedComponent, range = [0, 1]) {
     return class ViewportProgress extends PureComponent {
         static propTypes = {
-            getRef: PropTypes.func.isRequired,
             scrollY: PropTypes.number.isRequired,
         };
 
@@ -22,6 +21,7 @@ function withViewportProgress(WrappedComponent, range = [0, 1]) {
 
         componentDidMount() {
             this.setAttributeCache();
+            this.setProgress();
             this.addListeners();
         }
 
@@ -60,11 +60,25 @@ function withViewportProgress(WrappedComponent, range = [0, 1]) {
             );
         };
 
+        mapInnerRef = ref => {
+            this.el = ref;
+
+            // NOTE: Since this HOC is composed within
+            // another that is also accessing via an
+            // innerRef function, we need to call the
+            // on via this component props since it will
+            // the prop will be overwritten by this component
+
+            if (this.props.innerRef) {
+                this.props.innerRef(ref);
+            }
+        };
+
         setAttributeCache() {
             // This caches properties that cause layout thrash
 
-            // Accessing the ref of the wrapped component
-            const el = this.props.getRef();
+            // Accessing the el withBounds() HOC
+            const el = this.el;
 
             const _rect = el.getBoundingClientRect();
             const elHeight = el.offsetHeight;
@@ -114,7 +128,12 @@ function withViewportProgress(WrappedComponent, range = [0, 1]) {
 
         render() {
             const { progress } = this.state;
-            return <WrappedComponent progress={progress} {...this.props} />;
+            const props = Object.assign({}, this.props, {
+                innerRef: this.mapInnerRef,
+                progress,
+            });
+
+            return <WrappedComponent {...props} />;
         }
     };
 }

From 26ce6e1707412f78a156ad78d3cc8049de9f0e89 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 26 Sep 2017 00:46:15 -0700
Subject: [PATCH 066/158] update compose order of decorators

---
 src/components/Parallax.js | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 7613f7b4e..6c1658794 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -64,14 +64,28 @@ class Parallax extends Component {
 }
 
 // Compose together all HOCs
-// The order of which is important since some
-// rely on props provided by the others.
+// The order of which is important since
+// some rely on props provided by the others.
+// Each decorator provides a necessary
+// prop -- or element -- required by the
+// <Parallax> component.
+//
+// |
+// withObserver () => {isInView}
+// |
+// withScrollPosition (isInView) => if (isInView) {scrollY}
+// |
+// withViewportProgress (isInView, scrollY) => return {progress}
+// |
+// withBounds (innerRef) => bounds (ref)
+// |
+// <Parallax>
 
-const enhancements = compose(
-    withBounds,
+const decorators = compose(
     withObserver,
     withScrollPosition,
-    withViewportProgress
+    withViewportProgress,
+    withBounds
 );
 
-export default enhancements(Parallax);
+export default decorators(Parallax);

From db6f23ebf386cb7e9453a2b9a3bfb8e7d1e23563 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 26 Sep 2017 00:46:53 -0700
Subject: [PATCH 067/158] parse prop units in Parallax component

---
 src/components/Parallax.js | 52 +++++++++++++++++++++++++++++---------
 1 file changed, 40 insertions(+), 12 deletions(-)

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 6c1658794..d167eab22 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -6,23 +6,39 @@ import {
     withViewportProgress,
     withBounds,
 } from '../hoc';
-import { scaleBetween, compose } from '../utils';
+import { scaleBetween, compose, parseUnit } from '../utils';
 
 class Parallax extends Component {
     static propTypes = {
         children: PropTypes.node.isRequired,
         progress: PropTypes.number.isRequired,
+        isInView: PropTypes.bool.isRequired,
         x: PropTypes.array,
         y: PropTypes.array,
+
         // @TODO: these should also be available
         // scale
         // rotation
         // opacity
-        // tag
+        // tag/element name?
     };
 
+    componentDidMount() {
+        this.setup();
+    }
+
+    setup() {
+        const { x, y } = this.props;
+
+        this.offsets = {
+            x: x.map(f => parseUnit(f)),
+            y: y.map(f => parseUnit(f)),
+        };
+    }
+
     scaleValues() {
-        const { progress, x: _x, y: _y } = this.props;
+        const { progress } = this.props;
+        const { x: _x, y: _y } = this.offsets;
 
         // @TODO: allow numbers with units and parse to determine
 
@@ -34,29 +50,41 @@ class Parallax extends Component {
         let y = 0;
 
         if (hasX) {
-            x = scaleBetween(progress, _x[0], _x[1], 1, 0);
+            x = scaleBetween(progress, _x[0].value, _x[1].value, 1, 0);
         }
         if (hasY) {
-            y = scaleBetween(progress, _y[0], _y[1], 1, 0);
+            y = scaleBetween(progress, _y[0].value, _y[1].value, 1, 0);
         }
 
-        return { x, y };
+        return {
+            x: {
+                value: x,
+                unit: _x[0].unit,
+            },
+            y: {
+                value: y,
+                unit: _y[0].unit,
+            },
+        };
     }
 
-    getTransform() {
+    getStyles() {
         const { x, y } = this.scaleValues();
-        return `translate3d(${x}px, ${y}px, 0)`;
+
+        return {
+            transform: `translate3d(${x.value}${x.unit}, ${y.value}${y.unit}, 0)`,
+        };
     }
 
     render() {
         const { children } = this.props;
 
-        const style = {
-            transform: this.getTransform(),
-        };
+        const style = this.getStyles();
+
+        const baseClass = 'parallax-element';
 
         return (
-            <div style={style}>
+            <div style={style} className={baseClass}>
                 {children}
             </div>
         );

From 27ad38a798d714cf6ce33c9f2a02412a167de9d2 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 26 Sep 2017 00:47:37 -0700
Subject: [PATCH 068/158] update styles for debugging

---
 example/components/Element/Element.scss | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/example/components/Element/Element.scss b/example/components/Element/Element.scss
index 65b3ecea4..3b61306f9 100644
--- a/example/components/Element/Element.scss
+++ b/example/components/Element/Element.scss
@@ -4,15 +4,15 @@
     width: 100%;
     height: 0;
     padding-top: 100%;
-    background: slateblue;
+    background: tomato;
     // border: 1px solid lightgreen;
 }
 
-// .is-in-view {
-//     :local(.ratio) {
-//         background: slateblue;
-//     }
-// }
+.is-in-view {
+    :local(.ratio) {
+        background: slateblue;
+    }
+}
 
 :local(.inner) {
     position: absolute;

From 7d8cdab04b5f85ab8a97d6c0f668dcd1fd1cd407 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Tue, 26 Sep 2017 01:08:03 -0700
Subject: [PATCH 069/158] update readme with v2 notes

---
 README.md | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index af3a4abf7..334a91521 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,10 @@
 
 Provides a React component and single passive scroll listener to add **vertical** scrolling based effects to elements based on their position in the viewport. Works with universal (server-side rendered) React apps.
 
+**NOTE** The v2 branch is a re-write of v1 to add new scroll features such as opacity, scale, and rotation in addition to translation. It also uses the new [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API), which will be a more efficient way to determining when elements are within the viewport as compared to v1's implementation. Much of the state of v1's ParallaxController has been moved to focused React higher order components with the hope that these components can also be used to create additional custom scroll effects. That also has the added benefit of being able to easily debug with React specific tooling to see the state of scroll effects.
+
+For a stable version of this library [use v1](https://github.com/jscottsmith/react-scroll-parallax).
+
 ## Examples
 
 @TODO
@@ -87,4 +91,4 @@ React Scroll Parallax uses a single [passive scroll listener](https://developer.
 
 **PSA**
 
-It's 2017 and you probably shouldn't be building parallax sites—but if you do (like I did) and you use this package try and use it responsibly. Keeping images small and optimized, reducing the number of moving elements in view and on the page, and disabling scroll effects on mobile devices should help achieve silky smooth animations.
+It's 2017 and you probably shouldn't be building parallax sites—but if you do (like I did) and you use this package try and use it responsibly. Keeping images small and optimized, reducing the number of moving elements in view and on the page, and disabling scroll effects on mobile devices should help keep animations smooth.

From 00287af3d7f6b72d365a9e385e2b2d9ea27541a3 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 6 Nov 2017 12:16:21 -0800
Subject: [PATCH 070/158] refactor HOCs to components using render callbacks

---
 README.md                                     |   4 +-
 __tests__/withObserver.test.js                |  52 ----
 __tests__/withScrollPosition.test.js          |  47 ----
 .../components/ParallaxTest/ParallaxTest.js   |  41 +--
 package.json                                  | 117 ++++----
 src/components/Observed.js                    |  84 ++++++
 src/components/Parallax.js                    | 266 +++++++++++++-----
 src/components/ScrollEffects.js               | 104 +++++++
 src/components/ScrollPosition.js              |  75 +++++
 src/components/ViewportProgress.js            | 138 +++++++++
 src/components/index.js                       |   6 +-
 src/hoc/index.js                              |   5 -
 src/hoc/withBounds.js                         | 101 -------
 src/hoc/withObserver.js                       |  92 ------
 src/hoc/withScrollPosition.js                 |  77 -----
 src/hoc/withViewportProgress.js               | 141 ----------
 src/index.js                                  |   6 -
 17 files changed, 672 insertions(+), 684 deletions(-)
 delete mode 100644 __tests__/withObserver.test.js
 delete mode 100644 __tests__/withScrollPosition.test.js
 create mode 100644 src/components/Observed.js
 create mode 100644 src/components/ScrollEffects.js
 create mode 100644 src/components/ScrollPosition.js
 create mode 100644 src/components/ViewportProgress.js
 delete mode 100644 src/hoc/index.js
 delete mode 100644 src/hoc/withBounds.js
 delete mode 100644 src/hoc/withObserver.js
 delete mode 100644 src/hoc/withScrollPosition.js
 delete mode 100644 src/hoc/withViewportProgress.js

diff --git a/README.md b/README.md
index 334a91521..5a263c03f 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 Provides a React component and single passive scroll listener to add **vertical** scrolling based effects to elements based on their position in the viewport. Works with universal (server-side rendered) React apps.
 
-**NOTE** The v2 branch is a re-write of v1 to add new scroll features such as opacity, scale, and rotation in addition to translation. It also uses the new [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API), which will be a more efficient way to determining when elements are within the viewport as compared to v1's implementation. Much of the state of v1's ParallaxController has been moved to focused React higher order components with the hope that these components can also be used to create additional custom scroll effects. That also has the added benefit of being able to easily debug with React specific tooling to see the state of scroll effects.
+**NOTE** The v2 branch is a re-write of v1 to add new scroll features such as opacity, scale, and rotation in addition to translation. It also uses the new [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API), which will be a more efficient way to determining when elements are within the viewport as compared to v1's implementation. Additionally, much of the state of v1's ParallaxController has been moved to focused React components with the hope that these components can also be used to create additional custom scroll effects. This also has the added benefit of being able to easily debug with React specific tooling to see the state of scroll effects in the browser.
 
 For a stable version of this library [use v1](https://github.com/jscottsmith/react-scroll-parallax).
 
@@ -34,6 +34,8 @@ There are two main components to be utilized in this library:
 2. `<Parallax>`
     - Handles updating the styles of a DOM element such as translations, scale, or opacity.
 
+@TODO: Document any higher order components that can be used.
+
 ### How to
 
 Wrap your component tree that will contain `<Parallax>` components with the `<ScrollProvider>`. Most commonly this will be at the root of your application.
diff --git a/__tests__/withObserver.test.js b/__tests__/withObserver.test.js
deleted file mode 100644
index 01d0f7f55..000000000
--- a/__tests__/withObserver.test.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* global describe, it */
-
-import React from 'react';
-import PropTypes from 'prop-types';
-import ReactDOM from 'react-dom';
-import { withObserver } from 'react-scroll-parallax';
-
-describe('withObserver() higher order component', () => {
-    const node = document.createElement('div');
-    const ref = document.createElement('div');
-
-    it("throws if the browser doesn't support the Intersection Observer API", () => {
-        const Observed = withObserver(() => null);
-
-        expect(() => {
-            ReactDOM.render(<Observed getRef={() => ref} />, node);
-        }).toThrowError(
-            'Must provide an IntersectionObserver polyfill for browsers that do not yet support the technology.'
-        );
-    });
-
-    it('provides an `isInView` prop to a wrapped component', () => {
-        require('intersection-observer');
-
-        let testProps;
-
-        const Observed = withObserver(props => {
-            testProps = props;
-            return null;
-        });
-
-        Observed.propTypes = {
-            isInView: PropTypes.bool.isRequired,
-        };
-
-        ReactDOM.render(<Observed getRef={() => ref} />, node);
-
-        expect(testProps.isInView).toBe(true);
-    });
-
-    it('requires a `getRef` prop func', () => {
-        const Observed = withObserver(() => null);
-
-        Observed.propTypes = {
-            isInView: PropTypes.bool.isRequired,
-        };
-
-        expect(() => {
-            ReactDOM.render(<Observed />, node);
-        }).toThrowError();
-    });
-});
diff --git a/__tests__/withScrollPosition.test.js b/__tests__/withScrollPosition.test.js
deleted file mode 100644
index 56d47419c..000000000
--- a/__tests__/withScrollPosition.test.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* global describe, it */
-
-import React from 'react';
-import PropTypes from 'prop-types';
-import ReactDOM from 'react-dom';
-import { ScrollProvider, withScrollPosition } from 'react-scroll-parallax';
-
-describe('withScrollPosition() higher order component', () => {
-    it('provides a `scrollY` prop to a wrapped component', () => {
-        const node = document.createElement('div');
-
-        let testProps;
-
-        const ScrollPosition = withScrollPosition(props => {
-            testProps = props;
-            return null;
-        });
-
-        ScrollPosition.propTypes = {
-            scrollY: PropTypes.number, // isRequired is warning, not sure why.
-        };
-
-        ReactDOM.render(
-            <ScrollProvider>
-                <ScrollPosition />
-            </ScrollProvider>,
-            node
-        );
-
-        // Expected initial value
-        expect(testProps.scrollY).toBe(0);
-    });
-
-    it('throws if not wrapped in a <ScrollProvider>', () => {
-        const node = document.createElement('div');
-
-        const ScrollPosition = withScrollPosition(() => {
-            return null;
-        });
-
-        expect(() => {
-            ReactDOM.render(<ScrollPosition />, node);
-        }).toThrowError(
-            "No scrollController exist in context. Must wrap your application's <Parallax> components in a <ScrollProvider />."
-        );
-    });
-});
diff --git a/example/components/ParallaxTest/ParallaxTest.js b/example/components/ParallaxTest/ParallaxTest.js
index 5cef06ab6..f023b149c 100644
--- a/example/components/ParallaxTest/ParallaxTest.js
+++ b/example/components/ParallaxTest/ParallaxTest.js
@@ -1,12 +1,12 @@
-import React, { PureComponent } from 'react';
+import React, { Component } from 'react';
 import { PropTypes } from 'prop-types';
 import Element from '../Element/Element.js';
 import { Parallax } from 'react-scroll-parallax';
 import style from './ParallaxTest.scss';
 
-const START_NUM_ELEMENTS = 50;
+const START_NUM_ELEMENTS = 1;
 
-export default class ParallaxTest extends PureComponent {
+export default class ParallaxTest extends Component {
     static contextTypes = {
         scrollController: PropTypes.object,
     };
@@ -45,21 +45,16 @@ export default class ParallaxTest extends PureComponent {
     };
 
     mapToParallax() {
-        let row = 0;
         return this.state.elements.map((number, i) => {
             const odd = i % 2 ? -1 : 1;
-            const offset = 200;
+            const offset = 40;
 
-            row = i % 4 === 0 ? row + 1 : row;
-
-            const props = {};
-            if (row % 3) {
-                props.x = [-offset * odd, offset * odd];
-            } else if (row % 2) {
-                props.y = [-offset * odd, offset * odd];
-            } else {
-                props.z = [-offset * odd, offset * odd];
-            }
+            const props = {
+                x: [-offset * odd + 'px', offset * odd + 'px'],
+                y: [-offset * odd + 'px', offset * odd + 'px'],
+                scale: [2, 1],
+                opacity: [1, 1],
+            };
 
             return (
                 <Parallax key={i} className={style.item} {...props}>
@@ -72,9 +67,7 @@ export default class ParallaxTest extends PureComponent {
     render() {
         return (
             <div className={style.parallaxTest}>
-                <main className={style.items}>
-                    {this.mapToParallax()}
-                </main>
+                <main className={style.items}>{this.mapToParallax()}</main>
                 <nav className={style.buttons}>
                     <div className={style.currentState}>
                         <h4>
@@ -86,14 +79,10 @@ export default class ParallaxTest extends PureComponent {
                         <button onClick={this.handleAdd}>Add</button>
                         <button onClick={this.handleRemove}>Remove</button>
                     </div>
-                    <div className={style.currentState}>
-                        <h4>
-                            Destroys the scrollController. :-(
-                        </h4>
-                        <button onClick={this.triggerDestroy}>
-                            Destroy
-                        </button>
-                    </div>
+                    {/*<div className={style.currentState}>
+                        <h4>Destroys the scrollController. :-(</h4>
+                        <button onClick={this.triggerDestroy}>Destroy</button>
+                    </div>*/}
                 </nav>
             </div>
         );
diff --git a/package.json b/package.json
index 164d76d6f..56b7ee8dd 100644
--- a/package.json
+++ b/package.json
@@ -1,63 +1,58 @@
 {
-  "name": "react-scroll-parallax",
-  "version": "1.0.0-beta.0",
-  "description": "React component to create parallax scrolling effects",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/jscottsmith/react-scroll-parallax"
-  },
-  "main": "lib/index.js",
-  "scripts": {
-    "dev": "jest && webpack --progress --colors --watch",
-    "dev-server": "node ./example/dist/server",
-    "gh-pages": "NODE_ENV=production webpack --progress --colors",
-    "test": "jest",
-    "test:watch": "jest --watch",
-    "prettier": "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
-    "prepublish": "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports"
-  },
-  "jest": {
-    "modulePaths": [
-      "<rootDir>/src/"
-    ]
-  },
-  "keywords": [
-    "react",
-    "parallax",
-    "scroll",
-    "component"
-  ],
-  "author": "J Scott Smith",
-  "license": "ISC",
-  "dependencies": {
-    "prop-types": "^15.5.10",
-    "react": "^15.4.2",
-    "react-dom": "^15.4.2"
-  },
-  "devDependencies": {
-    "babel-cli": "^6.24.1",
-    "babel-core": "^6.23.1",
-    "babel-jest": "^20.0.3",
-    "babel-loader": "^6.3.2",
-    "babel-plugin-add-module-exports": "^0.2.1",
-    "babel-plugin-module-resolver": "^2.7.1",
-    "babel-preset-env": "^1.1.8",
-    "babel-preset-es2015": "^6.24.1",
-    "babel-preset-react": "^6.23.0",
-    "babel-preset-stage-0": "^6.24.1",
-    "cross-env": "^3.1.4",
-    "css-loader": "^0.28.0",
-    "express": "^4.14.1",
-    "intersection-observer": "^0.4.2",
-    "jest": "^20.0.4",
-    "node-sass": "^4.5.0",
-    "postcss-loader": "^1.3.3",
-    "react-test-renderer": "^15.6.1",
-    "regenerator-runtime": "^0.10.5",
-    "sass-loader": "^6.0.3",
-    "style-loader": "^0.16.1",
-    "webpack": "^2.2.1",
-    "webpack-merge": "^4.1.0",
-    "webpack-node-externals": "^1.5.4"
-  }
+    "name": "react-scroll-parallax",
+    "version": "1.0.0-beta.0",
+    "description": "React component to create parallax scrolling effects",
+    "repository": {
+        "type": "git",
+        "url": "https://github.com/jscottsmith/react-scroll-parallax"
+    },
+    "main": "lib/index.js",
+    "scripts": {
+        "dev": "jest && webpack --progress --colors --watch",
+        "dev-server": "node ./example/dist/server",
+        "gh-pages": "NODE_ENV=production webpack --progress --colors",
+        "test": "jest",
+        "test:watch": "jest --watch",
+        "prettier":
+            "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
+        "prepublish":
+            "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports"
+    },
+    "jest": {
+        "modulePaths": ["<rootDir>/src/"]
+    },
+    "keywords": ["react", "parallax", "scroll", "component"],
+    "author": "J Scott Smith",
+    "license": "ISC",
+    "dependencies": {
+        "prop-types": "^15.5.10",
+        "react": "^15.0.0",
+        "react-dom": "^15.0.0"
+    },
+    "devDependencies": {
+        "babel-cli": "^6.24.1",
+        "babel-core": "^6.23.1",
+        "babel-jest": "^20.0.3",
+        "babel-loader": "^6.3.2",
+        "babel-plugin-add-module-exports": "^0.2.1",
+        "babel-plugin-module-resolver": "^2.7.1",
+        "babel-preset-env": "^1.1.8",
+        "babel-preset-es2015": "^6.24.1",
+        "babel-preset-react": "^6.23.0",
+        "babel-preset-stage-0": "^6.24.1",
+        "cross-env": "^3.1.4",
+        "css-loader": "^0.28.0",
+        "express": "^4.14.1",
+        "intersection-observer": "^0.4.2",
+        "jest": "^20.0.4",
+        "node-sass": "^4.5.0",
+        "postcss-loader": "^1.3.3",
+        "react-test-renderer": "^15.6.1",
+        "regenerator-runtime": "^0.10.5",
+        "sass-loader": "^6.0.3",
+        "style-loader": "^0.16.1",
+        "webpack": "^2.2.1",
+        "webpack-merge": "^4.1.0",
+        "webpack-node-externals": "^1.5.4"
+    }
 }
diff --git a/src/components/Observed.js b/src/components/Observed.js
new file mode 100644
index 000000000..64165fc23
--- /dev/null
+++ b/src/components/Observed.js
@@ -0,0 +1,84 @@
+/* global IntersectionObserver */
+
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+
+// With Observer creates a new IntersectionObserver
+// that passes an `isInView` prop to wrapped components
+// IntersectionObserver will require a polyfill
+
+class Observed extends Component {
+    state = {
+        isInView: true, // initial state should be visible so that the scrollY is updated.
+    };
+
+    options = {
+        root: null, // document.querySelector('#scrollArea')
+        rootMargin: '0px',
+        threshold: [0.1, 0.2, 0.4, 0.6, 0.8, 1.0], // 1.0 = 100% of the el is visible, can be an array of values. callback is invoke when each is true
+    };
+
+    componentDidMount() {
+        this.createObserver();
+        this.observe();
+    }
+
+    componentWillUnmount() {
+        this.disconnectObserver();
+    }
+
+    mapRef = ref => {
+        // NOTE: This ref will be the bounds of the
+        // element and be provided by the withBounds HOC
+        this.el = ref;
+    };
+
+    createObserver() {
+        this.checkForObserver();
+
+        this.observer = new IntersectionObserver(
+            this.handleIntersection,
+            this.options
+        );
+    }
+
+    checkForObserver() {
+        // NOTE: Error handling if the observer is not available
+        // This should be provided by the user via a polyfill
+
+        const hasObserver = 'IntersectionObserver' in window;
+        if (!hasObserver) {
+            throw new Error(
+                'Must provide an IntersectionObserver polyfill for browsers that do not yet support the technology.'
+            );
+        }
+    }
+
+    disconnectObserver() {
+        if (this.observer) {
+            this.observer.disconnect();
+        }
+    }
+
+    observe() {
+        const el = this.el;
+        this.observer.observe(el);
+    }
+
+    handleIntersection = (entries, observer) => {
+        entries.forEach(entry => {
+            const isInView = entry.intersectionRatio > 0.01;
+
+            this.setState(() => ({ isInView }));
+        });
+    };
+
+    render() {
+        const { isInView } = this.state;
+        const { mapRef } = this;
+
+        return this.props.children({ isInView, mapRef });
+    }
+}
+
+export default Observed;
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index d167eab22..4520df707 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -1,20 +1,20 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
+import { parseUnit } from '../utils';
 import {
-    withScrollPosition,
-    withObserver,
-    withViewportProgress,
-    withBounds,
-} from '../hoc';
-import { scaleBetween, compose, parseUnit } from '../utils';
+    Observed,
+    ScrollPosition,
+    ScrollEffects,
+    ViewportProgress,
+} from './index.js';
 
 class Parallax extends Component {
     static propTypes = {
         children: PropTypes.node.isRequired,
-        progress: PropTypes.number.isRequired,
-        isInView: PropTypes.bool.isRequired,
+        className: PropTypes.string,
         x: PropTypes.array,
         y: PropTypes.array,
+        scale: PropTypes.array,
 
         // @TODO: these should also be available
         // scale
@@ -23,97 +23,215 @@ class Parallax extends Component {
         // tag/element name?
     };
 
+    state = {
+        boundsStyle: {},
+        boundingRect: null,
+    };
+
     componentDidMount() {
-        this.setup();
+        this.addListeners();
+        this.parseOffsetUnits();
+        this.setBoundsStyle();
     }
 
-    setup() {
-        const { x, y } = this.props;
+    componentWillUnmount() {
+        this.removeListeners();
+    }
 
+    addListeners() {
+        window.addEventListener('resize', this.handleResize, false);
+    }
+
+    removeListeners() {
+        window.removeEventListener('resize', this.handleResize, false);
+    }
+
+    parseOffsetUnits() {
+        // NOTE: same parseOffsetUnits function also occurs in <ScrollEffects>
+        // Consider DRYing this up somehow.
+        const { x, y } = this.props;
         this.offsets = {
-            x: x.map(f => parseUnit(f)),
-            y: y.map(f => parseUnit(f)),
+            x: x && x.map(f => parseUnit(f)),
+            y: y && y.map(f => parseUnit(f)),
         };
     }
 
-    scaleValues() {
-        const { progress } = this.props;
-        const { x: _x, y: _y } = this.offsets;
+    handleResize = () => {
+        this.setBoundsStyle();
+    };
+
+    mapRefElement = ref => {
+        this.el = ref;
+    };
 
-        // @TODO: allow numbers with units and parse to determine
+    mapRefViewportProgress = ref => {
+        this.viewportProgress = ref;
+    };
 
-        // Only scale a value if one exists
-        const hasX = typeof _x !== 'undefined';
-        const hasY = typeof _y !== 'undefined';
+    setBoundsStyle() {
+        // NOTE: This sets the state of style for the bounds element
+        // that will be observed by the IntersectionObserver
+        // It takes the offsets and resizes the bounds to
+        // account for x and y offsets as well as scale.
+
+        // @TODO: Consider revising this function.
+        // Break into multiple focused methods.
+        // Fix scaling. Needs the bounding rect
+        // without scaling applied when updating
+
+        const { x, y } = this.offsets;
+        const { scale } = this.props;
+        let { boundingRect } = this.state;
+
+        // NOTE: Temporary border added to debug
+        const border = '1px dotted lightgreen';
+
+        let paddingTop = 0;
+        let paddingBottom = 0;
+        let paddingLeft = 0;
+        let paddingRight = 0;
+
+        const hasScale = scale;
+        const hasYPercent = y[0].unit === '%';
+        const hasXPercent = x[0].unit === '%';
+
+        // NOTE: Only need the bounding rect if we are using percent
+        // as a unit, or scale as an effect. Also only want to get this
+        // on the initial mount when no styles have been applied.
+        if ((hasYPercent || hasXPercent || hasScale) && !boundingRect) {
+            boundingRect = this.el.getBoundingClientRect();
+            console.log(boundingRect);
+        }
 
-        let x = 0;
-        let y = 0;
+        if (y) {
+            const y0 = Math.abs(y[0].value);
+            const y1 = Math.abs(y[1].value);
+            paddingTop = hasYPercent ? y0 / 100 * boundingRect.height : y0;
+            paddingBottom = hasYPercent ? y1 / 100 * boundingRect.height : y1;
+        }
 
-        if (hasX) {
-            x = scaleBetween(progress, _x[0].value, _x[1].value, 1, 0);
+        if (x) {
+            const x0 = Math.abs(x[0].value);
+            const x1 = Math.abs(x[1].value);
+            paddingLeft = hasXPercent ? x0 / 100 * boundingRect.width : x0;
+            paddingRight = hasXPercent ? x1 / 100 * boundingRect.width : x1;
         }
-        if (hasY) {
-            y = scaleBetween(progress, _y[0].value, _y[1].value, 1, 0);
+
+        if (scale) {
+            const { width, height } = boundingRect;
+            const scaleMax = Math.max(scale[0], scale[1]);
+            const halfDeltaX = (width * scaleMax - width) / 2;
+            const halfDeltaY = (height * scaleMax - height) / 2;
+
+            paddingTop = paddingTop + halfDeltaY;
+            paddingBottom = paddingBottom + halfDeltaY;
+            paddingLeft = paddingLeft + halfDeltaX;
+            paddingRight = paddingRight + halfDeltaX;
         }
 
-        return {
-            x: {
-                value: x,
-                unit: _x[0].unit,
-            },
-            y: {
-                value: y,
-                unit: _y[0].unit,
-            },
+        // NOTE: set negative margins based on padding
+        const marginTop = paddingTop * -1;
+        const marginBottom = paddingBottom * -1;
+        const marginLeft = paddingLeft * -1;
+        const marginRight = paddingRight * -1;
+
+        const boundsStyle = {
+            marginTop,
+            marginBottom,
+            marginLeft,
+            marginRight,
+            paddingTop,
+            paddingBottom,
+            paddingLeft,
+            paddingRight,
+            border,
         };
+
+        this.setState(
+            () => ({
+                boundsStyle,
+                boundingRect,
+            }),
+            // NOTE: Since ViewportProgress caches the initial bounds on mount
+            // it needs to be updated once the bounds style is updated
+            // with the correct size that accounts for offsets.
+            this.viewportProgress.updateAttributeCache
+        );
     }
 
-    getStyles() {
-        const { x, y } = this.scaleValues();
+    renderMarkup(isInView, style, refCallbacks) {
+        const { children, className } = this.props;
+        const wrapperClass = isInView
+            ? `${className} parallax-wrapper is-in-view`
+            : `${className} parallax-wrapper`;
 
-        return {
-            transform: `translate3d(${x.value}${x.unit}, ${y.value}${y.unit}, 0)`,
-        };
+        return (
+            <div className={wrapperClass}>
+                <div
+                    className="parallax-bounds"
+                    style={this.state.boundsStyle}
+                    // This calls each ref callback provided
+                    ref={ref => refCallbacks.forEach(f => f(ref))}
+                >
+                    <div
+                        style={style}
+                        className="parallax-element"
+                        ref={this.mapRefElement}
+                    >
+                        {children}
+                    </div>
+                </div>
+            </div>
+        );
     }
 
     render() {
-        const { children } = this.props;
-
-        const style = this.getStyles();
-
-        const baseClass = 'parallax-element';
+        // NOTE: Each component in this tree provides a render
+        // callback with necessary params to provide as props
+        // for the child component
+        //
+        // Observed => isInView, mapRef
+        // ↓
+        // ScrollPosition => scrollY
+        // ↓
+        // ViewportProgress => progress, mapRef
+        // ↓
+        // ScrollEffects => style
+        // ↓
+        // renderMarkup(isInView, style, refCallbacks)
 
         return (
-            <div style={style} className={baseClass}>
-                {children}
-            </div>
+            <Observed>
+                {({ isInView, mapRef: mapRefObserved }) => (
+                    <ScrollPosition isInView={isInView}>
+                        {({ scrollY }) => (
+                            <ViewportProgress
+                                ref={this.mapRefViewportProgress}
+                                isInView={isInView}
+                                scrollY={scrollY}
+                            >
+                                {({
+                                    progress,
+                                    mapRef: mapRefViewportProgress,
+                                }) => (
+                                    <ScrollEffects
+                                        progress={progress}
+                                        {...this.props}
+                                    >
+                                        {({ style }) =>
+                                            this.renderMarkup(isInView, style, [
+                                                mapRefObserved,
+                                                mapRefViewportProgress,
+                                            ])}
+                                    </ScrollEffects>
+                                )}
+                            </ViewportProgress>
+                        )}
+                    </ScrollPosition>
+                )}
+            </Observed>
         );
     }
 }
 
-// Compose together all HOCs
-// The order of which is important since
-// some rely on props provided by the others.
-// Each decorator provides a necessary
-// prop -- or element -- required by the
-// <Parallax> component.
-//
-// |
-// withObserver () => {isInView}
-// |
-// withScrollPosition (isInView) => if (isInView) {scrollY}
-// |
-// withViewportProgress (isInView, scrollY) => return {progress}
-// |
-// withBounds (innerRef) => bounds (ref)
-// |
-// <Parallax>
-
-const decorators = compose(
-    withObserver,
-    withScrollPosition,
-    withViewportProgress,
-    withBounds
-);
-
-export default decorators(Parallax);
+export default Parallax;
diff --git a/src/components/ScrollEffects.js b/src/components/ScrollEffects.js
new file mode 100644
index 000000000..86a2ad0c4
--- /dev/null
+++ b/src/components/ScrollEffects.js
@@ -0,0 +1,104 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { scaleBetween, parseUnit } from '../utils';
+
+const defaultVal = {
+    value: 0,
+    unit: 'px',
+};
+
+const defaultValNoUnit = {
+    value: 1,
+    unit: '',
+};
+
+class ScrollEffects extends Component {
+    static propTypes = {
+        progress: PropTypes.number.isRequired,
+        x: PropTypes.array,
+        y: PropTypes.array,
+        scale: PropTypes.array,
+        opacity: PropTypes.array,
+        children: PropTypes.func.isRequired,
+    };
+
+    componentWillMount() {
+        this.parseOffsetUnits();
+    }
+
+    parseOffsetUnits() {
+        const { x, y } = this.props;
+        this.offsets = {
+            x: x && x.map(f => parseUnit(f)),
+            y: y && y.map(f => parseUnit(f)),
+        };
+    }
+
+    scaleValues() {
+        const { progress, opacity, scale } = this.props;
+        const { x, y } = this.offsets;
+
+        // Only scale a value if one exists
+        const hasX = typeof x !== 'undefined';
+        const hasY = typeof y !== 'undefined';
+        const hasScale = typeof scale !== 'undefined';
+        const hasOpacity = typeof opacity !== 'undefined';
+
+        const values = {
+            x: defaultVal,
+            y: defaultVal,
+            scale: defaultValNoUnit,
+            opacity: defaultValNoUnit,
+        };
+
+        if (hasX) {
+            values.x = {
+                value: scaleBetween(progress, x[0].value, x[1].value, 1, 0),
+                unit: x[0].unit,
+            };
+        }
+        if (hasY) {
+            values.y = {
+                value: scaleBetween(progress, y[0].value, y[1].value, 1, 0),
+                unit: y[0].unit,
+            };
+        }
+        if (hasScale) {
+            values.scale = {
+                value: scaleBetween(progress, scale[0], scale[1], 1, 0),
+                unit: null,
+            };
+        }
+        if (hasOpacity) {
+            values.opacity = {
+                value: scaleBetween(progress, opacity[0], opacity[1], 1, 0),
+                unit: null,
+            };
+        }
+
+        return values;
+    }
+
+    getStyles() {
+        const { x, y, opacity, scale } = this.scaleValues();
+
+        const translateTransform =
+            x.value || y.value
+                ? `translate3d(${x.value}${x.unit}, ${y.value}${y.unit}, 0)`
+                : '';
+        const scaleTransform = scale.value ? `scale(${scale.value})` : '';
+
+        return {
+            opacity: opacity.value,
+            transform: `${translateTransform} ${scaleTransform}`,
+        };
+    }
+
+    render() {
+        const style = this.getStyles();
+
+        return this.props.children({ style });
+    }
+}
+
+export default ScrollEffects;
diff --git a/src/components/ScrollPosition.js b/src/components/ScrollPosition.js
new file mode 100644
index 000000000..5dbe5b499
--- /dev/null
+++ b/src/components/ScrollPosition.js
@@ -0,0 +1,75 @@
+import React, { PureComponent } from 'react';
+import PropTypes from 'prop-types';
+import { ScrollController } from 'react-scroll-parallax';
+
+// This HOC serves to connect a component via context
+// to the ScrollController which provides the current
+// scroll state that is then passed as props to the
+// <WrappedComponent />.
+
+// NOTE: Since the scroll state should only be updated when
+// the element is in view, this HOC should be composed
+// within a withObserver() HOC.
+
+class ScrollPosition extends PureComponent {
+    static contextTypes = {
+        scrollController: PropTypes.object, // not required because this could be rendered on the server.
+    };
+
+    static propTypes = {
+        isInView: PropTypes.bool.isRequired,
+    };
+
+    state = {
+        scrollY: 0, // value for server so no required props throw
+    };
+
+    componentWillMount() {
+        const { scrollController } = this.context;
+
+        // Make sure this is server safe
+        const hasWindow = typeof window !== 'undefined';
+
+        // Make sure the provided context is an instance of the controller
+        const hasController = scrollController instanceof ScrollController;
+
+        // if this has the window and no controller throw an error
+        if (hasWindow && !hasController) {
+            throw new Error(
+                "No scrollController exist in context. Must wrap your application's <Parallax> components in a <ScrollProvider />."
+            );
+        }
+
+        // Subscribe to scroll updates by passing
+        // a handler to setState of current scroll
+        if (hasWindow) {
+            scrollController.subscribe(this.updateScroll);
+        }
+    }
+
+    componentWillUnmount() {
+        const { scrollController } = this.context;
+
+        // Unsubscribe to scroll updates by passing
+        // the subscribed scroll handler
+        scrollController.unsubscribe(this.updateScroll);
+    }
+
+    updateScroll = ({ scrollY }) => {
+        const { isInView } = this.props;
+
+        // only updates the scrollY when the element is in view
+        if (isInView) {
+            this.setState(() => ({
+                scrollY,
+            }));
+        }
+    };
+
+    render() {
+        const { scrollY } = this.state;
+        return this.props.children({ scrollY });
+    }
+}
+
+export default ScrollPosition;
diff --git a/src/components/ViewportProgress.js b/src/components/ViewportProgress.js
new file mode 100644
index 000000000..bd5ce3ef9
--- /dev/null
+++ b/src/components/ViewportProgress.js
@@ -0,0 +1,138 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import clamp from '../utils/clamp';
+
+// With Viewport Progress passes the progress prop
+// to wrapped components with a value ranging from
+// 0–1. 0 if the elements bounds has not entered
+// the beginning of the scroll area, 1 if the
+// element has left.
+
+class ViewportProgress extends Component {
+    static defaultProps = {
+        range: [0, 1],
+    };
+
+    static propTypes = {
+        isInView: PropTypes.bool.isRequired,
+        range: PropTypes.array.isRequired,
+        scrollY: PropTypes.number.isRequired,
+    };
+
+    constructor(props) {
+        super();
+        this.state = {
+            progress: props.range[0],
+            resizeKey: null, // a key to trigger a state change when the window resizes
+        };
+    }
+
+    componentDidMount() {
+        this.setAttributeCache();
+        this.setProgress();
+        this.addListeners();
+    }
+
+    componentWillReceiveProps(nextProps) {
+        // if the scroll has changed, and the
+        // element is in view start updating state
+        // console.log(nextProps.scrollY);
+        if (nextProps.isInView && nextProps.scrollY !== this.props.scrollY) {
+            this.setProgress();
+        }
+    }
+
+    componentWillUnmount() {
+        this.removeListeners();
+    }
+
+    addListeners() {
+        window.addEventListener('resize', this.handleResize, false);
+    }
+
+    removeListeners() {
+        window.removeEventListener('resize', this.handleResize, false);
+    }
+
+    updateAttributeCache = () => {
+        this.setAttributeCache();
+    };
+
+    handleResize = () => {
+        const resizeKey = `resize-${window.innerWidth}`;
+
+        this.setState(
+            () => ({
+                resizeKey,
+            }),
+            this.setAttributeCache // update cached attributes
+        );
+    };
+
+    mapRef = ref => {
+        this.el = ref;
+    };
+
+    setAttributeCache() {
+        // This caches properties that cause layout thrash
+
+        // Accessing the el withBounds() HOC
+        const el = this.el;
+
+        const _rect = el.getBoundingClientRect();
+        const elHeight = el.offsetHeight;
+        const elWidth = el.offsetWidth;
+        const scrollY = window.pageYOffset;
+        const html = document.documentElement;
+        const windowHeight = window.innerHeight || html.clientHeight;
+        const totalDist = windowHeight + elHeight;
+
+        // add current scroll state
+        const rect = {
+            top: _rect.top + scrollY,
+            bottom: _rect.bottom + scrollY,
+            left: _rect.left,
+            right: _rect.right,
+        };
+
+        this.cache = {
+            rect,
+            elHeight,
+            elWidth,
+            scrollY,
+            windowHeight,
+            totalDist,
+        };
+
+        // console.log('<ViewportProgress> cache updated');
+    }
+
+    setProgress() {
+        const currentScroll = window.pageYOffset;
+        const top = this.cache.rect.top - currentScroll; // this was the cached value so subtract the current scroll
+        const { totalDist, windowHeight } = this.cache;
+
+        // Percent the element has moved based on current and total distance to move
+        let progress = 1 - (windowHeight - top) / totalDist;
+
+        // NOTE: Clamping
+        // Why? Because the isInView prop may be *slightly*
+        // off since Intersection Observer to be pixel-perfect
+        // accurate regardless.
+
+        progress = clamp(progress, 0, 1);
+
+        this.setState(() => ({
+            progress,
+        }));
+    }
+
+    render() {
+        const { progress } = this.state;
+        const { mapRef } = this;
+
+        return this.props.children({ progress, mapRef });
+    }
+}
+
+export default ViewportProgress;
diff --git a/src/components/index.js b/src/components/index.js
index 45d5edf4d..53c693323 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -1,3 +1,7 @@
 // Components
-export ScrollProvider from './ScrollProvider.js';
+export Observed from './Observed.js';
 export Parallax from './Parallax.js';
+export ScrollEffects from './ScrollEffects.js';
+export ScrollPosition from './ScrollPosition.js';
+export ScrollProvider from './ScrollProvider.js';
+export ViewportProgress from './ViewportProgress.js';
diff --git a/src/hoc/index.js b/src/hoc/index.js
deleted file mode 100644
index c8321dae9..000000000
--- a/src/hoc/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-// HOC
-export withScrollPosition from './withScrollPosition.js';
-export withViewportProgress from './withViewportProgress.js';
-export withObserver from './withObserver.js';
-export withBounds from './withBounds.js';
diff --git a/src/hoc/withBounds.js b/src/hoc/withBounds.js
deleted file mode 100644
index 195a1b685..000000000
--- a/src/hoc/withBounds.js
+++ /dev/null
@@ -1,101 +0,0 @@
-import React, { PureComponent } from 'react';
-import PropTypes from 'prop-types';
-
-// NOTE: The with bounds HOC wraps a component
-// and provides the bounds to be observed
-// based upon the [x, y] translations. This HOC
-// should be composed within the withObserver().
-
-// @TODO: Hopefully this can also account
-// for future props past to parallax element
-// like scale and rotation. Not going to handle
-// z because that requires knowing the perspective
-// and would be difficult to calculate the bounds
-//
-// Currently the bounds only accounts for x, y
-
-function withBounds(WrappedComponent) {
-    return class Bounds extends PureComponent {
-        static propTypes = {
-            className: PropTypes.string,
-            isInView: PropTypes.bool.isRequired,
-            innerRef: PropTypes.func.isRequired,
-            x: PropTypes.array,
-            y: PropTypes.array,
-        };
-
-        getBoundsStyle() {
-            // @TODO: Cache these values, only
-            // update if relevant props have updated
-
-            const { x, y } = this.props;
-
-            // NOTE: Temporary border added to debug
-            let border;
-            if (this.props.isInView) {
-                border = '1px dotted lightgreen';
-            } else {
-                border = '1px dotted tomato';
-            }
-
-            let marginTop = 0;
-            let marginBottom = 0;
-            let marginLeft = 0;
-            let marginRight = 0;
-
-            let paddingTop = 0;
-            let paddingBottom = 0;
-            let paddingLeft = 0;
-            let paddingRight = 0;
-
-            if (y) {
-                const y0 = Math.abs(y[0]) * -1;
-                const y1 = Math.abs(y[1]) * -1;
-                marginTop = `${y0}px`;
-                marginBottom = `${y1}px`;
-                paddingTop = `${Math.abs(y0)}px`;
-                paddingBottom = `${Math.abs(y1)}px`;
-            }
-
-            if (x) {
-                const x0 = Math.abs(x[0]) * -1;
-                const x1 = Math.abs(x[1]) * -1;
-                marginLeft = `${x0}px`;
-                marginRight = `${x1}px`;
-                paddingLeft = `${Math.abs(x0)}px`;
-                paddingRight = `${Math.abs(x1)}px`;
-            }
-
-            return {
-                marginTop,
-                marginBottom,
-                marginLeft,
-                marginRight,
-                paddingTop,
-                paddingBottom,
-                paddingLeft,
-                paddingRight,
-                border,
-            };
-        }
-
-        render() {
-            const { className, innerRef, isInView } = this.props;
-            const _className = isInView ? `${className} is-in-view` : className;
-
-            return (
-                <div className={_className}>
-                    <div
-                        className="parallax-bounds"
-                        style={this.getBoundsStyle()}
-                        ref={innerRef}
-                    >
-                        <WrappedComponent {...this.props} />
-                    </div>
-                </div>
-            );
-        }
-    };
-}
-
-export default withBounds;
diff --git a/src/hoc/withObserver.js b/src/hoc/withObserver.js
deleted file mode 100644
index b8327d4f6..000000000
--- a/src/hoc/withObserver.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/* global IntersectionObserver */
-
-import React, { PureComponent } from 'react';
-import PropTypes from 'prop-types';
-
-// With Observer creates a new IntersectionObserver
-// that passes an `isInView` prop to wrapped components
-// IntersectionObserver will require a polyfill
-
-function withObserver(
-    WrappedComponent,
-    options = {
-        root: null, // document.querySelector('#scrollArea')
-        rootMargin: '0px',
-        threshold: [0, 0.2, 0.4, 0.6, 0.8, 1.0], // 1.0 = 100% of the el is visible, can be an array of values. callback is invoke when each is true
-    }
-) {
-    return class Observed extends PureComponent {
-        state = {
-            isInView: true, // initial state should be visible so that the scrollY is updated.
-        };
-
-        componentDidMount() {
-            this.createObserver();
-            this.observe();
-        }
-
-        componentWillUnmount() {
-            this.disconnectObserver();
-        }
-
-        mapInnerRef = ref => {
-            // NOTE: This ref will be the bounds of the
-            // element and be provided by the withBounds HOC
-            this.el = ref;
-        };
-
-        createObserver() {
-            this.checkForObserver();
-
-            this.observer = new IntersectionObserver(
-                this.handleIntersection,
-                options
-            );
-        }
-
-        checkForObserver() {
-            // NOTE: Error handling if the observer is not available
-            // This should be provided by the user via a polyfill
-
-            const hasObserver = 'IntersectionObserver' in window;
-            if (!hasObserver) {
-                throw new Error(
-                    'Must provide an IntersectionObserver polyfill for browsers that do not yet support the technology.'
-                );
-            }
-        }
-
-        disconnectObserver() {
-            if (this.observer) {
-                this.observer.disconnect();
-            }
-        }
-
-        observe() {
-            const el = this.el;
-            this.observer.observe(el);
-        }
-
-        handleIntersection = (entries, observer) => {
-            entries.forEach(entry => {
-                const isInView = entry.intersectionRatio > 0.01;
-
-                this.setState(() => ({ isInView }));
-            });
-        };
-
-        render() {
-            const { isInView } = this.state;
-
-            return (
-                <WrappedComponent
-                    isInView={isInView}
-                    innerRef={this.mapInnerRef}
-                    {...this.props}
-                />
-            );
-        }
-    };
-}
-
-export default withObserver;
diff --git a/src/hoc/withScrollPosition.js b/src/hoc/withScrollPosition.js
deleted file mode 100644
index f49c63f4e..000000000
--- a/src/hoc/withScrollPosition.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import React, { PureComponent } from 'react';
-import PropTypes from 'prop-types';
-import { ScrollController } from 'react-scroll-parallax';
-
-// This HOC serves to connect a component via context
-// to the ScrollController which provides the current
-// scroll state that is then passed as props to the
-// <WrappedComponent />.
-
-// NOTE: Since the scroll state should only be updated when
-// the element is in view, this HOC should be composed
-// within a withObserver() HOC.
-
-function withScrollPosition(WrappedComponent) {
-    return class ScrollPosition extends PureComponent {
-        static contextTypes = {
-            scrollController: PropTypes.object, // not required because this could be rendered on the server.
-        };
-
-        static propTypes = {
-            isInView: PropTypes.bool.isRequired,
-        };
-
-        state = {
-            scrollY: 0, // value for server so no required props throw
-        };
-
-        componentWillMount() {
-            const { scrollController } = this.context;
-
-            // Make sure this is server safe
-            const hasWindow = typeof window !== 'undefined';
-
-            // Make sure the provided context is an instance of the controller
-            const hasController = scrollController instanceof ScrollController;
-
-            // if this has the window and no controller throw an error
-            if (hasWindow && !hasController) {
-                throw new Error(
-                    "No scrollController exist in context. Must wrap your application's <Parallax> components in a <ScrollProvider />."
-                );
-            }
-
-            // Subscribe to scroll updates by passing
-            // a handler to setState of current scroll
-            if (hasWindow) {
-                scrollController.subscribe(this.updateScroll);
-            }
-        }
-
-        componentWillUnmount() {
-            const { scrollController } = this.context;
-
-            // Unsubscribe to scroll updates by passing
-            // the subscribed scroll handler
-            scrollController.unsubscribe(this.updateScroll);
-        }
-
-        updateScroll = ({ scrollY }) => {
-            const { isInView } = this.props;
-
-            // only updates the scrollY when the element is in view
-            if (isInView) {
-                this.setState(() => ({
-                    scrollY,
-                }));
-            }
-        };
-
-        render() {
-            const { scrollY } = this.state;
-            return <WrappedComponent scrollY={scrollY} {...this.props} />;
-        }
-    };
-}
-
-export default withScrollPosition;
diff --git a/src/hoc/withViewportProgress.js b/src/hoc/withViewportProgress.js
deleted file mode 100644
index ab923c284..000000000
--- a/src/hoc/withViewportProgress.js
+++ /dev/null
@@ -1,141 +0,0 @@
-import React, { PureComponent } from 'react';
-import PropTypes from 'prop-types';
-import clamp from '../utils/clamp';
-
-// With Viewport Progress passes the progress prop
-// to wrapped components with a value ranging from
-// 0–1. 0 if the elements bounds has not entered
-// the beginning of the scroll area, 1 if the
-// element has left.
-
-function withViewportProgress(WrappedComponent, range = [0, 1]) {
-    return class ViewportProgress extends PureComponent {
-        static propTypes = {
-            scrollY: PropTypes.number.isRequired,
-        };
-
-        state = {
-            progress: range[0],
-            resizeKey: null, // a key to trigger a state change when the window resizes
-        };
-
-        componentDidMount() {
-            this.setAttributeCache();
-            this.setProgress();
-            this.addListeners();
-        }
-
-        componentWillUnmount() {
-            this.removeListeners();
-        }
-
-        componentWillReceiveProps(nextProps) {
-            // if the scroll has changed, and the
-            // element is in view start updating state
-            // console.log(nextProps.scrollY);
-            if (
-                nextProps.isInView &&
-                nextProps.scrollY !== this.props.scrollY
-            ) {
-                this.setProgress();
-            }
-        }
-
-        addListeners() {
-            window.addEventListener('resize', this.handleResize, false);
-        }
-
-        removeListeners() {
-            window.removeEventListener('resize', this.handleResize, false);
-        }
-
-        handleResize = () => {
-            const resizeKey = `resize-${window.innerWidth}`;
-
-            this.setState(
-                () => ({
-                    resizeKey,
-                }),
-                this.setAttributeCache // update cached attributes
-            );
-        };
-
-        mapInnerRef = ref => {
-            this.el = ref;
-
-            // NOTE: Since this HOC is composed within
-            // another that is also accessing via an
-            // innerRef function, we need to call the
-            // on via this component props since it will
-            // the prop will be overwritten by this component
-
-            if (this.props.innerRef) {
-                this.props.innerRef(ref);
-            }
-        };
-
-        setAttributeCache() {
-            // This caches properties that cause layout thrash
-
-            // Accessing the el withBounds() HOC
-            const el = this.el;
-
-            const _rect = el.getBoundingClientRect();
-            const elHeight = el.offsetHeight;
-            const elWidth = el.offsetWidth;
-            const scrollY = window.pageYOffset;
-            const html = document.documentElement;
-            const windowHeight = window.innerHeight || html.clientHeight;
-            const totalDist = windowHeight + elHeight;
-
-            // add current scroll state
-            const rect = {
-                top: _rect.top + scrollY,
-                bottom: _rect.bottom + scrollY,
-                left: _rect.left,
-                right: _rect.right,
-            };
-
-            this.cache = {
-                rect,
-                elHeight,
-                elWidth,
-                scrollY,
-                windowHeight,
-                totalDist,
-            };
-        }
-
-        setProgress() {
-            const currentScroll = window.pageYOffset;
-            const top = this.cache.rect.top - currentScroll; // this was the cached value so subtract the current scroll
-            const { totalDist, windowHeight } = this.cache;
-
-            // Percent the element has moved based on current and total distance to move
-            let progress = 1 - (windowHeight - top) / totalDist;
-
-            // NOTE: Clamping
-            // Why? Because the isInView prop may be *slightly*
-            // off since Intersection Observer to be pixel-perfect
-            // accurate regardless.
-
-            progress = clamp(progress, 0, 1);
-
-            this.setState(() => ({
-                progress,
-            }));
-        }
-
-        render() {
-            const { progress } = this.state;
-            const props = Object.assign({}, this.props, {
-                innerRef: this.mapInnerRef,
-                progress,
-            });
-
-            return <WrappedComponent {...props} />;
-        }
-    };
-}
-
-export default withViewportProgress;
diff --git a/src/index.js b/src/index.js
index 9611481b2..88a72f78b 100644
--- a/src/index.js
+++ b/src/index.js
@@ -4,9 +4,3 @@ export Parallax from './components/Parallax.js';
 
 // Models
 export ScrollController from './models/ScrollController.js';
-
-// HOC
-export withScrollPosition from './hoc/withScrollPosition.js';
-export withViewportProgress from './hoc/withViewportProgress.js';
-export withObserver from './hoc/withObserver.js';
-export withBounds from './hoc/withBounds.js';

From 1260f9ca15059ca52493ce720095ffe5e3826bf7 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 6 Nov 2017 12:16:39 -0800
Subject: [PATCH 071/158] default `parseUnit` to px

---
 src/utils/parseUnit.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/utils/parseUnit.js b/src/utils/parseUnit.js
index b1f469812..ccc8c3d18 100644
--- a/src/utils/parseUnit.js
+++ b/src/utils/parseUnit.js
@@ -1,6 +1,6 @@
-export function parseUnit(str, out) {
+export default function parseUnit(str, out) {
     if (!out) {
-        out = { value: 0, unit: '' };
+        out = { value: 0, unit: 'px' };
     }
 
     str = String(str);
@@ -8,7 +8,7 @@ export function parseUnit(str, out) {
     const value = parseFloat(str, 10);
 
     out.value = value;
-    out.unit = str.match(/[\d.\-\+]*\s*(.*)/)[1] || '';
+    out.unit = str.match(/[\d.\-\+]*\s*(.*)/)[1] || 'px';
 
     return out;
 }

From 8f222fb002755cd9611322d5291d894c64dc3749 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 6 Nov 2017 12:35:15 -0800
Subject: [PATCH 072/158] cleanup Parallax notes, simplify var names, remove
 log

---
 src/components/Parallax.js | 73 +++++++++++++++++---------------------
 1 file changed, 33 insertions(+), 40 deletions(-)

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 4520df707..d66c172fd 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -15,11 +15,9 @@ class Parallax extends Component {
         x: PropTypes.array,
         y: PropTypes.array,
         scale: PropTypes.array,
-
-        // @TODO: these should also be available
-        // scale
+        opacity: PropTypes.array,
+        // @TODO: these should also be available:
         // rotation
-        // opacity
         // tag/element name?
     };
 
@@ -69,10 +67,10 @@ class Parallax extends Component {
     };
 
     setBoundsStyle() {
-        // NOTE: This sets the state of style for the bounds element
-        // that will be observed by the IntersectionObserver
-        // It takes the offsets and resizes the bounds to
-        // account for x and y offsets as well as scale.
+        // NOTE: This sets the state of style for the bounds
+        // element that will be observed by the IntersectionObserver
+        // It takes the parallax props and resizes the bounds
+        // to account for x and y offsets as well as scale.
 
         // @TODO: Consider revising this function.
         // Break into multiple focused methods.
@@ -86,35 +84,35 @@ class Parallax extends Component {
         // NOTE: Temporary border added to debug
         const border = '1px dotted lightgreen';
 
-        let paddingTop = 0;
-        let paddingBottom = 0;
-        let paddingLeft = 0;
-        let paddingRight = 0;
+        let top = 0;
+        let bottom = 0;
+        let left = 0;
+        let right = 0;
 
         const hasScale = scale;
         const hasYPercent = y[0].unit === '%';
         const hasXPercent = x[0].unit === '%';
 
         // NOTE: Only need the bounding rect if we are using percent
-        // as a unit, or scale as an effect. Also only want to get this
-        // on the initial mount when no styles have been applied.
+        // as a unit, or scale as an effect. Also only want to get
+        // this on the initial mount when no styles have been applied.
         if ((hasYPercent || hasXPercent || hasScale) && !boundingRect) {
             boundingRect = this.el.getBoundingClientRect();
-            console.log(boundingRect);
+            // console.log(boundingRect);
         }
 
         if (y) {
             const y0 = Math.abs(y[0].value);
             const y1 = Math.abs(y[1].value);
-            paddingTop = hasYPercent ? y0 / 100 * boundingRect.height : y0;
-            paddingBottom = hasYPercent ? y1 / 100 * boundingRect.height : y1;
+            top = hasYPercent ? y0 / 100 * boundingRect.height : y0;
+            bottom = hasYPercent ? y1 / 100 * boundingRect.height : y1;
         }
 
         if (x) {
             const x0 = Math.abs(x[0].value);
             const x1 = Math.abs(x[1].value);
-            paddingLeft = hasXPercent ? x0 / 100 * boundingRect.width : x0;
-            paddingRight = hasXPercent ? x1 / 100 * boundingRect.width : x1;
+            left = hasXPercent ? x0 / 100 * boundingRect.width : x0;
+            right = hasXPercent ? x1 / 100 * boundingRect.width : x1;
         }
 
         if (scale) {
@@ -123,27 +121,21 @@ class Parallax extends Component {
             const halfDeltaX = (width * scaleMax - width) / 2;
             const halfDeltaY = (height * scaleMax - height) / 2;
 
-            paddingTop = paddingTop + halfDeltaY;
-            paddingBottom = paddingBottom + halfDeltaY;
-            paddingLeft = paddingLeft + halfDeltaX;
-            paddingRight = paddingRight + halfDeltaX;
+            top = top + halfDeltaY;
+            bottom = bottom + halfDeltaY;
+            left = left + halfDeltaX;
+            right = right + halfDeltaX;
         }
 
-        // NOTE: set negative margins based on padding
-        const marginTop = paddingTop * -1;
-        const marginBottom = paddingBottom * -1;
-        const marginLeft = paddingLeft * -1;
-        const marginRight = paddingRight * -1;
-
         const boundsStyle = {
-            marginTop,
-            marginBottom,
-            marginLeft,
-            marginRight,
-            paddingTop,
-            paddingBottom,
-            paddingLeft,
-            paddingRight,
+            marginTop: top * -1,
+            marginBottom: bottom * -1,
+            marginLeft: left * -1,
+            marginRight: right * -1,
+            paddingTop: top,
+            paddingBottom: bottom,
+            paddingLeft: left,
+            paddingRight: right,
             border,
         };
 
@@ -152,9 +144,10 @@ class Parallax extends Component {
                 boundsStyle,
                 boundingRect,
             }),
-            // NOTE: Since ViewportProgress caches the initial bounds on mount
-            // it needs to be updated once the bounds style is updated
-            // with the correct size that accounts for offsets.
+            // NOTE: Since ViewportProgress caches the initial
+            // bounds on mount it needs to be updated once the
+            // bounds style is updated with the correct size
+            // that accounts for offsets.
             this.viewportProgress.updateAttributeCache
         );
     }

From dba01ea850c1ba98b1fdcc5dd4b950ef2b2ca897 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 6 Nov 2017 12:41:29 -0800
Subject: [PATCH 073/158] add `parseOffsetUnits` util and use in ScrollEffects
 and Parallax

---
 src/components/Parallax.js      | 10 ++--------
 src/components/ScrollEffects.js |  8 ++------
 src/utils/index.js              |  1 +
 src/utils/parseOffsetUnits.js   |  9 +++++++++
 4 files changed, 14 insertions(+), 14 deletions(-)
 create mode 100644 src/utils/parseOffsetUnits.js

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index d66c172fd..68f18da95 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -1,6 +1,6 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-import { parseUnit } from '../utils';
+import { parseOffsetUnits } from '../utils';
 import {
     Observed,
     ScrollPosition,
@@ -45,13 +45,7 @@ class Parallax extends Component {
     }
 
     parseOffsetUnits() {
-        // NOTE: same parseOffsetUnits function also occurs in <ScrollEffects>
-        // Consider DRYing this up somehow.
-        const { x, y } = this.props;
-        this.offsets = {
-            x: x && x.map(f => parseUnit(f)),
-            y: y && y.map(f => parseUnit(f)),
-        };
+        this.offsets = parseOffsetUnits(this.props);
     }
 
     handleResize = () => {
diff --git a/src/components/ScrollEffects.js b/src/components/ScrollEffects.js
index 86a2ad0c4..775ad6e24 100644
--- a/src/components/ScrollEffects.js
+++ b/src/components/ScrollEffects.js
@@ -1,6 +1,6 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-import { scaleBetween, parseUnit } from '../utils';
+import { scaleBetween, parseOffsetUnits } from '../utils';
 
 const defaultVal = {
     value: 0,
@@ -27,11 +27,7 @@ class ScrollEffects extends Component {
     }
 
     parseOffsetUnits() {
-        const { x, y } = this.props;
-        this.offsets = {
-            x: x && x.map(f => parseUnit(f)),
-            y: y && y.map(f => parseUnit(f)),
-        };
+        this.offsets = parseOffsetUnits(this.props);
     }
 
     scaleValues() {
diff --git a/src/utils/index.js b/src/utils/index.js
index f6c942e0e..e5968e84e 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -1,5 +1,6 @@
 export clamp from './clamp';
 export compose from './compose';
 export parseUnit from './parseUnit';
+export parseOffsetUnits from './parseOffsetUnits';
 export scaleBetween from './scaleBetween';
 export testForPassiveScroll from './testForPassiveScroll';
diff --git a/src/utils/parseOffsetUnits.js b/src/utils/parseOffsetUnits.js
new file mode 100644
index 000000000..6dfa39748
--- /dev/null
+++ b/src/utils/parseOffsetUnits.js
@@ -0,0 +1,9 @@
+import parseUnit from './parseUnit';
+
+export default function parseOffsetUnits(props) {
+	const { x, y } = props;
+	return {
+		x: x && x.map(f => parseUnit(f)),
+		y: y && y.map(f => parseUnit(f)),
+	};
+}

From 61d824e2457bd21f287f9403738fd79b7159159b Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 6 Nov 2017 16:20:10 -0800
Subject: [PATCH 074/158] use `yarn`

---
 docs/development.md |    8 +-
 yarn.lock           | 5042 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 5046 insertions(+), 4 deletions(-)
 create mode 100644 yarn.lock

diff --git a/docs/development.md b/docs/development.md
index c45b493e0..a19052721 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -2,16 +2,16 @@
 
 Install node modules and start webpack:
 
-`npm i`
+`yarn install`
 
 Run webpack watch:
 
-`npm run dev`
+`yarn run dev`
 
 Run dev server:
 
-`npm run dev-server`
+`yarn run dev-server`
 
 Run Jest tests:
 
-`npm run test`
+`yarn run test`
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 000000000..8c5743a04
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,5042 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+abab@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+accepts@~1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f"
+  dependencies:
+    mime-types "~2.1.16"
+    negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+  dependencies:
+    acorn "^4.0.3"
+
+acorn-globals@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+  dependencies:
+    acorn "^4.0.4"
+
+acorn@^4.0.3, acorn@^4.0.4:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7"
+
+ajv-keywords@^1.1.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv@^4.7.0, ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+ajv@^5.1.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda"
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-escapes@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-regex@^2.0.0, ansi-regex@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.0.0, ansi-styles@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
+  dependencies:
+    color-convert "^1.9.0"
+
+anymatch@^1.3.0:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+  dependencies:
+    micromatch "^2.1.5"
+    normalize-path "^2.0.0"
+
+append-transform@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+  dependencies:
+    default-require-extensions "^1.0.0"
+
+aproba@^1.0.3:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+array-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-find-index@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-flatten@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+arrify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@~2.0.3:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+
+asn1.js@^4.0.0:
+  version "4.9.2"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-foreach@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
+
+async@^1.4.0:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.1.2, async@^2.1.4, async@^2.1.5:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d"
+  dependencies:
+    lodash "^4.14.0"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+autoprefixer@^6.3.1:
+  version "6.7.7"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+  dependencies:
+    browserslist "^1.7.6"
+    caniuse-db "^1.0.30000634"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    postcss "^5.2.16"
+    postcss-value-parser "^3.2.3"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws-sign2@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.2.1, aws4@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+babel-cli@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1"
+  dependencies:
+    babel-core "^6.26.0"
+    babel-polyfill "^6.26.0"
+    babel-register "^6.26.0"
+    babel-runtime "^6.26.0"
+    commander "^2.11.0"
+    convert-source-map "^1.5.0"
+    fs-readdir-recursive "^1.0.0"
+    glob "^7.1.2"
+    lodash "^4.17.4"
+    output-file-sync "^1.1.2"
+    path-is-absolute "^1.0.1"
+    slash "^1.0.0"
+    source-map "^0.5.6"
+    v8flags "^2.1.1"
+  optionalDependencies:
+    chokidar "^1.6.1"
+
+babel-code-frame@^6.11.0, babel-code-frame@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+babel-core@^6.0.0, babel-core@^6.23.1, babel-core@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-generator "^6.26.0"
+    babel-helpers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-register "^6.26.0"
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    convert-source-map "^1.5.0"
+    debug "^2.6.8"
+    json5 "^0.5.1"
+    lodash "^4.17.4"
+    minimatch "^3.0.4"
+    path-is-absolute "^1.0.1"
+    private "^0.1.7"
+    slash "^1.0.0"
+    source-map "^0.5.6"
+
+babel-generator@^6.18.0, babel-generator@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5"
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.17.4"
+    source-map "^0.5.6"
+    trim-right "^1.0.1"
+
+babel-helper-bindify-decorators@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+  dependencies:
+    babel-helper-explode-assignable-expression "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    esutils "^2.0.2"
+
+babel-helper-call-delegate@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-explode-class@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb"
+  dependencies:
+    babel-helper-bindify-decorators "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+  dependencies:
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+  dependencies:
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-jest@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671"
+  dependencies:
+    babel-core "^6.0.0"
+    babel-plugin-istanbul "^4.0.0"
+    babel-preset-jest "^20.0.3"
+
+babel-loader@^6.3.2:
+  version "6.4.1"
+  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca"
+  dependencies:
+    find-cache-dir "^0.1.1"
+    loader-utils "^0.2.16"
+    mkdirp "^0.5.1"
+    object-assign "^4.0.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-add-module-exports@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-istanbul@^4.0.0:
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e"
+  dependencies:
+    find-up "^2.1.0"
+    istanbul-lib-instrument "^1.7.5"
+    test-exclude "^4.1.1"
+
+babel-plugin-jest-hoist@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767"
+
+babel-plugin-module-resolver@^2.7.1:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-2.7.1.tgz#18be3c42ddf59f7a456c9e0512cd91394f6e4be1"
+  dependencies:
+    find-babel-config "^1.0.1"
+    glob "^7.1.1"
+    resolve "^1.2.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-async-generators@^6.5.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a"
+
+babel-plugin-syntax-class-constructor-call@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416"
+
+babel-plugin-syntax-class-properties@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
+
+babel-plugin-syntax-decorators@^6.13.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b"
+
+babel-plugin-syntax-do-expressions@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d"
+
+babel-plugin-syntax-dynamic-import@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-export-extensions@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721"
+
+babel-plugin-syntax-flow@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-function-bind@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46"
+
+babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+
+babel-plugin-syntax-object-rest-spread@^6.8.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-generator-functions@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db"
+  dependencies:
+    babel-helper-remap-async-to-generator "^6.24.1"
+    babel-plugin-syntax-async-generators "^6.5.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+  dependencies:
+    babel-helper-remap-async-to-generator "^6.24.1"
+    babel-plugin-syntax-async-functions "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-class-constructor-call@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9"
+  dependencies:
+    babel-plugin-syntax-class-constructor-call "^6.18.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-class-properties@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-plugin-syntax-class-properties "^6.8.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-decorators@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d"
+  dependencies:
+    babel-helper-explode-class "^6.24.1"
+    babel-plugin-syntax-decorators "^6.13.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-do-expressions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb"
+  dependencies:
+    babel-plugin-syntax-do-expressions "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0, babel-plugin-transform-es2015-block-scoping@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+  dependencies:
+    babel-helper-define-map "^6.24.1"
+    babel-helper-function-name "^6.24.1"
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-helper-replace-supers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0, babel-plugin-transform-es2015-duplicate-keys@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0, babel-plugin-transform-es2015-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+  dependencies:
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a"
+  dependencies:
+    babel-plugin-transform-strict-mode "^6.24.1"
+    babel-runtime "^6.26.0"
+    babel-template "^6.26.0"
+    babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0, babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0, babel-plugin-transform-es2015-modules-umd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+  dependencies:
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0, babel-plugin-transform-es2015-object-super@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+  dependencies:
+    babel-helper-replace-supers "^6.24.1"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+  dependencies:
+    babel-helper-call-delegate "^6.24.1"
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0, babel-plugin-transform-es2015-sticky-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0, babel-plugin-transform-es2015-unicode-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+  dependencies:
+    babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+    babel-plugin-syntax-exponentiation-operator "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-export-extensions@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653"
+  dependencies:
+    babel-plugin-syntax-export-extensions "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+  dependencies:
+    babel-plugin-syntax-flow "^6.18.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-function-bind@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97"
+  dependencies:
+    babel-plugin-syntax-function-bind "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-rest-spread@^6.22.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
+  dependencies:
+    babel-plugin-syntax-object-rest-spread "^6.8.0"
+    babel-runtime "^6.26.0"
+
+babel-plugin-transform-react-display-name@^6.23.0:
+  version "6.25.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-self@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
+  dependencies:
+    babel-plugin-syntax-jsx "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-source@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
+  dependencies:
+    babel-plugin-syntax-jsx "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
+  dependencies:
+    babel-helper-builder-react-jsx "^6.24.1"
+    babel-plugin-syntax-jsx "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+  dependencies:
+    regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-polyfill@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+  dependencies:
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    regenerator-runtime "^0.10.5"
+
+babel-preset-env@^1.1.8:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48"
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.22.0"
+    babel-plugin-syntax-trailing-function-commas "^6.22.0"
+    babel-plugin-transform-async-to-generator "^6.22.0"
+    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoping "^6.23.0"
+    babel-plugin-transform-es2015-classes "^6.23.0"
+    babel-plugin-transform-es2015-computed-properties "^6.22.0"
+    babel-plugin-transform-es2015-destructuring "^6.23.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+    babel-plugin-transform-es2015-for-of "^6.23.0"
+    babel-plugin-transform-es2015-function-name "^6.22.0"
+    babel-plugin-transform-es2015-literals "^6.22.0"
+    babel-plugin-transform-es2015-modules-amd "^6.22.0"
+    babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+    babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+    babel-plugin-transform-es2015-modules-umd "^6.23.0"
+    babel-plugin-transform-es2015-object-super "^6.22.0"
+    babel-plugin-transform-es2015-parameters "^6.23.0"
+    babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+    babel-plugin-transform-es2015-spread "^6.22.0"
+    babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+    babel-plugin-transform-es2015-template-literals "^6.22.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+    babel-plugin-transform-exponentiation-operator "^6.22.0"
+    babel-plugin-transform-regenerator "^6.22.0"
+    browserslist "^2.1.2"
+    invariant "^2.2.2"
+    semver "^5.3.0"
+
+babel-preset-es2015@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.22.0"
+    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoping "^6.24.1"
+    babel-plugin-transform-es2015-classes "^6.24.1"
+    babel-plugin-transform-es2015-computed-properties "^6.24.1"
+    babel-plugin-transform-es2015-destructuring "^6.22.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
+    babel-plugin-transform-es2015-for-of "^6.22.0"
+    babel-plugin-transform-es2015-function-name "^6.24.1"
+    babel-plugin-transform-es2015-literals "^6.22.0"
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
+    babel-plugin-transform-es2015-modules-umd "^6.24.1"
+    babel-plugin-transform-es2015-object-super "^6.24.1"
+    babel-plugin-transform-es2015-parameters "^6.24.1"
+    babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
+    babel-plugin-transform-es2015-spread "^6.22.0"
+    babel-plugin-transform-es2015-sticky-regex "^6.24.1"
+    babel-plugin-transform-es2015-template-literals "^6.22.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.24.1"
+    babel-plugin-transform-regenerator "^6.24.1"
+
+babel-preset-flow@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
+  dependencies:
+    babel-plugin-transform-flow-strip-types "^6.22.0"
+
+babel-preset-jest@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a"
+  dependencies:
+    babel-plugin-jest-hoist "^20.0.3"
+
+babel-preset-react@^6.23.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
+  dependencies:
+    babel-plugin-syntax-jsx "^6.3.13"
+    babel-plugin-transform-react-display-name "^6.23.0"
+    babel-plugin-transform-react-jsx "^6.24.1"
+    babel-plugin-transform-react-jsx-self "^6.22.0"
+    babel-plugin-transform-react-jsx-source "^6.22.0"
+    babel-preset-flow "^6.23.0"
+
+babel-preset-stage-0@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a"
+  dependencies:
+    babel-plugin-transform-do-expressions "^6.22.0"
+    babel-plugin-transform-function-bind "^6.22.0"
+    babel-preset-stage-1 "^6.24.1"
+
+babel-preset-stage-1@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0"
+  dependencies:
+    babel-plugin-transform-class-constructor-call "^6.24.1"
+    babel-plugin-transform-export-extensions "^6.22.0"
+    babel-preset-stage-2 "^6.24.1"
+
+babel-preset-stage-2@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1"
+  dependencies:
+    babel-plugin-syntax-dynamic-import "^6.18.0"
+    babel-plugin-transform-class-properties "^6.24.1"
+    babel-plugin-transform-decorators "^6.24.1"
+    babel-preset-stage-3 "^6.24.1"
+
+babel-preset-stage-3@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395"
+  dependencies:
+    babel-plugin-syntax-trailing-function-commas "^6.22.0"
+    babel-plugin-transform-async-generator-functions "^6.24.1"
+    babel-plugin-transform-async-to-generator "^6.24.1"
+    babel-plugin-transform-exponentiation-operator "^6.24.1"
+    babel-plugin-transform-object-rest-spread "^6.22.0"
+
+babel-register@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+  dependencies:
+    babel-core "^6.26.0"
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    home-or-tmp "^2.0.0"
+    lodash "^4.17.4"
+    mkdirp "^0.5.1"
+    source-map-support "^0.4.15"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
+babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+  dependencies:
+    babel-runtime "^6.26.0"
+    babel-traverse "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    lodash "^4.17.4"
+
+babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+  dependencies:
+    babel-code-frame "^6.26.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.26.0"
+    babel-types "^6.26.0"
+    babylon "^6.18.0"
+    debug "^2.6.8"
+    globals "^9.18.0"
+    invariant "^2.2.2"
+    lodash "^4.17.4"
+
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+  dependencies:
+    babel-runtime "^6.26.0"
+    esutils "^2.0.2"
+    lodash "^4.17.4"
+    to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+balanced-match@^0.4.2:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+body-parser@1.18.2:
+  version "1.18.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+  dependencies:
+    bytes "3.0.0"
+    content-type "~1.0.4"
+    debug "2.6.9"
+    depd "~1.1.1"
+    http-errors "~1.6.2"
+    iconv-lite "0.4.19"
+    on-finished "~2.3.0"
+    qs "6.5.1"
+    raw-body "2.3.2"
+    type-is "~1.6.15"
+
+boom@2.x.x:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    hoek "2.x.x"
+
+boom@4.x.x:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31"
+  dependencies:
+    hoek "4.x.x"
+
+boom@5.x.x:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02"
+  dependencies:
+    hoek "4.x.x"
+
+brace-expansion@^1.1.7:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-resolve@^1.11.2:
+  version "1.11.2"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+  dependencies:
+    resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f"
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+  dependencies:
+    pako "~0.2.0"
+
+browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+  version "1.7.7"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+  dependencies:
+    caniuse-db "^1.0.30000639"
+    electron-to-chromium "^1.2.7"
+
+browserslist@^2.1.2:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.7.0.tgz#dc375dc70048fec3d989042a35022342902eff00"
+  dependencies:
+    caniuse-lite "^1.0.30000757"
+    electron-to-chromium "^1.3.27"
+
+bser@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169"
+  dependencies:
+    node-int64 "^0.4.0"
+
+bser@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
+  dependencies:
+    node-int64 "^0.4.0"
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytes@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+
+callsites@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+caniuse-api@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+  dependencies:
+    browserslist "^1.3.6"
+    caniuse-db "^1.0.30000529"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+  version "1.0.30000758"
+  resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000758.tgz#a235627b1922e878b63164942c991b84de92c810"
+
+caniuse-lite@^1.0.30000757:
+  version "1.0.30000758"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000758.tgz#e261140076651049cf6891ed4bc649b5c8c26c69"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chalk@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
+  dependencies:
+    ansi-styles "^3.1.0"
+    escape-string-regexp "^1.0.5"
+    supports-color "^4.0.0"
+
+chokidar@^1.6.1, chokidar@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^1.0.0"
+    glob-parent "^2.0.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^2.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+ci-info@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.1.tgz#47b44df118c48d2597b56d342e7e25791060171a"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+clap@^1.0.9:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
+  dependencies:
+    chalk "^1.1.3"
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+clone-deep@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-0.3.0.tgz#348c61ae9cdbe0edfe053d91ff4cc521d790ede8"
+  dependencies:
+    for-own "^1.0.0"
+    is-plain-object "^2.0.1"
+    kind-of "^3.2.2"
+    shallow-clone "^0.1.2"
+
+clone@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+coa@~1.0.1:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
+  dependencies:
+    q "^1.1.2"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+color-convert@^1.3.0, color-convert@^1.9.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
+  dependencies:
+    color-name "^1.1.1"
+
+color-name@^1.0.0, color-name@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+color-string@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+  dependencies:
+    color-name "^1.0.0"
+
+color@^0.11.0:
+  version "0.11.4"
+  resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+  dependencies:
+    clone "^1.0.2"
+    color-convert "^1.3.0"
+    color-string "^0.3.0"
+
+colormin@^1.0.5:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+  dependencies:
+    color "^0.11.0"
+    css-color-names "0.0.4"
+    has "^1.0.1"
+
+colors@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^2.11.0:
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-disposition@0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type-parser@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
+
+content-type@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+convert-source-map@^1.4.0, convert-source-map@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+cookie-signature@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+core-js@^1.0.0:
+  version "1.2.7"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+
+core-js@^2.4.0, core-js@^2.5.0:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+cosmiconfig@^2.1.0, cosmiconfig@^2.1.1:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892"
+  dependencies:
+    is-directory "^0.3.1"
+    js-yaml "^3.4.3"
+    minimist "^1.2.0"
+    object-assign "^4.1.0"
+    os-homedir "^1.0.1"
+    parse-json "^2.2.0"
+    require-from-string "^1.1.0"
+
+create-ecdh@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+create-react-class@^15.6.0:
+  version "15.6.2"
+  resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a"
+  dependencies:
+    fbjs "^0.8.9"
+    loose-envify "^1.3.1"
+    object-assign "^4.1.1"
+
+cross-env@^3.1.4:
+  version "3.2.4"
+  resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-3.2.4.tgz#9e0585f277864ed421ce756f81a980ff0d698aba"
+  dependencies:
+    cross-spawn "^5.1.0"
+    is-windows "^1.0.0"
+
+cross-spawn@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982"
+  dependencies:
+    lru-cache "^4.0.1"
+    which "^1.2.9"
+
+cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cryptiles@2.x.x:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    boom "2.x.x"
+
+cryptiles@3.x.x:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe"
+  dependencies:
+    boom "5.x.x"
+
+crypto-browserify@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+    randomfill "^1.0.3"
+
+css-color-names@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+
+css-loader@^0.28.0:
+  version "0.28.7"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.7.tgz#5f2ee989dd32edd907717f953317656160999c1b"
+  dependencies:
+    babel-code-frame "^6.11.0"
+    css-selector-tokenizer "^0.7.0"
+    cssnano ">=2.6.1 <4"
+    icss-utils "^2.1.0"
+    loader-utils "^1.0.2"
+    lodash.camelcase "^4.3.0"
+    object-assign "^4.0.1"
+    postcss "^5.0.6"
+    postcss-modules-extract-imports "^1.0.0"
+    postcss-modules-local-by-default "^1.0.1"
+    postcss-modules-scope "^1.0.0"
+    postcss-modules-values "^1.1.0"
+    postcss-value-parser "^3.3.0"
+    source-list-map "^2.0.0"
+
+css-selector-tokenizer@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
+  dependencies:
+    cssesc "^0.1.0"
+    fastparse "^1.1.1"
+    regexpu-core "^1.0.0"
+
+cssesc@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+
+"cssnano@>=2.6.1 <4":
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+  dependencies:
+    autoprefixer "^6.3.1"
+    decamelize "^1.1.2"
+    defined "^1.0.0"
+    has "^1.0.1"
+    object-assign "^4.0.1"
+    postcss "^5.0.14"
+    postcss-calc "^5.2.0"
+    postcss-colormin "^2.1.8"
+    postcss-convert-values "^2.3.4"
+    postcss-discard-comments "^2.0.4"
+    postcss-discard-duplicates "^2.0.1"
+    postcss-discard-empty "^2.0.1"
+    postcss-discard-overridden "^0.1.1"
+    postcss-discard-unused "^2.2.1"
+    postcss-filter-plugins "^2.0.0"
+    postcss-merge-idents "^2.1.5"
+    postcss-merge-longhand "^2.0.1"
+    postcss-merge-rules "^2.0.3"
+    postcss-minify-font-values "^1.0.2"
+    postcss-minify-gradients "^1.0.1"
+    postcss-minify-params "^1.0.4"
+    postcss-minify-selectors "^2.0.4"
+    postcss-normalize-charset "^1.1.0"
+    postcss-normalize-url "^3.0.7"
+    postcss-ordered-values "^2.1.0"
+    postcss-reduce-idents "^2.2.2"
+    postcss-reduce-initial "^1.0.0"
+    postcss-reduce-transforms "^1.0.3"
+    postcss-svgo "^2.1.1"
+    postcss-unique-selectors "^2.0.2"
+    postcss-value-parser "^3.2.3"
+    postcss-zindex "^2.0.1"
+
+csso@~2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+  dependencies:
+    clap "^1.0.9"
+    source-map "^0.5.3"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b"
+
+"cssstyle@>= 0.2.37 < 0.3.0":
+  version "0.2.37"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+  dependencies:
+    cssom "0.3.x"
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  dependencies:
+    array-find-index "^1.0.1"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@2.6.9, debug@^2.2.0, debug@^2.6.8:
+  version "2.6.9"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debug@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  dependencies:
+    ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+default-require-extensions@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+  dependencies:
+    strip-bom "^2.0.0"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.1, depd@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1"
+
+diff@^3.2.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
+
+diffie-hellman@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+domain-browser@^1.1.1:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.27:
+  version "1.3.27"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+encoding@^0.1.11:
+  version "0.1.12"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+  dependencies:
+    iconv-lite "~0.4.13"
+
+enhanced-resolve@^3.3.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    object-assign "^4.0.1"
+    tapable "^0.2.7"
+
+errno@^0.1.3, errno@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+  dependencies:
+    prr "~0.0.0"
+
+error-ex@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.6.1:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852"
+  dependencies:
+    esprima "^3.1.3"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.5.6"
+
+esprima@^2.6.0:
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+
+estraverse@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+
+events@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+exec-sh@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38"
+  dependencies:
+    merge "^1.1.3"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+express@^4.14.1:
+  version "4.16.2"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
+  dependencies:
+    accepts "~1.3.4"
+    array-flatten "1.1.1"
+    body-parser "1.18.2"
+    content-disposition "0.5.2"
+    content-type "~1.0.4"
+    cookie "0.3.1"
+    cookie-signature "1.0.6"
+    debug "2.6.9"
+    depd "~1.1.1"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    finalhandler "1.1.0"
+    fresh "0.5.2"
+    merge-descriptors "1.0.1"
+    methods "~1.1.2"
+    on-finished "~2.3.0"
+    parseurl "~1.3.2"
+    path-to-regexp "0.1.7"
+    proxy-addr "~2.0.2"
+    qs "6.5.1"
+    range-parser "~1.2.0"
+    safe-buffer "5.1.1"
+    send "0.16.1"
+    serve-static "1.13.1"
+    setprototypeof "1.1.0"
+    statuses "~1.3.1"
+    type-is "~1.6.15"
+    utils-merge "1.0.1"
+    vary "~1.1.2"
+
+extend@~3.0.0, extend@~3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extsprintf@1.3.0, extsprintf@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+fast-deep-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fast-levenshtein@~2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fastparse@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
+
+fb-watchman@^1.8.0:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383"
+  dependencies:
+    bser "1.0.2"
+
+fb-watchman@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
+  dependencies:
+    bser "^2.0.0"
+
+fbjs@^0.8.16, fbjs@^0.8.9:
+  version "0.8.16"
+  resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
+  dependencies:
+    core-js "^1.0.0"
+    isomorphic-fetch "^2.1.1"
+    loose-envify "^1.0.0"
+    object-assign "^4.1.0"
+    promise "^7.1.1"
+    setimmediate "^1.0.5"
+    ua-parser-js "^0.7.9"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fileset@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+  dependencies:
+    glob "^7.0.3"
+    minimatch "^3.0.3"
+
+fill-range@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^1.1.3"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
+finalhandler@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5"
+  dependencies:
+    debug "2.6.9"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.2"
+    statuses "~1.3.1"
+    unpipe "~1.0.0"
+
+find-babel-config@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.1.0.tgz#acc01043a6749fec34429be6b64f542ebb5d6355"
+  dependencies:
+    json5 "^0.5.1"
+    path-exists "^3.0.0"
+
+find-cache-dir@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
+  dependencies:
+    commondir "^1.0.1"
+    mkdirp "^0.5.1"
+    pkg-dir "^1.0.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+flatten@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+
+for-in@^0.1.3:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
+
+for-in@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+for-own@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
+  dependencies:
+    for-in "^1.0.1"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+form-data@~2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+forwarded@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+
+fresh@0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+
+fs-readdir-recursive@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4"
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.36"
+
+fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+function-bind@^1.0.2:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+gaze@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105"
+  dependencies:
+    globule "^1.0.0"
+
+get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^9.18.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globule@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09"
+  dependencies:
+    glob "~7.1.1"
+    lodash "~4.17.4"
+    minimatch "~3.0.2"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+growly@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+
+handlebars@^4.0.3:
+  version "4.0.11"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
+  dependencies:
+    async "^1.4.0"
+    optimist "^0.6.1"
+    source-map "^0.4.4"
+  optionalDependencies:
+    uglify-js "^2.6"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-schema@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    har-schema "^1.0.5"
+
+har-validator@~5.0.3:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+  dependencies:
+    ajv "^5.1.0"
+    har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+  dependencies:
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+  dependencies:
+    inherits "^2.0.1"
+
+hash-base@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846"
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.0"
+
+hawk@3.1.3, hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.x.x"
+    sntp "1.x.x"
+
+hawk@~6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038"
+  dependencies:
+    boom "4.x.x"
+    cryptiles "3.x.x"
+    hoek "4.x.x"
+    sntp "2.x.x"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hoek@2.x.x:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+hoek@4.x.x:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c"
+
+html-comment-regex@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+
+html-encoding-sniffer@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+  dependencies:
+    whatwg-encoding "^1.0.1"
+
+http-errors@1.6.2, http-errors@~1.6.2:
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+  dependencies:
+    depd "1.1.1"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+http-signature@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  dependencies:
+    assert-plus "^1.0.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+https-browserify@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+
+iconv-lite@0.4.19, iconv-lite@~0.4.13:
+  version "0.4.19"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+icss-replace-symbols@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+
+icss-utils@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
+  dependencies:
+    postcss "^6.0.1"
+
+ieee754@^1.1.4:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+in-publish@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  dependencies:
+    repeating "^2.0.0"
+
+indexes-of@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+
+indexof@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+interpret@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0"
+
+intersection-observer@^0.4.2:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.4.2.tgz#24100ed620baf6a427072996d4d73366e9ec93ef"
+
+invariant@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ipaddr.js@1.5.2:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0"
+
+is-absolute-url@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.0.2, is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-ci@^1.0.10:
+  version "1.0.10"
+  resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e"
+  dependencies:
+    ci-info "^1.0.0"
+
+is-directory@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-plain-obj@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-plain-object@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  dependencies:
+    isobject "^3.0.1"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-stream@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-svg@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+  dependencies:
+    html-comment-regex "^1.1.0"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-windows@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+isomorphic-fetch@^2.1.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
+  dependencies:
+    node-fetch "^1.0.1"
+    whatwg-fetch ">=0.10.0"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620"
+  dependencies:
+    async "^2.1.4"
+    fileset "^2.0.2"
+    istanbul-lib-coverage "^1.1.1"
+    istanbul-lib-hook "^1.1.0"
+    istanbul-lib-instrument "^1.9.1"
+    istanbul-lib-report "^1.1.2"
+    istanbul-lib-source-maps "^1.2.2"
+    istanbul-reports "^1.1.3"
+    js-yaml "^3.7.0"
+    mkdirp "^0.5.1"
+    once "^1.4.0"
+
+istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
+
+istanbul-lib-hook@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b"
+  dependencies:
+    append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e"
+  dependencies:
+    babel-generator "^6.18.0"
+    babel-template "^6.16.0"
+    babel-traverse "^6.18.0"
+    babel-types "^6.18.0"
+    babylon "^6.18.0"
+    istanbul-lib-coverage "^1.1.1"
+    semver "^5.3.0"
+
+istanbul-lib-report@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425"
+  dependencies:
+    istanbul-lib-coverage "^1.1.1"
+    mkdirp "^0.5.1"
+    path-parse "^1.0.5"
+    supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c"
+  dependencies:
+    debug "^3.1.0"
+    istanbul-lib-coverage "^1.1.1"
+    mkdirp "^0.5.1"
+    rimraf "^2.6.1"
+    source-map "^0.5.3"
+
+istanbul-reports@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10"
+  dependencies:
+    handlebars "^4.0.3"
+
+jest-changed-files@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8"
+
+jest-cli@^20.0.4:
+  version "20.0.4"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93"
+  dependencies:
+    ansi-escapes "^1.4.0"
+    callsites "^2.0.0"
+    chalk "^1.1.3"
+    graceful-fs "^4.1.11"
+    is-ci "^1.0.10"
+    istanbul-api "^1.1.1"
+    istanbul-lib-coverage "^1.0.1"
+    istanbul-lib-instrument "^1.4.2"
+    istanbul-lib-source-maps "^1.1.0"
+    jest-changed-files "^20.0.3"
+    jest-config "^20.0.4"
+    jest-docblock "^20.0.3"
+    jest-environment-jsdom "^20.0.3"
+    jest-haste-map "^20.0.4"
+    jest-jasmine2 "^20.0.4"
+    jest-message-util "^20.0.3"
+    jest-regex-util "^20.0.3"
+    jest-resolve-dependencies "^20.0.3"
+    jest-runtime "^20.0.4"
+    jest-snapshot "^20.0.3"
+    jest-util "^20.0.3"
+    micromatch "^2.3.11"
+    node-notifier "^5.0.2"
+    pify "^2.3.0"
+    slash "^1.0.0"
+    string-length "^1.0.1"
+    throat "^3.0.0"
+    which "^1.2.12"
+    worker-farm "^1.3.1"
+    yargs "^7.0.2"
+
+jest-config@^20.0.4:
+  version "20.0.4"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea"
+  dependencies:
+    chalk "^1.1.3"
+    glob "^7.1.1"
+    jest-environment-jsdom "^20.0.3"
+    jest-environment-node "^20.0.3"
+    jest-jasmine2 "^20.0.4"
+    jest-matcher-utils "^20.0.3"
+    jest-regex-util "^20.0.3"
+    jest-resolve "^20.0.4"
+    jest-validate "^20.0.3"
+    pretty-format "^20.0.3"
+
+jest-diff@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617"
+  dependencies:
+    chalk "^1.1.3"
+    diff "^3.2.0"
+    jest-matcher-utils "^20.0.3"
+    pretty-format "^20.0.3"
+
+jest-docblock@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712"
+
+jest-environment-jsdom@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99"
+  dependencies:
+    jest-mock "^20.0.3"
+    jest-util "^20.0.3"
+    jsdom "^9.12.0"
+
+jest-environment-node@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403"
+  dependencies:
+    jest-mock "^20.0.3"
+    jest-util "^20.0.3"
+
+jest-haste-map@^20.0.4:
+  version "20.0.5"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.5.tgz#abad74efb1a005974a7b6517e11010709cab9112"
+  dependencies:
+    fb-watchman "^2.0.0"
+    graceful-fs "^4.1.11"
+    jest-docblock "^20.0.3"
+    micromatch "^2.3.11"
+    sane "~1.6.0"
+    worker-farm "^1.3.1"
+
+jest-jasmine2@^20.0.4:
+  version "20.0.4"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1"
+  dependencies:
+    chalk "^1.1.3"
+    graceful-fs "^4.1.11"
+    jest-diff "^20.0.3"
+    jest-matcher-utils "^20.0.3"
+    jest-matchers "^20.0.3"
+    jest-message-util "^20.0.3"
+    jest-snapshot "^20.0.3"
+    once "^1.4.0"
+    p-map "^1.1.1"
+
+jest-matcher-utils@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612"
+  dependencies:
+    chalk "^1.1.3"
+    pretty-format "^20.0.3"
+
+jest-matchers@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60"
+  dependencies:
+    jest-diff "^20.0.3"
+    jest-matcher-utils "^20.0.3"
+    jest-message-util "^20.0.3"
+    jest-regex-util "^20.0.3"
+
+jest-message-util@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c"
+  dependencies:
+    chalk "^1.1.3"
+    micromatch "^2.3.11"
+    slash "^1.0.0"
+
+jest-mock@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59"
+
+jest-regex-util@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762"
+
+jest-resolve-dependencies@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a"
+  dependencies:
+    jest-regex-util "^20.0.3"
+
+jest-resolve@^20.0.4:
+  version "20.0.4"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5"
+  dependencies:
+    browser-resolve "^1.11.2"
+    is-builtin-module "^1.0.0"
+    resolve "^1.3.2"
+
+jest-runtime@^20.0.4:
+  version "20.0.4"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8"
+  dependencies:
+    babel-core "^6.0.0"
+    babel-jest "^20.0.3"
+    babel-plugin-istanbul "^4.0.0"
+    chalk "^1.1.3"
+    convert-source-map "^1.4.0"
+    graceful-fs "^4.1.11"
+    jest-config "^20.0.4"
+    jest-haste-map "^20.0.4"
+    jest-regex-util "^20.0.3"
+    jest-resolve "^20.0.4"
+    jest-util "^20.0.3"
+    json-stable-stringify "^1.0.1"
+    micromatch "^2.3.11"
+    strip-bom "3.0.0"
+    yargs "^7.0.2"
+
+jest-snapshot@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566"
+  dependencies:
+    chalk "^1.1.3"
+    jest-diff "^20.0.3"
+    jest-matcher-utils "^20.0.3"
+    jest-util "^20.0.3"
+    natural-compare "^1.4.0"
+    pretty-format "^20.0.3"
+
+jest-util@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad"
+  dependencies:
+    chalk "^1.1.3"
+    graceful-fs "^4.1.11"
+    jest-message-util "^20.0.3"
+    jest-mock "^20.0.3"
+    jest-validate "^20.0.3"
+    leven "^2.1.0"
+    mkdirp "^0.5.1"
+
+jest-validate@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab"
+  dependencies:
+    chalk "^1.1.3"
+    jest-matcher-utils "^20.0.3"
+    leven "^2.1.0"
+    pretty-format "^20.0.3"
+
+jest@^20.0.4:
+  version "20.0.4"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac"
+  dependencies:
+    jest-cli "^20.0.4"
+
+js-base64@^2.1.8, js-base64@^2.1.9:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf"
+
+js-tokens@^3.0.0, js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@^3.4.3, js-yaml@^3.7.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@~3.7.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^2.6.0"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsdom@^9.12.0:
+  version "9.12.0"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
+  dependencies:
+    abab "^1.0.3"
+    acorn "^4.0.4"
+    acorn-globals "^3.1.0"
+    array-equal "^1.0.0"
+    content-type-parser "^1.0.1"
+    cssom ">= 0.3.2 < 0.4.0"
+    cssstyle ">= 0.2.37 < 0.3.0"
+    escodegen "^1.6.1"
+    html-encoding-sniffer "^1.0.1"
+    nwmatcher ">= 1.3.9 < 2.0.0"
+    parse5 "^1.5.1"
+    request "^2.79.0"
+    sax "^1.2.1"
+    symbol-tree "^3.2.1"
+    tough-cookie "^2.3.2"
+    webidl-conversions "^4.0.0"
+    whatwg-encoding "^1.0.1"
+    whatwg-url "^4.3.0"
+    xml-name-validator "^2.0.1"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-loader@^0.5.4:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json5@^0.5.0, json5@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+kind-of@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
+  dependencies:
+    is-buffer "^1.0.2"
+
+kind-of@^3.0.2, kind-of@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  dependencies:
+    is-buffer "^1.1.5"
+
+lazy-cache@^0.2.3:
+  version "0.2.7"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
+
+lazy-cache@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+  dependencies:
+    invert-kv "^1.0.0"
+
+leven@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+
+levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+loader-runner@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^0.2.16:
+  version "0.2.17"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+    object-assign "^4.0.1"
+
+loader-utils@^1.0.1, loader-utils@^1.0.2:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lodash.assign@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
+
+lodash.camelcase@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+
+lodash.clonedeep@^4.3.2:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+
+lodash.memoize@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+
+lodash.mergewith@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55"
+
+lodash.tail@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
+
+lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+
+lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@~4.17.4:
+  version "4.17.4"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+longest@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+  dependencies:
+    js-tokens "^3.0.0"
+
+loud-rejection@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+  dependencies:
+    currently-unhandled "^0.4.1"
+    signal-exit "^3.0.0"
+
+lru-cache@^4.0.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+macaddress@^0.2.8:
+  version "0.2.8"
+  resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
+
+makeerror@1.0.x:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+  dependencies:
+    tmpl "1.0.x"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+math-expression-evaluator@^1.2.14:
+  version "1.2.17"
+  resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
+
+md5.js@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+meow@^3.7.0:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  dependencies:
+    camelcase-keys "^2.0.0"
+    decamelize "^1.1.2"
+    loud-rejection "^1.0.0"
+    map-obj "^1.0.1"
+    minimist "^1.1.3"
+    normalize-package-data "^2.3.4"
+    object-assign "^4.0.1"
+    read-pkg-up "^1.0.1"
+    redent "^1.0.0"
+    trim-newlines "^1.0.0"
+
+merge-descriptors@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+
+merge@^1.1.3:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+
+methods@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+micromatch@^2.1.5, micromatch@^2.3.11:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime-db@~1.30.0:
+  version "1.30.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
+
+mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7:
+  version "2.1.17"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
+  dependencies:
+    mime-db "~1.30.0"
+
+mime@1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+
+minimalistic-assert@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@~0.0.1:
+  version "0.0.10"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+mixin-object@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
+  dependencies:
+    for-in "^0.1.3"
+    is-extendable "^0.1.1"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.3.0, nan@^2.3.2:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+negotiator@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+node-fetch@^1.0.1:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
+  dependencies:
+    encoding "^0.1.11"
+    is-stream "^1.0.1"
+
+node-gyp@^3.3.1:
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60"
+  dependencies:
+    fstream "^1.0.0"
+    glob "^7.0.3"
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.0"
+    nopt "2 || 3"
+    npmlog "0 || 1 || 2 || 3 || 4"
+    osenv "0"
+    request "2"
+    rimraf "2"
+    semver "~5.3.0"
+    tar "^2.0.0"
+    which "1"
+
+node-int64@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+
+node-libs-browser@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646"
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.1.4"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "0.0.1"
+    os-browserify "^0.2.0"
+    path-browserify "0.0.0"
+    process "^0.11.0"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.0.5"
+    stream-browserify "^2.0.1"
+    stream-http "^2.3.1"
+    string_decoder "^0.10.25"
+    timers-browserify "^2.0.2"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-notifier@^5.0.2:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff"
+  dependencies:
+    growly "^1.3.0"
+    semver "^5.3.0"
+    shellwords "^0.1.0"
+    which "^1.2.12"
+
+node-pre-gyp@^0.6.36:
+  version "0.6.39"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
+  dependencies:
+    detect-libc "^1.0.2"
+    hawk "3.1.3"
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    npmlog "^4.0.2"
+    rc "^1.1.7"
+    request "2.81.0"
+    rimraf "^2.6.1"
+    semver "^5.3.0"
+    tar "^2.2.1"
+    tar-pack "^3.4.0"
+
+node-sass@^4.5.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.6.0.tgz#1a54f5f4502e3cde310a26d6346266fd667271d9"
+  dependencies:
+    async-foreach "^0.1.3"
+    chalk "^1.1.1"
+    cross-spawn "^3.0.0"
+    gaze "^1.0.0"
+    get-stdin "^4.0.1"
+    glob "^7.0.3"
+    in-publish "^2.0.0"
+    lodash.assign "^4.2.0"
+    lodash.clonedeep "^4.3.2"
+    lodash.mergewith "^4.6.0"
+    meow "^3.7.0"
+    mkdirp "^0.5.1"
+    nan "^2.3.2"
+    node-gyp "^3.3.1"
+    npmlog "^4.0.0"
+    request "^2.79.0"
+    sass-graph "^2.2.4"
+    stdout-stream "^1.4.0"
+
+"nopt@2 || 3":
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+  dependencies:
+    abbrev "1"
+
+nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+normalize-range@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+
+normalize-url@^1.4.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+  dependencies:
+    object-assign "^4.0.1"
+    prepend-http "^1.0.0"
+    query-string "^4.1.0"
+    sort-keys "^1.0.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+num2fraction@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+"nwmatcher@>= 1.3.9 < 2.0.0":
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
+
+oauth-sign@~0.8.1, oauth-sign@~0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  dependencies:
+    ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.3, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+optimist@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+  dependencies:
+    minimist "~0.0.1"
+    wordwrap "~0.0.2"
+
+optionator@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.4"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    wordwrap "~1.0.0"
+
+os-browserify@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f"
+
+os-homedir@^1.0.0, os-homedir@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+  dependencies:
+    lcid "^1.0.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@0, osenv@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+output-file-sync@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
+  dependencies:
+    graceful-fs "^4.1.4"
+    mkdirp "^0.5.1"
+    object-assign "^4.1.0"
+
+p-limit@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-map@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
+
+pako@~0.2.0:
+  version "0.2.9"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+
+parse-asn1@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+parse5@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
+
+parseurl@~1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+path-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-to-regexp@0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.14"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0, pify@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
+  dependencies:
+    find-up "^1.0.0"
+
+postcss-calc@^5.2.0:
+  version "5.3.1"
+  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
+  dependencies:
+    postcss "^5.0.2"
+    postcss-message-helpers "^2.0.0"
+    reduce-css-calc "^1.2.6"
+
+postcss-colormin@^2.1.8:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
+  dependencies:
+    colormin "^1.0.5"
+    postcss "^5.0.13"
+    postcss-value-parser "^3.2.3"
+
+postcss-convert-values@^2.3.4:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
+  dependencies:
+    postcss "^5.0.11"
+    postcss-value-parser "^3.1.2"
+
+postcss-discard-comments@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-duplicates@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-discard-empty@^2.0.1:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
+  dependencies:
+    postcss "^5.0.14"
+
+postcss-discard-overridden@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
+  dependencies:
+    postcss "^5.0.16"
+
+postcss-discard-unused@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
+  dependencies:
+    postcss "^5.0.14"
+    uniqs "^2.0.0"
+
+postcss-filter-plugins@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c"
+  dependencies:
+    postcss "^5.0.4"
+    uniqid "^4.0.0"
+
+postcss-load-config@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a"
+  dependencies:
+    cosmiconfig "^2.1.0"
+    object-assign "^4.1.0"
+    postcss-load-options "^1.2.0"
+    postcss-load-plugins "^2.3.0"
+
+postcss-load-options@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c"
+  dependencies:
+    cosmiconfig "^2.1.0"
+    object-assign "^4.1.0"
+
+postcss-load-plugins@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92"
+  dependencies:
+    cosmiconfig "^2.1.1"
+    object-assign "^4.1.0"
+
+postcss-loader@^1.3.3:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-1.3.3.tgz#a621ea1fa29062a83972a46f54486771301916eb"
+  dependencies:
+    loader-utils "^1.0.2"
+    object-assign "^4.1.1"
+    postcss "^5.2.15"
+    postcss-load-config "^1.2.0"
+
+postcss-merge-idents@^2.1.5:
+  version "2.1.7"
+  resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.10"
+    postcss-value-parser "^3.1.1"
+
+postcss-merge-longhand@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-merge-rules@^2.0.3:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
+  dependencies:
+    browserslist "^1.5.2"
+    caniuse-api "^1.5.2"
+    postcss "^5.0.4"
+    postcss-selector-parser "^2.2.2"
+    vendors "^1.0.0"
+
+postcss-message-helpers@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
+
+postcss-minify-font-values@^1.0.2:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
+  dependencies:
+    object-assign "^4.0.1"
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-minify-gradients@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
+  dependencies:
+    postcss "^5.0.12"
+    postcss-value-parser "^3.3.0"
+
+postcss-minify-params@^1.0.4:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.2"
+    postcss-value-parser "^3.0.2"
+    uniqs "^2.0.0"
+
+postcss-minify-selectors@^2.0.4:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
+  dependencies:
+    alphanum-sort "^1.0.2"
+    has "^1.0.1"
+    postcss "^5.0.14"
+    postcss-selector-parser "^2.0.0"
+
+postcss-modules-extract-imports@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85"
+  dependencies:
+    postcss "^6.0.1"
+
+postcss-modules-local-by-default@^1.0.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-scope@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-values@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+  dependencies:
+    icss-replace-symbols "^1.1.0"
+    postcss "^6.0.1"
+
+postcss-normalize-charset@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
+  dependencies:
+    postcss "^5.0.5"
+
+postcss-normalize-url@^3.0.7:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
+  dependencies:
+    is-absolute-url "^2.0.0"
+    normalize-url "^1.4.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+
+postcss-ordered-values@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.1"
+
+postcss-reduce-idents@^2.2.2:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
+  dependencies:
+    postcss "^5.0.4"
+    postcss-value-parser "^3.0.2"
+
+postcss-reduce-initial@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
+  dependencies:
+    postcss "^5.0.4"
+
+postcss-reduce-transforms@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.8"
+    postcss-value-parser "^3.0.1"
+
+postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
+  dependencies:
+    flatten "^1.0.2"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-svgo@^2.1.1:
+  version "2.1.6"
+  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
+  dependencies:
+    is-svg "^2.0.0"
+    postcss "^5.0.14"
+    postcss-value-parser "^3.2.3"
+    svgo "^0.7.0"
+
+postcss-unique-selectors@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
+  dependencies:
+    alphanum-sort "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
+
+postcss-zindex@^2.0.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
+  dependencies:
+    has "^1.0.1"
+    postcss "^5.0.4"
+    uniqs "^2.0.0"
+
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.15, postcss@^5.2.16:
+  version "5.2.18"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+  dependencies:
+    chalk "^1.1.3"
+    js-base64 "^2.1.9"
+    source-map "^0.5.6"
+    supports-color "^3.2.3"
+
+postcss@^6.0.1:
+  version "6.0.14"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.14.tgz#5534c72114739e75d0afcf017db853099f562885"
+  dependencies:
+    chalk "^2.3.0"
+    source-map "^0.6.1"
+    supports-color "^4.4.0"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-format@^20.0.3:
+  version "20.0.3"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14"
+  dependencies:
+    ansi-regex "^2.1.1"
+    ansi-styles "^3.0.0"
+
+private@^0.1.6, private@^0.1.7:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@^0.11.0:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+promise@^7.1.1:
+  version "7.3.1"
+  resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+  dependencies:
+    asap "~2.0.3"
+
+prop-types@^15.5.10:
+  version "15.6.0"
+  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
+  dependencies:
+    fbjs "^0.8.16"
+    loose-envify "^1.3.1"
+    object-assign "^4.1.1"
+
+proxy-addr@~2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec"
+  dependencies:
+    forwarded "~0.1.2"
+    ipaddr.js "1.5.2"
+
+prr@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
+punycode@1.3.2:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+q@^1.1.2:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+
+qs@6.5.1, qs@~6.5.1:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+qs@~6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+query-string@^4.1.0:
+  version "4.3.4"
+  resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+  dependencies:
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randomatic@^1.1.3:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79"
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.3.tgz#b96b7df587f01dd91726c418f30553b1418e3d62"
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+range-parser@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+raw-body@2.3.2:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+  dependencies:
+    bytes "3.0.0"
+    http-errors "1.6.2"
+    iconv-lite "0.4.19"
+    unpipe "1.0.0"
+
+rc@^1.1.7:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077"
+  dependencies:
+    deep-extend "~0.4.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+react-dom@^15.0.0:
+  version "15.6.2"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730"
+  dependencies:
+    fbjs "^0.8.9"
+    loose-envify "^1.1.0"
+    object-assign "^4.1.0"
+    prop-types "^15.5.10"
+
+react-test-renderer@^15.6.1:
+  version "15.6.2"
+  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.2.tgz#d0333434fc2c438092696ca770da5ed48037efa8"
+  dependencies:
+    fbjs "^0.8.9"
+    object-assign "^4.1.0"
+
+react@^15.0.0:
+  version "15.6.2"
+  resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72"
+  dependencies:
+    create-react-class "^15.6.0"
+    fbjs "^0.8.9"
+    loose-envify "^1.1.0"
+    object-assign "^4.1.0"
+    prop-types "^15.5.10"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.6:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.0.3"
+    util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+redent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+  dependencies:
+    indent-string "^2.1.0"
+    strip-indent "^1.0.1"
+
+reduce-css-calc@^1.2.6:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
+  dependencies:
+    balanced-match "^0.4.2"
+    math-expression-evaluator "^1.2.14"
+    reduce-function-call "^1.0.1"
+
+reduce-function-call@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
+  dependencies:
+    balanced-match "^0.4.2"
+
+regenerate@^1.2.1:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
+
+regenerator-runtime@^0.10.5:
+  version "0.10.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
+regenerator-runtime@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1"
+
+regenerator-transform@^0.10.0:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+  dependencies:
+    babel-runtime "^6.18.0"
+    babel-types "^6.19.0"
+    private "^0.1.6"
+
+regex-cache@^0.4.2:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+
+regexpu-core@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regexpu-core@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+  dependencies:
+    jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+request@2, request@^2.79.0:
+  version "2.83.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.6.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.1"
+    forever-agent "~0.6.1"
+    form-data "~2.3.1"
+    har-validator "~5.0.3"
+    hawk "~6.0.2"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.17"
+    oauth-sign "~0.8.2"
+    performance-now "^2.1.0"
+    qs "~6.5.1"
+    safe-buffer "^5.1.1"
+    stringstream "~0.0.5"
+    tough-cookie "~2.3.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.1.0"
+
+request@2.81.0:
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-from-string@^1.1.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+resolve@1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.2.0, resolve@^1.3.2:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
+  dependencies:
+    path-parse "^1.0.5"
+
+right-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+  dependencies:
+    align-text "^0.1.1"
+
+rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
+  dependencies:
+    hash-base "^2.0.0"
+    inherits "^2.0.1"
+
+safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+sane@~1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775"
+  dependencies:
+    anymatch "^1.3.0"
+    exec-sh "^0.2.0"
+    fb-watchman "^1.8.0"
+    minimatch "^3.0.2"
+    minimist "^1.1.1"
+    walker "~1.0.5"
+    watch "~0.10.0"
+
+sass-graph@^2.2.4:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49"
+  dependencies:
+    glob "^7.0.0"
+    lodash "^4.0.0"
+    scss-tokenizer "^0.2.3"
+    yargs "^7.0.0"
+
+sass-loader@^6.0.3:
+  version "6.0.6"
+  resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-6.0.6.tgz#e9d5e6c1f155faa32a4b26d7a9b7107c225e40f9"
+  dependencies:
+    async "^2.1.5"
+    clone-deep "^0.3.0"
+    loader-utils "^1.0.1"
+    lodash.tail "^4.1.1"
+    pify "^3.0.0"
+
+sax@^1.2.1, sax@~1.2.1:
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+scss-tokenizer@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
+  dependencies:
+    js-base64 "^2.1.8"
+    source-map "^0.4.2"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+  version "5.4.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
+
+semver@~5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+send@0.16.1:
+  version "0.16.1"
+  resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3"
+  dependencies:
+    debug "2.6.9"
+    depd "~1.1.1"
+    destroy "~1.0.4"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    fresh "0.5.2"
+    http-errors "~1.6.2"
+    mime "1.4.1"
+    ms "2.0.0"
+    on-finished "~2.3.0"
+    range-parser "~1.2.0"
+    statuses "~1.3.1"
+
+serve-static@1.13.1:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
+  dependencies:
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    parseurl "~1.3.2"
+    send "0.16.1"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+setimmediate@^1.0.4, setimmediate@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+setprototypeof@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+  version "2.4.9"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d"
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shallow-clone@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-0.1.2.tgz#5909e874ba77106d73ac414cfec1ffca87d97060"
+  dependencies:
+    is-extendable "^0.1.1"
+    kind-of "^2.0.1"
+    lazy-cache "^0.2.3"
+    mixin-object "^2.0.1"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shellwords@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+
+signal-exit@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+sntp@1.x.x:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+  dependencies:
+    hoek "2.x.x"
+
+sntp@2.x.x:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8"
+  dependencies:
+    hoek "4.x.x"
+
+sort-keys@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+source-list-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-support@^0.4.15:
+  version "0.4.18"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+  dependencies:
+    source-map "^0.5.6"
+
+source-map@^0.4.2, source-map@^0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+  dependencies:
+    amdefine ">=0.0.4"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.1, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+  dependencies:
+    spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+"statuses@>= 1.3.1 < 2":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+statuses@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stdout-stream@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b"
+  dependencies:
+    readable-stream "^2.0.1"
+
+stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-http@^2.3.1:
+  version "2.7.2"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad"
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.2.6"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+
+string-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac"
+  dependencies:
+    strip-ansi "^3.0.0"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string_decoder@^0.10.25:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+stringstream@~0.0.4, stringstream@~0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-bom@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-indent@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+  dependencies:
+    get-stdin "^4.0.1"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+style-loader@^0.16.1:
+  version "0.16.1"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.16.1.tgz#50e325258d4e78421dd9680636b41e8661595d10"
+  dependencies:
+    loader-utils "^1.0.2"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.1.0, supports-color@^3.1.2, supports-color@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  dependencies:
+    has-flag "^1.0.0"
+
+supports-color@^4.0.0, supports-color@^4.4.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+  dependencies:
+    has-flag "^2.0.0"
+
+svgo@^0.7.0:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+  dependencies:
+    coa "~1.0.1"
+    colors "~1.1.2"
+    csso "~2.3.1"
+    js-yaml "~3.7.0"
+    mkdirp "~0.5.1"
+    sax "~1.2.1"
+    whet.extend "~0.9.9"
+
+symbol-tree@^3.2.1:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+tapable@^0.2.7, tapable@~0.2.5:
+  version "0.2.8"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tar-pack@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f"
+  dependencies:
+    debug "^2.2.0"
+    fstream "^1.0.10"
+    fstream-ignore "^1.0.5"
+    once "^1.3.3"
+    readable-stream "^2.1.4"
+    rimraf "^2.5.1"
+    tar "^2.2.1"
+    uid-number "^0.0.6"
+
+tar@^2.0.0, tar@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+test-exclude@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26"
+  dependencies:
+    arrify "^1.0.1"
+    micromatch "^2.3.11"
+    object-assign "^4.1.0"
+    read-pkg-up "^1.0.1"
+    require-main-filename "^1.0.1"
+
+throat@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836"
+
+timers-browserify@^2.0.2:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6"
+  dependencies:
+    setimmediate "^1.0.4"
+
+tmpl@1.0.x:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
+  dependencies:
+    punycode "^1.4.1"
+
+tr46@~0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+
+trim-newlines@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-is@~1.6.15:
+  version "1.6.15"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.15"
+
+ua-parser-js@^0.7.9:
+  version "0.7.17"
+  resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"
+
+uglify-js@^2.6, uglify-js@^2.8.27:
+  version "2.8.29"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+  dependencies:
+    source-map "~0.5.1"
+    yargs "~3.10.0"
+  optionalDependencies:
+    uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uid-number@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
+uniq@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+
+uniqid@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1"
+  dependencies:
+    macaddress "^0.2.8"
+
+uniqs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+url@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+user-home@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3, util@^0.10.3:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+
+uuid@^3.0.0, uuid@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04"
+
+v8flags@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
+  dependencies:
+    user-home "^1.1.1"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+  dependencies:
+    spdx-correct "~1.0.0"
+    spdx-expression-parse "~1.0.0"
+
+vary@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+
+vendors@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+vm-browserify@0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+walker@~1.0.5:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+  dependencies:
+    makeerror "1.0.x"
+
+watch@~0.10.0:
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc"
+
+watchpack@^1.3.1:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac"
+  dependencies:
+    async "^2.1.2"
+    chokidar "^1.7.0"
+    graceful-fs "^4.1.2"
+
+webidl-conversions@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+
+webidl-conversions@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+webpack-merge@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.1.tgz#f1197a0a973e69c6fbeeb6d658219aa8c0c13555"
+  dependencies:
+    lodash "^4.17.4"
+
+webpack-node-externals@^1.5.4:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.6.0.tgz#232c62ec6092b100635a3d29d83c1747128df9bd"
+
+webpack-sources@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.2.tgz#d0148ec083b3b5ccef1035a6b3ec16442983b27a"
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack@^2.2.1:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.7.0.tgz#b2a1226804373ffd3d03ea9c6bd525067034f6b1"
+  dependencies:
+    acorn "^5.0.0"
+    acorn-dynamic-import "^2.0.0"
+    ajv "^4.7.0"
+    ajv-keywords "^1.1.1"
+    async "^2.1.2"
+    enhanced-resolve "^3.3.0"
+    interpret "^1.0.0"
+    json-loader "^0.5.4"
+    json5 "^0.5.1"
+    loader-runner "^2.3.0"
+    loader-utils "^0.2.16"
+    memory-fs "~0.4.1"
+    mkdirp "~0.5.0"
+    node-libs-browser "^2.0.0"
+    source-map "^0.5.3"
+    supports-color "^3.1.0"
+    tapable "~0.2.5"
+    uglify-js "^2.8.27"
+    watchpack "^1.3.1"
+    webpack-sources "^1.0.1"
+    yargs "^6.0.0"
+
+whatwg-encoding@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
+  dependencies:
+    iconv-lite "0.4.19"
+
+whatwg-fetch@>=0.10.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
+
+whatwg-url@^4.3.0:
+  version "4.8.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0"
+  dependencies:
+    tr46 "~0.0.3"
+    webidl-conversions "^3.0.0"
+
+whet.extend@~0.9.9:
+  version "0.9.9"
+  resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+
+which-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which@1, which@^1.2.12, which@^1.2.9:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+  dependencies:
+    string-width "^1.0.2"
+
+window-size@0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~0.0.2:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wordwrap@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+worker-farm@^1.3.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.1.tgz#8e9f4a7da4f3c595aa600903051b969390423fa1"
+  dependencies:
+    errno "^0.1.4"
+    xtend "^4.0.1"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xml-name-validator@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
+
+xtend@^4.0.0, xtend@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yargs-parser@^4.2.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+  dependencies:
+    camelcase "^3.0.0"
+
+yargs-parser@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
+  dependencies:
+    camelcase "^3.0.0"
+
+yargs@^6.0.0:
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+  dependencies:
+    camelcase "^3.0.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^1.4.0"
+    read-pkg-up "^1.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^1.0.2"
+    which-module "^1.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^4.2.0"
+
+yargs@^7.0.0, yargs@^7.0.2:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
+  dependencies:
+    camelcase "^3.0.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^1.4.0"
+    read-pkg-up "^1.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^1.0.2"
+    which-module "^1.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^5.0.0"
+
+yargs@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+  dependencies:
+    camelcase "^1.0.2"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    window-size "0.1.0"

From 835e6eaa1c7c4bc252061a119aac72d701b85626 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 6 Nov 2017 21:35:30 -0800
Subject: [PATCH 075/158] replace `Observed` component with `react-observed`

---
 package.json               |  9 ++--
 src/components/Observed.js | 84 --------------------------------------
 src/components/Parallax.js | 24 +++++++----
 src/components/index.js    |  1 -
 yarn.lock                  |  4 ++
 5 files changed, 26 insertions(+), 96 deletions(-)
 delete mode 100644 src/components/Observed.js

diff --git a/package.json b/package.json
index 56b7ee8dd..ea8bc5553 100644
--- a/package.json
+++ b/package.json
@@ -8,11 +8,11 @@
     },
     "main": "lib/index.js",
     "scripts": {
-        "dev": "jest && webpack --progress --colors --watch",
+        "dev": "yarn test && webpack --progress --colors --watch",
         "dev-server": "node ./example/dist/server",
         "gh-pages": "NODE_ENV=production webpack --progress --colors",
-        "test": "jest",
-        "test:watch": "jest --watch",
+        "test": "BABEL_ENV=test jest",
+        "test:watch": "BABEL_ENV=test jest --watch",
         "prettier":
             "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
         "prepublish":
@@ -27,7 +27,8 @@
     "dependencies": {
         "prop-types": "^15.5.10",
         "react": "^15.0.0",
-        "react-dom": "^15.0.0"
+        "react-dom": "^15.0.0",
+        "react-observed": "^1.0.0-beta.1"
     },
     "devDependencies": {
         "babel-cli": "^6.24.1",
diff --git a/src/components/Observed.js b/src/components/Observed.js
deleted file mode 100644
index 64165fc23..000000000
--- a/src/components/Observed.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/* global IntersectionObserver */
-
-import React, { Component } from 'react';
-import PropTypes from 'prop-types';
-
-// With Observer creates a new IntersectionObserver
-// that passes an `isInView` prop to wrapped components
-// IntersectionObserver will require a polyfill
-
-class Observed extends Component {
-    state = {
-        isInView: true, // initial state should be visible so that the scrollY is updated.
-    };
-
-    options = {
-        root: null, // document.querySelector('#scrollArea')
-        rootMargin: '0px',
-        threshold: [0.1, 0.2, 0.4, 0.6, 0.8, 1.0], // 1.0 = 100% of the el is visible, can be an array of values. callback is invoke when each is true
-    };
-
-    componentDidMount() {
-        this.createObserver();
-        this.observe();
-    }
-
-    componentWillUnmount() {
-        this.disconnectObserver();
-    }
-
-    mapRef = ref => {
-        // NOTE: This ref will be the bounds of the
-        // element and be provided by the withBounds HOC
-        this.el = ref;
-    };
-
-    createObserver() {
-        this.checkForObserver();
-
-        this.observer = new IntersectionObserver(
-            this.handleIntersection,
-            this.options
-        );
-    }
-
-    checkForObserver() {
-        // NOTE: Error handling if the observer is not available
-        // This should be provided by the user via a polyfill
-
-        const hasObserver = 'IntersectionObserver' in window;
-        if (!hasObserver) {
-            throw new Error(
-                'Must provide an IntersectionObserver polyfill for browsers that do not yet support the technology.'
-            );
-        }
-    }
-
-    disconnectObserver() {
-        if (this.observer) {
-            this.observer.disconnect();
-        }
-    }
-
-    observe() {
-        const el = this.el;
-        this.observer.observe(el);
-    }
-
-    handleIntersection = (entries, observer) => {
-        entries.forEach(entry => {
-            const isInView = entry.intersectionRatio > 0.01;
-
-            this.setState(() => ({ isInView }));
-        });
-    };
-
-    render() {
-        const { isInView } = this.state;
-        const { mapRef } = this;
-
-        return this.props.children({ isInView, mapRef });
-    }
-}
-
-export default Observed;
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 68f18da95..e96f5246e 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -1,14 +1,20 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import { parseOffsetUnits } from '../utils';
-import {
-    Observed,
-    ScrollPosition,
-    ScrollEffects,
-    ViewportProgress,
-} from './index.js';
+import Observed from 'react-observed';
+import { ScrollPosition, ScrollEffects, ViewportProgress } from './index.js';
+
+const observerOptions = {
+    root: null,
+    rootMargin: '10px',
+    threshold: [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
+};
 
 class Parallax extends Component {
+    static defaultProps = {
+        observerOptions,
+    };
+
     static propTypes = {
         children: PropTypes.node.isRequired,
         className: PropTypes.string,
@@ -16,6 +22,7 @@ class Parallax extends Component {
         y: PropTypes.array,
         scale: PropTypes.array,
         opacity: PropTypes.array,
+        observerOptions: PropTypes.object.isRequired,
         // @TODO: these should also be available:
         // rotation
         // tag/element name?
@@ -188,7 +195,10 @@ class Parallax extends Component {
         // renderMarkup(isInView, style, refCallbacks)
 
         return (
-            <Observed>
+            <Observed
+                intersectionRatio={0.01}
+                options={this.props.observerOptions}
+            >
                 {({ isInView, mapRef: mapRefObserved }) => (
                     <ScrollPosition isInView={isInView}>
                         {({ scrollY }) => (
diff --git a/src/components/index.js b/src/components/index.js
index 53c693323..41edfe351 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -1,5 +1,4 @@
 // Components
-export Observed from './Observed.js';
 export Parallax from './Parallax.js';
 export ScrollEffects from './ScrollEffects.js';
 export ScrollPosition from './ScrollPosition.js';
diff --git a/yarn.lock b/yarn.lock
index 8c5743a04..a56ade08a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4044,6 +4044,10 @@ react-dom@^15.0.0:
     object-assign "^4.1.0"
     prop-types "^15.5.10"
 
+react-observed@^1.0.0-beta.1:
+  version "1.0.0-beta.1"
+  resolved "https://registry.yarnpkg.com/react-observed/-/react-observed-1.0.0-beta.1.tgz#6529ea2dcafb6412cf3b6b7e0393d5d6a460ac1f"
+
 react-test-renderer@^15.6.1:
   version "15.6.2"
   resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.2.tgz#d0333434fc2c438092696ca770da5ed48037efa8"

From 8bb59e7c9bab91ae04d173fac0b6bbe1a8e0e750 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 6 Nov 2017 22:09:43 -0800
Subject: [PATCH 076/158] add `Subscribers` controller base class, extend
 `ScrollController` from `Subscribers`

---
 .../ScrollController.js                       | 32 +++-----------
 src/controllers/Subscribers.js                | 42 +++++++++++++++++++
 src/index.js                                  |  4 +-
 3 files changed, 49 insertions(+), 29 deletions(-)
 rename src/{models => controllers}/ScrollController.js (67%)
 create mode 100644 src/controllers/Subscribers.js

diff --git a/src/models/ScrollController.js b/src/controllers/ScrollController.js
similarity index 67%
rename from src/models/ScrollController.js
rename to src/controllers/ScrollController.js
index f3a260291..95ebdb340 100644
--- a/src/models/ScrollController.js
+++ b/src/controllers/ScrollController.js
@@ -1,4 +1,5 @@
 import { testForPassiveScroll } from '../utils/index';
+import Subscribers from './Subscribers';
 
 /**
  * -------------------------------------------------------
@@ -10,8 +11,9 @@ import { testForPassiveScroll } from '../utils/index';
  *
  */
 
-class ScrollController {
+class ScrollController extends Subscribers {
     constructor() {
+        super();
         this._addListeners();
     }
 
@@ -24,9 +26,6 @@ class ScrollController {
         scrollY: 0,
     };
 
-    // Subscriptions to the controller
-    subscriptions = [];
-
     // Passive support test
     supportsPassive = testForPassiveScroll();
 
@@ -35,21 +34,9 @@ class ScrollController {
         // Save current scroll
         const scrollY = window.pageYOffset; // Supports IE 9 and up.
 
-        this.state = {
+        this.setState({
             scrollY,
-        };
-
-        // update subscribers
-        // window.requestAnimationFrame(this._updateSubscribers);
-        this._updateSubscribers();
-    };
-
-    _updateSubscribers = () => {
-        this.subscriptions.forEach(f => f(this.state));
-    };
-
-    _updateSingleSubscriber = f => {
-        f(this.state);
+        });
     };
 
     _addListeners() {
@@ -71,15 +58,6 @@ class ScrollController {
     destroy() {
         this._removeListeners();
     }
-
-    subscribe(f) {
-        this.subscriptions.push(f);
-        this._updateSingleSubscriber(f);
-    }
-
-    unsubscribe(f) {
-        this.subscriptions = this.subscriptions.filter(x => f !== x);
-    }
 }
 
 export default ScrollController;
diff --git a/src/controllers/Subscribers.js b/src/controllers/Subscribers.js
new file mode 100644
index 000000000..384cee370
--- /dev/null
+++ b/src/controllers/Subscribers.js
@@ -0,0 +1,42 @@
+import { testForPassiveScroll } from '../utils/index';
+
+/**
+ * -------------------------------------------------------
+ * Subscribers
+ * -------------------------------------------------------
+ *
+ * Base class for controlling subscriptions
+ * Manages Subscribers and updates them when state changes.
+ *
+ */
+
+class Subscribers {
+    // Subscriptions to the controller
+    subscriptions = [];
+
+    state = {};
+
+    _updateSubscribers = () => {
+        this.subscriptions.forEach(f => f(this.state));
+    };
+
+    _updateSingleSubscriber = f => {
+        f(this.state);
+    };
+
+    setState(nextState) {
+        this.state = Object.assign({}, this.state, nextState);
+        this._updateSubscribers();
+    }
+
+    subscribe(f) {
+        this.subscriptions.push(f);
+        this._updateSingleSubscriber(f);
+    }
+
+    unsubscribe(f) {
+        this.subscriptions = this.subscriptions.filter(x => f !== x);
+    }
+}
+
+export default Subscribers;
diff --git a/src/index.js b/src/index.js
index 88a72f78b..5f7fd4687 100644
--- a/src/index.js
+++ b/src/index.js
@@ -2,5 +2,5 @@
 export ScrollProvider from './components/ScrollProvider.js';
 export Parallax from './components/Parallax.js';
 
-// Models
-export ScrollController from './models/ScrollController.js';
+// Controllers
+export ScrollController from './controllers/ScrollController.js';

From 13aece688fcc92aa67971046d180a7eec7230bc4 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 6 Nov 2017 23:01:05 -0800
Subject: [PATCH 077/158] add `ResizeController`, refactor components using
 resize event listeners to use new controller

---
 example/components/App/App.js                 | 16 +++---
 src/components/Parallax.js                    | 21 ++++----
 ...{ScrollProvider.js => ParallaxProvider.js} | 11 ++--
 src/components/ViewportProgress.js            | 33 ++++--------
 src/components/index.js                       |  2 +-
 src/controllers/ResizeController.js           | 50 +++++++++++++++++++
 src/index.js                                  |  5 +-
 7 files changed, 92 insertions(+), 46 deletions(-)
 rename src/components/{ScrollProvider.js => ParallaxProvider.js} (69%)
 create mode 100644 src/controllers/ResizeController.js

diff --git a/example/components/App/App.js b/example/components/App/App.js
index 5aa2c34d5..13641624f 100644
--- a/example/components/App/App.js
+++ b/example/components/App/App.js
@@ -1,13 +1,13 @@
 import React, { Component } from 'react';
-import { ScrollProvider } from 'react-scroll-parallax';
+import { ParallaxProvider } from 'react-scroll-parallax';
 import { ParallaxTest } from 'components';
 
 export default class App extends Component {
-    render() {
-        return (
-            <ScrollProvider>
-                <ParallaxTest />
-            </ScrollProvider>
-        );
-    }
+	render() {
+		return (
+			<ParallaxProvider>
+				<ParallaxTest />
+			</ParallaxProvider>
+		);
+	}
 }
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index e96f5246e..dd4f85af8 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -15,6 +15,10 @@ class Parallax extends Component {
         observerOptions,
     };
 
+    static contextTypes = {
+        resizeController: PropTypes.object, // not required because this could be rendered on the server.
+    };
+
     static propTypes = {
         children: PropTypes.node.isRequired,
         className: PropTypes.string,
@@ -34,21 +38,18 @@ class Parallax extends Component {
     };
 
     componentDidMount() {
-        this.addListeners();
         this.parseOffsetUnits();
-        this.setBoundsStyle();
-    }
 
-    componentWillUnmount() {
-        this.removeListeners();
+        // subscribe to resize changes with handler to update bounds
+        const { resizeController } = this.context;
+        resizeController.subscribe(this.handleResize);
     }
 
-    addListeners() {
-        window.addEventListener('resize', this.handleResize, false);
-    }
+    componentWillUnmount() {
+        const { resizeController } = this.context;
 
-    removeListeners() {
-        window.removeEventListener('resize', this.handleResize, false);
+        // Unsubscribe to resize updates by passing the subscribed handler
+        resizeController.unsubscribe(this.handleResize);
     }
 
     parseOffsetUnits() {
diff --git a/src/components/ScrollProvider.js b/src/components/ParallaxProvider.js
similarity index 69%
rename from src/components/ScrollProvider.js
rename to src/components/ParallaxProvider.js
index 518f8f324..f63c3ac26 100644
--- a/src/components/ScrollProvider.js
+++ b/src/components/ParallaxProvider.js
@@ -1,20 +1,21 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-import { ScrollController } from 'react-scroll-parallax';
+import { ScrollController, ResizeController } from 'react-scroll-parallax';
 
-export default class ScrollProvider extends Component {
+export default class ParallaxProvider extends Component {
     static propTypes = {
         children: PropTypes.node.isRequired,
     };
 
     static childContextTypes = {
         scrollController: PropTypes.object,
+        resizeController: PropTypes.object,
     };
 
     getChildContext() {
         // Passes down the reference to the controller
-        const { scrollController } = this;
-        return { scrollController };
+        const { scrollController, resizeController } = this;
+        return { scrollController, resizeController };
     }
 
     componentWillMount() {
@@ -24,6 +25,7 @@ export default class ScrollProvider extends Component {
         if (hasWindow) {
             // Must not be the server so kick it off...
             this.scrollController = ScrollController.init();
+            this.resizeController = ResizeController.init();
         }
     }
 
@@ -31,6 +33,7 @@ export default class ScrollProvider extends Component {
         if (this.scrollController) {
             // Remove scroll and resize listener if the provider is unmounted
             this.scrollController.destroy();
+            this.resizeController.destroy();
         }
     }
 
diff --git a/src/components/ViewportProgress.js b/src/components/ViewportProgress.js
index bd5ce3ef9..f981c5321 100644
--- a/src/components/ViewportProgress.js
+++ b/src/components/ViewportProgress.js
@@ -13,6 +13,10 @@ class ViewportProgress extends Component {
         range: [0, 1],
     };
 
+    static contextTypes = {
+        resizeController: PropTypes.object, // not required because this could be rendered on the server.
+    };
+
     static propTypes = {
         isInView: PropTypes.bool.isRequired,
         range: PropTypes.array.isRequired,
@@ -28,9 +32,11 @@ class ViewportProgress extends Component {
     }
 
     componentDidMount() {
-        this.setAttributeCache();
+        // subscribe to resize changes with handler to update cache
+        const { resizeController } = this.context;
+        resizeController.subscribe(this.updateAttributeCache);
+
         this.setProgress();
-        this.addListeners();
     }
 
     componentWillReceiveProps(nextProps) {
@@ -43,32 +49,16 @@ class ViewportProgress extends Component {
     }
 
     componentWillUnmount() {
-        this.removeListeners();
-    }
+        const { resizeController } = this.context;
 
-    addListeners() {
-        window.addEventListener('resize', this.handleResize, false);
-    }
-
-    removeListeners() {
-        window.removeEventListener('resize', this.handleResize, false);
+        // Unsubscribe to resize updates by passing the subscribed handler
+        resizeController.unsubscribe(this.updateAttributeCache);
     }
 
     updateAttributeCache = () => {
         this.setAttributeCache();
     };
 
-    handleResize = () => {
-        const resizeKey = `resize-${window.innerWidth}`;
-
-        this.setState(
-            () => ({
-                resizeKey,
-            }),
-            this.setAttributeCache // update cached attributes
-        );
-    };
-
     mapRef = ref => {
         this.el = ref;
     };
@@ -76,7 +66,6 @@ class ViewportProgress extends Component {
     setAttributeCache() {
         // This caches properties that cause layout thrash
 
-        // Accessing the el withBounds() HOC
         const el = this.el;
 
         const _rect = el.getBoundingClientRect();
diff --git a/src/components/index.js b/src/components/index.js
index 41edfe351..d67d9582d 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -2,5 +2,5 @@
 export Parallax from './Parallax.js';
 export ScrollEffects from './ScrollEffects.js';
 export ScrollPosition from './ScrollPosition.js';
-export ScrollProvider from './ScrollProvider.js';
+export ParallaxProvider from './ParallaxProvider.js';
 export ViewportProgress from './ViewportProgress.js';
diff --git a/src/controllers/ResizeController.js b/src/controllers/ResizeController.js
new file mode 100644
index 000000000..85fcb831d
--- /dev/null
+++ b/src/controllers/ResizeController.js
@@ -0,0 +1,50 @@
+import { testForPassiveResize } from '../utils/index';
+import Subscribers from './Subscribers';
+
+/**
+ * -------------------------------------------------------
+ * Resize Controller
+ * -------------------------------------------------------
+ *
+ * The resize controller for setting up window
+ * resize event and updating subscribers when the
+ * window size has changed.
+ *
+ */
+
+class ResizeController extends Subscribers {
+    constructor() {
+        super();
+        this._addListeners();
+    }
+
+    static init() {
+        return new ResizeController();
+    }
+
+    state = {
+        width: 0,
+    };
+
+    _handleResize = () => {
+        const width = window.innerWidth;
+
+        this.setState({
+            width,
+        });
+    };
+
+    _addListeners() {
+        window.addEventListener('resize', this._handleResize, false);
+    }
+
+    _removeListeners() {
+        window.removeEventListener('resize', this._handleResize, false);
+    }
+
+    destroy() {
+        this._removeListeners();
+    }
+}
+
+export default ResizeController;
diff --git a/src/index.js b/src/index.js
index 5f7fd4687..a15b15536 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,6 +1,9 @@
+// @TODO: update exports to include all public files for package
+
 // Components
-export ScrollProvider from './components/ScrollProvider.js';
+export ParallaxProvider from './components/ParallaxProvider.js';
 export Parallax from './components/Parallax.js';
 
 // Controllers
 export ScrollController from './controllers/ScrollController.js';
+export ResizeController from './controllers/ResizeController.js';

From 9198c9cbc439c770f6eebe89da5650471e0c4408 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 00:39:04 -0800
Subject: [PATCH 078/158] update `ParallaxProvider` test

---
 __tests__/ParallaxProvider.test.js            | 97 +++++++++++++++++++
 __tests__/ScrollProvider.test.js              | 62 ------------
 ....js.snap => ParallaxProvider.test.js.snap} |  2 +-
 3 files changed, 98 insertions(+), 63 deletions(-)
 create mode 100644 __tests__/ParallaxProvider.test.js
 delete mode 100644 __tests__/ScrollProvider.test.js
 rename __tests__/__snapshots__/{ScrollProvider.test.js.snap => ParallaxProvider.test.js.snap} (58%)

diff --git a/__tests__/ParallaxProvider.test.js b/__tests__/ParallaxProvider.test.js
new file mode 100644
index 000000000..85208c47d
--- /dev/null
+++ b/__tests__/ParallaxProvider.test.js
@@ -0,0 +1,97 @@
+/* global describe, it */
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import ReactDOM from 'react-dom';
+import {
+    ParallaxProvider,
+    ScrollController,
+    ResizeController,
+} from 'react-scroll-parallax';
+import renderer from 'react-test-renderer';
+
+describe('A <ParallaxProvider>', () => {
+    it('to render children', () => {
+        const component = renderer.create(
+            <ParallaxProvider>
+                <img src="foo" alt="bar" />
+            </ParallaxProvider>
+        );
+        const tree = component.toJSON();
+        expect(tree).toMatchSnapshot();
+    });
+
+    it('to pass the Scroll Controller context', () => {
+        const node = document.createElement('div');
+
+        let rootCtx;
+        const ContextChecker = (props, context) => {
+            rootCtx = context;
+            return null;
+        };
+
+        const testController = ScrollController.init();
+
+        ContextChecker.contextTypes = {
+            scrollController: PropTypes.shape({
+                destroy: PropTypes.func.isRequired,
+                subscribe: PropTypes.func.isRequired,
+                unsubscribe: PropTypes.func.isRequired,
+            }),
+        };
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <ContextChecker />
+            </ParallaxProvider>,
+            node
+        );
+
+        // Expected methods and state
+        expect(rootCtx.scrollController.state.scrollY).toBe(0);
+        expect(rootCtx.scrollController.subscribe).toBe(
+            testController.subscribe
+        );
+        expect(rootCtx.scrollController.unsubscribe).toBe(
+            testController.unsubscribe
+        );
+        expect(rootCtx.scrollController.destroy).toBe(testController.destroy);
+    });
+
+    it('to pass the Resize Controller context', () => {
+        const node = document.createElement('div');
+
+        let rootCtx;
+        const ContextChecker = (props, context) => {
+            rootCtx = context;
+            return null;
+        };
+
+        const testController = ResizeController.init();
+
+        ContextChecker.contextTypes = {
+            resizeController: PropTypes.shape({
+                destroy: PropTypes.func.isRequired,
+                subscribe: PropTypes.func.isRequired,
+                unsubscribe: PropTypes.func.isRequired,
+            }),
+        };
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <ContextChecker />
+            </ParallaxProvider>,
+            node
+        );
+
+        // Expected methods and state
+        expect(rootCtx.resizeController.state.width).toBe(0);
+        expect(rootCtx.resizeController.subscribe).toBe(
+            testController.subscribe
+        );
+        expect(rootCtx.resizeController.unsubscribe).toBe(
+            testController.unsubscribe
+        );
+        expect(rootCtx.resizeController.destroy).toBe(testController.destroy);
+    });
+});
diff --git a/__tests__/ScrollProvider.test.js b/__tests__/ScrollProvider.test.js
deleted file mode 100644
index 273744f9b..000000000
--- a/__tests__/ScrollProvider.test.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/* global describe, it */
-
-import React from 'react';
-import PropTypes from 'prop-types';
-import ReactDOM from 'react-dom';
-import { ScrollProvider, ScrollController } from 'react-scroll-parallax';
-import renderer from 'react-test-renderer';
-
-describe('A <ScrollProvider>', () => {
-    it('to render children', () => {
-        const component = renderer.create(
-            <ScrollProvider>
-                <img src="foo" alt="bar" />
-            </ScrollProvider>
-        );
-        const tree = component.toJSON();
-        expect(tree).toMatchSnapshot();
-    });
-
-    it('to pass context', () => {
-        const node = document.createElement('div');
-
-        let rootContext;
-        const ContextChecker = (props, context) => {
-            rootContext = context;
-            return null;
-        };
-
-        const testController = ScrollController.init();
-
-        ContextChecker.contextTypes = {
-            scrollController: PropTypes.shape({
-                destroy: PropTypes.func.isRequired,
-                subscribe: PropTypes.func.isRequired,
-                unsubscribe: PropTypes.func.isRequired,
-            }),
-        };
-
-        // afterEach(() => {
-        //     rootContext = undefined;
-        // });
-
-        ReactDOM.render(
-            <ScrollProvider>
-                <ContextChecker />
-            </ScrollProvider>,
-            node
-        );
-
-        // Expected methods and state
-        expect(rootContext.scrollController.state.scrollY).toBe(0);
-        expect(rootContext.scrollController.subscribe).toBe(
-            testController.subscribe
-        );
-        expect(rootContext.scrollController.unsubscribe).toBe(
-            testController.unsubscribe
-        );
-        expect(rootContext.scrollController.destroy).toBe(
-            testController.destroy
-        );
-    });
-});
diff --git a/__tests__/__snapshots__/ScrollProvider.test.js.snap b/__tests__/__snapshots__/ParallaxProvider.test.js.snap
similarity index 58%
rename from __tests__/__snapshots__/ScrollProvider.test.js.snap
rename to __tests__/__snapshots__/ParallaxProvider.test.js.snap
index b455d14e7..538f5e7ad 100644
--- a/__tests__/__snapshots__/ScrollProvider.test.js.snap
+++ b/__tests__/__snapshots__/ParallaxProvider.test.js.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`A <ScrollProvider> to render children 1`] = `
+exports[`A <ParallaxProvider> to render children 1`] = `
 <img
   alt="bar"
   src="foo"

From 5ba4a39e25b8dc0897de01753c12e0664c0620d5 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 00:39:29 -0800
Subject: [PATCH 079/158] cleanup

---
 src/components/ParallaxProvider.js | 6 +++++-
 src/utils/compose.js               | 3 ---
 src/utils/index.js                 | 1 -
 3 files changed, 5 insertions(+), 5 deletions(-)
 delete mode 100644 src/utils/compose.js

diff --git a/src/components/ParallaxProvider.js b/src/components/ParallaxProvider.js
index f63c3ac26..f146f853a 100644
--- a/src/components/ParallaxProvider.js
+++ b/src/components/ParallaxProvider.js
@@ -30,9 +30,13 @@ export default class ParallaxProvider extends Component {
     }
 
     componentWillUnmount() {
+        // Remove scroll and resize listener if the provider is unmounted
+
         if (this.scrollController) {
-            // Remove scroll and resize listener if the provider is unmounted
             this.scrollController.destroy();
+        }
+
+        if (this.resizeController) {
             this.resizeController.destroy();
         }
     }
diff --git a/src/utils/compose.js b/src/utils/compose.js
deleted file mode 100644
index ec1b0d819..000000000
--- a/src/utils/compose.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function compose(...funcs) {
-    return funcs.reduce((a, b) => (...args) => a(b(...args)));
-}
diff --git a/src/utils/index.js b/src/utils/index.js
index e5968e84e..a66a5bf3c 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -1,5 +1,4 @@
 export clamp from './clamp';
-export compose from './compose';
 export parseUnit from './parseUnit';
 export parseOffsetUnits from './parseOffsetUnits';
 export scaleBetween from './scaleBetween';

From 660776aadb3b8d1bc93f027814b9683acb145118 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 09:55:47 -0800
Subject: [PATCH 080/158] add `parseUnit` test

---
 __tests__/parseUnit.test.js | 12 ++++++++++++
 1 file changed, 12 insertions(+)
 create mode 100644 __tests__/parseUnit.test.js

diff --git a/__tests__/parseUnit.test.js b/__tests__/parseUnit.test.js
new file mode 100644
index 000000000..56e59bcaf
--- /dev/null
+++ b/__tests__/parseUnit.test.js
@@ -0,0 +1,12 @@
+import parseUnit from 'utils/parseUnit.js';
+
+test('Parses a value and returns an object with the value and unit', () => {
+	expect(parseUnit('3450px')).toMatchObject({ unit: 'px', value: 3450 });
+	expect(parseUnit('1000')).toMatchObject({ unit: 'px', value: 1000 });
+	expect(parseUnit(980)).toMatchObject({ unit: 'px', value: 980 });
+	expect(parseUnit('86%')).toMatchObject({ unit: '%', value: 86 });
+	expect(parseUnit('1283fubar')).toMatchObject({
+		unit: 'fubar',
+		value: 1283,
+	});
+});

From 2eb830947e385b21e87dce4f47fded0c0c812d11 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 10:43:09 -0800
Subject: [PATCH 081/158] spaces

---
 __tests__/parseUnit.test.js | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/__tests__/parseUnit.test.js b/__tests__/parseUnit.test.js
index 56e59bcaf..af495e413 100644
--- a/__tests__/parseUnit.test.js
+++ b/__tests__/parseUnit.test.js
@@ -1,12 +1,12 @@
 import parseUnit from 'utils/parseUnit.js';
 
 test('Parses a value and returns an object with the value and unit', () => {
-	expect(parseUnit('3450px')).toMatchObject({ unit: 'px', value: 3450 });
-	expect(parseUnit('1000')).toMatchObject({ unit: 'px', value: 1000 });
-	expect(parseUnit(980)).toMatchObject({ unit: 'px', value: 980 });
-	expect(parseUnit('86%')).toMatchObject({ unit: '%', value: 86 });
-	expect(parseUnit('1283fubar')).toMatchObject({
-		unit: 'fubar',
-		value: 1283,
-	});
+    expect(parseUnit('3450px')).toMatchObject({ unit: 'px', value: 3450 });
+    expect(parseUnit('1000')).toMatchObject({ unit: 'px', value: 1000 });
+    expect(parseUnit(980)).toMatchObject({ unit: 'px', value: 980 });
+    expect(parseUnit('86%')).toMatchObject({ unit: '%', value: 86 });
+    expect(parseUnit('1283fubar')).toMatchObject({
+        unit: 'fubar',
+        value: 1283,
+    });
 });

From 764011d96ad548a6230e6134f470bec0226225c2 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 10:43:52 -0800
Subject: [PATCH 082/158] add `parseOffsetUnits` test

---
 __tests__/parseOffsetUnits.test.js | 54 ++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)
 create mode 100644 __tests__/parseOffsetUnits.test.js

diff --git a/__tests__/parseOffsetUnits.test.js b/__tests__/parseOffsetUnits.test.js
new file mode 100644
index 000000000..a4db96dce
--- /dev/null
+++ b/__tests__/parseOffsetUnits.test.js
@@ -0,0 +1,54 @@
+import parseOffsetUnits from 'utils/parseOffsetUnits.js';
+
+test('Parses the x and y units as an array of values', () => {
+    expect(
+        parseOffsetUnits({
+            x: [10, '-4px'],
+            y: ['-75%', 10],
+        })
+    ).toMatchObject({
+        x: [
+            {
+                unit: 'px',
+                value: 10,
+            },
+            {
+                unit: 'px',
+                value: -4,
+            },
+        ],
+        y: [
+            {
+                unit: '%',
+                value: -75,
+            },
+            {
+                unit: 'px',
+                value: 10,
+            },
+        ],
+    });
+
+    expect(
+        parseOffsetUnits({
+            y: [0, 0],
+        })
+    ).toMatchObject({
+        x: undefined,
+        y: [
+            {
+                unit: 'px',
+                value: 0,
+            },
+            {
+                unit: 'px',
+                value: 0,
+            },
+        ],
+    });
+
+    expect(parseOffsetUnits({})).toMatchObject({
+        x: undefined,
+        y: undefined,
+    });
+});

From 87519f05057c71d7cbb302e479e433a4a22de887 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 12:36:50 -0800
Subject: [PATCH 083/158] correct order of scaling params

---
 src/components/ScrollEffects.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/components/ScrollEffects.js b/src/components/ScrollEffects.js
index 775ad6e24..ae24436d3 100644
--- a/src/components/ScrollEffects.js
+++ b/src/components/ScrollEffects.js
@@ -49,25 +49,25 @@ class ScrollEffects extends Component {
 
         if (hasX) {
             values.x = {
-                value: scaleBetween(progress, x[0].value, x[1].value, 1, 0),
+                value: scaleBetween(progress, x[0].value, x[1].value, 0, 1),
                 unit: x[0].unit,
             };
         }
         if (hasY) {
             values.y = {
-                value: scaleBetween(progress, y[0].value, y[1].value, 1, 0),
+                value: scaleBetween(progress, y[0].value, y[1].value, 0, 1),
                 unit: y[0].unit,
             };
         }
         if (hasScale) {
             values.scale = {
-                value: scaleBetween(progress, scale[0], scale[1], 1, 0),
+                value: scaleBetween(progress, scale[0], scale[1], 0, 1),
                 unit: null,
             };
         }
         if (hasOpacity) {
             values.opacity = {
-                value: scaleBetween(progress, opacity[0], opacity[1], 1, 0),
+                value: scaleBetween(progress, opacity[0], opacity[1], 0, 1),
                 unit: null,
             };
         }

From 241b16bd731f796b67dee6fe85897b94c34c028d Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 12:37:29 -0800
Subject: [PATCH 084/158] remove gaurds on effect props because defaults should
 always be provided

---
 src/components/ScrollEffects.js | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/src/components/ScrollEffects.js b/src/components/ScrollEffects.js
index ae24436d3..2aa069160 100644
--- a/src/components/ScrollEffects.js
+++ b/src/components/ScrollEffects.js
@@ -78,11 +78,8 @@ class ScrollEffects extends Component {
     getStyles() {
         const { x, y, opacity, scale } = this.scaleValues();
 
-        const translateTransform =
-            x.value || y.value
-                ? `translate3d(${x.value}${x.unit}, ${y.value}${y.unit}, 0)`
-                : '';
-        const scaleTransform = scale.value ? `scale(${scale.value})` : '';
+        const translateTransform = `translate3d(${x.value}${x.unit}, ${y.value}${y.unit}, 0)`;
+        const scaleTransform = `scale(${scale.value})`;
 
         return {
             opacity: opacity.value,

From 2aa9f015a904c5e0b5c06fa83df1d5f4e3d7241f Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 12:38:14 -0800
Subject: [PATCH 085/158] add `ScrollEffects` test

---
 __tests__/ScrollEffects.test.js | 96 +++++++++++++++++++++++++++++++++
 src/index.js                    |  1 +
 2 files changed, 97 insertions(+)
 create mode 100644 __tests__/ScrollEffects.test.js

diff --git a/__tests__/ScrollEffects.test.js b/__tests__/ScrollEffects.test.js
new file mode 100644
index 000000000..f2ff403af
--- /dev/null
+++ b/__tests__/ScrollEffects.test.js
@@ -0,0 +1,96 @@
+/* global describe, it, IntersectionObserver */
+
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { ScrollEffects } from 'react-scroll-parallax';
+
+describe('Expect a <ScrollEffects> component', () => {
+    it('to take a function as a child', () => {
+        const node = document.createElement('div');
+
+        let func = false;
+
+        ReactDOM.render(
+            <ScrollEffects progress={0}>
+                {() => {
+                    func = true;
+                    return null;
+                }}
+            </ScrollEffects>,
+            node
+        );
+
+        expect(func).toBe(true);
+    });
+
+    it('to pass a default style object with opacity and transform keys', () => {
+        const node = document.createElement('div');
+
+        let testStyle = {};
+
+        ReactDOM.render(
+            <ScrollEffects progress={0}>
+                {({ style }) => {
+                    testStyle = style;
+                    return null;
+                }}
+            </ScrollEffects>,
+            node
+        );
+
+        expect(testStyle).toMatchObject({
+            transform: `translate3d(0px, 0px, 0) scale(1)`,
+            opacity: 1,
+        });
+    });
+
+    it('to transform style values based on effect props and progress', () => {
+        const node1 = document.createElement('div');
+        const node2 = document.createElement('div');
+
+        let testStyle1 = {};
+        let testStyle2 = {};
+
+        ReactDOM.render(
+            <ScrollEffects
+                progress={0.5}
+                x={[0, 0]}
+                y={['20px', '10px']}
+                opacity={[1, 0]}
+                scale={[0, 1]}
+            >
+                {({ style }) => {
+                    testStyle1 = style;
+                    return null;
+                }}
+            </ScrollEffects>,
+            node1
+        );
+
+        expect(testStyle1).toMatchObject({
+            transform: `translate3d(0px, 15px, 0) scale(0.5)`,
+            opacity: 0.5,
+        });
+
+        ReactDOM.render(
+            <ScrollEffects
+                progress={1}
+                x={['100%', '-100%']}
+                y={['100px', '-50px']}
+                opacity={[1, 0]}
+                scale={[0, 1]}
+            >
+                {({ style }) => {
+                    testStyle2 = style;
+                    return null;
+                }}
+            </ScrollEffects>,
+            node2
+        );
+
+        expect(testStyle2).toMatchObject({
+            transform: `translate3d(-100%, -50px, 0) scale(1)`,
+            opacity: 0,
+        });
+    });
+});
diff --git a/src/index.js b/src/index.js
index a15b15536..5e8a31486 100644
--- a/src/index.js
+++ b/src/index.js
@@ -3,6 +3,7 @@
 // Components
 export ParallaxProvider from './components/ParallaxProvider.js';
 export Parallax from './components/Parallax.js';
+export ScrollEffects from './components/ScrollEffects.js';
 
 // Controllers
 export ScrollController from './controllers/ScrollController.js';

From d2017f168a75fa8df9cd3b474d25bc41e9d9c6ee Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 12:44:59 -0800
Subject: [PATCH 086/158] cleanup `ScrollPosition`

---
 src/components/ScrollPosition.js | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/src/components/ScrollPosition.js b/src/components/ScrollPosition.js
index 5dbe5b499..4dea1e5b8 100644
--- a/src/components/ScrollPosition.js
+++ b/src/components/ScrollPosition.js
@@ -1,17 +1,17 @@
-import React, { PureComponent } from 'react';
+import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import { ScrollController } from 'react-scroll-parallax';
 
-// This HOC serves to connect a component via context
+// This component serves to connect via context
 // to the ScrollController which provides the current
-// scroll state that is then passed as props to the
-// <WrappedComponent />.
+// scroll state that is then passed as a param
+// of the child render callback.
 
 // NOTE: Since the scroll state should only be updated when
-// the element is in view, this HOC should be composed
-// within a withObserver() HOC.
+// the element is in view, this component must be provided
+// an isInView prop
 
-class ScrollPosition extends PureComponent {
+class ScrollPosition extends Component {
     static contextTypes = {
         scrollController: PropTypes.object, // not required because this could be rendered on the server.
     };

From d6e696cded5a56ca5c40d02d28a3d247ca41816f Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 13:01:41 -0800
Subject: [PATCH 087/158] add `ScrollPosition` test

---
 __tests__/ScrollPosition.test.js | 80 ++++++++++++++++++++++++++++++++
 src/index.js                     |  1 +
 2 files changed, 81 insertions(+)
 create mode 100644 __tests__/ScrollPosition.test.js

diff --git a/__tests__/ScrollPosition.test.js b/__tests__/ScrollPosition.test.js
new file mode 100644
index 000000000..2e45b1f96
--- /dev/null
+++ b/__tests__/ScrollPosition.test.js
@@ -0,0 +1,80 @@
+/* global describe, it, IntersectionObserver */
+
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { ScrollPosition, ParallaxProvider } from 'react-scroll-parallax';
+
+describe('Expect a <ScrollPosition> component', () => {
+    it('to throw if no scrollController is found in context', () => {
+        const node = document.createElement('div');
+        const render = () => {
+            ReactDOM.render(
+                <ScrollPosition isInView>{() => {}}</ScrollPosition>,
+                node
+            );
+        };
+
+        expect(render).toThrow(
+            "No scrollController exist in context. Must wrap your application's <Parallax> components in a <ScrollProvider />."
+        );
+    });
+
+    it('to take a function as a child', () => {
+        const node = document.createElement('div');
+        let func = false;
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <ScrollPosition isInView>
+                    {() => {
+                        func = true;
+                        return null;
+                    }}
+                </ScrollPosition>
+            </ParallaxProvider>,
+            node
+        );
+
+        expect(func).toBe(true);
+    });
+
+    it('to pass the scrollY value', () => {
+        const node = document.createElement('div');
+        let testScrollY = false;
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <ScrollPosition isInView>
+                    {({ scrollY }) => {
+                        testScrollY = scrollY;
+                        return null;
+                    }}
+                </ScrollPosition>
+            </ParallaxProvider>,
+            node
+        );
+
+        expect(testScrollY).toBe(0);
+    });
+
+    it('to pass a an object containing the scrollY key', () => {
+        const node = document.createElement('div');
+        let testObject = {};
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <ScrollPosition isInView>
+                    {object => {
+                        testObject = object;
+                        return null;
+                    }}
+                </ScrollPosition>
+            </ParallaxProvider>,
+            node
+        );
+
+        expect(testObject).toMatchObject({
+            scrollY: 0,
+        });
+    });
+});
diff --git a/src/index.js b/src/index.js
index 5e8a31486..e2942c66e 100644
--- a/src/index.js
+++ b/src/index.js
@@ -4,6 +4,7 @@
 export ParallaxProvider from './components/ParallaxProvider.js';
 export Parallax from './components/Parallax.js';
 export ScrollEffects from './components/ScrollEffects.js';
+export ScrollPosition from './components/ScrollPosition.js';
 
 // Controllers
 export ScrollController from './controllers/ScrollController.js';

From cb099b9aceba1624485b2b3c8aade23bfabf61e0 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 13:32:39 -0800
Subject: [PATCH 088/158] cleanup `ViewportProgress` and add error if no ref is
 provided

---
 src/components/ViewportProgress.js | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/components/ViewportProgress.js b/src/components/ViewportProgress.js
index f981c5321..f519f0668 100644
--- a/src/components/ViewportProgress.js
+++ b/src/components/ViewportProgress.js
@@ -2,9 +2,9 @@ import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import clamp from '../utils/clamp';
 
-// With Viewport Progress passes the progress prop
-// to wrapped components with a value ranging from
-// 0–1. 0 if the elements bounds has not entered
+// Viewport Progress passes the progress prop
+// to wrapped components with a default value ranging
+// from 0–1. 0 if the elements bounds has not entered
 // the beginning of the scroll area, 1 if the
 // element has left.
 
@@ -27,11 +27,12 @@ class ViewportProgress extends Component {
         super();
         this.state = {
             progress: props.range[0],
-            resizeKey: null, // a key to trigger a state change when the window resizes
         };
     }
 
     componentDidMount() {
+        this.checkForRef();
+
         // subscribe to resize changes with handler to update cache
         const { resizeController } = this.context;
         resizeController.subscribe(this.updateAttributeCache);
@@ -55,6 +56,15 @@ class ViewportProgress extends Component {
         resizeController.unsubscribe(this.updateAttributeCache);
     }
 
+    checkForRef() {
+        if (!this.el) {
+            // @TODO: probably should clarify the error or provide a link to docs.
+            throw new Error(
+                "Must provide a ref of the element to track progress. Use the ({ mapRef }) from the render callback as the handler for the element's ref prop."
+            );
+        }
+    }
+
     updateAttributeCache = () => {
         this.setAttributeCache();
     };
@@ -100,16 +110,18 @@ class ViewportProgress extends Component {
         const currentScroll = window.pageYOffset;
         const top = this.cache.rect.top - currentScroll; // this was the cached value so subtract the current scroll
         const { totalDist, windowHeight } = this.cache;
+        const { range } = this.props;
 
         // Percent the element has moved based on current and total distance to move
         let progress = 1 - (windowHeight - top) / totalDist;
 
         // NOTE: Clamping
         // Why? Because the isInView prop may be *slightly*
-        // off since Intersection Observer to be pixel-perfect
-        // accurate regardless.
+        // off since Intersection Observer is not expected
+        // to be pixel-perfect accurate. Regardless, we should
+        // exceed the given range.
 
-        progress = clamp(progress, 0, 1);
+        progress = clamp(progress, range[0], range[1]);
 
         this.setState(() => ({
             progress,

From c7f8b14e94585868d600e63cc9db1fca90c8901d Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 7 Nov 2017 13:43:08 -0800
Subject: [PATCH 089/158] add `ViewportProgress` test

---
 __tests__/ViewportProgress.test.js | 66 ++++++++++++++++++++++++++++++
 src/index.js                       |  1 +
 2 files changed, 67 insertions(+)
 create mode 100644 __tests__/ViewportProgress.test.js

diff --git a/__tests__/ViewportProgress.test.js b/__tests__/ViewportProgress.test.js
new file mode 100644
index 000000000..b84ee2046
--- /dev/null
+++ b/__tests__/ViewportProgress.test.js
@@ -0,0 +1,66 @@
+/* global describe, it, IntersectionObserver */
+
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { ViewportProgress, ParallaxProvider } from 'react-scroll-parallax';
+
+describe('Expect a <ViewportProgress> component', () => {
+    it('to take a function as a child', () => {
+        const node = document.createElement('div');
+        let func = false;
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <ViewportProgress isInView scrollY={0}>
+                    {({ mapRef }) => {
+                        func = true;
+                        return <div ref={mapRef} />;
+                    }}
+                </ViewportProgress>
+            </ParallaxProvider>,
+            node
+        );
+
+        expect(func).toBe(true);
+    });
+
+    it('to throw when no ref is provided', () => {
+        const node = document.createElement('div');
+        let func = false;
+
+        const render = () => {
+            ReactDOM.render(
+                <ParallaxProvider>
+                    <ViewportProgress isInView scrollY={0}>
+                        {() => null}
+                    </ViewportProgress>
+                </ParallaxProvider>,
+                node
+            );
+        };
+
+        expect(render).toThrow(
+            "Must provide a ref of the element to track progress. Use the ({ mapRef }) from the render callback as the handler for the element's ref prop."
+        );
+    });
+
+    it('to pass a an object containing the { progress, mapRef }w keys', () => {
+        const node = document.createElement('div');
+        let testObject = {};
+        ReactDOM.render(
+            <ParallaxProvider>
+                <ViewportProgress isInView scrollY={0}>
+                    {object => {
+                        testObject = object;
+                        return <div ref={object.mapRef} />;
+                    }}
+                </ViewportProgress>
+            </ParallaxProvider>,
+            node
+        );
+        expect(testObject).toMatchObject({
+            progress: 0,
+            mapRef: expect.any(Function),
+        });
+    });
+});
diff --git a/src/index.js b/src/index.js
index e2942c66e..50af24464 100644
--- a/src/index.js
+++ b/src/index.js
@@ -5,6 +5,7 @@ export ParallaxProvider from './components/ParallaxProvider.js';
 export Parallax from './components/Parallax.js';
 export ScrollEffects from './components/ScrollEffects.js';
 export ScrollPosition from './components/ScrollPosition.js';
+export ViewportProgress from './components/ViewportProgress.js';
 
 // Controllers
 export ScrollController from './controllers/ScrollController.js';

From 2bd537aefe9f8d2eeb25fcb7aa94c7818d9dbf82 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Wed, 8 Nov 2017 11:29:15 -0800
Subject: [PATCH 090/158] add prop defaults for x, y, opacity, and scale

---
 src/components/Parallax.js | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index dd4f85af8..da0cbf379 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -13,6 +13,10 @@ const observerOptions = {
 class Parallax extends Component {
     static defaultProps = {
         observerOptions,
+        x: [0, 0],
+        y: [0, 0],
+        scale: [1, 1],
+        opacity: [1, 1],
     };
 
     static contextTypes = {
@@ -22,10 +26,10 @@ class Parallax extends Component {
     static propTypes = {
         children: PropTypes.node.isRequired,
         className: PropTypes.string,
-        x: PropTypes.array,
-        y: PropTypes.array,
-        scale: PropTypes.array,
-        opacity: PropTypes.array,
+        x: PropTypes.array.isRequired,
+        y: PropTypes.array.isRequired,
+        scale: PropTypes.array.isRequired,
+        opacity: PropTypes.array.isRequired,
         observerOptions: PropTypes.object.isRequired,
         // @TODO: these should also be available:
         // rotation

From a03e39aac82add5eea78fa340f5d81ad9b965ef8 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Thu, 9 Nov 2017 13:02:57 -0800
Subject: [PATCH 091/158] update react-observed, set initial view state to true

---
 package.json               | 2 +-
 src/components/Parallax.js | 1 +
 yarn.lock                  | 6 +++---
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/package.json b/package.json
index ea8bc5553..3189f0f77 100644
--- a/package.json
+++ b/package.json
@@ -28,7 +28,7 @@
         "prop-types": "^15.5.10",
         "react": "^15.0.0",
         "react-dom": "^15.0.0",
-        "react-observed": "^1.0.0-beta.1"
+        "react-observed": "^1.0.0-beta.2"
     },
     "devDependencies": {
         "babel-cli": "^6.24.1",
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index da0cbf379..7a3b028d7 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -201,6 +201,7 @@ class Parallax extends Component {
 
         return (
             <Observed
+                initialViewState
                 intersectionRatio={0.01}
                 options={this.props.observerOptions}
             >
diff --git a/yarn.lock b/yarn.lock
index a56ade08a..0cc48856e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4044,9 +4044,9 @@ react-dom@^15.0.0:
     object-assign "^4.1.0"
     prop-types "^15.5.10"
 
-react-observed@^1.0.0-beta.1:
-  version "1.0.0-beta.1"
-  resolved "https://registry.yarnpkg.com/react-observed/-/react-observed-1.0.0-beta.1.tgz#6529ea2dcafb6412cf3b6b7e0393d5d6a460ac1f"
+react-observed@^1.0.0-beta.2:
+  version "1.0.0-beta.2"
+  resolved "https://registry.yarnpkg.com/react-observed/-/react-observed-1.0.0-beta.2.tgz#b41a4d58d817c00620dd1f80bce8618dbf5be68a"
 
 react-test-renderer@^15.6.1:
   version "15.6.2"

From ba7dbf30948a3c2649dba04cb7472a16b34116e9 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Thu, 9 Nov 2017 13:03:49 -0800
Subject: [PATCH 092/158] set progress after cache is updated in
 ViewportProgress

---
 src/components/ViewportProgress.js | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/components/ViewportProgress.js b/src/components/ViewportProgress.js
index f519f0668..ea0043184 100644
--- a/src/components/ViewportProgress.js
+++ b/src/components/ViewportProgress.js
@@ -36,8 +36,6 @@ class ViewportProgress extends Component {
         // subscribe to resize changes with handler to update cache
         const { resizeController } = this.context;
         resizeController.subscribe(this.updateAttributeCache);
-
-        this.setProgress();
     }
 
     componentWillReceiveProps(nextProps) {
@@ -104,6 +102,9 @@ class ViewportProgress extends Component {
         };
 
         // console.log('<ViewportProgress> cache updated');
+
+        // always update progress when cache updates.
+        this.setProgress();
     }
 
     setProgress() {

From a499d5e89afc407cf4ec2b7f07cb63debbffd7fa Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Thu, 9 Nov 2017 13:05:42 -0800
Subject: [PATCH 093/158] custom prop validation for x, y offsets

---
 src/components/Parallax.js  |  5 ++-
 src/utils/propValidation.js | 86 +++++++++++++++++++++++++++++++++++++
 2 files changed, 89 insertions(+), 2 deletions(-)
 create mode 100644 src/utils/propValidation.js

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 7a3b028d7..0d6649151 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -2,6 +2,7 @@ import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 import { parseOffsetUnits } from '../utils';
 import Observed from 'react-observed';
+import { validateOffsets } from '../utils/propValidation';
 import { ScrollPosition, ScrollEffects, ViewportProgress } from './index.js';
 
 const observerOptions = {
@@ -26,8 +27,8 @@ class Parallax extends Component {
     static propTypes = {
         children: PropTypes.node.isRequired,
         className: PropTypes.string,
-        x: PropTypes.array.isRequired,
-        y: PropTypes.array.isRequired,
+        x: validateOffsets,
+        y: validateOffsets,
         scale: PropTypes.array.isRequired,
         opacity: PropTypes.array.isRequired,
         observerOptions: PropTypes.object.isRequired,
diff --git a/src/utils/propValidation.js b/src/utils/propValidation.js
new file mode 100644
index 000000000..a76b4ff9f
--- /dev/null
+++ b/src/utils/propValidation.js
@@ -0,0 +1,86 @@
+import parseUnit from './parseUnit';
+
+export function validateOffsets(props, propName, componentName) {
+    componentName = componentName || 'ANONYMOUS';
+
+    let value = props[propName];
+    // console.log(value);
+
+    const isArray = Array.isArray(value);
+    const correctLength = value.length === 2;
+    const warning = `[${propName}] in <${componentName}>.`;
+    const valueProvided = `Instead the value provided was [${value}].`;
+
+    // Make sure it's an array
+    if (!isArray) {
+        return new Error(
+            `${warning} Must be an array of Numbers or Strings with '%' or 'px' as units. ${valueProvided}`
+        );
+    }
+
+    // Make sure it has the correct length of 2
+    if (isArray && !correctLength) {
+        return new Error(
+            `${warning} Must be an Array with a length of 2. ${valueProvided}`
+        );
+    }
+
+    // Make sure the values are strings or numbers
+    if (isArray && correctLength) {
+        let isValid = true;
+
+        value.forEach(val => {
+            isValid =
+                isValid && (typeof val === 'string' || typeof val === 'number');
+        });
+
+        if (!isValid) {
+            return new Error(
+                `${warning} Each item in the Array must be a Number or String with '%' or 'px' as units. ${valueProvided}`
+            );
+        }
+    }
+
+    // Make sure the units are correct
+    if (isArray && correctLength) {
+        const hasMatchingUnits = value.reduce((acc, val, idx) => {
+            const parsedValue = parseUnit(val);
+            if (!acc) {
+                // return the first unit
+                return parsedValue.unit;
+            } else {
+                // test if units match
+                return acc === parsedValue.unit;
+            }
+        }, null);
+
+        if (!hasMatchingUnits) {
+            return new Error(
+                `${warning} Each item in the Array must have matching units. ${valueProvided}`
+            );
+        }
+    }
+
+    // Make sure a valid unit is provided
+    if (isArray && correctLength) {
+        const validUnits = ['px', '%']; // NOTE: Allowing 'em', 'rem', 'vh', 'vw' would require bounds adjustments
+        const hasValidUnits = value.reduce((acc, val, idx) => {
+            const parsedValue = parseUnit(val);
+            if (acc) {
+                // test if previous passed
+                return validUnits.find(val => val === parsedValue.unit);
+            } else {
+                // return false if prev test failed
+                return false;
+            }
+        }, true);
+
+        if (!hasValidUnits) {
+            return new Error(
+                `${warning} Each item in the Array must have a valid unit of 'px' or '%'. ${valueProvided}`
+            );
+        }
+    }
+
+    return null;
+}

From 1dac036f2ff6fd78c6378c2e3a9584afa7134c64 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sun, 12 Nov 2017 13:57:16 -0800
Subject: [PATCH 094/158] validate for negative and positive values in offsets

---
 src/utils/index.js          |  1 +
 src/utils/propValidation.js | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/src/utils/index.js b/src/utils/index.js
index a66a5bf3c..61765a262 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -3,3 +3,4 @@ export parseUnit from './parseUnit';
 export parseOffsetUnits from './parseOffsetUnits';
 export scaleBetween from './scaleBetween';
 export testForPassiveScroll from './testForPassiveScroll';
+export propValidation from './propValidation';
diff --git a/src/utils/propValidation.js b/src/utils/propValidation.js
index a76b4ff9f..758c6ebfd 100644
--- a/src/utils/propValidation.js
+++ b/src/utils/propValidation.js
@@ -82,5 +82,23 @@ export function validateOffsets(props, propName, componentName) {
         }
     }
 
+    // Make sure a valid numbers are provided e.g. a negative and positive value
+    if (isArray && correctLength) {
+        const v1 = parseUnit(value[0]).value;
+        const v2 = parseUnit(value[1]).value;
+
+        const yMin = Math.min(v1, v2);
+        const yMax = Math.max(v1, v2);
+
+        const hasPositive = yMin <= 0;
+        const hasNegative = yMax >= 0;
+
+        if (!hasPositive || !hasNegative) {
+            return new Error(
+                `${warning} One value must be >= 0 and the other value <= 0. ${valueProvided}`
+            );
+        }
+    }
+
     return null;
 }

From 65019cf8b3e65b4a8874fd2e2cfb4799e3416ef9 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sun, 12 Nov 2017 14:38:14 -0800
Subject: [PATCH 095/158] add `Bounds` component for handling the observed
 boundry based on offsets and scale

---
 src/components/Bounds.js           | 198 +++++++++++++++++++++++++++
 src/components/Parallax.js         | 212 +++++------------------------
 src/components/ViewportProgress.js |   4 +-
 src/components/index.js            |   1 +
 4 files changed, 238 insertions(+), 177 deletions(-)
 create mode 100644 src/components/Bounds.js

diff --git a/src/components/Bounds.js b/src/components/Bounds.js
new file mode 100644
index 000000000..3b6c7918b
--- /dev/null
+++ b/src/components/Bounds.js
@@ -0,0 +1,198 @@
+import React, { Component } from 'react';
+import { parseOffsetUnits } from '../utils';
+import PropTypes from 'prop-types';
+
+class Bounds extends Component {
+    static propTypes = {
+        x: PropTypes.array,
+        y: PropTypes.array,
+        scale: PropTypes.array,
+        children: PropTypes.node.isRequired,
+        refCallbacks: PropTypes.array.isRequired,
+        updateAttributeCache: PropTypes.func.isRequired,
+    };
+
+    static contextTypes = {
+        resizeController: PropTypes.object, // not required because this could be rendered on the server.
+    };
+
+    state = {
+        boundsStyle: {},
+        boundingRect: null,
+    };
+
+    componentDidMount() {
+        this.parseOffsetUnits();
+
+        // subscribe to resize changes with handler to update bounds
+        const { resizeController } = this.context;
+        resizeController.subscribe(this.handleResize);
+    }
+
+    componentWillUnmount() {
+        const { resizeController } = this.context;
+
+        // Unsubscribe to resize updates by passing the subscribed handler
+        resizeController.unsubscribe(this.handleResize);
+    }
+
+    parseOffsetUnits() {
+        this.offsets = parseOffsetUnits(this.props);
+    }
+
+    handleResize = () => {
+        this.setBoundsStyle();
+    };
+
+    mapRefElement = ref => {
+        this.el = ref;
+    };
+
+    mapAllRefs = ref => {
+        // NOTE: add our local ref callback along with all refCallbacks provided in props
+
+        const callbacks = [...this.props.refCallbacks, this.mapRefElement];
+        callbacks.forEach(f => f(ref));
+    };
+
+    setBoundsStyle() {
+        // NOTE: This sets the state of style for the bounds
+        // element that will be observed by the IntersectionObserver
+        // It takes the parallax props and resizes the bounds
+        // to account for x and y offsets as well as scale.
+
+        // @TODO: Consider revising this function.
+        // Break into multiple focused methods.
+        // Fix scaling. Needs the bounding rect
+        // without scaling applied when updating
+
+        const { x, y } = this.offsets;
+        const { scale } = this.props;
+
+        // NOTE: Temporary border added to debug
+        const border = '1px dotted tomato';
+
+        let height = 0;
+        let width = 0;
+
+        let mt = 0;
+        let mb = 0;
+        let ml = 0;
+        let mr = 0;
+        let pt = 0;
+        let pb = 0;
+        let pl = 0;
+        let pr = 0;
+
+        const hasScale = scale;
+        const hasYPercent = y[0].unit === '%';
+        const hasXPercent = x[0].unit === '%';
+
+        // NOTE: Only need the height/width if we are using percent
+        // as a unit, or scale as an effect. Also only want to get
+        // this on the initial mount when no styles have been applied.
+        // let boundingRect;
+        if (hasYPercent || hasXPercent || hasScale) {
+            const computedStyle = getComputedStyle(this.el);
+
+            height = this.el.clientHeight; // height with padding
+            width = this.el.clientWidth; // width with padding
+
+            height -=
+                parseFloat(computedStyle.paddingTop) +
+                parseFloat(computedStyle.paddingBottom);
+            width -=
+                parseFloat(computedStyle.paddingLeft) +
+                parseFloat(computedStyle.paddingRight);
+        }
+
+        if (y) {
+            const y0 = y[0].value;
+            const y1 = y[1].value;
+
+            // transform percent to px
+            const value0 = hasYPercent ? y0 / 100 * height : y0;
+            const value1 = hasYPercent ? y1 / 100 * height : y1;
+
+            const yMin = Math.min(value0, value1);
+            const yMax = Math.max(value0, value1);
+
+            mt = mt + yMin;
+            mb = mb - yMax;
+            pt = pt + yMin * -1;
+            pb = pb + yMax;
+        }
+
+        if (x) {
+            const x0 = x[0].value;
+            const x1 = x[1].value;
+
+            // transform percent to px
+            const value0 = hasXPercent ? x0 / 100 * width : x0;
+            const value1 = hasXPercent ? x1 / 100 * width : x1;
+
+            const xMin = Math.min(value0, value1);
+            const xMax = Math.max(value0, value1);
+
+            ml = ml + xMin;
+            mr = mr - xMax;
+            pl = pl + xMin * -1;
+            pr = pr + xMax;
+        }
+
+        if (scale) {
+            const scaleMax = Math.max(scale[0], scale[1]);
+            const halfDeltaX = (width * scaleMax - width) / 2;
+            const halfDeltaY = (height * scaleMax - height) / 2;
+
+            mt = mt - halfDeltaY;
+            mb = mb - halfDeltaY;
+            ml = ml - halfDeltaX;
+            mr = mr - halfDeltaX;
+            pt = mt * -1;
+            pb = mb * -1;
+            pl = ml * -1;
+            pr = mr * -1;
+        }
+
+        const boundsStyle = {
+            marginTop: mt,
+            marginBottom: mb,
+            marginLeft: ml,
+            marginRight: mr,
+            paddingTop: pt,
+            paddingBottom: pb,
+            paddingLeft: pl,
+            paddingRight: pr,
+            border,
+        };
+
+        this.setState(
+            () => ({
+                boundsStyle,
+            }),
+            // NOTE: Since ViewportProgress caches the initial
+            // bounds on mount it needs to be updated once the
+            // bounds style is updated with the correct size
+            // that accounts for offsets.
+            this.props.updateAttributeCache
+        );
+    }
+
+    render() {
+        const { refCallbacks, children } = this.props;
+        const { boundsStyle } = this.state;
+
+        return (
+            <div
+                className="parallax-bounds"
+                style={boundsStyle}
+                ref={this.mapAllRefs}
+            >
+                {children}
+            </div>
+        );
+    }
+}
+
+export default Bounds;
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 0d6649151..21b87c25e 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -1,9 +1,14 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-import { parseOffsetUnits } from '../utils';
+
 import Observed from 'react-observed';
 import { validateOffsets } from '../utils/propValidation';
-import { ScrollPosition, ScrollEffects, ViewportProgress } from './index.js';
+import {
+    Bounds,
+    ScrollEffects,
+    ScrollPosition,
+    ViewportProgress,
+} from './index.js';
 
 const observerOptions = {
     root: null,
@@ -20,10 +25,6 @@ class Parallax extends Component {
         opacity: [1, 1],
     };
 
-    static contextTypes = {
-        resizeController: PropTypes.object, // not required because this could be rendered on the server.
-    };
-
     static propTypes = {
         children: PropTypes.node.isRequired,
         className: PropTypes.string,
@@ -37,152 +38,11 @@ class Parallax extends Component {
         // tag/element name?
     };
 
-    state = {
-        boundsStyle: {},
-        boundingRect: null,
-    };
-
-    componentDidMount() {
-        this.parseOffsetUnits();
-
-        // subscribe to resize changes with handler to update bounds
-        const { resizeController } = this.context;
-        resizeController.subscribe(this.handleResize);
-    }
-
-    componentWillUnmount() {
-        const { resizeController } = this.context;
-
-        // Unsubscribe to resize updates by passing the subscribed handler
-        resizeController.unsubscribe(this.handleResize);
-    }
-
-    parseOffsetUnits() {
-        this.offsets = parseOffsetUnits(this.props);
-    }
-
-    handleResize = () => {
-        this.setBoundsStyle();
-    };
-
-    mapRefElement = ref => {
-        this.el = ref;
-    };
-
-    mapRefViewportProgress = ref => {
-        this.viewportProgress = ref;
-    };
-
-    setBoundsStyle() {
-        // NOTE: This sets the state of style for the bounds
-        // element that will be observed by the IntersectionObserver
-        // It takes the parallax props and resizes the bounds
-        // to account for x and y offsets as well as scale.
-
-        // @TODO: Consider revising this function.
-        // Break into multiple focused methods.
-        // Fix scaling. Needs the bounding rect
-        // without scaling applied when updating
-
-        const { x, y } = this.offsets;
-        const { scale } = this.props;
-        let { boundingRect } = this.state;
-
-        // NOTE: Temporary border added to debug
-        const border = '1px dotted lightgreen';
-
-        let top = 0;
-        let bottom = 0;
-        let left = 0;
-        let right = 0;
-
-        const hasScale = scale;
-        const hasYPercent = y[0].unit === '%';
-        const hasXPercent = x[0].unit === '%';
-
-        // NOTE: Only need the bounding rect if we are using percent
-        // as a unit, or scale as an effect. Also only want to get
-        // this on the initial mount when no styles have been applied.
-        if ((hasYPercent || hasXPercent || hasScale) && !boundingRect) {
-            boundingRect = this.el.getBoundingClientRect();
-            // console.log(boundingRect);
-        }
-
-        if (y) {
-            const y0 = Math.abs(y[0].value);
-            const y1 = Math.abs(y[1].value);
-            top = hasYPercent ? y0 / 100 * boundingRect.height : y0;
-            bottom = hasYPercent ? y1 / 100 * boundingRect.height : y1;
-        }
-
-        if (x) {
-            const x0 = Math.abs(x[0].value);
-            const x1 = Math.abs(x[1].value);
-            left = hasXPercent ? x0 / 100 * boundingRect.width : x0;
-            right = hasXPercent ? x1 / 100 * boundingRect.width : x1;
-        }
-
-        if (scale) {
-            const { width, height } = boundingRect;
-            const scaleMax = Math.max(scale[0], scale[1]);
-            const halfDeltaX = (width * scaleMax - width) / 2;
-            const halfDeltaY = (height * scaleMax - height) / 2;
-
-            top = top + halfDeltaY;
-            bottom = bottom + halfDeltaY;
-            left = left + halfDeltaX;
-            right = right + halfDeltaX;
-        }
-
-        const boundsStyle = {
-            marginTop: top * -1,
-            marginBottom: bottom * -1,
-            marginLeft: left * -1,
-            marginRight: right * -1,
-            paddingTop: top,
-            paddingBottom: bottom,
-            paddingLeft: left,
-            paddingRight: right,
-            border,
-        };
-
-        this.setState(
-            () => ({
-                boundsStyle,
-                boundingRect,
-            }),
-            // NOTE: Since ViewportProgress caches the initial
-            // bounds on mount it needs to be updated once the
-            // bounds style is updated with the correct size
-            // that accounts for offsets.
-            this.viewportProgress.updateAttributeCache
-        );
-    }
-
-    renderMarkup(isInView, style, refCallbacks) {
-        const { children, className } = this.props;
-        const wrapperClass = isInView
+    getWrapperClass(isInView) {
+        const { className } = this.props;
+        return isInView
             ? `${className} parallax-wrapper is-in-view`
             : `${className} parallax-wrapper`;
-
-        return (
-            <div className={wrapperClass}>
-                <div
-                    className="parallax-bounds"
-                    style={this.state.boundsStyle}
-                    // This calls each ref callback provided
-                    ref={ref => refCallbacks.forEach(f => f(ref))}
-                >
-                    <div
-                        style={style}
-                        className="parallax-element"
-                        ref={this.mapRefElement}
-                    >
-                        {children}
-                    </div>
-                </div>
-            </div>
-        );
     }
 
     render() {
@@ -190,43 +50,44 @@ class Parallax extends Component {
         // callback with necessary params to provide as props
         // for the child component
         //
+        // It's not as bad as it looks. ;)
+        //
         // Observed => isInView, mapRef
         // ↓
         // ScrollPosition => scrollY
         // ↓
-        // ViewportProgress => progress, mapRef
+        // ViewportProgress => progress, mapRef, updateAttributeCache
         // ↓
         // ScrollEffects => style
         // ↓
         // renderMarkup(isInView, style, refCallbacks)
 
+        const { children, x, y, scale, observerOptions } = this.props;
+
+        // prettier-ignore
         return (
-            <Observed
-                initialViewState
-                intersectionRatio={0.01}
-                options={this.props.observerOptions}
-            >
-                {({ isInView, mapRef: mapRefObserved }) => (
+            <Observed initialViewState intersectionRatio={0.01} options={observerOptions}>
+                {({ isInView, mapRef: observedRef }) => (
                     <ScrollPosition isInView={isInView}>
                         {({ scrollY }) => (
-                            <ViewportProgress
-                                ref={this.mapRefViewportProgress}
-                                isInView={isInView}
-                                scrollY={scrollY}
-                            >
-                                {({
-                                    progress,
-                                    mapRef: mapRefViewportProgress,
-                                }) => (
-                                    <ScrollEffects
-                                        progress={progress}
-                                        {...this.props}
-                                    >
-                                        {({ style }) =>
-                                            this.renderMarkup(isInView, style, [
-                                                mapRefObserved,
-                                                mapRefViewportProgress,
-                                            ])}
+                            <ViewportProgress isInView={isInView} scrollY={scrollY}>
+                                {({ progress, updateAttributeCache, mapRef: viewportRef }) => (
+                                    <ScrollEffects progress={progress} x={x} y={y} scale={scale}>
+                                        {({ style }) => (
+                                            <div className={this.getWrapperClass(isInView)}>
+                                                <Bounds
+                                                    refCallbacks={[observedRef, viewportRef]}
+                                                    updateAttributeCache={updateAttributeCache}
+                                                    scale={scale}
+                                                    x={x}
+                                                    y={y}
+                                                >
+                                                    <div style={style} className="parallax-element">
+                                                        {children}
+                                                    </div>
+                                                </Bounds>                                                
+                                            </div>
+                                        )}
                                     </ScrollEffects>
                                 )}
                             </ViewportProgress>
@@ -235,6 +96,7 @@ class Parallax extends Component {
                 )}
             </Observed>
         );
+        // prettier-ignore
     }
 }
 
diff --git a/src/components/ViewportProgress.js b/src/components/ViewportProgress.js
index ea0043184..cc5e0ab97 100644
--- a/src/components/ViewportProgress.js
+++ b/src/components/ViewportProgress.js
@@ -131,9 +131,9 @@ class ViewportProgress extends Component {
 
     render() {
         const { progress } = this.state;
-        const { mapRef } = this;
+        const { mapRef, updateAttributeCache } = this;
 
-        return this.props.children({ progress, mapRef });
+        return this.props.children({ progress, mapRef, updateAttributeCache });
     }
 }
 
diff --git a/src/components/index.js b/src/components/index.js
index d67d9582d..fd6132443 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -1,4 +1,5 @@
 // Components
+export Bounds from './Bounds.js';
 export Parallax from './Parallax.js';
 export ScrollEffects from './ScrollEffects.js';
 export ScrollPosition from './ScrollPosition.js';

From b3a4e13e543d710d372eefad536381cfed1d1577 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sun, 12 Nov 2017 15:02:53 -0800
Subject: [PATCH 096/158] validate opacity props

---
 src/components/Parallax.js  |  14 ++--
 src/utils/propValidation.js | 129 ++++++++++++++++++++++++++++++++++--
 2 files changed, 133 insertions(+), 10 deletions(-)

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 21b87c25e..6ab8f3378 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -2,7 +2,11 @@ import React, { Component } from 'react';
 import PropTypes from 'prop-types';
 
 import Observed from 'react-observed';
-import { validateOffsets } from '../utils/propValidation';
+import {
+    validateOffsets,
+    validateScale,
+    validateOpacity,
+} from '../utils/propValidation';
 import {
     Bounds,
     ScrollEffects,
@@ -30,8 +34,8 @@ class Parallax extends Component {
         className: PropTypes.string,
         x: validateOffsets,
         y: validateOffsets,
-        scale: PropTypes.array.isRequired,
-        opacity: PropTypes.array.isRequired,
+        scale: validateScale,
+        opacity: validateOpacity,
         observerOptions: PropTypes.object.isRequired,
         // @TODO: these should also be available:
         // rotation
@@ -62,7 +66,7 @@ class Parallax extends Component {
         // ↓
         // renderMarkup(isInView, style, refCallbacks)
 
-        const { children, x, y, scale, observerOptions } = this.props;
+        const { children, x, y, scale, opacity, observerOptions } = this.props;
 
         // prettier-ignore
         return (
@@ -72,7 +76,7 @@ class Parallax extends Component {
                         {({ scrollY }) => (
                             <ViewportProgress isInView={isInView} scrollY={scrollY}>
                                 {({ progress, updateAttributeCache, mapRef: viewportRef }) => (
-                                    <ScrollEffects progress={progress} x={x} y={y} scale={scale}>
+                                    <ScrollEffects progress={progress} x={x} y={y} scale={scale} opacity={opacity}>
                                         {({ style }) => (
                                             <div className={this.getWrapperClass(isInView)}>
                                                 <Bounds
diff --git a/src/utils/propValidation.js b/src/utils/propValidation.js
index 758c6ebfd..1efd070c1 100644
--- a/src/utils/propValidation.js
+++ b/src/utils/propValidation.js
@@ -82,16 +82,16 @@ export function validateOffsets(props, propName, componentName) {
         }
     }
 
-    // Make sure a valid numbers are provided e.g. a negative and positive value
+    // Make sure valid numbers are provided e.g. a negative and positive value
     if (isArray && correctLength) {
         const v1 = parseUnit(value[0]).value;
         const v2 = parseUnit(value[1]).value;
 
-        const yMin = Math.min(v1, v2);
-        const yMax = Math.max(v1, v2);
+        const vMin = Math.min(v1, v2);
+        const vMax = Math.max(v1, v2);
 
-        const hasPositive = yMin <= 0;
-        const hasNegative = yMax >= 0;
+        const hasPositive = vMin <= 0;
+        const hasNegative = vMax >= 0;
 
         if (!hasPositive || !hasNegative) {
             return new Error(
@@ -102,3 +102,122 @@ export function validateOffsets(props, propName, componentName) {
 
     return null;
 }
+
+export function validateScale(props, propName, componentName) {
+    componentName = componentName || 'ANONYMOUS';
+
+    let value = props[propName];
+
+    const isArray = Array.isArray(value);
+    const correctLength = value.length === 2;
+    const warning = `[${propName}] in <${componentName}>.`;
+    const valueProvided = `Instead the value provided was [${value}].`;
+
+    // Make sure it's an array
+    if (!isArray) {
+        return new Error(
+            `${warning} Must be an array of Numbers or Strings with '%' or 'px' as units. ${valueProvided}`
+        );
+    }
+
+    // Make sure it has the correct length of 2
+    if (isArray && !correctLength) {
+        return new Error(
+            `${warning} Must be an Array with a length of 2. ${valueProvided}`
+        );
+    }
+
+    // Make sure the values are numbers
+    if (isArray && correctLength) {
+        let isValid = true;
+
+        value.forEach(val => {
+            isValid = isValid && typeof val === 'number';
+        });
+
+        if (!isValid) {
+            return new Error(
+                `${warning} Each item in the Array must be a Number. ${valueProvided}`
+            );
+        }
+    }
+
+    // Make sure valid numbers are provided e.g. both positive value
+    if (isArray && correctLength) {
+        const v1 = parseUnit(value[0]).value;
+        const v2 = parseUnit(value[1]).value;
+
+        const vMin = Math.min(v1, v2);
+        const vMax = Math.max(v1, v2);
+
+        const hasPositive = vMin >= 0 && vMax >= 0;
+
+        if (!hasPositive) {
+            return new Error(
+                `${warning} Both values must be >= 0. ${valueProvided}`
+            );
+        }
+    }
+
+    return null;
+}
+
+export function validateOpacity(props, propName, componentName) {
+    componentName = componentName || 'ANONYMOUS';
+
+    let value = props[propName];
+
+    const isArray = Array.isArray(value);
+    const correctLength = value.length === 2;
+    const warning = `[${propName}] in <${componentName}>.`;
+    const valueProvided = `Instead the value provided was [${value}].`;
+
+    // Make sure it's an array
+    if (!isArray) {
+        return new Error(
+            `${warning} Must be an array of Numbers or Strings with '%' or 'px' as units. ${valueProvided}`
+        );
+    }
+
+    // Make sure it has the correct length of 2
+    if (isArray && !correctLength) {
+        return new Error(
+            `${warning} Must be an Array with a length of 2. ${valueProvided}`
+        );
+    }
+
+    // Make sure the values are numbers
+    if (isArray && correctLength) {
+        let isValid = true;
+
+        value.forEach(val => {
+            isValid = isValid && typeof val === 'number';
+        });
+
+        if (!isValid) {
+            return new Error(
+                `${warning} Each item in the Array must be a Number. ${valueProvided}`
+            );
+        }
+    }
+
+    // Make sure valid numbers are provided e.g. both positive value
+    if (isArray && correctLength) {
+        const v1 = parseUnit(value[0]).value;
+        const v2 = parseUnit(value[1]).value;
+
+        const vMin = Math.min(v1, v2);
+        const vMax = Math.max(v1, v2);
+
+        const hasPositive = vMin >= 0 && vMax >= 0;
+        const lessThanOne = vMin <= 1 && vMax <= 1;
+
+        if (!hasPositive || !lessThanOne) {
+            return new Error(
+                `${warning} Both values must be >= 0 and <= 1. ${valueProvided}`
+            );
+        }
+    }
+
+    return null;
+}

From 2af7970012a7b21d1bc331aed95254f6ce3ed54c Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sun, 12 Nov 2017 17:58:17 -0800
Subject: [PATCH 097/158] add util function for creating the bounds styles

---
 src/components/Bounds.js       | 121 +++------------------------------
 src/utils/createBoundsStyle.js | 109 +++++++++++++++++++++++++++++
 src/utils/index.js             |   1 +
 3 files changed, 118 insertions(+), 113 deletions(-)
 create mode 100644 src/utils/createBoundsStyle.js

diff --git a/src/components/Bounds.js b/src/components/Bounds.js
index 3b6c7918b..4bf2bd58f 100644
--- a/src/components/Bounds.js
+++ b/src/components/Bounds.js
@@ -1,12 +1,12 @@
 import React, { Component } from 'react';
-import { parseOffsetUnits } from '../utils';
+import { parseOffsetUnits, createBoundsStyle } from '../utils';
 import PropTypes from 'prop-types';
 
 class Bounds extends Component {
     static propTypes = {
-        x: PropTypes.array,
-        y: PropTypes.array,
-        scale: PropTypes.array,
+        x: PropTypes.array.isRequired,
+        y: PropTypes.array.isRequired,
+        scale: PropTypes.array.isRequired,
         children: PropTypes.node.isRequired,
         refCallbacks: PropTypes.array.isRequired,
         updateAttributeCache: PropTypes.func.isRequired,
@@ -18,7 +18,6 @@ class Bounds extends Component {
 
     state = {
         boundsStyle: {},
-        boundingRect: null,
     };
 
     componentDidMount() {
@@ -49,123 +48,19 @@ class Bounds extends Component {
     };
 
     mapAllRefs = ref => {
-        // NOTE: add our local ref callback along with all refCallbacks provided in props
+        // NOTE: add our local ref callback along
+        // with all refCallbacks provided in props
 
         const callbacks = [...this.props.refCallbacks, this.mapRefElement];
         callbacks.forEach(f => f(ref));
     };
 
     setBoundsStyle() {
-        // NOTE: This sets the state of style for the bounds
-        // element that will be observed by the IntersectionObserver
-        // It takes the parallax props and resizes the bounds
-        // to account for x and y offsets as well as scale.
-
-        // @TODO: Consider revising this function.
-        // Break into multiple focused methods.
-        // Fix scaling. Needs the bounding rect
-        // without scaling applied when updating
-
         const { x, y } = this.offsets;
         const { scale } = this.props;
+        const { el } = this;
 
-        // NOTE: Temporary border added to debug
-        const border = '1px dotted tomato';
-
-        let height = 0;
-        let width = 0;
-
-        let mt = 0;
-        let mb = 0;
-        let ml = 0;
-        let mr = 0;
-        let pt = 0;
-        let pb = 0;
-        let pl = 0;
-        let pr = 0;
-
-        const hasScale = scale;
-        const hasYPercent = y[0].unit === '%';
-        const hasXPercent = x[0].unit === '%';
-
-        // NOTE: Only need the height/width if we are using percent
-        // as a unit, or scale as an effect. Also only want to get
-        // this on the initial mount when no styles have been applied.
-        // let boundingRect;
-        if (hasYPercent || hasXPercent || hasScale) {
-            const computedStyle = getComputedStyle(this.el);
-
-            height = this.el.clientHeight; // height with padding
-            width = this.el.clientWidth; // width with padding
-
-            height -=
-                parseFloat(computedStyle.paddingTop) +
-                parseFloat(computedStyle.paddingBottom);
-            width -=
-                parseFloat(computedStyle.paddingLeft) +
-                parseFloat(computedStyle.paddingRight);
-        }
-
-        if (y) {
-            const y0 = y[0].value;
-            const y1 = y[1].value;
-
-            // transform percent to px
-            const value0 = hasYPercent ? y0 / 100 * height : y0;
-            const value1 = hasYPercent ? y1 / 100 * height : y1;
-
-            const yMin = Math.min(value0, value1);
-            const yMax = Math.max(value0, value1);
-
-            mt = mt + yMin;
-            mb = mb - yMax;
-            pt = pt + yMin * -1;
-            pb = pb + yMax;
-        }
-
-        if (x) {
-            const x0 = x[0].value;
-            const x1 = x[1].value;
-
-            // transform percent to px
-            const value0 = hasXPercent ? x0 / 100 * width : x0;
-            const value1 = hasXPercent ? x1 / 100 * width : x1;
-
-            const xMin = Math.min(value0, value1);
-            const xMax = Math.max(value0, value1);
-
-            ml = ml + xMin;
-            mr = mr - xMax;
-            pl = pl + xMin * -1;
-            pr = pr + xMax;
-        }
-
-        if (scale) {
-            const scaleMax = Math.max(scale[0], scale[1]);
-            const halfDeltaX = (width * scaleMax - width) / 2;
-            const halfDeltaY = (height * scaleMax - height) / 2;
-
-            mt = mt - halfDeltaY;
-            mb = mb - halfDeltaY;
-            ml = ml - halfDeltaX;
-            mr = mr - halfDeltaX;
-            pt = mt * -1;
-            pb = mb * -1;
-            pl = ml * -1;
-            pr = mr * -1;
-        }
-
-        const boundsStyle = {
-            marginTop: mt,
-            marginBottom: mb,
-            marginLeft: ml,
-            marginRight: mr,
-            paddingTop: pt,
-            paddingBottom: pb,
-            paddingLeft: pl,
-            paddingRight: pr,
-            border,
-        };
+        const boundsStyle = createBoundsStyle(x, y, scale, el);
 
         this.setState(
             () => ({
diff --git a/src/utils/createBoundsStyle.js b/src/utils/createBoundsStyle.js
new file mode 100644
index 000000000..d51ef8e9c
--- /dev/null
+++ b/src/utils/createBoundsStyle.js
@@ -0,0 +1,109 @@
+export default function createBoundsStyle(x, y, scale, el) {
+    // NOTE: This creates the style for the bounds element
+    // that will be observed by the IntersectionObserver
+    // It takes the x, y, and scale props then resizes
+    // provides the styles to create the bounds.
+
+    // @TODO: Consider revising this function.
+    // Break into multiple focused functions
+    // for simpler testing
+
+    // NOTE: Temporary border added to debug
+    const border = '1px dotted tomato';
+
+    let height = 0;
+    let width = 0;
+
+    let mt = 0;
+    let mb = 0;
+    let ml = 0;
+    let mr = 0;
+    let pt = 0;
+    let pb = 0;
+    let pl = 0;
+    let pr = 0;
+
+    const hasScale = scale;
+    const hasYPercent = y[0].unit === '%';
+    const hasXPercent = x[0].unit === '%';
+
+    // NOTE: Only need the height/width if we are using percent
+    // as a unit, or scale as an effect. Also only want to get
+    // this on the initial mount when no styles have been applied.
+    // let boundingRect;
+    if (hasYPercent || hasXPercent || hasScale) {
+        const computedStyle = getComputedStyle(el);
+
+        height = el.clientHeight; // height with padding
+        width = el.clientWidth; // width with padding
+
+        // subtract padding;
+        height -=
+            parseFloat(computedStyle.paddingTop) +
+            parseFloat(computedStyle.paddingBottom);
+        width -=
+            parseFloat(computedStyle.paddingLeft) +
+            parseFloat(computedStyle.paddingRight);
+    }
+
+    if (y) {
+        const y0 = y[0].value;
+        const y1 = y[1].value;
+
+        // transform percent to px
+        const value0 = hasYPercent ? y0 / 100 * height : y0;
+        const value1 = hasYPercent ? y1 / 100 * height : y1;
+
+        const yMin = Math.min(value0, value1);
+        const yMax = Math.max(value0, value1);
+
+        mt = mt + yMin;
+        mb = mb - yMax;
+        pt = pt + yMin * -1;
+        pb = pb + yMax;
+    }
+
+    if (x) {
+        const x0 = x[0].value;
+        const x1 = x[1].value;
+
+        // transform percent to px
+        const value0 = hasXPercent ? x0 / 100 * width : x0;
+        const value1 = hasXPercent ? x1 / 100 * width : x1;
+
+        const xMin = Math.min(value0, value1);
+        const xMax = Math.max(value0, value1);
+
+        ml = ml + xMin;
+        mr = mr - xMax;
+        pl = pl + xMin * -1;
+        pr = pr + xMax;
+    }
+
+    if (scale) {
+        const scaleMax = Math.max(scale[0], scale[1]);
+        const halfDeltaX = (width * scaleMax - width) / 2;
+        const halfDeltaY = (height * scaleMax - height) / 2;
+
+        mt = mt - halfDeltaY;
+        mb = mb - halfDeltaY;
+        ml = ml - halfDeltaX;
+        mr = mr - halfDeltaX;
+        pt = mt * -1;
+        pb = mb * -1;
+        pl = ml * -1;
+        pr = mr * -1;
+    }
+
+    return {
+        marginTop: mt,
+        marginBottom: mb,
+        marginLeft: ml,
+        marginRight: mr,
+        paddingTop: pt,
+        paddingBottom: pb,
+        paddingLeft: pl,
+        paddingRight: pr,
+        border,
+    };
+}
diff --git a/src/utils/index.js b/src/utils/index.js
index 61765a262..d4ed191e4 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -1,4 +1,5 @@
 export clamp from './clamp';
+export createBoundsStyle from './createBoundsStyle';
 export parseUnit from './parseUnit';
 export parseOffsetUnits from './parseOffsetUnits';
 export scaleBetween from './scaleBetween';

From 796a6959ef9c9b8b1f0b58c542dce9aebfb9388c Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sun, 12 Nov 2017 18:21:56 -0800
Subject: [PATCH 098/158] move x, y, and scale transforms to functions

---
 src/utils/createBoundsStyle.js | 139 +++++++++++++++++++--------------
 1 file changed, 79 insertions(+), 60 deletions(-)

diff --git a/src/utils/createBoundsStyle.js b/src/utils/createBoundsStyle.js
index d51ef8e9c..1eaa5a3f3 100644
--- a/src/utils/createBoundsStyle.js
+++ b/src/utils/createBoundsStyle.js
@@ -4,24 +4,23 @@ export default function createBoundsStyle(x, y, scale, el) {
     // It takes the x, y, and scale props then resizes
     // provides the styles to create the bounds.
 
-    // @TODO: Consider revising this function.
-    // Break into multiple focused functions
-    // for simpler testing
-
     // NOTE: Temporary border added to debug
     const border = '1px dotted tomato';
 
+    // for percents and scale
     let height = 0;
     let width = 0;
 
-    let mt = 0;
-    let mb = 0;
-    let ml = 0;
-    let mr = 0;
-    let pt = 0;
-    let pb = 0;
-    let pl = 0;
-    let pr = 0;
+    let bounds = {};
+
+    bounds.mt = 0;
+    bounds.mb = 0;
+    bounds.ml = 0;
+    bounds.mr = 0;
+    bounds.pt = 0;
+    bounds.pb = 0;
+    bounds.pl = 0;
+    bounds.pr = 0;
 
     const hasScale = scale;
     const hasYPercent = y[0].unit === '%';
@@ -47,63 +46,83 @@ export default function createBoundsStyle(x, y, scale, el) {
     }
 
     if (y) {
-        const y0 = y[0].value;
-        const y1 = y[1].value;
-
-        // transform percent to px
-        const value0 = hasYPercent ? y0 / 100 * height : y0;
-        const value1 = hasYPercent ? y1 / 100 * height : y1;
-
-        const yMin = Math.min(value0, value1);
-        const yMax = Math.max(value0, value1);
-
-        mt = mt + yMin;
-        mb = mb - yMax;
-        pt = pt + yMin * -1;
-        pb = pb + yMax;
+        bounds = transformBoundsY(bounds, y, height);
     }
 
     if (x) {
-        const x0 = x[0].value;
-        const x1 = x[1].value;
-
-        // transform percent to px
-        const value0 = hasXPercent ? x0 / 100 * width : x0;
-        const value1 = hasXPercent ? x1 / 100 * width : x1;
-
-        const xMin = Math.min(value0, value1);
-        const xMax = Math.max(value0, value1);
-
-        ml = ml + xMin;
-        mr = mr - xMax;
-        pl = pl + xMin * -1;
-        pr = pr + xMax;
+        bounds = transformBoundsX(bounds, x, width);
     }
 
     if (scale) {
-        const scaleMax = Math.max(scale[0], scale[1]);
-        const halfDeltaX = (width * scaleMax - width) / 2;
-        const halfDeltaY = (height * scaleMax - height) / 2;
-
-        mt = mt - halfDeltaY;
-        mb = mb - halfDeltaY;
-        ml = ml - halfDeltaX;
-        mr = mr - halfDeltaX;
-        pt = mt * -1;
-        pb = mb * -1;
-        pl = ml * -1;
-        pr = mr * -1;
+        bounds = transformBoundsScale(bounds, scale, width, height);
     }
 
     return {
-        marginTop: mt,
-        marginBottom: mb,
-        marginLeft: ml,
-        marginRight: mr,
-        paddingTop: pt,
-        paddingBottom: pb,
-        paddingLeft: pl,
-        paddingRight: pr,
+        marginTop: bounds.mt,
+        marginBottom: bounds.mb,
+        marginLeft: bounds.ml,
+        marginRight: bounds.mr,
+        paddingTop: bounds.mt * -1,
+        paddingBottom: bounds.mb * -1,
+        paddingLeft: bounds.ml * -1,
+        paddingRight: bounds.mr * -1,
         border,
     };
 }
+
+export function transformBoundsY(bounds, y, h) {
+    const newBounds = Object.assign({}, bounds);
+
+    const hasYPercent = y[0].unit === '%';
+
+    const y0 = y[0].value;
+    const y1 = y[1].value;
+
+    // transform percent to px
+    const value0 = hasYPercent ? y0 / 100 * h : y0;
+    const value1 = hasYPercent ? y1 / 100 * h : y1;
+
+    const yMin = Math.min(value0, value1);
+    const yMax = Math.max(value0, value1);
+
+    newBounds.mt = newBounds.mt + yMin;
+    newBounds.mb = newBounds.mb - yMax;
+
+    return newBounds;
+}
+
+export function transformBoundsX(bounds, x, w) {
+    const newBounds = Object.assign({}, bounds);
+
+    const hasXPercent = x[0].unit === '%';
+
+    const x0 = x[0].value;
+    const x1 = x[1].value;
+
+    // transform percent to px
+    const value0 = hasXPercent ? x0 / 100 * w : x0;
+    const value1 = hasXPercent ? x1 / 100 * w : x1;
+
+    const xMin = Math.min(value0, value1);
+    const xMax = Math.max(value0, value1);
+
+    newBounds.ml = newBounds.ml + xMin;
+    newBounds.mr = newBounds.mr - xMax;
+
+    return newBounds;
+}
+
+export function transformBoundsScale(bounds, scale, w, h) {
+    const newBounds = Object.assign({}, bounds);
+
+    const scaleMax = Math.max(scale[0], scale[1]);
+    const halfDeltaX = (w * scaleMax - w) / 2;
+    const halfDeltaY = (h * scaleMax - h) / 2;
+
+    newBounds.mt = newBounds.mt - halfDeltaY;
+    newBounds.mb = newBounds.mb - halfDeltaY;
+    newBounds.ml = newBounds.ml - halfDeltaX;
+    newBounds.mr = newBounds.mr - halfDeltaX;
+
+    return newBounds;
+}

From 11173258b4898b84143653a85fd6bf24d1099b61 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sun, 12 Nov 2017 18:46:55 -0800
Subject: [PATCH 099/158] update README

---
 README.md | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 5a263c03f..54c72bf1e 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,26 @@
 # React Scroll Parallax v2
 
-Provides a React component and single passive scroll listener to add **vertical** scrolling based effects to elements based on their position in the viewport. Works with universal (server-side rendered) React apps.
+A small library of components for creating **vertical** scroll based effects like parallax based on an element's position in the viewport. Works with universal (server-side rendered) React apps.
+
+### Optimizations
+
+Scroll effects can cause lots of [jank](http://jankfree.org/). The following optimizations _attempt to limit_ this jank:
+
+- Using a single passive scroll listener and single resize listener for all elements
+- Only updates elements when they are within the viewport
+- Determines visibility of elements with the browsers asynchronous [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)
+- Caches expensive calls like `getBoundingClient` that cause paints, reflow and layout
+- Apply effects as 3D transforms to utilize the GPU and prevent re-paints
+
+### Supported Effects
+
+The following are supported effects
+
+- **Translate X** 
+- **Translate Y**
+- **Scale**
+- **Opacity** 
+
 
 **NOTE** The v2 branch is a re-write of v1 to add new scroll features such as opacity, scale, and rotation in addition to translation. It also uses the new [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API), which will be a more efficient way to determining when elements are within the viewport as compared to v1's implementation. Additionally, much of the state of v1's ParallaxController has been moved to focused React components with the hope that these components can also be used to create additional custom scroll effects. This also has the added benefit of being able to easily debug with React specific tooling to see the state of scroll effects in the browser.
 

From d2da80bc6f07cd0b9827b310a3ab9d971bd79a52 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sun, 12 Nov 2017 23:36:28 -0800
Subject: [PATCH 100/158] update README

---
 README.md | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index 54c72bf1e..9e2c62b23 100644
--- a/README.md
+++ b/README.md
@@ -48,13 +48,13 @@ npm i intersection-observer --save
 
 There are two main components to be utilized in this library:
 
-1. `<ScrollProvider>`
-    - Responsible for providing the current scroll position to all `<Parallax>` components via context.
+1. `<ParallaxProvider>`
+    - Responsible for providing access to the scroll and resize controllers to all `<Parallax>` components via context.
 
 2. `<Parallax>`
-    - Handles updating the styles of a DOM element such as translations, scale, or opacity.
+    - Handles updating the styles of a DOM element such as x and y translations, scale, or opacity.
 
-@TODO: Document any higher order components that can be used.
+@TODO: Document other internal components that can be used.
 
 ### How to
 

From d7c277183919e71b9b25d1b7f0d48cae9acb22b1 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 21:27:49 -0800
Subject: [PATCH 101/158] =?UTF-8?q?add=20storybook=20=F0=9F=93=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .babelrc                     |   15 +-
 .storybook/addons.js         |    1 +
 .storybook/config.js         |    9 +
 .storybook/webpack.config.js |   17 +
 package.json                 |    9 +-
 stories/Parallax.stories.js  |  141 +++
 stories/index.js             |   29 +
 stories/styles.scss          |   71 ++
 webpack.config.js            |    4 +-
 yarn.lock                    | 2318 ++++++++++++++++++++++++++++++++--
 10 files changed, 2527 insertions(+), 87 deletions(-)
 create mode 100644 .storybook/addons.js
 create mode 100644 .storybook/config.js
 create mode 100644 .storybook/webpack.config.js
 create mode 100644 stories/Parallax.stories.js
 create mode 100644 stories/index.js
 create mode 100644 stories/styles.scss

diff --git a/.babelrc b/.babelrc
index 31073c3c5..9feb7b445 100644
--- a/.babelrc
+++ b/.babelrc
@@ -4,13 +4,14 @@
             "presets": ["es2015", "react", "stage-0"],
             "plugins": [
                 [
-                    "module-resolver", {
+                    "module-resolver",
+                    {
                         "alias": {
-                            "react-scroll-parallax": "./src",
-                        },
-                    },
-                ],
-            ],
+                            "react-scroll-parallax": "./src"
+                        }
+                    }
+                ]
+            ]
         }
-    },
+    }
 }
diff --git a/.storybook/addons.js b/.storybook/addons.js
new file mode 100644
index 000000000..6622fe475
--- /dev/null
+++ b/.storybook/addons.js
@@ -0,0 +1 @@
+import '@storybook/addon-knobs/register';
diff --git a/.storybook/config.js b/.storybook/config.js
new file mode 100644
index 000000000..94a7eeaa2
--- /dev/null
+++ b/.storybook/config.js
@@ -0,0 +1,9 @@
+import { configure } from '@storybook/react';
+
+const req = require.context('../stories', true, /\.stories\.js$/);
+
+function loadStories() {
+	req.keys().forEach(filename => req(filename));
+}
+
+configure(loadStories, module);
diff --git a/.storybook/webpack.config.js b/.storybook/webpack.config.js
new file mode 100644
index 000000000..52e6e185c
--- /dev/null
+++ b/.storybook/webpack.config.js
@@ -0,0 +1,17 @@
+// you can use this file to add your custom webpack plugins, loaders and anything you like.
+// This is just the basic way to add additional webpack configurations.
+// For more information refer the docs: https://storybook.js.org/configurations/custom-webpack-config
+
+// IMPORTANT
+// When you add this file, we won't add the default configurations which is similar
+// to "React Create App". This only has babel loader to load JavaScript.
+
+const [client, server] = require('../webpack.config.js');
+
+module.exports = {
+	plugins: [
+		// your custom plugins
+	],
+	resolve: client.resolve,
+	module: client.module,
+};
diff --git a/package.json b/package.json
index 3189f0f77..0ac08b7cc 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,9 @@
         "prettier":
             "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
         "prepublish":
-            "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports"
+            "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports",
+        "storybook": "BABEL_ENV=test start-storybook -p 6006",
+        "build-storybook": "build-storybook"
     },
     "jest": {
         "modulePaths": ["<rootDir>/src/"]
@@ -31,6 +33,11 @@
         "react-observed": "^1.0.0-beta.2"
     },
     "devDependencies": {
+        "@storybook/cli": "^3.2.15",
+        "@storybook/addon-actions": "^3.2.15",
+        "@storybook/addon-knobs": "^3.2.15",
+        "@storybook/addon-links": "^3.2.15",
+        "@storybook/react": "^3.2.15",
         "babel-cli": "^6.24.1",
         "babel-core": "^6.23.1",
         "babel-jest": "^20.0.3",
diff --git a/stories/Parallax.stories.js b/stories/Parallax.stories.js
new file mode 100644
index 000000000..d7e96e168
--- /dev/null
+++ b/stories/Parallax.stories.js
@@ -0,0 +1,141 @@
+import { storiesOf, addDecorator } from '@storybook/react';
+import { action } from '@storybook/addon-actions';
+import { linkTo } from '@storybook/addon-links';
+import {
+    withKnobs,
+    text,
+    boolean,
+    number,
+    array,
+} from '@storybook/addon-knobs';
+
+import React from 'react';
+import { ParallaxProvider, Parallax } from '../src/components';
+import { Element } from '../example/components';
+import styles from './styles.scss';
+import 'intersection-observer';
+
+const stories = storiesOf('Parallax', module);
+
+// Decorate all stories with ParallaxProvider and center styles
+const CenterDecorator = storyFn => (
+    <div className="center elements">
+        <ParallaxProvider>{storyFn()}</ParallaxProvider>
+    </div>
+);
+addDecorator(CenterDecorator);
+
+// Add the `withKnobs` decorator to add knobs support to your stories.
+// You can also configure `withKnobs` as a global decorator.
+stories.addDecorator(withKnobs);
+
+stories
+    .add('with default props', () => (
+        <Parallax
+            className={styles.parallax}
+            // y={[-100, 100]}
+            // x={[-50, 50]}
+            // scale={[0, 1]}
+            // opacity={[0.5, 1]}
+        >
+            <Element index="A" />
+        </Parallax>
+    ))
+    .add('with y offset props', () => {
+        const min1 = text('A: Y Offset 1', '-50%');
+        const max1 = text('A: Y Offset 2', '50%');
+        const min2 = text('B: Y Offset 1', '50%');
+        const max2 = text('B: Y Offset 2', '-50%');
+        const y1 = [min1, max1];
+        const y2 = [min2, max2];
+        return (
+            <div className="elements">
+                <Parallax className={styles.parallax} y={y1}>
+                    <Element index="A" />
+                </Parallax>
+                <Parallax className={styles.parallax} y={y2}>
+                    <Element index="B" />
+                </Parallax>
+            </div>
+        );
+    })
+    .add('with x offset props', () => {
+        const min1 = text('A: X Offset 1', '-50%');
+        const max1 = text('A: X Offset 2', '50%');
+        const min2 = text('B: X Offset 1', '50%');
+        const max2 = text('B: X Offset 2', '-50%');
+        const x1 = [min1, max1];
+        const x2 = [min2, max2];
+        return (
+            <div className="elements">
+                <Parallax className={styles.parallax} x={x1}>
+                    <Element index="A" />
+                </Parallax>
+                <Parallax className={styles.parallax} x={x2}>
+                    <Element index="B" />
+                </Parallax>
+            </div>
+        );
+    })
+    .add('with scale props', () => {
+        const min1 = number('A: Scale 1', 1);
+        const max1 = number('A: Scale 2', 0);
+        const min2 = number('B: Scale 1', 0);
+        const max2 = number('B: Scale 2', 1);
+        const scale1 = [min1, max1];
+        const scale2 = [min2, max2];
+        return (
+            <div className="elements">
+                <Parallax className={styles.parallax} scale={scale1}>
+                    <Element index="A" />
+                </Parallax>
+                <Parallax className={styles.parallax} scale={scale2}>
+                    <Element index="B" />
+                </Parallax>
+            </div>
+        );
+    })
+    .add('with opacity props', () => {
+        const min1 = number('A: Opacity 1', 1);
+        const max1 = number('A: Opacity 2', 0);
+        const min2 = number('B: Opacity 1', 0);
+        const max2 = number('B: Opacity 2', 1);
+        const opacity1 = [min1, max1];
+        const opacity2 = [min2, max2];
+        return (
+            <div className="elements">
+                <Parallax className={styles.parallax} opacity={opacity1}>
+                    <Element index="A" />
+                </Parallax>
+                <Parallax className={styles.parallax} opacity={opacity2}>
+                    <Element index="B" />
+                </Parallax>
+            </div>
+        );
+    })
+    .add('on a 100 elements', () => {
+        const amount = number('Number of Elements', 100);
+        const offset = number('Offset %', 50);
+        const elements = new Array(amount).fill(null).map((x, i) => i);
+
+        return (
+            <div className="elements">
+                {elements.map((number, i) => {
+                    const odd = i % 2 ? -1 : 1;
+
+                    const props = {
+                        x: [-offset * odd + '%', offset * odd + '%'],
+                        y: [-offset * odd + '%', offset * odd + '%'],
+                        // scale: [0.8, 1.2],
+                        // opacity: [1, 0],
+                    };
+
+                    return (
+                        <Parallax key={i} className={styles.small} {...props}>
+                            <Element index={i} />
+                        </Parallax>
+                    );
+                })}
+            </div>
+        );
+    });
diff --git a/stories/index.js b/stories/index.js
new file mode 100644
index 000000000..e856eaf04
--- /dev/null
+++ b/stories/index.js
@@ -0,0 +1,29 @@
+import React from 'react';
+
+import { storiesOf } from '@storybook/react';
+import { action } from '@storybook/addon-actions';
+import { linkTo } from '@storybook/addon-links';
+
+import { Button, Welcome } from '@storybook/react/demo';
+
+storiesOf('Welcome', module).add('to Storybook', () => (
+	<Welcome showApp={linkTo('Button')} />
+));
+
+storiesOf('Button', module)
+	.add('with text', () => (
+		<Button onClick={action('clicked')}>Hello Button</Button>
+	))
+	.add('with some emoji', () => (
+		<Button onClick={action('clicked')}>😀 😎 👍 💯</Button>
+	));
+
+import { ParallaxProvider, Parallax } from '../src/components';
+
+storiesOf('Parallax', module).add('with default props', () => (
+	<ParallaxProvider>
+		<Parallax>
+			<div>Foo</div>
+		</Parallax>
+	</ParallaxProvider>
+));
diff --git a/stories/styles.scss b/stories/styles.scss
new file mode 100644
index 000000000..d1f530fd2
--- /dev/null
+++ b/stories/styles.scss
@@ -0,0 +1,71 @@
+@import url('https://fonts.googleapis.com/css?family=Roboto+Mono:400,700');
+
+$bg1: #ececec;
+$bg2: #d6d6d6;
+
+body {
+    background-color: $bg1;
+    background-image: linear-gradient(
+            0deg,
+            transparent 24%,
+            $bg2 25%,
+            $bg2 26%,
+            transparent 27%,
+            transparent 74%,
+            $bg2 75%,
+            $bg2 76%,
+            transparent 77%,
+            transparent
+        ),
+        linear-gradient(
+            90deg,
+            transparent 24%,
+            $bg2 25%,
+            $bg2 26%,
+            transparent 27%,
+            transparent 74%,
+            $bg2 75%,
+            $bg2 76%,
+            transparent 77%,
+            transparent
+        );
+
+    background-size: 50px 50px;
+    font-size: 16px;
+    font-family: 'Roboto Mono', monsopace;
+    font-style: normal;
+
+    &:before {
+        content: '↑ Scroll ↓';
+        position: fixed;
+        top: 10px;
+        width: 100%;
+        text-align: center;
+        letter-spacing: 0.05em;
+        text-transform: uppercase;
+        color: tomato;
+        z-index: 1000;
+    }
+}
+
+:global(.center) {
+    min-height: 300vh;
+}
+
+:global(.elements) {
+    width: 100%;
+    display: flex;
+    flex-flow: row wrap;
+    align-items: center;
+    justify-content: center;
+}
+
+:local(.parallax) {
+    margin: 10% 10%;
+    width: 200px;
+}
+
+:local(.small) {
+    margin: 10% 10%;
+    width: 10%;
+}
diff --git a/webpack.config.js b/webpack.config.js
index 655344557..25b6766a2 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -32,7 +32,7 @@ const clientConfig = merge(baseConfig, {
             },
             {
                 test: /\.scss$/,
-                include: [path.resolve(ROOT)],
+                include: [path.resolve(ROOT), path.resolve('./stories')],
                 loaders: [
                     'style-loader',
                     {
@@ -83,7 +83,7 @@ const serverConfig = merge(baseConfig, {
             },
             {
                 test: /\.scss$/,
-                include: [path.resolve(ROOT)],
+                include: [path.resolve(ROOT), path.resolve('./stories')],
                 loaders: [
                     {
                         loader: 'css-loader/locals',
diff --git a/yarn.lock b/yarn.lock
index 0cc48856e..7a7ce0e4f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,222 @@
 # yarn lockfile v1
 
 
+"@hypnosphi/fuse.js@^3.0.9":
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/@hypnosphi/fuse.js/-/fuse.js-3.0.9.tgz#ea99f6121b4a8f065b4c71f85595db2714498807"
+
+"@storybook/addon-actions@^3.2.15", "@storybook/addon-actions@^3.2.16":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-3.2.16.tgz#dc53d48dc8035b426a02628687c6cb0601b933b9"
+  dependencies:
+    "@storybook/addons" "^3.2.16"
+    deep-equal "^1.0.1"
+    json-stringify-safe "^5.0.1"
+    prop-types "^15.6.0"
+    react-inspector "^2.2.1"
+    uuid "^3.1.0"
+
+"@storybook/addon-knobs@^3.2.15":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-3.2.16.tgz#c19747656a969e5b960e4edeb54e5d5f4198609b"
+  dependencies:
+    "@storybook/addons" "^3.2.16"
+    babel-runtime "^6.26.0"
+    deep-equal "^1.0.1"
+    global "^4.3.2"
+    insert-css "^2.0.0"
+    lodash.debounce "^4.0.8"
+    moment "^2.19.2"
+    prop-types "^15.6.0"
+    react-color "^2.11.4"
+    react-datetime "^2.11.0"
+    react-textarea-autosize "^5.2.1"
+    util-deprecate "^1.0.2"
+
+"@storybook/addon-links@^3.2.15", "@storybook/addon-links@^3.2.16":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-3.2.16.tgz#58b807f7fbcdadb405c6379e69a22c48025c9558"
+  dependencies:
+    "@storybook/addons" "^3.2.16"
+
+"@storybook/addons@^3.2.16":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-3.2.16.tgz#cbad5d9e8222aba3d5a5d06af98a095322f62cb5"
+
+"@storybook/channel-postmessage@^3.2.16":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-3.2.16.tgz#036b2c1c412e2806badc1c1f7bcbb19b069fedde"
+  dependencies:
+    "@storybook/channels" "^3.2.16"
+    global "^4.3.2"
+    json-stringify-safe "^5.0.1"
+
+"@storybook/channels@^3.2.16":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-3.2.16.tgz#07d8686328c0bb885aa8b69254fcf0745d22a620"
+
+"@storybook/cli@^3.2.15":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/cli/-/cli-3.2.16.tgz#e1331ed3327767330f3cb47c5793c2a01153a8a5"
+  dependencies:
+    "@storybook/codemod" "^3.2.16"
+    chalk "^2.3.0"
+    child-process-promise "^2.2.1"
+    commander "^2.11.0"
+    cross-spawn "^5.0.1"
+    jscodeshift "^0.3.30"
+    json5 "^0.5.1"
+    latest-version "^3.1.0"
+    merge-dirs "^0.2.1"
+    shelljs "^0.7.8"
+    update-notifier "^2.3.0"
+
+"@storybook/codemod@^3.2.16":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/codemod/-/codemod-3.2.16.tgz#02206369c6b04acbad039ebddb79abffa4938af1"
+  dependencies:
+    jscodeshift "^0.3.30"
+
+"@storybook/components@^3.2.16":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/components/-/components-3.2.16.tgz#381c4ce414f139fb03b059f1f0265c6246457e7b"
+  dependencies:
+    glamor "^2.20.40"
+    glamorous "^4.11.0"
+    prop-types "^15.6.0"
+
+"@storybook/mantra-core@^1.7.0":
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/@storybook/mantra-core/-/mantra-core-1.7.2.tgz#e10c7faca29769e97131e0e0308ef7cfb655b70c"
+  dependencies:
+    "@storybook/react-komposer" "^2.0.1"
+    "@storybook/react-simple-di" "^1.2.1"
+    babel-runtime "6.x.x"
+
+"@storybook/react-fuzzy@^0.4.3":
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/@storybook/react-fuzzy/-/react-fuzzy-0.4.3.tgz#36f7536ba97bf08b03cb57f47c58ae2cca330aec"
+  dependencies:
+    babel-runtime "^6.23.0"
+    classnames "^2.2.5"
+    fuse.js "^3.0.1"
+    prop-types "^15.5.9"
+
+"@storybook/react-komposer@^2.0.0", "@storybook/react-komposer@^2.0.1":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@storybook/react-komposer/-/react-komposer-2.0.3.tgz#f9e12a9586b2ce95c24c137eabb8b71527ddb369"
+  dependencies:
+    "@storybook/react-stubber" "^1.0.0"
+    babel-runtime "^6.11.6"
+    hoist-non-react-statics "^1.2.0"
+    lodash.pick "^4.4.0"
+    shallowequal "^0.2.2"
+
+"@storybook/react-simple-di@^1.2.1":
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/@storybook/react-simple-di/-/react-simple-di-1.2.1.tgz#fe4b29a32459e168da3aae8e6fcd8631861210c9"
+  dependencies:
+    babel-runtime "6.x.x"
+    hoist-non-react-statics "1.x.x"
+
+"@storybook/react-stubber@^1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@storybook/react-stubber/-/react-stubber-1.0.1.tgz#8c312c2658b9eeafce470e1c39e4193f0b5bf9b1"
+  dependencies:
+    babel-runtime "^6.5.0"
+
+"@storybook/react@^3.2.15":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/react/-/react-3.2.16.tgz#9a0eaecbc7ba6c97e89ce1d17dee7a2af68260c9"
+  dependencies:
+    "@storybook/addon-actions" "^3.2.16"
+    "@storybook/addon-links" "^3.2.16"
+    "@storybook/addons" "^3.2.16"
+    "@storybook/channel-postmessage" "^3.2.16"
+    "@storybook/ui" "^3.2.16"
+    airbnb-js-shims "^1.3.0"
+    autoprefixer "^7.1.6"
+    babel-core "^6.26.0"
+    babel-loader "^7.1.2"
+    babel-plugin-react-docgen "^1.8.0"
+    babel-plugin-transform-regenerator "^6.26.0"
+    babel-plugin-transform-runtime "^6.23.0"
+    babel-preset-env "^1.6.1"
+    babel-preset-minify "^0.2.0"
+    babel-preset-react "^6.24.1"
+    babel-preset-react-app "^3.1.0"
+    babel-preset-stage-0 "^6.24.1"
+    babel-runtime "^6.26.0"
+    case-sensitive-paths-webpack-plugin "^2.1.1"
+    chalk "^2.3.0"
+    commander "^2.11.0"
+    common-tags "^1.4.0"
+    configstore "^3.1.1"
+    core-js "^2.5.1"
+    css-loader "^0.28.7"
+    express "^4.16.2"
+    file-loader "^1.1.5"
+    find-cache-dir "^1.0.0"
+    glamor "^2.20.40"
+    glamorous "^4.11.0"
+    global "^4.3.2"
+    json-loader "^0.5.7"
+    json-stringify-safe "^5.0.1"
+    json5 "^0.5.1"
+    lodash.flattendeep "^4.4.0"
+    lodash.pick "^4.4.0"
+    postcss-flexbugs-fixes "^3.2.0"
+    postcss-loader "^2.0.8"
+    prop-types "^15.6.0"
+    qs "^6.5.1"
+    redux "^3.7.2"
+    request "^2.83.0"
+    serve-favicon "^2.4.5"
+    shelljs "^0.7.8"
+    style-loader "^0.18.2"
+    url-loader "^0.6.2"
+    util-deprecate "^1.0.2"
+    uuid "^3.1.0"
+    webpack "^3.8.1"
+    webpack-dev-middleware "^1.12.0"
+    webpack-hot-middleware "^2.20.0"
+
+"@storybook/ui@^3.2.16":
+  version "3.2.16"
+  resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-3.2.16.tgz#b7df979c2f5770e54cf84300cc09b7072c2fef16"
+  dependencies:
+    "@hypnosphi/fuse.js" "^3.0.9"
+    "@storybook/components" "^3.2.16"
+    "@storybook/mantra-core" "^1.7.0"
+    "@storybook/react-fuzzy" "^0.4.3"
+    "@storybook/react-komposer" "^2.0.0"
+    babel-runtime "^6.26.0"
+    deep-equal "^1.0.1"
+    events "^1.1.1"
+    global "^4.3.2"
+    json-stringify-safe "^5.0.1"
+    keycode "^2.1.8"
+    lodash.debounce "^4.0.8"
+    lodash.pick "^4.4.0"
+    lodash.sortby "^4.7.0"
+    podda "^1.2.2"
+    prop-types "^15.6.0"
+    qs "^6.5.1"
+    react-icons "^2.2.7"
+    react-inspector "^2.2.1"
+    react-modal "^3.1.2"
+    react-split-pane "^0.1.71"
+    react-treebeard "^2.0.3"
+    redux "^3.7.2"
+
+"@types/inline-style-prefixer@^3.0.0":
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/@types/inline-style-prefixer/-/inline-style-prefixer-3.0.1.tgz#8541e636b029124b747952e9a28848286d2b5bf6"
+
+"@types/react@^16.0.18":
+  version "16.0.25"
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.25.tgz#bf696b83fe480c5e0eff4335ee39ebc95884a1ed"
+
 abab@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
@@ -37,10 +253,29 @@ acorn@^5.0.0:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7"
 
+airbnb-js-shims@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/airbnb-js-shims/-/airbnb-js-shims-1.3.0.tgz#aac46d80057fb0b414f70e06d07e362fd99ee2fa"
+  dependencies:
+    array-includes "^3.0.3"
+    es5-shim "^4.5.9"
+    es6-shim "^0.35.3"
+    function.prototype.name "^1.0.3"
+    object.entries "^1.0.4"
+    object.getownpropertydescriptors "^2.0.3"
+    object.values "^1.0.4"
+    promise.prototype.finally "^3.0.0"
+    string.prototype.padend "^3.0.0"
+    string.prototype.padstart "^3.0.0"
+
 ajv-keywords@^1.1.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
 
+ajv-keywords@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+
 ajv@^4.7.0, ajv@^4.9.1:
   version "4.11.8"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
@@ -48,7 +283,7 @@ ajv@^4.7.0, ajv@^4.9.1:
     co "^4.6.0"
     json-stable-stringify "^1.0.1"
 
-ajv@^5.1.0:
+ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5:
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda"
   dependencies:
@@ -69,18 +304,38 @@ alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
 
+alter@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd"
+  dependencies:
+    stable "~0.1.3"
+
 amdefine@>=0.0.4:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
 
-ansi-escapes@^1.4.0:
+ansi-align@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
+  dependencies:
+    string-width "^2.0.0"
+
+ansi-escapes@^1.1.0, ansi-escapes@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
 
+ansi-html@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+
 ansi-regex@^2.0.0, ansi-regex@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
 
+ansi-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
 ansi-styles@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -91,6 +346,10 @@ ansi-styles@^3.0.0, ansi-styles@^3.1.0:
   dependencies:
     color-convert "^1.9.0"
 
+ansi-styles@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
+
 anymatch@^1.3.0:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
@@ -139,10 +398,21 @@ array-find-index@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
 
+array-find@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8"
+
 array-flatten@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
 
+array-includes@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.7.0"
+
 array-unique@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
@@ -181,6 +451,26 @@ assert@^1.1.1:
   dependencies:
     util "0.10.3"
 
+ast-traverse@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6"
+
+ast-types@0.10.1:
+  version "0.10.1"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.10.1.tgz#f52fca9715579a14f841d67d7f8d25432ab6a3dd"
+
+ast-types@0.8.12:
+  version "0.8.12"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc"
+
+ast-types@0.8.15:
+  version "0.8.15"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52"
+
+ast-types@0.9.6:
+  version "0.9.6"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
+
 async-each@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
@@ -189,7 +479,7 @@ async-foreach@^0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542"
 
-async@^1.4.0:
+async@^1.4.0, async@^1.5.0:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
 
@@ -214,6 +504,17 @@ autoprefixer@^6.3.1:
     postcss "^5.2.16"
     postcss-value-parser "^3.2.3"
 
+autoprefixer@^7.1.6:
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.6.tgz#fb933039f74af74a83e71225ce78d9fd58ba84d7"
+  dependencies:
+    browserslist "^2.5.1"
+    caniuse-lite "^1.0.30000748"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    postcss "^6.0.13"
+    postcss-value-parser "^3.2.3"
+
 aws-sign2@~0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
@@ -255,6 +556,57 @@ babel-code-frame@^6.11.0, babel-code-frame@^6.26.0:
     esutils "^2.0.2"
     js-tokens "^3.0.2"
 
+babel-core@^5:
+  version "5.8.38"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558"
+  dependencies:
+    babel-plugin-constant-folding "^1.0.1"
+    babel-plugin-dead-code-elimination "^1.0.2"
+    babel-plugin-eval "^1.0.1"
+    babel-plugin-inline-environment-variables "^1.0.1"
+    babel-plugin-jscript "^1.0.4"
+    babel-plugin-member-expression-literals "^1.0.1"
+    babel-plugin-property-literals "^1.0.1"
+    babel-plugin-proto-to-assign "^1.0.3"
+    babel-plugin-react-constant-elements "^1.0.3"
+    babel-plugin-react-display-name "^1.0.3"
+    babel-plugin-remove-console "^1.0.1"
+    babel-plugin-remove-debugger "^1.0.1"
+    babel-plugin-runtime "^1.0.7"
+    babel-plugin-undeclared-variables-check "^1.0.2"
+    babel-plugin-undefined-to-void "^1.1.6"
+    babylon "^5.8.38"
+    bluebird "^2.9.33"
+    chalk "^1.0.0"
+    convert-source-map "^1.1.0"
+    core-js "^1.0.0"
+    debug "^2.1.1"
+    detect-indent "^3.0.0"
+    esutils "^2.0.0"
+    fs-readdir-recursive "^0.1.0"
+    globals "^6.4.0"
+    home-or-tmp "^1.0.0"
+    is-integer "^1.0.4"
+    js-tokens "1.0.1"
+    json5 "^0.4.0"
+    lodash "^3.10.0"
+    minimatch "^2.0.3"
+    output-file-sync "^1.1.0"
+    path-exists "^1.0.0"
+    path-is-absolute "^1.0.0"
+    private "^0.1.6"
+    regenerator "0.8.40"
+    regexpu "^1.3.0"
+    repeating "^1.1.2"
+    resolve "^1.1.6"
+    shebang-regex "^1.0.0"
+    slash "^1.0.0"
+    source-map "^0.5.0"
+    source-map-support "^0.2.10"
+    to-fast-properties "^1.0.0"
+    trim-right "^1.0.0"
+    try-resolve "^1.0.0"
+
 babel-core@^6.0.0, babel-core@^6.23.1, babel-core@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
@@ -334,6 +686,10 @@ babel-helper-define-map@^6.24.1:
     babel-types "^6.26.0"
     lodash "^4.17.4"
 
+babel-helper-evaluate-path@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.2.0.tgz#0bb2eb01996c0cef53c5e8405e999fe4a0244c08"
+
 babel-helper-explode-assignable-expression@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
@@ -351,6 +707,10 @@ babel-helper-explode-class@^6.24.1:
     babel-traverse "^6.24.1"
     babel-types "^6.24.1"
 
+babel-helper-flip-expressions@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.2.0.tgz#160d2090a3d9f9c64a750905321a0bc218f884ec"
+
 babel-helper-function-name@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
@@ -375,6 +735,18 @@ babel-helper-hoist-variables@^6.24.1:
     babel-runtime "^6.22.0"
     babel-types "^6.24.1"
 
+babel-helper-is-nodes-equiv@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz#34e9b300b1479ddd98ec77ea0bbe9342dfe39684"
+
+babel-helper-is-void-0@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-is-void-0/-/babel-helper-is-void-0-0.2.0.tgz#6ed0ada8a9b1c5b6e88af6b47c1b3b5c080860eb"
+
+babel-helper-mark-eval-scopes@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.2.0.tgz#7648aaf2ec92aae9b09a20ad91e8df5e1fcc94b2"
+
 babel-helper-optimise-call-expression@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
@@ -400,6 +772,10 @@ babel-helper-remap-async-to-generator@^6.24.1:
     babel-traverse "^6.24.1"
     babel-types "^6.24.1"
 
+babel-helper-remove-or-void@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.2.0.tgz#8e46ad5b30560d57d7510b3fd93f332ee7c67386"
+
 babel-helper-replace-supers@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
@@ -411,6 +787,10 @@ babel-helper-replace-supers@^6.24.1:
     babel-traverse "^6.24.1"
     babel-types "^6.24.1"
 
+babel-helper-to-multiple-sequence-expressions@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.2.0.tgz#d1a419634c6cb301f27858c659167cfee0a9d318"
+
 babel-helpers@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
@@ -435,6 +815,14 @@ babel-loader@^6.3.2:
     mkdirp "^0.5.1"
     object-assign "^4.0.1"
 
+babel-loader@^7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126"
+  dependencies:
+    find-cache-dir "^1.0.0"
+    loader-utils "^1.0.2"
+    mkdirp "^0.5.1"
+
 babel-messages@^6.23.0:
   version "6.23.0"
   resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
@@ -451,6 +839,30 @@ babel-plugin-check-es2015-constants@^6.22.0:
   dependencies:
     babel-runtime "^6.22.0"
 
+babel-plugin-constant-folding@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e"
+
+babel-plugin-dead-code-elimination@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65"
+
+babel-plugin-dynamic-import-node@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz#bd1d88ac7aaf98df4917c384373b04d971a2b37a"
+  dependencies:
+    babel-plugin-syntax-dynamic-import "^6.18.0"
+    babel-template "^6.26.0"
+    babel-types "^6.26.0"
+
+babel-plugin-eval@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da"
+
+babel-plugin-inline-environment-variables@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe"
+
 babel-plugin-istanbul@^4.0.0:
   version "4.1.5"
   resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e"
@@ -463,6 +875,79 @@ babel-plugin-jest-hoist@^20.0.3:
   version "20.0.3"
   resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767"
 
+babel-plugin-jscript@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc"
+
+babel-plugin-member-expression-literals@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3"
+
+babel-plugin-minify-builtins@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.2.0.tgz#317f824b0907210b6348671bb040ca072e2e0c82"
+  dependencies:
+    babel-helper-evaluate-path "^0.2.0"
+
+babel-plugin-minify-constant-folding@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.2.0.tgz#8c70b528b2eb7c13e94d95c8789077d4cdbc3970"
+  dependencies:
+    babel-helper-evaluate-path "^0.2.0"
+
+babel-plugin-minify-dead-code-elimination@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.2.0.tgz#e8025ee10a1e5e4f202633a6928ce892c33747e3"
+  dependencies:
+    babel-helper-evaluate-path "^0.2.0"
+    babel-helper-mark-eval-scopes "^0.2.0"
+    babel-helper-remove-or-void "^0.2.0"
+    lodash.some "^4.6.0"
+
+babel-plugin-minify-flip-comparisons@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.2.0.tgz#0c9c8e93155c8f09dedad8118b634c259f709ef5"
+  dependencies:
+    babel-helper-is-void-0 "^0.2.0"
+
+babel-plugin-minify-guarded-expressions@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.2.0.tgz#8a8c950040fce3e258a12e6eb21eab94ad7235ab"
+  dependencies:
+    babel-helper-flip-expressions "^0.2.0"
+
+babel-plugin-minify-infinity@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.2.0.tgz#30960c615ddbc657c045bb00a1d8eb4af257cf03"
+
+babel-plugin-minify-mangle-names@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.2.0.tgz#719892297ff0106a6ec1a4b0fc062f1f8b6a8529"
+  dependencies:
+    babel-helper-mark-eval-scopes "^0.2.0"
+
+babel-plugin-minify-numeric-literals@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.2.0.tgz#5746e851700167a380c05e93f289a7070459a0d1"
+
+babel-plugin-minify-replace@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.2.0.tgz#3c1f06bc4e6d3e301eacb763edc1be611efc39b0"
+
+babel-plugin-minify-simplify@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.2.0.tgz#21ceec4857100c5476d7cef121f351156e5c9bc0"
+  dependencies:
+    babel-helper-flip-expressions "^0.2.0"
+    babel-helper-is-nodes-equiv "^0.0.1"
+    babel-helper-to-multiple-sequence-expressions "^0.2.0"
+
+babel-plugin-minify-type-constructors@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.2.0.tgz#7f3b6458be0863cfd59e9985bed6d134aa7a2e17"
+  dependencies:
+    babel-helper-is-void-0 "^0.2.0"
+
 babel-plugin-module-resolver@^2.7.1:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-2.7.1.tgz#18be3c42ddf59f7a456c9e0512cd91394f6e4be1"
@@ -471,6 +956,44 @@ babel-plugin-module-resolver@^2.7.1:
     glob "^7.1.1"
     resolve "^1.2.0"
 
+babel-plugin-property-literals@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336"
+
+babel-plugin-proto-to-assign@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123"
+  dependencies:
+    lodash "^3.9.3"
+
+babel-plugin-react-constant-elements@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a"
+
+babel-plugin-react-display-name@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc"
+
+babel-plugin-react-docgen@^1.8.0:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-react-docgen/-/babel-plugin-react-docgen-1.8.1.tgz#6e08e057f5dcd46b434e7553e971baa604dae377"
+  dependencies:
+    babel-types "^6.24.1"
+    lodash "4.x.x"
+    react-docgen "^2.15.0"
+
+babel-plugin-remove-console@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7"
+
+babel-plugin-remove-debugger@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7"
+
+babel-plugin-runtime@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf"
+
 babel-plugin-syntax-async-functions@^6.8.0:
   version "6.13.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
@@ -495,7 +1018,7 @@ babel-plugin-syntax-do-expressions@^6.8.0:
   version "6.13.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d"
 
-babel-plugin-syntax-dynamic-import@^6.18.0:
+babel-plugin-syntax-dynamic-import@6.18.0, babel-plugin-syntax-dynamic-import@^6.18.0:
   version "6.18.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
 
@@ -551,7 +1074,7 @@ babel-plugin-transform-class-constructor-call@^6.24.1:
     babel-runtime "^6.22.0"
     babel-template "^6.24.1"
 
-babel-plugin-transform-class-properties@^6.24.1:
+babel-plugin-transform-class-properties@6.24.1, babel-plugin-transform-class-properties@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
   dependencies:
@@ -760,7 +1283,7 @@ babel-plugin-transform-export-extensions@^6.22.0:
     babel-plugin-syntax-export-extensions "^6.8.0"
     babel-runtime "^6.22.0"
 
-babel-plugin-transform-flow-strip-types@^6.22.0:
+babel-plugin-transform-flow-strip-types@^6.22.0, babel-plugin-transform-flow-strip-types@^6.8.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
   dependencies:
@@ -774,34 +1297,62 @@ babel-plugin-transform-function-bind@^6.22.0:
     babel-plugin-syntax-function-bind "^6.8.0"
     babel-runtime "^6.22.0"
 
-babel-plugin-transform-object-rest-spread@^6.22.0:
+babel-plugin-transform-inline-consecutive-adds@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.2.0.tgz#15dae78921057f4004f8eafd79e15ddc5f12f426"
+
+babel-plugin-transform-member-expression-literals@^6.8.5:
+  version "6.8.5"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.8.5.tgz#e06ae305cf48d819822e93a70d79269f04d89eec"
+
+babel-plugin-transform-merge-sibling-variables@^6.8.6:
+  version "6.8.6"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.8.6.tgz#6d21efa5ee4981f71657fae716f9594bb2622aef"
+
+babel-plugin-transform-minify-booleans@^6.8.3:
+  version "6.8.3"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.8.3.tgz#5906ed776d3718250519abf1bace44b0b613ddf9"
+
+babel-plugin-transform-object-rest-spread@6.26.0, babel-plugin-transform-object-rest-spread@^6.22.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
   dependencies:
     babel-plugin-syntax-object-rest-spread "^6.8.0"
     babel-runtime "^6.26.0"
 
+babel-plugin-transform-property-literals@^6.8.5:
+  version "6.8.5"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.8.5.tgz#67ed5930b34805443452c8b9690c7ebe1e206c40"
+  dependencies:
+    esutils "^2.0.2"
+
+babel-plugin-transform-react-constant-elements@6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz#2f119bf4d2cdd45eb9baaae574053c604f6147dd"
+  dependencies:
+    babel-runtime "^6.22.0"
+
 babel-plugin-transform-react-display-name@^6.23.0:
   version "6.25.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1"
   dependencies:
     babel-runtime "^6.22.0"
 
-babel-plugin-transform-react-jsx-self@^6.22.0:
+babel-plugin-transform-react-jsx-self@6.22.0, babel-plugin-transform-react-jsx-self@^6.22.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
   dependencies:
     babel-plugin-syntax-jsx "^6.8.0"
     babel-runtime "^6.22.0"
 
-babel-plugin-transform-react-jsx-source@^6.22.0:
+babel-plugin-transform-react-jsx-source@6.22.0, babel-plugin-transform-react-jsx-source@^6.22.0:
   version "6.22.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
   dependencies:
     babel-plugin-syntax-jsx "^6.8.0"
     babel-runtime "^6.22.0"
 
-babel-plugin-transform-react-jsx@^6.24.1:
+babel-plugin-transform-react-jsx@6.24.1, babel-plugin-transform-react-jsx@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
   dependencies:
@@ -809,12 +1360,40 @@ babel-plugin-transform-react-jsx@^6.24.1:
     babel-plugin-syntax-jsx "^6.8.0"
     babel-runtime "^6.22.0"
 
-babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1:
+babel-plugin-transform-regenerator@6.26.0, babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.24.1, babel-plugin-transform-regenerator@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
   dependencies:
     regenerator-transform "^0.10.0"
 
+babel-plugin-transform-regexp-constructors@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.2.0.tgz#6aa5dd0acc515db4be929bbcec4ed4c946c534a3"
+
+babel-plugin-transform-remove-console@^6.8.5:
+  version "6.8.5"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.8.5.tgz#fde9d2d3d725530b0fadd8d31078402410386810"
+
+babel-plugin-transform-remove-debugger@^6.8.5:
+  version "6.8.5"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.8.5.tgz#809584d412bf918f071fdf41e1fdb15ea89cdcd5"
+
+babel-plugin-transform-remove-undefined@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.2.0.tgz#94f052062054c707e8d094acefe79416b63452b1"
+  dependencies:
+    babel-helper-evaluate-path "^0.2.0"
+
+babel-plugin-transform-runtime@6.23.0, babel-plugin-transform-runtime@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-simplify-comparison-operators@^6.8.5:
+  version "6.8.5"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.8.5.tgz#a838786baf40cc33a93b95ae09e05591227e43bf"
+
 babel-plugin-transform-strict-mode@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
@@ -822,6 +1401,20 @@ babel-plugin-transform-strict-mode@^6.24.1:
     babel-runtime "^6.22.0"
     babel-types "^6.24.1"
 
+babel-plugin-transform-undefined-to-void@^6.8.3:
+  version "6.8.3"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.8.3.tgz#fc52707f6ee1ddc71bb91b0d314fbefdeef9beb4"
+
+babel-plugin-undeclared-variables-check@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee"
+  dependencies:
+    leven "^1.0.2"
+
+babel-plugin-undefined-to-void@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81"
+
 babel-polyfill@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
@@ -830,7 +1423,7 @@ babel-polyfill@^6.26.0:
     core-js "^2.5.0"
     regenerator-runtime "^0.10.5"
 
-babel-preset-env@^1.1.8:
+babel-preset-env@1.6.1, babel-preset-env@^1.1.8, babel-preset-env@^1.6.1:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48"
   dependencies:
@@ -865,7 +1458,7 @@ babel-preset-env@^1.1.8:
     invariant "^2.2.2"
     semver "^5.3.0"
 
-babel-preset-es2015@^6.24.1:
+babel-preset-es2015@^6.24.1, babel-preset-es2015@^6.9.0:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
   dependencies:
@@ -906,7 +1499,52 @@ babel-preset-jest@^20.0.3:
   dependencies:
     babel-plugin-jest-hoist "^20.0.3"
 
-babel-preset-react@^6.23.0:
+babel-preset-minify@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz#006566552d9b83834472273f306c0131062a0acc"
+  dependencies:
+    babel-plugin-minify-builtins "^0.2.0"
+    babel-plugin-minify-constant-folding "^0.2.0"
+    babel-plugin-minify-dead-code-elimination "^0.2.0"
+    babel-plugin-minify-flip-comparisons "^0.2.0"
+    babel-plugin-minify-guarded-expressions "^0.2.0"
+    babel-plugin-minify-infinity "^0.2.0"
+    babel-plugin-minify-mangle-names "^0.2.0"
+    babel-plugin-minify-numeric-literals "^0.2.0"
+    babel-plugin-minify-replace "^0.2.0"
+    babel-plugin-minify-simplify "^0.2.0"
+    babel-plugin-minify-type-constructors "^0.2.0"
+    babel-plugin-transform-inline-consecutive-adds "^0.2.0"
+    babel-plugin-transform-member-expression-literals "^6.8.5"
+    babel-plugin-transform-merge-sibling-variables "^6.8.6"
+    babel-plugin-transform-minify-booleans "^6.8.3"
+    babel-plugin-transform-property-literals "^6.8.5"
+    babel-plugin-transform-regexp-constructors "^0.2.0"
+    babel-plugin-transform-remove-console "^6.8.5"
+    babel-plugin-transform-remove-debugger "^6.8.5"
+    babel-plugin-transform-remove-undefined "^0.2.0"
+    babel-plugin-transform-simplify-comparison-operators "^6.8.5"
+    babel-plugin-transform-undefined-to-void "^6.8.3"
+    lodash.isplainobject "^4.0.6"
+
+babel-preset-react-app@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.0.tgz#d77f6061ab9d7bf4b3cdc86b7cde9ded0df03e48"
+  dependencies:
+    babel-plugin-dynamic-import-node "1.1.0"
+    babel-plugin-syntax-dynamic-import "6.18.0"
+    babel-plugin-transform-class-properties "6.24.1"
+    babel-plugin-transform-object-rest-spread "6.26.0"
+    babel-plugin-transform-react-constant-elements "6.23.0"
+    babel-plugin-transform-react-jsx "6.24.1"
+    babel-plugin-transform-react-jsx-self "6.22.0"
+    babel-plugin-transform-react-jsx-source "6.22.0"
+    babel-plugin-transform-regenerator "6.26.0"
+    babel-plugin-transform-runtime "6.23.0"
+    babel-preset-env "1.6.1"
+    babel-preset-react "6.24.1"
+
+babel-preset-react@6.24.1, babel-preset-react@^6.23.0, babel-preset-react@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
   dependencies:
@@ -925,7 +1563,7 @@ babel-preset-stage-0@^6.24.1:
     babel-plugin-transform-function-bind "^6.22.0"
     babel-preset-stage-1 "^6.24.1"
 
-babel-preset-stage-1@^6.24.1:
+babel-preset-stage-1@^6.24.1, babel-preset-stage-1@^6.5.0:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0"
   dependencies:
@@ -952,7 +1590,7 @@ babel-preset-stage-3@^6.24.1:
     babel-plugin-transform-exponentiation-operator "^6.24.1"
     babel-plugin-transform-object-rest-spread "^6.22.0"
 
-babel-register@^6.26.0:
+babel-register@^6.26.0, babel-register@^6.9.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
   dependencies:
@@ -964,7 +1602,7 @@ babel-register@^6.26.0:
     mkdirp "^0.5.1"
     source-map-support "^0.4.15"
 
-babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.5.0, babel-runtime@^6.9.2:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   dependencies:
@@ -1004,7 +1642,11 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26
     lodash "^4.17.4"
     to-fast-properties "^1.0.3"
 
-babylon@^6.18.0:
+babylon@^5.8.38, babylon@~5.8.3:
+  version "5.8.38"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd"
+
+babylon@^6.17.3, babylon@^6.18.0:
   version "6.18.0"
   resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
 
@@ -1040,6 +1682,10 @@ block-stream@*:
   dependencies:
     inherits "~2.0.0"
 
+bluebird@^2.9.33:
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
+
 bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
   version "4.11.8"
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
@@ -1077,7 +1723,23 @@ boom@5.x.x:
   dependencies:
     hoek "4.x.x"
 
-brace-expansion@^1.1.7:
+bowser@^1.0.0, bowser@^1.7.3:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/bowser/-/bowser-1.8.1.tgz#49785777e7302febadb1a5b71d9a646520ed310d"
+
+boxen@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.2.tgz#3f1d4032c30ffea9d4b02c322eaf2ea741dcbce5"
+  dependencies:
+    ansi-align "^2.0.0"
+    camelcase "^4.0.0"
+    chalk "^2.0.1"
+    cli-boxes "^1.0.0"
+    string-width "^2.0.0"
+    term-size "^1.2.0"
+    widest-line "^1.0.0"
+
+brace-expansion@^1.0.0, brace-expansion@^1.1.7:
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292"
   dependencies:
@@ -1092,6 +1754,14 @@ braces@^1.8.2:
     preserve "^0.2.0"
     repeat-element "^1.1.2"
 
+brcast@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/brcast/-/brcast-3.0.1.tgz#6256a8349b20de9eed44257a9b24d71493cd48dd"
+
+breakable@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1"
+
 brorand@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
@@ -1168,6 +1838,13 @@ browserslist@^2.1.2:
     caniuse-lite "^1.0.30000757"
     electron-to-chromium "^1.3.27"
 
+browserslist@^2.5.1:
+  version "2.9.0"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.9.0.tgz#706aca15c53be15610f466e348cbfa0c00a6a379"
+  dependencies:
+    caniuse-lite "^1.0.30000760"
+    electron-to-chromium "^1.3.27"
+
 bser@1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169"
@@ -1215,7 +1892,7 @@ camelcase-keys@^2.0.0:
     camelcase "^2.0.0"
     map-obj "^1.0.0"
 
-camelcase@^1.0.2:
+camelcase@^1.0.2, camelcase@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
 
@@ -1227,6 +1904,10 @@ camelcase@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
 
+camelcase@^4.0.0, camelcase@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
 caniuse-api@^1.5.2:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
@@ -1240,10 +1921,22 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
   version "1.0.30000758"
   resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000758.tgz#a235627b1922e878b63164942c991b84de92c810"
 
+caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000760:
+  version "1.0.30000766"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000766.tgz#8a095cc5eb9923c27008ce4d0db23e65a3e28843"
+
 caniuse-lite@^1.0.30000757:
   version "1.0.30000758"
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000758.tgz#e261140076651049cf6891ed4bc649b5c8c26c69"
 
+capture-stack-trace@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d"
+
+case-sensitive-paths-webpack-plugin@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz#3d29ced8c1f124bf6f53846fb3f5894731fdc909"
+
 caseless@~0.12.0:
   version "0.12.0"
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -1255,7 +1948,11 @@ center-align@^0.1.1:
     align-text "^0.1.3"
     lazy-cache "^1.0.3"
 
-chalk@^1.1.1, chalk@^1.1.3:
+chain-function@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc"
+
+chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
   dependencies:
@@ -1265,7 +1962,7 @@ chalk@^1.1.1, chalk@^1.1.3:
     strip-ansi "^3.0.0"
     supports-color "^2.0.0"
 
-chalk@^2.3.0:
+chalk@^2.0.1, chalk@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba"
   dependencies:
@@ -1273,6 +1970,22 @@ chalk@^2.3.0:
     escape-string-regexp "^1.0.5"
     supports-color "^4.0.0"
 
+chalk@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f"
+  dependencies:
+    ansi-styles "~1.0.0"
+    has-color "~0.1.0"
+    strip-ansi "~0.1.0"
+
+child-process-promise@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074"
+  dependencies:
+    cross-spawn "^4.0.2"
+    node-version "^1.0.0"
+    promise-polyfill "^6.0.1"
+
 chokidar@^1.6.1, chokidar@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
@@ -1305,6 +2018,24 @@ clap@^1.0.9:
   dependencies:
     chalk "^1.1.3"
 
+classnames@^2.2.5:
+  version "2.2.5"
+  resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
+
+cli-boxes@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+
+cli-cursor@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+  dependencies:
+    restore-cursor "^1.0.1"
+
+cli-width@^1.0.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d"
+
 cliui@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
@@ -1380,7 +2111,7 @@ colormin@^1.0.5:
     css-color-names "0.0.4"
     has "^1.0.1"
 
-colors@~1.1.2:
+colors@^1.1.2, colors@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
 
@@ -1390,18 +2121,49 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@^2.11.0:
+commander@^2.11.0, commander@^2.5.0, commander@^2.9.0:
   version "2.11.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
 
+common-tags@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0"
+  dependencies:
+    babel-runtime "^6.18.0"
+
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
 
+commoner@~0.10.3:
+  version "0.10.8"
+  resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5"
+  dependencies:
+    commander "^2.5.0"
+    detective "^4.3.1"
+    glob "^5.0.15"
+    graceful-fs "^4.1.2"
+    iconv-lite "^0.4.5"
+    mkdirp "^0.5.0"
+    private "^0.1.6"
+    q "^1.1.2"
+    recast "^0.11.17"
+
 concat-map@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
 
+configstore@^3.0.0, configstore@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90"
+  dependencies:
+    dot-prop "^4.1.0"
+    graceful-fs "^4.1.2"
+    make-dir "^1.0.0"
+    unique-string "^1.0.0"
+    write-file-atomic "^2.0.0"
+    xdg-basedir "^3.0.0"
+
 console-browserify@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
@@ -1428,7 +2190,7 @@ content-type@~1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
 
-convert-source-map@^1.4.0, convert-source-map@^1.5.0:
+convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
 
@@ -1444,7 +2206,7 @@ core-js@^1.0.0:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
 
-core-js@^2.4.0, core-js@^2.5.0:
+core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.5.1:
   version "2.5.1"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b"
 
@@ -1471,6 +2233,12 @@ create-ecdh@^4.0.0:
     bn.js "^4.1.0"
     elliptic "^6.0.0"
 
+create-error-class@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+  dependencies:
+    capture-stack-trace "^1.0.0"
+
 create-hash@^1.1.0, create-hash@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
@@ -1491,7 +2259,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
-create-react-class@^15.6.0:
+create-react-class@^15.5.2, create-react-class@^15.6.0:
   version "15.6.2"
   resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a"
   dependencies:
@@ -1513,7 +2281,14 @@ cross-spawn@^3.0.0:
     lru-cache "^4.0.1"
     which "^1.2.9"
 
-cross-spawn@^5.1.0:
+cross-spawn@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
+  dependencies:
+    lru-cache "^4.0.1"
+    which "^1.2.9"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
   dependencies:
@@ -1549,11 +2324,21 @@ crypto-browserify@^3.11.0:
     randombytes "^2.0.0"
     randomfill "^1.0.3"
 
+crypto-random-string@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+
 css-color-names@0.0.4:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
 
-css-loader@^0.28.0:
+css-in-js-utils@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-2.0.0.tgz#5af1dd70f4b06b331f48d22a3d86e0786c0b9435"
+  dependencies:
+    hyphenate-style-name "^1.0.2"
+
+css-loader@^0.28.0, css-loader@^0.28.7:
   version "0.28.7"
   resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.7.tgz#5f2ee989dd32edd907717f953317656160999c1b"
   dependencies:
@@ -1644,8 +2429,14 @@ currently-unhandled@^0.4.1:
   dependencies:
     array-find-index "^1.0.1"
 
-dashdash@^1.12.0:
-  version "1.14.1"
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+  dependencies:
+    es5-ext "^0.10.9"
+
+dashdash@^1.12.0:
+  version "1.14.1"
   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
   dependencies:
     assert-plus "^1.0.0"
@@ -1654,7 +2445,7 @@ date-now@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
 
-debug@2.6.9, debug@^2.2.0, debug@^2.6.8:
+debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.6.8:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
   dependencies:
@@ -1670,6 +2461,10 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
 
+deep-equal@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+
 deep-extend@~0.4.0:
   version "0.4.2"
   resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
@@ -1684,10 +2479,32 @@ default-require-extensions@^1.0.0:
   dependencies:
     strip-bom "^2.0.0"
 
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
 defined@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
 
+defs@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2"
+  dependencies:
+    alter "~0.2.0"
+    ast-traverse "~0.1.1"
+    breakable "~1.0.0"
+    esprima-fb "~15001.1001.0-dev-harmony-fb"
+    simple-fmt "~0.1.0"
+    simple-is "~0.2.0"
+    stringmap "~0.2.2"
+    stringset "~0.2.1"
+    tryor "~0.1.2"
+    yargs "~3.27.0"
+
 delayed-stream@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
@@ -1711,6 +2528,14 @@ destroy@~1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
 
+detect-indent@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75"
+  dependencies:
+    get-stdin "^4.0.1"
+    minimist "^1.1.0"
+    repeating "^1.1.0"
+
 detect-indent@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
@@ -1721,6 +2546,13 @@ detect-libc@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1"
 
+detective@^4.3.1:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1"
+  dependencies:
+    acorn "^4.0.3"
+    defined "^1.0.0"
+
 diff@^3.2.0:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
@@ -1733,10 +2565,35 @@ diffie-hellman@^5.0.0:
     miller-rabin "^4.0.0"
     randombytes "^2.0.0"
 
+doctrine@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
+  dependencies:
+    esutils "^2.0.2"
+    isarray "^1.0.0"
+
+dom-helpers@^3.2.0:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a"
+
+dom-walk@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
+
 domain-browser@^1.1.1:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
 
+dot-prop@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+  dependencies:
+    is-obj "^1.0.0"
+
+duplexer3@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
 ecc-jsbn@~0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
@@ -1777,7 +2634,7 @@ encoding@^0.1.11:
   dependencies:
     iconv-lite "~0.4.13"
 
-enhanced-resolve@^3.3.0:
+enhanced-resolve@^3.3.0, enhanced-resolve@^3.4.0:
   version "3.4.1"
   resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
   dependencies:
@@ -1798,6 +2655,84 @@ error-ex@^1.2.0:
   dependencies:
     is-arrayish "^0.2.1"
 
+es-abstract@^1.4.3, es-abstract@^1.5.1, es-abstract@^1.6.1, es-abstract@^1.7.0, es-abstract@^1.9.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.9.0.tgz#690829a07cae36b222e7fd9b75c0d0573eb25227"
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.1"
+    has "^1.0.1"
+    is-callable "^1.1.3"
+    is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+  version "0.10.35"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.35.tgz#18ee858ce6a3c45c7d79e91c15fcca9ec568494f"
+  dependencies:
+    es6-iterator "~2.0.1"
+    es6-symbol "~3.1.1"
+
+es5-shim@^4.5.9:
+  version "4.5.9"
+  resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.5.9.tgz#2a1e2b9e583ff5fed0c20a3ee2cbf3f75230a5c0"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-set "~0.1.5"
+    es6-symbol "~3.1.1"
+    event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-symbol "3.1.1"
+    event-emitter "~0.3.5"
+
+es6-shim@^0.35.3:
+  version "0.35.3"
+  resolved "https://registry.yarnpkg.com/es6-shim/-/es6-shim-0.35.3.tgz#9bfb7363feffff87a6cdb6cd93e405ec3c4b6f26"
+
+es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
 escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -1817,23 +2752,43 @@ escodegen@^1.6.1:
   optionalDependencies:
     source-map "~0.5.6"
 
+escope@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+  dependencies:
+    es6-map "^0.1.3"
+    es6-weak-map "^2.0.1"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+esprima-fb@~15001.1001.0-dev-harmony-fb:
+  version "15001.1001.0-dev-harmony-fb"
+  resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659"
+
 esprima@^2.6.0:
   version "2.7.3"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
 
-esprima@^3.1.3:
+esprima@^3.1.3, esprima@~3.1.0:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
 
-esprima@^4.0.0:
+esprima@^4.0.0, esprima@~4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
 
-estraverse@^4.2.0:
+esrecurse@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163"
+  dependencies:
+    estraverse "^4.1.0"
+    object-assign "^4.0.1"
+
+estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
 
-esutils@^2.0.2:
+esutils@^2.0.0, esutils@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
 
@@ -1841,7 +2796,14 @@ etag@~1.8.1:
   version "1.8.1"
   resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
 
-events@^1.0.0:
+event-emitter@~0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+events@^1.0.0, events@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
 
@@ -1858,6 +2820,26 @@ exec-sh@^0.2.0:
   dependencies:
     merge "^1.1.3"
 
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+exenv@^1.2.0, exenv@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d"
+
+exit-hook@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
 expand-brackets@^0.1.4:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
@@ -1870,7 +2852,7 @@ expand-range@^1.8.1:
   dependencies:
     fill-range "^2.1.0"
 
-express@^4.14.1:
+express@^4.14.1, express@^4.16.2:
   version "4.16.2"
   resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
   dependencies:
@@ -1931,6 +2913,10 @@ fast-levenshtein@~2.0.4:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
 
+fast-memoize@^2.2.7:
+  version "2.2.8"
+  resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.2.8.tgz#d7f899f31d037b12d9db4281912f9018575720b1"
+
 fastparse@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
@@ -1947,7 +2933,7 @@ fb-watchman@^2.0.0:
   dependencies:
     bser "^2.0.0"
 
-fbjs@^0.8.16, fbjs@^0.8.9:
+fbjs@^0.8.12, fbjs@^0.8.16, fbjs@^0.8.9:
   version "0.8.16"
   resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db"
   dependencies:
@@ -1959,6 +2945,20 @@ fbjs@^0.8.16, fbjs@^0.8.9:
     setimmediate "^1.0.5"
     ua-parser-js "^0.7.9"
 
+figures@^1.3.5:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
+file-loader@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.5.tgz#91c25b6b6fbe56dae99f10a425fd64933b5c9daa"
+  dependencies:
+    loader-utils "^1.0.2"
+    schema-utils "^0.3.0"
+
 filename-regex@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
@@ -2007,6 +3007,14 @@ find-cache-dir@^0.1.1:
     mkdirp "^0.5.1"
     pkg-dir "^1.0.0"
 
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
 find-up@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -2014,7 +3022,7 @@ find-up@^1.0.0:
     path-exists "^2.0.0"
     pinkie-promise "^2.0.0"
 
-find-up@^2.1.0:
+find-up@^2.0.0, find-up@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
   dependencies:
@@ -2024,6 +3032,10 @@ flatten@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
 
+flow-parser@^0.*:
+  version "0.59.0"
+  resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.59.0.tgz#f6ebcae61ffa187e420999d40ce0a801f39b2635"
+
 for-in@^0.1.3:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
@@ -2044,6 +3056,10 @@ for-own@^1.0.0:
   dependencies:
     for-in "^1.0.1"
 
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
 forever-agent@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
@@ -2072,6 +3088,10 @@ fresh@0.5.2:
   version "0.5.2"
   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
 
+fs-readdir-recursive@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059"
+
 fs-readdir-recursive@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
@@ -2104,10 +3124,22 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
     mkdirp ">=0.5 0"
     rimraf "2"
 
-function-bind@^1.0.2:
+function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
 
+function.prototype.name@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.3.tgz#0099ae5572e9dd6f03c97d023fd92bcc5e639eac"
+  dependencies:
+    define-properties "^1.1.2"
+    function-bind "^1.1.0"
+    is-callable "^1.1.3"
+
+fuse.js@^3.0.1:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-3.2.0.tgz#f0448e8069855bf2a3e683cdc1d320e7e2a07ef4"
+
 gauge@~2.7.3:
   version "2.7.4"
   resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@@ -2135,12 +3167,38 @@ get-stdin@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
 
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
 getpass@^0.1.1:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
   dependencies:
     assert-plus "^1.0.0"
 
+glamor@^2.20.40:
+  version "2.20.40"
+  resolved "https://registry.yarnpkg.com/glamor/-/glamor-2.20.40.tgz#f606660357b7cf18dface731ad1a2cfa93817f05"
+  dependencies:
+    fbjs "^0.8.12"
+    inline-style-prefixer "^3.0.6"
+    object-assign "^4.1.1"
+    prop-types "^15.5.10"
+    through "^2.3.8"
+
+glamorous@^4.11.0:
+  version "4.11.0"
+  resolved "https://registry.yarnpkg.com/glamorous/-/glamorous-4.11.0.tgz#cb846dda1450c895c59a34060fb19e3251ed619f"
+  dependencies:
+    brcast "^3.0.0"
+    fast-memoize "^2.2.7"
+    html-tag-names "^1.1.1"
+    is-function "^1.0.1"
+    is-plain-object "^2.0.4"
+    react-html-attributes "^1.3.0"
+    svg-tag-names "^1.1.0"
+
 glob-base@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
@@ -2154,6 +3212,16 @@ glob-parent@^2.0.0:
   dependencies:
     is-glob "^2.0.0"
 
+glob@^5.0.15:
+  version "5.0.15"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
 glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
   version "7.1.2"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
@@ -2165,6 +3233,23 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+global-dirs@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f"
+  dependencies:
+    ini "^1.3.4"
+
+global@^4.3.2:
+  version "4.3.2"
+  resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
+  dependencies:
+    min-document "^2.19.0"
+    process "~0.5.1"
+
+globals@^6.4.0:
+  version "6.4.1"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f"
+
 globals@^9.18.0:
   version "9.18.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
@@ -2177,6 +3262,22 @@ globule@^1.0.0:
     lodash "~4.17.4"
     minimatch "~3.0.2"
 
+got@^6.7.1:
+  version "6.7.1"
+  resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
+  dependencies:
+    create-error-class "^3.0.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    is-redirect "^1.0.0"
+    is-retry-allowed "^1.0.0"
+    is-stream "^1.0.0"
+    lowercase-keys "^1.0.0"
+    safe-buffer "^5.0.1"
+    timed-out "^4.0.0"
+    unzip-response "^2.0.1"
+    url-parse-lax "^1.0.0"
+
 graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4:
   version "4.1.11"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
@@ -2223,6 +3324,10 @@ has-ansi@^2.0.0:
   dependencies:
     ansi-regex "^2.0.0"
 
+has-color@~0.1.0:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f"
+
 has-flag@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
@@ -2295,6 +3400,17 @@ hoek@4.x.x:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d"
 
+hoist-non-react-statics@1.x.x, hoist-non-react-statics@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz#aa448cf0986d55cc40773b17174b7dd066cb7cfb"
+
+home-or-tmp@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985"
+  dependencies:
+    os-tmpdir "^1.0.1"
+    user-home "^1.1.1"
+
 home-or-tmp@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
@@ -2310,12 +3426,24 @@ html-comment-regex@^1.1.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
 
+html-element-attributes@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/html-element-attributes/-/html-element-attributes-1.3.0.tgz#f06ebdfce22de979db82020265cac541fb17d4fc"
+
 html-encoding-sniffer@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
   dependencies:
     whatwg-encoding "^1.0.1"
 
+html-entities@^1.2.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+
+html-tag-names@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/html-tag-names/-/html-tag-names-1.1.2.tgz#f65168964c5a9c82675efda882875dcb2a875c22"
+
 http-errors@1.6.2, http-errors@~1.6.2:
   version "1.6.2"
   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
@@ -2345,7 +3473,11 @@ https-browserify@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
 
-iconv-lite@0.4.19, iconv-lite@~0.4.13:
+hyphenate-style-name@^1.0.1, hyphenate-style-name@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b"
+
+iconv-lite@0.4.19, iconv-lite@^0.4.5, iconv-lite@~0.4.13:
   version "0.4.19"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
 
@@ -2363,6 +3495,18 @@ ieee754@^1.1.4:
   version "1.1.8"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
 
+immutable@^3.8.1:
+  version "3.8.2"
+  resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
+
+import-lazy@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
 in-publish@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51"
@@ -2396,10 +3540,46 @@ inherits@2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
 
-ini@~1.3.0:
+ini@^1.3.4, ini@~1.3.0:
   version "1.3.4"
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
 
+inline-style-prefixer@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-2.0.5.tgz#c153c7e88fd84fef5c602e95a8168b2770671fe7"
+  dependencies:
+    bowser "^1.0.0"
+    hyphenate-style-name "^1.0.1"
+
+inline-style-prefixer@^3.0.6:
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz#8551b8e5b4d573244e66a34b04f7d32076a2b534"
+  dependencies:
+    bowser "^1.7.3"
+    css-in-js-utils "^2.0.0"
+
+inquirer@^0.11.0:
+  version "0.11.4"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.11.4.tgz#81e3374e8361beaff2d97016206d359d0b32fa4d"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    ansi-regex "^2.0.0"
+    chalk "^1.0.0"
+    cli-cursor "^1.0.1"
+    cli-width "^1.0.1"
+    figures "^1.3.5"
+    lodash "^3.3.1"
+    readline2 "^1.0.1"
+    run-async "^0.1.0"
+    rx-lite "^3.1.2"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+insert-css@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-2.0.0.tgz#eb5d1097b7542f4c79ea3060d3aee07d053880f4"
+
 interpret@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0"
@@ -2446,16 +3626,28 @@ is-builtin-module@^1.0.0:
   dependencies:
     builtin-modules "^1.0.0"
 
+is-callable@^1.1.1, is-callable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
 is-ci@^1.0.10:
   version "1.0.10"
   resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e"
   dependencies:
     ci-info "^1.0.0"
 
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
 is-directory@^0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
 
+is-dom@^1.0.9:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.0.9.tgz#483832d52972073de12b9fe3f60320870da8370d"
+
 is-dotfile@^1.0.0:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
@@ -2486,12 +3678,37 @@ is-fullwidth-code-point@^1.0.0:
   dependencies:
     number-is-nan "^1.0.0"
 
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-function@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
+
 is-glob@^2.0.0, is-glob@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
   dependencies:
     is-extglob "^1.0.0"
 
+is-installed-globally@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
+  dependencies:
+    global-dirs "^0.1.0"
+    is-path-inside "^1.0.0"
+
+is-integer@^1.0.4:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.7.tgz#6bde81aacddf78b659b6629d629cadc51a886d5c"
+  dependencies:
+    is-finite "^1.0.0"
+
+is-npm@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
+
 is-number@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@@ -2504,11 +3721,21 @@ is-number@^3.0.0:
   dependencies:
     kind-of "^3.0.2"
 
+is-obj@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-path-inside@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+  dependencies:
+    path-is-inside "^1.0.1"
+
 is-plain-obj@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
 
-is-plain-object@^2.0.1:
+is-plain-object@^2.0.1, is-plain-object@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
   dependencies:
@@ -2522,7 +3749,21 @@ is-primitive@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
 
-is-stream@^1.0.1:
+is-redirect@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
+is-regex@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
+is-retry-allowed@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
 
@@ -2532,6 +3773,10 @@ is-svg@^2.0.0:
   dependencies:
     html-comment-regex "^1.1.0"
 
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
 is-typedarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -2851,6 +4096,10 @@ js-base64@^2.1.8, js-base64@^2.1.9:
   version "2.3.2"
   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf"
 
+js-tokens@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae"
+
 js-tokens@^3.0.0, js-tokens@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
@@ -2873,6 +4122,27 @@ jsbn@~0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
 
+jscodeshift@^0.3.30:
+  version "0.3.32"
+  resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.3.32.tgz#dece5eb602f16340d8d954c7f96ac907c502eabb"
+  dependencies:
+    async "^1.5.0"
+    babel-core "^5"
+    babel-plugin-transform-flow-strip-types "^6.8.0"
+    babel-preset-es2015 "^6.9.0"
+    babel-preset-stage-1 "^6.5.0"
+    babel-register "^6.9.0"
+    babylon "^6.17.3"
+    colors "^1.1.2"
+    flow-parser "^0.*"
+    lodash "^4.13.1"
+    micromatch "^2.3.7"
+    node-dir "0.1.8"
+    nomnom "^1.8.1"
+    recast "^0.12.5"
+    temp "^0.8.1"
+    write-file-atomic "^1.2.0"
+
 jsdom@^9.12.0:
   version "9.12.0"
   resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
@@ -2905,7 +4175,7 @@ jsesc@~0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
 
-json-loader@^0.5.4:
+json-loader@^0.5.4, json-loader@^0.5.7:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
 
@@ -2923,10 +4193,14 @@ json-stable-stringify@^1.0.1:
   dependencies:
     jsonify "~0.0.0"
 
-json-stringify-safe@~5.0.1:
+json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
 
+json5@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d"
+
 json5@^0.5.0, json5@^0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
@@ -2944,6 +4218,10 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
+keycode@^2.1.8:
+  version "2.1.9"
+  resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.1.9.tgz#964a23c54e4889405b4861a5c9f0480d45141dfa"
+
 kind-of@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5"
@@ -2962,6 +4240,12 @@ kind-of@^4.0.0:
   dependencies:
     is-buffer "^1.1.5"
 
+latest-version@^3.0.0, latest-version@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
+  dependencies:
+    package-json "^4.0.0"
+
 lazy-cache@^0.2.3:
   version "0.2.7"
   resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65"
@@ -2976,6 +4260,10 @@ lcid@^1.0.0:
   dependencies:
     invert-kv "^1.0.0"
 
+leven@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3"
+
 leven@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
@@ -2997,6 +4285,15 @@ load-json-file@^1.0.0:
     pinkie-promise "^2.0.0"
     strip-bom "^2.0.0"
 
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
 loader-runner@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
@@ -3010,7 +4307,7 @@ loader-utils@^0.2.16:
     json5 "^0.5.0"
     object-assign "^4.0.1"
 
-loader-utils@^1.0.1, loader-utils@^1.0.2:
+loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
   dependencies:
@@ -3025,6 +4322,14 @@ locate-path@^2.0.0:
     p-locate "^2.0.0"
     path-exists "^3.0.0"
 
+lodash-es@^4.2.1:
+  version "4.17.4"
+  resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.4.tgz#dcc1d7552e150a0640073ba9cb31d70f032950e7"
+
+lodash._getnative@^3.0.0:
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+
 lodash.assign@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
@@ -3037,6 +4342,34 @@ lodash.clonedeep@^4.3.2:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
 
+lodash.debounce@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash.flattendeep@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
+
+lodash.isarguments@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
+
+lodash.isarray@^3.0.0:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55"
+
+lodash.isplainobject@^4.0.6:
+  version "4.0.6"
+  resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+
+lodash.keys@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a"
+  dependencies:
+    lodash._getnative "^3.0.0"
+    lodash.isarguments "^3.0.0"
+    lodash.isarray "^3.0.0"
+
 lodash.memoize@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
@@ -3045,6 +4378,18 @@ lodash.mergewith@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55"
 
+lodash.pick@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
+
+lodash.some@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+
 lodash.tail@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
@@ -3053,10 +4398,14 @@ lodash.uniq@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
 
-lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.4, lodash@~4.17.4:
+lodash@4.x.x, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.2.1, lodash@~4.17.4:
   version "4.17.4"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
 
+lodash@^3.10.0, lodash@^3.10.1, lodash@^3.3.1, lodash@^3.9.3:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
 longest@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
@@ -3074,6 +4423,10 @@ loud-rejection@^1.0.0:
     currently-unhandled "^0.4.1"
     signal-exit "^3.0.0"
 
+lowercase-keys@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+
 lru-cache@^4.0.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
@@ -3085,6 +4438,12 @@ macaddress@^0.2.8:
   version "0.2.8"
   resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12"
 
+make-dir@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51"
+  dependencies:
+    pify "^3.0.0"
+
 makeerror@1.0.x:
   version "1.0.11"
   resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
@@ -3095,6 +4454,10 @@ map-obj@^1.0.0, map-obj@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
 
+material-colors@^1.2.1:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.5.tgz#5292593e6754cb1bcc2b98030e4e0d6a3afc9ea1"
+
 math-expression-evaluator@^1.2.14:
   version "1.2.17"
   resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
@@ -3110,6 +4473,12 @@ media-typer@0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
 
+mem@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+  dependencies:
+    mimic-fn "^1.0.0"
+
 memory-fs@^0.4.0, memory-fs@~0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@@ -3136,6 +4505,15 @@ merge-descriptors@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
 
+merge-dirs@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/merge-dirs/-/merge-dirs-0.2.1.tgz#21e648b2c6b0261712509e4df36c2424773160c9"
+  dependencies:
+    inquirer "^0.11.0"
+    minimist "^1.2.0"
+    node-fs "~0.1.7"
+    path "^0.12.7"
+
 merge@^1.1.3:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
@@ -3144,7 +4522,7 @@ methods@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
 
-micromatch@^2.1.5, micromatch@^2.3.11:
+micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7:
   version "2.3.11"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
   dependencies:
@@ -3179,10 +4557,20 @@ mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17,
   dependencies:
     mime-db "~1.30.0"
 
-mime@1.4.1:
+mime@1.4.1, mime@^1.3.4, mime@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
 
+mimic-fn@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
+
+min-document@^2.19.0:
+  version "2.19.0"
+  resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+  dependencies:
+    dom-walk "^0.1.0"
+
 minimalistic-assert@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
@@ -3191,17 +4579,23 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
 
-minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
+"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
   dependencies:
     brace-expansion "^1.1.7"
 
+minimatch@^2.0.3:
+  version "2.0.10"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7"
+  dependencies:
+    brace-expansion "^1.0.0"
+
 minimist@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
 
-minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
@@ -3222,10 +4616,18 @@ mixin-object@^2.0.1:
   dependencies:
     minimist "0.0.8"
 
+moment@^2.19.2:
+  version "2.19.2"
+  resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.2.tgz#8a7f774c95a64550b4c7ebd496683908f9419dbe"
+
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 
+mute-stream@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+
 nan@^2.3.0, nan@^2.3.2:
   version "2.7.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
@@ -3238,6 +4640,16 @@ negotiator@0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
 
+node-dir@0.1.8:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.8.tgz#55fb8deb699070707fb67f91a460f0448294c77d"
+
+node-dir@^0.1.10:
+  version "0.1.17"
+  resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5"
+  dependencies:
+    minimatch "^3.0.2"
+
 node-fetch@^1.0.1:
   version "1.7.3"
   resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef"
@@ -3245,6 +4657,10 @@ node-fetch@^1.0.1:
     encoding "^0.1.11"
     is-stream "^1.0.1"
 
+node-fs@~0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/node-fs/-/node-fs-0.1.7.tgz#32323cccb46c9fbf0fc11812d45021cc31d325bb"
+
 node-gyp@^3.3.1:
   version "3.6.2"
   resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60"
@@ -3343,6 +4759,17 @@ node-sass@^4.5.0:
     sass-graph "^2.2.4"
     stdout-stream "^1.4.0"
 
+node-version@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.1.0.tgz#f437d7ba407e65e2c4eaef8887b1718ba523d4f0"
+
+nomnom@^1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7"
+  dependencies:
+    chalk "~0.4.0"
+    underscore "~1.6.0"
+
 "nopt@2 || 3":
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
@@ -3384,6 +4811,12 @@ normalize-url@^1.4.0:
     query-string "^4.1.0"
     sort-keys "^1.0.0"
 
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  dependencies:
+    path-key "^2.0.0"
+
 "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
@@ -3409,10 +4842,34 @@ oauth-sign@~0.8.1, oauth-sign@~0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
 
+object-assign@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+
 object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
 
+object-keys@^1.0.8:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object.entries@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.6.1"
+    function-bind "^1.1.0"
+    has "^1.0.1"
+
+object.getownpropertydescriptors@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.5.1"
+
 object.omit@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
@@ -3420,6 +4877,15 @@ object.omit@^2.0.0:
     for-own "^0.1.4"
     is-extendable "^0.1.1"
 
+object.values@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.6.1"
+    function-bind "^1.1.0"
+    has "^1.0.1"
+
 on-finished@~2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@@ -3432,6 +4898,10 @@ once@^1.3.0, once@^1.3.3, once@^1.4.0:
   dependencies:
     wrappy "1"
 
+onetime@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
 optimist@^0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
@@ -3464,6 +4934,14 @@ os-locale@^1.4.0:
   dependencies:
     lcid "^1.0.0"
 
+os-locale@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+  dependencies:
+    execa "^0.7.0"
+    lcid "^1.0.0"
+    mem "^1.1.0"
+
 os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
@@ -3475,7 +4953,7 @@ osenv@0, osenv@^0.1.4:
     os-homedir "^1.0.0"
     os-tmpdir "^1.0.0"
 
-output-file-sync@^1.1.2:
+output-file-sync@^1.1.0, output-file-sync@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
   dependencies:
@@ -3483,6 +4961,10 @@ output-file-sync@^1.1.2:
     mkdirp "^0.5.1"
     object-assign "^4.1.0"
 
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
 p-limit@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc"
@@ -3497,6 +4979,15 @@ p-map@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
 
+package-json@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
+  dependencies:
+    got "^6.7.1"
+    registry-auth-token "^3.0.1"
+    registry-url "^3.0.3"
+    semver "^5.1.0"
+
 pako@~0.2.0:
   version "0.2.9"
   resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
@@ -3538,6 +5029,10 @@ path-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
 
+path-exists@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081"
+
 path-exists@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
@@ -3552,6 +5047,14 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
 
+path-is-inside@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
 path-parse@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
@@ -3568,6 +5071,19 @@ path-type@^1.0.0:
     pify "^2.0.0"
     pinkie-promise "^2.0.0"
 
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+path@^0.12.7:
+  version "0.12.7"
+  resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f"
+  dependencies:
+    process "^0.11.1"
+    util "^0.10.3"
+
 pbkdf2@^3.0.3:
   version "3.0.14"
   resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade"
@@ -3610,6 +5126,19 @@ pkg-dir@^1.0.0:
   dependencies:
     find-up "^1.0.0"
 
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  dependencies:
+    find-up "^2.1.0"
+
+podda@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/podda/-/podda-1.2.2.tgz#15b0edbd334ade145813343f5ecf9c10a71cf500"
+  dependencies:
+    babel-runtime "^6.11.6"
+    immutable "^3.8.1"
+
 postcss-calc@^5.2.0:
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
@@ -3671,6 +5200,12 @@ postcss-filter-plugins@^2.0.0:
     postcss "^5.0.4"
     uniqid "^4.0.0"
 
+postcss-flexbugs-fixes@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz#9b8b932c53f9cf13ba0f61875303e447c33dcc51"
+  dependencies:
+    postcss "^6.0.1"
+
 postcss-load-config@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a"
@@ -3703,6 +5238,15 @@ postcss-loader@^1.3.3:
     postcss "^5.2.15"
     postcss-load-config "^1.2.0"
 
+postcss-loader@^2.0.8:
+  version "2.0.8"
+  resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.0.8.tgz#8c67ddb029407dfafe684a406cfc16bad2ce0814"
+  dependencies:
+    loader-utils "^1.1.0"
+    postcss "^6.0.0"
+    postcss-load-config "^1.2.0"
+    schema-utils "^0.3.0"
+
 postcss-merge-idents@^2.1.5:
   version "2.1.7"
   resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
@@ -3880,7 +5424,7 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0
     source-map "^0.5.6"
     supports-color "^3.2.3"
 
-postcss@^6.0.1:
+postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13:
   version "6.0.14"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.14.tgz#5534c72114739e75d0afcf017db853099f562885"
   dependencies:
@@ -3892,7 +5436,7 @@ prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
 
-prepend-http@^1.0.0:
+prepend-http@^1.0.0, prepend-http@^1.0.1:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
 
@@ -3907,7 +5451,7 @@ pretty-format@^20.0.3:
     ansi-regex "^2.1.1"
     ansi-styles "^3.0.0"
 
-private@^0.1.6, private@^0.1.7:
+private@^0.1.6, private@^0.1.7, private@~0.1.5:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
 
@@ -3915,17 +5459,33 @@ process-nextick-args@~1.0.6:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
 
-process@^0.11.0:
+process@^0.11.0, process@^0.11.1:
   version "0.11.10"
   resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
 
+process@~0.5.1:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
+
+promise-polyfill@^6.0.1:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.0.2.tgz#d9c86d3dc4dc2df9016e88946defd69b49b41162"
+
+promise.prototype.finally@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz#66f161b1643636e50e7cf201dc1b84a857f3864e"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.9.0"
+    function-bind "^1.1.1"
+
 promise@^7.1.1:
   version "7.3.1"
   resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
   dependencies:
     asap "~2.0.3"
 
-prop-types@^15.5.10:
+prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.7, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0:
   version "15.6.0"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
   dependencies:
@@ -3970,7 +5530,7 @@ q@^1.1.2:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
 
-qs@6.5.1, qs@~6.5.1:
+qs@6.5.1, qs@^6.5.1, qs@~6.5.1:
   version "6.5.1"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
 
@@ -3989,10 +5549,19 @@ querystring-es3@^0.2.0:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
 
-querystring@0.2.0:
+querystring@0.2.0, querystring@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
 
+radium@^0.19.0:
+  version "0.19.6"
+  resolved "https://registry.yarnpkg.com/radium/-/radium-0.19.6.tgz#b86721d08dbd303b061a4ae2ebb06cc6e335ae72"
+  dependencies:
+    array-find "^1.0.0"
+    exenv "^1.2.1"
+    inline-style-prefixer "^2.0.5"
+    prop-types "^15.5.8"
+
 randomatic@^1.1.3:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c"
@@ -4013,7 +5582,7 @@ randomfill@^1.0.3:
     randombytes "^2.0.5"
     safe-buffer "^5.1.0"
 
-range-parser@~1.2.0:
+range-parser@^1.0.3, range-parser@~1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
 
@@ -4026,7 +5595,7 @@ raw-body@2.3.2:
     iconv-lite "0.4.19"
     unpipe "1.0.0"
 
-rc@^1.1.7:
+rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077"
   dependencies:
@@ -4035,6 +5604,37 @@ rc@^1.1.7:
     minimist "^1.2.0"
     strip-json-comments "~2.0.1"
 
+react-color@^2.11.4:
+  version "2.13.8"
+  resolved "https://registry.yarnpkg.com/react-color/-/react-color-2.13.8.tgz#bcc58f79a722b9bfc37c402e68cd18f26970aee4"
+  dependencies:
+    lodash "^4.0.1"
+    material-colors "^1.2.1"
+    prop-types "^15.5.10"
+    reactcss "^1.2.0"
+    tinycolor2 "^1.4.1"
+
+react-datetime@^2.11.0:
+  version "2.11.0"
+  resolved "https://registry.yarnpkg.com/react-datetime/-/react-datetime-2.11.0.tgz#6560a8e5b81f7e52986083dc2e8cb94bb74528ea"
+  dependencies:
+    create-react-class "^15.5.2"
+    object-assign "^3.0.0"
+    prop-types "^15.5.7"
+    react-onclickoutside "^6.5.0"
+
+react-docgen@^2.15.0:
+  version "2.20.0"
+  resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-2.20.0.tgz#41a6da483a34a4aaed041a9909f5e61864d681cb"
+  dependencies:
+    async "^2.1.4"
+    babel-runtime "^6.9.2"
+    babylon "~5.8.3"
+    commander "^2.9.0"
+    doctrine "^2.0.0"
+    node-dir "^0.1.10"
+    recast "^0.12.6"
+
 react-dom@^15.0.0:
   version "15.6.2"
   resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730"
@@ -4044,10 +5644,60 @@ react-dom@^15.0.0:
     object-assign "^4.1.0"
     prop-types "^15.5.10"
 
+react-html-attributes@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/react-html-attributes/-/react-html-attributes-1.4.1.tgz#97b5ec710da68833598c8be6f89ac436216840a5"
+  dependencies:
+    html-element-attributes "^1.0.0"
+
+react-icon-base@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/react-icon-base/-/react-icon-base-2.1.0.tgz#a196e33fdf1e7aaa1fda3aefbb68bdad9e82a79d"
+
+react-icons@^2.2.7:
+  version "2.2.7"
+  resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-2.2.7.tgz#d7860826b258557510dac10680abea5ca23cf650"
+  dependencies:
+    react-icon-base "2.1.0"
+
+react-inspector@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/react-inspector/-/react-inspector-2.2.1.tgz#c24f9a0131960b8e63c8392254d34df0717aabdf"
+  dependencies:
+    babel-runtime "^6.26.0"
+    is-dom "^1.0.9"
+
+react-modal@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.1.2.tgz#6e1fd656315d6fc62a1edda2b5aecc9752ac6bca"
+  dependencies:
+    exenv "^1.2.0"
+    prop-types "^15.5.10"
+
 react-observed@^1.0.0-beta.2:
   version "1.0.0-beta.2"
   resolved "https://registry.yarnpkg.com/react-observed/-/react-observed-1.0.0-beta.2.tgz#b41a4d58d817c00620dd1f80bce8618dbf5be68a"
 
+react-onclickoutside@^6.5.0:
+  version "6.7.0"
+  resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.7.0.tgz#997a4d533114c9a0a104913638aa26afc084f75c"
+
+react-split-pane@^0.1.71:
+  version "0.1.71"
+  resolved "https://registry.yarnpkg.com/react-split-pane/-/react-split-pane-0.1.71.tgz#19b1b30638655e655f9f5fe57b1ae7cc6c151829"
+  dependencies:
+    "@types/inline-style-prefixer" "^3.0.0"
+    "@types/react" "^16.0.18"
+    inline-style-prefixer "^3.0.6"
+    prop-types "^15.5.10"
+    react-style-proptype "^3.0.0"
+
+react-style-proptype@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/react-style-proptype/-/react-style-proptype-3.1.0.tgz#c8912fc13460f5b0c1ec1114c729d535b52b8073"
+  dependencies:
+    prop-types "^15.5.4"
+
 react-test-renderer@^15.6.1:
   version "15.6.2"
   resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.2.tgz#d0333434fc2c438092696ca770da5ed48037efa8"
@@ -4055,6 +5705,33 @@ react-test-renderer@^15.6.1:
     fbjs "^0.8.9"
     object-assign "^4.1.0"
 
+react-textarea-autosize@^5.2.1:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-5.2.1.tgz#2b78f9067180f41b08ac59f78f1581abadd61e54"
+  dependencies:
+    prop-types "^15.6.0"
+
+react-transition-group@^1.1.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-1.2.1.tgz#e11f72b257f921b213229a774df46612346c7ca6"
+  dependencies:
+    chain-function "^1.0.0"
+    dom-helpers "^3.2.0"
+    loose-envify "^1.3.1"
+    prop-types "^15.5.6"
+    warning "^3.0.0"
+
+react-treebeard@^2.0.3:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/react-treebeard/-/react-treebeard-2.1.0.tgz#fbd5cf51089b6f09a9b18350ab3bddf736e57800"
+  dependencies:
+    babel-runtime "^6.23.0"
+    deep-equal "^1.0.1"
+    prop-types "^15.5.8"
+    radium "^0.19.0"
+    shallowequal "^0.2.2"
+    velocity-react "^1.3.1"
+
 react@^15.0.0:
   version "15.6.2"
   resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72"
@@ -4065,6 +5742,12 @@ react@^15.0.0:
     object-assign "^4.1.0"
     prop-types "^15.5.10"
 
+reactcss@^1.2.0:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd"
+  dependencies:
+    lodash "^4.0.1"
+
 read-pkg-up@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
@@ -4072,6 +5755,13 @@ read-pkg-up@^1.0.1:
     find-up "^1.0.0"
     read-pkg "^1.0.0"
 
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
 read-pkg@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
@@ -4080,6 +5770,14 @@ read-pkg@^1.0.0:
     normalize-package-data "^2.3.2"
     path-type "^1.0.0"
 
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
 readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.6:
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
@@ -4101,6 +5799,57 @@ readdirp@^2.0.0:
     readable-stream "^2.0.2"
     set-immediate-shim "^1.0.1"
 
+readline2@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    mute-stream "0.0.5"
+
+recast@0.10.33:
+  version "0.10.33"
+  resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697"
+  dependencies:
+    ast-types "0.8.12"
+    esprima-fb "~15001.1001.0-dev-harmony-fb"
+    private "~0.1.5"
+    source-map "~0.5.0"
+
+recast@^0.10.10:
+  version "0.10.43"
+  resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f"
+  dependencies:
+    ast-types "0.8.15"
+    esprima-fb "~15001.1001.0-dev-harmony-fb"
+    private "~0.1.5"
+    source-map "~0.5.0"
+
+recast@^0.11.17:
+  version "0.11.23"
+  resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3"
+  dependencies:
+    ast-types "0.9.6"
+    esprima "~3.1.0"
+    private "~0.1.5"
+    source-map "~0.5.0"
+
+recast@^0.12.5, recast@^0.12.6:
+  version "0.12.9"
+  resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.9.tgz#e8e52bdb9691af462ccbd7c15d5a5113647a15f1"
+  dependencies:
+    ast-types "0.10.1"
+    core-js "^2.4.1"
+    esprima "~4.0.0"
+    private "~0.1.5"
+    source-map "~0.6.1"
+
+rechoir@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+  dependencies:
+    resolve "^1.1.6"
+
 redent@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
@@ -4122,6 +5871,15 @@ reduce-function-call@^1.0.1:
   dependencies:
     balanced-match "^0.4.2"
 
+redux@^3.7.2:
+  version "3.7.2"
+  resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
+  dependencies:
+    lodash "^4.2.1"
+    lodash-es "^4.2.1"
+    loose-envify "^1.1.0"
+    symbol-observable "^1.0.3"
+
 regenerate@^1.2.1:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f"
@@ -4142,6 +5900,17 @@ regenerator-transform@^0.10.0:
     babel-types "^6.19.0"
     private "^0.1.6"
 
+regenerator@0.8.40:
+  version "0.8.40"
+  resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8"
+  dependencies:
+    commoner "~0.10.3"
+    defs "~1.1.0"
+    esprima-fb "~15001.1001.0-dev-harmony-fb"
+    private "~0.1.5"
+    recast "0.10.33"
+    through "~2.3.8"
+
 regex-cache@^0.4.2:
   version "0.4.4"
   resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
@@ -4164,6 +5933,29 @@ regexpu-core@^2.0.0:
     regjsgen "^0.2.0"
     regjsparser "^0.1.4"
 
+regexpu@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d"
+  dependencies:
+    esprima "^2.6.0"
+    recast "^0.10.10"
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+registry-auth-token@^3.0.1:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006"
+  dependencies:
+    rc "^1.1.6"
+    safe-buffer "^5.0.1"
+
+registry-url@^3.0.3:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
+  dependencies:
+    rc "^1.0.1"
+
 regjsgen@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
@@ -4186,13 +5978,19 @@ repeat-string@^1.5.2:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
 
+repeating@^1.1.0, repeating@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac"
+  dependencies:
+    is-finite "^1.0.0"
+
 repeating@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
   dependencies:
     is-finite "^1.0.0"
 
-request@2, request@^2.79.0:
+request@2, request@^2.79.0, request@^2.83.0:
   version "2.83.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
   dependencies:
@@ -4262,12 +6060,19 @@ resolve@1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
 
-resolve@^1.2.0, resolve@^1.3.2:
+resolve@^1.1.6, resolve@^1.2.0, resolve@^1.3.2:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
   dependencies:
     path-parse "^1.0.5"
 
+restore-cursor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+  dependencies:
+    exit-hook "^1.0.0"
+    onetime "^1.0.0"
+
 right-align@^0.1.1:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
@@ -4280,6 +6085,10 @@ rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1:
   dependencies:
     glob "^7.0.5"
 
+rimraf@~2.2.6:
+  version "2.2.8"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
+
 ripemd160@^2.0.0, ripemd160@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
@@ -4287,6 +6096,16 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
     hash-base "^2.0.0"
     inherits "^2.0.1"
 
+run-async@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+  dependencies:
+    once "^1.3.0"
+
+rx-lite@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+
 safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
@@ -4326,6 +6145,12 @@ sax@^1.2.1, sax@~1.2.1:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
 
+schema-utils@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf"
+  dependencies:
+    ajv "^5.0.0"
+
 scss-tokenizer@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
@@ -4333,7 +6158,13 @@ scss-tokenizer@^0.2.3:
     js-base64 "^2.1.8"
     source-map "^0.4.2"
 
-"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+semver-diff@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
+  dependencies:
+    semver "^5.0.3"
+
+"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0:
   version "5.4.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
 
@@ -4359,6 +6190,16 @@ send@0.16.1:
     range-parser "~1.2.0"
     statuses "~1.3.1"
 
+serve-favicon@^2.4.5:
+  version "2.4.5"
+  resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.4.5.tgz#49d9a46863153a9240691c893d2b0e7d85d6d436"
+  dependencies:
+    etag "~1.8.1"
+    fresh "0.5.2"
+    ms "2.0.0"
+    parseurl "~1.3.2"
+    safe-buffer "5.1.1"
+
 serve-static@1.13.1:
   version "1.13.1"
   resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719"
@@ -4404,6 +6245,12 @@ shallow-clone@^0.1.2:
     lazy-cache "^0.2.3"
     mixin-object "^2.0.1"
 
+shallowequal@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-0.2.2.tgz#1e32fd5bcab6ad688a4812cb0cc04efc75c7014e"
+  dependencies:
+    lodash.keys "^3.1.2"
+
 shebang-command@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -4414,18 +6261,38 @@ shebang-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
 
+shelljs@^0.7.8:
+  version "0.7.8"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
 shellwords@^0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
 
-signal-exit@^3.0.0:
+signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
 
+simple-fmt@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b"
+
+simple-is@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0"
+
 slash@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
 
+slide@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707"
+
 sntp@1.x.x:
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
@@ -4448,19 +6315,31 @@ source-list-map@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
 
+source-map-support@^0.2.10:
+  version "0.2.10"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc"
+  dependencies:
+    source-map "0.1.32"
+
 source-map-support@^0.4.15:
   version "0.4.18"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
   dependencies:
     source-map "^0.5.6"
 
+source-map@0.1.32:
+  version "0.1.32"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266"
+  dependencies:
+    amdefine ">=0.0.4"
+
 source-map@^0.4.2, source-map@^0.4.4:
   version "0.4.4"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
   dependencies:
     amdefine ">=0.0.4"
 
-source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6:
+source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.6:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
 
@@ -4500,6 +6379,10 @@ sshpk@^1.7.0:
     jsbn "~0.1.0"
     tweetnacl "~0.14.0"
 
+stable@~0.1.3:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10"
+
 "statuses@>= 1.3.1 < 2":
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
@@ -4549,6 +6432,29 @@ string-width@^1.0.1, string-width@^1.0.2:
     is-fullwidth-code-point "^1.0.0"
     strip-ansi "^3.0.0"
 
+string-width@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string.prototype.padend@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.4.3"
+    function-bind "^1.0.2"
+
+string.prototype.padstart@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/string.prototype.padstart/-/string.prototype.padstart-3.0.0.tgz#5bcfad39f4649bb2d031292e19bcf0b510d4b242"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.4.3"
+    function-bind "^1.0.2"
+
 string_decoder@^0.10.25:
   version "0.10.31"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
@@ -4559,6 +6465,14 @@ string_decoder@~1.0.3:
   dependencies:
     safe-buffer "~5.1.0"
 
+stringmap@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1"
+
+stringset@~0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5"
+
 stringstream@~0.0.4, stringstream@~0.0.5:
   version "0.0.5"
   resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
@@ -4569,7 +6483,17 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1:
   dependencies:
     ansi-regex "^2.0.0"
 
-strip-bom@3.0.0:
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-ansi@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991"
+
+strip-bom@3.0.0, strip-bom@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
 
@@ -4579,6 +6503,10 @@ strip-bom@^2.0.0:
   dependencies:
     is-utf8 "^0.2.0"
 
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
 strip-indent@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
@@ -4595,6 +6523,13 @@ style-loader@^0.16.1:
   dependencies:
     loader-utils "^1.0.2"
 
+style-loader@^0.18.2:
+  version "0.18.2"
+  resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.18.2.tgz#cc31459afbcd6d80b7220ee54b291a9fd66ff5eb"
+  dependencies:
+    loader-utils "^1.0.2"
+    schema-utils "^0.3.0"
+
 supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -4605,12 +6540,16 @@ supports-color@^3.1.0, supports-color@^3.1.2, supports-color@^3.2.3:
   dependencies:
     has-flag "^1.0.0"
 
-supports-color@^4.0.0, supports-color@^4.4.0:
+supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
   dependencies:
     has-flag "^2.0.0"
 
+svg-tag-names@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/svg-tag-names/-/svg-tag-names-1.1.1.tgz#9641b29ef71025ee094c7043f7cdde7d99fbd50a"
+
 svgo@^0.7.0:
   version "0.7.2"
   resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
@@ -4623,6 +6562,10 @@ svgo@^0.7.0:
     sax "~1.2.1"
     whet.extend "~0.9.9"
 
+symbol-observable@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d"
+
 symbol-tree@^3.2.1:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
@@ -4652,6 +6595,19 @@ tar@^2.0.0, tar@^2.2.1:
     fstream "^1.0.2"
     inherits "2"
 
+temp@^0.8.1:
+  version "0.8.3"
+  resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59"
+  dependencies:
+    os-tmpdir "^1.0.0"
+    rimraf "~2.2.6"
+
+term-size@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
+  dependencies:
+    execa "^0.7.0"
+
 test-exclude@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26"
@@ -4666,12 +6622,28 @@ throat@^3.0.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836"
 
+through@^2.3.6, through@^2.3.8, through@~2.3.8:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+time-stamp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357"
+
+timed-out@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+
 timers-browserify@^2.0.2:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6"
   dependencies:
     setimmediate "^1.0.4"
 
+tinycolor2@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
+
 tmpl@1.0.x:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
@@ -4680,7 +6652,7 @@ to-arraybuffer@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
 
-to-fast-properties@^1.0.3:
+to-fast-properties@^1.0.0, to-fast-properties@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
 
@@ -4698,10 +6670,18 @@ trim-newlines@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
 
-trim-right@^1.0.1:
+trim-right@^1.0.0, trim-right@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
 
+try-resolve@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912"
+
+tryor@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b"
+
 tty-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -4733,7 +6713,7 @@ ua-parser-js@^0.7.9:
   version "0.7.17"
   resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac"
 
-uglify-js@^2.6, uglify-js@^2.8.27:
+uglify-js@^2.6, uglify-js@^2.8.27, uglify-js@^2.8.29:
   version "2.8.29"
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
   dependencies:
@@ -4746,10 +6726,22 @@ uglify-to-browserify@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
 
+uglifyjs-webpack-plugin@^0.4.6:
+  version "0.4.6"
+  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+  dependencies:
+    source-map "^0.5.6"
+    uglify-js "^2.8.29"
+    webpack-sources "^1.0.1"
+
 uid-number@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
 
+underscore@~1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8"
+
 uniq@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
@@ -4764,10 +6756,48 @@ uniqs@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
 
+unique-string@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
+  dependencies:
+    crypto-random-string "^1.0.0"
+
 unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
 
+unzip-response@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
+
+update-notifier@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451"
+  dependencies:
+    boxen "^1.2.1"
+    chalk "^2.0.1"
+    configstore "^3.0.0"
+    import-lazy "^2.1.0"
+    is-installed-globally "^0.1.0"
+    is-npm "^1.0.0"
+    latest-version "^3.0.0"
+    semver-diff "^2.0.0"
+    xdg-basedir "^3.0.0"
+
+url-loader@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7"
+  dependencies:
+    loader-utils "^1.0.2"
+    mime "^1.4.1"
+    schema-utils "^0.3.0"
+
+url-parse-lax@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+  dependencies:
+    prepend-http "^1.0.1"
+
 url@^0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
@@ -4779,7 +6809,7 @@ user-home@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
 
-util-deprecate@~1.0.1:
+util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
 
@@ -4814,6 +6844,19 @@ vary@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
 
+velocity-animate@^1.4.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.0.tgz#fc8771d8dfe1136ff02a707e10fbb0957c4b030f"
+
+velocity-react@^1.3.1:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/velocity-react/-/velocity-react-1.3.3.tgz#d6d47276cfc8be2a75623879b20140ac58c1b82b"
+  dependencies:
+    lodash "^3.10.1"
+    prop-types "^15.5.8"
+    react-transition-group "^1.1.2"
+    velocity-animate "^1.4.0"
+
 vendors@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22"
@@ -4838,11 +6881,17 @@ walker@~1.0.5:
   dependencies:
     makeerror "1.0.x"
 
+warning@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
+  dependencies:
+    loose-envify "^1.0.0"
+
 watch@~0.10.0:
   version "0.10.0"
   resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc"
 
-watchpack@^1.3.1:
+watchpack@^1.3.1, watchpack@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.4.0.tgz#4a1472bcbb952bd0a9bb4036801f954dfb39faac"
   dependencies:
@@ -4858,6 +6907,25 @@ webidl-conversions@^4.0.0:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
 
+webpack-dev-middleware@^1.12.0:
+  version "1.12.0"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709"
+  dependencies:
+    memory-fs "~0.4.1"
+    mime "^1.3.4"
+    path-is-absolute "^1.0.0"
+    range-parser "^1.0.3"
+    time-stamp "^2.0.0"
+
+webpack-hot-middleware@^2.20.0:
+  version "2.20.0"
+  resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.20.0.tgz#cb896d837758b6408fe0afeeafdc0e5316b15319"
+  dependencies:
+    ansi-html "0.0.7"
+    html-entities "^1.2.0"
+    querystring "^0.2.0"
+    strip-ansi "^3.0.0"
+
 webpack-merge@^4.1.0:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.1.tgz#f1197a0a973e69c6fbeeb6d658219aa8c0c13555"
@@ -4901,6 +6969,33 @@ webpack@^2.2.1:
     webpack-sources "^1.0.1"
     yargs "^6.0.0"
 
+webpack@^3.8.1:
+  version "3.8.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.8.1.tgz#b16968a81100abe61608b0153c9159ef8bb2bd83"
+  dependencies:
+    acorn "^5.0.0"
+    acorn-dynamic-import "^2.0.0"
+    ajv "^5.1.5"
+    ajv-keywords "^2.0.0"
+    async "^2.1.2"
+    enhanced-resolve "^3.4.0"
+    escope "^3.6.0"
+    interpret "^1.0.0"
+    json-loader "^0.5.4"
+    json5 "^0.5.1"
+    loader-runner "^2.3.0"
+    loader-utils "^1.1.0"
+    memory-fs "~0.4.1"
+    mkdirp "~0.5.0"
+    node-libs-browser "^2.0.0"
+    source-map "^0.5.3"
+    supports-color "^4.2.1"
+    tapable "^0.2.7"
+    uglifyjs-webpack-plugin "^0.4.6"
+    watchpack "^1.4.0"
+    webpack-sources "^1.0.1"
+    yargs "^8.0.2"
+
 whatwg-encoding@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3"
@@ -4926,6 +7021,10 @@ which-module@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
 
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
 which@1, which@^1.2.12, which@^1.2.9:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a"
@@ -4938,10 +7037,20 @@ wide-align@^1.1.0:
   dependencies:
     string-width "^1.0.2"
 
+widest-line@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c"
+  dependencies:
+    string-width "^1.0.1"
+
 window-size@0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
 
+window-size@^0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876"
+
 wordwrap@0.0.2:
   version "0.0.2"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
@@ -4972,6 +7081,26 @@ wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
 
+write-file-atomic@^1.2.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    slide "^1.1.5"
+
+write-file-atomic@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
+  dependencies:
+    graceful-fs "^4.1.11"
+    imurmurhash "^0.1.4"
+    signal-exit "^3.0.2"
+
+xdg-basedir@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
+
 xml-name-validator@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
@@ -4980,7 +7109,7 @@ xtend@^4.0.0, xtend@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
 
-y18n@^3.2.1:
+y18n@^3.2.0, y18n@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
 
@@ -5000,6 +7129,12 @@ yargs-parser@^5.0.0:
   dependencies:
     camelcase "^3.0.0"
 
+yargs-parser@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+  dependencies:
+    camelcase "^4.1.0"
+
 yargs@^6.0.0:
   version "6.6.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
@@ -5036,6 +7171,24 @@ yargs@^7.0.0, yargs@^7.0.2:
     y18n "^3.2.1"
     yargs-parser "^5.0.0"
 
+yargs@^8.0.2:
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+  dependencies:
+    camelcase "^4.1.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    read-pkg-up "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^7.0.0"
+
 yargs@~3.10.0:
   version "3.10.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
@@ -5044,3 +7197,14 @@ yargs@~3.10.0:
     cliui "^2.1.0"
     decamelize "^1.0.0"
     window-size "0.1.0"
+
+yargs@~3.27.0:
+  version "3.27.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40"
+  dependencies:
+    camelcase "^1.2.1"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    os-locale "^1.4.0"
+    window-size "^0.1.2"
+    y18n "^3.2.0"

From 9e4816a1c946c06cb239f37b38f5fed29428735b Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 21:29:26 -0800
Subject: [PATCH 102/158] update offsets when Bounds and ScrollEffects
 component updates

---
 src/components/Bounds.js        | 11 +++++++++++
 src/components/ScrollEffects.js | 10 ++++++++++
 2 files changed, 21 insertions(+)

diff --git a/src/components/Bounds.js b/src/components/Bounds.js
index 4bf2bd58f..535710aa3 100644
--- a/src/components/Bounds.js
+++ b/src/components/Bounds.js
@@ -28,6 +28,17 @@ class Bounds extends Component {
         resizeController.subscribe(this.handleResize);
     }
 
+    componentDidUpdate(prevProps) {
+        if (
+            this.props.y !== prevProps.y ||
+            this.props.x !== prevProps.x ||
+            this.props.scale !== prevProps.scale
+        ) {
+            this.parseOffsetUnits();
+            this.setBoundsStyle();
+        }
+    }
+
     componentWillUnmount() {
         const { resizeController } = this.context;
 
diff --git a/src/components/ScrollEffects.js b/src/components/ScrollEffects.js
index 2aa069160..9fa8c2d50 100644
--- a/src/components/ScrollEffects.js
+++ b/src/components/ScrollEffects.js
@@ -26,6 +26,16 @@ class ScrollEffects extends Component {
         this.parseOffsetUnits();
     }
 
+    componentDidUpdate(prevProps) {
+        if (
+            this.props.y !== prevProps.y ||
+            this.props.x !== prevProps.x ||
+            this.props.scale !== prevProps.scale
+        ) {
+            this.parseOffsetUnits();
+        }
+    }
+
     parseOffsetUnits() {
         this.offsets = parseOffsetUnits(this.props);
     }

From b474925b80d357c0c239f797b8f737fa029bb8d5 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 22:41:16 -0800
Subject: [PATCH 103/158] remove old babelrc

---
 .babelrc          | 13 +++++++++++++
 babelrc.js        | 11 -----------
 package.json      |  4 +++-
 webpack.config.js |  3 ---
 4 files changed, 16 insertions(+), 15 deletions(-)
 delete mode 100644 babelrc.js

diff --git a/.babelrc b/.babelrc
index 9feb7b445..b40e755fb 100644
--- a/.babelrc
+++ b/.babelrc
@@ -12,6 +12,19 @@
                     }
                 ]
             ]
+        },
+        "dev": {
+            "presets": ["es2015", "react", "stage-0"],
+            "plugins": [
+                [
+                    "module-resolver",
+                    {
+                        "alias": {
+                            "react-scroll-parallax": "./src"
+                        }
+                    }
+                ]
+            ]
         }
     }
 }
diff --git a/babelrc.js b/babelrc.js
deleted file mode 100644
index f72c821e3..000000000
--- a/babelrc.js
+++ /dev/null
@@ -1,11 +0,0 @@
-module.exports = ({ server } = {}) => ({
-    presets: [
-        [
-            'env', {
-                targets: server ? { node: 4 } : { browsers: ['> 5%', 'last 2 versions', 'ie 11'] },
-            },
-        ],
-        'react',
-        'stage-0',
-    ],
-});
diff --git a/package.json b/package.json
index 0ac08b7cc..165524657 100644
--- a/package.json
+++ b/package.json
@@ -17,7 +17,9 @@
             "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
         "prepublish":
             "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports",
-        "storybook": "BABEL_ENV=test start-storybook -p 6006",
+        "storybook": "BABEL_ENV=dev start-storybook -p 6006",
+        "storybook:export":
+            "BABEL_ENV=dev build-storybook -c .storybook -o .out",
         "build-storybook": "build-storybook"
     },
     "jest": {
diff --git a/webpack.config.js b/webpack.config.js
index 25b6766a2..7803e3c66 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,5 +1,4 @@
 const ROOT = './example/';
-const createBabelConfig = require('./babelrc');
 const merge = require('webpack-merge');
 const nodeExternals = require('webpack-node-externals');
 const path = require('path');
@@ -28,7 +27,6 @@ const clientConfig = merge(baseConfig, {
                 test: /\.js$/,
                 include: [path.resolve(ROOT), path.resolve('./src')],
                 loader: 'babel-loader',
-                query: createBabelConfig(),
             },
             {
                 test: /\.scss$/,
@@ -79,7 +77,6 @@ const serverConfig = merge(baseConfig, {
                 test: /\.js$/,
                 include: [path.resolve(ROOT), path.resolve('./src')],
                 loader: 'babel-loader',
-                query: createBabelConfig({ server: true }),
             },
             {
                 test: /\.scss$/,

From 1ccaaa75fad5f768e7612acad05bd86e729db682 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 22:42:07 -0800
Subject: [PATCH 104/158] update gitignore

---
 .gitignore | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.gitignore b/.gitignore
index af6f3739d..1c49c2739 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
 node_modules
 *dist
+*.out
+*.env
 npm-debug.log
 /lib

From 32158560fc5f5b1ef8ee8798f85c71cb6096b379 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 22:42:29 -0800
Subject: [PATCH 105/158] add travis ci

---
 .travis.yml | 7 +++++++
 deploy.sh   | 4 ++++
 2 files changed, 11 insertions(+)
 create mode 100644 .travis.yml
 create mode 100755 deploy.sh

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..51ac409e9
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,7 @@
+language: node_js
+deploy:
+  script: ./deploy.sh
+  provider: surge
+  project: ./out/
+  domain: react-scroll-parallax.surge.sh
+  on: v2
\ No newline at end of file
diff --git a/deploy.sh b/deploy.sh
new file mode 100755
index 000000000..5efc32d5a
--- /dev/null
+++ b/deploy.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+yarn run test
+yarn run storybook:export
\ No newline at end of file

From 7f99c2f702b1c6f924ceaa31cda20897e0686465 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 22:57:50 -0800
Subject: [PATCH 106/158] update travis with node v and cache

---
 .travis.yml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/.travis.yml b/.travis.yml
index 51ac409e9..768636abf 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,9 @@
 language: node_js
+node_js:
+  - "7"
+cache:
+  directories:
+    - "node_modules"
 deploy:
   script: ./deploy.sh
   provider: surge

From 3cdc420da7ccc6c6bfb518e21077b4a6796b9844 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 23:21:00 -0800
Subject: [PATCH 107/158] update travis

---
 .travis.yml  | 2 +-
 package.json | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 768636abf..1764b8206 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,8 +5,8 @@ cache:
   directories:
     - "node_modules"
 deploy:
-  script: ./deploy.sh
   provider: surge
+  script: npm run deploy
   project: ./out/
   domain: react-scroll-parallax.surge.sh
   on: v2
\ No newline at end of file
diff --git a/package.json b/package.json
index 165524657..7112b420e 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,8 @@
         "storybook": "BABEL_ENV=dev start-storybook -p 6006",
         "storybook:export":
             "BABEL_ENV=dev build-storybook -c .storybook -o .out",
-        "build-storybook": "build-storybook"
+        "build-storybook": "build-storybook",
+        "deploy": "./deploy.sh"
     },
     "jest": {
         "modulePaths": ["<rootDir>/src/"]

From a2112087d8a48f880c2f8a5a83e00e9f31990ea3 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 23:27:06 -0800
Subject: [PATCH 108/158] update gitignore

---
 .gitignore | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 1c49c2739..c17a816fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,5 @@
 node_modules
 *dist
-*.out
 *.env
 npm-debug.log
 /lib

From 6872d6a5df32c6969428e01395fc86bca3762a91 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 23:31:09 -0800
Subject: [PATCH 109/158] update project folder

---
 .travis.yml  | 2 +-
 package.json | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 1764b8206..809b98819 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,6 +7,6 @@ cache:
 deploy:
   provider: surge
   script: npm run deploy
-  project: ./out/
+  project: ./build/
   domain: react-scroll-parallax.surge.sh
   on: v2
\ No newline at end of file
diff --git a/package.json b/package.json
index 7112b420e..fe0c9d452 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,7 @@
             "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports",
         "storybook": "BABEL_ENV=dev start-storybook -p 6006",
         "storybook:export":
-            "BABEL_ENV=dev build-storybook -c .storybook -o .out",
+            "BABEL_ENV=dev build-storybook -c .storybook -o build",
         "build-storybook": "build-storybook",
         "deploy": "./deploy.sh"
     },

From cfdd3f28777c86b732b5f18cef56ebfd3b7ed56f Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 20 Nov 2017 23:33:54 -0800
Subject: [PATCH 110/158] skip cleanup

---
 .travis.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.travis.yml b/.travis.yml
index 809b98819..4bb46e328 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,6 +7,7 @@ cache:
 deploy:
   provider: surge
   script: npm run deploy
+  skip_cleanup: true
   project: ./build/
   domain: react-scroll-parallax.surge.sh
   on: v2
\ No newline at end of file

From 8eb2e69175eb4f2633fd1ab46da59a42a786a538 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 21 Nov 2017 00:01:28 -0800
Subject: [PATCH 111/158] try before_deploy

---
 .travis.yml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 4bb46e328..2c857148f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,8 +6,7 @@ cache:
     - "node_modules"
 deploy:
   provider: surge
-  script: npm run deploy
-  skip_cleanup: true
+  before_deploy: npm run deploy
   project: ./build/
   domain: react-scroll-parallax.surge.sh
   on: v2
\ No newline at end of file

From 90fd4d52b3dd5eb67600a782155ec298d5d7395c Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 21 Nov 2017 00:10:11 -0800
Subject: [PATCH 112/158] remove project

---
 .travis.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index 2c857148f..57a25c709 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,6 +7,6 @@ cache:
 deploy:
   provider: surge
   before_deploy: npm run deploy
-  project: ./build/
+  # project: ./build/
   domain: react-scroll-parallax.surge.sh
   on: v2
\ No newline at end of file

From ae68c8d4163b8038036f8c020e2b0c62543d9170 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 21 Nov 2017 00:16:21 -0800
Subject: [PATCH 113/158] =?UTF-8?q?add=20project,=20skip=5Fcleanup,=20scri?=
 =?UTF-8?q?pt=20again=E2=80=A6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .travis.yml | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 57a25c709..4431675d2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,8 +5,9 @@ cache:
   directories:
     - "node_modules"
 deploy:
+  skip_cleanup: true
   provider: surge
-  before_deploy: npm run deploy
-  # project: ./build/
+  script: npm run deploy
+  project: build
   domain: react-scroll-parallax.surge.sh
   on: v2
\ No newline at end of file

From 17b101f52404da354864fc44ebb7a64417483d72 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 21 Nov 2017 00:19:14 -0800
Subject: [PATCH 114/158] keep the build folder for travis?

---
 build/.gitkeep | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 build/.gitkeep

diff --git a/build/.gitkeep b/build/.gitkeep
new file mode 100644
index 000000000..e69de29bb

From 05d6446d7b6c24745c051a48613400c4a5cfedbd Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 21 Nov 2017 00:24:58 -0800
Subject: [PATCH 115/158] use npm instead of yarn

---
 deploy.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/deploy.sh b/deploy.sh
index 5efc32d5a..9d78f3dde 100755
--- a/deploy.sh
+++ b/deploy.sh
@@ -1,4 +1,4 @@
 #!/bin/sh
 
-yarn run test
-yarn run storybook:export
\ No newline at end of file
+npm run test
+npm run storybook:export
\ No newline at end of file

From 5e3d467712b2b8cae53da6e082e34f8bc6ec4be5 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 21 Nov 2017 00:29:35 -0800
Subject: [PATCH 116/158] try script without bash

---
 .travis.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index 4431675d2..f4d77e7d0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,7 +7,7 @@ cache:
 deploy:
   skip_cleanup: true
   provider: surge
-  script: npm run deploy
+  script: yarn run storybook:export
   project: build
   domain: react-scroll-parallax.surge.sh
   on: v2
\ No newline at end of file

From bf4a3ff20ec28ae339a14738150a3badde047fef Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 21 Nov 2017 00:35:04 -0800
Subject: [PATCH 117/158] update test script

---
 package.json | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index fe0c9d452..434a15237 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
         "dev": "yarn test && webpack --progress --colors --watch",
         "dev-server": "node ./example/dist/server",
         "gh-pages": "NODE_ENV=production webpack --progress --colors",
-        "test": "BABEL_ENV=test jest",
+        "test": "BABEL_ENV=test jest && yarn run storybook:export",
         "test:watch": "BABEL_ENV=test jest --watch",
         "prettier":
             "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
@@ -21,7 +21,7 @@
         "storybook:export":
             "BABEL_ENV=dev build-storybook -c .storybook -o build",
         "build-storybook": "build-storybook",
-        "deploy": "./deploy.sh"
+        "deploy": "yarn run storybook:export"
     },
     "jest": {
         "modulePaths": ["<rootDir>/src/"]

From 8caf6890b43f12e96d13d7e4fb848fa706a10ec7 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 21 Nov 2017 00:42:40 -0800
Subject: [PATCH 118/158] add storybook demo link

---
 README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/README.md b/README.md
index 9e2c62b23..ca2f190f6 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,8 @@
 
 A small library of components for creating **vertical** scroll based effects like parallax based on an element's position in the viewport. Works with universal (server-side rendered) React apps.
 
+[Storybook Demos](http://react-scroll-parallax.surge.sh/)
+
 ### Optimizations
 
 Scroll effects can cause lots of [jank](http://jankfree.org/). The following optimizations _attempt to limit_ this jank:

From 13b1244f099a61399b6bfc274e0123ac3a0917aa Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Wed, 22 Nov 2017 19:09:10 -0800
Subject: [PATCH 119/158] check for undefined className

---
 src/components/Parallax.js | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 6ab8f3378..a5b57ba8c 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -44,9 +44,11 @@ class Parallax extends Component {
 
     getWrapperClass(isInView) {
         const { className } = this.props;
-        return isInView
-            ? `${className} parallax-wrapper is-in-view`
-            : `${className} parallax-wrapper`;
+        let cx = 'parallax-wrapper';
+        cx = isInView ? `${cx} is-in-view` : cx;
+        cx = className ? `${cx} ${className}` : cx;
+
+        return cx;
     }
 
     render() {

From 637e6cc67f957c41958c0d0a75955e8662bff9be Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Wed, 22 Nov 2017 19:12:31 -0800
Subject: [PATCH 120/158] update note

---
 src/components/Parallax.js | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index a5b57ba8c..008f3dc6a 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -58,15 +58,15 @@ class Parallax extends Component {
         //
         // It's not as bad as it looks. ;)
         //
-        // Observed => isInView, mapRef
+        // <Observed> => ({ isInView, mapRef })
         // ↓
-        // ScrollPosition => scrollY
+        // <ScrollPosition> => ({ scrollY })
         // ↓
-        // ViewportProgress => progress, mapRef, updateAttributeCache
+        // <ViewportProgress> => ({ progress, mapRef, updateAttributeCache })
         // ↓
-        // ScrollEffects => style
+        // <ScrollEffects> => ({ style })
         // ↓
-        // renderMarkup(isInView, style, refCallbacks)
+        // markup
 
         const { children, x, y, scale, opacity, observerOptions } = this.props;
 

From 1578f3de7300dd5358ca1378a82ac33e26512079 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Wed, 22 Nov 2017 19:22:49 -0800
Subject: [PATCH 121/158] allow function as child in <Parallax> to access
 `updateAttributeCache`

---
 src/components/Parallax.js | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 008f3dc6a..51bd97449 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -30,7 +30,10 @@ class Parallax extends Component {
     };
 
     static propTypes = {
-        children: PropTypes.node.isRequired,
+        children: PropTypes.oneOfType([
+            PropTypes.element.isRequired,
+            PropTypes.func.isRequired,
+        ]),
         className: PropTypes.string,
         x: validateOffsets,
         y: validateOffsets,
@@ -70,6 +73,9 @@ class Parallax extends Component {
 
         const { children, x, y, scale, opacity, observerOptions } = this.props;
 
+        // if child is a function, call it with updateAttributeCache
+        const isFunc = children instanceof Function;
+
         // prettier-ignore
         return (
             <Observed initialViewState intersectionRatio={0.01} options={observerOptions}>
@@ -89,7 +95,7 @@ class Parallax extends Component {
                                                     y={y}
                                                 >
                                                     <div style={style} className="parallax-element">
-                                                        {children}
+                                                        {isFunc ? children({ updateAttributeCache }) : children}
                                                     </div>
                                                 </Bounds>                                                
                                             </div>

From 45f119dcc5217165b0f44bb9af78291040e5e196 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 4 Dec 2017 23:49:54 -0800
Subject: [PATCH 122/158] add Parallax test

---
 __tests__/Parallax.test.js     | 52 ++++++++++++++++++++++++++++++++++
 src/utils/createBoundsStyle.js | 21 ++++++++------
 2 files changed, 64 insertions(+), 9 deletions(-)
 create mode 100644 __tests__/Parallax.test.js

diff --git a/__tests__/Parallax.test.js b/__tests__/Parallax.test.js
new file mode 100644
index 000000000..11ef0d5a2
--- /dev/null
+++ b/__tests__/Parallax.test.js
@@ -0,0 +1,52 @@
+/* global describe, it, IntersectionObserver */
+
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { Parallax, ParallaxProvider } from 'react-scroll-parallax';
+import renderer from 'react-test-renderer';
+
+describe('Expect a <Parallax> component', () => {
+    require('intersection-observer');
+
+    it('to optionally take a function as a child', () => {
+        const node = document.createElement('div');
+
+        let func = false;
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <Parallax>
+                    {() => {
+                        func = true;
+                        return <div />;
+                    }}
+                </Parallax>
+            </ParallaxProvider>,
+            node
+        );
+
+        expect(func).toBe(true);
+    });
+
+    it('to pass a handler to update attribute cache', () => {
+        const node = document.createElement('div');
+
+        let testParams = {};
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <Parallax>
+                    {params => {
+                        testParams = params;
+                        return <div />;
+                    }}
+                </Parallax>
+            </ParallaxProvider>,
+            node
+        );
+
+        expect(testParams).toMatchObject({
+            updateAttributeCache: expect.any(Function),
+        });
+    });
+});
diff --git a/src/utils/createBoundsStyle.js b/src/utils/createBoundsStyle.js
index 1eaa5a3f3..0021fe575 100644
--- a/src/utils/createBoundsStyle.js
+++ b/src/utils/createBoundsStyle.js
@@ -31,18 +31,21 @@ export default function createBoundsStyle(x, y, scale, el) {
     // this on the initial mount when no styles have been applied.
     // let boundingRect;
     if (hasYPercent || hasXPercent || hasScale) {
-        const computedStyle = getComputedStyle(el);
-
+        const computedStyle = window.getComputedStyle(el);
         height = el.clientHeight; // height with padding
         width = el.clientWidth; // width with padding
 
-        // subtract padding;
-        height -=
-            parseFloat(computedStyle.paddingTop) +
-            parseFloat(computedStyle.paddingBottom);
-        width -=
-            parseFloat(computedStyle.paddingLeft) +
-            parseFloat(computedStyle.paddingRight);
+        const {
+            paddingTop,
+            paddingBottom,
+            paddingLeft,
+            paddingRight,
+        } = computedStyle;
+
+        // subtract padding; Guard is for Jest/Jsdom test which fails
+        // to properly getComputedStyles
+        height -= parseFloat(paddingTop || 0) + parseFloat(paddingBottom || 0);
+        width -= parseFloat(paddingLeft || 0) + parseFloat(paddingRight || 0);
     }
 
     if (y) {

From ac6b5122fcb511267cc26cd0879462379ea68051 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 5 Dec 2017 23:14:17 -0800
Subject: [PATCH 123/158] update README

---
 README.md | 78 +++++++++++++++++++++++--------------------------------
 1 file changed, 32 insertions(+), 46 deletions(-)

diff --git a/README.md b/README.md
index ca2f190f6..f9c5b6c7e 100644
--- a/README.md
+++ b/README.md
@@ -2,17 +2,15 @@
 
 A small library of components for creating **vertical** scroll based effects like parallax based on an element's position in the viewport. Works with universal (server-side rendered) React apps.
 
-[Storybook Demos](http://react-scroll-parallax.surge.sh/)
-
 ### Optimizations
 
 Scroll effects can cause lots of [jank](http://jankfree.org/). The following optimizations _attempt to limit_ this jank:
 
 - Using a single passive scroll listener and single resize listener for all elements
 - Only updates elements when they are within the viewport
-- Determines visibility of elements with the browsers asynchronous [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)
-- Caches expensive calls like `getBoundingClient` that cause paints, reflow and layout
-- Apply effects as 3D transforms to utilize the GPU and prevent re-paints
+- Determines visibility of elements with the browser's asynchronous [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)
+- Caching expensive calls like `getBoundingClient` that cause paints, reflow and layout
+- Applying effects as 3D transforms to utilize the GPU and prevent re-paints
 
 ### Supported Effects
 
@@ -23,19 +21,16 @@ The following are supported effects
 - **Scale**
 - **Opacity** 
 
-
-**NOTE** The v2 branch is a re-write of v1 to add new scroll features such as opacity, scale, and rotation in addition to translation. It also uses the new [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API), which will be a more efficient way to determining when elements are within the viewport as compared to v1's implementation. Additionally, much of the state of v1's ParallaxController has been moved to focused React components with the hope that these components can also be used to create additional custom scroll effects. This also has the added benefit of being able to easily debug with React specific tooling to see the state of scroll effects in the browser.
-
-For a stable version of this library [use v1](https://github.com/jscottsmith/react-scroll-parallax).
-
 ## Examples
 
-@TODO
+[Storybook Demos](http://react-scroll-parallax.surge.sh/)
 
 ## Install
 
+Currently a prerelease. For a stable version of this library [use v1](https://github.com/jscottsmith/react-scroll-parallax).
+
 ```
-npm i react-scroll-parallax --save
+npm i react-scroll-parallax@next --save
 ```
 
 This package also requires [support](https://caniuse.com/#search=IntersectionObserver) for the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API). Since this isn't supported in older browsers you will need to add a [polyfill](https://github.com/w3c/IntersectionObserver/tree/gh-pages/polyfill).
@@ -58,61 +53,52 @@ There are two main components to be utilized in this library:
 
 @TODO: Document other internal components that can be used.
 
-### How to
+### Example usage
 
-Wrap your component tree that will contain `<Parallax>` components with the `<ScrollProvider>`. Most commonly this will be at the root of your application.
+Wrap your app that will contain `<Parallax>` components with the `<ParallaxProvider>` which will provide the necessary`context` to child components.
 
 ```jsx
-...
-import { ScrollProvider } from 'react-scroll-parallax';
-
-class App extends Component {
-    render() {
-        return (
-            <ScrollProvider>
-                <StuffWithParallax />
-            </ScrollProvider>
-        );
-    }
-}
+import { ParallaxProvider } from 'react-scroll-parallax';
 
+const Root = () => (
+    <ParallaxProvider>
+        <App />
+    </ParallaxProvider>
+);
 ```
 
-Import the `<Parallax>` component...
+Import `<Parallax>` then add some props and give it some children to render.
 
-```javascript
+```jsx
 import { Parallax } from 'react-scroll-parallax';
-```
 
-... then use it like so:
-
-```jsx
 <Parallax
-    @TODO: TBD...
+    x={[-100, 100]}
+    y={[-100, 100]}
 >
-    <img src="/image" />
+    <div class="your-thing" />
 </Parallax>
 ```
 
-## Parallax Component Props
+### <Parallax> Props
+
+The following are all props that can be passed to the React `<Parallax />` component. 
 
-The following are all props that can be passed to the React `<Parallax />` component:
+For effect props such as `x`, `y`, `scale`, and `opacity` an `Array` with two elements must be provided. This represents the start and end values of the effect.
 
-**`example`**
+|Prop                  |Type    |Description
+|----------------------|:-------|:----------------------------------------
+|**x**                 |`Array` |`translateX` offsets, first value is the starting position, second is the ending position. Accepts units of `px` or `%`. Integers without units default to `px`.
+|**y**                 |`Array` |`translateY` offsets, first value is the starting position, second is the ending position. Accepts units of `px` or `%`. Integers without units default to `px`.
+|**scale**             |`Array` |`scale` effect, first value is the starting scale, second is the ending scale. Only accepts positive integers.
+|**opacity**           |`Array` |`opacity` effect, first value is the starting opacity, second is the ending opacity. Only accepts integers between 0–1.
+|**className**         |`String`|`class` to be applied to the outermost `<div>`.
+|**observerOptions**   |`Object`|[options](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) given to the Intersection Observer contructor.
 
-- type: `Boolean`
-- default: `false`
 
-@TODO: Document props of the `<Parallax>` component.
 
-## Scroll Controller Context
 
-@TODO: Document any public methods (if any) of the `scrollController` context.
 
-## Optimizations to Reduce Jank
 
-React Scroll Parallax uses a single [passive scroll listener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners) (dependent on browser support) with the minimal amount of work done on the scroll event to prevent [jank](http://jankfree.org/) (calculations that cause layout, reflow and paint are cached initially and only updated when layout changes). All offsets are applied with 3D transforms to utilize the GPU and prevent paints. If you have ideas to further optimize scrolling please PR or post an issue.
 
-**PSA**
 
-It's 2017 and you probably shouldn't be building parallax sites—but if you do (like I did) and you use this package try and use it responsibly. Keeping images small and optimized, reducing the number of moving elements in view and on the page, and disabling scroll effects on mobile devices should help keep animations smooth.

From 5801c5af21050521c1cdb38c2d9d9b579daf3c84 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 5 Dec 2017 23:16:29 -0800
Subject: [PATCH 124/158] update sample props

---
 README.md | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index f9c5b6c7e..0fb877225 100644
--- a/README.md
+++ b/README.md
@@ -73,10 +73,13 @@ Import `<Parallax>` then add some props and give it some children to render.
 import { Parallax } from 'react-scroll-parallax';
 
 <Parallax
-    x={[-100, 100]}
-    y={[-100, 100]}
+    x={['-50%', '75%']}
+    y={['-100px', '100px']}
+    scale={[0.5, 1.5]}
+    opacity={[1, 0]}
+    className="foo"
 >
-    <div class="your-thing" />
+    <div className="bar" />
 </Parallax>
 ```
 
@@ -86,7 +89,7 @@ The following are all props that can be passed to the React `<Parallax />` compo
 
 For effect props such as `x`, `y`, `scale`, and `opacity` an `Array` with two elements must be provided. This represents the start and end values of the effect.
 
-|Prop                  |Type    |Description
+|Name                  |Type    |Description
 |----------------------|:-------|:----------------------------------------
 |**x**                 |`Array` |`translateX` offsets, first value is the starting position, second is the ending position. Accepts units of `px` or `%`. Integers without units default to `px`.
 |**y**                 |`Array` |`translateY` offsets, first value is the starting position, second is the ending position. Accepts units of `px` or `%`. Integers without units default to `px`.

From 9ea084c10bb480c5f3813557524be130c58242e6 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 5 Dec 2017 23:24:41 -0800
Subject: [PATCH 125/158] 2.0.0-alpha.0

---
 package.json | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/package.json b/package.json
index 434a15237..9fd749d37 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "react-scroll-parallax",
-    "version": "1.0.0-beta.0",
+    "version": "2.0.0-alpha.0",
     "description": "React component to create parallax scrolling effects",
     "repository": {
         "type": "git",
@@ -13,20 +13,24 @@
         "gh-pages": "NODE_ENV=production webpack --progress --colors",
         "test": "BABEL_ENV=test jest && yarn run storybook:export",
         "test:watch": "BABEL_ENV=test jest --watch",
-        "prettier":
-            "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
-        "prepublish":
-            "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports",
+        "prettier": "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
+        "prepublish": "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports",
         "storybook": "BABEL_ENV=dev start-storybook -p 6006",
-        "storybook:export":
-            "BABEL_ENV=dev build-storybook -c .storybook -o build",
+        "storybook:export": "BABEL_ENV=dev build-storybook -c .storybook -o build",
         "build-storybook": "build-storybook",
         "deploy": "yarn run storybook:export"
     },
     "jest": {
-        "modulePaths": ["<rootDir>/src/"]
+        "modulePaths": [
+            "<rootDir>/src/"
+        ]
     },
-    "keywords": ["react", "parallax", "scroll", "component"],
+    "keywords": [
+        "react",
+        "parallax",
+        "scroll",
+        "component"
+    ],
     "author": "J Scott Smith",
     "license": "ISC",
     "dependencies": {

From 0e1247e17be89f9ec7c3e138618d66d7b25a61f7 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 12:25:52 -0800
Subject: [PATCH 126/158] remove stories index

---
 stories/index.js | 29 -----------------------------
 1 file changed, 29 deletions(-)
 delete mode 100644 stories/index.js

diff --git a/stories/index.js b/stories/index.js
deleted file mode 100644
index e856eaf04..000000000
--- a/stories/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-import React from 'react';
-
-import { storiesOf } from '@storybook/react';
-import { action } from '@storybook/addon-actions';
-import { linkTo } from '@storybook/addon-links';
-
-import { Button, Welcome } from '@storybook/react/demo';
-
-storiesOf('Welcome', module).add('to Storybook', () => (
-	<Welcome showApp={linkTo('Button')} />
-));
-
-storiesOf('Button', module)
-	.add('with text', () => (
-		<Button onClick={action('clicked')}>Hello Button</Button>
-	))
-	.add('with some emoji', () => (
-		<Button onClick={action('clicked')}>😀 😎 👍 💯</Button>
-	));
-
-import { ParallaxProvider, Parallax } from '../src/components';
-
-storiesOf('Parallax', module).add('with default props', () => (
-	<ParallaxProvider>
-		<Parallax>
-			<div>Foo</div>
-		</Parallax>
-	</ParallaxProvider>
-));

From c6a0b18d8b0987c493eeac96dc95b1e765d917a5 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 12:26:00 -0800
Subject: [PATCH 127/158] cleanup

---
 src/components/ViewportProgress.js | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/src/components/ViewportProgress.js b/src/components/ViewportProgress.js
index cc5e0ab97..402b09102 100644
--- a/src/components/ViewportProgress.js
+++ b/src/components/ViewportProgress.js
@@ -101,8 +101,6 @@ class ViewportProgress extends Component {
             totalDist,
         };
 
-        // console.log('<ViewportProgress> cache updated');
-
         // always update progress when cache updates.
         this.setProgress();
     }
@@ -116,10 +114,9 @@ class ViewportProgress extends Component {
         // Percent the element has moved based on current and total distance to move
         let progress = 1 - (windowHeight - top) / totalDist;
 
-        // NOTE: Clamping
-        // Why? Because the isInView prop may be *slightly*
-        // off since Intersection Observer is not expected
-        // to be pixel-perfect accurate. Regardless, we should
+        // NOTE: Clamping because the isInView prop may be *slightly*
+        // off since Intersection Observer is not expected to be
+        // pixel-perfect accurate. Regardless, we should never
         // exceed the given range.
 
         progress = clamp(progress, range[0], range[1]);

From e2590c2f743f8bb4814a9897b049cfd9b78c1e5c Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 16:26:17 -0800
Subject: [PATCH 128/158] add `progress` and `isInView`  to the Parallax render
 callback

---
 __tests__/Parallax.test.js | 44 ++++++++++++++++++++++++++++++++++++++
 src/components/Parallax.js |  2 +-
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/__tests__/Parallax.test.js b/__tests__/Parallax.test.js
index 11ef0d5a2..1acef90f4 100644
--- a/__tests__/Parallax.test.js
+++ b/__tests__/Parallax.test.js
@@ -49,4 +49,48 @@ describe('Expect a <Parallax> component', () => {
             updateAttributeCache: expect.any(Function),
         });
     });
+
+    it('to pass the isInView boolean', () => {
+        const node = document.createElement('div');
+
+        let testParams = {};
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <Parallax>
+                    {params => {
+                        testParams = params;
+                        return <div />;
+                    }}
+                </Parallax>
+            </ParallaxProvider>,
+            node
+        );
+
+        expect(testParams).toMatchObject({
+            isInView: expect.any(Boolean),
+        });
+    });
+
+    it('to pass the progress value', () => {
+        const node = document.createElement('div');
+
+        let testParams = {};
+
+        ReactDOM.render(
+            <ParallaxProvider>
+                <Parallax>
+                    {params => {
+                        testParams = params;
+                        return <div />;
+                    }}
+                </Parallax>
+            </ParallaxProvider>,
+            node
+        );
+
+        expect(testParams).toMatchObject({
+            progress: expect.any(Number),
+        });
+    });
 });
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 51bd97449..993daf534 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -95,7 +95,7 @@ class Parallax extends Component {
                                                     y={y}
                                                 >
                                                     <div style={style} className="parallax-element">
-                                                        {isFunc ? children({ updateAttributeCache }) : children}
+                                                        {isFunc ? children({ updateAttributeCache, progress, isInView }) : children}
                                                     </div>
                                                 </Bounds>                                                
                                             </div>

From 52fe0cb496d71b116c95d3a01a3fccc528ff6729 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 16:26:43 -0800
Subject: [PATCH 129/158] ignore build

---
 .gitignore | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitignore b/.gitignore
index c17a816fc..1328bed5e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
 node_modules
 *dist
+*build
 *.env
 npm-debug.log
 /lib

From c56189eac978438bfd7b379a1568ad191718a4d1 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 16:32:35 -0800
Subject: [PATCH 130/158] update story name

---
 stories/Parallax.stories.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/stories/Parallax.stories.js b/stories/Parallax.stories.js
index d7e96e168..6a62bd394 100644
--- a/stories/Parallax.stories.js
+++ b/stories/Parallax.stories.js
@@ -15,7 +15,7 @@ import { Element } from '../example/components';
 import styles from './styles.scss';
 import 'intersection-observer';
 
-const stories = storiesOf('Parallax', module);
+const stories = storiesOf('<Parallax>', module);
 
 // Decorate all stories with ParallaxProvider and center styles
 const CenterDecorator = storyFn => (

From a19e01efb068333e0f7f2faea40b6478e739fff3 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 19:15:33 -0800
Subject: [PATCH 131/158] support react 16, move to peer dependency

---
 __tests__/ScrollPosition.test.js   |   9 +
 __tests__/ViewportProgress.test.js |   9 +
 example/client.js                  |   2 +-
 package.json                       |  27 +-
 yarn.lock                          | 867 ++++++++++++++++++-----------
 5 files changed, 562 insertions(+), 352 deletions(-)

diff --git a/__tests__/ScrollPosition.test.js b/__tests__/ScrollPosition.test.js
index 2e45b1f96..c4b89046e 100644
--- a/__tests__/ScrollPosition.test.js
+++ b/__tests__/ScrollPosition.test.js
@@ -4,6 +4,15 @@ import React from 'react';
 import ReactDOM from 'react-dom';
 import { ScrollPosition, ParallaxProvider } from 'react-scroll-parallax';
 
+beforeEach(() => {
+    // see:
+    // https://github.com/facebook/react/issues/11098
+    // https://github.com/facebook/react/pull/11636
+    // spyOn(console, 'error');
+    Error.prototype.suppressReactErrorLogging = true;
+    DOMException.prototype.suppressReactErrorLogging = true;
+});
+
 describe('Expect a <ScrollPosition> component', () => {
     it('to throw if no scrollController is found in context', () => {
         const node = document.createElement('div');
diff --git a/__tests__/ViewportProgress.test.js b/__tests__/ViewportProgress.test.js
index b84ee2046..d4a8b5a02 100644
--- a/__tests__/ViewportProgress.test.js
+++ b/__tests__/ViewportProgress.test.js
@@ -4,6 +4,15 @@ import React from 'react';
 import ReactDOM from 'react-dom';
 import { ViewportProgress, ParallaxProvider } from 'react-scroll-parallax';
 
+beforeEach(() => {
+    // see:
+    // https://github.com/facebook/react/issues/11098
+    // https://github.com/facebook/react/pull/11636
+    // spyOn(console, 'error');
+    Error.prototype.suppressReactErrorLogging = true;
+    DOMException.prototype.suppressReactErrorLogging = true;
+});
+
 describe('Expect a <ViewportProgress> component', () => {
     it('to take a function as a child', () => {
         const node = document.createElement('div');
diff --git a/example/client.js b/example/client.js
index d1e716aae..149c16d64 100644
--- a/example/client.js
+++ b/example/client.js
@@ -7,4 +7,4 @@ import { App } from 'components';
 
 const root = document.getElementById('root');
 
-ReactDOM.render(<App />, root);
+ReactDOM.hydrate(<App />, root);
diff --git a/package.json b/package.json
index 9fd749d37..fdab650c6 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,7 @@
     },
     "main": "lib/index.js",
     "scripts": {
-        "dev": "yarn test && webpack --progress --colors --watch",
+        "dev": "yarn test && BABEL_ENV=dev webpack --progress --colors --watch",
         "dev-server": "node ./example/dist/server",
         "gh-pages": "NODE_ENV=production webpack --progress --colors",
         "test": "BABEL_ENV=test jest && yarn run storybook:export",
@@ -33,18 +33,19 @@
     ],
     "author": "J Scott Smith",
     "license": "ISC",
+    "peerDependencies": {
+        "react": "^15.0.0 || ^16.0.0"
+    },
     "dependencies": {
-        "prop-types": "^15.5.10",
-        "react": "^15.0.0",
-        "react-dom": "^15.0.0",
+        "prop-types": "^15.5.7",
         "react-observed": "^1.0.0-beta.2"
     },
     "devDependencies": {
-        "@storybook/cli": "^3.2.15",
-        "@storybook/addon-actions": "^3.2.15",
-        "@storybook/addon-knobs": "^3.2.15",
-        "@storybook/addon-links": "^3.2.15",
-        "@storybook/react": "^3.2.15",
+        "@storybook/addon-actions": "^3.2.17",
+        "@storybook/addon-knobs": "^3.2.17",
+        "@storybook/addon-links": "^3.2.17",
+        "@storybook/cli": "^3.2.17",
+        "@storybook/react": "^3.2.17",
         "babel-cli": "^6.24.1",
         "babel-core": "^6.23.1",
         "babel-jest": "^20.0.3",
@@ -53,16 +54,18 @@
         "babel-plugin-module-resolver": "^2.7.1",
         "babel-preset-env": "^1.1.8",
         "babel-preset-es2015": "^6.24.1",
-        "babel-preset-react": "^6.23.0",
+        "babel-preset-react": "^6.24.1",
         "babel-preset-stage-0": "^6.24.1",
         "cross-env": "^3.1.4",
         "css-loader": "^0.28.0",
         "express": "^4.14.1",
         "intersection-observer": "^0.4.2",
-        "jest": "^20.0.4",
+        "jest": "^21.3.0-beta.2",
         "node-sass": "^4.5.0",
         "postcss-loader": "^1.3.3",
-        "react-test-renderer": "^15.6.1",
+        "react": "^16.2.0",
+        "react-dom": "^16.2.0",
+        "react-test-renderer": "^16.2.0",
         "regenerator-runtime": "^0.10.5",
         "sass-loader": "^6.0.3",
         "style-loader": "^0.16.1",
diff --git a/yarn.lock b/yarn.lock
index 7a7ce0e4f..372a16b83 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -6,22 +6,22 @@
   version "3.0.9"
   resolved "https://registry.yarnpkg.com/@hypnosphi/fuse.js/-/fuse.js-3.0.9.tgz#ea99f6121b4a8f065b4c71f85595db2714498807"
 
-"@storybook/addon-actions@^3.2.15", "@storybook/addon-actions@^3.2.16":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-3.2.16.tgz#dc53d48dc8035b426a02628687c6cb0601b933b9"
+"@storybook/addon-actions@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-3.2.17.tgz#e85d38f743125157fdaf6669708e089bc2008e50"
   dependencies:
-    "@storybook/addons" "^3.2.16"
+    "@storybook/addons" "^3.2.17"
     deep-equal "^1.0.1"
     json-stringify-safe "^5.0.1"
     prop-types "^15.6.0"
     react-inspector "^2.2.1"
     uuid "^3.1.0"
 
-"@storybook/addon-knobs@^3.2.15":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-3.2.16.tgz#c19747656a969e5b960e4edeb54e5d5f4198609b"
+"@storybook/addon-knobs@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/addon-knobs/-/addon-knobs-3.2.17.tgz#337320c704f9bf53217278aa7a7d442c3428fcf3"
   dependencies:
-    "@storybook/addons" "^3.2.16"
+    "@storybook/addons" "^3.2.17"
     babel-runtime "^6.26.0"
     deep-equal "^1.0.1"
     global "^4.3.2"
@@ -34,36 +34,36 @@
     react-textarea-autosize "^5.2.1"
     util-deprecate "^1.0.2"
 
-"@storybook/addon-links@^3.2.15", "@storybook/addon-links@^3.2.16":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-3.2.16.tgz#58b807f7fbcdadb405c6379e69a22c48025c9558"
+"@storybook/addon-links@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/addon-links/-/addon-links-3.2.17.tgz#fb1d5f5f16575e56d560955d70c2a756c9f5b612"
   dependencies:
-    "@storybook/addons" "^3.2.16"
+    "@storybook/addons" "^3.2.17"
 
-"@storybook/addons@^3.2.16":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-3.2.16.tgz#cbad5d9e8222aba3d5a5d06af98a095322f62cb5"
+"@storybook/addons@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-3.2.17.tgz#5c2ece24c5f7fbf7cedf4cfe503c5e356543e62d"
 
-"@storybook/channel-postmessage@^3.2.16":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-3.2.16.tgz#036b2c1c412e2806badc1c1f7bcbb19b069fedde"
+"@storybook/channel-postmessage@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-3.2.17.tgz#530c1d6852b2c77df08490988fa943ba1373b1ec"
   dependencies:
-    "@storybook/channels" "^3.2.16"
+    "@storybook/channels" "^3.2.17"
     global "^4.3.2"
     json-stringify-safe "^5.0.1"
 
-"@storybook/channels@^3.2.16":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-3.2.16.tgz#07d8686328c0bb885aa8b69254fcf0745d22a620"
+"@storybook/channels@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-3.2.17.tgz#09219a512564d1aa2292419d8d6064dbf7f5a5b3"
 
-"@storybook/cli@^3.2.15":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/cli/-/cli-3.2.16.tgz#e1331ed3327767330f3cb47c5793c2a01153a8a5"
+"@storybook/cli@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/cli/-/cli-3.2.17.tgz#4f597ea9fd2fd61638fe7b7fc9e587f396178593"
   dependencies:
-    "@storybook/codemod" "^3.2.16"
+    "@storybook/codemod" "^3.2.17"
     chalk "^2.3.0"
     child-process-promise "^2.2.1"
-    commander "^2.11.0"
+    commander "^2.12.1"
     cross-spawn "^5.0.1"
     jscodeshift "^0.3.30"
     json5 "^0.5.1"
@@ -72,15 +72,15 @@
     shelljs "^0.7.8"
     update-notifier "^2.3.0"
 
-"@storybook/codemod@^3.2.16":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/codemod/-/codemod-3.2.16.tgz#02206369c6b04acbad039ebddb79abffa4938af1"
+"@storybook/codemod@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/codemod/-/codemod-3.2.17.tgz#ce47fd4727fe711a947afceeb3107dcfc231c2a8"
   dependencies:
     jscodeshift "^0.3.30"
 
-"@storybook/components@^3.2.16":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/components/-/components-3.2.16.tgz#381c4ce414f139fb03b059f1f0265c6246457e7b"
+"@storybook/components@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/components/-/components-3.2.17.tgz#318c6e6a1d3ffb469523b5dcfee775639ccc500b"
   dependencies:
     glamor "^2.20.40"
     glamorous "^4.11.0"
@@ -126,15 +126,15 @@
   dependencies:
     babel-runtime "^6.5.0"
 
-"@storybook/react@^3.2.15":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/react/-/react-3.2.16.tgz#9a0eaecbc7ba6c97e89ce1d17dee7a2af68260c9"
+"@storybook/react@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/react/-/react-3.2.17.tgz#c7b0595efef049d4dae89202994c17f332ee4662"
   dependencies:
-    "@storybook/addon-actions" "^3.2.16"
-    "@storybook/addon-links" "^3.2.16"
-    "@storybook/addons" "^3.2.16"
-    "@storybook/channel-postmessage" "^3.2.16"
-    "@storybook/ui" "^3.2.16"
+    "@storybook/addon-actions" "^3.2.17"
+    "@storybook/addon-links" "^3.2.17"
+    "@storybook/addons" "^3.2.17"
+    "@storybook/channel-postmessage" "^3.2.17"
+    "@storybook/ui" "^3.2.17"
     airbnb-js-shims "^1.3.0"
     autoprefixer "^7.1.6"
     babel-core "^6.26.0"
@@ -150,11 +150,12 @@
     babel-runtime "^6.26.0"
     case-sensitive-paths-webpack-plugin "^2.1.1"
     chalk "^2.3.0"
-    commander "^2.11.0"
-    common-tags "^1.4.0"
+    commander "^2.12.1"
+    common-tags "^1.5.1"
     configstore "^3.1.1"
     core-js "^2.5.1"
     css-loader "^0.28.7"
+    dotenv-webpack "^1.5.4"
     express "^4.16.2"
     file-loader "^1.1.5"
     find-cache-dir "^1.0.0"
@@ -167,7 +168,7 @@
     lodash.flattendeep "^4.4.0"
     lodash.pick "^4.4.0"
     postcss-flexbugs-fixes "^3.2.0"
-    postcss-loader "^2.0.8"
+    postcss-loader "^2.0.9"
     prop-types "^15.6.0"
     qs "^6.5.1"
     redux "^3.7.2"
@@ -179,15 +180,15 @@
     util-deprecate "^1.0.2"
     uuid "^3.1.0"
     webpack "^3.8.1"
-    webpack-dev-middleware "^1.12.0"
-    webpack-hot-middleware "^2.20.0"
+    webpack-dev-middleware "^1.12.2"
+    webpack-hot-middleware "^2.21.0"
 
-"@storybook/ui@^3.2.16":
-  version "3.2.16"
-  resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-3.2.16.tgz#b7df979c2f5770e54cf84300cc09b7072c2fef16"
+"@storybook/ui@^3.2.17":
+  version "3.2.17"
+  resolved "https://registry.yarnpkg.com/@storybook/ui/-/ui-3.2.17.tgz#8838fc5bbe21cedfafc65ee90fe525499370118a"
   dependencies:
     "@hypnosphi/fuse.js" "^3.0.9"
-    "@storybook/components" "^3.2.16"
+    "@storybook/components" "^3.2.17"
     "@storybook/mantra-core" "^1.7.0"
     "@storybook/react-fuzzy" "^0.4.3"
     "@storybook/react-komposer" "^2.0.0"
@@ -205,7 +206,7 @@
     qs "^6.5.1"
     react-icons "^2.2.7"
     react-inspector "^2.2.1"
-    react-modal "^3.1.2"
+    react-modal "^3.1.4"
     react-split-pane "^0.1.71"
     react-treebeard "^2.0.3"
     redux "^3.7.2"
@@ -214,6 +215,10 @@
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/@types/inline-style-prefixer/-/inline-style-prefixer-3.0.1.tgz#8541e636b029124b747952e9a28848286d2b5bf6"
 
+"@types/node@*":
+  version "8.0.57"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.57.tgz#e5d8b4dc112763e35cfc51988f4f38da3c486d99"
+
 "@types/react@^16.0.18":
   version "16.0.25"
   resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.25.tgz#bf696b83fe480c5e0eff4335ee39ebc95884a1ed"
@@ -239,17 +244,17 @@ acorn-dynamic-import@^2.0.0:
   dependencies:
     acorn "^4.0.3"
 
-acorn-globals@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+acorn-globals@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538"
   dependencies:
-    acorn "^4.0.4"
+    acorn "^5.0.0"
 
-acorn@^4.0.3, acorn@^4.0.4:
+acorn@^4.0.3:
   version "4.0.13"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
 
-acorn@^5.0.0:
+acorn@^5.0.0, acorn@^5.1.2:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7"
 
@@ -320,15 +325,19 @@ ansi-align@^2.0.0:
   dependencies:
     string-width "^2.0.0"
 
-ansi-escapes@^1.1.0, ansi-escapes@^1.4.0:
+ansi-escapes@^1.1.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
 
+ansi-escapes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
+
 ansi-html@0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
 
-ansi-regex@^2.0.0, ansi-regex@^2.1.1:
+ansi-regex@^2.0.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
 
@@ -340,7 +349,7 @@ ansi-styles@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
 
-ansi-styles@^3.0.0, ansi-styles@^3.1.0:
+ansi-styles@^3.1.0, ansi-styles@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88"
   dependencies:
@@ -471,6 +480,10 @@ ast-types@0.9.6:
   version "0.9.6"
   resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
 
+astral-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+
 async-each@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
@@ -798,6 +811,13 @@ babel-helpers@^6.24.1:
     babel-runtime "^6.22.0"
     babel-template "^6.24.1"
 
+babel-jest@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.3.0-beta.13.tgz#6d7f0b5560976e0beaf768f4abcee6dddcaa9e50"
+  dependencies:
+    babel-plugin-istanbul "^4.1.5"
+    babel-preset-jest "21.3.0-beta.13"
+
 babel-jest@^20.0.3:
   version "20.0.3"
   resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671"
@@ -863,7 +883,7 @@ babel-plugin-inline-environment-variables@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe"
 
-babel-plugin-istanbul@^4.0.0:
+babel-plugin-istanbul@^4.0.0, babel-plugin-istanbul@^4.1.5:
   version "4.1.5"
   resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e"
   dependencies:
@@ -871,6 +891,10 @@ babel-plugin-istanbul@^4.0.0:
     istanbul-lib-instrument "^1.7.5"
     test-exclude "^4.1.1"
 
+babel-plugin-jest-hoist@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.3.0-beta.13.tgz#16db88e7e0073f144c45ffaa8af7ab8e2e349359"
+
 babel-plugin-jest-hoist@^20.0.3:
   version "20.0.3"
   resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767"
@@ -1042,7 +1066,7 @@ babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
   version "6.18.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
 
-babel-plugin-syntax-object-rest-spread@^6.8.0:
+babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0:
   version "6.13.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
 
@@ -1493,6 +1517,13 @@ babel-preset-flow@^6.23.0:
   dependencies:
     babel-plugin-transform-flow-strip-types "^6.22.0"
 
+babel-preset-jest@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.3.0-beta.13.tgz#b1e9138b5cfe956ab9a5dbc375495e684a08c885"
+  dependencies:
+    babel-plugin-jest-hoist "21.3.0-beta.13"
+    babel-plugin-syntax-object-rest-spread "^6.13.0"
+
 babel-preset-jest@^20.0.3:
   version "20.0.3"
   resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a"
@@ -1544,7 +1575,7 @@ babel-preset-react-app@^3.1.0:
     babel-preset-env "1.6.1"
     babel-preset-react "6.24.1"
 
-babel-preset-react@6.24.1, babel-preset-react@^6.23.0, babel-preset-react@^6.24.1:
+babel-preset-react@6.24.1, babel-preset-react@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
   dependencies:
@@ -1676,6 +1707,10 @@ binary-extensions@^1.0.0:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0"
 
+bindings@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7"
+
 block-stream@*:
   version "0.0.9"
   resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
@@ -1766,6 +1801,10 @@ brorand@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
 
+browser-process-hrtime@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e"
+
 browser-resolve@^1.11.2:
   version "1.11.2"
   resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
@@ -1845,12 +1884,6 @@ browserslist@^2.5.1:
     caniuse-lite "^1.0.30000760"
     electron-to-chromium "^1.3.27"
 
-bser@1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169"
-  dependencies:
-    node-int64 "^0.4.0"
-
 bser@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
@@ -2125,11 +2158,15 @@ commander@^2.11.0, commander@^2.5.0, commander@^2.9.0:
   version "2.11.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
 
-common-tags@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.4.0.tgz#1187be4f3d4cf0c0427d43f74eef1f73501614c0"
+commander@^2.12.1:
+  version "2.12.2"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555"
+
+common-tags@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.5.1.tgz#e2e39931a013cd02253defeed89a1ad615a27f07"
   dependencies:
-    babel-runtime "^6.18.0"
+    babel-runtime "^6.26.0"
 
 commondir@^1.0.1:
   version "1.0.1"
@@ -2259,7 +2296,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
-create-react-class@^15.5.2, create-react-class@^15.6.0:
+create-react-class@^15.5.2:
   version "15.6.2"
   resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.2.tgz#cf1ed15f12aad7f14ef5f2dfe05e6c42f91ef02a"
   dependencies:
@@ -2546,6 +2583,10 @@ detect-libc@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1"
 
+detect-newline@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+
 detective@^4.3.1:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1"
@@ -2584,12 +2625,26 @@ domain-browser@^1.1.1:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
 
+domexception@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0"
+
 dot-prop@^4.1.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
   dependencies:
     is-obj "^1.0.0"
 
+dotenv-webpack@^1.5.4:
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.5.4.tgz#9c92e46e412a1cfbc60217ed33d69d2bbfddbf9f"
+  dependencies:
+    dotenv "^4.0.0"
+
+dotenv@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d"
+
 duplexer3@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
@@ -2643,7 +2698,7 @@ enhanced-resolve@^3.3.0, enhanced-resolve@^3.4.0:
     object-assign "^4.0.1"
     tapable "^0.2.7"
 
-errno@^0.1.3, errno@^0.1.4:
+errno@^0.1.3:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
   dependencies:
@@ -2741,7 +2796,7 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
 
-escodegen@^1.6.1:
+escodegen@^1.9.0:
   version "1.9.0"
   resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852"
   dependencies:
@@ -2852,6 +2907,17 @@ expand-range@^1.8.1:
   dependencies:
     fill-range "^2.1.0"
 
+expect@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-21.3.0-beta.13.tgz#f408963fa392e32ba341b5996d63b6312f7e0b02"
+  dependencies:
+    ansi-styles "^3.2.0"
+    jest-diff "21.3.0-beta.13"
+    jest-get-type "21.3.0-beta.13"
+    jest-matcher-utils "21.3.0-beta.13"
+    jest-message-util "21.3.0-beta.13"
+    jest-regex-util "^21.2.0"
+
 express@^4.14.1, express@^4.16.2:
   version "4.16.2"
   resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c"
@@ -2921,12 +2987,6 @@ fastparse@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
 
-fb-watchman@^1.8.0:
-  version "1.9.2"
-  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383"
-  dependencies:
-    bser "1.0.2"
-
 fb-watchman@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
@@ -3107,6 +3167,13 @@ fsevents@^1.0.0:
     nan "^2.3.0"
     node-pre-gyp "^0.6.36"
 
+fsevents@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.39"
+
 fstream-ignore@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
@@ -3818,7 +3885,7 @@ isstream@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
 
-istanbul-api@^1.1.1:
+istanbul-api@^1.1.14:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620"
   dependencies:
@@ -3834,7 +3901,7 @@ istanbul-api@^1.1.1:
     mkdirp "^0.5.1"
     once "^1.4.0"
 
-istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1:
+istanbul-lib-coverage@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
 
@@ -3844,7 +3911,7 @@ istanbul-lib-hook@^1.1.0:
   dependencies:
     append-transform "^0.4.0"
 
-istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1:
+istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0, istanbul-lib-instrument@^1.9.1:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e"
   dependencies:
@@ -3865,7 +3932,7 @@ istanbul-lib-report@^1.1.2:
     path-parse "^1.0.5"
     supports-color "^3.1.2"
 
-istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.2:
+istanbul-lib-source-maps@^1.2.1, istanbul-lib-source-maps@^1.2.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c"
   dependencies:
@@ -3881,216 +3948,248 @@ istanbul-reports@^1.1.3:
   dependencies:
     handlebars "^4.0.3"
 
-jest-changed-files@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8"
+jest-changed-files@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.3.0-beta.13.tgz#e2c2dc8f1ff23949c4882de48b4266f969a8f6d2"
+  dependencies:
+    throat "^4.0.0"
 
-jest-cli@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93"
+jest-cli@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.3.0-beta.13.tgz#2f749dede3db00614f7ed4aedb31b3ae6156709d"
   dependencies:
-    ansi-escapes "^1.4.0"
-    callsites "^2.0.0"
-    chalk "^1.1.3"
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.1"
+    glob "^7.1.2"
     graceful-fs "^4.1.11"
     is-ci "^1.0.10"
-    istanbul-api "^1.1.1"
-    istanbul-lib-coverage "^1.0.1"
-    istanbul-lib-instrument "^1.4.2"
-    istanbul-lib-source-maps "^1.1.0"
-    jest-changed-files "^20.0.3"
-    jest-config "^20.0.4"
-    jest-docblock "^20.0.3"
-    jest-environment-jsdom "^20.0.3"
-    jest-haste-map "^20.0.4"
-    jest-jasmine2 "^20.0.4"
-    jest-message-util "^20.0.3"
-    jest-regex-util "^20.0.3"
-    jest-resolve-dependencies "^20.0.3"
-    jest-runtime "^20.0.4"
-    jest-snapshot "^20.0.3"
-    jest-util "^20.0.3"
+    istanbul-api "^1.1.14"
+    istanbul-lib-coverage "^1.1.1"
+    istanbul-lib-instrument "^1.8.0"
+    istanbul-lib-source-maps "^1.2.1"
+    jest-changed-files "21.3.0-beta.13"
+    jest-config "21.3.0-beta.13"
+    jest-environment-jsdom "21.3.0-beta.13"
+    jest-get-type "21.3.0-beta.13"
+    jest-haste-map "21.3.0-beta.13"
+    jest-message-util "21.3.0-beta.13"
+    jest-regex-util "^21.2.0"
+    jest-resolve-dependencies "^21.2.0"
+    jest-runner "21.3.0-beta.13"
+    jest-runtime "21.3.0-beta.13"
+    jest-snapshot "21.3.0-beta.13"
+    jest-util "21.3.0-beta.13"
+    jest-worker "21.3.0-beta.13"
     micromatch "^2.3.11"
-    node-notifier "^5.0.2"
-    pify "^2.3.0"
+    node-notifier "^5.1.2"
+    rimraf "^2.5.4"
     slash "^1.0.0"
-    string-length "^1.0.1"
-    throat "^3.0.0"
+    string-length "^2.0.0"
+    strip-ansi "^4.0.0"
     which "^1.2.12"
-    worker-farm "^1.3.1"
-    yargs "^7.0.2"
+    yargs "^10.0.3"
 
-jest-config@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea"
+jest-config@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.3.0-beta.13.tgz#eba1600b9c7e5b2a9f1acd3459970f68af55a788"
   dependencies:
-    chalk "^1.1.3"
+    chalk "^2.0.1"
     glob "^7.1.1"
-    jest-environment-jsdom "^20.0.3"
-    jest-environment-node "^20.0.3"
-    jest-jasmine2 "^20.0.4"
-    jest-matcher-utils "^20.0.3"
-    jest-regex-util "^20.0.3"
-    jest-resolve "^20.0.4"
-    jest-validate "^20.0.3"
-    pretty-format "^20.0.3"
-
-jest-diff@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617"
+    jest-environment-jsdom "21.3.0-beta.13"
+    jest-environment-node "21.3.0-beta.13"
+    jest-get-type "21.3.0-beta.13"
+    jest-jasmine2 "21.3.0-beta.13"
+    jest-regex-util "^21.2.0"
+    jest-resolve "21.3.0-beta.13"
+    jest-util "21.3.0-beta.13"
+    jest-validate "21.3.0-beta.13"
+    pretty-format "21.3.0-beta.13"
+
+jest-diff@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.3.0-beta.13.tgz#f881a4beda2080d15c5714ef6ee94e1d7766ca97"
   dependencies:
-    chalk "^1.1.3"
+    chalk "^2.0.1"
     diff "^3.2.0"
-    jest-matcher-utils "^20.0.3"
-    pretty-format "^20.0.3"
+    jest-get-type "21.3.0-beta.13"
+    pretty-format "21.3.0-beta.13"
 
-jest-docblock@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712"
+jest-docblock@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.3.0-beta.13.tgz#a6fc6534ee1cc73eb6c8693bc99b12135ab7cca4"
+  dependencies:
+    detect-newline "^2.1.0"
 
-jest-environment-jsdom@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99"
+jest-environment-jsdom@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.3.0-beta.13.tgz#3cdab59734f8b915f66c664708b8eeb7d7ea6099"
   dependencies:
-    jest-mock "^20.0.3"
-    jest-util "^20.0.3"
-    jsdom "^9.12.0"
+    jest-mock "21.3.0-beta.13"
+    jest-util "21.3.0-beta.13"
+    jsdom "^11.5.1"
 
-jest-environment-node@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403"
+jest-environment-node@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.3.0-beta.13.tgz#2b6f2431b5422f5475779d2f817d2ae64780c895"
   dependencies:
-    jest-mock "^20.0.3"
-    jest-util "^20.0.3"
+    jest-mock "21.3.0-beta.13"
+    jest-util "21.3.0-beta.13"
+
+jest-get-type@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.3.0-beta.13.tgz#87ded7850d76e152f0efd8cffc2f84720bdb33d4"
 
-jest-haste-map@^20.0.4:
-  version "20.0.5"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.5.tgz#abad74efb1a005974a7b6517e11010709cab9112"
+jest-haste-map@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.3.0-beta.13.tgz#4366ec58c0c2ad1b87800b81dbfd647a50c0ae54"
   dependencies:
     fb-watchman "^2.0.0"
     graceful-fs "^4.1.11"
-    jest-docblock "^20.0.3"
+    jest-docblock "21.3.0-beta.13"
+    jest-worker "21.3.0-beta.13"
     micromatch "^2.3.11"
-    sane "~1.6.0"
-    worker-farm "^1.3.1"
+    sane "^2.0.0"
 
-jest-jasmine2@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1"
+jest-jasmine2@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.3.0-beta.13.tgz#591f4672af248978d5d90da856000ab0f7ce67a8"
   dependencies:
-    chalk "^1.1.3"
+    callsites "^2.0.0"
+    chalk "^2.0.1"
+    expect "21.3.0-beta.13"
     graceful-fs "^4.1.11"
-    jest-diff "^20.0.3"
-    jest-matcher-utils "^20.0.3"
-    jest-matchers "^20.0.3"
-    jest-message-util "^20.0.3"
-    jest-snapshot "^20.0.3"
-    once "^1.4.0"
-    p-map "^1.1.1"
-
-jest-matcher-utils@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612"
-  dependencies:
-    chalk "^1.1.3"
-    pretty-format "^20.0.3"
+    jest-diff "21.3.0-beta.13"
+    jest-matcher-utils "21.3.0-beta.13"
+    jest-message-util "21.3.0-beta.13"
+    jest-snapshot "21.3.0-beta.13"
+    p-cancelable "^0.3.0"
+    source-map-support "^0.5.0"
+
+jest-leak-detector@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-21.3.0-beta.13.tgz#05301ba87d9233eb2f7bb79e32e4d6050e1d17cd"
+  dependencies:
+    pretty-format "21.3.0-beta.13"
+  optionalDependencies:
+    weak "^1.0.1"
 
-jest-matchers@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60"
+jest-matcher-utils@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.3.0-beta.13.tgz#1ba5c4c74156711799aabb48a71ea2b144776278"
   dependencies:
-    jest-diff "^20.0.3"
-    jest-matcher-utils "^20.0.3"
-    jest-message-util "^20.0.3"
-    jest-regex-util "^20.0.3"
+    chalk "^2.0.1"
+    jest-get-type "21.3.0-beta.13"
+    pretty-format "21.3.0-beta.13"
 
-jest-message-util@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c"
+jest-message-util@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.3.0-beta.13.tgz#ac6411e61e72883b88fc70a2c97b6d889a843798"
   dependencies:
-    chalk "^1.1.3"
+    chalk "^2.0.1"
     micromatch "^2.3.11"
     slash "^1.0.0"
+    stack-utils "^1.0.1"
 
-jest-mock@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59"
+jest-mock@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.3.0-beta.13.tgz#317fac650c05a4096ad20b5de81b98bdc2ae1de2"
 
-jest-regex-util@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762"
+jest-regex-util@^21.2.0:
+  version "21.2.0"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530"
 
-jest-resolve-dependencies@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a"
+jest-resolve-dependencies@^21.2.0:
+  version "21.2.0"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09"
   dependencies:
-    jest-regex-util "^20.0.3"
+    jest-regex-util "^21.2.0"
 
-jest-resolve@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5"
+jest-resolve@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.3.0-beta.13.tgz#6ca6e91f53b44d4a93b926b2dd9da75b2d1d094d"
   dependencies:
     browser-resolve "^1.11.2"
-    is-builtin-module "^1.0.0"
-    resolve "^1.3.2"
+    chalk "^2.0.1"
 
-jest-runtime@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8"
+jest-runner@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.3.0-beta.13.tgz#39795dc956630208fbbbb50a2b34a5596dba290a"
+  dependencies:
+    jest-config "21.3.0-beta.13"
+    jest-docblock "21.3.0-beta.13"
+    jest-haste-map "21.3.0-beta.13"
+    jest-jasmine2 "21.3.0-beta.13"
+    jest-leak-detector "21.3.0-beta.13"
+    jest-message-util "21.3.0-beta.13"
+    jest-runtime "21.3.0-beta.13"
+    jest-util "21.3.0-beta.13"
+    jest-worker "21.3.0-beta.13"
+    throat "^4.0.0"
+
+jest-runtime@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.3.0-beta.13.tgz#d95dc523073bbd9caf477542c9c0a60c15cd0f5a"
   dependencies:
     babel-core "^6.0.0"
-    babel-jest "^20.0.3"
-    babel-plugin-istanbul "^4.0.0"
-    chalk "^1.1.3"
+    babel-jest "21.3.0-beta.13"
+    babel-plugin-istanbul "^4.1.5"
+    chalk "^2.0.1"
     convert-source-map "^1.4.0"
     graceful-fs "^4.1.11"
-    jest-config "^20.0.4"
-    jest-haste-map "^20.0.4"
-    jest-regex-util "^20.0.3"
-    jest-resolve "^20.0.4"
-    jest-util "^20.0.3"
+    jest-config "21.3.0-beta.13"
+    jest-haste-map "21.3.0-beta.13"
+    jest-regex-util "^21.2.0"
+    jest-resolve "21.3.0-beta.13"
+    jest-util "21.3.0-beta.13"
     json-stable-stringify "^1.0.1"
     micromatch "^2.3.11"
+    slash "^1.0.0"
     strip-bom "3.0.0"
-    yargs "^7.0.2"
+    write-file-atomic "^2.1.0"
+    yargs "^10.0.3"
 
-jest-snapshot@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566"
+jest-snapshot@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.3.0-beta.13.tgz#f9a7d89faae4c6214a30be7f2f3491afa2df9d27"
   dependencies:
-    chalk "^1.1.3"
-    jest-diff "^20.0.3"
-    jest-matcher-utils "^20.0.3"
-    jest-util "^20.0.3"
+    chalk "^2.0.1"
+    jest-diff "21.3.0-beta.13"
+    jest-matcher-utils "21.3.0-beta.13"
+    mkdirp "^0.5.1"
     natural-compare "^1.4.0"
-    pretty-format "^20.0.3"
+    pretty-format "21.3.0-beta.13"
 
-jest-util@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad"
+jest-util@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.3.0-beta.13.tgz#69e8c44b0b8b3f7b87fbecd739152c222253add4"
   dependencies:
-    chalk "^1.1.3"
+    callsites "^2.0.0"
+    chalk "^2.0.1"
     graceful-fs "^4.1.11"
-    jest-message-util "^20.0.3"
-    jest-mock "^20.0.3"
-    jest-validate "^20.0.3"
-    leven "^2.1.0"
+    jest-message-util "21.3.0-beta.13"
+    jest-validate "21.3.0-beta.13"
     mkdirp "^0.5.1"
 
-jest-validate@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab"
+jest-validate@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.3.0-beta.13.tgz#bf52e35dd2d530e9bb028c87b2d1828d4348b837"
   dependencies:
-    chalk "^1.1.3"
-    jest-matcher-utils "^20.0.3"
+    chalk "^2.0.1"
+    jest-get-type "21.3.0-beta.13"
     leven "^2.1.0"
-    pretty-format "^20.0.3"
+    pretty-format "21.3.0-beta.13"
 
-jest@^20.0.4:
-  version "20.0.4"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac"
+jest-worker@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-21.3.0-beta.13.tgz#17c467b8e9711cf50240e3dfdc5bbaf2d2125100"
   dependencies:
-    jest-cli "^20.0.4"
+    merge-stream "^1.0.1"
+
+jest@^21.3.0-beta.2:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-21.3.0-beta.13.tgz#19a100f24f2193e685b2a1abe92df496e1d1152c"
+  dependencies:
+    jest-cli "21.3.0-beta.13"
 
 js-base64@^2.1.8, js-base64@^2.1.9:
   version "2.3.2"
@@ -4143,28 +4242,33 @@ jscodeshift@^0.3.30:
     temp "^0.8.1"
     write-file-atomic "^1.2.0"
 
-jsdom@^9.12.0:
-  version "9.12.0"
-  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
+jsdom@^11.5.1:
+  version "11.5.1"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.5.1.tgz#5df753b8d0bca20142ce21f4f6c039f99a992929"
   dependencies:
     abab "^1.0.3"
-    acorn "^4.0.4"
-    acorn-globals "^3.1.0"
+    acorn "^5.1.2"
+    acorn-globals "^4.0.0"
     array-equal "^1.0.0"
+    browser-process-hrtime "^0.1.2"
     content-type-parser "^1.0.1"
     cssom ">= 0.3.2 < 0.4.0"
     cssstyle ">= 0.2.37 < 0.3.0"
-    escodegen "^1.6.1"
+    domexception "^1.0.0"
+    escodegen "^1.9.0"
     html-encoding-sniffer "^1.0.1"
-    nwmatcher ">= 1.3.9 < 2.0.0"
-    parse5 "^1.5.1"
-    request "^2.79.0"
+    left-pad "^1.2.0"
+    nwmatcher "^1.4.3"
+    parse5 "^3.0.2"
+    pn "^1.0.0"
+    request "^2.83.0"
+    request-promise-native "^1.0.3"
     sax "^1.2.1"
     symbol-tree "^3.2.1"
-    tough-cookie "^2.3.2"
-    webidl-conversions "^4.0.0"
+    tough-cookie "^2.3.3"
+    webidl-conversions "^4.0.2"
     whatwg-encoding "^1.0.1"
-    whatwg-url "^4.3.0"
+    whatwg-url "^6.3.0"
     xml-name-validator "^2.0.1"
 
 jsesc@^1.3.0:
@@ -4260,6 +4364,10 @@ lcid@^1.0.0:
   dependencies:
     invert-kv "^1.0.0"
 
+left-pad@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee"
+
 leven@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3"
@@ -4514,6 +4622,12 @@ merge-dirs@^0.2.1:
     node-fs "~0.1.7"
     path "^0.12.7"
 
+merge-stream@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1"
+  dependencies:
+    readable-stream "^2.0.1"
+
 merge@^1.1.3:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
@@ -4557,10 +4671,14 @@ mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17,
   dependencies:
     mime-db "~1.30.0"
 
-mime@1.4.1, mime@^1.3.4, mime@^1.4.1:
+mime@1.4.1, mime@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
 
+mime@^1.5.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+
 mimic-fn@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18"
@@ -4628,6 +4746,10 @@ mute-stream@0.0.5:
   version "0.0.5"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
 
+nan@^2.0.5:
+  version "2.8.0"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a"
+
 nan@^2.3.0, nan@^2.3.2:
   version "2.7.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46"
@@ -4711,7 +4833,7 @@ node-libs-browser@^2.0.0:
     util "^0.10.3"
     vm-browserify "0.0.4"
 
-node-notifier@^5.0.2:
+node-notifier@^5.1.2:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.1.2.tgz#2fa9e12605fa10009d44549d6fcd8a63dde0e4ff"
   dependencies:
@@ -4720,7 +4842,7 @@ node-notifier@^5.0.2:
     shellwords "^0.1.0"
     which "^1.2.12"
 
-node-pre-gyp@^0.6.36:
+node-pre-gyp@^0.6.36, node-pre-gyp@^0.6.39:
   version "0.6.39"
   resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649"
   dependencies:
@@ -4834,7 +4956,7 @@ number-is-nan@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
 
-"nwmatcher@>= 1.3.9 < 2.0.0":
+nwmatcher@^1.4.3:
   version "1.4.3"
   resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c"
 
@@ -4961,6 +5083,10 @@ output-file-sync@^1.1.0, output-file-sync@^1.1.2:
     mkdirp "^0.5.1"
     object-assign "^4.1.0"
 
+p-cancelable@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+
 p-finally@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
@@ -4975,10 +5101,6 @@ p-locate@^2.0.0:
   dependencies:
     p-limit "^1.1.0"
 
-p-map@^1.1.1:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
-
 package-json@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
@@ -5017,9 +5139,11 @@ parse-json@^2.2.0:
   dependencies:
     error-ex "^1.2.0"
 
-parse5@^1.5.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
+parse5@^3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c"
+  dependencies:
+    "@types/node" "*"
 
 parseurl@~1.3.2:
   version "1.3.2"
@@ -5102,7 +5226,7 @@ performance-now@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
 
-pify@^2.0.0, pify@^2.3.0:
+pify@^2.0.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
 
@@ -5132,6 +5256,10 @@ pkg-dir@^2.0.0:
   dependencies:
     find-up "^2.1.0"
 
+pn@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/pn/-/pn-1.0.0.tgz#1cf5a30b0d806cd18f88fc41a6b5d4ad615b3ba9"
+
 podda@^1.2.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/podda/-/podda-1.2.2.tgz#15b0edbd334ade145813343f5ecf9c10a71cf500"
@@ -5238,9 +5366,9 @@ postcss-loader@^1.3.3:
     postcss "^5.2.15"
     postcss-load-config "^1.2.0"
 
-postcss-loader@^2.0.8:
-  version "2.0.8"
-  resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.0.8.tgz#8c67ddb029407dfafe684a406cfc16bad2ce0814"
+postcss-loader@^2.0.9:
+  version "2.0.9"
+  resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.0.9.tgz#001fdf7bfeeb159405ee61d1bb8e59b528dbd309"
   dependencies:
     loader-utils "^1.1.0"
     postcss "^6.0.0"
@@ -5444,12 +5572,12 @@ preserve@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
 
-pretty-format@^20.0.3:
-  version "20.0.3"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14"
+pretty-format@21.3.0-beta.13:
+  version "21.3.0-beta.13"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.3.0-beta.13.tgz#e67a45a517de01a119ddb02804cd7232efea34af"
   dependencies:
-    ansi-regex "^2.1.1"
-    ansi-styles "^3.0.0"
+    ansi-regex "^3.0.0"
+    ansi-styles "^3.2.0"
 
 private@^0.1.6, private@^0.1.7, private@~0.1.5:
   version "0.1.8"
@@ -5526,6 +5654,10 @@ punycode@^1.2.4, punycode@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
 
+punycode@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d"
+
 q@^1.1.2:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
@@ -5635,14 +5767,14 @@ react-docgen@^2.15.0:
     node-dir "^0.1.10"
     recast "^0.12.6"
 
-react-dom@^15.0.0:
-  version "15.6.2"
-  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730"
+react-dom@^16.2.0:
+  version "16.2.0"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044"
   dependencies:
-    fbjs "^0.8.9"
+    fbjs "^0.8.16"
     loose-envify "^1.1.0"
-    object-assign "^4.1.0"
-    prop-types "^15.5.10"
+    object-assign "^4.1.1"
+    prop-types "^15.6.0"
 
 react-html-attributes@^1.3.0:
   version "1.4.1"
@@ -5667,12 +5799,13 @@ react-inspector@^2.2.1:
     babel-runtime "^6.26.0"
     is-dom "^1.0.9"
 
-react-modal@^3.1.2:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.1.2.tgz#6e1fd656315d6fc62a1edda2b5aecc9752ac6bca"
+react-modal@^3.1.4:
+  version "3.1.7"
+  resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.1.7.tgz#21feb937c95cd722bf2d375cada751fdc8189c0e"
   dependencies:
     exenv "^1.2.0"
     prop-types "^15.5.10"
+    warning "^3.0.0"
 
 react-observed@^1.0.0-beta.2:
   version "1.0.0-beta.2"
@@ -5698,12 +5831,13 @@ react-style-proptype@^3.0.0:
   dependencies:
     prop-types "^15.5.4"
 
-react-test-renderer@^15.6.1:
-  version "15.6.2"
-  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-15.6.2.tgz#d0333434fc2c438092696ca770da5ed48037efa8"
+react-test-renderer@^16.2.0:
+  version "16.2.0"
+  resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.2.0.tgz#bddf259a6b8fcd8555f012afc8eacc238872a211"
   dependencies:
-    fbjs "^0.8.9"
-    object-assign "^4.1.0"
+    fbjs "^0.8.16"
+    object-assign "^4.1.1"
+    prop-types "^15.6.0"
 
 react-textarea-autosize@^5.2.1:
   version "5.2.1"
@@ -5732,15 +5866,14 @@ react-treebeard@^2.0.3:
     shallowequal "^0.2.2"
     velocity-react "^1.3.1"
 
-react@^15.0.0:
-  version "15.6.2"
-  resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72"
+react@^16.2.0:
+  version "16.2.0"
+  resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"
   dependencies:
-    create-react-class "^15.6.0"
-    fbjs "^0.8.9"
+    fbjs "^0.8.16"
     loose-envify "^1.1.0"
-    object-assign "^4.1.0"
-    prop-types "^15.5.10"
+    object-assign "^4.1.1"
+    prop-types "^15.6.0"
 
 reactcss@^1.2.0:
   version "1.2.3"
@@ -5990,6 +6123,20 @@ repeating@^2.0.0:
   dependencies:
     is-finite "^1.0.0"
 
+request-promise-core@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6"
+  dependencies:
+    lodash "^4.13.1"
+
+request-promise-native@^1.0.3:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5"
+  dependencies:
+    request-promise-core "1.1.1"
+    stealthy-require "^1.1.0"
+    tough-cookie ">=2.3.3"
+
 request@2, request@^2.79.0, request@^2.83.0:
   version "2.83.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356"
@@ -6060,7 +6207,7 @@ resolve@1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
 
-resolve@^1.1.6, resolve@^1.2.0, resolve@^1.3.2:
+resolve@^1.1.6, resolve@^1.2.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36"
   dependencies:
@@ -6079,7 +6226,7 @@ right-align@^0.1.1:
   dependencies:
     align-text "^0.1.1"
 
-rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1:
+rimraf@2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1:
   version "2.6.2"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
   dependencies:
@@ -6110,17 +6257,19 @@ safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
 
-sane@~1.6.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775"
+sane@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56"
   dependencies:
     anymatch "^1.3.0"
     exec-sh "^0.2.0"
-    fb-watchman "^1.8.0"
+    fb-watchman "^2.0.0"
     minimatch "^3.0.2"
     minimist "^1.1.1"
     walker "~1.0.5"
-    watch "~0.10.0"
+    watch "~0.18.0"
+  optionalDependencies:
+    fsevents "^1.1.1"
 
 sass-graph@^2.2.4:
   version "2.2.4"
@@ -6327,6 +6476,12 @@ source-map-support@^0.4.15:
   dependencies:
     source-map "^0.5.6"
 
+source-map-support@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.0.tgz#2018a7ad2bdf8faf2691e5fddab26bed5a2bacab"
+  dependencies:
+    source-map "^0.6.0"
+
 source-map@0.1.32:
   version "0.1.32"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266"
@@ -6343,7 +6498,7 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.0, sour
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
 
-source-map@^0.6.1, source-map@~0.6.1:
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
 
@@ -6383,6 +6538,10 @@ stable@~0.1.3:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10"
 
+stack-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
+
 "statuses@>= 1.3.1 < 2":
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
@@ -6397,6 +6556,10 @@ stdout-stream@^1.4.0:
   dependencies:
     readable-stream "^2.0.1"
 
+stealthy-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+
 stream-browserify@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
@@ -6418,11 +6581,12 @@ strict-uri-encode@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
 
-string-length@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac"
+string-length@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
   dependencies:
-    strip-ansi "^3.0.0"
+    astral-regex "^1.0.0"
+    strip-ansi "^4.0.0"
 
 string-width@^1.0.1, string-width@^1.0.2:
   version "1.0.2"
@@ -6618,9 +6782,9 @@ test-exclude@^4.1.1:
     read-pkg-up "^1.0.1"
     require-main-filename "^1.0.1"
 
-throat@^3.0.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836"
+throat@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
 
 through@^2.3.6, through@^2.3.8, through@~2.3.8:
   version "2.3.8"
@@ -6656,15 +6820,17 @@ to-fast-properties@^1.0.0, to-fast-properties@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
 
-tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
+tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3:
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561"
   dependencies:
     punycode "^1.4.1"
 
-tr46@~0.0.3:
-  version "0.0.3"
-  resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+tr46@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  dependencies:
+    punycode "^2.1.0"
 
 trim-newlines@^1.0.0:
   version "1.0.0"
@@ -6887,9 +7053,12 @@ warning@^3.0.0:
   dependencies:
     loose-envify "^1.0.0"
 
-watch@~0.10.0:
-  version "0.10.0"
-  resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc"
+watch@~0.18.0:
+  version "0.18.0"
+  resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"
+  dependencies:
+    exec-sh "^0.2.0"
+    minimist "^1.2.0"
 
 watchpack@^1.3.1, watchpack@^1.4.0:
   version "1.4.0"
@@ -6899,27 +7068,30 @@ watchpack@^1.3.1, watchpack@^1.4.0:
     chokidar "^1.7.0"
     graceful-fs "^4.1.2"
 
-webidl-conversions@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+weak@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/weak/-/weak-1.0.1.tgz#ab99aab30706959aa0200cb8cf545bb9cb33b99e"
+  dependencies:
+    bindings "^1.2.1"
+    nan "^2.0.5"
 
-webidl-conversions@^4.0.0:
+webidl-conversions@^4.0.1, webidl-conversions@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
 
-webpack-dev-middleware@^1.12.0:
-  version "1.12.0"
-  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709"
+webpack-dev-middleware@^1.12.2:
+  version "1.12.2"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e"
   dependencies:
     memory-fs "~0.4.1"
-    mime "^1.3.4"
+    mime "^1.5.0"
     path-is-absolute "^1.0.0"
     range-parser "^1.0.3"
     time-stamp "^2.0.0"
 
-webpack-hot-middleware@^2.20.0:
-  version "2.20.0"
-  resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.20.0.tgz#cb896d837758b6408fe0afeeafdc0e5316b15319"
+webpack-hot-middleware@^2.21.0:
+  version "2.21.0"
+  resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.21.0.tgz#7b3c113a7a4b301c91e0749573c7aab28b414b52"
   dependencies:
     ansi-html "0.0.7"
     html-entities "^1.2.0"
@@ -7006,12 +7178,13 @@ whatwg-fetch@>=0.10.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
 
-whatwg-url@^4.3.0:
-  version "4.8.0"
-  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0"
+whatwg-url@^6.3.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08"
   dependencies:
-    tr46 "~0.0.3"
-    webidl-conversions "^3.0.0"
+    lodash.sortby "^4.7.0"
+    tr46 "^1.0.0"
+    webidl-conversions "^4.0.1"
 
 whet.extend@~0.9.9:
   version "0.9.9"
@@ -7063,13 +7236,6 @@ wordwrap@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
 
-worker-farm@^1.3.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.1.tgz#8e9f4a7da4f3c595aa600903051b969390423fa1"
-  dependencies:
-    errno "^0.1.4"
-    xtend "^4.0.1"
-
 wrap-ansi@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
@@ -7089,7 +7255,7 @@ write-file-atomic@^1.2.0:
     imurmurhash "^0.1.4"
     slide "^1.1.5"
 
-write-file-atomic@^2.0.0:
+write-file-atomic@^2.0.0, write-file-atomic@^2.1.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
   dependencies:
@@ -7105,7 +7271,7 @@ xml-name-validator@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
 
-xtend@^4.0.0, xtend@^4.0.1:
+xtend@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
 
@@ -7135,6 +7301,29 @@ yargs-parser@^7.0.0:
   dependencies:
     camelcase "^4.1.0"
 
+yargs-parser@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.0.0.tgz#21d476330e5a82279a4b881345bf066102e219c6"
+  dependencies:
+    camelcase "^4.1.0"
+
+yargs@^10.0.3:
+  version "10.0.3"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae"
+  dependencies:
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    find-up "^2.1.0"
+    get-caller-file "^1.0.1"
+    os-locale "^2.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^8.0.0"
+
 yargs@^6.0.0:
   version "6.6.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
@@ -7153,7 +7342,7 @@ yargs@^6.0.0:
     y18n "^3.2.1"
     yargs-parser "^4.2.0"
 
-yargs@^7.0.0, yargs@^7.0.2:
+yargs@^7.0.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
   dependencies:

From f33705f3ad5b3c404086097440f8fb23d2873b99 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 19:24:12 -0800
Subject: [PATCH 132/158] remove border style

---
 src/utils/createBoundsStyle.js | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/src/utils/createBoundsStyle.js b/src/utils/createBoundsStyle.js
index 0021fe575..17fe89d32 100644
--- a/src/utils/createBoundsStyle.js
+++ b/src/utils/createBoundsStyle.js
@@ -4,9 +4,6 @@ export default function createBoundsStyle(x, y, scale, el) {
     // It takes the x, y, and scale props then resizes
     // provides the styles to create the bounds.
 
-    // NOTE: Temporary border added to debug
-    const border = '1px dotted tomato';
-
     // for percents and scale
     let height = 0;
     let width = 0;
@@ -69,7 +66,6 @@ export default function createBoundsStyle(x, y, scale, el) {
         paddingBottom: bounds.mb * -1,
         paddingLeft: bounds.ml * -1,
         paddingRight: bounds.mr * -1,
-        border,
     };
 }
 

From e633061b0919a34e1d1b8324c9d6b9e5bf167efb Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 20:32:55 -0800
Subject: [PATCH 133/158] correct progress value

---
 src/components/ViewportProgress.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/components/ViewportProgress.js b/src/components/ViewportProgress.js
index 402b09102..d19da011f 100644
--- a/src/components/ViewportProgress.js
+++ b/src/components/ViewportProgress.js
@@ -112,7 +112,7 @@ class ViewportProgress extends Component {
         const { range } = this.props;
 
         // Percent the element has moved based on current and total distance to move
-        let progress = 1 - (windowHeight - top) / totalDist;
+        let progress = (windowHeight - top) / totalDist;
 
         // NOTE: Clamping because the isInView prop may be *slightly*
         // off since Intersection Observer is not expected to be

From 03b263c2e4ea625995e5665c57a9f37dad2d6d8f Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 20:50:21 -0800
Subject: [PATCH 134/158] add Portal component

---
 example/components/Portal/Portal.js | 8 ++++++++
 example/components/index.js         | 1 +
 2 files changed, 9 insertions(+)
 create mode 100644 example/components/Portal/Portal.js

diff --git a/example/components/Portal/Portal.js b/example/components/Portal/Portal.js
new file mode 100644
index 000000000..a10edf217
--- /dev/null
+++ b/example/components/Portal/Portal.js
@@ -0,0 +1,8 @@
+import React, { Component } from 'react';
+import ReactDOM from 'react-dom';
+
+export default class Portal extends Component {
+    render() {
+        return ReactDOM.createPortal(this.props.children, this.props.domNode);
+    }
+}
diff --git a/example/components/index.js b/example/components/index.js
index 44e83eac9..c4e3d4e0c 100644
--- a/example/components/index.js
+++ b/example/components/index.js
@@ -1,3 +1,4 @@
 export ParallaxTest from './ParallaxTest/ParallaxTest.js';
 export Element from './Element/Element.js';
+export Portal from './Portal/Portal.js';
 export App from './App/App.js';

From dc91a37f889ebd53c99e55cf124a2cefe0dc0d5a Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 20:50:59 -0800
Subject: [PATCH 135/158] add stories for visibility and progress

---
 example/components/Element/Element.js         |  3 +-
 example/components/Element/Element.scss       |  9 +-
 .../components/ParallaxTest/ParallaxTest.js   |  2 +-
 stories/Parallax.stories.js                   | 91 ++++++++++++++++---
 stories/styles.scss                           | 19 +++-
 5 files changed, 99 insertions(+), 25 deletions(-)

diff --git a/example/components/Element/Element.js b/example/components/Element/Element.js
index 31cc6f1ce..2b32a03d7 100644
--- a/example/components/Element/Element.js
+++ b/example/components/Element/Element.js
@@ -5,7 +5,8 @@ export default function Element(props) {
     return (
         <div className={styles.ratio}>
             <div className={styles.inner}>
-                <div className={styles.box}>{props.index}</div>
+                <div className={styles.box}>{props.name}</div>
+                {props.children}
             </div>
         </div>
     );
diff --git a/example/components/Element/Element.scss b/example/components/Element/Element.scss
index 3b61306f9..2ba6ee99b 100644
--- a/example/components/Element/Element.scss
+++ b/example/components/Element/Element.scss
@@ -4,14 +4,7 @@
     width: 100%;
     height: 0;
     padding-top: 100%;
-    background: tomato;
-    // border: 1px solid lightgreen;
-}
-
-.is-in-view {
-    :local(.ratio) {
-        background: slateblue;
-    }
+    background: slateblue;
 }
 
 :local(.inner) {
diff --git a/example/components/ParallaxTest/ParallaxTest.js b/example/components/ParallaxTest/ParallaxTest.js
index f023b149c..84fb0fd19 100644
--- a/example/components/ParallaxTest/ParallaxTest.js
+++ b/example/components/ParallaxTest/ParallaxTest.js
@@ -58,7 +58,7 @@ export default class ParallaxTest extends Component {
 
             return (
                 <Parallax key={i} className={style.item} {...props}>
-                    <Element index={i} />
+                    <Element name={i} />
                 </Parallax>
             );
         });
diff --git a/stories/Parallax.stories.js b/stories/Parallax.stories.js
index 6a62bd394..a02f7c461 100644
--- a/stories/Parallax.stories.js
+++ b/stories/Parallax.stories.js
@@ -11,7 +11,7 @@ import {
 
 import React from 'react';
 import { ParallaxProvider, Parallax } from '../src/components';
-import { Element } from '../example/components';
+import { Element, Portal } from '../example/components';
 import styles from './styles.scss';
 import 'intersection-observer';
 
@@ -19,8 +19,11 @@ const stories = storiesOf('<Parallax>', module);
 
 // Decorate all stories with ParallaxProvider and center styles
 const CenterDecorator = storyFn => (
-    <div className="center elements">
-        <ParallaxProvider>{storyFn()}</ParallaxProvider>
+    <div>
+        <div id="portal" className={styles.portal} />
+        <div className="center elements">
+            <ParallaxProvider>{storyFn()}</ParallaxProvider>
+        </div>
     </div>
 );
 addDecorator(CenterDecorator);
@@ -38,7 +41,7 @@ stories
             // scale={[0, 1]}
             // opacity={[0.5, 1]}
         >
-            <Element index="A" />
+            <Element name="A" />
         </Parallax>
     ))
     .add('with y offset props', () => {
@@ -51,10 +54,10 @@ stories
         return (
             <div className="elements">
                 <Parallax className={styles.parallax} y={y1}>
-                    <Element index="A" />
+                    <Element name="A" />
                 </Parallax>
                 <Parallax className={styles.parallax} y={y2}>
-                    <Element index="B" />
+                    <Element name="B" />
                 </Parallax>
             </div>
         );
@@ -69,10 +72,10 @@ stories
         return (
             <div className="elements">
                 <Parallax className={styles.parallax} x={x1}>
-                    <Element index="A" />
+                    <Element name="A" />
                 </Parallax>
                 <Parallax className={styles.parallax} x={x2}>
-                    <Element index="B" />
+                    <Element name="B" />
                 </Parallax>
             </div>
         );
@@ -87,10 +90,10 @@ stories
         return (
             <div className="elements">
                 <Parallax className={styles.parallax} scale={scale1}>
-                    <Element index="A" />
+                    <Element name="A" />
                 </Parallax>
                 <Parallax className={styles.parallax} scale={scale2}>
-                    <Element index="B" />
+                    <Element name="B" />
                 </Parallax>
             </div>
         );
@@ -105,10 +108,10 @@ stories
         return (
             <div className="elements">
                 <Parallax className={styles.parallax} opacity={opacity1}>
-                    <Element index="A" />
+                    <Element name="A" />
                 </Parallax>
                 <Parallax className={styles.parallax} opacity={opacity2}>
-                    <Element index="B" />
+                    <Element name="B" />
                 </Parallax>
             </div>
         );
@@ -132,10 +135,72 @@ stories
 
                     return (
                         <Parallax key={i} className={styles.small} {...props}>
-                            <Element index={i} />
+                            <Element name={i} />
                         </Parallax>
                     );
                 })}
             </div>
         );
+    })
+    .add('with viewport progress', () => {
+        const offset = number('Offset %', 100);
+        const domNode = document.getElementById('portal');
+
+        // wait for the portal container to be rendered by the decorator...
+        if (!domNode) return null;
+
+        const elements = [
+            { name: 'A', props: { y: [-offset + '%', offset + '%'] } },
+            { name: 'B', props: { x: [offset + '%', -offset + '%'] } },
+        ];
+
+        return (
+            <div className="elements">
+                {elements.map(({ name, props }, i) => (
+                    <Parallax key={name} className={styles.parallax} {...props}>
+                        {({ progress }) => (
+                            <Element name={name}>
+                                <Portal domNode={domNode}>
+                                    <div className={styles.progress}>
+                                        <strong>Progress {name}:</strong>{' '}
+                                        {progress}
+                                    </div>
+                                </Portal>
+                            </Element>
+                        )}
+                    </Parallax>
+                ))}
+            </div>
+        );
+    })
+    .add('with viewport visibility', () => {
+        const offset = number('Offset %', 100);
+        const domNode = document.getElementById('portal');
+
+        // wait for the portal container to be rendered by the decorator...
+        if (!domNode) return null;
+
+        const elements = [
+            { name: 'A', props: { y: [-offset + '%', offset + '%'] } },
+            { name: 'B', props: { x: [offset + '%', -offset + '%'] } },
+        ];
+
+        return (
+            <div className="elements">
+                {elements.map(({ name, props }, i) => (
+                    <Parallax key={name} className={styles.parallax} {...props}>
+                        {({ isInView }) => (
+                            <Element name={name}>
+                                <Portal domNode={domNode}>
+                                    <div className={styles.progress}>
+                                        <strong>Visibility {name}:</strong>{' '}
+                                        {isInView ? 'true' : 'false'}
+                                    </div>
+                                </Portal>
+                            </Element>
+                        )}
+                    </Parallax>
+                ))}
+            </div>
+        );
     });
diff --git a/stories/styles.scss b/stories/styles.scss
index d1f530fd2..ffbdaee8e 100644
--- a/stories/styles.scss
+++ b/stories/styles.scss
@@ -61,11 +61,26 @@ body {
 }
 
 :local(.parallax) {
-    margin: 10% 10%;
+    margin: 6rem;
     width: 200px;
 }
 
 :local(.small) {
-    margin: 10% 10%;
+    margin: 6rem;
     width: 10%;
 }
+
+:local(.portal) {
+    position: fixed;
+    bottom: 2rem;
+    left: 2rem;
+    right: 2rem;
+    color: black;
+    z-index: 100;
+    border-radius: 3px;
+    background-color: rgba(#eee, 0.8);
+
+    > * {
+        margin: 0.5rem;
+    }
+}

From 9ddde875a25a56e4f8ecbdbdcaf1b1a596aa548c Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 20:54:18 -0800
Subject: [PATCH 136/158] update readme

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 0fb877225..23a24cc19 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,7 @@ The following are supported effects
 
 ## Install
 
-Currently a prerelease. For a stable version of this library [use v1](https://github.com/jscottsmith/react-scroll-parallax).
+**Warning:** This is currently a prerelease. For a stable version of this library [use v1](https://github.com/jscottsmith/react-scroll-parallax).
 
 ```
 npm i react-scroll-parallax@next --save

From 18f165eb8cd86b33735b593c564f7de092911430 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 21:00:32 -0800
Subject: [PATCH 137/158] add Parallax render callback to readme

---
 README.md | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index 23a24cc19..cf21170a3 100644
--- a/README.md
+++ b/README.md
@@ -98,10 +98,17 @@ For effect props such as `x`, `y`, `scale`, and `opacity` an `Array` with two el
 |**className**         |`String`|`class` to be applied to the outermost `<div>`.
 |**observerOptions**   |`Object`|[options](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) given to the Intersection Observer contructor.
 
+### <Parallax> Render Callback
 
+You can access the `progress` and `isInView` properties from a render callback. Here's an example:
 
-
-
-
-
-
+```jsx
+<Parallax>
+    {({ isInView, progress }) => (
+        <div>
+            <div>Progress: {progress}</div>
+            <div>{isInView ? "I'm visibile" : "Can't see me" }</div>
+        </div>
+    )}
+</Parallax>
+```

From 5ab80f56b3cd5d8959f2af43b2f097f3244a06af Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 21:04:15 -0800
Subject: [PATCH 138/158] escape characters

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index cf21170a3..175828ae6 100644
--- a/README.md
+++ b/README.md
@@ -83,7 +83,7 @@ import { Parallax } from 'react-scroll-parallax';
 </Parallax>
 ```
 
-### <Parallax> Props
+### \<Parallax> Props
 
 The following are all props that can be passed to the React `<Parallax />` component. 
 
@@ -98,7 +98,7 @@ For effect props such as `x`, `y`, `scale`, and `opacity` an `Array` with two el
 |**className**         |`String`|`class` to be applied to the outermost `<div>`.
 |**observerOptions**   |`Object`|[options](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) given to the Intersection Observer contructor.
 
-### <Parallax> Render Callback
+### \<Parallax> Render Callback
 
 You can access the `progress` and `isInView` properties from a render callback. Here's an example:
 

From 7cc59c5d8e3804f55fc33b4b08711e3971f621d8 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 23:03:46 -0800
Subject: [PATCH 139/158] fix ViewportProgress test

---
 __tests__/ViewportProgress.test.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/__tests__/ViewportProgress.test.js b/__tests__/ViewportProgress.test.js
index d4a8b5a02..48286631d 100644
--- a/__tests__/ViewportProgress.test.js
+++ b/__tests__/ViewportProgress.test.js
@@ -68,7 +68,7 @@ describe('Expect a <ViewportProgress> component', () => {
             node
         );
         expect(testObject).toMatchObject({
-            progress: 0,
+            progress: expect.any(Number),
             mapRef: expect.any(Function),
         });
     });

From e7e3cf6840786f48a03b102f4eb26bba7ada791e Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 23:15:42 -0800
Subject: [PATCH 140/158] add build status

---
 README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/README.md b/README.md
index 175828ae6..3c9a918d8 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 # React Scroll Parallax v2
 
+[![Build Status](https://travis-ci.org/jscottsmith/react-scroll-parallax.svg?branch=v2)](https://travis-ci.org/jscottsmith/react-scroll-parallax)
+
 A small library of components for creating **vertical** scroll based effects like parallax based on an element's position in the viewport. Works with universal (server-side rendered) React apps.
 
 ### Optimizations

From 15771cfaa4f5ab4a1ab556c15494e33dccec5c2e Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 9 Dec 2017 23:32:15 -0800
Subject: [PATCH 141/158] 2.0.0-alpha.1

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index fdab650c6..449ada6ff 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "react-scroll-parallax",
-    "version": "2.0.0-alpha.0",
+    "version": "2.0.0-alpha.1",
     "description": "React component to create parallax scrolling effects",
     "repository": {
         "type": "git",

From 51decb098012fd8679bfdfc54b4fcfd16768cb58 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sun, 10 Dec 2017 14:21:51 -0800
Subject: [PATCH 142/158] add codecov

---
 package.json |  8 ++++++--
 yarn.lock    | 16 ++++++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index 449ada6ff..8d40977cf 100644
--- a/package.json
+++ b/package.json
@@ -11,8 +11,9 @@
         "dev": "yarn test && BABEL_ENV=dev webpack --progress --colors --watch",
         "dev-server": "node ./example/dist/server",
         "gh-pages": "NODE_ENV=production webpack --progress --colors",
-        "test": "BABEL_ENV=test jest && yarn run storybook:export",
+        "test": "BABEL_ENV=test jest && codecov && yarn run storybook:export",
         "test:watch": "BABEL_ENV=test jest --watch",
+        "test:coverage": "BABEL_ENV=test jest && codecov",
         "prettier": "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",
         "prepublish": "babel ./src --out-dir ./lib --presets es2015,react,stage-0 --plugins babel-plugin-add-module-exports",
         "storybook": "BABEL_ENV=dev start-storybook -p 6006",
@@ -23,7 +24,9 @@
     "jest": {
         "modulePaths": [
             "<rootDir>/src/"
-        ]
+        ],
+        "coverageDirectory": "./coverage/",
+        "collectCoverage": true
     },
     "keywords": [
         "react",
@@ -56,6 +59,7 @@
         "babel-preset-es2015": "^6.24.1",
         "babel-preset-react": "^6.24.1",
         "babel-preset-stage-0": "^6.24.1",
+        "codecov": "^3.0.0",
         "cross-env": "^3.1.4",
         "css-loader": "^0.28.0",
         "express": "^4.14.1",
diff --git a/yarn.lock b/yarn.lock
index 372a16b83..0fdbf1443 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -389,6 +389,10 @@ argparse@^1.0.7:
   dependencies:
     sprintf-js "~1.0.2"
 
+argv@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab"
+
 arr-diff@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
@@ -2112,6 +2116,14 @@ code-point-at@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
 
+codecov@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.0.0.tgz#c273b8c4f12945723e8dc9d25803d89343e5f28e"
+  dependencies:
+    argv "0.0.2"
+    request "2.81.0"
+    urlgrey "0.4.4"
+
 color-convert@^1.3.0, color-convert@^1.9.0:
   version "1.9.0"
   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a"
@@ -6971,6 +6983,10 @@ url@^0.11.0:
     punycode "1.3.2"
     querystring "0.2.0"
 
+urlgrey@0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f"
+
 user-home@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"

From cece937f22385d578478c7e8e203fd4947283ec4 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Sun, 10 Dec 2017 14:36:10 -0800
Subject: [PATCH 143/158] add codecov badge

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 3c9a918d8..22393baf2 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # React Scroll Parallax v2
 
-[![Build Status](https://travis-ci.org/jscottsmith/react-scroll-parallax.svg?branch=v2)](https://travis-ci.org/jscottsmith/react-scroll-parallax)
+[![Build Status](https://travis-ci.org/jscottsmith/react-scroll-parallax.svg?branch=v2)](https://travis-ci.org/jscottsmith/react-scroll-parallax) [![codecov](https://codecov.io/gh/jscottsmith/react-scroll-parallax/branch/v2/graph/badge.svg)](https://codecov.io/gh/jscottsmith/react-scroll-parallax)
 
 A small library of components for creating **vertical** scroll based effects like parallax based on an element's position in the viewport. Works with universal (server-side rendered) React apps.
 

From efb0bbc837cbb9a7b39c9d71bab3631e70ce987b Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Mon, 11 Dec 2017 21:11:00 -0800
Subject: [PATCH 144/158] update codecov link

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 22393baf2..20933d062 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # React Scroll Parallax v2
 
-[![Build Status](https://travis-ci.org/jscottsmith/react-scroll-parallax.svg?branch=v2)](https://travis-ci.org/jscottsmith/react-scroll-parallax) [![codecov](https://codecov.io/gh/jscottsmith/react-scroll-parallax/branch/v2/graph/badge.svg)](https://codecov.io/gh/jscottsmith/react-scroll-parallax)
+[![Build Status](https://travis-ci.org/jscottsmith/react-scroll-parallax.svg?branch=v2)](https://travis-ci.org/jscottsmith/react-scroll-parallax) [![codecov](https://codecov.io/gh/jscottsmith/react-scroll-parallax/branch/v2/graph/badge.svg)](https://codecov.io/gh/jscottsmith/react-scroll-parallax/branch/v2)
 
 A small library of components for creating **vertical** scroll based effects like parallax based on an element's position in the viewport. Works with universal (server-side rendered) React apps.
 

From 3df04892caf00af1a59330a1c01051094f6b3c72 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Mon, 11 Dec 2017 21:46:36 -0800
Subject: [PATCH 145/158] fix deploy script

---
 .travis.yml  | 2 +-
 package.json | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index f4d77e7d0..2f69a77e0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,10 +4,10 @@ node_js:
 cache:
   directories:
     - "node_modules"
+script: codecov && yarn storybook:export
 deploy:
   skip_cleanup: true
   provider: surge
-  script: yarn run storybook:export
   project: build
   domain: react-scroll-parallax.surge.sh
   on: v2
\ No newline at end of file
diff --git a/package.json b/package.json
index 8d40977cf..5d72dfd11 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
         "dev": "yarn test && BABEL_ENV=dev webpack --progress --colors --watch",
         "dev-server": "node ./example/dist/server",
         "gh-pages": "NODE_ENV=production webpack --progress --colors",
-        "test": "BABEL_ENV=test jest && codecov && yarn run storybook:export",
+        "test": "BABEL_ENV=test jest",
         "test:watch": "BABEL_ENV=test jest --watch",
         "test:coverage": "BABEL_ENV=test jest && codecov",
         "prettier": "prettier --tab-width 4 --single-quote --trailing-comma es5 --print-width 80 --write \"{src,examples,__tests__}/**/**/**/*.js\"",

From 49d73ef4419dc67933fe4e4d167662de86e2835a Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 12 Dec 2017 00:54:27 -0800
Subject: [PATCH 146/158] subscribers test

---
 __tests__/Subscribers.test.js  | 82 ++++++++++++++++++++++++++++++++++
 src/controllers/Subscribers.js | 16 +++----
 2 files changed, 90 insertions(+), 8 deletions(-)
 create mode 100644 __tests__/Subscribers.test.js

diff --git a/__tests__/Subscribers.test.js b/__tests__/Subscribers.test.js
new file mode 100644
index 000000000..24510e3c3
--- /dev/null
+++ b/__tests__/Subscribers.test.js
@@ -0,0 +1,82 @@
+import Subscribers from 'controllers/Subscribers.js';
+
+describe('Expect Subscribers', () => {
+    it('to set state', () => {
+        const subscribers = new Subscribers();
+
+        subscribers.setState({
+            foo: () => {},
+            bar: true,
+        });
+
+        expect(subscribers.state).toEqual({
+            foo: expect.any(Function),
+            bar: true,
+        });
+    });
+
+    it('to add a subscriber', () => {
+        const subscribers = new Subscribers();
+
+        function callback(state) {
+            const foo = state;
+        }
+
+        subscribers.subscribe(callback);
+
+        expect(subscribers.subscriptions[0]).toEqual(callback);
+    });
+
+    it('to update a new subscriber with current state', () => {
+        const subscribers = new Subscribers();
+
+        let foo = false;
+        function callback(state) {
+            foo = state;
+        }
+
+        subscribers.setState({
+            foo: 'bar',
+        });
+        subscribers.subscribe(callback);
+
+        expect(foo).toEqual({
+            foo: 'bar',
+        });
+    });
+
+    it('to update a subscriber when state updates', () => {
+        const subscribers = new Subscribers();
+
+        let foo = false;
+        function callback(state) {
+            foo = state;
+        }
+
+        subscribers.setState({
+            foo: false,
+        });
+        subscribers.subscribe(callback);
+        subscribers.setState({
+            foo: 'bar',
+        });
+
+        expect(foo).toEqual({
+            foo: 'bar',
+        });
+    });
+
+    it('to unsubscribe', () => {
+        const subscribers = new Subscribers();
+
+        function callback(state) {
+            const foo = state;
+        }
+
+        subscribers.subscribe(callback);
+        expect(subscribers.subscriptions[0]).toEqual(callback);
+
+        subscribers.unsubscribe(callback);
+        expect(subscribers.subscriptions.length).toEqual(0);
+    });
+});
diff --git a/src/controllers/Subscribers.js b/src/controllers/Subscribers.js
index 384cee370..f39f67c13 100644
--- a/src/controllers/Subscribers.js
+++ b/src/controllers/Subscribers.js
@@ -17,11 +17,11 @@ class Subscribers {
     state = {};
 
     _updateSubscribers = () => {
-        this.subscriptions.forEach(f => f(this.state));
+        this.subscriptions.forEach(cb => cb(this.state));
     };
 
-    _updateSingleSubscriber = f => {
-        f(this.state);
+    _updateSingleSubscriber = cb => {
+        cb(this.state);
     };
 
     setState(nextState) {
@@ -29,13 +29,13 @@ class Subscribers {
         this._updateSubscribers();
     }
 
-    subscribe(f) {
-        this.subscriptions.push(f);
-        this._updateSingleSubscriber(f);
+    subscribe(cb) {
+        this.subscriptions.push(cb);
+        this._updateSingleSubscriber(cb);
     }
 
-    unsubscribe(f) {
-        this.subscriptions = this.subscriptions.filter(x => f !== x);
+    unsubscribe(cb) {
+        this.subscriptions = this.subscriptions.filter(x => cb !== x);
     }
 }
 

From 761fee05e3b0aeaa15f5abb752b4535e4c370c7d Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 12 Dec 2017 23:12:23 -0800
Subject: [PATCH 147/158] ScrollController tests

---
 __tests__/ScrollController.test.js  | 51 +++++++++++++++++++++++++++++
 src/controllers/ScrollController.js | 10 ++++--
 2 files changed, 58 insertions(+), 3 deletions(-)
 create mode 100644 __tests__/ScrollController.test.js

diff --git a/__tests__/ScrollController.test.js b/__tests__/ScrollController.test.js
new file mode 100644
index 000000000..bee95b76f
--- /dev/null
+++ b/__tests__/ScrollController.test.js
@@ -0,0 +1,51 @@
+import ScrollController from 'controllers/ScrollController.js';
+
+describe('Expect ScrollController', () => {
+    it('to init a new instance', () => {
+        const scrollController = ScrollController.init();
+        expect(scrollController).toBeInstanceOf(ScrollController);
+    });
+
+    it('to have an initial scroll state', () => {
+        const scrollController = ScrollController.init();
+        expect(scrollController.state).toEqual({
+            scrollY: 0,
+        });
+    });
+
+    it('to test for passive scroll', () => {
+        const scrollController = ScrollController.init();
+        expect(scrollController).toHaveProperty('supportsPassive');
+    });
+
+    it('to get passive listener options', () => {
+        const scrollController = ScrollController.init();
+        scrollController.supportsPassive = true;
+        let options = scrollController.listenerOptions;
+        expect(options).toEqual({ passive: true });
+
+        scrollController.supportsPassive = false;
+        options = scrollController.listenerOptions;
+        expect(options).toEqual(false);
+    });
+
+    it('to add a scroll event listener on init', () => {
+        const spy = jest.spyOn(ScrollController.prototype, '_addListeners');
+        const scrollController = ScrollController.init();
+        expect(spy).toHaveBeenCalled();
+    });
+
+    it('to set state on scroll', () => {
+        const spy = jest.spyOn(ScrollController.prototype, 'setState');
+        const scrollController = ScrollController.init();
+        scrollController._handleScroll();
+        expect(spy).toHaveBeenCalledWith({ scrollY: 0 });
+    });
+
+    it('to remove a scroll event listener on destroy', () => {
+        const spy = jest.spyOn(ScrollController.prototype, '_removeListeners');
+        const scrollController = ScrollController.init();
+        scrollController.destroy();
+        expect(spy).toHaveBeenCalled();
+    });
+});
diff --git a/src/controllers/ScrollController.js b/src/controllers/ScrollController.js
index 95ebdb340..7ea7aaacc 100644
--- a/src/controllers/ScrollController.js
+++ b/src/controllers/ScrollController.js
@@ -26,9 +26,13 @@ class ScrollController extends Subscribers {
         scrollY: 0,
     };
 
-    // Passive support test
     supportsPassive = testForPassiveScroll();
 
+    // Passive support test
+    get listenerOptions() {
+        return this.supportsPassive ? { passive: true } : false;
+    }
+
     // Window scroll handler. Sets the 'scrollY'
     _handleScroll = () => {
         // Save current scroll
@@ -43,7 +47,7 @@ class ScrollController extends Subscribers {
         window.addEventListener(
             'scroll',
             this._handleScroll,
-            this.supportsPassive ? { passive: true } : false
+            this.listenerOptions
         );
     }
 
@@ -51,7 +55,7 @@ class ScrollController extends Subscribers {
         window.removeEventListener(
             'scroll',
             this._handleScroll,
-            this.supportsPassive ? { passive: true } : false
+            this.listenerOptions
         );
     }
 

From 6a9dbf82419568050d61beaa3564d0e25c49c455 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Tue, 12 Dec 2017 23:28:06 -0800
Subject: [PATCH 148/158] ResizeController test

---
 __tests__/ResizeController.test.js | 35 ++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 __tests__/ResizeController.test.js

diff --git a/__tests__/ResizeController.test.js b/__tests__/ResizeController.test.js
new file mode 100644
index 000000000..a59e014c6
--- /dev/null
+++ b/__tests__/ResizeController.test.js
@@ -0,0 +1,35 @@
+import ResizeController from 'controllers/ResizeController.js';
+
+describe('Expect ResizeController', () => {
+    it('to init a new instance', () => {
+        const resizeController = ResizeController.init();
+        expect(resizeController).toBeInstanceOf(ResizeController);
+    });
+
+    it('to have an initial width state', () => {
+        const resizeController = ResizeController.init();
+        expect(resizeController.state).toEqual({
+            width: 0,
+        });
+    });
+
+    it('to add a resize event listener on init', () => {
+        const spy = jest.spyOn(ResizeController.prototype, '_addListeners');
+        const resizeController = ResizeController.init();
+        expect(spy).toHaveBeenCalled();
+    });
+
+    it('to set state on resize', () => {
+        const spy = jest.spyOn(ResizeController.prototype, 'setState');
+        const resizeController = ResizeController.init();
+        resizeController._handleResize();
+        expect(spy).toHaveBeenCalledWith({ width: 1024 });
+    });
+
+    it('to remove a resize event listener on destroy', () => {
+        const spy = jest.spyOn(ResizeController.prototype, '_removeListeners');
+        const resizeController = ResizeController.init();
+        resizeController.destroy();
+        expect(spy).toHaveBeenCalled();
+    });
+});

From 9adf028162cd4d1deb86d6ec28463bb3ab97107e Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 13 Dec 2017 14:53:32 -0800
Subject: [PATCH 149/158] note lack of Safari support for IntersectionObserver

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 20933d062..cc833d510 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@ The following are supported effects
 npm i react-scroll-parallax@next --save
 ```
 
-This package also requires [support](https://caniuse.com/#search=IntersectionObserver) for the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API). Since this isn't supported in older browsers you will need to add a [polyfill](https://github.com/w3c/IntersectionObserver/tree/gh-pages/polyfill).
+This package also requires [support](https://caniuse.com/#search=IntersectionObserver) for the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API). Since this isn't supported in older browsers (or the latest [Safari](https://media.giphy.com/media/3og0INyCmHlNylks9O/giphy.gif) and [no update](https://bugs.webkit.org/show_bug.cgi?id=159475) as to when it will land) you will need to add a [polyfill](https://github.com/w3c/IntersectionObserver/tree/gh-pages/polyfill).
 
 ```
 npm i intersection-observer --save

From 1ce7fe9ac3437185ade539c4983082d04da3ecf1 Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Wed, 13 Dec 2017 14:58:06 -0800
Subject: [PATCH 150/158] correct polyfill link

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index cc833d510..5ed36ce88 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@ The following are supported effects
 npm i react-scroll-parallax@next --save
 ```
 
-This package also requires [support](https://caniuse.com/#search=IntersectionObserver) for the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API). Since this isn't supported in older browsers (or the latest [Safari](https://media.giphy.com/media/3og0INyCmHlNylks9O/giphy.gif) and [no update](https://bugs.webkit.org/show_bug.cgi?id=159475) as to when it will land) you will need to add a [polyfill](https://github.com/w3c/IntersectionObserver/tree/gh-pages/polyfill).
+This package also requires [support](https://caniuse.com/#search=IntersectionObserver) for the [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API). Since this isn't supported in older browsers (or the latest [Safari](https://media.giphy.com/media/3og0INyCmHlNylks9O/giphy.gif) and [no update](https://bugs.webkit.org/show_bug.cgi?id=159475) as to when it will land) you will need to add a [polyfill](https://github.com/w3c/IntersectionObserver/tree/master/polyfill).
 
 ```
 npm i intersection-observer --save

From 4e9248dd9e6bcb14d8430b209e2030a7bb03d9d5 Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 16 Dec 2017 00:18:56 -0800
Subject: [PATCH 151/158] add BoundsStyle class and tests

---
 __tests__/BoundsStyle.test.js | 104 ++++++++++++++++++++++++++++++++++
 src/utils/BoundsStyle.js      |  84 +++++++++++++++++++++++++++
 2 files changed, 188 insertions(+)
 create mode 100644 __tests__/BoundsStyle.test.js
 create mode 100644 src/utils/BoundsStyle.js

diff --git a/__tests__/BoundsStyle.test.js b/__tests__/BoundsStyle.test.js
new file mode 100644
index 000000000..58f372b18
--- /dev/null
+++ b/__tests__/BoundsStyle.test.js
@@ -0,0 +1,104 @@
+import BoundsStyle from 'utils/BoundsStyle.js';
+
+describe('Expect a BoundsStyle class', () => {
+    it('to have a bounds property', () => {
+        const test = new BoundsStyle();
+
+        expect(test.bounds).toMatchObject({
+            mt: 0,
+            mb: 0,
+            ml: 0,
+            mr: 0,
+        });
+    });
+
+    it('to have getter for a boundsStyle object', () => {
+        const test = new BoundsStyle();
+
+        expect(test.boundsStyle).toMatchObject({
+            marginTop: 0,
+            marginBottom: 0,
+            marginLeft: 0,
+            marginRight: 0,
+            paddingTop: -0,
+            paddingBottom: -0,
+            paddingLeft: -0,
+            paddingRight: -0,
+        });
+    });
+
+    it('to return the instance after each transform', () => {
+        const v1 = [{ value: 0, unit: 'px' }, { value: 0, unit: 'px' }];
+        const v2 = 0;
+        const v3 = 0;
+        const test1 = new BoundsStyle().transformBoundsY(v1, v2);
+        const test2 = new BoundsStyle().transformBoundsX(v1, v2);
+        const test3 = new BoundsStyle().transformBoundsScale(v1, v2, v3);
+
+        expect(test1).toBeInstanceOf(BoundsStyle);
+        expect(test2).toBeInstanceOf(BoundsStyle);
+        expect(test3).toBeInstanceOf(BoundsStyle);
+    });
+
+    it('to transforms bounds based on y offsets', () => {
+        const y1 = [{ value: -100, unit: 'px' }, { value: 100, unit: 'px' }];
+        const y2 = [{ value: -100, unit: '%' }, { value: 100, unit: '%' }];
+        const height = 200;
+
+        const test1 = new BoundsStyle().transformBoundsY(y1, height);
+        const test2 = new BoundsStyle().transformBoundsY(y2, height);
+
+        expect(test1.boundsStyle).toMatchObject({
+            marginTop: -100,
+            marginBottom: -100,
+            marginLeft: 0,
+            marginRight: 0,
+            paddingTop: 100,
+            paddingBottom: 100,
+            paddingLeft: -0,
+            paddingRight: -0,
+        });
+
+        expect(test2.boundsStyle).toMatchObject({
+            marginTop: -200,
+            marginBottom: -200,
+            marginLeft: 0,
+            marginRight: 0,
+            paddingTop: 200,
+            paddingBottom: 200,
+            paddingLeft: -0,
+            paddingRight: -0,
+        });
+    });
+
+    it('to transforms bounds based on x offsets', () => {
+        const x1 = [{ value: -100, unit: 'px' }, { value: 100, unit: 'px' }];
+        const x2 = [{ value: -100, unit: '%' }, { value: 100, unit: '%' }];
+        const height = 200;
+
+        const test1 = new BoundsStyle().transformBoundsX(x1, height);
+        const test2 = new BoundsStyle().transformBoundsX(x2, height);
+
+        expect(test1.boundsStyle).toMatchObject({
+            marginTop: 0,
+            marginBottom: 0,
+            marginLeft: -100,
+            marginRight: -100,
+            paddingTop: -0,
+            paddingBottom: -0,
+            paddingLeft: 100,
+            paddingRight: 100,
+        });
+
+        expect(test2.boundsStyle).toMatchObject({
+            marginTop: 0,
+            marginBottom: 0,
+            marginLeft: -200,
+            marginRight: -200,
+            paddingTop: -0,
+            paddingBottom: -0,
+            paddingLeft: 200,
+            paddingRight: 200,
+        });
+    });
+});
diff --git a/src/utils/BoundsStyle.js b/src/utils/BoundsStyle.js
new file mode 100644
index 000000000..3892fcd88
--- /dev/null
+++ b/src/utils/BoundsStyle.js
@@ -0,0 +1,84 @@
+export default class BoundsStyle {
+    bounds = {
+        mt: 0,
+        mb: 0,
+        ml: 0,
+        mr: 0,
+    };
+
+    get boundsStyle() {
+        return {
+            marginTop: this.bounds.mt,
+            marginBottom: this.bounds.mb,
+            marginLeft: this.bounds.ml,
+            marginRight: this.bounds.mr,
+            paddingTop: this.bounds.mt * -1,
+            paddingBottom: this.bounds.mb * -1,
+            paddingLeft: this.bounds.ml * -1,
+            paddingRight: this.bounds.mr * -1,
+        };
+    }
+
+    transformBoundsScale(scale, w, h) {
+        const newBounds = Object.assign({}, this.bounds);
+
+        const scaleMax = Math.max(scale[0], scale[1]);
+        const halfDeltaX = (w * scaleMax - w) / 2;
+        const halfDeltaY = (h * scaleMax - h) / 2;
+
+        newBounds.mt = newBounds.mt - halfDeltaY;
+        newBounds.mb = newBounds.mb - halfDeltaY;
+        newBounds.ml = newBounds.ml - halfDeltaX;
+        newBounds.mr = newBounds.mr - halfDeltaX;
+
+        this.bounds = newBounds;
+
+        return this;
+    }
+
+    transformBoundsY(y, h) {
+        const newBounds = Object.assign({}, this.bounds);
+
+        const hasYPercent = y[0].unit === '%';
+
+        const y0 = y[0].value;
+        const y1 = y[1].value;
+
+        // transform percent to px
+        const value0 = hasYPercent ? y0 / 100 * h : y0;
+        const value1 = hasYPercent ? y1 / 100 * h : y1;
+
+        const yMin = Math.min(value0, value1);
+        const yMax = Math.max(value0, value1);
+
+        newBounds.mt = newBounds.mt + yMin;
+        newBounds.mb = newBounds.mb - yMax;
+
+        this.bounds = newBounds;
+
+        return this;
+    }
+
+    transformBoundsX(x, w) {
+        const newBounds = Object.assign({}, this.bounds);
+
+        const hasXPercent = x[0].unit === '%';
+
+        const x0 = x[0].value;
+        const x1 = x[1].value;
+
+        // transform percent to px
+        const value0 = hasXPercent ? x0 / 100 * w : x0;
+        const value1 = hasXPercent ? x1 / 100 * w : x1;
+
+        const xMin = Math.min(value0, value1);
+        const xMax = Math.max(value0, value1);
+
+        newBounds.ml = newBounds.ml + xMin;
+        newBounds.mr = newBounds.mr - xMax;
+
+        this.bounds = newBounds;
+
+        return this;
+    }
+}

From 74d6075b187508a5471f53817efe101ae2238c0b Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 16 Dec 2017 00:19:40 -0800
Subject: [PATCH 152/158] update createBoundsStyle to use class

---
 src/utils/createBoundsStyle.js | 95 +++-------------------------------
 1 file changed, 7 insertions(+), 88 deletions(-)

diff --git a/src/utils/createBoundsStyle.js b/src/utils/createBoundsStyle.js
index 17fe89d32..90968a937 100644
--- a/src/utils/createBoundsStyle.js
+++ b/src/utils/createBoundsStyle.js
@@ -1,3 +1,5 @@
+import BoundsStyle from './BoundsStyle';
+
 export default function createBoundsStyle(x, y, scale, el) {
     // NOTE: This creates the style for the bounds element
     // that will be observed by the IntersectionObserver
@@ -8,17 +10,6 @@ export default function createBoundsStyle(x, y, scale, el) {
     let height = 0;
     let width = 0;
 
-    let bounds = {};
-
-    bounds.mt = 0;
-    bounds.mb = 0;
-    bounds.ml = 0;
-    bounds.mr = 0;
-    bounds.pt = 0;
-    bounds.pb = 0;
-    bounds.pl = 0;
-    bounds.pr = 0;
-
     const hasScale = scale;
     const hasYPercent = y[0].unit === '%';
     const hasXPercent = x[0].unit === '%';
@@ -45,83 +36,11 @@ export default function createBoundsStyle(x, y, scale, el) {
         width -= parseFloat(paddingLeft || 0) + parseFloat(paddingRight || 0);
     }
 
-    if (y) {
-        bounds = transformBoundsY(bounds, y, height);
-    }
-
-    if (x) {
-        bounds = transformBoundsX(bounds, x, width);
-    }
-
-    if (scale) {
-        bounds = transformBoundsScale(bounds, scale, width, height);
-    }
-
-    return {
-        marginTop: bounds.mt,
-        marginBottom: bounds.mb,
-        marginLeft: bounds.ml,
-        marginRight: bounds.mr,
-        paddingTop: bounds.mt * -1,
-        paddingBottom: bounds.mb * -1,
-        paddingLeft: bounds.ml * -1,
-        paddingRight: bounds.mr * -1,
-    };
-}
-
-export function transformBoundsY(bounds, y, h) {
-    const newBounds = Object.assign({}, bounds);
-
-    const hasYPercent = y[0].unit === '%';
-
-    const y0 = y[0].value;
-    const y1 = y[1].value;
-
-    // transform percent to px
-    const value0 = hasYPercent ? y0 / 100 * h : y0;
-    const value1 = hasYPercent ? y1 / 100 * h : y1;
+    const bounds = new BoundsStyle()
+        .transformBoundsY(y, height)
+        .transformBoundsX(x, width)
+        .transformBoundsScale(scale, width, height).boundsStyle;
 
-    const yMin = Math.min(value0, value1);
-    const yMax = Math.max(value0, value1);
-
-    newBounds.mt = newBounds.mt + yMin;
-    newBounds.mb = newBounds.mb - yMax;
-
-    return newBounds;
+    return bounds;
 }
 
-export function transformBoundsX(bounds, x, w) {
-    const newBounds = Object.assign({}, bounds);
-
-    const hasXPercent = x[0].unit === '%';
-
-    const x0 = x[0].value;
-    const x1 = x[1].value;
-
-    // transform percent to px
-    const value0 = hasXPercent ? x0 / 100 * w : x0;
-    const value1 = hasXPercent ? x1 / 100 * w : x1;
-
-    const xMin = Math.min(value0, value1);
-    const xMax = Math.max(value0, value1);
-
-    newBounds.ml = newBounds.ml + xMin;
-    newBounds.mr = newBounds.mr - xMax;
-
-    return newBounds;
-}
-
-export function transformBoundsScale(bounds, scale, w, h) {
-    const newBounds = Object.assign({}, bounds);
-
-    const scaleMax = Math.max(scale[0], scale[1]);
-    const halfDeltaX = (w * scaleMax - w) / 2;
-    const halfDeltaY = (h * scaleMax - h) / 2;
-
-    newBounds.mt = newBounds.mt - halfDeltaY;
-    newBounds.mb = newBounds.mb - halfDeltaY;
-    newBounds.ml = newBounds.ml - halfDeltaX;
-    newBounds.mr = newBounds.mr - halfDeltaX;
-
-    return newBounds;
-}

From 55f7b372b16c7093282ffd72688eeb5b7d35c99a Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 16 Dec 2017 00:20:02 -0800
Subject: [PATCH 153/158] add test to deploy script

---
 .travis.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.travis.yml b/.travis.yml
index 2f69a77e0..fd4871284 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,7 +4,7 @@ node_js:
 cache:
   directories:
     - "node_modules"
-script: codecov && yarn storybook:export
+script: yarn test && codecov && yarn storybook:export
 deploy:
   skip_cleanup: true
   provider: surge

From 280fa2bae2186ba4cec05f3bafc5c15e1d494b39 Mon Sep 17 00:00:00 2001
From: jscottsmith <jscsmith@gmail.com>
Date: Tue, 19 Dec 2017 13:37:06 -0800
Subject: [PATCH 154/158] ignore coverage

---
 .gitignore | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/.gitignore b/.gitignore
index 1328bed5e..27974c528 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
+build
+coverage
+dist
+lib
 node_modules
-*dist
-*build
 *.env
 npm-debug.log
-/lib

From 188a6e13b08575b2aecd034dcbba388ef29f1283 Mon Sep 17 00:00:00 2001
From: jscottsmith <jscsmith@gmail.com>
Date: Tue, 19 Dec 2017 13:38:58 -0800
Subject: [PATCH 155/158] add updateAttributeCache and fix typo in
 ViewportProgress test

---
 __tests__/ViewportProgress.test.js | 3 ++-
 src/components/Parallax.js         | 1 -
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/__tests__/ViewportProgress.test.js b/__tests__/ViewportProgress.test.js
index 48286631d..ebccbdaed 100644
--- a/__tests__/ViewportProgress.test.js
+++ b/__tests__/ViewportProgress.test.js
@@ -53,7 +53,7 @@ describe('Expect a <ViewportProgress> component', () => {
         );
     });
 
-    it('to pass a an object containing the { progress, mapRef }w keys', () => {
+    it('to pass a an object containing the { progress, mapRef, and updateAttributeCache } keys', () => {
         const node = document.createElement('div');
         let testObject = {};
         ReactDOM.render(
@@ -70,6 +70,7 @@ describe('Expect a <ViewportProgress> component', () => {
         expect(testObject).toMatchObject({
             progress: expect.any(Number),
             mapRef: expect.any(Function),
+            updateAttributeCache: expect.any(Function),
         });
     });
 });
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 993daf534..0c27ecdcb 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -1,6 +1,5 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-
 import Observed from 'react-observed';
 import {
     validateOffsets,

From 497ef6407b8fea244e2e6426644d63b43f24423e Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 10 Feb 2018 14:36:04 -0800
Subject: [PATCH 156/158] update react-observed, use default observer options

---
 package.json               |  2 +-
 src/components/Parallax.js | 11 ++---------
 yarn.lock                  |  8 +++++---
 3 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/package.json b/package.json
index 5d72dfd11..be443d873 100644
--- a/package.json
+++ b/package.json
@@ -41,7 +41,7 @@
     },
     "dependencies": {
         "prop-types": "^15.5.7",
-        "react-observed": "^1.0.0-beta.2"
+        "react-observed": "^1.0.0-beta.4"
     },
     "devDependencies": {
         "@storybook/addon-actions": "^3.2.17",
diff --git a/src/components/Parallax.js b/src/components/Parallax.js
index 0c27ecdcb..fc1e93152 100644
--- a/src/components/Parallax.js
+++ b/src/components/Parallax.js
@@ -13,15 +13,8 @@ import {
     ViewportProgress,
 } from './index.js';
 
-const observerOptions = {
-    root: null,
-    rootMargin: '10px',
-    threshold: [0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
-};
-
 class Parallax extends Component {
     static defaultProps = {
-        observerOptions,
         x: [0, 0],
         y: [0, 0],
         scale: [1, 1],
@@ -38,7 +31,7 @@ class Parallax extends Component {
         y: validateOffsets,
         scale: validateScale,
         opacity: validateOpacity,
-        observerOptions: PropTypes.object.isRequired,
+        observerOptions: PropTypes.object,
         // @TODO: these should also be available:
         // rotation
         // tag/element name?
@@ -77,7 +70,7 @@ class Parallax extends Component {
 
         // prettier-ignore
         return (
-            <Observed initialViewState intersectionRatio={0.01} options={observerOptions}>
+            <Observed initialViewState options={observerOptions}>
                 {({ isInView, mapRef: observedRef }) => (
                     <ScrollPosition isInView={isInView}>
                         {({ scrollY }) => (
diff --git a/yarn.lock b/yarn.lock
index 0fdbf1443..501a3b1af 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5819,9 +5819,11 @@ react-modal@^3.1.4:
     prop-types "^15.5.10"
     warning "^3.0.0"
 
-react-observed@^1.0.0-beta.2:
-  version "1.0.0-beta.2"
-  resolved "https://registry.yarnpkg.com/react-observed/-/react-observed-1.0.0-beta.2.tgz#b41a4d58d817c00620dd1f80bce8618dbf5be68a"
+react-observed@^1.0.0-beta.4:
+  version "1.0.0-beta.4"
+  resolved "https://registry.yarnpkg.com/react-observed/-/react-observed-1.0.0-beta.4.tgz#5078a961f1e54da0b739c30180d1ce2c9c61658a"
+  dependencies:
+    prop-types "^15.5.10"
 
 react-onclickoutside@^6.5.0:
   version "6.7.0"

From e7f6cb77a72dd77be335544d92e37aafe844073f Mon Sep 17 00:00:00 2001
From: J Smith <jscsmith@gmail.com>
Date: Sat, 10 Feb 2018 14:42:14 -0800
Subject: [PATCH 157/158] 2.0.0-alpha.2

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index be443d873..f3ad7d62d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "react-scroll-parallax",
-    "version": "2.0.0-alpha.1",
+    "version": "2.0.0-alpha.2",
     "description": "React component to create parallax scrolling effects",
     "repository": {
         "type": "git",

From 1b201ded3af9bc107e39e6167b88492dc204e80a Mon Sep 17 00:00:00 2001
From: J Scott Smith <jscsmith@gmail.com>
Date: Thu, 7 Mar 2019 11:09:18 -0800
Subject: [PATCH 158/158] add warning

---
 README.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/README.md b/README.md
index 5ed36ce88..8bcba1e97 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 # React Scroll Parallax v2
 
+**Warning** This was an early alpha that is not supported. Use the [latest v2](https://github.com/jscottsmith/react-scroll-parallax)
+
 [![Build Status](https://travis-ci.org/jscottsmith/react-scroll-parallax.svg?branch=v2)](https://travis-ci.org/jscottsmith/react-scroll-parallax) [![codecov](https://codecov.io/gh/jscottsmith/react-scroll-parallax/branch/v2/graph/badge.svg)](https://codecov.io/gh/jscottsmith/react-scroll-parallax/branch/v2)
 
 A small library of components for creating **vertical** scroll based effects like parallax based on an element's position in the viewport. Works with universal (server-side rendered) React apps.
