Commits: 9

Merge remote-tracking branch 'origin/master' into content

Use Source Code Pro 18px font in Code and Monospace blocks

Make line numbers extra light and remove the period.

Remove spacing between blocks.

index 36923a4..0a40895 100644
--- a/src/Main.elm
+++ b/src/Main.elm
@@ -355,11 +355,18 @@ document =
=        monospace =
=            Mark.Default.monospace
=                [ Element.padding 20
+                , Font.size 18
=                , Element.width Element.fill
=                , Border.color colors.gray
=                , Border.width 3
=                , Border.rounded 5
-                , Font.family [ Font.monospace ]
+                , Font.family
+                    [ Font.external
+                        { url = "https://fonts.googleapis.com/css?family=Source+Code+Pro:200,400&subset=latin-ext"
+                        , name = "Source Code Pro"
+                        }
+                    , Font.monospace
+                    ]
=                , Element.scrollbarY
=                ]
=
@@ -381,7 +388,7 @@ document =
=                                Element.row [ Element.spacing 10 ]
=                                    [ Element.el
=                                        [ Font.color colors.gray
-                                        , Font.size 20
+                                        , Font.extraLight
=                                        , Element.width (Element.px 40)
=                                        , css "user-select" "none"
=                                        , css "-webkit-user-select" "none"
@@ -390,7 +397,7 @@ document =
=                                        , css "-o-user-select" "none"
=                                        , css "-moz-user-select" "none"
=                                        ]
-                                        (Element.text (String.fromInt n ++ "."))
+                                        (Element.text (String.fromInt n))
=                                    , Element.el
=                                        [ Element.width Element.fill
=                                        ]
@@ -404,7 +411,14 @@ document =
=                            , Border.color colors.gray
=                            , Border.width 3
=                            , Border.rounded 5
-                            , Font.family [ Font.monospace ]
+                            , Font.size 18
+                            , Font.family
+                                [ Font.external
+                                    { url = "https://fonts.googleapis.com/css?family=Source+Code+Pro:200,400&subset=latin-ext"
+                                    , name = "Source Code Pro"
+                                    }
+                                , Font.monospace
+                                ]
=                            , Element.scrollbarY
=                            ]
=            in
@@ -724,7 +738,6 @@ document =
=            Element.textColumn
=                [ Element.centerX
=                , Element.width (Element.px 800)
-                , Element.spacing 24
=                ]
=                (List.map (\render -> render model) children)
=        )

Merge branch 'content' into 'master'

Add the content from paper slides

See merge request software-garden/software-garden.gitlab.io!2

Evolve Main into Browser.document program

The title is extracted from the markup document.

All the blocks and in-lines that do not depend on Model and do not produce Msg are extracted to the Mark.Custom module. This is mainly to avoid name collisions, as their names are pretty common terms like "title" or "link".

index 0a40895..0a89a20 100644
--- a/src/Main.elm
+++ b/src/Main.elm
@@ -28,6 +28,7 @@ import Html.Attributes
=import Http
=import Line
=import Mark
+import Mark.Custom
=import Mark.Default
=import NestedTransformations
=import Parser
@@ -44,7 +45,7 @@ import ViewBox
=
=main : Program Flags Model Msg
=main =
-    Browser.element
+    Browser.document
=        { init = init
=        , view = view
=        , update = update
@@ -98,33 +99,45 @@ init flags =
=    )
=
=
-view : Model -> Html Msg
+view : Model -> Browser.Document Msg
=view model =
=    let
-        content : Element Msg
+        content : View
=        content =
=            case model.markup of
=                Nothing ->
-                    Element.el [ Element.centerX, Element.centerY ] <|
-                        Element.text "Loading content..."
+                    loadingView
=
=                Just markup ->
=                    markup
=                        |> Mark.parse document
=                        |> Result.map (\render -> render model)
-                        |> Result.extract deadEndsElement
+                        |> Result.extract deadEndsView
+
+        loadingView : View
+        loadingView =
+            { title = "Software Garden"
+            , body =
+                "Loading content..."
+                    |> Element.text
+                    |> Element.el
+                        [ Element.centerX
+                        , Element.centerY
+                        ]
+            }
=
-        deadEndsElement : List DeadEnd -> Element Msg
-        deadEndsElement deadEnds =
+        deadEndsView : List DeadEnd -> View
+        deadEndsView deadEnds =
=            deadEnds
=                |> List.map deadEndElement
=                |> Element.column
=                    [ Element.centerX
=                    , Element.centerY
-                    , Background.color colors.maroon
+                    , Background.color Mark.Custom.colors.maroon
=                    , Element.padding 40
=                    , Element.spacing 20
=                    ]
+                |> View "Software Garden : Parsing Errors"
=
=        deadEndElement : DeadEnd -> Element Msg
=        deadEndElement { row, col, problem, contextStack } =
@@ -238,11 +251,15 @@ view model =
=                    ++ String.fromInt col
=                )
=    in
-    Element.layout
-        [ -- Below is a hack that enables static site generation
-          Element.htmlAttribute (Html.Attributes.id "app-container")
+    { title = content.title
+    , body =
+        [ Element.layout
+            [ -- Below is a hack that enables static site generation
+              Element.htmlAttribute (Html.Attributes.id "app-container")
+            ]
+            content.body
=        ]
-        content
+    }
=
=
=update : Msg -> Model -> ( Model, Cmd Msg )
@@ -318,210 +335,86 @@ type alias DeadEnd =
=    Parser.Advanced.DeadEnd Mark.Context Mark.Problem
=
=
-document : Mark.Document (Model -> Element Msg)
+type alias View =
+    { title : String
+    , body : Element Msg
+    }
+
+
+document : Mark.Document (Model -> View)
=document =
=    let
-        title =
-            Mark.Default.title
-                [ Element.width Element.fill
-                , Element.paddingXY 0 32
-                , Font.center
-                , Font.size 86
-                , Font.extraBold
-                ]
-                text
-
-        header =
-            Mark.Default.header
-                [ Font.size 24
-                , Font.underline
-                , Element.paddingXY 0 24
-                ]
-                text
-
-        paragraph : Mark.Block (Model -> Element Msg)
-        paragraph =
-            let
-                render content model =
-                    Element.paragraph
-                        [ Element.paddingXY 0 24
-                        ]
-                        (content model)
-            in
-            Mark.map
-                render
-                text
-
-        monospace =
-            Mark.Default.monospace
-                [ Element.padding 20
-                , Font.size 18
-                , Element.width Element.fill
-                , Border.color colors.gray
-                , Border.width 3
-                , Border.rounded 5
-                , Font.family
-                    [ Font.external
-                        { url = "https://fonts.googleapis.com/css?family=Source+Code+Pro:200,400&amp;subset=latin-ext"
-                        , name = "Source Code Pro"
-                        }
-                    , Font.monospace
+        content :
+            { title : String
+            , children : List (Model -> Element Msg)
+            }
+            -> Model
+            -> View
+        content { title, children } model =
+            children
+                |> List.map (\child -> child model)
+                |> Element.textColumn
+                    [ Element.centerX
+                    , Element.width (Element.maximum 800 Element.fill)
=                    ]
-                , Element.scrollbarY
-                ]
-
-        css : String -> String -> Element.Attribute msg
-        css property value =
-            Element.htmlAttribute
-                (Html.Attributes.style
-                    property
-                    value
-                )
-
-        code =
-            let
-                render string model =
-                    string
-                        |> String.split "\n"
-                        |> List.indexedMap
-                            (\n loc ->
-                                Element.row [ Element.spacing 10 ]
-                                    [ Element.el
-                                        [ Font.color colors.gray
-                                        , Font.extraLight
-                                        , Element.width (Element.px 40)
-                                        , css "user-select" "none"
-                                        , css "-webkit-user-select" "none"
-                                        , css "-ms-user-select" "none"
-                                        , css "-webkit-touch-callout" "none"
-                                        , css "-o-user-select" "none"
-                                        , css "-moz-user-select" "none"
-                                        ]
-                                        (Element.text (String.fromInt n))
-                                    , Element.el
-                                        [ Element.width Element.fill
-                                        ]
-                                        (Element.text loc)
+                |> View title
+
+        {- The document has to start with a Title block containing a String (i.e. single line of unforamtted text). This String will be used in two ways:
+
+           It will be turned into an Element and appended to list of children that are passed to the view (so it can be rendered in the body of the page).
+
+           It will also serve as a title for a Browser.Document.
+        -}
+        structure =
+            Mark.startWith
+                (\title rest ->
+                    let
+                        titleElement model =
+                            title
+                                |> Element.text
+                                |> List.singleton
+                                |> Element.paragraph
+                                    [ Element.width Element.fill
+                                    , Element.paddingXY 0 32
+                                    , Font.center
+                                    , Font.size 86
+                                    , Font.extraBold
=                                    ]
-                            )
-                        |> Element.column
-                            [ Element.padding 20
-                            , Element.spacing 10
-                            , Element.width Element.fill
-                            , Border.color colors.gray
-                            , Border.width 3
-                            , Border.rounded 5
-                            , Font.size 18
-                            , Font.family
-                                [ Font.external
-                                    { url = "https://fonts.googleapis.com/css?family=Source+Code+Pro:200,400&amp;subset=latin-ext"
-                                    , name = "Source Code Pro"
-                                    }
-                                , Font.monospace
-                                ]
-                            , Element.scrollbarY
-                            ]
-            in
-            Mark.block "Code"
-                render
-                Mark.multiline
-
-        note : Mark.Block (Model -> Element Msg)
-        note =
-            let
-                render elements model =
-                    elements
-                        |> List.map (\element -> element model)
-                        |> Element.textColumn
-                            [ Element.padding 20
-                            , Element.spacing 10
-                            , Element.width Element.fill
-                            , Border.width 1
-                            , Border.color colors.gray
-                            , Font.color colors.gray
-                            , Border.rounded 5
-                            ]
-            in
-            Mark.block "Note"
-                render
+                    in
+                    { title = title
+                    , children = titleElement :: rest
+                    }
+                )
+                Mark.Custom.title
=                (Mark.manyOf
-                    [ paragraph
-                    , header
-                    , list
+                    [ Mark.Custom.header
+                    , Mark.Custom.paragraph
+                    , Mark.Custom.monospace
+                    , Mark.Custom.code
+                    , Mark.Custom.note
+                    , Mark.Custom.emphasize
+                    , Mark.Custom.list
+                    , Mark.Custom.image
+
+                    -- Embeded programs
+                    , counter
+                    , simplest
+                    , fillTheScreen
+                    , dotAtTheCenterOfTheScreen
+                    , centeredDot
+                    , line
+                    , gradient
+                    , transformations
+                    , nestedTransformations
+                    , cartesianCoordinates
+                    , polarCoordinates
+                    , rosette
+                    , spiral
+                    , tree
+                    , viewBox
=                    ]
=                )
=
-        emphasize : Mark.Block (Model -> Element Msg)
-        emphasize =
-            let
-                render element model =
-                    model
-                        |> element
-                        |> Element.el
-                            [ Element.spacing 30
-                            , Font.bold
-                            , Font.size 30
-                            , Font.center
-                            , Element.paddingXY 0 40
-                            , Element.width Element.fill
-                            ]
-            in
-            Mark.block "Emphasize"
-                render
-                paragraph
-
-        image =
-            Mark.Default.image
-                [ Element.width Element.fill
-                ]
-
-        list =
-            Mark.Default.list
-                { icon = Mark.Default.listIcon
-                , style =
-                    \cursor ->
-                        case List.length cursor of
-                            0 ->
-                                -- top level element
-                                [ Element.spacing 16 ]
-
-                            1 ->
-                                [ Element.spacing 16 ]
-
-                            2 ->
-                                [ Element.spacing 16 ]
-
-                            _ ->
-                                [ Element.spacing 8 ]
-                }
-                text
-
-        text : Mark.Block (Model -> List (Element Msg))
-        text =
-            let
-                defaultTextStyle =
-                    Mark.Default.defaultTextStyle
-            in
-            Mark.Default.textWith
-                { defaultTextStyle
-                    | inlines = defaultTextStyle.inlines ++ [ icon ]
-                }
-
-        icon : Mark.Inline (Model -> Element Msg)
-        icon =
-            Mark.inline "Icon"
-                (\name model ->
-                    icons
-                        |> Dict.get name
-                        |> Maybe.map (FeatherIcons.toHtml [])
-                        |> Maybe.map Element.html
-                        |> Maybe.withDefault
-                            (Element.text
-                                ("Icon not found: '" ++ name ++ "'")
-                            )
-                )
-                |> Mark.inlineString "name"
-
=        -- Embeded programs' blocks
=        counter : Mark.Block (Model -> Element Msg)
=        counter =
@@ -734,46 +627,5 @@ document =
=            Mark.stub "ViewBox" render
=    in
=    Mark.document
-        (\children model ->
-            Element.textColumn
-                [ Element.centerX
-                , Element.width (Element.px 800)
-                ]
-                (List.map (\render -> render model) children)
-        )
-        (Mark.manyOf
-            [ title
-            , header
-            , paragraph
-            , monospace
-            , code
-            , note
-            , emphasize
-            , list
-            , image
-
-            -- Embeded programs
-            , counter
-            , simplest
-            , fillTheScreen
-            , dotAtTheCenterOfTheScreen
-            , centeredDot
-            , line
-            , gradient
-            , transformations
-            , nestedTransformations
-            , cartesianCoordinates
-            , polarCoordinates
-            , rosette
-            , spiral
-            , tree
-            , viewBox
-            ]
-        )
-
-
-colors =
-    { maroon = Element.rgb 0.7 0 0
-    , gray = Element.rgb 0.8 0.8 0.8
-    , pink = Element.rgb 1 0.6 0.6
-    }
+        content
+        structure
new file mode 100644
index 0000000..3e50354
--- /dev/null
+++ b/src/Mark/Custom.elm
@@ -0,0 +1,240 @@
+module Mark.Custom exposing (code, colors, css, emphasize, header, icon, image, list, monospace, note, paragraph, text, title)
+
+import Dict
+import Element exposing (Element)
+import Element.Background as Background
+import Element.Border as Border
+import Element.Font as Font
+import FeatherIcons exposing (icons)
+import Html exposing (Html)
+import Html.Attributes
+import Mark
+import Mark.Default
+
+
+title : Mark.Block String
+title =
+    Mark.block "Title"
+        identity
+        Mark.string
+
+
+header : Mark.Block (model -> Element msg)
+header =
+    Mark.Default.header
+        [ Font.size 24
+        , Font.underline
+        , Element.paddingXY 0 24
+        ]
+        text
+
+
+paragraph : Mark.Block (model -> Element msg)
+paragraph =
+    let
+        render content model =
+            Element.paragraph
+                [ Element.paddingXY 0 24
+                ]
+                (content model)
+    in
+    Mark.map
+        render
+        text
+
+
+monospace : Mark.Block (model -> Element msg)
+monospace =
+    Mark.Default.monospace
+        [ Element.padding 20
+        , Font.size 18
+        , Element.width Element.fill
+        , Border.color colors.gray
+        , Border.width 3
+        , Border.rounded 5
+        , Font.family
+            [ sourceCodePro
+            , Font.monospace
+            ]
+        , Element.scrollbarY
+        ]
+
+
+code : Mark.Block (a -> Element msg)
+code =
+    let
+        render string model =
+            string
+                |> String.split "\n"
+                |> List.indexedMap
+                    (\n loc ->
+                        Element.row [ Element.spacing 10 ]
+                            [ Element.el
+                                [ Font.color colors.gray
+                                , Font.extraLight
+                                , Element.width (Element.px 40)
+                                , css "user-select" "none"
+                                , css "-webkit-user-select" "none"
+                                , css "-ms-user-select" "none"
+                                , css "-webkit-touch-callout" "none"
+                                , css "-o-user-select" "none"
+                                , css "-moz-user-select" "none"
+                                ]
+                                (Element.text (String.fromInt n))
+                            , Element.el
+                                [ Element.width Element.fill
+                                ]
+                                (Element.text loc)
+                            ]
+                    )
+                |> Element.column
+                    [ Element.padding 20
+                    , Element.spacing 10
+                    , Element.width Element.fill
+                    , Border.color colors.gray
+                    , Border.width 3
+                    , Border.rounded 5
+                    , Font.size 18
+                    , Font.family
+                        [ sourceCodePro
+                        , Font.monospace
+                        ]
+                    , Element.scrollbarY
+                    ]
+    in
+    Mark.block "Code"
+        render
+        Mark.multiline
+
+
+note : Mark.Block (model -> Element msg)
+note =
+    let
+        render elements model =
+            elements
+                |> List.map (\element -> element model)
+                |> Element.textColumn
+                    [ Element.padding 20
+                    , Element.spacing 10
+                    , Element.width Element.fill
+                    , Border.width 1
+                    , Border.color colors.gray
+                    , Font.color colors.gray
+                    , Border.rounded 5
+                    ]
+    in
+    Mark.block "Note"
+        render
+        (Mark.manyOf
+            [ paragraph
+            , header
+            , list
+            ]
+        )
+
+
+emphasize : Mark.Block (model -> Element msg)
+emphasize =
+    let
+        render element model =
+            model
+                |> element
+                |> Element.el
+                    [ Element.spacing 30
+                    , Font.bold
+                    , Font.size 30
+                    , Font.center
+                    , Element.paddingXY 0 40
+                    , Element.width Element.fill
+                    ]
+    in
+    Mark.block "Emphasize"
+        render
+        paragraph
+
+
+image : Mark.Block (model -> Element msg)
+image =
+    Mark.Default.image
+        [ Element.width Element.fill
+        ]
+
+
+list : Mark.Block (model -> Element msg)
+list =
+    Mark.Default.list
+        { icon = Mark.Default.listIcon
+        , style =
+            \cursor ->
+                case List.length cursor of
+                    0 ->
+                        -- top level element
+                        [ Element.spacing 16 ]
+
+                    1 ->
+                        [ Element.spacing 16 ]
+
+                    2 ->
+                        [ Element.spacing 16 ]
+
+                    _ ->
+                        [ Element.spacing 8 ]
+        }
+        text
+
+
+text : Mark.Block (model -> List (Element msg))
+text =
+    let
+        defaultTextStyle =
+            Mark.Default.defaultTextStyle
+    in
+    Mark.Default.textWith
+        { defaultTextStyle
+            | inlines = defaultTextStyle.inlines ++ [ icon ]
+        }
+
+
+icon : Mark.Inline (model -> Element msg)
+icon =
+    Mark.inline "Icon"
+        (\name model ->
+            icons
+                |> Dict.get name
+                |> Maybe.map (FeatherIcons.toHtml [])
+                |> Maybe.map Element.html
+                |> Maybe.withDefault
+                    (Element.text
+                        ("Icon not found: '" ++ name ++ "'")
+                    )
+        )
+        |> Mark.inlineString "name"
+
+
+
+-- Helpers
+
+
+css : String -> String -> Element.Attribute msg
+css property value =
+    Element.htmlAttribute
+        (Html.Attributes.style
+            property
+            value
+        )
+
+
+sourceCodePro : Font.Font
+sourceCodePro =
+    Font.external
+        { url = "https://fonts.googleapis.com/css?family=Source+Code+Pro:200,400&amp;subset=latin-ext"
+        , name = "Source Code Pro"
+        }
+
+
+colors : { gray : Element.Color, maroon : Element.Color, pink : Element.Color }
+colors =
+    { maroon = Element.rgb 0.7 0 0
+    , gray = Element.rgb 0.8 0.8 0.8
+    , pink = Element.rgb 1 0.6 0.6
+    }

Evolve Main program into SPA, split content into pages

Create scripts (develop and capture).

Temporarily enable static pages CI pipeline for all branches to test it before merging.

index 266c915..8359570 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,5 @@
=.#*
=/index.html
=/public/
+/built/
=/node_modules/
index 74b4280..aae0419 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,14 +6,10 @@ before_script:
=pages:
=  stage: deploy
=  script:
-    - npx elm make src/Main.elm --output public/index.js
-    - cp index.txt container.html public/
-    ## FIXME: Make puppeteer work in the container
-    #- cp container.html public/index.html
-    - npx coffee src/capture.coffee > public/index.html
+    - scripts/capture
=
=  artifacts:
=    paths:
=      - public
-  only:
-    - master
+  # only:
+  #   - master
index b30969d..fb384fe 100644
--- a/container.html
+++ b/container.html
@@ -5,10 +5,10 @@
=    <title>Software Garden</title>
=  </head>
=  <body>
-    <div id="app-container"></div>
-    <script src="/index.js"></script>
+    <!-- <div id="app-container"></div> -->
+    <script src="/assets/index.js"></script>
=    <script>
-      Elm.Main.init({ node: document.querySelector("#app-container") })
+      Elm.Main.init()
=    </script>
=  </body>
=</html>
new file mode 100644
index 0000000..3cd7b9e
--- /dev/null
+++ b/content/day-1.txt
@@ -0,0 +1,250 @@
+| Title
+    Day 1
+
+| Emphasize
+    Let's make a Dot!
+
+
+| Note
+    Today we are going to learn about
+
+    | List
+        -> Scalable Vector Graphics
+        -> cartesian Coordinates System
+        -> Layouts with ELM UI
+
+
+| Header
+    First Program!
+
+As mentioned before, programs are represented as text (called the /source code/). The source code is stored in files {Icon|name=file} and files are organized in directories {Icon|name=folder}.
+
+
+So the first step is to create a directory for our new program. Lets call it fpart.
+In the terminal type
+
+| Monospace
+    mkdir fpart/
+
+and then
+
+| Monospace
+    cd fpart/
+
+This creates a new directory and makes it the current one. Again, don't worry about the details.
+
+To easily create a new program, we can type
+
+| Monospace
+    elm init
+
+Then to create a file with source code, type
+
+| Monospace
+    atom src/Main.elm
+
+This command should open a new Atom window with empty text file.
+
+| Header
+    Main.elm
+
+| Code
+    module Main exposing (main)
+
+
+    import Html
+
+    main=
+       Html.text "Hello, Tree"
+
+Type the above in the editor and save the file.
+To see the program running type the following in the terminal
+
+| Monospace
+    elm reactor
+
+This command starts the Elm reactor, which will let you run your program in the web browser. Note that it won't give you the command line back - it will run as long as you don't stop it.
+
+
+| Emphasize
+    Voila!
+
+
+Open following address in the web browser
+
+| Emphasize
+    {Link|http://localhost:8000/src/Main.elm|url=http://localhost:8000/src/Main.elm}
+
+| Note
+    *TODO*: Make the link display // characters
+
+Note that the same address was printed by Elm reactor
+
+| Header
+    The problem
+
+We want to have a dot at the center of the screen, like this
+
+| DotAtTheCenterOfTheScreen
+
+Below is the complete code to draw a dot like this, but don't type it in your editor yet! We are going to recreate together it step by step.
+
+| Code
+    module Main exposing (main)
+
+    import Element
+    import Svg
+    import Svg.Attributes
+
+
+    main =
+        Svg.svg
+            [ Svg.Attributes.viewBox "-100 -100 200 200"
+            ]
+            [ Svg.circle
+                [ Svg.Attributes.r "10"
+                , Svg.Attributes.cx "0"
+                , Svg.Attributes.cy "0"
+                ]
+                []
+            ]
+            |> Element.html
+            |> Element.layout
+                [ Element.width Element.fill
+                , Element.height Element.fill
+                ]
+
+
+
+We are going to use a technology called SVG (Scalable Vector Graphics). Its all about drawing shapes on the screen. Let's install an Elm Package to help us work with SVG. Stop the reactor running in terminal by pressing {Code|CTRL} + {Code|C} and type the following:
+
+| Monospace
+    elm install elm/svg
+
+Then start the reactor again:
+
+| Monospace
+    elm reactor
+
+| Note
+    You can press up arrow  {Icon|name=arrow-up}  on the keyboard to get to the previous commands.
+
+Reload the browser. You should see something like this:
+
+| Simplest
+
+Why is the dot at the corner?
+
+It's because its center is at point called {Code|origin} or {Code|(0, 0)}. But what does it mean ?
+
+* a picture of a vase on a table should be here *
+
+Move sliders to change the x and y coordinates of the dot. It's like moving a thing on a table by telling how far left, right, up or down it should go.
+
+| CartesianCoordinates
+
+To change where the dot is we can use cx and cy attributes of the circle
+
+* simplest with cx and cy should be here *
+
+* Module main exposing main should be here *
+
+Note that we have a complete program that draws a dot at the center of the screen , lets take a moment to understand it.
+
+Think about this ( * a picture of eggs and a box of eggs should be here * )
+
+| Note
+    An egg is a thing.
+    Six eggs are six things.
+    A box of six eggs is a thing.
+
+
+
+Now, let's make the SVG element fill the screen
+
+
+| FillTheScreen
+
+
+For that we will need a package called {Link|mdgriffith//elm-ui|url=https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/}
+
+Install it using terminal
+
+{Code|CTRL + C } to stop elm-reactor and type {Code|elm install mdgriffith//elm-ui}
+
+Then in {Code|src//Main.elm} add import {Code|import Element} and change {Code|Main} to look like this :
+
+Main = * the code of Element.layout should be here*
+
+Note that our scene fills the screen, it's time to put the dot at the center of the scene.
+
+* a picture of cx and cy with width and height should be here *
+
+If we would know the height and width of the screen , we could calculate its position as
+
+| Monospace
+    cx = width/2
+    cy = height/2
+
+There is a problem though, we don't know the height and width.
+☹️
+
+But we don't need to!
+
+*Scalable icon should be here*
+
+S for Scalable
+
+Instead of moving the dot, we can set the boundaries of the scene so that the dot is at the center using a property called Viewbox.
+
+| ViewBox
+
+Here is how the viewbox works
+
+* a picture of viewbox should be here*
+
+viewbox = 0 0 100 100 (left, top, width and height respectively)
+
+* a picture of periscope looking table should be here*
+
+The trick is to set the width and height to any arbitrary value (say 1000) and top and left to {Code|- width//2}!
+
+That way point (0,0) will always be right in the middle (the distance to the left and to the right is the same, likewise the distance to the top and bottom).
+
+First, lets see where the SVG boundaries are by giving it a background color
+
+
+| CenteredDot
+
+
+| Code
+    Svg [background "pink"]
+        [...
+        ]
+
+Give a color to the dot
+
+
+| List
+    - Explain SVG attributes ( svg elements take a list of attributes)
+    - Everyone can pick a color
+
+
+Multiple dots
+
+
+| List
+    -> Introduce a problem: We want to have two dots on the screen
+    -> Explain a list, and show there is already a list there (with one item)
+
+
+| Header
+    Do you see any other lists?
+
+
+| List
+    -> Element takes a list of children
+    -> Mention , how can we have a list with one or zero elements? Shopping list with one item. Empty spoon drawer( list of spoons)
+    -> Give your new dot a color and different coordinates
+    -> Show the code for 2 dots
+    -> Exercise: make 3 more dots (5 total)
new file mode 100644
index 0000000..58f6798
--- /dev/null
+++ b/content/index.txt
@@ -0,0 +1,13 @@
+| Title
+    Software Garden
+
+| Emphasize
+
+
+| Emphasize
+    A functional programming workshop for non-programmers
+
+| List
+    # {Link|Before the course begins|url=/preparation.html}
+    # {Link|Day 1 - Let's Make a Dot|url=/day-1.html}
+    # {Link|The rest - Work in progress|url=/rest.html}
new file mode 100644
index 0000000..33c56c2
--- /dev/null
+++ b/content/preparation.txt
@@ -0,0 +1,103 @@
+| Title
+    Before the course begins
+
+| Note
+    This setup instructions are based on an assumption that you are using a Mac.
+
+    If you are using Linux or BSD, then you probably know how to install stuff.
+
+    If you are using anything else, then... well, good luck.
+
+    The rest of the instructions should work with any platform.
+
+| Header
+    Setup
+
+We will need
+
+| List
+    - a text editor (I use Atom)
+    - and the Elm programming language
+
+| Header
+    Installing Elm
+
+
+To install the Elm programming language, go to it's website:
+
+| Emphasize
+    {Link|elm-lang.org|url=http://elm-lang.org/}
+
+
+and follow the installation instructions.
+
+Some of the tools we use with Elm require Node.js. Go to the {Link|Node.js|url=https://nodejs.org/en/} website and install the current version (the green button on the right)
+
+We will need to use the terminal {Icon|name=terminal} a little bit. Don't be scared. It's easy.
+
+| Image
+    src = /assets/mac-launchpad-terminal.png
+    description = Here is a picture of terminal
+
+
+Mac Terminal app window
+You should see a window like this
+
+
+| Image
+    src = /assets/mac-terminal-window.png
+    description = A picture of Mac Terminal
+
+Type the following in the terminal.
+
+
+| Monospace
+    elm repl
+
+Note that the command line changes. You should see something like this
+
+| Monospace
+    ---- Elm 0.19.0 --------------------------------------------------
+    Read <https://elm-lang.org/0.19.0/repl> to learn more: exit, help
+    ------------------------------------------------------------------
+    >
+
+It's the Elm REPL (Read-Evaluate-Print Loop). Inside the REPL type.
+
+| Monospace
+    2+2
+
+And expect to see
+
+| Monospace
+    ---- Elm 0.19.0 ----------------
+    Read <https://elm-lang.org/0.19.0/repl> to learn more: exit, help
+    --------------------------------
+    > 2 + 2
+    4 : number
+    >
+
+Easy, huh?
+We will learn more about REPL later. For now type
+:exit to close it.
+The command line should get back to its initial state.
+
+| Header
+    Install Atom Text Editor
+
+Computer Programs are represented as text, so the text editor is the most fundamental tool of a programmer. There is a lot of good text editors, but to get you started, we will use Atom here.
+
+Go to {Link|atom.io|url=https://atom.io} and download the editor. After installation on Mac, open it and from Atom menu choose Install Shell Commands.
+
+One last thing we need is Elm support for Atom editor. You can install it by typing in the terminal:
+
+| Monospace
+    apm install language-elm
+
+APM is the Atom Package Manager, but don't pay much attention to it. We won't be using it again.
+We are all set.
+
+Got so far? Congratulations!
+
+| Emphasize
+    You are ready for {Link|Day 1|url=/day-1.html}!
similarity index 74%
rename from index.txt
rename to content/rest.txt
index b241d7f..250aed1 100644
--- a/index.txt
+++ b/content/rest.txt
@@ -1,361 +1,8 @@
=| Title
-    Software Garden
+    The rest
=
=| Emphasize
-
-
-| Emphasize
-    A functional programming workshop for non-programmers
-
-
-
-| Header
-    Before the course begins
-
-| Header
-    Setup
-
-| Note
-    This setup instructions are based on an assumption that you are using a Mac.
-
-    If you are using Linux or BSD, then you probably know how to install stuff.
-
-    If you are using anything else, then... well, good luck.
-
-    The rest of the instructions should work with any platform.
-
-
-We will need
-
-| List
-    - a text editor (I use Atom)
-    - and the Elm programming language
-
-| Header
-    Installing Elm
-
-
-To install the Elm programming language, go to it's website:
-
-| Emphasize
-    {Link|elm-lang.org|url=http://elm-lang.org/}
-
-
-and follow the installation instructions.
-
-Some of the tools we use with Elm require Node.js. Go to the {Link|Node.js|url=https://nodejs.org/en/} website and install the current version (the green button on the right)
-
-We will need to use the terminal {Icon|name=terminal} a little bit. Don't be scared. It's easy.
-
-| Image
-    src = /assets/mac-launchpad-terminal.png
-    description = Here is a picture of terminal
-
-
-Mac Terminal app window
-You should see a window like this
-
-
-| Image
-    src = /assets/mac-terminal-window.png
-    description = A picture of Mac Terminal
-
-Type the following in the terminal.
-
-
-| Monospace
-    elm repl
-
-Note that the command line changes. You should see something like this
-
-| Monospace
-    ---- Elm 0.19.0 --------------------------------------------------
-    Read <https://elm-lang.org/0.19.0/repl> to learn more: exit, help
-    ------------------------------------------------------------------
-    >
-
-It's the Elm REPL (Read-Evaluate-Print Loop). Inside the REPL type.
-
-| Monospace
-    2+2
-
-And expect to see
-
-| Monospace
-    ---- Elm 0.19.0 ----------------
-    Read <https://elm-lang.org/0.19.0/repl> to learn more: exit, help
-    --------------------------------
-    > 2 + 2
-    4 : number
-    >
-
-Easy, huh?
-We will learn more about REPL later. For now type
-:exit to close it.
-The command line should get back to its initial state.
-
-| Header
-    Install Atom Text Editor
-
-Computer Programs are represented as text, so the text editor is the most fundamental tool of a programmer. There is a lot of good text editors, but to get you started, we will use Atom here.
-
-Go to {Link|atom.io|url=https://atom.io} and download the editor. After installation on Mac, open it and from Atom menu choose Install Shell Commands.
-
-One last thing we need is Elm support for Atom editor. You can install it by typing in the terminal:
-
-| Monospace
-    apm install language-elm
-
-APM is the Atom Package Manager, but don't pay much attention to it. We won't be using it again.
-We are all set.
-
-| Header
-    Day 1 - let's make a dot!
-
-| Note
-    Today we are going to learn about
-
-    | List
-        -> Scalable Vector Graphics
-        -> cartesian Coordinates System
-        -> Layouts with ELM UI
-
-
-| Header
-    First Program!
-
-As mentioned before, programs are represented as text (called the /source code/).
-The source code is stored in files {Icon|name=file} and files are organized in directories {Icon|name=folder}.
-
-
-So the first step is to create a directory for our new program. Lets call it fpart.
-In the terminal type
-
-| Monospace
-    mkdir fpart/
-
-and then
-
-| Monospace
-    cd fpart/
-
-This creates a new directory and makes it the current one. Again, don't worry about the details.
-
-To easily create a new program, we can type
-
-| Monospace
-    elm init
-
-Then to create a file with source code, type
-
-| Monospace
-    atom src/Main.elm
-
-This command should open a new Atom window with empty text file.
-
-| Header
-    Main.elm
-
-| Code
-    module Main exposing (main)
-
-
-    import Html
-
-    main=
-       Html.text "Hello, Tree"
-
-Type the above in the editor and save the file.
-To see the program running type the following in the terminal
-
-| Monospace
-    elm reactor
-
-This command starts the Elm reactor, which will let you run your program in the web browser. Note that it won't give you the command line back - it will run as long as you don't stop it.
-
-
-| Emphasize
-    Voila!
-
-
-Open following address in the web browser
-
-| Emphasize
-    {Link|http://localhost:8000/src/Main.elm|url=http://localhost:8000/src/Main.elm}
-
-| Note
-    *TODO*: Make the link display // characters
-
-Note that the same address was printed by Elm reactor
-
-| Header
-    The problem
-
-We want to have a dot at the center of the screen, like this
-
-| DotAtTheCenterOfTheScreen
-
-Below is the complete code to draw a dot like this, but don't type it in your editor yet! We are going to recreate together it step by step.
-
-| Code
-    module Main exposing (main)
-
-    import Element
-    import Svg
-    import Svg.Attributes
-
-
-    main =
-        Svg.svg
-            [ Svg.Attributes.viewBox "-100 -100 200 200"
-            ]
-            [ Svg.circle
-                [ Svg.Attributes.r "10"
-                , Svg.Attributes.cx "0"
-                , Svg.Attributes.cy "0"
-                ]
-                []
-            ]
-            |> Element.html
-            |> Element.layout
-                [ Element.width Element.fill
-                , Element.height Element.fill
-                ]
-
-
-
-We are going to use a technology called SVG (Scalable Vector Graphics). Its all about drawing shapes on the screen. Let's install an Elm Package to help us work with SVG. Stop the reactor running in terminal by pressing {Code|CTRL} + {Code|C} and type the following:
-
-| Monospace
-    elm install elm/svg
-
-Then start the reactor again:
-
-| Monospace
-    elm reactor
-
-| Note
-    You can press up arrow  {Icon|name=arrow-up}  on the keyboard to get to the previous commands.
-
-Reload the browser. You should see something like this:
-
-| Simplest
-
-Why is the dot at the corner?
-
-It's because its center is at point called {Code|origin} or {Code|(0, 0)}. But what does it mean ?
-
-* a picture of a vase on a table should be here *
-
-Move sliders to change the x and y coordinates of the dot. It's like moving a thing on a table by telling how far left, right, up or down it should go.
-
-| CartesianCoordinates
-
-To change where the dot is we can use cx and cy attributes of the circle
-
-* simplest with cx and cy should be here *
-
-* Module main exposing main should be here *
-
-Note that we have a complete program that draws a dot at the center of the screen , lets take a moment to understand it.
-
-Think about this ( * a picture of eggs and a box of eggs should be here * )
-
-| Note
-    An egg is a thing.
-    Six eggs are six things.
-    A box of six eggs is a thing.
-
-
-
-Now, let's make the SVG element fill the screen
-
-
-| FillTheScreen
-
-
-For that we will need a package called {Link|mdgriffith//elm-ui|url=https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/}
-
-Install it using terminal
-
-{Code|CTRL + C } to stop elm-reactor and type {Code|elm install mdgriffith//elm-ui}
-
-Then in {Code|src//Main.elm} add import {Code|import Element} and change {Code|Main} to look like this :
-
-Main = * the code of Element.layout should be here*
-
-Note that our scene fills the screen, it's time to put the dot at the center of the scene.
-
-* a picture of cx and cy with width and height should be here *
-
-If we would know the height and width of the screen , we could calculate its position as
-
-| Monospace
-    cx = width/2
-    cy = height/2
-
-There is a problem though, we don't know the height and width.
-☹️
-
-But we don't need to!
-
-*Scalable icon should be here*
-
-S for Scalable
-
-Instead of moving the dot, we can set the boundaries of the scene so that the dot is at the center using a property called Viewbox.
-
-| ViewBox
-
-Here is how the viewbox works
-
-* a picture of viewbox should be here*
-
-viewbox = 0 0 100 100 (left, top, width and height respectively)
-
-* a picture of periscope looking table should be here*
-
-The trick is to set the width and height to any arbitrary value (say 1000) and top and left to {Code|- width//2}!
-
-That way point (0,0) will always be right in the middle (the distance to the left and to the right is the same, likewise the distance to the top and bottom).
-
-First, lets see where the SVG boundaries are by giving it a background color
-
-
-| CenteredDot
-
-
-| Code
-    Svg [background "pink"]
-        [...
-        ]
-
-Give a color to the dot
-
-
-| List
-    - Explain SVG attributes ( svg elements take a list of attributes)
-    - Everyone can pick a color
-
-
-Multiple dots
-
-
-| List
-    -> Introduce a problem: We want to have two dots on the screen
-    -> Explain a list, and show there is already a list there (with one item)
-
-
-| Header
-    Do you see any other lists?
-
-
-| List
-    -> Element takes a list of children
-    -> Mention , how can we have a list with one or zero elements? Shopping list with one item. Empty spoon drawer( list of spoons)
-    -> Give your new dot a color and different coordinates
-    -> Show the code for 2 dots
-    -> Exercise: make 3 more dots (5 total)
+    This is a work in progress. We need to split this part into days.
=
=
=| Header
index 2bb88f6..54d5902 100644
--- a/elm.json
+++ b/elm.json
@@ -13,6 +13,7 @@
=            "elm/json": "1.1.2",
=            "elm/parser": "1.1.0",
=            "elm/svg": "1.0.1",
+            "elm/url": "1.0.0",
=            "elm-community/basics-extra": "4.0.0",
=            "elm-community/list-extra": "8.1.0",
=            "elm-community/result-extra": "2.2.1",
@@ -28,7 +29,6 @@
=            "elm/bytes": "1.0.7",
=            "elm/file": "1.0.1",
=            "elm/time": "1.0.0",
-            "elm/url": "1.0.0",
=            "elm/virtual-dom": "1.0.2",
=            "ianmackenzie/elm-float-extra": "1.0.1",
=            "ianmackenzie/elm-interval": "1.0.1",
@@ -39,4 +39,4 @@
=        "direct": {},
=        "indirect": {}
=    }
-}
+}
\ No newline at end of file
index 3125dbc..19dd474 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -32,11 +32,53 @@
=        "uri-js": "^4.2.2"
=      }
=    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+    },
+    "ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+    },
+    "anymatch": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+      "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+      "requires": {
+        "micromatch": "^2.1.5",
+        "normalize-path": "^2.0.0"
+      }
+    },
+    "arr-diff": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+      "requires": {
+        "arr-flatten": "^1.0.1"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+    },
=    "array-flatten": {
=      "version": "1.1.1",
=      "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
=      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
=    },
+    "array-unique": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM="
+    },
=    "asn1": {
=      "version": "0.2.4",
=      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -50,6 +92,16 @@
=      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
=      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
=    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0="
+    },
=    "async-limiter": {
=      "version": "1.0.0",
=      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
@@ -60,6 +112,11 @@
=      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
=      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
=    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+    },
=    "aws-sign2": {
=      "version": "0.7.0",
=      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -75,6 +132,66 @@
=      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
=      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
=    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
=    "bcrypt-pbkdf": {
=      "version": "1.0.2",
=      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -92,6 +209,11 @@
=        "chainsaw": "~0.1.0"
=      }
=    },
+    "binary-extensions": {
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
+      "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg=="
+    },
=    "binwrap": {
=      "version": "0.1.4",
=      "resolved": "https://registry.npmjs.org/binwrap/-/binwrap-0.1.4.tgz",
@@ -157,6 +279,16 @@
=        "concat-map": "0.0.1"
=      }
=    },
+    "braces": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+      "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+      "requires": {
+        "expand-range": "^1.8.1",
+        "preserve": "^0.2.0",
+        "repeat-element": "^1.1.2"
+      }
+    },
=    "buffer-from": {
=      "version": "1.1.1",
=      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
@@ -172,6 +304,29 @@
=      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
=      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
=    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
=    "caseless": {
=      "version": "0.12.0",
=      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -185,11 +340,92 @@
=        "traverse": ">=0.3.0 <0.4"
=      }
=    },
+    "chalk": {
+      "version": "1.1.3",
+      "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "requires": {
+        "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"
+      }
+    },
+    "charenc": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
+      "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
+    },
+    "chokidar": {
+      "version": "1.6.0",
+      "resolved": "http://registry.npmjs.org/chokidar/-/chokidar-1.6.0.tgz",
+      "integrity": "sha1-kMMq1IApAddxPeUy3ChOlqY60Fg=",
+      "requires": {
+        "anymatch": "^1.3.0",
+        "async-each": "^1.0.0",
+        "fsevents": "^1.0.0",
+        "glob-parent": "^2.0.0",
+        "inherits": "^2.0.1",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^2.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.0.0"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "cli-color": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.2.0.tgz",
+      "integrity": "sha1-OlrnT9drYmevZm5p4q+70B3vNNE=",
+      "requires": {
+        "ansi-regex": "^2.1.1",
+        "d": "1",
+        "es5-ext": "^0.10.12",
+        "es6-iterator": "2",
+        "memoizee": "^0.4.3",
+        "timers-ext": "0.1"
+      }
+    },
=    "coffeescript": {
=      "version": "2.3.2",
=      "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.3.2.tgz",
=      "integrity": "sha512-YObiFDoukx7qPBi/K0kUKyntEZDfBQiqs/DbrR1xzASKOBjGT7auD85/DiPeRr9k++lRj7l3uA9TNMLfyfcD/Q=="
=    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
=    "combined-stream": {
=      "version": "1.0.7",
=      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
@@ -198,6 +434,16 @@
=        "delayed-stream": "~1.0.0"
=      }
=    },
+    "commander": {
+      "version": "2.17.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
+    },
+    "component-emitter": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+      "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
+    },
=    "concat-map": {
=      "version": "0.0.1",
=      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -214,6 +460,11 @@
=        "typedarray": "^0.0.6"
=      }
=    },
+    "connect-pushstate": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/connect-pushstate/-/connect-pushstate-1.1.0.tgz",
+      "integrity": "sha1-vKsiQnHEOWBKD7D2FMCl9WPojiQ="
+    },
=    "content-disposition": {
=      "version": "0.5.2",
=      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
@@ -234,11 +485,39 @@
=      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
=      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
=    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+    },
=    "core-util-is": {
=      "version": "1.0.2",
=      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
=      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
=    },
+    "cross-spawn": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.0.1.tgz",
+      "integrity": "sha1-o7uzAtsil8vqPATt82lB9GE6o5k=",
+      "requires": {
+        "lru-cache": "^4.0.1",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      }
+    },
+    "crypt": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
+      "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
+    },
+    "d": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npmjs.org/d/-/d-1.0.0.tgz",
+      "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+      "requires": {
+        "es5-ext": "^0.10.9"
+      }
+    },
=    "dashdash": {
=      "version": "1.14.1",
=      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -255,6 +534,67 @@
=        "ms": "^2.1.1"
=      }
=    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+    },
+    "default-gateway": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz",
+      "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==",
+      "requires": {
+        "execa": "^0.10.0",
+        "ip-regex": "^2.1.0"
+      }
+    },
+    "define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "requires": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
=    "delayed-stream": {
=      "version": "1.0.0",
=      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -292,11 +632,86 @@
=        "binwrap": "0.1.4"
=      }
=    },
+    "elm-live": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/elm-live/-/elm-live-3.4.0.tgz",
+      "integrity": "sha512-t/pdd6yvFsft7cOysiV0ilmlE6TgCzDL6JQq+lG0TyL5ZjjTAdaYt5evJdyMliRfGY768zXKKQll4clM4VQyCA==",
+      "requires": {
+        "chalk": "^1.1.1",
+        "chokidar": "1.6.0",
+        "commander": "2.17.1",
+        "cross-spawn": "5.0.1",
+        "elm-serve": "0.4.0"
+      }
+    },
+    "elm-serve": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/elm-serve/-/elm-serve-0.4.0.tgz",
+      "integrity": "sha512-NYXzzaJT/zw8v7jzDWGXuvX3/soj+5NTLHxX0n/T6DICbmyDj8kO7rlI2wSKs9UTNjXhZ7quFQEKcgcf/SZksw==",
+      "requires": {
+        "cli-color": "1.2.0",
+        "commander": "2.9.0",
+        "connect-pushstate": "1.1.0",
+        "finalhandler": "1.1.1",
+        "http-proxy": "1.17.0",
+        "internal-ip": "3.0.1",
+        "minimist": "1.2.0",
+        "opn": "5.3.0",
+        "pem": "1.13.2",
+        "serve-static": "1.13.2",
+        "supervisor": "0.12.0",
+        "url-parse": "1.4.3",
+        "ws": "5.2.0"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.9.0",
+          "resolved": "http://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+          "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+          "requires": {
+            "graceful-readlink": ">= 1.0.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+        },
+        "ws": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.0.tgz",
+          "integrity": "sha512-c18dMeW+PEQdDFzkhDsnBAlS4Z8KGStBQQUcQ5mf7Nf689jyGk0594L+i9RaQuf4gog6SvWLJorz2NfSaqxZ7w==",
+          "requires": {
+            "async-limiter": "~1.0.0"
+          }
+        }
+      }
+    },
=    "encodeurl": {
=      "version": "1.0.2",
=      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
=      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
=    },
+    "es5-ext": {
+      "version": "0.10.46",
+      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz",
+      "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==",
+      "requires": {
+        "es6-iterator": "~2.0.3",
+        "es6-symbol": "~3.1.1",
+        "next-tick": "1"
+      }
+    },
+    "es6-iterator": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+      "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.35",
+        "es6-symbol": "^3.1.1"
+      }
+    },
=    "es6-promise": {
=      "version": "4.2.5",
=      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
@@ -310,16 +725,99 @@
=        "es6-promise": "^4.0.3"
=      }
=    },
+    "es6-symbol": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+      "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
+    },
+    "es6-weak-map": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+      "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.14",
+        "es6-iterator": "^2.0.1",
+        "es6-symbol": "^3.1.1"
+      }
+    },
=    "escape-html": {
=      "version": "1.0.3",
=      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
=      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
=    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
=    "etag": {
=      "version": "1.8.1",
=      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
=      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
=    },
+    "event-emitter": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+      "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+      "requires": {
+        "d": "1",
+        "es5-ext": "~0.10.14"
+      }
+    },
+    "eventemitter3": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
+      "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA=="
+    },
+    "execa": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz",
+      "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==",
+      "requires": {
+        "cross-spawn": "^6.0.0",
+        "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"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        }
+      }
+    },
+    "expand-brackets": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+      "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+      "requires": {
+        "is-posix-bracket": "^0.1.0"
+      }
+    },
+    "expand-range": {
+      "version": "1.8.2",
+      "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+      "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+      "requires": {
+        "fill-range": "^2.1.0"
+      }
+    },
=    "express": {
=      "version": "4.16.4",
=      "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
@@ -377,6 +875,33 @@
=      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
=      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
=    },
+    "extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "requires": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "extglob": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+      "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+      "requires": {
+        "is-extglob": "^1.0.0"
+      }
+    },
=    "extract-zip": {
=      "version": "1.6.7",
=      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
@@ -426,6 +951,23 @@
=        "pend": "~1.2.0"
=      }
=    },
+    "filename-regex": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+      "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY="
+    },
+    "fill-range": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+      "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+      "requires": {
+        "is-number": "^2.1.0",
+        "isobject": "^2.0.0",
+        "randomatic": "^3.0.0",
+        "repeat-element": "^1.1.2",
+        "repeat-string": "^1.5.2"
+      }
+    },
=    "finalhandler": {
=      "version": "1.1.1",
=      "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
@@ -455,6 +997,42 @@
=        }
=      }
=    },
+    "follow-redirects": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
+      "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
+      "requires": {
+        "debug": "=3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+          "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
+      }
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+    },
+    "for-own": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+      "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+      "requires": {
+        "for-in": "^1.0.1"
+      }
+    },
=    "forever-agent": {
=      "version": "0.6.1",
=      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -475,6 +1053,14 @@
=      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
=      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
=    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
=    "fresh": {
=      "version": "0.5.2",
=      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -485,57 +1071,613 @@
=      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
=      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
=    },
-    "fstream": {
-      "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
-      "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "inherits": "~2.0.0",
-        "mkdirp": ">=0.5 0",
-        "rimraf": "2"
-      }
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
-      "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.1.15",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
-      "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
-    },
-    "har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
-    },
-    "har-validator": {
-      "version": "5.1.3",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
-      "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+    "fsevents": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
+      "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
+      "optional": true,
=      "requires": {
-        "ajv": "^6.5.5",
-        "har-schema": "^2.0.0"
-      }
-    },
+        "nan": "^2.9.2",
+        "node-pre-gyp": "^0.10.0"
+      },
+      "dependencies": {
+        "abbrev": {
+          "version": "1.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "ansi-regex": {
+          "version": "2.1.1",
+          "bundled": true
+        },
+        "aproba": {
+          "version": "1.2.0",
+          "bundled": true,
+          "optional": true
+        },
+        "are-we-there-yet": {
+          "version": "1.1.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "delegates": "^1.0.0",
+            "readable-stream": "^2.0.6"
+          }
+        },
+        "balanced-match": {
+          "version": "1.0.0",
+          "bundled": true
+        },
+        "brace-expansion": {
+          "version": "1.1.11",
+          "bundled": true,
+          "requires": {
+            "balanced-match": "^1.0.0",
+            "concat-map": "0.0.1"
+          }
+        },
+        "chownr": {
+          "version": "1.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "code-point-at": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "concat-map": {
+          "version": "0.0.1",
+          "bundled": true
+        },
+        "console-control-strings": {
+          "version": "1.1.0",
+          "bundled": true
+        },
+        "core-util-is": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "debug": {
+          "version": "2.6.9",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-extend": {
+          "version": "0.5.1",
+          "bundled": true,
+          "optional": true
+        },
+        "delegates": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "detect-libc": {
+          "version": "1.0.3",
+          "bundled": true,
+          "optional": true
+        },
+        "fs-minipass": {
+          "version": "1.2.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "fs.realpath": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "gauge": {
+          "version": "2.7.4",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "aproba": "^1.0.3",
+            "console-control-strings": "^1.0.0",
+            "has-unicode": "^2.0.0",
+            "object-assign": "^4.1.0",
+            "signal-exit": "^3.0.0",
+            "string-width": "^1.0.1",
+            "strip-ansi": "^3.0.1",
+            "wide-align": "^1.1.0"
+          }
+        },
+        "glob": {
+          "version": "7.1.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        },
+        "has-unicode": {
+          "version": "2.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "iconv-lite": {
+          "version": "0.4.21",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safer-buffer": "^2.1.0"
+          }
+        },
+        "ignore-walk": {
+          "version": "3.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minimatch": "^3.0.4"
+          }
+        },
+        "inflight": {
+          "version": "1.0.6",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "once": "^1.3.0",
+            "wrappy": "1"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "bundled": true
+        },
+        "ini": {
+          "version": "1.3.5",
+          "bundled": true,
+          "optional": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "bundled": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "isarray": {
+          "version": "1.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "minimatch": {
+          "version": "3.0.4",
+          "bundled": true,
+          "requires": {
+            "brace-expansion": "^1.1.7"
+          }
+        },
+        "minimist": {
+          "version": "0.0.8",
+          "bundled": true
+        },
+        "minipass": {
+          "version": "2.2.4",
+          "bundled": true,
+          "requires": {
+            "safe-buffer": "^5.1.1",
+            "yallist": "^3.0.0"
+          }
+        },
+        "minizlib": {
+          "version": "1.1.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "minipass": "^2.2.1"
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "bundled": true,
+          "requires": {
+            "minimist": "0.0.8"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "needle": {
+          "version": "2.2.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "debug": "^2.1.2",
+            "iconv-lite": "^0.4.4",
+            "sax": "^1.2.4"
+          }
+        },
+        "node-pre-gyp": {
+          "version": "0.10.0",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "detect-libc": "^1.0.2",
+            "mkdirp": "^0.5.1",
+            "needle": "^2.2.0",
+            "nopt": "^4.0.1",
+            "npm-packlist": "^1.1.6",
+            "npmlog": "^4.0.2",
+            "rc": "^1.1.7",
+            "rimraf": "^2.6.1",
+            "semver": "^5.3.0",
+            "tar": "^4"
+          }
+        },
+        "nopt": {
+          "version": "4.0.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "abbrev": "1",
+            "osenv": "^0.1.4"
+          }
+        },
+        "npm-bundled": {
+          "version": "1.0.3",
+          "bundled": true,
+          "optional": true
+        },
+        "npm-packlist": {
+          "version": "1.1.10",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "ignore-walk": "^3.0.1",
+            "npm-bundled": "^1.0.1"
+          }
+        },
+        "npmlog": {
+          "version": "4.1.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "are-we-there-yet": "~1.1.2",
+            "console-control-strings": "~1.1.0",
+            "gauge": "~2.7.3",
+            "set-blocking": "~2.0.0"
+          }
+        },
+        "number-is-nan": {
+          "version": "1.0.1",
+          "bundled": true
+        },
+        "object-assign": {
+          "version": "4.1.1",
+          "bundled": true,
+          "optional": true
+        },
+        "once": {
+          "version": "1.4.0",
+          "bundled": true,
+          "requires": {
+            "wrappy": "1"
+          }
+        },
+        "os-homedir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "os-tmpdir": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "osenv": {
+          "version": "0.1.5",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "os-homedir": "^1.0.0",
+            "os-tmpdir": "^1.0.0"
+          }
+        },
+        "path-is-absolute": {
+          "version": "1.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "process-nextick-args": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "rc": {
+          "version": "1.2.7",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "deep-extend": "^0.5.1",
+            "ini": "~1.3.0",
+            "minimist": "^1.2.0",
+            "strip-json-comments": "~2.0.1"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "1.2.0",
+              "bundled": true,
+              "optional": true
+            }
+          }
+        },
+        "readable-stream": {
+          "version": "2.3.6",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "core-util-is": "~1.0.0",
+            "inherits": "~2.0.3",
+            "isarray": "~1.0.0",
+            "process-nextick-args": "~2.0.0",
+            "safe-buffer": "~5.1.1",
+            "string_decoder": "~1.1.1",
+            "util-deprecate": "~1.0.1"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "glob": "^7.0.5"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.1",
+          "bundled": true
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "bundled": true,
+          "optional": true
+        },
+        "sax": {
+          "version": "1.2.4",
+          "bundled": true,
+          "optional": true
+        },
+        "semver": {
+          "version": "5.5.0",
+          "bundled": true,
+          "optional": true
+        },
+        "set-blocking": {
+          "version": "2.0.0",
+          "bundled": true,
+          "optional": true
+        },
+        "signal-exit": {
+          "version": "3.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "bundled": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "bundled": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "bundled": true,
+          "optional": true
+        },
+        "tar": {
+          "version": "4.4.1",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "chownr": "^1.0.1",
+            "fs-minipass": "^1.2.5",
+            "minipass": "^2.2.4",
+            "minizlib": "^1.1.0",
+            "mkdirp": "^0.5.0",
+            "safe-buffer": "^5.1.1",
+            "yallist": "^3.0.2"
+          }
+        },
+        "util-deprecate": {
+          "version": "1.0.2",
+          "bundled": true,
+          "optional": true
+        },
+        "wide-align": {
+          "version": "1.1.2",
+          "bundled": true,
+          "optional": true,
+          "requires": {
+            "string-width": "^1.0.2"
+          }
+        },
+        "wrappy": {
+          "version": "1.0.2",
+          "bundled": true
+        },
+        "yallist": {
+          "version": "3.0.2",
+          "bundled": true
+        }
+      }
+    },
+    "fstream": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+      "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      }
+    },
+    "get-stream": {
+      "version": "3.0.0",
+      "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+      "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "requires": {
+        "assert-plus": "^1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-base": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+      "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+      "requires": {
+        "glob-parent": "^2.0.0",
+        "is-glob": "^2.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+      "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+      "requires": {
+        "is-glob": "^2.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.15",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+      "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
+    },
+    "graceful-readlink": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+      "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+    },
+    "har-validator": {
+      "version": "5.1.3",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+      "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+      "requires": {
+        "ajv": "^6.5.5",
+        "har-schema": "^2.0.0"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
=    "http-errors": {
=      "version": "1.6.3",
=      "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
@@ -547,6 +1689,16 @@
=        "statuses": ">= 1.4.0 < 2"
=      }
=    },
+    "http-proxy": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+      "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+      "requires": {
+        "eventemitter3": "^3.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
=    "http-signature": {
=      "version": "1.2.0",
=      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -598,21 +1750,178 @@
=      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
=      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
=    },
+    "internal-ip": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz",
+      "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==",
+      "requires": {
+        "default-gateway": "^2.6.0",
+        "ipaddr.js": "^1.5.2"
+      }
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
+    },
=    "ipaddr.js": {
=      "version": "1.8.0",
=      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
=      "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
=    },
+    "is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+    },
+    "is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "requires": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+        }
+      }
+    },
+    "is-dotfile": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+      "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE="
+    },
+    "is-equal-shallow": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+      "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+      "requires": {
+        "is-primitive": "^2.0.0"
+      }
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+    },
+    "is-extglob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+      "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
+    },
+    "is-glob": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+      "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+      "requires": {
+        "is-extglob": "^1.0.0"
+      }
+    },
+    "is-number": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+      "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "requires": {
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "is-posix-bracket": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+      "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q="
+    },
+    "is-primitive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+      "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU="
+    },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+    },
+    "is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+    },
=    "is-typedarray": {
=      "version": "1.0.0",
=      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
=      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
=    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+    },
=    "isarray": {
=      "version": "1.0.0",
=      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
=      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
=    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
+    "isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+      "requires": {
+        "isarray": "1.0.0"
+      }
+    },
=    "isstream": {
=      "version": "0.1.2",
=      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
@@ -649,11 +1958,49 @@
=        "verror": "1.10.0"
=      }
=    },
+    "kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "requires": {
+        "is-buffer": "^1.1.5"
+      }
+    },
=    "lodash": {
=      "version": "4.17.11",
=      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
=      "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
=    },
+    "lru-cache": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+      "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+      "requires": {
+        "pseudomap": "^1.0.2",
+        "yallist": "^2.1.2"
+      }
+    },
+    "lru-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
+      "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
+      "requires": {
+        "es5-ext": "~0.10.2"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
=    "match-stream": {
=      "version": "0.0.2",
=      "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz",
@@ -686,11 +2033,41 @@
=        }
=      }
=    },
+    "math-random": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+      "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w="
+    },
+    "md5": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
+      "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+      "requires": {
+        "charenc": "~0.0.1",
+        "crypt": "~0.0.1",
+        "is-buffer": "~1.1.1"
+      }
+    },
=    "media-typer": {
=      "version": "0.3.0",
=      "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
=      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
=    },
+    "memoizee": {
+      "version": "0.4.14",
+      "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz",
+      "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==",
+      "requires": {
+        "d": "1",
+        "es5-ext": "^0.10.45",
+        "es6-weak-map": "^2.0.2",
+        "event-emitter": "^0.3.5",
+        "is-promise": "^2.1",
+        "lru-queue": "0.1",
+        "next-tick": "1",
+        "timers-ext": "^0.1.5"
+      }
+    },
=    "merge-descriptors": {
=      "version": "1.0.1",
=      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
@@ -701,6 +2078,26 @@
=      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
=      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
=    },
+    "micromatch": {
+      "version": "2.3.11",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+      "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+      "requires": {
+        "arr-diff": "^2.0.0",
+        "array-unique": "^0.2.1",
+        "braces": "^1.8.2",
+        "expand-brackets": "^0.1.4",
+        "extglob": "^0.3.1",
+        "filename-regex": "^2.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.1",
+        "kind-of": "^3.0.2",
+        "normalize-path": "^2.0.1",
+        "object.omit": "^2.0.0",
+        "parse-glob": "^3.0.4",
+        "regex-cache": "^0.4.2"
+      }
+    },
=    "mime": {
=      "version": "2.4.0",
=      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz",
@@ -732,6 +2129,25 @@
=      "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
=      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
=    },
+    "mixin-deep": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
+      "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
=    "mkdirp": {
=      "version": "0.5.1",
=      "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
@@ -745,6 +2161,47 @@
=      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
=      "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
=    },
+    "nan": {
+      "version": "2.11.1",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
+      "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
+      "optional": true
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
=    "natives": {
=      "version": "1.1.6",
=      "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz",
@@ -755,11 +2212,96 @@
=      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
=      "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
=    },
+    "next-tick": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
+      "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+    },
+    "normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "requires": {
+        "remove-trailing-separator": "^1.0.1"
+      }
+    },
+    "npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "requires": {
+        "path-key": "^2.0.0"
+      }
+    },
=    "oauth-sign": {
=      "version": "0.9.0",
=      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
=      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
=    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "requires": {
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
+    "object.omit": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+      "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+      "requires": {
+        "for-own": "^0.1.4",
+        "is-extendable": "^0.1.1"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "requires": {
+        "isobject": "^3.0.1"
+      },
+      "dependencies": {
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
=    "on-finished": {
=      "version": "2.3.0",
=      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -776,26 +2318,83 @@
=        "wrappy": "1"
=      }
=    },
+    "opn": {
+      "version": "5.3.0",
+      "resolved": "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
+      "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==",
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+    },
=    "over": {
=      "version": "0.0.5",
=      "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz",
=      "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg="
=    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+    },
+    "parse-glob": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+      "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+      "requires": {
+        "glob-base": "^0.3.0",
+        "is-dotfile": "^1.0.0",
+        "is-extglob": "^1.0.0",
+        "is-glob": "^2.0.0"
+      }
+    },
=    "parseurl": {
=      "version": "1.3.2",
=      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
=      "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
=    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+    },
=    "path-is-absolute": {
=      "version": "1.0.1",
=      "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
=      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
=    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+    },
=    "path-to-regexp": {
=      "version": "0.1.7",
=      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
=      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
=    },
+    "pem": {
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/pem/-/pem-1.13.2.tgz",
+      "integrity": "sha512-MPJWuEb/r6AG+GpZi2JnfNtGAZDeL/8+ERKwXEWRuST5i+4lq/Uy36B352OWIUSPQGH+HR1HEDcIDi+8cKxXNg==",
+      "requires": {
+        "es6-promisify": "^6.0.0",
+        "md5": "^2.2.1",
+        "os-tmpdir": "^1.0.1",
+        "which": "^1.3.1"
+      },
+      "dependencies": {
+        "es6-promisify": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.0.1.tgz",
+          "integrity": "sha512-J3ZkwbEnnO+fGAKrjVpeUAnZshAdfZvbhQpqfIH9kSAspReRC4nJnu8ewm55b4y9ElyeuhCTzJD0XiH8Tsbhlw=="
+        }
+      }
+    },
=    "pend": {
=      "version": "1.2.0",
=      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -806,6 +2405,16 @@
=      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
=      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
=    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+    },
+    "preserve": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+      "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks="
+    },
=    "process-nextick-args": {
=      "version": "2.0.0",
=      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
@@ -830,6 +2439,11 @@
=      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
=      "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4="
=    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
+    },
=    "psl": {
=      "version": "1.1.29",
=      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
@@ -894,6 +2508,33 @@
=      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
=      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
=    },
+    "querystringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz",
+      "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg=="
+    },
+    "randomatic": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+      "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+      "requires": {
+        "is-number": "^4.0.0",
+        "kind-of": "^6.0.0",
+        "math-random": "^1.0.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+          "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
=    "range-parser": {
=      "version": "1.2.0",
=      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
@@ -924,6 +2565,311 @@
=        "util-deprecate": "~1.0.1"
=      }
=    },
+    "readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "requires": {
+            "arr-flatten": "^1.1.0",
+            "array-unique": "^0.3.2",
+            "extend-shallow": "^2.0.1",
+            "fill-range": "^4.0.0",
+            "isobject": "^3.0.1",
+            "repeat-element": "^1.1.2",
+            "snapdragon": "^0.8.1",
+            "snapdragon-node": "^2.0.1",
+            "split-string": "^3.0.2",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "requires": {
+            "debug": "^2.3.3",
+            "define-property": "^0.2.5",
+            "extend-shallow": "^2.0.1",
+            "posix-character-classes": "^0.1.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "requires": {
+                "is-descriptor": "^0.1.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "requires": {
+                "kind-of": "^3.0.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "requires": {
+                    "is-buffer": "^1.1.5"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "requires": {
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "requires": {
+            "array-unique": "^0.3.2",
+            "define-property": "^1.0.0",
+            "expand-brackets": "^2.1.4",
+            "extend-shallow": "^2.0.1",
+            "fragment-cache": "^0.2.1",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.1"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "requires": {
+                "is-descriptor": "^1.0.0"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-number": "^3.0.0",
+            "repeat-string": "^1.6.1",
+            "to-regex-range": "^2.1.0"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "requires": {
+                "is-extendable": "^0.1.0"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "requires": {
+            "arr-diff": "^4.0.0",
+            "array-unique": "^0.3.2",
+            "braces": "^2.3.1",
+            "define-property": "^2.0.2",
+            "extend-shallow": "^3.0.2",
+            "extglob": "^2.0.4",
+            "fragment-cache": "^0.2.1",
+            "kind-of": "^6.0.2",
+            "nanomatch": "^1.2.9",
+            "object.pick": "^1.3.0",
+            "regex-not": "^1.0.0",
+            "snapdragon": "^0.8.1",
+            "to-regex": "^3.0.2"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
+      }
+    },
+    "regex-cache": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+      "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+      "requires": {
+        "is-equal-shallow": "^0.1.3"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+    },
=    "request": {
=      "version": "2.88.0",
=      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
@@ -970,6 +2916,21 @@
=        "lodash": "^4.13.1"
=      }
=    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+    },
=    "rimraf": {
=      "version": "2.6.2",
=      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
@@ -983,11 +2944,24 @@
=      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
=      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
=    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
=    "safer-buffer": {
=      "version": "2.1.2",
=      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
=      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
=    },
+    "semver": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+      "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
+    },
=    "send": {
=      "version": "0.16.2",
=      "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
@@ -1039,6 +3013,27 @@
=        "send": "0.16.2"
=      }
=    },
+    "set-value": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
+      "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
+      }
+    },
=    "setimmediate": {
=      "version": "1.0.5",
=      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
@@ -1049,6 +3044,24 @@
=      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
=      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
=    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "requires": {
+        "shebang-regex": "^1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+    },
=    "slice-stream": {
=      "version": "1.0.0",
=      "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz",
@@ -1080,6 +3093,146 @@
=        }
=      }
=    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        },
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "requires": {
+        "kind-of": "^3.2.0"
+      }
+    },
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
+    "source-map-resolve": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
+      "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
+      "requires": {
+        "atob": "^2.1.1",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      }
+    },
=    "sshpk": {
=      "version": "1.15.2",
=      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
@@ -1096,6 +3249,25 @@
=        "tweetnacl": "~0.14.0"
=      }
=    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
=    "statuses": {
=      "version": "1.4.0",
=      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
@@ -1114,6 +3286,29 @@
=        "safe-buffer": "~5.1.0"
=      }
=    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+    },
+    "supervisor": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/supervisor/-/supervisor-0.12.0.tgz",
+      "integrity": "sha1-3n5jNwFbKRhRwQ81OMSn8EkX7ME="
+    },
+    "supports-color": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+    },
=    "tar": {
=      "version": "2.2.1",
=      "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
@@ -1124,6 +3319,53 @@
=        "inherits": "2"
=      }
=    },
+    "timers-ext": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
+      "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
+      "requires": {
+        "es5-ext": "~0.10.46",
+        "next-tick": "1"
+      }
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      }
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "dependencies": {
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          }
+        }
+      }
+    },
=    "tough-cookie": {
=      "version": "2.4.3",
=      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
@@ -1172,11 +3414,84 @@
=      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
=      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
=    },
+    "union-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
+      "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^0.4.3"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        },
+        "set-value": {
+          "version": "0.4.3",
+          "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
+          "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
+          "requires": {
+            "extend-shallow": "^2.0.1",
+            "is-extendable": "^0.1.1",
+            "is-plain-object": "^2.0.1",
+            "to-object-path": "^0.3.0"
+          }
+        }
+      }
+    },
=    "unpipe": {
=      "version": "1.0.0",
=      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
=      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
=    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+        }
+      }
+    },
=    "unzip": {
=      "version": "0.1.11",
=      "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz",
@@ -1240,6 +3555,25 @@
=        "punycode": "^2.1.0"
=      }
=    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+    },
+    "url-parse": {
+      "version": "1.4.3",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz",
+      "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==",
+      "requires": {
+        "querystringify": "^2.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+    },
=    "util-deprecate": {
=      "version": "1.0.2",
=      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -1270,6 +3604,14 @@
=        "extsprintf": "^1.2.0"
=      }
=    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
=    "wrappy": {
=      "version": "1.0.2",
=      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -1283,6 +3625,11 @@
=        "async-limiter": "~1.0.0"
=      }
=    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+    },
=    "yauzl": {
=      "version": "2.4.1",
=      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
index 3432d08..0ce2b31 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
=  "dependencies": {
=    "coffeescript": "^2.3.2",
=    "elm": "^0.19.0-bugfix2",
+    "elm-live": "^3.4.0",
=    "express": "^4.16.4",
=    "puppeteer": "^1.11.0"
=  }
new file mode 100755
index 0000000..2952960
--- /dev/null
+++ b/scripts/capture
@@ -0,0 +1,14 @@
+#! /usr/bin/env bash -euo pipefail
+
+rm -rf built/*
+rm -rf public/*
+
+npx elm make src/Main.elm --output built/index.js
+
+cp -r content/ public/content/
+cp -r assets/ public/assets/
+cp -r built/* public/assets/
+
+mkdir -p built/captured/
+npx coffee src/capture.coffee
+cp -r built/captured/* public/
new file mode 100755
index 0000000..b8fc9a4
--- /dev/null
+++ b/scripts/develop
@@ -0,0 +1,3 @@
+#! /usr/bin/env bash -euo pipefail
+
+npx elm-live src/Main.elm --pushstate -- --debug
index 0a89a20..d542d78 100644
--- a/src/Main.elm
+++ b/src/Main.elm
@@ -8,6 +8,7 @@ It fetches the Elm Markup file at /index.txt and renders it. There are a number
=
=import Basics.Extra exposing (curry)
=import Browser
+import Browser.Navigation as Navigation
=import BrowserWindow
=import CartesianCoordinates
=import CenteredDot
@@ -36,20 +37,24 @@ import Parser.Advanced
=import PolarCoordinates
=import Result.Extra as Result
=import RosetteTypedTransformations
+import Routes exposing (Route)
=import Simplest
=import Spiral
=import Transformations
=import Tree
+import Url exposing (Url)
=import ViewBox
=
=
=main : Program Flags Model Msg
=main =
-    Browser.document
+    Browser.application
=        { init = init
=        , view = view
=        , update = update
=        , subscriptions = subscriptions
+        , onUrlChange = UrlChanged
+        , onUrlRequest = UrlRequested
=        }
=
=
@@ -58,7 +63,9 @@ type alias Flags =
=
=
=type alias Model =
-    { markup : Maybe String
+    { url : Url
+    , key : Navigation.Key
+    , markup : Maybe String
=    , counter : Counter.Model
=    , transformations : Transformations.Model
=    , nestedTransformations : NestedTransformations.Model
@@ -70,7 +77,9 @@ type alias Model =
=
=
=type Msg
-    = DocumentFetched (Result Http.Error String)
+    = UrlRequested Browser.UrlRequest
+    | UrlChanged Url
+    | ContentFetched (Result Http.Error String)
=    | CounterMsg Counter.Msg
=    | TransformationsMsg Transformations.Msg
=    | NestedTransformationsMsg NestedTransformations.Msg
@@ -81,9 +90,11 @@ type Msg
=    | ViewBoxMsg ViewBox.Msg
=
=
-init : Flags -> ( Model, Cmd Msg )
-init flags =
-    ( { markup = Nothing
+init : Flags -> Url -> Navigation.Key -> ( Model, Cmd Msg )
+init flags url key =
+    ( { url = url
+      , key = key
+      , markup = Nothing
=      , counter = Counter.init
=      , transformations = Transformations.init
=      , nestedTransformations = NestedTransformations.init
@@ -92,10 +103,9 @@ init flags =
=      , tree = Nothing
=      , viewBox = ViewBox.init
=      }
-    , Http.get
-        { url = "/index.txt"
-        , expect = Http.expectString DocumentFetched
-        }
+    , url
+        |> Routes.parse
+        |> loadContent
=    )
=
=
@@ -264,13 +274,33 @@ view model =
=
=update : Msg -> Model -> ( Model, Cmd Msg )
=update msg model =
-    case msg of
-        DocumentFetched (Ok markup) ->
+    case Debug.log "update" msg of
+        UrlRequested (Browser.Internal url) ->
+            ( model
+            , url
+                |> Debug.log "New URL"
+                |> Url.toString
+                |> Navigation.pushUrl model.key
+            )
+
+        UrlRequested (Browser.External url) ->
+            ( model
+            , Navigation.load url
+            )
+
+        UrlChanged url ->
+            ( { model | url = url }
+            , url
+                |> Routes.parse
+                |> loadContent
+            )
+
+        ContentFetched (Ok markup) ->
=            ( { model | markup = Just markup }
=            , Cmd.none
=            )
=
-        DocumentFetched (Err markup) ->
+        ContentFetched (Err err) ->
=            ( { model | markup = Nothing }
=            , Cmd.none
=            )
@@ -331,6 +361,25 @@ subscriptions model =
=                |> Sub.map TreeMsg
=
=
+loadContent : Route -> Cmd Msg
+loadContent route =
+    case Debug.log "Route" route of
+        Routes.Home ->
+            Http.get
+                { url = "/content/index.txt"
+                , expect = Http.expectString ContentFetched
+                }
+
+        Routes.Content base ->
+            Http.get
+                { url = "/content/" ++ base ++ ".txt"
+                , expect = Http.expectString ContentFetched
+                }
+
+        Routes.NotFound ->
+            Cmd.none
+
+
=type alias DeadEnd =
=    Parser.Advanced.DeadEnd Mark.Context Mark.Problem
=
new file mode 100644
index 0000000..f76545a
--- /dev/null
+++ b/src/Routes.elm
@@ -0,0 +1,37 @@
+module Routes exposing
+    ( Route(..)
+    , parse
+    , parser
+    )
+
+import Url exposing (Url)
+import Url.Parser as Parser exposing (..)
+
+
+type Route
+    = Home
+    | Content String
+    | NotFound
+
+
+parser : Parser (Route -> b) b
+parser =
+    Parser.oneOf
+        [ Parser.map Home Parser.top
+        , Parser.custom "Content"
+            (\path ->
+                case String.split "." path of
+                    [ base, "html" ] ->
+                        Just (Content base)
+
+                    _ ->
+                        Nothing
+            )
+        ]
+
+
+parse : Url -> Route
+parse url =
+    url
+        |> Parser.parse parser
+        |> Maybe.withDefault NotFound
index 8764395..15eb598 100644
--- a/src/capture.coffee
+++ b/src/capture.coffee
@@ -1,9 +1,14 @@
=puppeteer = require "puppeteer"
=express = require "express"
+{ promises: fs  } = require "fs"
=
=do () =>
=  app = express ``
=  app.use express.static "public/"
+
+  app.get '*', (req, res) ->
+    res.sendFile "container.html", root: process.cwd ``
+
=  server = app.listen 8000
=
=  browser = await puppeteer.launch
@@ -14,12 +19,34 @@ do () =>
=
=  page = await browser.newPage ``
=
-  await page.goto "http://localhost:8000/container.html",
-    waitUntil: "networkidle0"
+  # TODO: Scan the directory and make this list dynamic!
+  for base in [
+    "index",
+    "preparation",
+    "day-1",
+    "rest"
+  ]
+    await do (base) ->
+      url = "http://localhost:8000/#{base}.html"
+      path = "built/captured/#{base}.html"
+      console.log "#{url} -> #{path}"
+
+
+      await page.goto url, waitUntil: "networkidle2"
+      console.log "Ready"
=
-  html = await page.content ``
+      html =
+        (await page.content ``).replace "</body>", """
+            <script src="/assets/index.js"></script>
+            <script>
+              Elm.Main.init()
+            </script>
+          </body>
+        """
=
-  console.log html
+      output = await fs.open path, "w"
+      await output.writeFile html
+      await output.close ``
=
=  await browser.close ``
=  server.close ``

Upgrade CI configuration to use alekzonder/puppeteer:1.8.0-0

index aae0419..8ae0061 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,4 +1,4 @@
-image: alekzonder/puppeteer:1.0.0
+image: alekzonder/puppeteer:1.8.0-0
=
=before_script:
=  - npm install

Use set instead of command line options to bash in scripts

The previous syntax doesn't work in the Docker container.

index 2952960..f710c3c 100755
--- a/scripts/capture
+++ b/scripts/capture
@@ -1,4 +1,6 @@
-#! /usr/bin/env bash -euo pipefail
+#! /usr/bin/env bash
+
+set -euo pipefail
=
=rm -rf built/*
=rm -rf public/*
index b8fc9a4..568384b 100755
--- a/scripts/develop
+++ b/scripts/develop
@@ -1,3 +1,5 @@
-#! /usr/bin/env bash -euo pipefail
+#! /usr/bin/env bash
+
+set -euo pipefail
=
=npx elm-live src/Main.elm --pushstate -- --debug

Make capture script ensure that public/ and built/ directories exists

index f710c3c..4236c08 100755
--- a/scripts/capture
+++ b/scripts/capture
@@ -2,11 +2,15 @@
=
=set -euo pipefail
=
-rm -rf built/*
-rm -rf public/*
+rm -rf built/
+rm -rf public/
+mkdir -p built/
+mkdir -p public/
+
=
=npx elm make src/Main.elm --output built/index.js
=
+
=cp -r content/ public/content/
=cp -r assets/ public/assets/
=cp -r built/* public/assets/

Use classic (callback) API of FS module in capture.coffee

The Promise API is not available in Node v. 8, which is used in alekzonder/puppeteer Docker image.

index 15eb598..46eae85 100644
--- a/src/capture.coffee
+++ b/src/capture.coffee
@@ -1,6 +1,6 @@
=puppeteer = require "puppeteer"
=express = require "express"
-{ promises: fs  } = require "fs"
+fs = require "fs"
=
=do () =>
=  app = express ``
@@ -29,11 +29,8 @@ do () =>
=    await do (base) ->
=      url = "http://localhost:8000/#{base}.html"
=      path = "built/captured/#{base}.html"
-      console.log "#{url} -> #{path}"
-
=
=      await page.goto url, waitUntil: "networkidle2"
-      console.log "Ready"
=
=      html =
=        (await page.content ``).replace "</body>", """
@@ -44,9 +41,10 @@ do () =>
=          </body>
=        """
=
-      output = await fs.open path, "w"
-      await output.writeFile html
-      await output.close ``
+      await new Promise (resolve, reject) ->
+        fs.writeFile path, html, (error) ->
+          if error then return reject error
+          do resolve
=
=  await browser.close ``
=  server.close ``