├── .gitignore ├── .gitlab-ci.yml ├── README.md ├── Makefile ├── src ├── Lifechart.elm └── Lifechart │ ├── Demo.elm │ ├── View.elm │ ├── Serializer.elm │ ├── Model.elm │ ├── Update.elm │ └── View │ ├── Canvas.elm │ └── Controls.elm ├── elm-package.json ├── LICENSE ├── lib ├── BasicsExtra.elm └── DateExtra.elm └── public ├── index.html └── lifechart.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | /elm-stuff/ 2 | /public/lifechart.js 3 | /mine.url 4 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | image: node:latest 2 | 3 | before_script: 4 | - export PATH=$PWD/node_modules/.bin:$PATH # we don't have perms to install with -g 5 | - npm install elm 6 | - npm install uglify-js 7 | - elm --version 8 | 9 | elm-make: 10 | script: 11 | - make 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Lifechart 2 | 3 | [![build status](https://gitlab.com/infertux/lifechart/badges/master/build.svg)](https://gitlab.com/infertux/lifechart/commits/master) 4 | 5 | Spend your time wisely. 6 | 7 | https://infertux.com/labs/lifechart/ 8 | 9 | ## Elm 10 | 11 | [Elm](http://elm-lang.org/) rocks! Check it out. 12 | 13 | ## License 14 | 15 | AGPLv3+ 16 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: lifechart 2 | 3 | lifechart: src/*.elm 4 | elm-make src/Lifechart.elm --yes --warn --output public/lifechart.js 5 | uglifyjs --mangle --screw-ie8 --output public/lifechart.min.js -- public/lifechart.js 6 | rm public/lifechart.js 7 | 8 | watch: src/*.elm 9 | elm-test --watch 10 | 11 | clean: 12 | $(RM) -r public/lifechart*.js elm-stuff/ 13 | 14 | .PHONY: watch clean 15 | -------------------------------------------------------------------------------- /src/Lifechart.elm: -------------------------------------------------------------------------------- 1 | module Lifechart exposing (main) 2 | 3 | import Navigation 4 | import Time 5 | import Lifechart.Model as Model 6 | import Lifechart.Update exposing (init, update) 7 | import Lifechart.View exposing (view) 8 | 9 | 10 | main : Program Never Model.Model Model.Msg 11 | main = 12 | Navigation.program Model.NewUrl 13 | { init = init 14 | , update = update 15 | , view = view 16 | , subscriptions = subscriptions 17 | } 18 | 19 | 20 | subscriptions : Model.Model -> Sub Model.Msg 21 | subscriptions model = 22 | Time.every (Time.second * 10) Model.Tick 23 | -------------------------------------------------------------------------------- /elm-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0", 3 | "summary": "helpful summary of your project, less than 80 characters", 4 | "repository": "https://github.com/user/project.git", 5 | "license": "AGPLv3+", 6 | "source-directories": [ 7 | "src", 8 | "lib" 9 | ], 10 | "exposed-modules": [], 11 | "dependencies": { 12 | "elm-lang/core": "5.0.0 <= v < 6.0.0", 13 | "elm-lang/html": "2.0.0 <= v < 3.0.0", 14 | "elm-lang/navigation": "2.0.1 <= v < 3.0.0", 15 | "eskimoblood/elm-color-extra": "5.1.0 <= v < 6.0.0", 16 | "evancz/elm-graphics": "1.0.1 <= v < 2.0.0", 17 | "truqu/elm-base64": "2.0.3 <= v < 3.0.0" 18 | }, 19 | "elm-version": "0.18.0 <= v < 0.19.0" 20 | } 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | AGPLv3+ 2 | 3 | Lifechart 4 | Copyright (C) 2015-2018 Cédric Félizard 5 | 6 | This program is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU Affero General Public License as 8 | published by the Free Software Foundation, either version 3 of the 9 | License, or (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU Affero General Public License for more details. 15 | 16 | You should have received a copy of the GNU Affero General Public License 17 | along with this program. If not, see . 18 | -------------------------------------------------------------------------------- /src/Lifechart/Demo.elm: -------------------------------------------------------------------------------- 1 | module Lifechart.Demo exposing (base64) 2 | 3 | import Base64 4 | 5 | 6 | base64 : String 7 | base64 = 8 | let 9 | json = 10 | """ 11 | { 12 | "birth-date": "1988-07-24", 13 | "life-expectancy": 80, 14 | "kid-until": 18, 15 | "old-from": 70, 16 | "only-adult-years": false, 17 | "events": [ 18 | { 19 | "from": "2010-09-14", 20 | "to": "2014-02-01", 21 | "color": "#f57900", 22 | "label": "college", 23 | "overlay": false 24 | }, 25 | { 26 | "from": "2015-06-01", 27 | "to": "2016-05-31", 28 | "color": "#73d216", 29 | "label": "trip", 30 | "overlay": false 31 | } 32 | ] 33 | } 34 | """ 35 | in 36 | Base64.encode json 37 | -------------------------------------------------------------------------------- /src/Lifechart/View.elm: -------------------------------------------------------------------------------- 1 | module Lifechart.View exposing (view) 2 | 3 | import Html exposing (..) 4 | import Html.Attributes exposing (..) 5 | import Lifechart.Model exposing (..) 6 | import Lifechart.View.Canvas as Canvas 7 | import Lifechart.View.Controls as Controls 8 | 9 | 10 | view : Model -> Html Msg 11 | view model = 12 | div [] 13 | [ Controls.modal model 14 | , div [ class "row" ] 15 | [ div [ class "col-6" ] [ Controls.controls model ] 16 | , div [ class "col-6" ] 17 | [ if model.now == 0 then 18 | h1 [ class "text-center" ] [ text "Loading..." ] 19 | else 20 | Canvas.canvas model 21 | ] 22 | ] 23 | ] 24 | -------------------------------------------------------------------------------- /lib/BasicsExtra.elm: -------------------------------------------------------------------------------- 1 | module BasicsExtra exposing (..) 2 | 3 | 4 | roundTo : Int -> Float -> Float 5 | roundTo precision float = 6 | let 7 | factor = 8 | toFloat (10 ^ precision) 9 | in 10 | (float * factor |> round |> toFloat) / factor 11 | 12 | 13 | roundToPadded : Int -> Float -> String 14 | roundToPadded precision float = 15 | let 16 | rounded = 17 | roundTo precision float 18 | 19 | intLength = 20 | truncate (logBase 10 rounded) + 1 21 | 22 | baseString = 23 | toString rounded 24 | 25 | string = 26 | if String.contains "." baseString then 27 | baseString 28 | else 29 | baseString ++ "." 30 | 31 | totalLength = 32 | intLength + 1 + precision 33 | in 34 | string |> String.padRight totalLength '0' 35 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Lifechart 9 | 10 | 11 | 12 | 21 | 22 | 23 | 24 |
25 |
Loading...
26 |
27 | 28 | 29 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /lib/DateExtra.elm: -------------------------------------------------------------------------------- 1 | module DateExtra exposing (..) 2 | 3 | import Date exposing (Date) 4 | import String 5 | 6 | 7 | unsafeFromString : String -> Date 8 | unsafeFromString string = 9 | case Date.fromString string of 10 | Ok date -> 11 | date 12 | 13 | Err msg -> 14 | Debug.crash <| "unsafeFromString: " ++ string 15 | 16 | 17 | fromStringWithFallback : String -> Date -> Date 18 | fromStringWithFallback string fallback = 19 | case Date.fromString string of 20 | Ok date -> 21 | date 22 | 23 | Err _ -> 24 | fallback 25 | 26 | 27 | toISOString : Date -> String 28 | toISOString date = 29 | let 30 | year = 31 | Date.year date 32 | 33 | month = 34 | Date.month date 35 | 36 | day = 37 | Date.day date 38 | in 39 | String.join "-" 40 | [ String.padLeft 4 '0' <| toString year 41 | , String.padLeft 2 '0' <| toString (monthToInt month) 42 | , String.padLeft 2 '0' <| toString day 43 | ] 44 | 45 | 46 | monthToInt : Date.Month -> Int 47 | monthToInt month = 48 | case month of 49 | Date.Jan -> 50 | 1 51 | 52 | Date.Feb -> 53 | 2 54 | 55 | Date.Mar -> 56 | 3 57 | 58 | Date.Apr -> 59 | 4 60 | 61 | Date.May -> 62 | 5 63 | 64 | Date.Jun -> 65 | 6 66 | 67 | Date.Jul -> 68 | 7 69 | 70 | Date.Aug -> 71 | 8 72 | 73 | Date.Sep -> 74 | 9 75 | 76 | Date.Oct -> 77 | 10 78 | 79 | Date.Nov -> 80 | 11 81 | 82 | Date.Dec -> 83 | 12 84 | -------------------------------------------------------------------------------- /src/Lifechart/Serializer.elm: -------------------------------------------------------------------------------- 1 | module Lifechart.Serializer 2 | exposing 3 | ( serialize 4 | , serializeJson 5 | , deserialize 6 | , deserializeJson 7 | ) 8 | 9 | import Color exposing (Color) 10 | import Color.Convert 11 | import Date exposing (Date) 12 | import DateExtra 13 | import Json.Decode as Decode 14 | import Json.Encode as Encode 15 | import Base64 16 | import Lifechart.Model exposing (..) 17 | 18 | 19 | serialize : Model -> String 20 | serialize model = 21 | Base64.encode <| serializeJson model 22 | 23 | 24 | deserialize : String -> Result String Model 25 | deserialize base64 = 26 | case Base64.decode base64 of 27 | Err error -> 28 | Err error 29 | 30 | Ok json -> 31 | deserializeJson json 32 | 33 | 34 | serializeJson : Model -> String 35 | serializeJson model = 36 | Encode.encode 2 <| 37 | Encode.object 38 | [ "birth-date" => encodeDate model.birthDate 39 | , "life-expectancy" => Encode.int model.lifeExpectancy 40 | , "kid-until" => Encode.int model.kidUntil 41 | , "old-from" => Encode.int model.oldFrom 42 | , "only-adult-years" => Encode.bool model.onlyAdultYears 43 | , "events" => (Encode.list <| List.map encodeEvent model.events) 44 | ] 45 | 46 | 47 | jsonDecoder : Decode.Decoder JsonModel 48 | jsonDecoder = 49 | Decode.map6 JsonModel 50 | (Decode.field "birth-date" dateDecoder) 51 | (Decode.field "kid-until" Decode.int) 52 | (Decode.field "old-from" Decode.int) 53 | (Decode.field "life-expectancy" Decode.int) 54 | (Decode.field "only-adult-years" Decode.bool) 55 | (Decode.field "events" <| Decode.list eventDecoder) 56 | 57 | 58 | deserializeJson : String -> Result String Model 59 | deserializeJson json = 60 | case 61 | Decode.decodeString jsonDecoder json 62 | of 63 | Err error -> 64 | Err error 65 | 66 | Ok jsonModel -> 67 | Ok (mergeJsonModel jsonModel) 68 | 69 | 70 | encodeEvent : Event -> Encode.Value 71 | encodeEvent event = 72 | Encode.object 73 | [ "from" => encodeDate event.from 74 | , "to" => encodeDate event.to 75 | , "color" => encodeColor event.color 76 | , "label" => Encode.string event.label 77 | , "overlay" => Encode.bool event.overlay 78 | ] 79 | 80 | 81 | eventDecoder : Decode.Decoder Event 82 | eventDecoder = 83 | Decode.map5 Event 84 | (Decode.field "from" dateDecoder) 85 | (Decode.field "to" dateDecoder) 86 | (Decode.field "color" colorDecoder) 87 | (Decode.field "label" Decode.string) 88 | (Decode.field "overlay" Decode.bool) 89 | 90 | 91 | encodeDate : Date -> Encode.Value 92 | encodeDate date = 93 | Encode.string <| DateExtra.toISOString date 94 | 95 | 96 | dateDecoder : Decode.Decoder Date.Date 97 | dateDecoder = 98 | Decode.string 99 | |> Decode.andThen 100 | (\string -> 101 | case Date.fromString string of 102 | Ok date -> 103 | Decode.succeed date 104 | 105 | Err error -> 106 | Decode.fail error 107 | ) 108 | 109 | 110 | encodeColor : Color -> Encode.Value 111 | encodeColor color = 112 | Encode.string <| Color.Convert.colorToHex color 113 | 114 | 115 | colorDecoder : Decode.Decoder Color 116 | colorDecoder = 117 | Decode.string 118 | |> Decode.andThen 119 | (\hex -> 120 | Color.Convert.hexToColor hex 121 | |> Result.toMaybe 122 | |> Maybe.withDefault fallbackColor 123 | |> Decode.succeed 124 | ) 125 | -------------------------------------------------------------------------------- /src/Lifechart/Model.elm: -------------------------------------------------------------------------------- 1 | module Lifechart.Model exposing (..) 2 | 3 | import Date exposing (Date) 4 | import Color exposing (Color) 5 | import Color.Convert 6 | import Time exposing (Time) 7 | import Navigation 8 | import DateExtra 9 | 10 | 11 | type alias Model = 12 | { birthDate : Date 13 | , birthDateString : String 14 | , kidUntil : Int 15 | , oldFrom : Int 16 | , lifeExpectancy : Int 17 | , lifeExpectancyString : String 18 | , onlyAdultYears : Bool 19 | , events : List Event 20 | , eventFormOpen : Int 21 | , eventForm : EventForm 22 | , modalOpen : Bool 23 | , now : Time 24 | } 25 | 26 | 27 | type alias JsonModel = 28 | { birthDate : Date 29 | , kidUntil : Int 30 | , oldFrom : Int 31 | , lifeExpectancy : Int 32 | , onlyAdultYears : Bool 33 | , events : List Event 34 | } 35 | 36 | 37 | type alias Event = 38 | { from : Date 39 | , to : Date 40 | , color : Color 41 | , label : String 42 | , overlay : Bool 43 | } 44 | 45 | 46 | type alias EventForm = 47 | { from : String 48 | , to : String 49 | , color : String 50 | , label : String 51 | , overlay : Bool 52 | } 53 | 54 | 55 | initialModel : Model 56 | initialModel = 57 | { birthDate = DateExtra.unsafeFromString "1988-07-24" 58 | , birthDateString = "1988-07-24" 59 | , kidUntil = 18 60 | , oldFrom = 70 61 | , lifeExpectancy = 80 62 | , lifeExpectancyString = "80" 63 | , onlyAdultYears = False 64 | , events = [] 65 | , eventFormOpen = -1 66 | , eventForm = EventForm "" "" "" "" False 67 | , modalOpen = False 68 | , now = 0 69 | } 70 | 71 | 72 | mergeJsonModel : JsonModel -> Model 73 | mergeJsonModel jsonModel = 74 | { initialModel 75 | | birthDate = jsonModel.birthDate 76 | , birthDateString = DateExtra.toISOString jsonModel.birthDate 77 | , kidUntil = jsonModel.kidUntil 78 | , oldFrom = jsonModel.oldFrom 79 | , lifeExpectancy = jsonModel.lifeExpectancy 80 | , lifeExpectancyString = toString jsonModel.lifeExpectancy 81 | , onlyAdultYears = jsonModel.onlyAdultYears 82 | , events = jsonModel.events 83 | } 84 | 85 | 86 | mergeModel : Model -> Model -> Model 87 | mergeModel baseModel newModel = 88 | { newModel 89 | | eventFormOpen = baseModel.eventFormOpen 90 | , eventForm = baseModel.eventForm 91 | , modalOpen = baseModel.modalOpen 92 | , now = baseModel.now 93 | } 94 | 95 | 96 | initialEventForm : Model -> EventForm 97 | initialEventForm model = 98 | { from = DateExtra.toISOString <| Date.fromTime model.now 99 | , to = DateExtra.toISOString <| Date.fromTime model.now 100 | , label = "" 101 | , overlay = False 102 | , color = Color.Convert.colorToHex fallbackColor 103 | } 104 | 105 | 106 | createEvent : EventForm -> Event 107 | createEvent form = 108 | { from = DateExtra.fromStringWithFallback form.from (Date.fromTime 0) 109 | , to = DateExtra.fromStringWithFallback form.to (Date.fromTime 0) 110 | , label = form.label 111 | , overlay = form.overlay 112 | , color = 113 | Color.Convert.hexToColor form.color 114 | |> Result.toMaybe 115 | |> Maybe.withDefault fallbackColor 116 | } 117 | 118 | 119 | fallbackColor : Color 120 | fallbackColor = 121 | Color.red 122 | 123 | 124 | type NewEventField 125 | = EventFrom 126 | | EventTo 127 | | EventColor 128 | | EventLabel 129 | 130 | 131 | type Msg 132 | = Tick Time 133 | | NewUrl Navigation.Location 134 | | NewBirthDate String 135 | | NewLifeExpectancy String 136 | | OnlyAdultYears Bool 137 | | ShowEventForm Int 138 | | UpdateEvent NewEventField String 139 | | UpdateEventOverlay Bool 140 | | SaveEvent 141 | | DeleteEvent 142 | | NewConfig String 143 | | ToggleModal 144 | 145 | 146 | relativeBirthDate : Model -> Date 147 | relativeBirthDate model = 148 | if model.onlyAdultYears then 149 | partialDate model (Date.year model.birthDate + model.kidUntil) 150 | else 151 | model.birthDate 152 | 153 | 154 | relativeDeathDate : Model -> Date 155 | relativeDeathDate model = 156 | if model.onlyAdultYears then 157 | partialDate model (Date.year model.birthDate + maxOldFrom model) 158 | else 159 | partialDate model (Date.year model.birthDate + model.lifeExpectancy) 160 | 161 | 162 | maxKidUntil : Model -> Int 163 | maxKidUntil model = 164 | Basics.min model.lifeExpectancy model.kidUntil 165 | 166 | 167 | maxOldFrom : Model -> Int 168 | maxOldFrom model = 169 | Basics.min model.lifeExpectancy model.oldFrom 170 | 171 | 172 | partialDate : Model -> Int -> Date 173 | partialDate model year = 174 | DateExtra.unsafeFromString <| 175 | String.join "-" 176 | [ toString year 177 | , toString <| DateExtra.monthToInt <| Date.month model.birthDate 178 | , toString <| Date.day model.birthDate 179 | ] 180 | 181 | 182 | eventInitial : Event -> String 183 | eventInitial event = 184 | event.label |> String.left 1 |> String.toUpper 185 | 186 | 187 | (=>) : a -> b -> ( a, b ) 188 | (=>) = 189 | (,) 190 | -------------------------------------------------------------------------------- /src/Lifechart/Update.elm: -------------------------------------------------------------------------------- 1 | module Lifechart.Update exposing (init, update) 2 | 3 | import Navigation 4 | import Date 5 | import DateExtra 6 | import Time 7 | import Task 8 | import Regex 9 | import Color.Convert 10 | import Lifechart.Model exposing (..) 11 | import Lifechart.Serializer as Serializer 12 | 13 | 14 | init : Navigation.Location -> ( Model, Cmd Msg ) 15 | init location = 16 | let 17 | model = 18 | decodeModel location |> Result.toMaybe |> Maybe.withDefault initialModel 19 | in 20 | ( model, Task.perform Tick Time.now ) 21 | 22 | 23 | update : Msg -> Model -> ( Model, Cmd Msg ) 24 | update msg model = 25 | case msg of 26 | Tick time -> 27 | ( { model | now = time }, Cmd.none ) 28 | 29 | NewUrl location -> 30 | let 31 | newModel = 32 | case decodeModel location of 33 | Ok urlModel -> 34 | mergeModel model urlModel 35 | 36 | Err _ -> 37 | model 38 | in 39 | ( newModel, Cmd.none ) 40 | 41 | NewBirthDate string -> 42 | let 43 | stringModel = 44 | { model | birthDateString = string } 45 | 46 | validFormat = 47 | Regex.contains (Regex.regex "^\\d{4}-\\d{2}-\\d{2}$") string 48 | 49 | -- XXX: we need this pre-check for browsers without support for 50 | -- input[type='date'] which may send garbage as the date string 51 | date = 52 | if validFormat then 53 | Date.fromString string 54 | else 55 | Err "" 56 | in 57 | case date of 58 | Ok date -> 59 | let 60 | newModel = 61 | { stringModel | birthDate = date } 62 | in 63 | ( newModel, updateUrl newModel ) 64 | 65 | Err _ -> 66 | ( stringModel, Cmd.none ) 67 | 68 | NewLifeExpectancy string -> 69 | let 70 | stringModel = 71 | { model | lifeExpectancyString = string } 72 | 73 | int = 74 | String.toInt string |> Result.toMaybe |> Maybe.withDefault 0 75 | in 76 | if int < minLifeExpectancy model || int > 500 then 77 | ( stringModel, Cmd.none ) 78 | else 79 | let 80 | newModel = 81 | { stringModel | lifeExpectancy = int } 82 | in 83 | ( newModel, updateUrl newModel ) 84 | 85 | OnlyAdultYears bool -> 86 | let 87 | -- TODO: fix this dirty hack somehow 88 | tempModel = 89 | { model | onlyAdultYears = bool } 90 | 91 | newModel = 92 | { tempModel 93 | | lifeExpectancy = 94 | Basics.max tempModel.lifeExpectancy (minLifeExpectancy tempModel) 95 | } 96 | in 97 | ( newModel, updateUrl newModel ) 98 | 99 | ShowEventForm id -> 100 | let 101 | newId = 102 | if model.eventFormOpen == id then 103 | -1 104 | else 105 | id 106 | 107 | event = 108 | List.take newId model.events |> List.reverse |> List.head 109 | 110 | eventForm = 111 | case event of 112 | Nothing -> 113 | initialEventForm model 114 | 115 | Just event -> 116 | { from = DateExtra.toISOString event.from 117 | , to = DateExtra.toISOString event.to 118 | , color = Color.Convert.colorToHex event.color 119 | , label = event.label 120 | , overlay = event.overlay 121 | } 122 | in 123 | ( { model | eventFormOpen = newId, eventForm = eventForm }, Cmd.none ) 124 | 125 | UpdateEvent field value -> 126 | let 127 | form = 128 | model.eventForm 129 | 130 | -- TODO: this is kinda gross, is there a better way? 131 | newForm = 132 | case field of 133 | EventFrom -> 134 | { form | from = value } 135 | 136 | EventTo -> 137 | { form | to = value } 138 | 139 | EventColor -> 140 | { form | color = value } 141 | 142 | EventLabel -> 143 | { form | label = value } 144 | in 145 | ( { model | eventForm = newForm }, Cmd.none ) 146 | 147 | UpdateEventOverlay bool -> 148 | let 149 | form = 150 | model.eventForm 151 | 152 | newForm = 153 | { form | overlay = bool } 154 | in 155 | ( { model | eventForm = newForm }, Cmd.none ) 156 | 157 | SaveEvent -> 158 | let 159 | existingEvent = 160 | model.eventFormOpen /= 0 161 | 162 | currentEvent = 163 | createEvent model.eventForm 164 | 165 | otherEvents = 166 | if existingEvent then 167 | deleteItem (model.eventFormOpen - 1) model.events 168 | else 169 | model.events 170 | 171 | events = 172 | (currentEvent :: otherEvents) 173 | |> List.sortBy (\event -> DateExtra.toISOString event.from) 174 | 175 | newModel = 176 | { model | events = events, eventFormOpen = -1 } 177 | in 178 | ( newModel, updateUrl newModel ) 179 | 180 | DeleteEvent -> 181 | let 182 | events = 183 | deleteItem (model.eventFormOpen - 1) model.events 184 | 185 | newModel = 186 | { model | events = events, eventFormOpen = -1 } 187 | in 188 | ( newModel, updateUrl newModel ) 189 | 190 | NewConfig json -> 191 | let 192 | newModel = 193 | case Serializer.deserializeJson json of 194 | Ok jsonModel -> 195 | mergeModel model jsonModel 196 | 197 | Err _ -> 198 | model 199 | in 200 | ( newModel, updateUrl newModel ) 201 | 202 | ToggleModal -> 203 | ( { model | modalOpen = not model.modalOpen }, Cmd.none ) 204 | 205 | 206 | decodeModel : Navigation.Location -> Result String Model 207 | decodeModel location = 208 | let 209 | dataWithoutHash = 210 | String.dropLeft 1 location.hash 211 | in 212 | if String.isEmpty dataWithoutHash then 213 | Ok initialModel 214 | else 215 | Serializer.deserialize dataWithoutHash 216 | 217 | 218 | updateUrl : Model -> Cmd Msg 219 | updateUrl model = 220 | let 221 | base64 = 222 | Serializer.serialize model 223 | 224 | url = 225 | "#" ++ base64 226 | in 227 | Navigation.newUrl url 228 | 229 | 230 | minLifeExpectancy : Model -> Int 231 | minLifeExpectancy model = 232 | if model.onlyAdultYears then 233 | model.kidUntil 234 | else 235 | 1 236 | 237 | 238 | deleteItem : Int -> List a -> List a 239 | deleteItem index list = 240 | List.indexedMap 241 | (\i -> 242 | \item -> 243 | if i == index then 244 | Nothing 245 | else 246 | Just item 247 | ) 248 | list 249 | |> List.filterMap identity 250 | -------------------------------------------------------------------------------- /src/Lifechart/View/Canvas.elm: -------------------------------------------------------------------------------- 1 | module Lifechart.View.Canvas exposing (canvas) 2 | 3 | import Html exposing (..) 4 | import Collage exposing (Form, LineStyle) 5 | import Element exposing (Element) 6 | import Text exposing (Text) 7 | import Color exposing (Color) 8 | import Color.Interpolate 9 | import Date exposing (Date) 10 | import Time exposing (Time) 11 | import DateExtra 12 | import Lifechart.Model as Model exposing (..) 13 | 14 | 15 | lineHeight : number 16 | lineHeight = 17 | 16 18 | 19 | 20 | canvasHeight : number -> Float 21 | canvasHeight lifeExpectancy = 22 | lifeExpectancy * (weekWidth + weekBorder * 2) 23 | 24 | 25 | canvasWidth : number 26 | canvasWidth = 27 | indexWidth + 52 * (weekWidth + weekBorder * 2) + legendWidth 28 | 29 | 30 | indexWidth : number 31 | indexWidth = 32 | 60 33 | 34 | 35 | legendWidth : number 36 | legendWidth = 37 | 20 38 | 39 | 40 | weekWidth : number 41 | weekWidth = 42 | 10 43 | 44 | 45 | weekBorder : number 46 | weekBorder = 47 | 1 48 | 49 | 50 | oneDay : number 51 | oneDay = 52 | 86400 * 1000 53 | 54 | 55 | oneWeek : number 56 | oneWeek = 57 | oneDay * 7 58 | 59 | 60 | canvas : Model -> Html Msg 61 | canvas model = 62 | let 63 | height = 64 | lineHeight * 2 + canvasHeight model.lifeExpectancy 65 | 66 | grid = 67 | Collage.group (years model) 68 | |> Collage.moveX (-canvasWidth / 2) 69 | |> Collage.moveY (height / 2) 70 | 71 | theLegend = 72 | legend model 73 | |> Collage.moveX (canvasWidth / 2 - legendWidth + lineHeight) 74 | 75 | form = 76 | if model.onlyAdultYears then 77 | Collage.group [ grid ] 78 | else 79 | Collage.group [ grid, theLegend ] 80 | in 81 | Collage.collage canvasWidth (ceiling height) [ form ] |> Element.toHtml 82 | 83 | 84 | legend : Model -> Form 85 | legend model = 86 | let 87 | makeText text = 88 | Text.fromString text 89 | |> Collage.text 90 | |> Collage.rotate (degrees -90) 91 | 92 | ( textOffset, markOffset ) = 93 | ( 11, 6 ) 94 | 95 | ( kidUntil, oldFrom, lifeExpectancy ) = 96 | ( toFloat model.kidUntil 97 | , toFloat model.oldFrom 98 | , toFloat model.lifeExpectancy 99 | ) 100 | 101 | maxKidUntil = 102 | Model.maxKidUntil model |> toFloat 103 | 104 | kid = 105 | makeText "kid" 106 | |> Collage.moveY 107 | (canvasHeight ((lifeExpectancy - maxKidUntil) / 2) - textOffset) 108 | 109 | kidMark = 110 | Collage.rect 10 1 111 | |> Collage.filled Color.black 112 | |> Collage.moveX -2 113 | |> Collage.moveY 114 | (canvasHeight (lifeExpectancy / 2 - kidUntil) - markOffset) 115 | 116 | maxOldFrom = 117 | Model.maxOldFrom model |> toFloat 118 | 119 | adult = 120 | if maxOldFrom - kidUntil < 8 then 121 | makeText "" 122 | else 123 | makeText "adult years" 124 | |> Collage.moveY 125 | (canvasHeight (lifeExpectancy / 2 - (kidUntil + maxOldFrom) / 2) - textOffset) 126 | 127 | oldMark = 128 | Collage.rect 10 1 129 | |> Collage.filled Color.black 130 | |> Collage.moveX -2 131 | |> Collage.moveY 132 | -(canvasHeight (oldFrom - lifeExpectancy / 2) + markOffset) 133 | 134 | old = 135 | if lifeExpectancy - oldFrom < 1 then 136 | makeText "" 137 | else 138 | makeText "old" 139 | |> Collage.moveY 140 | -(canvasHeight ((lifeExpectancy + oldFrom) / 2 - lifeExpectancy / 2) + textOffset) 141 | in 142 | Collage.group [ kid, kidMark, adult, oldMark, old ] 143 | 144 | 145 | years : Model -> List Form 146 | years model = 147 | let 148 | makeYear i = 149 | Collage.group (year model i) 150 | |> Collage.moveY 151 | ((0 - toFloat (i - from + 1)) * (weekWidth + weekBorder * 2) - lineHeight) 152 | 153 | ( from, to ) = 154 | if model.onlyAdultYears then 155 | ( model.kidUntil, maxOldFrom model ) 156 | else 157 | ( 0, model.lifeExpectancy ) 158 | in 159 | weekIndexes :: (List.range from to |> List.map makeYear) 160 | 161 | 162 | weekIndexes : Form 163 | weekIndexes = 164 | let 165 | makeIndex i = 166 | Text.fromString (toString i) 167 | |> Collage.text 168 | |> Collage.moveX (toFloat i * (weekWidth + weekBorder * 2)) 169 | in 170 | List.range 1 52 171 | |> List.filter (\i -> i % 2 /= 0) 172 | |> List.map makeIndex 173 | |> Collage.group 174 | |> Collage.move ( indexWidth, -10 ) 175 | 176 | 177 | year : Model -> Int -> List Form 178 | year model index = 179 | let 180 | year = 181 | Date.year model.birthDate + index 182 | 183 | paddedIndex = 184 | String.padLeft 2 '0' (toString index) 185 | 186 | label = 187 | Text.fromString (toString year ++ " / " ++ paddedIndex) 188 | |> Collage.text 189 | |> Collage.move ( 32, 2 ) 190 | 191 | makeWeek i = 192 | week model index i 193 | |> Collage.moveX 194 | (toFloat i * (weekWidth + weekBorder * 2) + indexWidth) 195 | in 196 | label :: (List.range 1 52 |> List.map makeWeek) 197 | 198 | 199 | week : Model -> Int -> Int -> Form 200 | week model year week = 201 | let 202 | time = 203 | yearWeekToTime model ( year, week ) 204 | 205 | match event = 206 | (Date.toTime event.from <= time) && (Date.toTime event.to >= time) 207 | 208 | ( overlays, events ) = 209 | List.filter match model.events |> List.partition .overlay 210 | 211 | weekColor = 212 | List.map .color events |> mixColors 213 | 214 | initial = 215 | List.head overlays |> Maybe.andThen makeInitial 216 | 217 | makeInitial event = 218 | Just 219 | (eventInitial event 220 | |> Text.fromString 221 | |> Text.monospace 222 | |> Text.height weekWidth 223 | |> Text.bold 224 | |> Text.color Color.white 225 | |> Collage.text 226 | |> Collage.moveY 1 227 | ) 228 | 229 | square color = 230 | Collage.square weekWidth |> Collage.filled color 231 | 232 | filled color = 233 | case initial of 234 | Nothing -> 235 | square color 236 | 237 | Just initial -> 238 | Collage.group [ square color, initial ] 239 | 240 | outlined = 241 | Collage.square (weekWidth - weekBorder) |> Collage.outlined lineStyle 242 | in 243 | if isCurrentWeek model time then 244 | filled Color.black |> Collage.alpha 0.5 245 | else 246 | case weekColor of 247 | Nothing -> 248 | if outOfBounds model time then 249 | filled Color.lightGrey 250 | else if isKid model time || isOld model time then 251 | filled Color.grey 252 | else if isPast model time then 253 | filled Color.black 254 | else 255 | outlined 256 | 257 | Just color -> 258 | filled color 259 | 260 | 261 | mixColors : List Color -> Maybe Color 262 | mixColors colors = 263 | case colors of 264 | [] -> 265 | Nothing 266 | 267 | firstColor :: otherColors -> 268 | Just <| 269 | List.foldl 270 | (\oldColor -> 271 | \newColor -> 272 | Color.Interpolate.interpolate 273 | Color.Interpolate.HSL 274 | oldColor 275 | newColor 276 | 0.5 277 | ) 278 | firstColor 279 | otherColors 280 | 281 | 282 | outOfBounds : Model -> Time -> Bool 283 | outOfBounds model time = 284 | (time < Date.toTime (relativeBirthDate model)) 285 | || (time > Date.toTime (relativeDeathDate model)) 286 | 287 | 288 | isCurrentWeek : Model -> Time -> Bool 289 | isCurrentWeek model time = 290 | let 291 | now = 292 | model.now 293 | 294 | halfWeek = 295 | oneWeek / 2 296 | in 297 | now - halfWeek <= time && time < now + halfWeek 298 | 299 | 300 | isPast : Model -> Time -> Bool 301 | isPast model time = 302 | time < model.now 303 | 304 | 305 | isKid : Model -> Time -> Bool 306 | isKid model time = 307 | let 308 | kidDate = 309 | partialDate model (Date.year (relativeBirthDate model) + model.kidUntil) 310 | in 311 | if model.onlyAdultYears then 312 | False 313 | else 314 | Date.toTime kidDate >= time 315 | 316 | 317 | isOld : Model -> Time -> Bool 318 | isOld model time = 319 | let 320 | oldDate = 321 | partialDate model (Date.year (relativeBirthDate model) + model.oldFrom) 322 | in 323 | if model.onlyAdultYears then 324 | False 325 | else 326 | Date.toTime oldDate <= time 327 | 328 | 329 | yearWeekToTime : Model -> ( Int, Int ) -> Time 330 | yearWeekToTime model ( year, week ) = 331 | let 332 | currentYear = 333 | Date.year model.birthDate + year 334 | 335 | beginningOfYear = 336 | DateExtra.unsafeFromString <| toString currentYear ++ "-01-01" 337 | 338 | firstMondayOffset = 339 | case Date.dayOfWeek beginningOfYear of 340 | Date.Mon -> 341 | 0 342 | 343 | Date.Tue -> 344 | 1 345 | 346 | Date.Wed -> 347 | 2 348 | 349 | Date.Thu -> 350 | 3 351 | 352 | Date.Fri -> 353 | 4 354 | 355 | Date.Sat -> 356 | 5 357 | 358 | Date.Sun -> 359 | 6 360 | 361 | yearOffset = 362 | toFloat (week - 1) * oneWeek + toFloat firstMondayOffset * oneDay 363 | in 364 | Date.toTime beginningOfYear + yearOffset 365 | 366 | 367 | lineStyle : LineStyle 368 | lineStyle = 369 | let 370 | default = 371 | Collage.defaultLine 372 | in 373 | { default | width = weekBorder } 374 | -------------------------------------------------------------------------------- /src/Lifechart/View/Controls.elm: -------------------------------------------------------------------------------- 1 | module Lifechart.View.Controls exposing (controls, modal) 2 | 3 | import Date exposing (Date) 4 | import Time exposing (Time) 5 | import BasicsExtra exposing (roundToPadded) 6 | import DateExtra 7 | import Color.Convert 8 | import Html exposing (..) 9 | import Html.Attributes exposing (..) 10 | import Html.Events exposing (..) 11 | import Lifechart.Model exposing (..) 12 | import Lifechart.Serializer as Serializer 13 | import Lifechart.Demo as Demo 14 | 15 | 16 | modal : Model -> Html Msg 17 | modal model = 18 | let 19 | open = 20 | if model.modalOpen then 21 | "block" 22 | else 23 | "none" 24 | 25 | json = 26 | Serializer.serializeJson model 27 | in 28 | div 29 | [ style [ "display" => open ], class "modal in" ] 30 | [ div [ class "modal-dialog" ] 31 | [ div [ class "modal-content" ] 32 | [ div [ class "modal-body" ] 33 | [ div 34 | [ class "mb-1" ] 35 | [ text "You can copy/paste JSON below to export/import data." ] 36 | , textarea 37 | [ class "form-control" 38 | , rows 20 39 | , onInput NewConfig 40 | ] 41 | [ text json ] 42 | ] 43 | , div [ class "modal-footer" ] 44 | [ button 45 | [ type_ "button" 46 | , class "btn btn-primary" 47 | , onClick ToggleModal 48 | ] 49 | [ text "Close" ] 50 | ] 51 | ] 52 | ] 53 | ] 54 | 55 | 56 | controls : Model -> Html Msg 57 | controls model = 58 | div [] <| 59 | List.concat 60 | [ [ h1 [ class "text-center mb-2" ] [ text "Spend your time wisely." ] ] 61 | , [ div [ class "text-center text-muted mb-1" ] [ text "This will either inspire you or terrify you - hopefully the former." ] ] 62 | , links model 63 | , config model 64 | , metrics model 65 | , events model 66 | , footer 67 | ] 68 | 69 | 70 | links : Model -> List (Html Msg) 71 | links model = 72 | let 73 | current = 74 | Serializer.serialize model 75 | in 76 | [ ul [ class "nav justify-content-center mb-2" ] 77 | [ li [ class "nav-item" ] 78 | [ a [ class "nav-link active", href "#" ] [ text "blank chart" ] ] 79 | , li [ class "nav-item" ] 80 | [ a [ class "nav-link", href <| "#" ++ Demo.base64 ] [ text "demo chart" ] ] 81 | , li [ class "nav-item" ] 82 | [ a [ class "nav-link", href <| "#" ++ current ] [ text "bookmark your own chart" ] ] 83 | ] 84 | ] 85 | 86 | 87 | circled : Attribute Msg 88 | circled = 89 | style 90 | [ ( "background", "#D3D7CF" ) 91 | , ( "border-radius", "1rem" ) 92 | , ( "padding", "0 0.35rem" ) 93 | , ( "margin-left", "0.2rem" ) 94 | ] 95 | 96 | 97 | config : Model -> List (Html Msg) 98 | config model = 99 | [ div [ class "row form-group" ] 100 | [ label [ class "col-5 col-form-label col-form-label-lg" ] [ text "Date of Birth" ] 101 | , div [ class "col-7" ] 102 | [ input 103 | (List.append dateInputAttributes 104 | [ class "form-control form-control-lg" 105 | , value model.birthDateString 106 | , Html.Attributes.max <| DateExtra.toISOString <| Date.fromTime model.now 107 | , onInput NewBirthDate 108 | ] 109 | ) 110 | [] 111 | ] 112 | ] 113 | , div [ class "row form-group" ] 114 | [ label [ class "col-5 col-form-label col-form-label-lg" ] 115 | [ text "Life Expectancy " 116 | , a 117 | [ href 118 | "https://en.wikipedia.org/wiki/List_of_countries_by_life_expectancy" 119 | , target "_blank" 120 | , circled 121 | ] 122 | [ text "?" ] 123 | ] 124 | , div [ class "col-7" ] 125 | [ input 126 | [ class "form-control form-control-lg" 127 | , type_ "number" 128 | , required True 129 | , value model.lifeExpectancyString 130 | , Html.Attributes.min "1" 131 | , Html.Attributes.max "500" 132 | , onInput NewLifeExpectancy 133 | ] 134 | [] 135 | ] 136 | ] 137 | , div [ class "row form-group" ] 138 | [ label [ class "col-5 col-form-label col-form-label-lg" ] 139 | [ text "Non-Adult Years " 140 | , a 141 | [ href 142 | "https://www.reddit.com/r/GetMotivated/comments/1vyf9r/made_for_myself_thought_of_you_weeks_left/cexas8u/" 143 | , target "_blank" 144 | , circled 145 | ] 146 | [ text "?" ] 147 | ] 148 | , div [ class "col-7" ] 149 | [ label [ class "form-check-inline form-control-lg" ] 150 | [ input 151 | [ class "form-check-input" 152 | , type_ "radio" 153 | , checked <| not model.onlyAdultYears 154 | , onClick <| OnlyAdultYears False 155 | ] 156 | [] 157 | , text " Show" 158 | ] 159 | , label [ class "form-check-inline form-control-lg" ] 160 | [ input 161 | [ class "form-check-input" 162 | , type_ "radio" 163 | , checked model.onlyAdultYears 164 | , onClick <| OnlyAdultYears True 165 | ] 166 | [] 167 | , text " Hide" 168 | ] 169 | ] 170 | ] 171 | ] 172 | 173 | 174 | newEvent : Model -> List (Html Msg) 175 | newEvent model = 176 | [ li [ class "list-group-item" ] 177 | [ h5 [ class "mb-0" ] 178 | [ span [] [ text "Events" ] 179 | , a 180 | [ href "javascript:void(0)" 181 | , onClick (ShowEventForm 0) 182 | , class "float-right" 183 | ] 184 | [ text "Add event" ] 185 | ] 186 | ] 187 | , eventForm model 0 188 | ] 189 | 190 | 191 | eventForm : Model -> Int -> Html Msg 192 | eventForm model index = 193 | let 194 | event = 195 | model.eventForm 196 | 197 | visibility = 198 | if model.eventFormOpen == index then 199 | "" 200 | else 201 | " d-none" 202 | 203 | newEvent = 204 | index == 0 205 | 206 | delete = 207 | a 208 | [ class "btn btn-danger" 209 | , href "javascript:void(0)" 210 | , onClick DeleteEvent 211 | ] 212 | [ text "Delete" ] 213 | 214 | submit = 215 | input 216 | [ class "btn btn-primary ml-1" 217 | , type_ "submit" 218 | , value 219 | (if newEvent then 220 | "Add" 221 | else 222 | "Save" 223 | ) 224 | ] 225 | [] 226 | 227 | actions = 228 | if newEvent then 229 | [ submit ] 230 | else 231 | [ delete, submit ] 232 | in 233 | li [ class <| "list-group-item" ++ visibility ] 234 | [ Html.form [ onSubmit SaveEvent ] 235 | [ div [ class "row form-group" ] 236 | [ div [ class "col" ] 237 | [ div [ class "input-group" ] 238 | [ div [ class "input-group-prepend" ] 239 | [ div [ class "input-group-text" ] [ text "From" ] 240 | ] 241 | , input 242 | (List.append dateInputAttributes 243 | [ class "form-control" 244 | , value event.from 245 | , Html.Attributes.max event.to 246 | , onInput (UpdateEvent EventFrom) 247 | ] 248 | ) 249 | [] 250 | ] 251 | ] 252 | , div [ class "col" ] 253 | [ div [ class "input-group" ] 254 | [ div [ class "input-group-prepend" ] 255 | [ div [ class "input-group-text" ] [ text "To" ] 256 | ] 257 | , input 258 | (List.append dateInputAttributes 259 | [ class "form-control" 260 | , value event.to 261 | , Html.Attributes.min event.from 262 | , onInput (UpdateEvent EventTo) 263 | ] 264 | ) 265 | [] 266 | ] 267 | ] 268 | ] 269 | , div [ class "row form-group" ] 270 | [ div [ class "col" ] 271 | [ div [ class "input-group" ] 272 | [ div [ class "input-group-prepend" ] 273 | [ div [ class "input-group-text" ] [ text "Label" ] 274 | ] 275 | , input 276 | [ class "form-control" 277 | , placeholder "label" 278 | , type_ "text" 279 | , required True 280 | , value event.label 281 | , onInput (UpdateEvent EventLabel) 282 | ] 283 | [] 284 | ] 285 | ] 286 | , div [ class "col" ] 287 | [ label 288 | [ class "form-check-inline" 289 | , style [ "line-height" => "2.5rem" ] 290 | ] 291 | [ input 292 | [ class "form-check-input" 293 | , type_ "checkbox" 294 | , checked event.overlay 295 | , onCheck UpdateEventOverlay 296 | ] 297 | [] 298 | , text " overlay" 299 | ] 300 | , input 301 | [ class <| 302 | "float-right" 303 | ++ if event.overlay then 304 | " d-none" 305 | else 306 | "" 307 | , type_ "color" 308 | , required True 309 | , value event.color 310 | , style [ "height" => "2.5rem" ] 311 | , onInput (UpdateEvent EventColor) 312 | ] 313 | [] 314 | ] 315 | ] 316 | , div [ class "row form-group" ] 317 | [ div [ class "col-12 text-right" ] actions 318 | ] 319 | ] 320 | ] 321 | 322 | 323 | events : Model -> List (Html Msg) 324 | events model = 325 | let 326 | makeEvent event index = 327 | [ li [ class "list-group-item" ] 328 | [ div 329 | [ class "row" ] 330 | [ div [ class "col-3" ] 331 | [ eventIcon event 332 | , span [] [ text event.label ] 333 | ] 334 | , div [ class "col-7 text-right text-muted" ] 335 | [ text <| 336 | DateExtra.toISOString event.from 337 | ++ " to " 338 | ++ DateExtra.toISOString event.to 339 | ++ " (" 340 | ++ eventPercentage event model 341 | ++ "%)" 342 | ] 343 | , div [ class "col-2 text-right" ] 344 | [ a 345 | [ href "javascript:void(0)" 346 | , onClick (ShowEventForm index) 347 | ] 348 | [ text "edit" ] 349 | ] 350 | ] 351 | ] 352 | , eventForm model index 353 | ] 354 | 355 | eventIcon event = 356 | div 357 | [ class "float-left" 358 | , style 359 | [ "width" => "1rem" 360 | , "height" => "1rem" 361 | , "line-height" => "1rem" 362 | , "font-weight" => "bold" 363 | , "color" => "#FFFFFF" 364 | , "margin" => "3px 0.5rem 0 0" 365 | , "padding" 366 | => if event.overlay then 367 | "0 0 3px 3px" 368 | else 369 | "0" 370 | , "background-color" 371 | => if event.overlay then 372 | "#000000" 373 | else 374 | Color.Convert.colorToHex event.color 375 | ] 376 | ] 377 | [ text <| 378 | if event.overlay then 379 | eventInitial event 380 | else 381 | "" 382 | ] 383 | 384 | eventPercentage event model = 385 | 100 386 | * (Date.toTime event.to - Date.toTime event.from) 387 | / (Date.toTime (relativeDeathDate model) - Date.toTime (relativeBirthDate model)) 388 | |> roundToPadded 1 389 | 390 | list = 391 | if List.isEmpty events then 392 | [ li [ class "list-group-item" ] 393 | [ div [ class "text-muted text-center" ] [ text "no events yet" ] 394 | ] 395 | ] 396 | else 397 | List.concat <| 398 | List.indexedMap 399 | (\index -> \event -> makeEvent event (index + 1)) 400 | events 401 | 402 | events = 403 | model.events 404 | in 405 | [ div [ class "card mt-4 mb-4" ] 406 | [ ul [ class "list-group list-group-flush" ] <| 407 | List.concat [ newEvent model, list ] 408 | ] 409 | ] 410 | 411 | 412 | metrics : Model -> List (Html Msg) 413 | metrics model = 414 | let 415 | left = 416 | weeksLeft model 417 | 418 | percentage = 419 | 100 420 | * (model.now - Date.toTime (relativeBirthDate model)) 421 | / (Date.toTime (relativeDeathDate model) - Date.toTime (relativeBirthDate model)) 422 | |> clamp 0 100 423 | |> roundToPadded 6 424 | in 425 | [ div [ class "row mt-2" ] 426 | [ div [ class "col" ] 427 | [ h4 [] [ span [ class "badge badge-primary" ] [ text <| percentage ++ "% elapsed" ] ] 428 | ] 429 | , div [ class "col text-right" ] 430 | [ h4 [] [ span [ class "badge badge-primary" ] [ text <| left ++ " weeks left" ] ] 431 | ] 432 | ] 433 | , div [ class "row mt-1" ] 434 | [ div [ class "col-12" ] 435 | [ div 436 | [ class "progress" 437 | , style [ "height" => "1.7rem" ] 438 | ] 439 | [ div 440 | [ class "progress-bar progress-bar-striped progress-bar-animated" 441 | , style [ "width" => (percentage ++ "%") ] 442 | ] 443 | [] 444 | ] 445 | ] 446 | ] 447 | ] 448 | 449 | 450 | footer : List (Html Msg) 451 | footer = 452 | [ div [ class "row mt-1" ] 453 | [ div [ class "col-12" ] 454 | [ div [ class "alert alert-info" ] 455 | [ strong [] [ text "Privacy: " ] 456 | , text "this page runs entirely in your browser so no data is sent to any server." 457 | ] 458 | , p [ class "text-center" ] 459 | [ text "Inspired by " 460 | , a [ href "https://i.imgur.com/67aHKhF.jpg", target "_blank" ] [ text "this chart" ] 461 | , text " - " 462 | , a [ href "http://waitbutwhy.com/2014/05/life-weeks.html", target "_blank" ] [ text "Terrified?" ] 463 | , text " - " 464 | , a [ href "https://github.com/infertux/lifechart", target "_blank" ] [ text "Source code" ] 465 | , text " - " 466 | , a [ href "javascript:void(0)", onClick ToggleModal ] [ text "Export raw data" ] 467 | ] 468 | , div [ class "d-none" ] 469 | [ strong [] [ text "Reminder: " ] 470 | , text "every single person you've ever known will die eventually - and so will you - but " 471 | , a [ href "https://youtu.be/k5RH3BdXDOY", target "_blank" ] [ text "don't worry" ] 472 | , text " :)" 473 | ] 474 | ] 475 | ] 476 | ] 477 | 478 | 479 | dateInputAttributes : List (Attribute Msg) 480 | dateInputAttributes = 481 | [ type_ "date" 482 | , required True 483 | , placeholder "YYYY-MM-DD" 484 | , pattern "[1-2]\\d{3}-[0-1]\\d-[0-3]\\d" 485 | ] 486 | 487 | 488 | weeksLeft : Model -> String 489 | weeksLeft model = 490 | let 491 | left = 492 | Date.toTime (relativeDeathDate model) - model.now 493 | 494 | weeks = 495 | (Time.inHours left) / 24 / 7 |> Basics.max 0 496 | in 497 | roundToPadded 6 weeks 498 | -------------------------------------------------------------------------------- /public/lifechart.min.js: -------------------------------------------------------------------------------- 1 | (function(){"use strict";function r(r){function t(t){return function(e){return r(t,e)}}t.arity=2;t.func=r;return t}function t(r){function t(t){return function(e){return function(n){return r(t,e,n)}}}t.arity=3;t.func=r;return t}function e(r){function t(t){return function(e){return function(n){return function(a){return r(t,e,n,a)}}}}t.arity=4;t.func=r;return t}function n(r){function t(t){return function(e){return function(n){return function(a){return function(o){return r(t,e,n,a,o)}}}}}t.arity=5;t.func=r;return t}function a(r){function t(t){return function(e){return function(n){return function(a){return function(o){return function(c){return r(t,e,n,a,o,c)}}}}}}t.arity=6;t.func=r;return t}function o(r){function t(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return r(t,e,n,a,o,c,u)}}}}}}}t.arity=7;t.func=r;return t}function c(r){function t(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return r(t,e,n,a,o,c,u,i)}}}}}}}}t.arity=8;t.func=r;return t}function u(r){function t(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return function(_){return r(t,e,n,a,o,c,u,i,_)}}}}}}}}}t.arity=9;t.func=r;return t}function i(r,t,e){return r.arity===2?r.func(t,e):r(t)(e)}function _(r,t,e,n){return r.arity===3?r.func(t,e,n):r(t)(e)(n)}function v(r,t,e,n,a){return r.arity===4?r.func(t,e,n,a):r(t)(e)(n)(a)}function l(r,t,e,n,a,o){return r.arity===5?r.func(t,e,n,a,o):r(t)(e)(n)(a)(o)}function f(r,t,e,n,a,o,c){return r.arity===6?r.func(t,e,n,a,o,c):r(t)(e)(n)(a)(o)(c)}function s(r,t,e,n,a,o,c,u){return r.arity===7?r.func(t,e,n,a,o,c,u):r(t)(e)(n)(a)(o)(c)(u)}function d(r,t,e,n,a,o,c,u,i){return r.arity===8?r.func(t,e,n,a,o,c,u,i):r(t)(e)(n)(a)(o)(c)(u)(i)}function h(r,t,e,n,a,o,c,u,i,_){return r.arity===9?r.func(t,e,n,a,o,c,u,i,_):r(t)(e)(n)(a)(o)(c)(u)(i)(_)}var p=function(){var e=32;var n=2;var a={ctor:"_Array",height:0,table:[]};function o(r,t){if(r<0||r>=z(t)){throw new Error("Index "+r+" is out of range. Check the length of "+"your array first or use getMaybe or getWithDefault.")}return c(r,t)}function c(r,t){for(var e=t.height;e>0;e--){var n=r>>e*5;while(t.lengths[n]<=r){n++}if(n>0){r-=t.lengths[n-1]}t=t.table[n]}return t.table[r]}function u(r,t,e){if(r<0||z(e)<=r){return e}return _(r,t,e)}function _(r,t,e){e=P(e);if(e.height===0){e.table[r]=t}else{var n=J(r,e);if(n>0){r-=e.lengths[n-1]}e.table[n]=_(r,t,e.table[n])}return e}function v(r,t){if(r<=0){return a}var n=Math.floor(Math.log(r)/Math.log(e));return l(t,n,0,r)}function l(r,t,n,a){if(t===0){var o=new Array((a-n)%(e+1));for(var c=0;c0?i[c-1]:0)}return{ctor:"_Array",height:t,table:o,lengths:i}}function f(r){if(r.ctor==="[]"){return a}var t=new Array(e);var n=[];var o=0;while(r.ctor!=="[]"){t[o]=r._0;r=r._1;o++;if(o===e){var c={ctor:"_Array",height:0,table:t};s(c,n);t=new Array(e);o=0}}if(o>0){var c={ctor:"_Array",height:0,table:t.splice(0,o)};s(c,n)}for(var u=0;u0){s(n[u],n)}}var i=n[n.length-1];if(i.height>0&&i.table.length===1){return i.table[0]}else{return i}}function s(r,t){var n=r.height;if(t.length===n){var a={ctor:"_Array",height:n+1,table:[],lengths:[]};t.push(a)}t[n].table.push(r);var o=z(r);if(t[n].lengths.length>0){o+=t[n].lengths[t[n].lengths.length-1]}t[n].lengths.push(o);if(t[n].table.length===e){s(t[n],t);t[n]={ctor:"_Array",height:n+1,table:[],lengths:[]}}}function d(r,t){var e=h(r,t);if(e!==null){return e}var n=U(r,t.height);return q(t,n)}function h(r,t){if(t.height===0){if(t.table.length=0;e--){r=t.height===0?mr.Cons(t.table[e],r):g(r,t.table[e])}return r}function m(r,t){var e={ctor:"_Array",height:t.height,table:new Array(t.table.length)};if(t.height>0){e.lengths=t.lengths}for(var n=0;n0){n.lengths=t.lengths}for(var a=0;a0?t.lengths[n-1]:0),t.table[n]);if(n===0){return a}var e={ctor:"_Array",height:t.height,table:t.table.slice(0,n),lengths:t.lengths.slice(0,n)};if(a.table.length>0){e.table[n]=a;e.lengths[n]=z(a)+(n>0?e.lengths[n-1]:0)}return e}function N(r,t){if(r===0){return t}if(t.height===0){var e={ctor:"_Array",height:0};e.table=t.table.slice(r,t.table.length+1);return e}var n=J(r,t);var a=N(r-(n>0?t.lengths[n-1]:0),t.table[n]);if(n===t.table.length-1){return a}var e={ctor:"_Array",height:t.height,table:t.table.slice(n,t.table.length+1),lengths:new Array(t.table.length-n)};e.table[0]=a;var o=0;for(var c=0;c0){var o=z(a[0]);for(var c=0;c0){var u=S(r,t);if(u>n){a=M(a[0],a[1],u)}}return q(a[0],a[1])}function B(r,t){if(r.height===0&&t.height===0){return[r,t]}if(r.height!==1||t.height!==1){if(r.height===t.height){r=P(r);t=P(t);var e=B(D(r),I(t));A(r,e[1]);R(t,e[0])}else if(r.height>t.height){r=P(r);var e=B(D(r),t);A(r,e[0]);t=j(e[1],e[1].height+1)}else{t=P(t);var e=B(r,I(t));var a=e[0].table.length===0?0:1;var o=a===0?1:0;R(t,e[a]);r=j(e[o],e[o].height+1)}}if(r.table.length===0||t.table.length===0){return[r,t]}var c=S(r,t);if(c<=n){return[r,t]}return M(r,t,c)}function A(r,t){var e=r.table.length-1;r.table[e]=t;r.lengths[e]=z(t);r.lengths[e]+=e>0?r.lengths[e-1]:0}function R(r,t){if(t.table.length>0){r.table[0]=t;r.lengths[0]=z(t);var e=z(r.table[0]);for(var n=1;n0){e.lengths=new Array(t)}return e}function M(r,t,n){var a=F(r.height,Math.min(e,r.table.length+t.table.length-n));var o=F(r.height,a.table.length-(r.table.length+t.table.length-n));var c=0;while(C(r.table,t.table,c).table.length%e===0){L(a.table,o.table,c,C(r.table,t.table,c));L(a.lengths,o.lengths,c,C(r.lengths,t.lengths,c));c++}var u=c;var i=new F(r.height-1,0);var _=0;while(c-u-(i.table.length>0?1:0)0){var f=i.lengths.length;for(var s=f;s0?i.lengths[s-1]:0}}_+=l;if(v.table.length<=l){c++;_=0}if(i.table.length===e){O(a,o,u,i);i=F(r.height-1,0);u++}}if(i.table.length>0){O(a,o,u,i);u++}while(c0){t.lengths=r.lengths.slice()}return t}function z(r){if(r.height===0){return r.table.length}else{return r.lengths[r.lengths.length-1]}}function J(r,t){var e=r>>5*t.height;while(t.lengths[e]<=r){e++}return e}function U(r,t){if(t===0){return{ctor:"_Array",height:0,table:[r]}}return{ctor:"_Array",height:t,table:[U(r,t-1)],lengths:[1]}}function j(r,t){if(t===r.height){return r}return{ctor:"_Array",height:t,table:[j(r,t-1)],lengths:[z(r)]}}function q(r,t){return{ctor:"_Array",height:r.height+1,table:[r,t],lengths:[z(r),z(r)+z(t)]}}function W(r){var t=new Array(z(r));H(t,0,r);return t}function H(r,t,e){for(var n=0;n0?u[i-1]:0)}return{ctor:"_Array",height:t,table:c,lengths:u}}return{empty:a,fromList:f,toList:p,initialize:r(v),append:r(E),push:r(d),slice:t(T),get:r(o),set:t(u),map:r(m),indexedMap:r(b),foldl:t(w),foldr:t(k),length:z,toJSArray:W,fromJSArray:Y}}();var g=function(){function e(r,t){return r/t|0}function n(r,t){return r%t}function a(r,t){if(t===0){throw new Error("Cannot perform mod 0. Division by zero error.")}var e=r%t;var n=r===0?0:t>0?r>=0?e:e+t:-a(-r,-t);return n===t?0:n}function o(r,t){return Math.log(t)/Math.log(r)}function c(r){return-r}function u(r){return r<0?-r:r}function i(r,t){return m.cmp(r,t)<0?r:t}function _(r,t){return m.cmp(r,t)>0?r:t}function v(r,t,e){return m.cmp(e,r)<0?r:m.cmp(e,t)>0?t:e}var l=["LT","EQ","GT"];function f(r,t){return{ctor:l[m.cmp(r,t)+1]}}function s(r,t){return r!==t}function d(r){return!r}function h(r){return r===Infinity||r===-Infinity}function p(r){return r|0}function g(r){return r*Math.PI/180}function b(r){return 2*Math.PI*r}function y(r){var t=r._0;var e=r._1;return m.Tuple2(t*Math.cos(e),t*Math.sin(e))}function w(r){var t=r._0;var e=r._1;return m.Tuple2(Math.sqrt(t*t+e*e),Math.atan2(e,t))}return{div:r(e),rem:r(n),mod:r(a),pi:Math.PI,e:Math.E,cos:Math.cos,sin:Math.sin,tan:Math.tan,acos:Math.acos,asin:Math.asin,atan:Math.atan,atan2:r(Math.atan2),degrees:g,turns:b,fromPolar:y,toPolar:w,sqrt:Math.sqrt,logBase:r(o),negate:c,abs:u,min:r(i),max:r(_),clamp:t(v),compare:r(f),xor:r(s),not:d,truncate:p,ceiling:Math.ceil,floor:Math.floor,round:Math.round,toFloat:function(r){return r},isNaN:isNaN,isInfinite:h}}();var m=function(){function t(r,t){var n=[];var a=e(r,t,0,n);var o;while(a&&(o=n.pop())){a=e(o.x,o.y,0,n)}return a}function e(r,t,n,a){if(n>100){a.push({x:r,y:t});return true}if(r===t){return true}if(typeof r!=="object"){if(typeof r==="function"){throw new Error('Trying to use `(==)` on functions. There is no way to know if functions are "the same" in the Elm sense.'+" Read more about this at http://package.elm-lang.org/packages/elm-lang/core/latest/Basics#=="+" which describes why it is this way and what the better version will look like.")}return false}if(r===null||t===null){return false}if(r instanceof Date){return r.getTime()===t.getTime()}if(!("ctor"in r)){for(var o in r){if(!e(r[o],t[o],n+1,a)){return false}}return true}if(r.ctor==="RBNode_elm_builtin"||r.ctor==="RBEmpty_elm_builtin"){r=Ia(r);t=Ia(t)}if(r.ctor==="Set_elm_builtin"){r=_elm_lang$core$Set$toList(r);t=_elm_lang$core$Set$toList(t)}if(r.ctor==="::"){var c=r;var u=t;while(c.ctor==="::"&&u.ctor==="::"){if(!e(c._0,u._0,n+1,a)){return false}c=c._1;u=u._1}return c.ctor===u.ctor}if(r.ctor==="_Array"){var i=p.toJSArray(r);var _=p.toJSArray(t);if(i.length!==_.length){return false}for(var v=0;v=1){i=c(r._0,t._0);if(i!==a)return i;if(_>=2){i=c(r._1,t._1);if(i!==a)return i;if(_>=3){i=c(r._2,t._2);if(i!==a)return i;if(_>=4){i=c(r._3,t._3);if(i!==a)return i;if(_>=5){i=c(r._4,t._4);if(i!==a)return i;if(_>=6){i=c(r._5,t._5);if(i!==a)return i;if(_>=7)throw new Error("Comparison error: "+v)}}}}}}return a}throw new Error("Comparison error: comparison is only defined on ints, "+"floats, times, chars, strings, lists of comparable values, "+"and tuples of comparable values.")}var u={ctor:"_Tuple0"};function i(r,t){return{ctor:"_Tuple2",_0:r,_1:t}}function _(r){return new String(r)}var v=0;function l(r){return v++}function f(r,t){var e={};for(var n in r){e[n]=r[n]}for(var n in t){e[n]=t[n]}return e}var s={ctor:"[]"};function d(r,t){return{ctor:"::",_0:r,_1:t}}function h(r,t){if(typeof r==="string"){return r+t}if(r.ctor==="[]"){return t}var e=d(r._0,s);var n=e;r=r._1;while(r.ctor!=="[]"){n._1=d(r._0,s);r=r._1;n=n._1}n._1=t;return e}function g(r,t){return function(e){throw new Error("Ran into a `Debug.crash` in module `"+r+"` "+b(t)+"\n"+"The message provided by the code author is:\n\n "+e)}}function m(r,t,e){return function(n){throw new Error("Ran into a `Debug.crash` in module `"+r+"`\n\n"+"This was caused by the `case` expression "+b(t)+".\n"+"One of the branches ended with a crash and the following value got through:\n\n "+y(e)+"\n\n"+"The message provided by the code author is:\n\n "+n)}}function b(r){if(r.start.line==r.end.line){return"on line "+r.start.line}return"between lines "+r.start.line+" and "+r.end.line}function y(r){var t=typeof r;if(t==="function"){return""}if(t==="boolean"){return r?"True":"False"}if(t==="number"){return r+""}if(r instanceof String){return"'"+w(r,true)+"'"}if(t==="string"){return'"'+w(r,false)+'"'}if(r===null){return"null"}if(t==="object"&&"ctor"in r){var e=r.ctor.substring(0,5);if(e==="_Tupl"){var n=[];for(var a in r){if(a==="ctor")continue;n.push(y(r[a]))}return"("+n.join(",")+")"}if(e==="_Task"){return""}if(r.ctor==="_Array"){var o=Tt(r);return"Array.fromList "+y(o)}if(r.ctor===""){return""}if(r.ctor==="_Process"){return""}if(r.ctor==="::"){var n="["+y(r._0);r=r._1;while(r.ctor==="::"){n+=","+y(r._0);r=r._1}return n+"]"}if(r.ctor==="[]"){return"[]"}if(r.ctor==="Set_elm_builtin"){return"Set.fromList "+y(_elm_lang$core$Set$toList(r))}if(r.ctor==="RBNode_elm_builtin"||r.ctor==="RBEmpty_elm_builtin"){return"Dict.fromList "+y(Ia(r))}var n="";for(var c in r){if(c==="ctor")continue;var u=y(r[c]);var i=u[0];var _=i==="{"||i==="("||i==="<"||i==='"'||u.indexOf(" ")<0;n+=" "+(_?u:"("+u+")")}return r.ctor+n}if(t==="object"){if(r instanceof Date){return"<"+r.toString()+">"}if(r.elm_web_socket){return""}var n=[];for(var a in r){n.push(a+" = "+y(r[a]))}if(n.length===0){return"{}"}return"{ "+n.join(", ")+" }"}return""}function w(r,t){var e=r.replace(/\\/g,"\\\\").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r").replace(/\v/g,"\\v").replace(/\0/g,"\\0");if(t){return e.replace(/\'/g,"\\'")}else{return e.replace(/\"/g,'\\"')}}return{eq:t,cmp:c,Tuple0:u,Tuple2:i,chr:_,update:f,guid:l,append:r(h),crash:g,crashCase:m,toString:y}}();var b=function(r){r:while(true){var t=r;var e=t._0;r=e;continue r}};var y=r(function(r,t){var e=t;return i(r,e._0,e._1)});var w=t(function(r,t,e){return r({ctor:"_Tuple2",_0:t,_1:e})});var k=t(function(r,t,e){return i(r,e,t)});var T=r(function(r,t){return r});var x=function(r){return r};var N=N||{};N["<|"]=r(function(r,t){return r(t)});var N=N||{};N["|>"]=r(function(r,t){return t(r)});var N=N||{};N[">>"]=t(function(r,t,e){return t(r(e))});var N=N||{};N["<<"]=t(function(r,t,e){return r(t(e))});var N=N||{};N["++"]=m.append;var E=m.toString;var B=g.isInfinite;var A=g.isNaN;var R=g.toFloat;var S=g.ceiling;var C=g.floor;var L=g.truncate;var O=g.round;var F=g.not;var M=g.xor;var N=N||{};N["||"]=g.or;var N=N||{};N["&&"]=g.and;var D=g.max;var I=g.min;var P=g.compare;var N=N||{};N[">="]=g.ge;var N=N||{};N["<="]=g.le;var N=N||{};N[">"]=g.gt;var N=N||{};N["<"]=g.lt;var N=N||{};N["/="]=g.neq;var N=N||{};N["=="]=g.eq;var z=g.e;var J=g.pi;var U=g.clamp;var j=g.logBase;var q=g.abs;var W=g.negate;var H=g.sqrt;var Y=g.atan2;var V=g.atan;var G=g.asin;var Q=g.acos;var $=g.tan;var K=g.sin;var Z=g.cos;var N=N||{};N["^"]=g.exp;var N=N||{};N["%"]=g.mod;var X=g.rem;var N=N||{};N["//"]=g.div;var N=N||{};N["/"]=g.floatDiv;var N=N||{};N["*"]=g.mul;var N=N||{};N["-"]=g.sub;var N=N||{};N["+"]=g.add;var rr=g.toPolar;var tr=g.fromPolar;var er=g.turns;var nr=g.degrees;var ar=function(r){return r};var or={ctor:"GT"};var cr={ctor:"EQ"};var ur={ctor:"LT"};var ir=function(r){return{ctor:"JustOneMore",_0:r}};var _r=r(function(r,t){var e=t;if(e.ctor==="Just"){return e._0}else{return r}});var vr={ctor:"Nothing"};var lr=r(function(r,t){var e=t;if(e.ctor==="Just"){return r(e._0)}else{return vr}});var fr=function(r){return{ctor:"Just",_0:r}};var sr=r(function(r,t){var e=t;if(e.ctor==="Just"){return fr(r(e._0))}else{return vr}});var dr=t(function(r,t,e){var n={ctor:"_Tuple2",_0:t,_1:e};if(n.ctor==="_Tuple2"&&n._0.ctor==="Just"&&n._1.ctor==="Just"){return fr(i(r,n._0._0,n._1._0))}else{return vr}});var hr=e(function(r,t,e,n){var a={ctor:"_Tuple3",_0:t,_1:e,_2:n};if(a.ctor==="_Tuple3"&&a._0.ctor==="Just"&&a._1.ctor==="Just"&&a._2.ctor==="Just"){return fr(_(r,a._0._0,a._1._0,a._2._0))}else{return vr}});var pr=n(function(r,t,e,n,a){var o={ctor:"_Tuple4",_0:t,_1:e,_2:n,_3:a};if(o.ctor==="_Tuple4"&&o._0.ctor==="Just"&&o._1.ctor==="Just"&&o._2.ctor==="Just"&&o._3.ctor==="Just"){return fr(v(r,o._0._0,o._1._0,o._2._0,o._3._0))}else{return vr}});var gr=a(function(r,t,e,n,a,o){var c={ctor:"_Tuple5",_0:t,_1:e,_2:n,_3:a,_4:o};if(c.ctor==="_Tuple5"&&c._0.ctor==="Just"&&c._1.ctor==="Just"&&c._2.ctor==="Just"&&c._3.ctor==="Just"&&c._4.ctor==="Just"){return fr(l(r,c._0._0,c._1._0,c._2._0,c._3._0,c._4._0))}else{return vr}});var mr=function(){var o={ctor:"[]"};function c(r,t){return{ctor:"::",_0:r,_1:t}}function u(r){var t=o;for(var e=r.length;e--;){t=c(r[e],t)}return t}function f(r){var t=[];while(r.ctor!=="[]"){t.push(r._0);r=r._1}return t}function s(r,t,e){var n=f(e);var a=t;for(var o=n.length;o--;){a=i(r,n[o],a)}return a}function d(r,t,e){var n=[];while(t.ctor!=="[]"&&e.ctor!=="[]"){n.push(i(r,t._0,e._0));t=t._1;e=e._1}return u(n)}function h(r,t,e,n){var a=[];while(t.ctor!=="[]"&&e.ctor!=="[]"&&n.ctor!=="[]"){a.push(_(r,t._0,e._0,n._0));t=t._1;e=e._1;n=n._1}return u(a)}function p(r,t,e,n,a){var o=[];while(t.ctor!=="[]"&&e.ctor!=="[]"&&n.ctor!=="[]"&&a.ctor!=="[]"){o.push(v(r,t._0,e._0,n._0,a._0));t=t._1;e=e._1;n=n._1;a=a._1}return u(o)}function g(r,t,e,n,a,o){var c=[];while(t.ctor!=="[]"&&e.ctor!=="[]"&&n.ctor!=="[]"&&a.ctor!=="[]"&&o.ctor!=="[]"){c.push(l(r,t._0,e._0,n._0,a._0,o._0));t=t._1;e=e._1;n=n._1;a=a._1;o=o._1}return u(c)}function b(r,t){return u(f(t).sort(function(t,e){return m.cmp(r(t),r(e))}))}function y(r,t){return u(f(t).sort(function(t,e){var n=r(t)(e).ctor;return n==="EQ"?0:n==="LT"?-1:1}))}return{Nil:o,Cons:c,cons:r(c),toArray:f,fromArray:u,foldr:t(s),map2:t(d),map3:e(h),map4:n(p),map5:a(g),sortBy:r(b),sortWith:r(y)}}();var br=mr.sortWith;var yr=mr.sortBy;var wr=function(r){return i(yr,x,r)};var kr=function(r){return{ctor:"::",_0:r,_1:{ctor:"[]"}}};var Tr=r(function(r,t){r:while(true){if(m.cmp(r,0)<1){return t}else{var e=t;if(e.ctor==="[]"){return t}else{var n=r-1,a=e._1;r=n;t=a;continue r}}}});var xr=mr.map5;var Nr=mr.map4;var Er=mr.map3;var Br=mr.map2;var Ar=r(function(r,t){r:while(true){var e=t;if(e.ctor==="[]"){return false}else{if(r(e._0)){return true}else{var n=r,a=e._1;r=n;t=a;continue r}}}});var Rr=r(function(r,t){return!i(Ar,function(t){return!r(t)},t)});var Sr=mr.foldr;var Cr=t(function(r,t,e){r:while(true){var n=e;if(n.ctor==="[]"){return t}else{var a=r,o=i(r,n._0,t),c=n._1;r=a;t=o;e=c;continue r}}});var Lr=function(t){return _(Cr,r(function(r,t){return t+1}),0,t)};var Or=function(t){return _(Cr,r(function(r,t){return r+t}),0,t)};var Fr=function(t){return _(Cr,r(function(r,t){return r*t}),1,t)};var Mr=function(r){var t=r;if(t.ctor==="::"){return fr(_(Cr,D,t._0,t._1))}else{return vr}};var Dr=function(r){var t=r;if(t.ctor==="::"){return fr(_(Cr,I,t._0,t._1))}else{return vr}};var Ir=r(function(r,t){return i(Ar,function(t){return m.eq(t,r)},t)});var Pr=function(r){var t=r;if(t.ctor==="[]"){return true}else{return false}};var zr=function(r){var t=r;if(t.ctor==="::"){return fr(t._1)}else{return vr}};var Jr=function(r){var t=r;if(t.ctor==="::"){return fr(t._0)}else{return vr}};var Ur=Ur||{};Ur["::"]=mr.cons;var jr=r(function(t,e){return _(Sr,r(function(r,e){return{ctor:"::",_0:t(r),_1:e}}),{ctor:"[]"},e)});var qr=r(function(t,e){var n=r(function(r,e){return t(r)?{ctor:"::",_0:r,_1:e}:e});return _(Sr,n,{ctor:"[]"},e)});var Wr=t(function(r,t,e){var n=r(t);if(n.ctor==="Just"){return{ctor:"::",_0:n._0,_1:e}}else{return e}});var Hr=r(function(r,t){return _(Sr,Wr(r),{ctor:"[]"},t)});var Yr=function(t){return _(Cr,r(function(r,t){return{ctor:"::",_0:r,_1:t}}),{ctor:"[]"},t)};var Vr=t(function(t,e,n){var a=r(function(r,e){var n=e;if(n.ctor==="::"){return{ctor:"::",_0:i(t,r,n._0),_1:e}}else{return{ctor:"[]"}}});return Yr(_(Cr,a,{ctor:"::",_0:e,_1:{ctor:"[]"}},n))});var Gr=r(function(t,e){var n=e;if(n.ctor==="[]"){return t}else{return _(Sr,r(function(r,t){return{ctor:"::",_0:r,_1:t}}),e,t)}});var Qr=function(r){return _(Sr,Gr,{ctor:"[]"},r)};var $r=r(function(r,t){return Qr(i(jr,r,t))});var Kr=r(function(t,e){var n=r(function(r,e){var n=e;var a=n._0;var o=n._1;return t(r)?{ctor:"_Tuple2",_0:{ctor:"::",_0:r,_1:a},_1:o}:{ctor:"_Tuple2",_0:a,_1:{ctor:"::",_0:r,_1:o}}});return _(Sr,n,{ctor:"_Tuple2",_0:{ctor:"[]"},_1:{ctor:"[]"}},e)});var Zr=function(t){var e=r(function(r,t){var e=r;var n=t;return{ctor:"_Tuple2",_0:{ctor:"::",_0:e._0,_1:n._0},_1:{ctor:"::",_0:e._1,_1:n._1}}});return _(Sr,e,{ctor:"_Tuple2",_0:{ctor:"[]"},_1:{ctor:"[]"}},t)};var Xr=r(function(t,e){var n=e;if(n.ctor==="[]"){return{ctor:"[]"}}else{var a=r(function(r,e){return{ctor:"::",_0:t,_1:{ctor:"::",_0:r,_1:e}}});var o=_(Sr,a,{ctor:"[]"},n._1);return{ctor:"::",_0:n._0,_1:o}}});var rt=t(function(r,t,e){r:while(true){if(m.cmp(r,0)<1){return e}else{var n=t;if(n.ctor==="[]"){return e}else{var a=r-1,o=n._1,c={ctor:"::",_0:n._0,_1:e};r=a;t=o;e=c;continue r}}}});var tt=r(function(r,t){return Yr(_(rt,r,t,{ctor:"[]"}))});var et=t(function(r,t,e){if(m.cmp(t,0)<1){return{ctor:"[]"}}else{var n={ctor:"_Tuple2",_0:t,_1:e};r:do{t:do{if(n.ctor==="_Tuple2"){if(n._1.ctor==="[]"){return e}else{if(n._1._1.ctor==="::"){switch(n._0){case 1:break t;case 2:return{ctor:"::",_0:n._1._0,_1:{ctor:"::",_0:n._1._1._0,_1:{ctor:"[]"}}};case 3:if(n._1._1._1.ctor==="::"){return{ctor:"::",_0:n._1._0,_1:{ctor:"::",_0:n._1._1._0,_1:{ctor:"::",_0:n._1._1._1._0,_1:{ctor:"[]"}}}}}else{break r}default:if(n._1._1._1.ctor==="::"&&n._1._1._1._1.ctor==="::"){var a=n._1._1._1._0;var o=n._1._1._0;var c=n._1._0;var u=n._1._1._1._1._0;var v=n._1._1._1._1._1;return m.cmp(r,1e3)>0?{ctor:"::",_0:c,_1:{ctor:"::",_0:o,_1:{ctor:"::",_0:a,_1:{ctor:"::",_0:u,_1:i(tt,t-4,v)}}}}:{ctor:"::",_0:c,_1:{ctor:"::",_0:o,_1:{ctor:"::",_0:a,_1:{ctor:"::",_0:u,_1:_(et,r+1,t-4,v)}}}}}else{break r}}}else{if(n._0===1){break t}else{break r}}}}else{break r}}while(false);return{ctor:"::",_0:n._1._0,_1:{ctor:"[]"}}}while(false);return e}});var nt=r(function(r,t){return _(et,0,r,t)});var at=t(function(r,t,e){r:while(true){if(m.cmp(t,0)<1){return r}else{var n={ctor:"::",_0:e,_1:r},a=t-1,o=e;r=n;t=a;e=o;continue r}}});var ot=r(function(r,t){return _(at,{ctor:"[]"},r,t)});var ct=t(function(r,t,e){r:while(true){if(m.cmp(r,t)<1){var n=r,a=t-1,o={ctor:"::",_0:t,_1:e};r=n;t=a;e=o;continue r}else{return e}}});var ut=r(function(r,t){return _(ct,r,t,{ctor:"[]"})});var it=r(function(r,t){return _(Br,r,i(ut,0,Lr(t)-1),t)});var _t=p.append;var vt=p.length;var lt=function(r){return m.eq(vt(r),0)};var ft=p.slice;var st=p.set;var dt=r(function(r,t){return m.cmp(0,r)<1&&m.cmp(r,p.length(t))<0?fr(i(p.get,r,t)):vr});var ht=p.push;var pt=p.empty;var gt=r(function(t,e){var n=r(function(r,e){return t(r)?i(p.push,r,e):e});return _(p.foldl,n,p.empty,e)});var mt=p.foldr;var bt=p.foldl;var yt=p.indexedMap;var wt=p.map;var kt=function(t){return _(Br,r(function(r,t){return{ctor:"_Tuple2",_0:r,_1:t}}),i(ut,0,p.length(t)-1),p.toList(t))};var Tt=p.toList;var xt=p.fromList;var Nt=p.initialize;var Et=r(function(r,t){return i(Nt,r,T(t))});var Bt={ctor:"Array"};var At=function(){return{and:r(function r(t,e){return t&e}),or:r(function r(t,e){return t|e}),xor:r(function r(t,e){return t^e}),complement:function r(t){return~t},shiftLeftBy:r(function(r,t){return t<>r}),shiftRightZfBy:r(function(r,t){return t>>>r})}}();var Rt=At.shiftRightZfBy;var St=At.shiftRightBy;var Ct=At.shiftLeftBy;var Lt=At.complement;var Ot=At.xor;var Ft=At.or;var Mt=At.and;var Dt=function(){return{fromCode:function(r){return m.chr(String.fromCharCode(r))},toCode:function(r){return r.charCodeAt(0)},toUpper:function(r){return m.chr(r.toUpperCase())},toLower:function(r){return m.chr(r.toLowerCase())},toLocaleUpper:function(r){return m.chr(r.toLocaleUpperCase())},toLocaleLower:function(r){return m.chr(r.toLocaleLowerCase())}}}();var It=Dt.fromCode;var Pt=Dt.toCode;var zt=Dt.toLocaleLower;var Jt=Dt.toLocaleUpper;var Ut=Dt.toLower;var jt=Dt.toUpper;var qt=t(function(r,t,e){var n=Pt(e);return m.cmp(n,Pt(r))>-1&&m.cmp(n,Pt(t))<1});var Wt=i(qt,m.chr("A"),m.chr("Z"));var Ht=i(qt,m.chr("a"),m.chr("z"));var Yt=i(qt,m.chr("0"),m.chr("9"));var Vt=i(qt,m.chr("0"),m.chr("7"));var Gt=function(r){return Yt(r)||(_(qt,m.chr("a"),m.chr("f"),r)||_(qt,m.chr("A"),m.chr("F"),r))};var Qt=r(function(r,t){var e=C(r);return R(i(N["%"],e,t))+r-R(e)});var $t=t(function(r,t,e){var n=R(e)/255;var a=R(t)/255;var o=R(r)/255;var c=i(D,i(D,o,a),n);var u=i(I,i(I,o,a),n);var _=c-u;var v=(c+u)/2;var l=m.eq(v,0)?0:_/(1-q(2*v-1));var f=nr(60)*(m.eq(c,o)?i(Qt,(a-n)/_,6):m.eq(c,a)?(n-o)/_+2:(o-a)/_+4);return{ctor:"_Tuple3",_0:f,_1:l,_2:v}});var Kt=t(function(r,t,e){var n=r/nr(60);var a=(1-q(2*e-1))*t;var o=a*(1-q(i(Qt,n,2)-1));var c=m.cmp(n,0)<0?{ctor:"_Tuple3",_0:0,_1:0,_2:0}:m.cmp(n,1)<0?{ctor:"_Tuple3",_0:a,_1:o,_2:0}:m.cmp(n,2)<0?{ctor:"_Tuple3",_0:o,_1:a,_2:0}:m.cmp(n,3)<0?{ctor:"_Tuple3",_0:0,_1:a,_2:o}:m.cmp(n,4)<0?{ctor:"_Tuple3",_0:0,_1:o,_2:a}:m.cmp(n,5)<0?{ctor:"_Tuple3",_0:o,_1:0,_2:a}:m.cmp(n,6)<0?{ctor:"_Tuple3",_0:a,_1:0,_2:o}:{ctor:"_Tuple3",_0:0,_1:0,_2:0};var u=c._0;var _=c._1;var v=c._2;var l=e-a/2;return{ctor:"_Tuple3",_0:u+l,_1:_+l,_2:v+l}});var Zt=function(r){var t=r;if(t.ctor==="RGBA"){return{red:t._0,green:t._1,blue:t._2,alpha:t._3}}else{var e=_(Kt,t._0,t._1,t._2);var n=e._0;var a=e._1;var o=e._2;return{red:O(255*n),green:O(255*a),blue:O(255*o),alpha:t._3}}};var Xt=function(r){var t=r;if(t.ctor==="HSLA"){return{hue:t._0,saturation:t._1,lightness:t._2,alpha:t._3}}else{var e=_($t,t._0,t._1,t._2);var n=e._0;var a=e._1;var o=e._2;return{hue:n,saturation:a,lightness:o,alpha:t._3}}};var re=e(function(r,t,e,n){return{ctor:"HSLA",_0:r,_1:t,_2:e,_3:n}});var te=e(function(r,t,e,n){return v(re,r-er(R(C(r/(2*J)))),t,e,n)});var ee=t(function(r,t,e){return v(te,r,t,e,1)});var ne=function(r){var t=r;if(t.ctor==="HSLA"){return v(te,t._0+nr(180),t._1,t._2,t._3)}else{var e=_($t,t._0,t._1,t._2);var n=e._0;var a=e._1;var o=e._2;return v(te,n+nr(180),a,o,t._3)}};var ae=function(r){return v(re,0,0,1-r,1)};var oe=function(r){return v(re,0,0,1-r,1)};var ce=e(function(r,t,e,n){return{ctor:"RGBA",_0:r,_1:t,_2:e,_3:n}});var ue=ce;var ie=t(function(r,t,e){return v(ce,r,t,e,1)});var _e=v(ce,239,41,41,1);var ve=v(ce,204,0,0,1);var le=v(ce,164,0,0,1);var fe=v(ce,252,175,62,1);var se=v(ce,245,121,0,1);var de=v(ce,206,92,0,1);var he=v(ce,255,233,79,1);var pe=v(ce,237,212,0,1);var ge=v(ce,196,160,0,1);var me=v(ce,138,226,52,1);var be=v(ce,115,210,22,1);var ye=v(ce,78,154,6,1);var we=v(ce,114,159,207,1);var ke=v(ce,52,101,164,1);var Te=v(ce,32,74,135,1);var xe=v(ce,173,127,168,1);var Ne=v(ce,117,80,123,1);var Ee=v(ce,92,53,102,1);var Be=v(ce,233,185,110,1);var Ae=v(ce,193,125,17,1);var Re=v(ce,143,89,2,1);var Se=v(ce,0,0,0,1);var Ce=v(ce,255,255,255,1);var Le=v(ce,238,238,236,1);var Oe=v(ce,211,215,207,1);var Fe=v(ce,186,189,182,1);var Me=v(ce,238,238,236,1);var De=v(ce,211,215,207,1);var Ie=v(ce,186,189,182,1);var Pe=v(ce,136,138,133,1);var ze=v(ce,85,87,83,1);var Je=v(ce,46,52,54,1);var Ue=n(function(r,t,e,n,a){return{ctor:"Radial",_0:r,_1:t,_2:e,_3:n,_4:a}});var je=Ue;var qe=t(function(r,t,e){return{ctor:"Linear",_0:r,_1:t,_2:e}});var We=qe;var He=function(){function r(r){var t=new Date(r);return isNaN(t.getTime())?hn("Unable to parse '"+r+"' as a date. Dates must be in the ISO 8601 format."):gn(t)}var t=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var e=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];return{fromString:r,year:function(r){return r.getFullYear()},month:function(r){return{ctor:e[r.getMonth()]}},day:function(r){return r.getDate()},hour:function(r){return r.getHours()},minute:function(r){return r.getMinutes()},second:function(r){return r.getSeconds()},millisecond:function(r){return r.getMilliseconds()},toTime:function(r){return r.getTime()},fromTime:function(r){return new Date(r)},dayOfWeek:function(r){return{ctor:t[r.getDay()]}}}}();var Ye=function(){var t=1e4;function e(r){return{ctor:"_Task_succeed",value:r}}function n(r){return{ctor:"_Task_fail",value:r}}function a(r){return{ctor:"_Task_nativeBinding",callback:r,cancel:null}}function o(r,t){return{ctor:"_Task_andThen",callback:r,task:t}}function c(r,t){return{ctor:"_Task_onError",callback:r,task:t}}function u(r){return{ctor:"_Task_receive",callback:r}}function i(r){var t={ctor:"_Process",id:m.guid(),root:r,stack:null,mailbox:[]};g(t);return t}function _(r){return a(function(t){var n=i(r);t(e(n))})}function v(r,t){r.mailbox.push(t);g(r)}function l(r,t){return a(function(n){v(r,t);n(e(m.Tuple0))})}function f(r){return a(function(t){var n=r.root;if(n.ctor==="_Task_nativeBinding"&&n.cancel){n.cancel()}r.root=null;t(e(m.Tuple0))})}function s(r){return a(function(t){var n=setTimeout(function(){t(e(m.Tuple0))},r);return function(){clearTimeout(n)}})}function d(r,e){while(r=0){e.splice(t,1)}}return{subscribe:c,unsubscribe:i}}function A(r,t){x(r);u[r]={tag:"sub",subMap:R,converter:t,isForeign:true};return p(r)}var R=r(function r(t,e){return function(r){return t(e(r))}});function S(r,e){var n=[];var a=mr.Nil;var o=u[r].converter;var c=l;var _=d;var v=Ye.succeed(null);function l(r,t,e){var a=f(r,t,e);for(var o=0;o0){if(r&1){e+=t}r>>=1,t+=t}return e}function g(r,t,e){return e.slice(r,t)}function b(r,t){return r<1?"":t.slice(0,r)}function y(r,t){return r<1?"":t.slice(-r)}function w(r,t){return r<1?t:t.slice(r)}function k(r,t){return r<1?t:t.slice(0,-r)}function T(r,t,e){var n=(r-e.length)/2;return p(Math.ceil(n),t)+e+p(n|0,t)}function x(r,t,e){return e+p(r-e.length,t)}function N(r,t,e){return p(r-e.length,t)+e}function E(r){return r.trim()}function B(r){return r.replace(/^\s+/,"")}function A(r){return r.replace(/\s+$/,"")}function R(r){return mr.fromArray(r.trim().split(/\s+/g))}function S(r){return mr.fromArray(r.split(/\r\n|\r|\n/g))}function C(r){return r.toUpperCase()}function L(r){return r.toLowerCase()}function O(r,t){for(var e=t.length;e--;){if(r(m.chr(t[e]))){return true}}return false}function F(r,t){for(var e=t.length;e--;){if(!r(m.chr(t[e]))){return false}}return true}function M(r,t){return t.indexOf(r)>-1}function D(r,t){return t.indexOf(r)===0}function I(r,t){return t.length>=r.length&&t.lastIndexOf(r)===t.length-r.length}function P(r,t){var e=r.length;if(e<1){return mr.Nil}var n=0;var a=[];while((n=t.indexOf(r,n))>-1){a.push(n);n=n+e}return mr.fromArray(a)}function z(r){var t=r.length;if(t===0){return J(r)}var e=r[0];if(e==="0"&&r[1]==="x"){for(var n=2;n"9"||e<"0"&&e!=="-"&&e!=="+"){return J(r)}for(var n=1;n0){return{ctor:"_Tuple2",_0:i,_1:_(a,r,t,u)}}else{return{ctor:"_Tuple2",_0:f,_1:v(n,d,s,t,u)}}}}}});var l=_(Pa,i,{ctor:"_Tuple2",_0:Ia(o),_1:u},c);var f=l._0;var s=l._1;return _(Cr,r(function(r,t){var n=r;return _(e,n._0,n._1,t)}),s,f)});var Ja=e(function(r,t,e,n){return Hn.crash(Aa({ctor:"::",_0:"Internal red-black tree invariant violated, expected ",_1:{ctor:"::",_0:r,_1:{ctor:"::",_0:" and got ",_1:{ctor:"::",_0:E(t),_1:{ctor:"::",_0:"/",_1:{ctor:"::",_0:e,_1:{ctor:"::",_0:"/",_1:{ctor:"::",_0:n,_1:{ctor:"::",_0:"\nPlease report this bug to ",_1:{ctor:"[]"}}}}}}}}}}))});var Ua=function(r){var t=r;r:do{if(t.ctor==="RBNode_elm_builtin"){if(t._0.ctor==="BBlack"){return true}else{break r}}else{if(t._0.ctor==="LBBlack"){return true}else{break r}}}while(false);return false};var ja=r(function(r,t){r:while(true){var e=t;if(e.ctor==="RBEmpty_elm_builtin"){return r}else{var n=i(ja,r+1,e._4),a=e._3;r=n;t=a;continue r}}});var qa=function(r){return i(ja,0,r)};var Wa=r(function(r,t){r:while(true){var e=t;if(e.ctor==="RBEmpty_elm_builtin"){return vr}else{var n=i(P,r,e._1);switch(n.ctor){case"LT":var a=r,o=e._3;r=a;t=o;continue r;case"EQ":return fr(e._2);default:var c=r,u=e._4;r=c;t=u;continue r}}}});var Ha=r(function(r,t){var e=i(Wa,r,t);if(e.ctor==="Just"){return true}else{return false}});var Ya=t(function(r,t,e){r:while(true){var n=e;if(n.ctor==="RBEmpty_elm_builtin"){return{ctor:"_Tuple2",_0:r,_1:t}}else{var a=n._1,o=n._2,c=n._4;r=a;t=o;e=c;continue r}}});var Va={ctor:"NBlack"};var Ga={ctor:"BBlack"};var Qa={ctor:"Black"};var $a=function(r){var t=r;if(t.ctor==="RBNode_elm_builtin"){var e=t._0;return m.eq(e,Qa)||m.eq(e,Ga)}else{return true}};var Ka={ctor:"Red"};var Za=function(r){var t=r;switch(t.ctor){case"Black":return Ga;case"Red":return Qa;case"NBlack":return Ka;default:return Hn.crash("Can't make a double black node more black!")}};var Xa=function(r){var t=r;switch(t.ctor){case"BBlack":return Qa;case"Black":return Ka;case"Red":return Va;default:return Hn.crash("Can't make a negative black node less black!")}};var ro={ctor:"LBBlack"};var to={ctor:"LBlack"};var eo=function(r){return{ctor:"RBEmpty_elm_builtin",_0:r}};var no=eo(to);var ao=function(r){return m.eq(r,no)};var oo=n(function(r,t,e,n,a){return{ctor:"RBNode_elm_builtin",_0:r,_1:t,_2:e,_3:n,_4:a}});var co=function(r){var t=r;if(t.ctor==="RBNode_elm_builtin"&&t._0.ctor==="Red"){return l(oo,Qa,t._1,t._2,t._3,t._4)}else{return r}};var uo=function(r){var t=r;if(t.ctor==="RBNode_elm_builtin"){return l(oo,Xa(t._0),t._1,t._2,t._3,t._4)}else{return eo(to)}};var io=function(r){return function(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return function(_){return function(v){return l(oo,Xa(r),n,a,l(oo,Qa,t,e,u,i),l(oo,Qa,o,c,_,v))}}}}}}}}}}};var _o=function(r){var t=r;if(t.ctor==="RBEmpty_elm_builtin"){return eo(to)}else{return l(oo,Qa,t._1,t._2,t._3,t._4)}};var vo=function(r){var t=r;if(t.ctor==="RBEmpty_elm_builtin"){return Hn.crash("can't make a Leaf red")}else{return l(oo,Ka,t._1,t._2,t._3,t._4)}};var lo=function(r){var t=r;r:do{t:do{e:do{n:do{a:do{o:do{c:do{if(t.ctor==="RBNode_elm_builtin"){if(t._3.ctor==="RBNode_elm_builtin"){if(t._4.ctor==="RBNode_elm_builtin"){switch(t._3._0.ctor){case"Red":switch(t._4._0.ctor){case"Red":if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Red"){break c}else{if(t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Red"){break o}else{if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Red"){break a}else{if(t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Red"){break n}else{break r}}}}case"NBlack":if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Red"){break c}else{if(t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Red"){break o}else{if(t._0.ctor==="BBlack"&&t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Black"&&t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Black"){break e}else{break r}}}default:if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Red"){break c}else{if(t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Red"){break o}else{break r}}}case"NBlack":switch(t._4._0.ctor){case"Red":if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Red"){break a}else{if(t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Red"){break n}else{if(t._0.ctor==="BBlack"&&t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Black"&&t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Black"){break t}else{break r}}}case"NBlack":if(t._0.ctor==="BBlack"){if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Black"&&t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Black"){break e}else{if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Black"&&t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Black"){break t}else{break r}}}else{break r}default:if(t._0.ctor==="BBlack"&&t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Black"&&t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Black"){break t}else{break r}}default:switch(t._4._0.ctor){case"Red":if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Red"){break a}else{if(t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Red"){break n}else{break r}}case"NBlack":if(t._0.ctor==="BBlack"&&t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Black"&&t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Black"){break e}else{break r}default:break r}}}else{switch(t._3._0.ctor){case"Red":if(t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Red"){break c}else{if(t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Red"){break o}else{break r}}case"NBlack":if(t._0.ctor==="BBlack"&&t._3._3.ctor==="RBNode_elm_builtin"&&t._3._3._0.ctor==="Black"&&t._3._4.ctor==="RBNode_elm_builtin"&&t._3._4._0.ctor==="Black"){break t}else{break r}default:break r}}}else{if(t._4.ctor==="RBNode_elm_builtin"){switch(t._4._0.ctor){case"Red":if(t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Red"){break a}else{if(t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Red"){break n}else{break r}}case"NBlack":if(t._0.ctor==="BBlack"&&t._4._3.ctor==="RBNode_elm_builtin"&&t._4._3._0.ctor==="Black"&&t._4._4.ctor==="RBNode_elm_builtin"&&t._4._4._0.ctor==="Black"){break e}else{break r}default:break r}}else{break r}}}else{break r}}while(false);return io(t._0)(t._3._3._1)(t._3._3._2)(t._3._1)(t._3._2)(t._1)(t._2)(t._3._3._3)(t._3._3._4)(t._3._4)(t._4)}while(false);return io(t._0)(t._3._1)(t._3._2)(t._3._4._1)(t._3._4._2)(t._1)(t._2)(t._3._3)(t._3._4._3)(t._3._4._4)(t._4)}while(false);return io(t._0)(t._1)(t._2)(t._4._3._1)(t._4._3._2)(t._4._1)(t._4._2)(t._3)(t._4._3._3)(t._4._3._4)(t._4._4)}while(false);return io(t._0)(t._1)(t._2)(t._4._1)(t._4._2)(t._4._4._1)(t._4._4._2)(t._3)(t._4._3)(t._4._4._3)(t._4._4._4)}while(false);return l(oo,Qa,t._4._3._1,t._4._3._2,l(oo,Qa,t._1,t._2,t._3,t._4._3._3),l(fo,Qa,t._4._1,t._4._2,t._4._3._4,vo(t._4._4)))}while(false);return l(oo,Qa,t._3._4._1,t._3._4._2,l(fo,Qa,t._3._1,t._3._2,vo(t._3._3),t._3._4._3),l(oo,Qa,t._1,t._2,t._3._4._4,t._4))}while(false);return r};var fo=n(function(r,t,e,n,a){var o=l(oo,r,t,e,n,a);return $a(o)?lo(o):o});var so=n(function(r,t,e,n,a){return Ua(n)||Ua(a)?l(fo,Za(r),t,e,uo(n),uo(a)):l(oo,r,t,e,n,a)});var ho=n(function(r,t,e,n,a){var o=a;if(o.ctor==="RBEmpty_elm_builtin"){return _(po,r,n,a)}else{return l(so,r,t,e,n,l(ho,o._0,o._1,o._2,o._3,o._4))}});var po=t(function(r,t,e){var n={ctor:"_Tuple2",_0:t,_1:e};if(n._0.ctor==="RBEmpty_elm_builtin"){if(n._1.ctor==="RBEmpty_elm_builtin"){var a=r;switch(a.ctor){case"Red":return eo(to);case"Black":return eo(ro);default:return Hn.crash("cannot have bblack or nblack nodes at this point")}}else{var o=n._1._0;var c=n._0._0;var u={ctor:"_Tuple3",_0:r,_1:c,_2:o};if(u.ctor==="_Tuple3"&&u._0.ctor==="Black"&&u._1.ctor==="LBlack"&&u._2.ctor==="Red"){return l(oo,Qa,n._1._1,n._1._2,n._1._3,n._1._4)}else{return v(Ja,"Black/LBlack/Red",r,E(c),E(o))}}}else{if(n._1.ctor==="RBEmpty_elm_builtin"){var i=n._1._0;var f=n._0._0;var s={ctor:"_Tuple3",_0:r,_1:f,_2:i};if(s.ctor==="_Tuple3"&&s._0.ctor==="Black"&&s._1.ctor==="Red"&&s._2.ctor==="LBlack"){return l(oo,Qa,n._0._1,n._0._2,n._0._3,n._0._4)}else{return v(Ja,"Black/Red/LBlack",r,E(f),E(i))}}else{var d=n._0._2;var h=n._0._4;var p=n._0._1;var g=l(ho,n._0._0,p,d,n._0._3,h);var m=_(Ya,p,d,h);var b=m._0;var y=m._1;return l(so,r,b,y,g,e)}}});var go=r(function(r,t){var e=t;if(e.ctor==="RBEmpty_elm_builtin"){return eo(to)}else{var n=e._1;return l(oo,e._0,n,i(r,n,e._2),i(go,r,e._3),i(go,r,e._4))}});var mo={ctor:"Same"};var bo={ctor:"Remove"};var yo={ctor:"Insert"};var wo=t(function(r,t,e){var n=function(e){var a=e;if(a.ctor==="RBEmpty_elm_builtin"){var o=t(vr);if(o.ctor==="Nothing"){return{ctor:"_Tuple2",_0:mo,_1:no}}else{return{ctor:"_Tuple2",_0:yo,_1:l(oo,Ka,r,o._0,no,no)}}}else{var c=a._2;var u=a._4;var v=a._3;var f=a._1;var s=a._0;var d=i(P,r,f);switch(d.ctor){case"EQ":var h=t(fr(c));if(h.ctor==="Nothing"){return{ctor:"_Tuple2",_0:bo,_1:_(po,s,v,u)}}else{return{ctor:"_Tuple2",_0:mo,_1:l(oo,s,f,h._0,v,u)}}case"LT":var p=n(v);var g=p._0;var m=p._1;var b=g;switch(b.ctor){case"Same":return{ctor:"_Tuple2",_0:mo,_1:l(oo,s,f,c,m,u)};case"Insert":return{ctor:"_Tuple2",_0:yo,_1:l(fo,s,f,c,m,u)};default:return{ctor:"_Tuple2",_0:bo,_1:l(so,s,f,c,m,u)}}default:var y=n(u);var g=y._0;var w=y._1;var k=g;switch(k.ctor){case"Same":return{ctor:"_Tuple2",_0:mo,_1:l(oo,s,f,c,v,w)};case"Insert":return{ctor:"_Tuple2",_0:yo,_1:l(fo,s,f,c,v,w)};default:return{ctor:"_Tuple2",_0:bo,_1:l(so,s,f,c,v,w)}}}}};var a=n(e);var o=a._0;var c=a._1;var u=o;switch(u.ctor){case"Same":return c;case"Insert":return co(c);default:return _o(c)}});var ko=t(function(r,t,e){return _(wo,r,T(fr(t)),e)});var To=r(function(r,t){return _(ko,r,t,no)});var xo=r(function(r,t){return _(Pa,ko,t,r)});var No=r(function(r,e){var n=t(function(t,e,n){return i(r,t,e)?_(ko,t,e,n):n});return _(Pa,n,no,e)});var Eo=r(function(t,e){return i(No,r(function(r,t){return i(Ha,r,e)}),t)});var Bo=r(function(r,e){var n=t(function(t,e,n){var a=n;var o=a._1;var c=a._0;return i(r,t,e)?{ctor:"_Tuple2",_0:_(ko,t,e,c),_1:o}:{ctor:"_Tuple2",_0:c,_1:_(ko,t,e,o)}});return _(Pa,n,{ctor:"_Tuple2",_0:no,_1:no},e)});var Ao=function(t){return _(Cr,r(function(r,t){var e=r;return _(ko,e._0,e._1,t)}),no,t)};var Ro=r(function(r,t){return _(wo,r,T(vr),t)});var So=r(function(r,e){return _(Pa,t(function(r,t,e){return i(Ro,r,e)}),r,e)});var Co=function(){var t=Ye.nativeBinding(function(r){r(Ye.succeed(Date.now()))});function e(r,t){return Ye.nativeBinding(function(e){var n=setInterval(function(){Ye.rawSpawn(t)},r);return function(){clearInterval(n)}})}return{now:t,setInterval_:r(e)}}();var Lo=Co.setInterval_;var Oo=t(function(r,t,e){var n=t;if(n.ctor==="[]"){return Sn(e)}else{var a=n._0;var o=function(t){return _(Oo,r,n._1,_(ko,a,t,e))};var c=Ye.spawn(i(Lo,a,i(an,r,a)));return i(En,o,c)}});var Fo=r(function(r,t){var e=r;var n=e._1;var a=e._0;var o=i(Wa,a,t);if(o.ctor==="Nothing"){return _(ko,a,{ctor:"::",_0:n,_1:{ctor:"[]"}},t)}else{return _(ko,a,{ctor:"::",_0:n,_1:o._0},t)}});var Mo=function(r){return r};var Do=1;var Io=1e3*Do;var Po=60*Io;var zo=60*Po;var Jo=function(r){return r/zo};var Uo=function(r){return r/Po};var jo=function(r){return r/Io};var qo=Co.now;var Wo=t(function(r,t,e){var n=i(Wa,t,e.taggers);if(n.ctor==="Nothing"){return Sn(e)}else{var a=function(t){return Dn(i(jr,function(e){return i(on,r,e(t))},n._0))};return i(En,function(r){return Sn(e)},i(En,a,qo))}});var Ho=Ve.leaf("Time");var Yo=r(function(r,t){return{taggers:r,processes:t}});var Vo=Sn(i(Yo,no,no));var Go=t(function(r,n,a){var o=a;var c=t(function(r,t,e){var n=e;return{ctor:"_Tuple3",_0:n._0,_1:n._1,_2:i(En,function(r){return n._2},Ye.kill(t))}});var u=e(function(r,t,e,n){var a=n;return{ctor:"_Tuple3",_0:a._0,_1:_(ko,r,e,a._1),_2:a._2}});var v=t(function(r,t,e){var n=e;return{ctor:"_Tuple3",_0:{ctor:"::",_0:r,_1:n._0},_1:n._1,_2:n._2}});var l=_(Cr,Fo,no,n);var s=f(za,v,u,c,l,o.processes,{ctor:"_Tuple3",_0:{ctor:"[]"},_1:no,_2:Sn({ctor:"_Tuple0"})});var d=s._0;var h=s._1;var p=s._2;return i(En,function(r){return Sn(i(Yo,l,r))},i(En,function(t){return _(Oo,r,d,h)},p))});var Qo=r(function(r,t){return{ctor:"Every",_0:r,_1:t}});var $o=r(function(r,t){return Ho(i(Qo,r,t))});var Ko=r(function(r,t){var e=t;return i(Qo,e._0,function(t){return r(e._1(t))})});Ve.effectManagers["Time"]={pkg:"elm-lang/core",init:Vo,onEffects:Go,onSelfMsg:Wo,tag:"sub",subMap:Ko};var Zo=He.millisecond;var Xo=He.second;var rc=He.minute;var tc=He.hour;var ec=He.dayOfWeek;var nc=He.day;var ac=He.month;var oc=He.year;var cc=He.fromTime;var uc=He.toTime;var ic=He.fromString;var _c=i(Cn,cc,qo);var vc={ctor:"Date"};var lc={ctor:"Sun"};var fc={ctor:"Sat"};var sc={ctor:"Fri"};var dc={ctor:"Thu"};var hc={ctor:"Wed"};var pc={ctor:"Tue"};var gc={ctor:"Mon"};var mc={ctor:"Dec"};var bc={ctor:"Nov"};var yc={ctor:"Oct"};var wc={ctor:"Sep"};var kc={ctor:"Aug"};var Tc={ctor:"Jul"};var xc={ctor:"Jun"};var Nc={ctor:"May"};var Ec={ctor:"Apr"};var Bc={ctor:"Mar"};var Ac={ctor:"Feb"};var Rc={ctor:"Jan"};var Sc=Hn.crash;var Cc=Hn.log;var Lc=function(){function i(r){return{ctor:"",tag:"succeed",msg:r}}function _(r){return{ctor:"",tag:"fail",msg:r}}function v(r){return{ctor:"",tag:r}}function l(r,t){return{ctor:"",tag:r,decoder:t}}function f(r){return{ctor:"",tag:"null",value:r}}function s(r,t){return{ctor:"",tag:"field",field:r,decoder:t}}function d(r,t){return{ctor:"",tag:"index",index:r,decoder:t}}function h(r){return{ctor:"",tag:"key-value",decoder:r}}function g(r,t){return{ctor:"",tag:"map-many",func:r,decoders:t}}function b(r,t){return{ctor:"",tag:"andThen",decoder:t,callback:r}}function y(r){return{ctor:"",tag:"oneOf",decoders:r}}function w(r,t){return g(r,[t])}function k(r,t,e){return g(r,[t,e])}function T(r,t,e,n){return g(r,[t,e,n])}function x(r,t,e,n,a){return g(r,[t,e,n,a])}function N(r,t,e,n,a,o){return g(r,[t,e,n,a,o])}function E(r,t,e,n,a,o,c){return g(r,[t,e,n,a,o,c])}function B(r,t,e,n,a,o,c,u){return g(r,[t,e,n,a,o,c,u])}function A(r,t,e,n,a,o,c,u,i){return g(r,[t,e,n,a,o,c,u,i])}function R(r){return{tag:"ok",value:r}}function S(r,t){return{tag:"primitive",type:r,value:t}}function C(r,t){return{tag:"index",index:r,rest:t}}function L(r,t){return{tag:"field",field:r,rest:t}}function C(r,t){return{tag:"index",index:r,rest:t}}function O(r){return{tag:"oneOf",problems:r}}function F(r){return{tag:"fail",msg:r}}function M(r){var t="_";while(r){switch(r.tag){case"primitive":return"Expecting "+r.type+(t==="_"?"":" at "+t)+" but instead got: "+D(r.value);case"index":t+="["+r.index+"]";r=r.rest;break;case"field":t+="."+r.field;r=r.rest;break;case"oneOf":var e=r.problems;for(var n=0;n=t.length){return S("a longer array. Need index "+i+" but there are only "+t.length+" entries",t)}var a=z(r.decoder,t[i]);return a.tag==="ok"?a:C(i,a);case"key-value":if(typeof t!=="object"||t===null||t instanceof Array){return S("an object",t)}var _=mr.Nil;for(var v in t){var a=z(r.decoder,t[v]);if(a.tag!=="ok"){return L(v,a)}var l=m.Tuple2(v,a.value);_=mr.Cons(l,_)}return R(_);case"map-many":var f=r.func;var s=r.decoders;for(var n=0;n0){var l=i[_];v[--_]=l===undefined?vr:fr(l)}n.push({match:i[0],submatches:mr.fromArray(v),index:i.index,number:a});u=t.lastIndex}t.lastIndex=c;return mr.fromArray(n)}function i(r,t,e,n){r=r.ctor==="All"?Infinity:r._0;var a=0;function o(t){if(a++>=r){return t}var n=arguments.length-3;var o=new Array(n);while(n>0){var c=arguments[n];o[--n]=c===undefined?vr:fr(c)}return e({match:t,submatches:mr.fromArray(o),index:arguments[arguments.length-2],number:a})}return n.replace(t,o)}function _(r,t,e){r=r.ctor==="All"?Infinity:r._0;if(r===Infinity){return mr.fromArray(e.split(t))}var n=e;var a;var o=[];var c=t.lastIndex;var u=t.lastIndex;while(r--){if(!(a=t.exec(n)))break;o.push(n.slice(c,a.index));c=t.lastIndex}o.push(n.slice(c));t.lastIndex=u;return mr.fromArray(o)}return{regex:o,caseInsensitive:a,escape:n,contains:r(c),find:t(u),replace:e(i),split:t(_)}}();var wu=Ye.kill;var ku=Ye.sleep;var Tu=Ye.spawn;var xu=r(function(r,t){var e=t;return{ctor:"_Tuple2",_0:e._0,_1:r(e._1)}});var Nu=r(function(r,t){var e=t;return{ctor:"_Tuple2",_0:r(e._0),_1:e._1}});var Eu=function(r){var t=r;return t._1};var Bu=function(r){var t=r;return t._0};var Au=yu.split;var Ru=yu.replace;var Su=yu.find;var Cu=yu.contains;var Lu=yu.caseInsensitive;var Ou=yu.regex;var Fu=yu.escape;var Mu=e(function(r,t,e,n){return{match:r,submatches:t,index:e,number:n}});var Du={ctor:"Regex"};var Iu=function(r){return{ctor:"AtMost",_0:r}};var Pu={ctor:"All"};var zu=function(){var e={addEventListener:function(){},removeEventListener:function(){}};var n=o(typeof document!=="undefined"?document:e);var a=o(typeof window!=="undefined"?window:e);function o(r){return function(t,e,n){return Ye.nativeBinding(function(a){function o(r){var t=i(Qc,e,r);if(t.ctor==="Ok"){Ye.rawSpawn(n(t._0))}}r.addEventListener(t,o);return function(){r.removeEventListener(t,o)}})}}var c=typeof requestAnimationFrame!=="undefined"?requestAnimationFrame:function(r){r()};function u(r,t){return Ye.nativeBinding(function(e){c(function(){var n=document.getElementById(r);if(n===null){e(Ye.fail({ctor:"NotFound",_0:r}));return}e(Ye.succeed(t(n)))})})}function _(r){return u(r,function(r){r.focus();return m.Tuple0})}function v(r){return u(r,function(r){r.blur();return m.Tuple0})}function l(r){return u(r,function(r){return r.scrollTop})}function f(r,t){return u(r,function(r){r.scrollTop=t;return m.Tuple0})}function s(r){return u(r,function(r){r.scrollTop=r.scrollHeight;return m.Tuple0})}function d(r){return u(r,function(r){return r.scrollLeft})}function h(r,t){return u(r,function(r){r.scrollLeft=t;return m.Tuple0})}function p(r){return u(r,function(r){r.scrollLeft=r.scrollWidth;return m.Tuple0})}function g(r,t){return u(t,function(t){switch(r.ctor){case"Content":return t.scrollWidth;case"VisibleContent":return t.clientWidth;case"VisibleContentWithBorders":return t.offsetWidth;case"VisibleContentWithBordersAndMargins":var e=t.getBoundingClientRect();return e.right-e.left}})}function b(r,t){return u(t,function(t){switch(r.ctor){case"Content":return t.scrollHeight;case"VisibleContent":return t.clientHeight;case"VisibleContentWithBorders":return t.offsetHeight;case"VisibleContentWithBordersAndMargins":var e=t.getBoundingClientRect();return e.bottom-e.top}})}return{onDocument:t(n),onWindow:t(a),focus:_,blur:v,getScrollTop:l,setScrollTop:r(f),getScrollLeft:d,setScrollLeft:r(h),toBottom:s,toRight:p,height:r(b),width:r(g)}}();var Ju=zu.onWindow;var Uu=zu.onDocument;var ju;var qu;var Wu=function(){var n="STYLE";var a="EVENT";var o="ATTR";var c="ATTR_NS";var u=typeof document!=="undefined"?document:{};function v(r){return{type:"text",text:r}}function l(t){return r(function(r,e){return f(t,r,e)})}function f(r,t,e){var n=w(t);var a=n.namespace;var o=n.facts;var c=[];var u=0;while(e.ctor!=="[]"){var i=e._0;u+=i.descendantsCount||0;c.push(i);e=e._1}u+=c.length;return{type:"node",tag:r,facts:o,children:c,namespace:a,descendantsCount:u}}function s(r,t,e){var n=w(t);var a=n.namespace;var o=n.facts;var c=[];var u=0;while(e.ctor!=="[]"){var i=e._0;u+=i._1.descendantsCount||0;c.push(i);e=e._1}u+=c.length;return{type:"keyed-node",tag:r,facts:o,children:c,namespace:a,descendantsCount:u}}function d(r,t,e){var n=w(r).facts;return{type:"custom",facts:n,model:t,impl:e}}function h(r,t){return{type:"tagger",tagger:r,node:t,descendantsCount:1+(t.descendantsCount||0)}}function p(r,t,e){return{type:"thunk",func:r,args:t,thunk:e,node:undefined}}function g(r,t){return p(r,[t],function(){return r(t)})}function b(r,t,e){return p(r,[t,e],function(){return i(r,t,e)})}function y(r,t,e,n){return p(r,[t,e,n],function(){return _(r,t,e,n)})}function w(r){var t,e={};while(r.ctor!=="[]"){var u=r._0;var i=u.key;if(i===o||i===c||i===a){var _=e[i]||{};_[u.realKey]=u.value;e[i]=_}else if(i===n){var v=e[i]||{};var l=u.value;while(l.ctor!=="[]"){var f=l._0;v[f._0]=f._1;l=l._1}e[i]=v}else if(i==="namespace"){t=u.value}else if(i==="className"){var s=e[i];e[i]=typeof s==="undefined"?u.value:s+" "+u.value}else{e[i]=u.value}r=r._1}return{facts:e,namespace:t}}function k(r){return{key:n,value:r}}function T(r,t){return{key:r,value:t}}function x(r,t){return{key:o,realKey:r,value:t}}function N(r,t,e){return{key:c,realKey:t,value:{value:e,namespace:r}}}function E(r,t,e){return{key:a,realKey:r,value:{options:t,decoder:e}}}function B(r,t){if(r.options!==t.options){if(r.options.stopPropagation!==t.options.stopPropagation||r.options.preventDefault!==t.options.preventDefault){return false}}return Lc.equality(r.decoder,t.decoder)}function A(r,t){if(t.key!==a){return t}return E(t.realKey,t.value.options,i(au,r,t.value.decoder))}function R(r,t){switch(r.type){case"thunk":if(!r.node){r.node=r.thunk()}return R(r.node,t);case"tagger":var e=r.node;var n=r.tagger;while(e.type==="tagger"){typeof n!=="object"?n=[n,e.tagger]:n.push(e.tagger);e=e.node}var a={tagger:n,parent:t};var o=R(e,a);o.elm_event_node_ref=a;return o;case"text":return u.createTextNode(r.text);case"node":var o=r.namespace?u.createElementNS(r.namespace,r.tag):u.createElement(r.tag);S(o,t,r.facts);var c=r.children;for(var i=0;i0){e.push(I("p-thunk",n,v))}return;case"tagger":var l=r.tagger;var f=t.tagger;var s=false;var d=r.node;while(d.type==="tagger"){s=true;typeof l!=="object"?l=[l,d.tagger]:l.push(d.tagger);d=d.node}var h=t.node;while(h.type==="tagger"){s=true;typeof f!=="object"?f=[f,h.tagger]:f.push(h.tagger);h=h.node}if(s&&l.length!==f.length){e.push(I("p-redraw",n,t));return}if(s?!z(l,f):l!==f){e.push(I("p-tagger",n,f))}P(d,h,e,n+1);return;case"text":if(r.text!==t.text){e.push(I("p-text",n,t.text));return}return;case"node":if(r.tag!==t.tag||r.namespace!==t.namespace){e.push(I("p-redraw",n,t));return}var p=J(r.facts,t.facts);if(typeof p!=="undefined"){e.push(I("p-facts",n,p))}U(r,t,e,n);return;case"keyed-node":if(r.tag!==t.tag||r.namespace!==t.namespace){e.push(I("p-redraw",n,t));return}var p=J(r.facts,t.facts);if(typeof p!=="undefined"){e.push(I("p-facts",n,p))}j(r,t,e,n);return;case"custom":if(r.impl!==t.impl){e.push(I("p-redraw",n,t));return}var p=J(r.facts,t.facts);if(typeof p!=="undefined"){e.push(I("p-facts",n,p))}var g=t.impl.diff(r,t);if(g){e.push(I("p-custom",n,g));return}return}}function z(r,t){for(var e=0;eu){e.push(I("p-remove-last",n,c-u))}else if(c0||c.length>0||typeof S!=="undefined"){e.push(I("p-reorder",n,{patches:a,inserts:c,endInserts:S}))}}var q="_elmW6BL";function W(r,t,e,n,a,o){var c=r[e];if(typeof c==="undefined"){c={tag:"insert",vnode:n,index:a,data:undefined};o.push({index:a,entry:c});r[e]=c;return}if(c.tag==="remove"){o.push({index:a,entry:c});c.tag="move";var u=[];P(c.vnode,n,u,c.index);c.index=a;c.data.data={patches:u,entry:c};return}W(r,t,e+q,n,a,o)}function H(r,t,e,n,a){var o=r[e];if(typeof o==="undefined"){var c=I("p-remove",a,undefined);t.push(c);r[e]={tag:"remove",vnode:n,index:a,data:c};return}if(o.tag==="insert"){o.tag="move";var u=[];P(n,o.vnode,u,a);var c=I("p-remove",a,{patches:u,entry:o});t.push(c);return}H(r,t,e+q,n,a)}function Y(r,t,e,n){V(r,t,e,0,0,t.descendantsCount,n)}function V(r,t,e,n,a,o,c){var u=e[n];var i=u.index;while(i===a){var _=u.type;if(_==="p-thunk"){Y(r,t.node,u.data,c)}else if(_==="p-reorder"){u.domNode=r;u.eventNode=c;var v=u.data.patches;if(v.length>0){V(r,t,v,0,a,o,c)}}else if(_==="p-remove"){u.domNode=r;u.eventNode=c;var l=u.data;if(typeof l!=="undefined"){l.entry.data=r;var v=l.patches;if(v.length>0){V(r,t,v,0,a,o,c)}}}else{u.domNode=r;u.eventNode=c}n++;if(!(u=e[n])||(i=u.index)>o){return n}}switch(t.type){case"tagger":var f=t.node;while(f.type==="tagger"){f=f.node}return V(r,f,e,n,a+1,o,r.elm_event_node_ref);case"node":var s=t.children;var d=r.childNodes;for(var h=0;ho){return n}}a=g}return n;case"keyed-node":var s=t.children;var d=r.childNodes;for(var h=0;ho){return n}}a=g}return n;case"text":case"thunk":throw new Error("should never traverse `text` or `thunk` nodes like this")}}function G(r,t,e,n){if(e.length===0){return r}Y(r,t,e,n);return Q(r,e)}function Q(r,t){for(var e=0;eOops! Something went wrong when starting your Elm program.'+'
'+r+"
"+""}throw new Error(r)}function ur(r,t,e,n){t["embed"]=function t(e,a){while(e.lastChild){e.removeChild(e.lastChild)}return Ve.initialize(n(r.init,a,e),r.update,r.subscriptions,ir(e,r.view))};t["fullscreen"]=function t(e){return Ve.initialize(n(r.init,e,document.body),r.update,r.subscriptions,ir(document.body,r.view))}}function ir(r,t){return function(e,n){var a={tagger:e,parent:undefined};var o=t(n);var c=R(o,a);r.appendChild(c);return vr(c,t,o,a)}}var _r=typeof requestAnimationFrame!=="undefined"?requestAnimationFrame:function(r){setTimeout(r,1e3/60)};function vr(r,t,e,n){var a="NO_REQUEST";var o=e;var c;function u(){switch(a){case"NO_REQUEST":throw new Error("Unexpected draw callback.\n"+"Please report this to .");case"PENDING_REQUEST":_r(u);a="EXTRA_REQUEST";var e=t(c);var i=D(o,e);r=G(r,o,i,n);o=e;return;case"EXTRA_REQUEST":a="NO_REQUEST";return}}return function r(t){if(a==="NO_REQUEST"){_r(u)}a="PENDING_REQUEST";c=t}}function lr(r,t,e,n){t["fullscreen"]=function t(a){var o={doc:undefined};return Ve.initialize(n(r.init,a,document.body),r.update(fr(o)),r.subscriptions,sr(e,document.body,o,r.view,r.viewIn,r.viewOut))};t["embed"]=function t(a,o){var c={doc:undefined};return Ve.initialize(n(r.init,o,a),r.update(fr(c)),r.subscriptions,sr(e,a,c,r.view,r.viewIn,r.viewOut))}}function fr(r){return Ye.nativeBinding(function(t){var e=r.doc;if(e){var n=e.getElementsByClassName("debugger-sidebar-messages")[0];if(n){n.scrollTop=n.scrollHeight}}t(Ye.succeed(m.Tuple0))})}function sr(r,t,e,n,a,o){return function(c,u){var i={tagger:c,parent:undefined};var _={tagger:c,parent:undefined};var v=n(u);var l=R(v,i);t.appendChild(l);var f=vr(l,n,v,i);var s=a(u)._1;var d=R(s,_);t.appendChild(d);var h=pr(i,d,a);var p=vr(d,h,s,_);var g=dr(u,o,_,t,r,e);return function r(t){f(t);p(t);g(t)}}}function dr(r,t,e,n,a,o){var c;var i;return function r(n){if(!n.isDebuggerOpen){return}if(!o.doc){c=t(n);i=hr(a,o,c,e);return}u=o.doc;var _=t(n);var v=D(c,_);i=G(i,c,v,e);c=_;u=document}}function hr(r,t,e,n){var a=900;var o=360;var c=screen.width-a;var i=screen.height-o;var _=window.open("","","width="+a+",height="+o+",left="+c+",top="+i);u=_.document;t.doc=u;u.title="Debugger - "+r;u.body.style.margin="0";u.body.style.padding="0";var v=R(e,n);u.body.appendChild(v);u.addEventListener("keydown",function(r){if(r.metaKey&&r.which===82){window.location.reload()}if(r.which===38){n.tagger({ctor:"Up"});r.preventDefault()}if(r.which===40){n.tagger({ctor:"Down"});r.preventDefault()}});function l(){t.doc=undefined;_.close()}window.addEventListener("unload",l);_.addEventListener("unload",function(){t.doc=undefined;window.removeEventListener("unload",l);n.tagger({ctor:"Close"})});u=document;return v}function pr(r,t,e){var n=br(t);var a="Normal";var o;var c=r.tagger;var u=function(){};return function(t){var i=e(t);var _=i._0.ctor;r.tagger=_==="Normal"?c:u;if(a!==_){gr("removeEventListener",n,a);gr("addEventListener",n,_);if(a==="Normal"){o=document.body.style.overflow;document.body.style.overflow="hidden"}if(_==="Normal"){document.body.style.overflow=o}a=_}return i._1}}function gr(r,t,e){switch(e){case"Normal":return;case"Pause":return mr(r,t,yr);case"Message":return mr(r,t,wr)}}function mr(r,t,e){for(var n=0;n"]=r(function(r,t){return i(En,function(r){return t},r)});var Rf=t(function(r,t,e){var n=function(t){var n=t;return i(on,r,n._0(e))};return i(Af["&>"],Dn(i(jr,n,t)),Sn({ctor:"_Tuple0"}))});var Sf=t(function(r,t,e){var n=e;switch(n.ctor){case"Jump":return Nf(n._0);case"New":return i(En,i(Rf,r,t),xf(n._0));case"Modify":return i(En,i(Rf,r,t),Tf(n._0));case"Visit":return Bf(n._0);default:return Ef(n._0)}});var Cf=function(r){var t=r;if(t.ctor==="Normal"){return wu(t._0)}else{return i(Af["&>"],wu(t._0),wu(t._1))}};var Lf=t(function(r,t,e){return i(Af["&>"],_(Rf,r,e.subs,t),Sn(e))});var Of=Ve.leaf("Navigation");var Ff=Ve.leaf("Navigation");var Mf=function(r){return function(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return function(_){return function(v){return{href:r,host:t,hostname:e,protocol:n,origin:a,port_:o,pathname:c,search:u,hash:i,username:_,password:v}}}}}}}}}}}};var Df=r(function(r,t){return{subs:r,popWatcher:t}});var If=Sn(i(Df,{ctor:"[]"},vr));var Pf=function(r){return{ctor:"Reload",_0:r}};var zf=Ff(Pf(false));var Jf=Ff(Pf(true));var Uf=function(r){return{ctor:"Visit",_0:r}};var jf=function(r){return Ff(Uf(r))};var qf=function(r){return{ctor:"Modify",_0:r}};var Wf=function(r){return Ff(qf(r))};var Hf=function(r){return{ctor:"New",_0:r}};var Yf=function(r){return Ff(Hf(r))};var Vf=function(r){return{ctor:"Jump",_0:r}};var Gf=function(r){return Ff(Vf(0-r))};var Qf=function(r){return Ff(Vf(r))};var $f=r(function(r,t){var e=t;switch(e.ctor){case"Jump":return Vf(e._0);case"New":return Hf(e._0);case"Modify":return qf(e._0);case"Visit":return Uf(e._0);default:return Pf(e._0)}});var Kf=function(r){return{ctor:"Monitor",_0:r}};var Zf=r(function(r,t){var e=t.init(kf.getLocation({ctor:"_Tuple0"}));var n=function(e){return Xe({ctor:"::",_0:Of(Kf(r)),_1:{ctor:"::",_0:t.subscriptions(e),_1:{ctor:"[]"}}})};return fi({init:e,view:t.view,update:t.update,subscriptions:n})});var Xf=r(function(r,t){var e=function(r){return i(t.init,r,kf.getLocation({ctor:"_Tuple0"}))};var n=function(e){return Xe({ctor:"::",_0:Of(Kf(r)),_1:{ctor:"::",_0:t.subscriptions(e),_1:{ctor:"[]"}}})};return li({init:e,view:t.view,update:t.update,subscriptions:n})});var rs=r(function(r,t){var e=t;return Kf(function(t){return r(e._0(t))})});var ts=r(function(r,t){return{ctor:"InternetExplorer",_0:r,_1:t}});var es=function(r){return{ctor:"Normal",_0:r}};var ns=function(r){var t=function(t){return i(an,r,kf.getLocation({ctor:"_Tuple0"}))};return kf.isInternetExplorer11({ctor:"_Tuple0"})?_(Ln,ts,Tu(_(Ju,"popstate",Wc,t)),Tu(_(Ju,"hashchange",Wc,t))):i(Cn,es,Tu(_(Ju,"popstate",Wc,t)))};var as=e(function(r,t,e,n){var a=n;var o=a.popWatcher;var c=function(){var t={ctor:"_Tuple2",_0:e,_1:o};r:do{if(t._0.ctor==="[]"){if(t._1.ctor==="Just"){return i(Af["&>"],Cf(t._1._0),Sn(i(Df,e,vr)))}else{break r}}else{if(t._1.ctor==="Nothing"){return i(Cn,function(r){return i(Df,e,fr(r))},ns(r))}else{break r}}}while(false);return Sn(i(Df,e,o))}();return i(Af["&>"],Dn(i(jr,i(Sf,r,e),t)),c)});Ve.effectManagers["Navigation"]={pkg:"elm-lang/navigation",init:If,onEffects:as,onSelfMsg:Lf,tag:"fx",cmdMap:$f,subMap:rs};var os=function(r){return m.cmp(r,10)<0?It(r+Pt(m.chr("0"))):m.cmp(r,36)<0?It(r-10+Pt(m.chr("A"))):m.crash("ParseInt",{start:{line:158,column:9},end:{line:158,column:20}})(E(r))};var cs=r(function(r,t){return m.cmp(t,r)<0?La(os(t)):i(N["++"],i(cs,r,t/r|0),La(os(i(N["%"],t,r))))});var us=cs(8);var is=cs(16);var _s=t(function(r,t,e){var n=Pt(e);return m.cmp(Pt(r),n)<1&&m.cmp(n,Pt(t))<1});var vs=r(function(r,t){return Pt(t)-Pt(r)});var ls=function(r){return{ctor:"InvalidRadix",_0:r}};var fs=r(function(r,t){return m.cmp(2,r)<1&&m.cmp(r,36)<1?m.cmp(t,0)<0?gn(i(N["++"],"-",i(cs,r,0-t))):gn(i(cs,r,t)):hn(ls(r))});var ss=function(r){return{ctor:"OutOfRange",_0:r}};var ds=function(r){return{ctor:"InvalidChar",_0:r}};var hs=r(function(r,t){var e=function(e){return m.cmp(e,r)<0?gn(e):hn(ss(t))};var n=_(_s,m.chr("0"),m.chr("9"),t)?gn(i(vs,m.chr("0"),t)):_(_s,m.chr("a"),m.chr("z"),t)?gn(10+i(vs,m.chr("a"),t)):_(_s,m.chr("A"),m.chr("Z"),t)?gn(10+i(vs,m.chr("A"),t)):hn(ds(t));return i(pn,e,n)});var ps=r(function(r,t){var e=Sa(t);if(e.ctor==="Nothing"){return gn(0)}else{return i(pn,function(t){return i(pn,function(e){return gn(t+e*r)},i(ps,r,e._0._1))},i(hs,r,e._0._0))}});var gs=r(function(r,t){return m.cmp(2,r)<1&&m.cmp(r,36)<1?i(ps,r,xa(t)):hn(ls(r))});var ms=gs(10);var bs=gs(8);var ys=gs(16);var ws=function(r){var t=r;var e=function(r){var t=m.cmp(r,.0031308)>0?1.055*Math.pow(r,1/2.4)-.055:12.92*r;return O(_(U,0,255,t*255))};var n=t.z/100;var a=t.y/100;var o=t.x/100;var c=o*3.2404542+a*-1.5371385+n*-.4986;var u=o*-.969266+a*1.8760108+n*.041556;var i=o*.0556434+a*-.2040259+n*1.0572252;return _(ie,e(c),e(u),e(i))};var ks=function(r){var t=r;var e=(t.l+16)/116;var n=function(r){var t=r*r*r;return m.cmp(t,.008856)>0?t:(r-16/116)/7.787};return{y:n(e)*100,x:n(e+t.a/500)*95.047,z:n(e-t.b/200)*108.883}};var Ts=function(r){return ws(ks(r))};var xs=function(r){var t=r;var e=function(r){return m.cmp(r,.008856)>0?Math.pow(r,1/3):7.787*r+16/116};var n=e(t.x/95.047);var a=e(t.y/100);var o=e(t.z/108.883);return{l:116*a-16,a:500*(n-a),b:200*(a-o)}};var Ns=function(r){var t=Zt(r);var e=t.red;var n=t.green;var a=t.blue;var o=function(r){var t=R(r)/255;var e=m.cmp(t,.04045)>0?Math.pow((t+.055)/1.055,2.4):t/12.92;return e*100};var c=o(e);var u=o(n);var i=o(a);return{x:c*.4124+u*.3576+i*.1805,y:c*.2126+u*.7152+i*.0722,z:c*.0193+u*.1192+i*.9505}};var Es=function(r){return xs(Ns(r))};var Bs=function(r){var t=function(r){return m.cmp(r,10)<0?E(r):La(It(87+r))};return m.cmp(r,16)<0?t(r):i(N["++"],Bs(r/16|0),t(i(N["%"],r,16)))};var As=function(r){return _(fa,2,m.chr("0"),Bs(r))};var Rs=function(t){var e=Zt(t);var n=e.red;var a=e.green;var o=e.blue;return i(ya,"",i(r(function(r,t){return{ctor:"::",_0:r,_1:t}}),"#",i(jr,As,{ctor:"::",_0:n,_1:{ctor:"::",_0:a,_1:{ctor:"::",_0:o,_1:{ctor:"[]"}}}})))};var Ss=function(t){var e=Zt(t);var n=e.red;var a=e.green;var o=e.blue;var c=e.alpha;return m.eq(c,1)?Rs(t):i(ya,"",i(r(function(r,t){return{ctor:"::",_0:r,_1:t}}),"#",i(jr,As,{ctor:"::",_0:n,_1:{ctor:"::",_0:a,_1:{ctor:"::",_0:o,_1:{ctor:"::",_0:O(c*255),_1:{ctor:"[]"}}}}})))};var Cs=r(function(r,t){var e=R(Math.pow(10,r));return R(O(t*e))/e});var Ls=function(){var r=i(N["++"],"",i(N["++"],"^",i(N["++"],"#?",i(N["++"],"(?:",i(N["++"],"(?:([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2}))",i(N["++"],"|",i(N["++"],"(?:([a-f\\d])([a-f\\d])([a-f\\d]))",i(N["++"],"|",i(N["++"],"(?:([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2}))",i(N["++"],"|",i(N["++"],"(?:([a-f\\d])([a-f\\d])([a-f\\d])([a-f\\d]))",i(N["++"],")","$"))))))))))));var t=function(r){var t=Gn(r);if(t.ctor==="::"&&t._1.ctor==="[]"){var e=t._0;return Vn({ctor:"::",_0:e,_1:{ctor:"::",_0:e,_1:{ctor:"[]"}}})}else{return r}};return function(e){return i(pn,function(r){var e=i(jr,function(r){return ys(t(r))},r);r:do{if(e.ctor==="::"&&e._0.ctor==="Ok"&&e._1.ctor==="::"&&e._1._0.ctor==="Ok"&&e._1._1.ctor==="::"&&e._1._1._0.ctor==="Ok"){if(e._1._1._1.ctor==="::"){if(e._1._1._1._0.ctor==="Ok"&&e._1._1._1._1.ctor==="[]"){return gn(v(ue,e._0._0,e._1._0._0,e._1._1._0._0,i(Cs,2,R(e._1._1._1._0._0)/255)))}else{break r}}else{return gn(_(ie,e._0._0,e._1._0._0,e._1._1._0._0))}}else{break r}}while(false);return hn("Parsing ints from hex failed")},i(xn,"Parsing hex regex failed",i(sr,Hr(x),i(sr,function(r){return r.submatches},Jr(_(Su,Iu(1),Ou(r),aa(e)))))))}}();var Os=r(function(r,t){return i(N["++"],r,i(N["++"],"(",i(N["++"],i(ya,", ",t),")")))});var Fs=function(t){return _(k,r(function(r,t){return i(N["++"],r,t)}),"%",E(O(i(r(function(r,t){return r*t}),100,t))))};var Ms=function(t){return E(O(_(k,r(function(r,t){return r/t}),J,i(r(function(r,t){return r*t}),180,t))))};var Ds=function(r){var t=Xt(r);var e=t.hue;var n=t.saturation;var a=t.lightness;var o=t.alpha;return i(Os,"hsla",{ctor:"::",_0:Ms(e),_1:{ctor:"::",_0:Fs(n),_1:{ctor:"::",_0:Fs(a),_1:{ctor:"::",_0:E(o),_1:{ctor:"[]"}}}}})};var Is=function(r){var t=Xt(r);var e=t.hue;var n=t.saturation;var a=t.lightness;var o=t.alpha;return i(Os,"hsl",{ctor:"::",_0:Ms(e),_1:{ctor:"::",_0:Fs(n),_1:{ctor:"::",_0:Fs(a),_1:{ctor:"[]"}}}})};var Ps=function(r){var t=Zt(r);var e=t.red;var n=t.green;var a=t.blue;var o=t.alpha;return i(Os,"rgba",{ctor:"::",_0:E(e),_1:{ctor:"::",_0:E(n),_1:{ctor:"::",_0:E(a),_1:{ctor:"::",_0:E(o),_1:{ctor:"[]"}}}}})};var zs=function(r){var t=Zt(r);var e=t.red;var n=t.green;var a=t.blue;var o=t.alpha;return i(Os,"rgb",{ctor:"::",_0:E(e),_1:{ctor:"::",_0:E(n),_1:{ctor:"::",_0:E(a),_1:{ctor:"[]"}}}})};var Js=t(function(r,t,e){return{x:r,y:t,z:e}});var Us=t(function(r,t,e){return{l:r,a:t,b:e}});var js=t(function(r,t,e){return t+(e-t)*r});var qs=nr(360);var Ws=nr(180);var Hs=e(function(r,t,e,n){var a=js(n);var o=r;switch(o.ctor){case"RGB":var c=Zt(e);var u=Zt(t);return v(ue,O(i(a,R(u.red),R(c.red))),O(i(a,R(u.green),R(c.green))),O(i(a,R(u.blue),R(c.blue))),i(a,u.alpha,c.alpha));case"HSL":var c=Xt(e);var _=c.hue;var u=Xt(t);var l=u.hue;var f=m.cmp(_,l)>0&&m.cmp(_-l,Ws)>0?_-l+qs:m.cmp(_,l)<0&&m.cmp(l-_,Ws)>0?_+qs-l:_-l;return v(te,l+n*f,i(a,u.saturation,c.saturation),i(a,u.lightness,c.lightness),i(a,u.alpha,c.alpha));default:var s=Es(e);var d=Es(t);return Ts({l:i(a,d.l,s.l),a:i(a,d.a,s.a),b:i(a,d.b,s.b)})}});var Ys={ctor:"LAB"};var Vs={ctor:"HSL"};var Gs={ctor:"RGB"};var Qs=function(){var r=typeof document==="undefined"?function(r){return{style:{},appendChild:function(){}}}:function(r){var t=document.createElement(r);t.style.padding="0";t.style.margin="0";return t};function e(r,t,e){return{ctor:"Element_elm_builtin",_0:{element:e,props:{width:r,height:t,opacity:1,color:vr,href:"",tag:""}}}}function n(t,e){var n=t.props;var a=t.element;var o=n.width-(a.adjustWidth||0);var c=n.height-(a.adjustHeight||0);e.style.width=(o|0)+"px";e.style.height=(c|0)+"px";if(n.opacity!==1){e.style.opacity=n.opacity}if(n.color.ctor==="Just"){e.style.backgroundColor=rd(n.color._0)}if(n.tag!==""){e.id=n.tag}if(n.href!==""){var u=r("a");u.href=n.href;u.style.display="block";u.style.pointerEvents="auto";u.appendChild(e);e=u}return e}function a(r,t){switch(t._0.ctor){case"Plain":return o(t._3);case"Fitted":return u(r.width,r.height,t._3);case"Cropped":return i(t,r.width,r.height,t._3);case"Tiled":return c(t._3)}}function o(t){var e=r("img");e.src=t;e.name=t;e.style.display="block";return e}function c(t){var e=r("div");e.style.backgroundImage="url("+t+")";return e}function u(t,e,n){var a=r("div");a.style.background="url("+n+") no-repeat center";a.style.webkitBackgroundSize="cover";a.style.MozBackgroundSize="cover";a.style.OBackgroundSize="cover";a.style.backgroundSize="cover";return a}function i(t,e,n,a){var o=t._0._0;var c=r("div");c.style.overflow="hidden";var u=r("img");u.onload=function(){var r=e/t._1,a=n/t._2;u.style.width=(this.width*r|0)+"px";u.style.height=(this.height*a|0)+"px";u.style.marginLeft=(-o._0*r|0)+"px";u.style.marginTop=(-o._1*a|0)+"px"};u.src=a;u.name=a;c.appendChild(u);return c}function _(r){r.style.position="absolute";return r}function v(r){return r}function l(r){r.style.styleFloat="left";r.style.cssFloat="left";return r}var f={DUp:v,DDown:v,DLeft:l,DRight:l,DIn:_,DOut:_};function s(r){return r==="DUp"||r==="DLeft"||r==="DIn"}function d(t,e){var n=mr.toArray(e);var a=r("div");var o=f[t];if(o===_){a.style.pointerEvents="none"}if(s(t)){n.reverse()}var c=n.length;for(var u=0;u0){e.style.width=r+"px"}e.style.visibility="hidden";e.style.styleFloat="left";e.style.cssFloat="left";document.body.appendChild(e);var n=window.getComputedStyle(e,null);var a=Math.ceil(n.getPropertyValue("width").slice(0,-2)-0);var o=Math.ceil(n.getPropertyValue("height").slice(0,-2)-0);document.body.removeChild(e);return m.Tuple2(a,o)}return{toHtml:w,render:N,update:A,createNode:r,newElement:t(e),addTransform:g,block:S}}();var $s=t(function(r,t,e){var n=function(){var t=r;if(t.ctor==="Nothing"){return e}else{return i(N["++"],'',i(N["++"],e,""))))}}();return m.eq(t,"")?n:i(N["++"],'',i(N["++"],n,""))))});var Ks=t(function(r,t,e){return v(Ru,Pu,Ou(r),function(r){return t},e)});var Zs=function(r){return _(Xs,vr,"",r)};var Xs=t(function(r,t,e){r:while(true){var n=e;switch(n.ctor){case"Str":return _($s,r,t,i(ya,"
",i(jr,i(Ks," "," "),ca(_(Ks,">",">",_(Ks,"<","<",_(Ks,"'","'",_(Ks,'"',""",n._0))))))));case"Append":return _($s,r,t,i(N["++"],Zs(n._0),Zs(n._1)));case"Link":var a=fr(i(_r,n._0,r)),o=t,c=n._1;r=a;t=o;e=c;continue r;default:var u=r,v=i(N["++"],t,i(N["++"],n._0,i(N["++"],":",i(N["++"],n._1,";")))),l=n._2;r=u;t=v;e=l;continue r}}});var rd=function(r){var t=Zt(r);var e=t.red;var n=t.green;var a=t.blue;var o=t.alpha;return i(N["++"],"rgba(",i(N["++"],E(e),i(N["++"],", ",i(N["++"],E(n),i(N["++"],", ",i(N["++"],E(a),i(N["++"],", ",i(N["++"],E(o),")"))))))))};var td=function(r){return i(N["++"],"'",i(N["++"],i(ya,"', '",r),"'"))};var ed=t(function(r,t,e){var n=t;if(n.ctor==="Nothing"){return e}else{return i(r,n._0,e)}});var nd={typeface:{ctor:"[]"},height:vr,color:Se,bold:false,italic:false,line:vr};var ad=a(function(r,t,e,n,a,o){return{typeface:r,height:t,color:e,bold:n,italic:a,line:o}});var od=t(function(r,t,e){return{ctor:"Meta",_0:r,_1:t,_2:e}});var cd=r(function(r,t){var e=r;if(e.ctor==="[]"){return t}else{return _(od,"font-family",td(r),t)}});var ud=function(r){return _(od,"font-family","monospace",r)};var id=r(function(r,t){return _(od,"font-size",i(N["++"],E(r),"px"),t)});var _d=r(function(r,t){return _(od,"color",rd(r),t)});var vd=function(r){return _(od,"font-weight","bold",r)};var ld=function(r){return _(od,"font-style","italic",r)};var fd=r(function(r,t){var e=function(){var t=r;switch(t.ctor){case"Under":return"underline";case"Over":return"overline";default:return"line-through"}}();return _(od,"text-decoration",e,t)});var sd=r(function(r,t){return _(ed,id,r.height,_(ed,fd,r.line,(r.italic?ld:x)((r.bold?vd:x)(i(cd,r.typeface,i(_d,r.color,t))))))});var dd=r(function(r,t){return{ctor:"Link",_0:r,_1:t}});var hd=dd;var pd=r(function(r,t){return{ctor:"Append",_0:r,_1:t}});var gd=pd;var md=function(r){return{ctor:"Str",_0:r}};var bd=md;var yd=bd("");var wd=function(r){return _(Sr,gd,yd,r)};var kd=r(function(r,t){return wd(i(Xr,r,t))});var Td={ctor:"Through"};var xd={ctor:"Over"};var Nd={ctor:"Under"};var Ed=Qs.block("justify");var Bd=Qs.block("center");var Ad=Qs.block("right");var Rd=Qs.block("left");var Sd=function(r){return Rd(ud(bd(E(r))))};var Cd=Qs.newElement;var Ld=function(r){var t=r;var e=t._0;return{ctor:"_Tuple2",_0:e.props.width,_1:e.props.height}};var Od=function(r){var t=r;return t._0.props.height};var Fd=function(r){var t=r;return t._0.props.width};var Md=Qs.toHtml;var Dd=a(function(r,t,e,n,a,o){return{width:r,height:t,opacity:e,color:n,href:a,tag:o}});var Id=e(function(r,t,e,n){return{horizontal:r,vertical:t,x:e,y:n}});var Pd=function(r){return{ctor:"Element_elm_builtin",_0:r}};var zd=r(function(r,t){var e=t;var n=e._0.props;var a=e._0.element;var o=function(){var t=a;switch(t.ctor){case"Image":return O(R(t._2)/R(t._1)*R(r));case"RawHtml":return Eu(i(Qs.htmlHeight,r,a));default:return n.height}}();return Pd({element:a,props:m.update(n,{width:r,height:o})})});var Jd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{height:r})})});var Ud=t(function(r,t,e){return i(Jd,t,i(zd,r,e))});var jd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{opacity:r})})});var qd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{color:fr(r)})})});var Wd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{tag:r})})});var Hd=r(function(r,t){var e=t;return Pd({element:e._0.element,props:m.update(e._0.props,{href:r})})});var Yd={ctor:"Custom"};var Vd={ctor:"RawHtml"};var Gd={ctor:"Spacer"};var Qd=r(function(r,t){return _(Cd,r,t,Gd)});var $d=i(Qd,0,0);var Kd=r(function(r,t){return{ctor:"Flow",_0:r,_1:t}});var Zd=r(function(t,e){var n=r(function(r,n){return _(Cd,r,n,i(Kd,t,e))});var a=function(r){return i(_r,0,Mr(r))};var o=i(jr,Od,e);var c=i(jr,Fd,e);if(m.eq(e,{ctor:"[]"})){return $d}else{var u=t;switch(u.ctor){case"DUp":return i(n,a(c),Or(o));case"DDown":return i(n,a(c),Or(o));case"DLeft":return i(n,Or(c),a(o));case"DRight":return i(n,Or(c),a(o));case"DIn":return i(n,a(c),a(o));default:return i(n,a(c),a(o))}}});var Xd=r(function(r,t){return{ctor:"Container",_0:r,_1:t}});var rh=e(function(r,t,e,n){var a=e;return _(Cd,r,t,i(Xd,a._0,n))});var th=e(function(r,t,e,n){return{ctor:"Image",_0:r,_1:t,_2:e,_3:n}});var eh={ctor:"Tiled"};var nh=t(function(r,t,e){return _(Cd,r,t,v(th,eh,r,t,e))});var ah=function(r){return{ctor:"Cropped",_0:r}};var oh=e(function(r,t,e,n){return _(Cd,t,e,v(th,ah(r),t,e,n))});var ch={ctor:"Fitted"};var uh=t(function(r,t,e){return _(Cd,r,t,v(th,ch,r,t,e))});var ih={ctor:"Plain"};var _h=t(function(r,t,e){return _(Cd,r,t,v(th,ih,r,t,e))});var vh={ctor:"N"};var lh={ctor:"Z"};var fh={ctor:"P"};var sh=function(r){return{ctor:"Relative",_0:r}};var dh=sh;var hh=function(r){return{ctor:"Absolute",_0:r}};var ph=hh;var gh=function(r){return{ctor:"Position",_0:r}};var mh=gh({horizontal:lh,vertical:lh,x:sh(.5),y:sh(.5)});var bh=gh({horizontal:vh,vertical:fh,x:hh(0),y:hh(0)});var yh=gh({horizontal:fh,vertical:fh,x:hh(0),y:hh(0)});var wh=gh({horizontal:vh,vertical:vh,x:hh(0),y:hh(0)});var kh=gh({horizontal:fh,vertical:vh,x:hh(0),y:hh(0)});var Th=gh({horizontal:vh,vertical:lh,x:hh(0),y:sh(.5)});var xh=gh({horizontal:fh,vertical:lh,x:hh(0),y:sh(.5)});var Nh=gh({horizontal:lh,vertical:fh,x:sh(.5),y:hh(0)});var Eh=gh({horizontal:lh,vertical:vh,x:sh(.5),y:hh(0)});var Bh=r(function(r,t){return gh({horizontal:lh,vertical:lh,x:r,y:t})});var Ah=r(function(r,t){return gh({horizontal:vh,vertical:fh,x:r,y:t})});var Rh=r(function(r,t){return gh({horizontal:fh,vertical:fh,x:r,y:t})});var Sh=r(function(r,t){return gh({horizontal:vh,vertical:vh,x:r,y:t})});var Ch=r(function(r,t){return gh({horizontal:fh,vertical:vh,x:r,y:t})});var Lh=r(function(r,t){return gh({horizontal:vh,vertical:lh,x:r,y:t})});var Oh=r(function(r,t){return gh({horizontal:fh,vertical:lh,x:r,y:t})});var Fh=r(function(r,t){return gh({horizontal:lh,vertical:fh,x:r,y:t})});var Mh=r(function(r,t){return gh({horizontal:lh,vertical:vh,x:r,y:t})});var Dh={ctor:"DOut"};var Ih=function(r){var t=i(jr,Od,r);var e=i(jr,Fd,r);return _(Cd,i(_r,0,Mr(e)),i(_r,0,Mr(t)),i(Kd,Dh,r))};var Ph=Dh;var zh={ctor:"DIn"};var Jh=zh;var Uh={ctor:"DRight"};var jh=Uh;var qh=r(function(r,t){return _(Cd,Fd(r)+Fd(t),i(D,Od(r),Od(t)),i(Kd,jh,{ctor:"::",_0:r,_1:{ctor:"::",_0:t,_1:{ctor:"[]"}}}))});var Wh={ctor:"DLeft"};var Hh=Wh;var Yh={ctor:"DDown"};var Vh=r(function(r,t){return _(Cd,i(D,Fd(r),Fd(t)),Od(r)+Od(t),i(Kd,Yh,{ctor:"::",_0:r,_1:{ctor:"::",_0:t,_1:{ctor:"[]"}}}))});var Gh=r(function(r,t){return _(Cd,i(D,Fd(t),Fd(r)),Od(t)+Od(r),i(Kd,Yh,{ctor:"::",_0:t,_1:{ctor:"::",_0:r,_1:{ctor:"[]"}}}))});var Qh=Yh;var $h={ctor:"DUp"};var Kh=$h;var Zh=function(){function r(r,t){r.lineWidth=t.width;var e=t.cap.ctor;r.lineCap=e==="Flat"?"butt":e==="Round"?"round":"square";var n=t.join.ctor;r.lineJoin=n==="Smooth"?"round":n==="Sharp"?"miter":"bevel";r.miterLimit=t.join._0||10;r.strokeStyle=rd(t.color)}function e(r,t,e){var n=e.ctor;t.fillStyle=n==="Solid"?rd(e._0):n==="Texture"?u(r,t,e._0):v(t,e._0)}function n(r,t){var e=mr.toArray(t);var n=e.length-1;if(n<=0){return}r.moveTo(e[n]._0,e[n]._1);while(n--){r.lineTo(e[n]._0,e[n]._1)}if(t.closed){n=e.length-1;r.lineTo(e[n]._0,e[n]._1)}}function a(r,t,e){if(t.dashing.ctor==="[]"){n(r,e)}else{o(r,t,e)}r.scale(1,-1);r.stroke()}function o(r,t,e){var n=mr.toArray(e);if(e.closed){n.push(n[0])}var a=mr.toArray(t.dashing);var o=n.length-1;if(o<=0){return}var c=n[o]._0,u=n[o]._1;var i=0,_=0,v=0,l=0,f=0;var s=0,d=a.length;var h=true,p=a[0];r.moveTo(c,u);while(o--){i=n[o]._0;_=n[o]._1;v=i-c;l=_-u;f=Math.sqrt(v*v+l*l);while(p<=f){c+=v*p/f;u+=l*p/f;r[h?"lineTo":"moveTo"](c,u);v=i-c;l=_-u;f=Math.sqrt(v*v+l*l);h=!h;s=(s+1)%d;p=a[s]}if(f>0){r[h?"lineTo":"moveTo"](i,_);p-=f}c=i;u=_}}function c(t,e,n){r(t,e);return a(t,e,n)}function u(r,t,e){var n=new Image;n.src=e;n.onload=r;return t.createPattern(n,"repeat")}function v(r,t){var e;var n=[];if(t.ctor==="Linear"){var a=t._0,o=t._1;e=r.createLinearGradient(a._0,-a._1,o._0,-o._1);n=mr.toArray(t._2)}else{var a=t._0,c=t._2;e=r.createRadialGradient(a._0,-a._1,t._1,c._0,-c._1,t._3);n=mr.toArray(t._4)}var u=n.length;for(var i=0;io){o=i.height}}var v=-a/2;for(var u=0;u-1e-5){return 0}return r}function x(r,t,e,n){var a=e.form._0._0.props;var o=f(ep,1,0,0,-1,(r-a.width)/2,(t-a.height)/2);var c=n.length;for(var u=0;u>>10),_1:{ctor:"::",_0:It(56320|1023&t),_1:{ctor:"[]"}}})}};var lg=r(function(r,t){var e=t;var n=e._2;var a=e._1;var o=function(r){return 63&r|e._0<<6};return m.eq(a,0)?m.eq(128&r,0)?{ctor:"_Tuple3",_0:0,_1:0,_2:i(N["++"],n,vg(r))}:m.eq(224&r,192)?{ctor:"_Tuple3",_0:31&r,_1:1,_2:n}:m.eq(240&r,224)?{ctor:"_Tuple3",_0:15&r,_1:2,_2:n}:{ctor:"_Tuple3",_0:7&r,_1:3,_2:n}:m.eq(a,1)?{ctor:"_Tuple3",_0:0,_1:0,_2:i(N["++"],n,vg(o(r)))}:{ctor:"_Tuple3",_0:o(r),_1:a-1,_2:n}});var fg=r(function(r,t){return{ctor:"_Tuple3",_0:0,_1:0,_2:i(lg,255&r>>>0,i(lg,255&r>>>8,i(lg,255&r>>>16,t)))}});var sg=r(function(r,t){var e=t;var n=e._2;var a=e._0;var o=e._1;var c=_g(r);var u=o;if(u===3){return i(fg,a|c,n)}else{return{ctor:"_Tuple3",_0:c<<(3-o)*6|a,_1:o+1,_2:n}}});var dg={ctor:"_Tuple3",_0:0,_1:0,_2:{ctor:"_Tuple3",_0:0,_1:0,_2:""}};var hg=function(r){var t=r;return m.cmp(t._2._1,0)>0?hn("Invalid UTF-16"):gn(t._2._2)};var pg=r(function(r,t){return i(Xn,"==",r)?i(da,2,t):i(Xn,"=",r)?i(da,1,t):t});var gg=Ou("^([A-Za-z0-9\\/+]{4})*([A-Za-z0-9\\/+]{2}[A-Za-z0-9\\/+=]{2})?$");var mg=function(r){return i(Cu,gg,r)?gn(r):hn("Invalid base64")};var bg=function(r){var t=i(X,Ba(r),4);switch(t){case 3:return i(N["++"],r,"=");case 2:return i(N["++"],r,"==");default:return r}};var yg=function(r){return i(mn,pg(r),i(pn,function(r){return hg(_(Ta,sg,dg,r))},mg(r)))};var wg=function(r){return yg(bg(r))};var kg=function(r){var t=r;switch(t){case 0:return"A";case 1:return"B";case 2:return"C";case 3:return"D";case 4:return"E";case 5:return"F";case 6:return"G";case 7:return"H";case 8:return"I";case 9:return"J";case 10:return"K";case 11:return"L";case 12:return"M";case 13:return"N";case 14:return"O";case 15:return"P";case 16:return"Q";case 17:return"R";case 18:return"S";case 19:return"T";case 20:return"U";case 21:return"V";case 22:return"W";case 23:return"X";case 24:return"Y";case 25:return"Z";case 26:return"a";case 27:return"b";case 28:return"c";case 29:return"d";case 30:return"e";case 31:return"f";case 32:return"g";case 33:return"h";case 34:return"i";case 35:return"j";case 36:return"k";case 37:return"l";case 38:return"m";case 39:return"n";case 40:return"o";case 41:return"p";case 42:return"q";case 43:return"r";case 44:return"s";case 45:return"t";case 46:return"u";case 47:return"v";case 48:return"w";case 49:return"x";case 50:return"y";case 51:return"z";case 52:return"0";case 53:return"1";case 54:return"2";case 55:return"3";case 56:return"4";case 57:return"5";case 58:return"6";case 59:return"7";case 60:return"8";case 61:return"9";case 62:return"+";default:return"/"}};var Tg=function(r){return i(N["++"],kg(63&r>>>18),i(N["++"],kg(63&r>>>12),i(N["++"],kg(63&r>>>6),kg(63&r>>>0))))};var xg=r(function(r,t){var e=t;var n=e._0;var a=e._1;var o=e._2<<8|r;var c=a;if(c===2){return{ctor:"_Tuple3",_0:i(N["++"],n,Tg(o)),_1:0,_2:0}}else{return{ctor:"_Tuple3",_0:n,_1:a+1,_2:o}}});var Ng=r(function(t,e){var n=e;var a=n._1;var o=Pt(t);var c=n._0;if(c.ctor==="Nothing"){return m.cmp(o,128)<0?{ctor:"_Tuple2",_0:vr,_1:i(xg,o,a)}:m.cmp(o,2048)<0?{ctor:"_Tuple2",_0:vr,_1:i(xg,128|63&o,i(xg,192|o>>>6,a))}:m.cmp(o,55296)<0||m.cmp(o,57344)>-1?{ctor:"_Tuple2",_0:vr,_1:i(xg,128|63&o,i(xg,128|63&o>>>6,i(xg,224|o>>>12,a)))}:{ctor:"_Tuple2",_0:fr(o),_1:a}}else{var u=i(r(function(r,t){return r+t}),65536,1023&o|(1023&c._0)<<10);return{ctor:"_Tuple2",_0:vr,_1:i(xg,128|63&u,i(xg,128|63&u>>>6,i(xg,128|63&u>>>12,i(xg,240|u>>>18,a))))}}});var Eg=function(r){var t=r;var e=t._1._0;var n=t._1._2;var a=t._1._1;switch(a){case 1:return i(N["++"],e,i(N["++"],kg(63&n>>>2),i(N["++"],kg(63&n<<4),"==")));case 2:return i(N["++"],e,i(N["++"],kg(63&n>>>10),i(N["++"],kg(63&n>>>4),i(N["++"],kg(63&n<<2),"="))));default:return e}};var Bg={ctor:"_Tuple2",_0:vr,_1:{ctor:"_Tuple3",_0:"",_1:0,_2:0}};var Ag=function(r){return Eg(_(Ta,Ng,Bg,r))};var Rg=wg;var Sg=Ag;var Cg=r(function(r,t){var e=R(Math.pow(10,r));return R(O(t*e))/e});var Lg=r(function(r,t){var e=i(Cg,r,t);var n=L(i(j,10,e))+1;var a=n+1+r;var o=E(e);var c=i(ta,".",o)?o:i(N["++"],o,".");return _(la,a,m.chr("0"),c)});var Og=function(r){var t=r;switch(t.ctor){case"Jan":return 1;case"Feb":return 2;case"Mar":return 3;case"Apr":return 4;case"May":return 5;case"Jun":return 6;case"Jul":return 7;case"Aug":return 8;case"Sep":return 9;case"Oct":return 10;case"Nov":return 11;default:return 12}};var Fg=function(r){var t=nc(r);var e=ac(r);var n=oc(r);return i(ya,"-",{ctor:"::",_0:_(fa,4,m.chr("0"),E(n)),_1:{ctor:"::",_0:_(fa,2,m.chr("0"),E(Og(e))),_1:{ctor:"::",_0:_(fa,2,m.chr("0"),E(t)),_1:{ctor:"[]"}}}})};var Mg=r(function(r,t){var e=ic(r);if(e.ctor==="Ok"){return e._0}else{return t}});var Dg=function(r){var t=ic(r);if(t.ctor==="Ok"){return t._0}else{return m.crashCase("DateExtra",{start:{line:9,column:5},end:{line:14,column:58}},t)(i(N["++"],"unsafeFromString: ",r))}};var Ig=Ig||{};Ig["=>"]=r(function(r,t){return{ctor:"_Tuple2",_0:r,_1:t}});var Pg=function(r){return oa(i(ga,1,r.label))};var zg=r(function(r,t){return Dg(i(ya,"-",{ctor:"::",_0:E(t),_1:{ctor:"::",_0:E(Og(ac(r.birthDate))),_1:{ctor:"::",_0:E(nc(r.birthDate)),_1:{ctor:"[]"}}}}))});var Jg=function(r){return i(I,r.lifeExpectancy,r.oldFrom)};var Ug=function(r){return i(I,r.lifeExpectancy,r.kidUntil)};var jg=function(r){return r.onlyAdultYears?i(zg,r,oc(r.birthDate)+Jg(r)):i(zg,r,oc(r.birthDate)+r.lifeExpectancy)};var qg=function(r){return r.onlyAdultYears?i(zg,r,oc(r.birthDate)+r.kidUntil):r.birthDate};var Wg=ve;var Hg=function(r){return{from:i(Mg,r.from,cc(0)),to:i(Mg,r.to,cc(0)),label:r.label,overlay:r.overlay,color:i(_r,Wg,sn(Ls(r.color)))}};var Yg=function(r){return{from:Fg(cc(r.now)),to:Fg(cc(r.now)),label:"",overlay:false,color:Rs(Wg)}};var Vg=r(function(r,t){return m.update(t,{eventFormOpen:r.eventFormOpen,eventForm:r.eventForm,modalOpen:r.modalOpen,now:r.now})});var Gg=function(r){return function(t){return function(e){return function(n){return function(a){return function(o){return function(c){return function(u){return function(i){return function(_){return function(v){return function(l){return{birthDate:r,birthDateString:t,kidUntil:e,oldFrom:n,lifeExpectancy:a,lifeExpectancyString:o,onlyAdultYears:c,events:u,eventFormOpen:i,eventForm:_,modalOpen:v,now:l}}}}}}}}}}}}};var Qg=a(function(r,t,e,n,a,o){return{birthDate:r,kidUntil:t,oldFrom:e,lifeExpectancy:n,onlyAdultYears:a,events:o}});var $g=n(function(r,t,e,n,a){return{from:r,to:t,color:e,label:n,overlay:a}});var Kg=n(function(r,t,e,n,a){return{from:r,to:t,color:e,label:n,overlay:a}});var Zg={birthDate:Dg("1988-07-24"),birthDateString:"1988-07-24",kidUntil:18,oldFrom:70,lifeExpectancy:80,lifeExpectancyString:"80",onlyAdultYears:false,events:{ctor:"[]"},eventFormOpen:-1,eventForm:l(Kg,"","","","",false),modalOpen:false,now:0};var Xg=function(r){return m.update(Zg,{birthDate:r.birthDate,birthDateString:Fg(r.birthDate),kidUntil:r.kidUntil,oldFrom:r.oldFrom,lifeExpectancy:r.lifeExpectancy,lifeExpectancyString:E(r.lifeExpectancy),onlyAdultYears:r.onlyAdultYears,events:r.events})};var rm={ctor:"EventLabel"};var tm={ctor:"EventColor"};var em={ctor:"EventTo"};var nm={ctor:"EventFrom"};var am={ctor:"ToggleModal"};var om=function(r){return{ctor:"NewConfig",_0:r}};var cm={ctor:"DeleteEvent"};var um={ctor:"SaveEvent"};var im=function(r){return{ctor:"UpdateEventOverlay",_0:r}};var _m=r(function(r,t){return{ctor:"UpdateEvent",_0:r,_1:t}});var vm=function(r){return{ctor:"ShowEventForm",_0:r}};var lm=function(r){return{ctor:"OnlyAdultYears",_0:r}};var fm=function(r){return{ctor:"NewLifeExpectancy",_0:r}};var sm=function(r){return{ctor:"NewBirthDate",_0:r}};var dm=function(r){return{ctor:"NewUrl",_0:r}};var hm=function(r){return{ctor:"Tick",_0:r}};var pm=i(Hc,function(r){return Vc(i(_r,Wg,sn(Ls(r))))},mu);var gm=function(r){return Jc(Rs(r))};var mm=i(Hc,function(r){var t=ic(r);if(t.ctor==="Ok"){return Vc(t._0)}else{return Yc(t._0)}},mu);var bm=function(r){return Jc(Fg(r))};var ym=f(ru,$g,i(iu,"from",mm),i(iu,"to",mm),i(iu,"color",pm),i(iu,"label",mu),i(iu,"overlay",gu));var wm=function(r){return Mc({ctor:"::",_0:i(Ig["=>"],"from",bm(r.from)),_1:{ctor:"::",_0:i(Ig["=>"],"to",bm(r.to)),_1:{ctor:"::",_0:i(Ig["=>"],"color",gm(r.color)),_1:{ctor:"::",_0:i(Ig["=>"],"label",Jc(r.label)),_1:{ctor:"::",_0:i(Ig["=>"],"overlay",Ic(r.overlay)),_1:{ctor:"[]"}}}}}})};var km=s(Xc,Qg,i(iu,"birth-date",mm),i(iu,"kid-until",pu),i(iu,"old-from",pu),i(iu,"life-expectancy",pu),i(iu,"only-adult-years",gu),i(iu,"events",su(ym)));var Tm=function(r){var t=i($c,km,r);if(t.ctor==="Err"){return hn(t._0)}else{return gn(Xg(t._0))}};var xm=function(r){return i(Uc,2,Mc({ctor:"::",_0:i(Ig["=>"],"birth-date",bm(r.birthDate)),_1:{ctor:"::",_0:i(Ig["=>"],"life-expectancy",zc(r.lifeExpectancy)),_1:{ctor:"::",_0:i(Ig["=>"],"kid-until",zc(r.kidUntil)),_1:{ctor:"::",_0:i(Ig["=>"],"old-from",zc(r.oldFrom)),_1:{ctor:"::",_0:i(Ig["=>"],"only-adult-years",Ic(r.onlyAdultYears)),_1:{ctor:"::",_0:i(Ig["=>"],"events",Oc(i(jr,wm,r.events))),_1:{ctor:"[]"}}}}}}}))};var Nm=function(r){var t=Rg(r);if(t.ctor==="Err"){return hn(t._0)}else{return Tm(t._0)}};var Em=function(r){return Sg(xm(r))};var Bm=r(function(t,e){return i(Hr,x,i(it,r(function(r,e){return m.eq(r,t)?vr:fr(e)}),e))});var Am=function(r){return r.onlyAdultYears?r.kidUntil:1};var Rm=function(r){var t=Em(r);var e=i(N["++"],"#",t);return Yf(e)};var Sm=function(r){var t=i(ha,1,r.hash);return Oa(t)?gn(Zg):Nm(t)};var Cm=r(function(r,t){var e=r;switch(e.ctor){case"Tick":return{ctor:"_Tuple2",_0:m.update(t,{now:e._0}),_1:Qe};case"NewUrl":var n=function(){var r=Sm(e._0);if(r.ctor==="Ok"){return i(Vg,t,r._0)}else{return t}}();return{ctor:"_Tuple2",_0:n,_1:Qe};case"NewBirthDate":var a=e._0;var o=i(Cu,Ou("^\\d{4}-\\d{2}-\\d{2}$"),a);var c=o?ic(a):hn("");var u=m.update(t,{birthDateString:a});var _=c;if(_.ctor==="Ok"){var n=m.update(u,{birthDate:_._0});return{ctor:"_Tuple2",_0:n,_1:Rm(n)}}else{return{ctor:"_Tuple2",_0:u,_1:Qe}}case"NewLifeExpectancy":var v=e._0;var l=i(_r,0,sn($n(v)));var u=m.update(t,{lifeExpectancyString:v});if(m.cmp(l,Am(t))<0||m.cmp(l,500)>0){return{ctor:"_Tuple2",_0:u,_1:Qe}}else{var n=m.update(u,{lifeExpectancy:l});return{ctor:"_Tuple2",_0:n,_1:Rm(n)}}case"OnlyAdultYears":var f=m.update(t,{onlyAdultYears:e._0});var n=m.update(f,{lifeExpectancy:i(D,f.lifeExpectancy,Am(f))});return{ctor:"_Tuple2",_0:n,_1:Rm(n)};case"ShowEventForm":var s=e._0;var d=m.eq(t.eventFormOpen,s)?-1:s;var h=Jr(Yr(i(nt,d,t.events)));var p=function(){var r=h;if(r.ctor==="Nothing"){return Yg(t)}else{var e=r._0;return{from:Fg(e.from),to:Fg(e.to),color:Rs(e.color),label:e.label,overlay:e.overlay}}}();return{ctor:"_Tuple2",_0:m.update(t,{eventFormOpen:d,eventForm:p}),_1:Qe};case"UpdateEvent":var g=e._1;var b=t.eventForm;var y=function(){var r=e._0;switch(r.ctor){case"EventFrom":return m.update(b,{from:g});case"EventTo":return m.update(b,{to:g});case"EventColor":return m.update(b,{color:g});default:return m.update(b,{label:g})}}();return{ctor:"_Tuple2",_0:m.update(t,{eventForm:y}),_1:Qe};case"UpdateEventOverlay":var b=t.eventForm;var y=m.update(b,{overlay:e._0});return{ctor:"_Tuple2",_0:m.update(t,{eventForm:y}),_1:Qe};case"SaveEvent":var w=Hg(t.eventForm);var k=!m.eq(t.eventFormOpen,0);var T=k?i(Bm,t.eventFormOpen-1,t.events):t.events;var x=i(yr,function(r){return Fg(r.from)},{ctor:"::",_0:w,_1:T});var n=m.update(t,{events:x,eventFormOpen:-1});return{ctor:"_Tuple2",_0:n,_1:Rm(n)};case"DeleteEvent":var x=i(Bm,t.eventFormOpen-1,t.events);var n=m.update(t,{events:x,eventFormOpen:-1});return{ctor:"_Tuple2",_0:n,_1:Rm(n)};case"NewConfig":var n=function(){var r=Tm(e._0);if(r.ctor==="Ok"){return i(Vg,t,r._0)}else{return t}}();return{ctor:"_Tuple2",_0:n,_1:Rm(n)};default:return{ctor:"_Tuple2",_0:m.update(t,{modalOpen:!t.modalOpen}),_1:Qe}}});var Lm=function(r){var t=i(_r,Zg,sn(Sm(r)));return{ctor:"_Tuple2",_0:t,_1:i(jn,hm,qo)}};var Om=r(function(r,t){var e=i(zg,r,oc(qg(r))+r.oldFrom);return r.onlyAdultYears?false:m.cmp(uc(e),t)<1});var Fm=r(function(r,t){var e=i(zg,r,oc(qg(r))+r.kidUntil);return r.onlyAdultYears?false:m.cmp(uc(e),t)>-1});var Mm=r(function(r,t){return m.cmp(t,r.now)<0});var Dm=r(function(r,t){return m.cmp(t,uc(qg(r)))<0||m.cmp(t,uc(jg(r)))>0});var Im=function(t){var e=t;if(e.ctor==="[]"){return vr}else{return fr(_(Cr,r(function(r,t){return v(Hs,Vs,r,t,.5)}),e._0,e._1))}};var Pm=86400*1e3;var zm=Pm*7;var Jm=r(function(r,t){var e=zm/2;var n=r.now;return m.cmp(n-e,t)<1&&m.cmp(t,n+e)<0});var Um=r(function(r,t){var e=t;var n=oc(r.birthDate)+e._0;var a=Dg(i(N["++"],E(n),"-01-01"));var o=function(){var r=ec(a);switch(r.ctor){case"Mon":return 0;case"Tue":return 1;case"Wed":return 2;case"Thu":return 3;case"Fri":return 4;case"Sat":return 5;default:return 6}}();var c=R(e._1-1)*zm+R(o)*Pm;return uc(a)+c});var jm=1;var qm=function(){var r=Bp;return m.update(r,{width:jm})}();var Wm=10;var Hm=t(function(r,t,e){var n=i(Zp,qm,og(Wm-jm));var a=function(r){return i(Gp,r,og(Wm))};var o=function(r){return fr(i(hp,1,Jp(i(_d,Ce,vd(i(id,Wm,ud(bd(Pg(r)))))))))};var c=i(Um,r,{ctor:"_Tuple2",_0:t,_1:e});var u=function(r){return m.cmp(uc(r.from),c)<1&&m.cmp(uc(r.to),c)>-1};var _=i(Kr,function(r){return r.overlay},i(qr,u,r.events));var v=_._0;var l=_._1;var f=Im(i(jr,function(r){return r.color},l));var s=i(lr,o,Jr(v));var d=function(r){var t=s;if(t.ctor==="Nothing"){return a(r)}else{return Op({ctor:"::",_0:a(r),_1:{ctor:"::",_0:t._0,_1:{ctor:"[]"}}})}};if(i(Jm,r,c)){return i(mp,.5,d(Se))}else{var h=f;if(h.ctor==="Nothing"){return i(Dm,r,c)?d(Le):i(Fm,r,c)||i(Om,r,c)?d(Oe):i(Mm,r,c)?d(Se):n}else{return d(h._0)}}});var Ym=20;var Vm=60;var Gm=function(){var r=function(r){return i(dp,R(r)*(Wm+jm*2),Jp(bd(E(r))))};return i(sp,{ctor:"_Tuple2",_0:Vm,_1:-10},Op(i(jr,r,i(qr,function(r){return!m.eq(i(N["%"],r,2),0)},i(ut,1,52)))))}();var Qm=r(function(r,t){var e=function(e){return i(dp,R(e)*(Wm+jm*2)+Vm,_(Hm,r,t,e))};var n=_(fa,2,m.chr("0"),E(t));var a=oc(r.birthDate)+t;var o=i(sp,{ctor:"_Tuple2",_0:32,_1:2},Jp(bd(i(N["++"],E(a),i(N["++"]," / ",n)))));return{ctor:"::",_0:o,_1:i(jr,e,i(ut,1,52))}});var $m=Vm+52*(Wm+jm*2)+Ym;var Km=function(r){return r*(Wm+jm*2)};var Zm=function(r){var t=R(Jg(r));var e=R(Ug(r));var n={ctor:"_Tuple3",_0:R(r.kidUntil),_1:R(r.oldFrom),_2:R(r.lifeExpectancy)};var a=n._0;var o=n._1;var c=n._2;var u={ctor:"_Tuple2",_0:11,_1:6};var _=u._0;var v=u._1;var l=i(hp,Km(c/2-a)-v,i(dp,-2,i(Gp,Se,i(ag,10,1))));var f=i(hp,0-(Km(o-c/2)+v),i(dp,-2,i(Gp,Se,i(ag,10,1))));var s=function(r){return i(gp,nr(-90),Jp(bd(r)))};var d=i(hp,Km((c-e)/2)-_,s("kid"));var h=m.cmp(t-a,8)<0?s(""):i(hp,Km(c/2-(a+t)/2)-_,s("adult years"));var p=m.cmp(c-o,1)<0?s(""):i(hp,0-(Km((c+o)/2-c/2)+_),s("old"));return Op({ctor:"::",_0:d,_1:{ctor:"::",_0:l,_1:{ctor:"::",_0:h,_1:{ctor:"::",_0:f,_1:{ctor:"::",_0:p,_1:{ctor:"[]"}}}}}})};var Xm=16;var rb=function(r){var t=r.onlyAdultYears?{ctor:"_Tuple2",_0:r.kidUntil,_1:Jg(r)}:{ctor:"_Tuple2",_0:0,_1:r.lifeExpectancy};var e=t._0;var n=t._1;var a=function(t){return i(hp,(0-R(t-e+1))*(Wm+jm*2)-Xm,Op(i(Qm,r,t)))};return{ctor:"::",_0:Gm,_1:i(jr,a,i(ut,e,n))}};var tb=function(r){var t=i(dp,$m/2-Ym+Xm,Zm(r));var e=Xm*2+Km(r.lifeExpectancy);var n=i(hp,e/2,i(dp,(0-$m)/2,Op(rb(r))));var a=r.onlyAdultYears?Op({ctor:"::",_0:n,_1:{ctor:"[]"}}):Op({ctor:"::",_0:n,_1:{ctor:"::",_0:t,_1:{ctor:"[]"}}});return Md(_(_p,$m,S(e),{ctor:"::",_0:a,_1:{ctor:"[]"}}))};var eb=function(){var r='\n{\n "birth-date": "1988-07-24",\n "life-expectancy": 80,\n "kid-until": 18,\n "old-from": 70,\n "only-adult-years": false,\n "events": [\n {\n "from": "2010-09-14",\n "to": "2014-02-01",\n "color": "#f57900",\n "label": "college",\n "overlay": false\n },\n {\n "from": "2015-06-01",\n "to": "2016-05-31",\n "color": "#73d216",\n "label": "trip",\n "overlay": false\n }\n ]\n}\n';return Sg(r)}();var nb=function(r){var t=uc(jg(r))-r.now;var e=i(D,0,Jo(t)/24/7);return i(Lg,6,e)};var ab={ctor:"::",_0:Zv("date"),_1:{ctor:"::",_0:Gl(true),_1:{ctor:"::",_0:tl("YYYY-MM-DD"),_1:{ctor:"::",_0:_l("[1-2]\\d{3}-[0-1]\\d-[0-3]\\d"),_1:{ctor:"[]"}}}}};var ob={ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row mt-1"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-12"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("alert alert-info"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Vi,{ctor:"[]"},{ctor:"::",_0:hi("Privacy: "),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi("this page runs entirely in your browser so no data is sent to any server."),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Li,{ctor:"::",_0:Fv("text-center"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Inspired by "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://i.imgur.com/67aHKhF.jpg"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("this chart"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi(" - "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("http://waitbutwhy.com/2014/05/life-weeks.html"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("Terrified?"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi(" - "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://github.com/infertux/lifechart"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("Source code"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi(" - "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("javascript:void(0)"),_1:{ctor:"::",_0:yf(am),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("Export raw data"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}}}}}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("d-none"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Vi,{ctor:"[]"},{ctor:"::",_0:hi("Reminder: "),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi("every single person you've ever known will die eventually - and so will you - but "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://youtu.be/k5RH3BdXDOY"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("don't worry"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:hi(" :)"),_1:{ctor:"[]"}}}}}),_1:{ctor:"[]"}}}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}};var cb=function(r){var t=i(Lg,6,_(U,0,100,100*(r.now-uc(qg(r)))/(uc(jg(r))-uc(qg(r)))));var e=nb(r);return{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row mt-2"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Ni,{ctor:"[]"},{ctor:"::",_0:i(p_,{ctor:"::",_0:Fv("badge badge-primary"),_1:{ctor:"[]"}},{ctor:"::",_0:hi(i(N["++"],t,"% elapsed")),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col text-right"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Ni,{ctor:"[]"},{ctor:"::",_0:i(p_,{ctor:"::",_0:Fv("badge badge-primary"),_1:{ctor:"[]"}},{ctor:"::",_0:hi(i(N["++"],e," weeks left")),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row mt-1"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-12"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("progress"),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"height","1.7rem"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("progress-bar progress-bar-striped progress-bar-animated"),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"width",i(N["++"],t,"%")),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}},{ctor:"[]"}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}};var ub=r(function(r,t){var e=i(Hi,{ctor:"::",_0:Fv("btn btn-danger"),_1:{ctor:"::",_0:wl("javascript:void(0)"),_1:{ctor:"::",_0:yf(cm),_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("Delete"),_1:{ctor:"[]"}});var n=m.eq(t,0);var a=i(Y_,{ctor:"::",_0:Fv("btn btn-primary ml-1"),_1:{ctor:"::",_0:Zv("submit"),_1:{ctor:"::",_0:Xv(n?"Add":"Save"),_1:{ctor:"[]"}}}},{ctor:"[]"});var o=n?{ctor:"::",_0:a,_1:{ctor:"[]"}}:{ctor:"::",_0:e,_1:{ctor:"::",_0:a,_1:{ctor:"[]"}}};var c=m.eq(r.eventFormOpen,t)?"":" d-none";var u=r.eventForm;return i(Pi,{ctor:"::",_0:Fv(i(N["++"],"list-group-item",c)),_1:{ctor:"[]"}},{ctor:"::",_0:i(j_,{ctor:"::",_0:vf(um),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-prepend"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-text"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("From"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Y_,i(Gr,ab,{ctor:"::",_0:Fv("form-control"),_1:{ctor:"::",_0:Xv(u.from),_1:{ctor:"::",_0:ll(u.to),_1:{ctor:"::",_0:ff(_m(nm)),_1:{ctor:"[]"}}}}}),{ctor:"[]"}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-prepend"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-text"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("To"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Y_,i(Gr,ab,{ctor:"::",_0:Fv("form-control"),_1:{ctor:"::",_0:Xv(u.to),_1:{ctor:"::",_0:fl(u.from),_1:{ctor:"::",_0:ff(_m(em)),_1:{ctor:"[]"}}}}}),{ctor:"[]"}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-prepend"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("input-group-text"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Label"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-control"),_1:{ctor:"::",_0:tl("label"),_1:{ctor:"::",_0:Zv("text"),_1:{ctor:"::",_0:Gl(true),_1:{ctor:"::",_0:Xv(u.label),_1:{ctor:"::",_0:ff(_m(rm)),_1:{ctor:"[]"}}}}}}},{ctor:"[]"}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("form-check-inline"),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"line-height","2.5rem"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}},{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-check-input"),_1:{ctor:"::",_0:Zv("checkbox"),_1:{ctor:"::",_0:Ul(u.overlay),_1:{ctor:"::",_0:lf(im),_1:{ctor:"[]"}}}}},{ctor:"[]"}),_1:{ctor:"::",_0:hi(" overlay"),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv(i(N["++"],"float-right",u.overlay?" d-none":"")),_1:{ctor:"::",_0:Zv("color"),_1:{ctor:"::",_0:Gl(true),_1:{ctor:"::",_0:Xv(u.color),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"height","2.5rem"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:ff(_m(tm)),_1:{ctor:"[]"}}}}}}},{ctor:"[]"}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-12 text-right"),_1:{ctor:"[]"}},o),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}}),_1:{ctor:"[]"}})});var ib=function(r){return{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("list-group-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Ei,{ctor:"::",_0:Fv("mb-0"),_1:{ctor:"[]"}},{ctor:"::",_0:i(p_,{ctor:"[]"},{ctor:"::",_0:hi("Events"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("javascript:void(0)"),_1:{ctor:"::",_0:yf(vm(0)),_1:{ctor:"::",_0:Fv("float-right"),_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("Add event"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(ub,r,0),_1:{ctor:"[]"}}}};var _b=function(t){var e=t.events;var n=r(function(r,t){return i(Lg,1,100*(uc(r.to)-uc(r.from))/(uc(jg(t))-uc(qg(t))))});var a=function(r){return i(Wi,{ctor:"::",_0:Fv("float-left"),_1:{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"width","1rem"),_1:{ctor:"::",_0:i(Ig["=>"],"height","1rem"),_1:{ctor:"::",_0:i(Ig["=>"],"line-height","1rem"),_1:{ctor:"::",_0:i(Ig["=>"],"font-weight","bold"),_1:{ctor:"::",_0:i(Ig["=>"],"color","#FFFFFF"),_1:{ctor:"::",_0:i(Ig["=>"],"margin","3px 0.5rem 0 0"),_1:{ctor:"::",_0:i(Ig["=>"],"padding",r.overlay?"0 0 3px 3px":"0"),_1:{ctor:"::",_0:i(Ig["=>"],"background-color",r.overlay?"#000000":Rs(r.color)),_1:{ctor:"[]"}}}}}}}}}),_1:{ctor:"[]"}}},{ctor:"::",_0:hi(r.overlay?Pg(r):""),_1:{ctor:"[]"}})};var o=r(function(r,e){return{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("list-group-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-3"),_1:{ctor:"[]"}},{ctor:"::",_0:a(r),_1:{ctor:"::",_0:i(p_,{ctor:"[]"},{ctor:"::",_0:hi(r.label),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-7 text-right text-muted"),_1:{ctor:"[]"}},{ctor:"::",_0:hi(i(N["++"],Fg(r.from),i(N["++"]," to ",i(N["++"],Fg(r.to),i(N["++"]," (",i(N["++"],i(n,r,t),"%)")))))),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-2 text-right"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("javascript:void(0)"),_1:{ctor:"::",_0:yf(vm(e)),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("edit"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(ub,t,e),_1:{ctor:"[]"}}}});var c=Pr(e)?{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("list-group-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("text-muted text-center"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("no events yet"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}:Qr(i(it,r(function(r,t){return i(o,t,r+1)}),e));return{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("card mt-4 mb-4"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Ii,{ctor:"::",_0:Fv("list-group list-group-flush"),_1:{ctor:"[]"}},Qr({ctor:"::",_0:ib(t),_1:{ctor:"::",_0:c,_1:{ctor:"[]"}}})),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}};var vb=Xl({ctor:"::",_0:{ctor:"_Tuple2",_0:"background",_1:"#D3D7CF"},_1:{ctor:"::",_0:{ctor:"_Tuple2",_0:"border-radius",_1:"1rem"},_1:{ctor:"::",_0:{ctor:"_Tuple2",_0:"padding",_1:"0 0.35rem"},_1:{ctor:"::",_0:{ctor:"_Tuple2",_0:"margin-left",_1:"0.2rem"},_1:{ctor:"[]"}}}}});var lb=function(r){return{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("col-5 col-form-label col-form-label-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Date of Birth"),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-7"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Y_,i(Gr,ab,{ctor:"::",_0:Fv("form-control form-control-lg"),_1:{ctor:"::",_0:Xv(r.birthDateString),_1:{ctor:"::",_0:ll(Fg(cc(r.now))),_1:{ctor:"::",_0:ff(sm),_1:{ctor:"[]"}}}}}),{ctor:"[]"}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("col-5 col-form-label col-form-label-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Life Expectancy "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://en.wikipedia.org/wiki/List_of_countries_by_life_expectancy"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"::",_0:vb,_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("?"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-7"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-control form-control-lg"),_1:{ctor:"::",_0:Zv("number"),_1:{ctor:"::",_0:Gl(true),_1:{ctor:"::",_0:Xv(r.lifeExpectancyString),_1:{ctor:"::",_0:fl("1"),_1:{ctor:"::",_0:ll("500"),_1:{ctor:"::",_0:ff(fm),_1:{ctor:"[]"}}}}}}}},{ctor:"[]"}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row form-group"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("col-5 col-form-label col-form-label-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Non-Adult Years "),_1:{ctor:"::",_0:i(Hi,{ctor:"::",_0:wl("https://www.reddit.com/r/GetMotivated/comments/1vyf9r/made_for_myself_thought_of_you_weeks_left/cexas8u/"),_1:{ctor:"::",_0:kl("_blank"),_1:{ctor:"::",_0:vb,_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("?"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-7"),_1:{ctor:"[]"}},{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("form-check-inline form-control-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-check-input"),_1:{ctor:"::",_0:Zv("radio"),_1:{ctor:"::",_0:Ul(!r.onlyAdultYears),_1:{ctor:"::",_0:yf(lm(false)),_1:{ctor:"[]"}}}}},{ctor:"[]"}),_1:{ctor:"::",_0:hi(" Show"),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(H_,{ctor:"::",_0:Fv("form-check-inline form-control-lg"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Y_,{ctor:"::",_0:Fv("form-check-input"),_1:{ctor:"::",_0:Zv("radio"),_1:{ctor:"::",_0:Ul(r.onlyAdultYears),_1:{ctor:"::",_0:yf(lm(true)),_1:{ctor:"[]"}}}}},{ctor:"[]"}),_1:{ctor:"::",_0:hi(" Hide"),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}}}};var fb=function(r){var t=Em(r);return{ctor:"::",_0:i(Ii,{ctor:"::",_0:Fv("nav justify-content-center mb-2"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("nav-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Hi,{ctor:"::",_0:Fv("nav-link active"),_1:{ctor:"::",_0:wl("#"),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("blank chart"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("nav-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Hi,{ctor:"::",_0:Fv("nav-link"),_1:{ctor:"::",_0:wl(i(N["++"],"#",eb)),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("demo chart"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Pi,{ctor:"::",_0:Fv("nav-item"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Hi,{ctor:"::",_0:Fv("nav-link"),_1:{ctor:"::",_0:wl(i(N["++"],"#",t)),_1:{ctor:"[]"}}},{ctor:"::",_0:hi("bookmark your own chart"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}}),_1:{ctor:"[]"}}};var sb=function(r){return i(Wi,{ctor:"[]"},Qr({ctor:"::",_0:{ctor:"::",_0:i(ki,{ctor:"::",_0:Fv("text-center mb-2"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Spend your time wisely."),_1:{ctor:"[]"}}),_1:{ctor:"[]"}},_1:{ctor:"::",_0:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("text-center text-muted mb-1"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("This will either inspire you or terrify you - hopefully the former."),_1:{ctor:"[]"}}),_1:{ctor:"[]"}},_1:{ctor:"::",_0:fb(r),_1:{ctor:"::",_0:lb(r),_1:{ctor:"::",_0:cb(r),_1:{ctor:"::",_0:_b(r),_1:{ctor:"::",_0:ob,_1:{ctor:"[]"}}}}}}}}))};var db=function(r){var t=xm(r);var e=r.modalOpen?"block":"none";return i(Wi,{ctor:"::",_0:Xl({ctor:"::",_0:i(Ig["=>"],"display",e),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:Fv("modal in"),_1:{ctor:"[]"}}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("modal-dialog"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("modal-content"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("modal-body"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("mb-1"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("You can copy/paste JSON below to export/import data."),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Z_,{ctor:"::",_0:Fv("form-control"),_1:{ctor:"::",_0:Tv(20),_1:{ctor:"::",_0:ff(om),_1:{ctor:"[]"}}}},{ctor:"::",_0:hi(t),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("modal-footer"),_1:{ctor:"[]"}},{ctor:"::",_0:i(V_,{ctor:"::",_0:Zv("button"),_1:{ctor:"::",_0:Fv("btn btn-primary"),_1:{ctor:"::",_0:yf(am),_1:{ctor:"[]"}}}},{ctor:"::",_0:hi("Close"),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}),_1:{ctor:"[]"}})};var hb=function(r){return i(Wi,{ctor:"[]"},{ctor:"::",_0:db(r),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("row"),_1:{ctor:"[]"}},{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-6"),_1:{ctor:"[]"}},{ctor:"::",_0:sb(r),_1:{ctor:"[]"}}),_1:{ctor:"::",_0:i(Wi,{ctor:"::",_0:Fv("col-6"),_1:{ctor:"[]"}},{ctor:"::",_0:m.eq(r.now,0)?i(ki,{ctor:"::",_0:Fv("text-center"),_1:{ctor:"[]"}},{ctor:"::",_0:hi("Loading..."),_1:{ctor:"[]"}}):tb(r),_1:{ctor:"[]"}}),_1:{ctor:"[]"}}}),_1:{ctor:"[]"}}})};var pb=function(r){return i($o,Io*10,hm)};var gb=i(Zf,dm,{init:Lm,update:Cm,view:hb,subscriptions:pb})();var mb={};mb["Lifechart"]=mb["Lifechart"]||{};if(typeof gb!=="undefined"){gb(mb["Lifechart"],"Lifechart",undefined)}if(typeof define==="function"&&define["amd"]){define([],function(){return mb});return}if(typeof module==="object"){module["exports"]=mb;return}var bb=this["Elm"];if(typeof bb==="undefined"){this["Elm"]=mb;return}for(var yb in mb){if(yb in bb){throw new Error("There are two Elm modules called `"+yb+"` on this page! Rename one of them.")}bb[yb]=mb[yb]}}).call(this); --------------------------------------------------------------------------------