From c04838377b8dbe7d6815eda306a6f2ad8fc2c929 Mon Sep 17 00:00:00 2001 From: Stephan Telling Date: Tue, 15 Aug 2017 14:19:06 +0200 Subject: [PATCH 01/54] remove imports and ticket class from shop --- src/shop/models.py | 64 ---------------------------------------------- 1 file changed, 64 deletions(-) diff --git a/src/shop/models.py b/src/shop/models.py index e0d6e687..65d4ed08 100644 --- a/src/shop/models.py +++ b/src/shop/models.py @@ -3,19 +3,16 @@ from django.db import models from django.db.models.aggregates import Sum from django.contrib import messages from django.contrib.postgres.fields import DateTimeRangeField, JSONField -from django.http import HttpResponse from django.utils.text import slugify from django.utils.translation import ugettext_lazy as _ from django.utils import timezone from django.core.urlresolvers import reverse_lazy from utils.models import UUIDModel, CreatedUpdatedModel from .managers import ProductQuerySet, OrderQuerySet -import hashlib, io, base64, qrcode from decimal import Decimal from datetime import timedelta from unidecode import unidecode from django.utils.dateparse import parse_datetime -from django.utils import timezone class CustomOrder(CreatedUpdatedModel): @@ -454,64 +451,3 @@ class CoinifyAPIRequest(CreatedUpdatedModel): def __str__(self): return 'order %s api request %s' % (self.order.id, self.method) - - -class Ticket(CreatedUpdatedModel, UUIDModel): - order = models.ForeignKey('shop.Order', related_name='tickets') - product = models.ForeignKey('shop.Product', related_name='tickets') - qrcode_base64 = models.TextField(null=True, blank=True) - - name = models.CharField( - max_length=100, - help_text=( - 'Name of the person this ticket belongs to. ' - 'This can be different from the buying user.' - ), - null=True, - blank=True, - ) - - email = models.EmailField( - null=True, - blank=True, - ) - - checked_in = models.BooleanField(default=False) - - def __str__(self): - return 'Ticket {user} {product}'.format( - user=self.order.user, - product=self.product - ) - - def save(self, **kwargs): - super(Ticket, self).save(**kwargs) - self.qrcode_base64 = self.get_qr_code() - super(Ticket, self).save(**kwargs) - - def get_token(self): - return hashlib.sha256( - '{ticket_id}{user_id}{secret_key}'.format( - ticket_id=self.pk, - user_id=self.order.user.pk, - secret_key=settings.SECRET_KEY, - ).encode('utf-8') - ).hexdigest() - - def get_qr_code(self): - qr = qrcode.make( - self.get_token(), - version=1, - error_correction=qrcode.constants.ERROR_CORRECT_H - ).resize((250,250)) - file_like = io.BytesIO() - qr.save(file_like, format='png') - qrcode_base64 = base64.b64encode(file_like.getvalue()) - return qrcode_base64 - - def get_qr_code_url(self): - return 'data:image/png;base64,{}'.format(self.qrcode_base64) - - def get_absolute_url(self): - return str(reverse_lazy('shop:ticket_detail', kwargs={'pk': self.pk})) - From a6470d2ec9e2583ee853619ff0a277e0c2dd2eba Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 16 Jul 2017 01:31:00 +0200 Subject: [PATCH 02/54] Initial work on the schedule written in elm. --- .gitignore | 2 +- schedule/Main.elm | 355 ++++++++++++++++++++++++++++++++ schedule/Makefile | 2 + schedule/elm-package.json | 17 ++ src/program/consumers.py | 60 +++--- src/program/models.py | 15 ++ src/program/views.py | 5 +- src/static_src/css/bornhack.css | 28 +-- 8 files changed, 432 insertions(+), 52 deletions(-) create mode 100644 schedule/Main.elm create mode 100644 schedule/Makefile create mode 100644 schedule/elm-package.json diff --git a/.gitignore b/.gitignore index 8841523a..976b5854 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ db.sqlite3 *.pyc venv/ environment_settings.py - +elm-stuff/ diff --git a/schedule/Main.elm b/schedule/Main.elm new file mode 100644 index 00000000..b0c92ba6 --- /dev/null +++ b/schedule/Main.elm @@ -0,0 +1,355 @@ +module Main exposing (..) + +import Html exposing (Html, Attribute, div, input, text, li, ul, a, h4, label, i, span) +import Html.Attributes exposing (class, classList, id, type_, for) +import Html.Events exposing (onClick) +import WebSocket exposing (listen) +import Json.Decode exposing (int, string, float, list, bool, Decoder) +import Json.Encode +import Json.Decode.Pipeline exposing (decode, required, optional, hardcoded) + + +main : Program Flags Model Msg +main = + Html.programWithFlags + { init = init + , view = view + , update = update + , subscriptions = subscriptions + } + + +scheduleServer : String +scheduleServer = + "ws://localhost:8000/schedule/" + + + +-- MODEL + + +type alias Model = + { days : List Day + , eventInstances : List EventInstance + , eventLocations : List EventLocation + , eventTypes : List EventType + , flags : Flags + , activeDay : Day + , filter : Filter + } + + +type alias Filter = + { eventTypes : List EventType + , eventLocations : List EventLocation + } + + +type alias Day = + { day_name : String + , iso : String + , repr : String + } + + +type alias Speaker = + { name : String + , url : String + } + + +type alias EventInstance = + { title : String + , id : Int + , url : String + , abstract : String + , eventSlug : String + , eventType : String + , backgroundColor : String + , forgroundColor : String + , from : String + , to : String + , timeslots : Float + , location : String + , locationIcon : String + , speakers : List Speaker + , videoRecording : Bool + , videoUrl : String + } + + +type alias EventLocation = + { name : String + , slug : String + , icon : String + } + + +type alias EventType = + { name : String + , slug : String + , color : String + , lightText : Bool + } + + +type alias Flags = + { schedule_timeslot_length_minutes : Int + , schedule_midnight_offset_hours : Int + , ics_button_href : String + , camp_slug : String + } + + +allDaysDay = + Day "All Days" "" "" + + +init : Flags -> ( Model, Cmd Msg ) +init flags = + ( Model [] [] [] [] flags allDaysDay (Filter [] []), sendInitMessage flags.camp_slug ) + + +sendInitMessage : String -> Cmd Msg +sendInitMessage camp_slug = + WebSocket.send scheduleServer + (Json.Encode.encode 0 + (Json.Encode.object + [ ( "action", Json.Encode.string "init" ) + , ( "camp_slug", Json.Encode.string camp_slug ) + ] + ) + ) + + + +-- UPDATE + + +type Msg + = NoOp + | WebSocketPayload String + | MakeActiveday Day + | ToggleEventTypeFilter EventType + | ToggleEventLocationFilter EventLocation + + +update : Msg -> Model -> ( Model, Cmd Msg ) +update msg model = + case msg of + NoOp -> + ( model, Cmd.none ) + + WebSocketPayload str -> + let + newModel = + case Json.Decode.decodeString initDataDecoder str of + Ok m -> + m model.flags allDaysDay (Filter [] []) + + Err error -> + model + in + newModel ! [] + + MakeActiveday day -> + { model | activeDay = day } ! [] + + ToggleEventTypeFilter eventType -> + let + eventTypesFilter = + if List.member eventType model.filter.eventTypes then + List.filter (\x -> x /= eventType) model.filter.eventTypes + else + eventType :: model.filter.eventTypes + + currentFilter = + model.filter + + newFilter = + { currentFilter | eventTypes = eventTypesFilter } + in + { model | filter = newFilter } ! [] + + ToggleEventLocationFilter eventLocation -> + let + eventLocationsFilter = + if List.member eventLocation model.filter.eventLocations then + List.filter (\x -> x /= eventLocation) model.filter.eventLocations + else + eventLocation :: model.filter.eventLocations + + currentFilter = + model.filter + + newFilter = + { currentFilter | eventLocations = eventLocationsFilter } + in + { model | filter = newFilter } ! [] + + + +-- SUBSCRIPTIONS + + +subscriptions : Model -> Sub Msg +subscriptions model = + WebSocket.listen scheduleServer WebSocketPayload + + + +-- DECODERS + + +dayDecoder : Decoder Day +dayDecoder = + decode Day + |> required "day_name" string + |> required "iso" string + |> required "repr" string + + +speakerDecoder : Decoder Speaker +speakerDecoder = + decode Speaker + |> required "name" string + |> required "url" string + + +eventInstanceDecoder : Decoder EventInstance +eventInstanceDecoder = + decode EventInstance + |> required "title" string + |> required "id" int + |> required "url" string + |> required "abstract" string + |> required "event_slug" string + |> required "event_type" string + |> required "bg-color" string + |> required "fg-color" string + |> required "from" string + |> required "to" string + |> required "timeslots" float + |> required "location" string + |> required "location_icon" string + |> required "speakers" (list speakerDecoder) + |> required "video_recording" bool + |> optional "video_url" string "" + + +eventLocationDecoder : Decoder EventLocation +eventLocationDecoder = + decode EventLocation + |> required "name" string + |> required "slug" string + |> required "icon" string + + +eventTypeDecoder : Decoder EventType +eventTypeDecoder = + decode EventType + |> required "name" string + |> required "slug" string + |> required "color" string + |> required "light_text" bool + + +initDataDecoder : Decoder (Flags -> Day -> Filter -> Model) +initDataDecoder = + decode Model + |> required "days" (list dayDecoder) + |> required "event_instances" (list eventInstanceDecoder) + |> required "event_locations" (list eventLocationDecoder) + |> required "event_types" (list eventTypeDecoder) + + + +-- VIEW + + +dayButton : Day -> Day -> Html Msg +dayButton day activeDay = + a + [ classList + [ ( "btn", True ) + , ( "btn-default", day /= activeDay ) + , ( "btn-primary", day == activeDay ) + ] + , onClick (MakeActiveday day) + ] + [ text day.day_name + ] + + +view : Model -> Html Msg +view model = + div [] + [ div [ class "row" ] + [ div [ id "schedule-days", class "btn-group" ] + (List.map (\day -> dayButton day model.activeDay) (allDaysDay :: model.days)) + ] + , div [ class "row" ] + [ div + [ classList + [ ( "col-sm-3", True ) + , ( "col-sm-9", True ) + , ( "schedule-filter", True ) + ] + ] + [ h4 [] [ text "Filter" ] + , div [ class "form-group" ] + [ filterView "Type" model.eventTypes model.filter.eventTypes ToggleEventTypeFilter + , filterView "Location" model.eventLocations model.filter.eventLocations ToggleEventLocationFilter + ] + ] + , div [] [] + ] + ] + + +filterView : + String + -> List { a | name : String } + -> List { a | name : String } + -> ({ a | name : String } -> Msg) + -> Html Msg +filterView name possibleFilters currentFilters action = + div [] + [ text (name ++ ":") + , ul [] (List.map (\filter -> filterChoiceView filter currentFilters action) possibleFilters) + ] + + +filterChoiceView : + { a | name : String } + -> List { a | name : String } + -> ({ a | name : String } -> Msg) + -> Html Msg +filterChoiceView filter currentFilters action = + let + active = + List.member filter currentFilters + + notActive = + not active + in + li [] + [ div + [ classList + [ ( "btn", True ) + , ( "btn-default", True ) + , ( "filter-choice-active", active ) + ] + , onClick (action filter) + ] + [ span [] + [ i [ classList [ ( "fa", True ), ( "fa-minus", active ), ( "fa-plus", notActive ) ] ] [] + , text (" " ++ filter.name) + ] + ] + ] + + +locationFilter : List EventLocation -> Html Msg +locationFilter eventLocations = + div [] [ text "Location:" ] diff --git a/schedule/Makefile b/schedule/Makefile new file mode 100644 index 00000000..1727673c --- /dev/null +++ b/schedule/Makefile @@ -0,0 +1,2 @@ +all: + elm-make Main.elm --debug --output ../src/program/static/js/elm_based_schedule.js diff --git a/schedule/elm-package.json b/schedule/elm-package.json new file mode 100644 index 00000000..d17058e1 --- /dev/null +++ b/schedule/elm-package.json @@ -0,0 +1,17 @@ +{ + "version": "1.0.0", + "summary": "helpful summary of your project, less than 80 characters", + "repository": "https://github.com/user/project.git", + "license": "BSD3", + "source-directories": [ + "." + ], + "exposed-modules": [], + "dependencies": { + "NoRedInk/elm-decode-pipeline": "3.0.0 <= v < 4.0.0", + "elm-lang/core": "5.1.1 <= v < 6.0.0", + "elm-lang/html": "2.0.0 <= v < 3.0.0", + "elm-lang/websocket": "1.0.2 <= v < 2.0.0" + }, + "elm-version": "0.18.0 <= v < 0.19.0" +} diff --git a/src/program/consumers.py b/src/program/consumers.py index 9d141e87..725a849e 100644 --- a/src/program/consumers.py +++ b/src/program/consumers.py @@ -1,7 +1,7 @@ from channels.generic.websockets import JsonWebsocketConsumer from camps.models import Camp -from .models import EventInstance, Favorite +from .models import EventInstance, Favorite, EventLocation, EventType class ScheduleConsumer(JsonWebsocketConsumer): @@ -10,34 +10,43 @@ class ScheduleConsumer(JsonWebsocketConsumer): def connection_groups(self, **kwargs): return ['schedule_users'] - def connect(self, message, **kwargs): - camp_slug = message.http_session['campslug'] - try: - camp = Camp.objects.get(slug=camp_slug) - days = list(map( - lambda day: - { 'repr': day.lower.strftime('%A %Y-%m-%d') - , 'iso': day.lower.strftime('%Y-%m-%d') - , 'day_name': day.lower.strftime('%A') - }, - camp.get_days('camp') - )) - event_instances_query_set = EventInstance.objects.filter(event__camp=camp) - event_instances = list(map(lambda x: x.to_json(user=message.user), event_instances_query_set)) - self.send({ - "accept": True, - "event_instances": event_instances, - "days": days, - "action": "init" - }) - except Camp.DoesNotExist: - pass - def raw_receive(self, message, **kwargs): content = self.decode_json(message['text']) action = content.get('action') data = {} + if action == 'init': + camp_slug = content.get('camp_slug') + try: + camp = Camp.objects.get(slug=camp_slug) + days = list(map( + lambda day: + { 'repr': day.lower.strftime('%A %Y-%m-%d') + , 'iso': day.lower.strftime('%Y-%m-%d') + , 'day_name': day.lower.strftime('%A') + }, + camp.get_days('camp') + )) + event_instances_query_set = EventInstance.objects.filter(event__camp=camp) + event_instances = list([x.to_json(user=message.user) for x in event_instances_query_set]) + + event_locations_query_set = EventLocation.objects.filter(camp=camp) + event_locations = list([x.to_json() for x in event_locations_query_set]) + + event_types_query_set = EventType.objects.filter() + event_types = list([x.to_json() for x in event_types_query_set]) + + data = { + "event_locations": event_locations, + "event_types": event_types, + "accept": True, + "event_instances": event_instances, + "days": days, + "action": "init" + } + except Camp.DoesNotExist: + pass + if action == 'favorite': event_instance_id = content.get('event_instance_id') event_instance = EventInstance.objects.get(id=event_instance_id) @@ -52,7 +61,8 @@ class ScheduleConsumer(JsonWebsocketConsumer): favorite = Favorite.objects.get(event_instance=event_instance, user=message.user) favorite.delete() - self.send(data) + if data: + self.send(data) def disconnect(self, message, **kwargs): pass diff --git a/src/program/models.py b/src/program/models.py index 9eb9c176..7b3dbb9e 100644 --- a/src/program/models.py +++ b/src/program/models.py @@ -311,6 +311,13 @@ class EventLocation(CampRelatedModel): class Meta: unique_together = (('camp', 'slug'), ('camp', 'name')) + def to_json(self): + return { + "name": self.name, + "slug": self.slug, + "icon": self.icon, + } + class EventType(CreatedUpdatedModel): """ Every event needs to have a type. """ @@ -350,6 +357,14 @@ class EventType(CreatedUpdatedModel): def __str__(self): return self.name + def to_json(self): + return { + "name": self.name, + "slug": self.slug, + "color": self.color, + "light_text": self.light_text, + } + class Event(CampRelatedModel): """ Something that is on the program one or more times. """ diff --git a/src/program/views.py b/src/program/views.py index 2f5f40fa..a866afc4 100644 --- a/src/program/views.py +++ b/src/program/views.py @@ -264,10 +264,7 @@ class EventDetailView(CampViewMixin, DetailView): class ScheduleView(CampViewMixin, TemplateView): - def get_template_names(self): - if 'day' in self.kwargs: - return 'schedule_day.html' - return 'schedule_overview.html' + template_name = 'schedule_overview_elm.html' def get_context_data(self, *args, **kwargs): context = super(ScheduleView, self).get_context_data(**kwargs) diff --git a/src/static_src/css/bornhack.css b/src/static_src/css/bornhack.css index 4effe2f4..2132be61 100644 --- a/src/static_src/css/bornhack.css +++ b/src/static_src/css/bornhack.css @@ -208,6 +208,11 @@ footer { padding: 0; } +.schedule-filter .btn { + min-width: 200px; + text-align: left; +} + @media (min-width: 520px) { .schedule-filter { @@ -231,28 +236,7 @@ footer { flex-wrap: wrap; } -.form-group .schedule-checkbox { - display: none; - } - -.form-group input[type="checkbox"] + .btn-group > label span { - width: 20px; -} - -.form-group input[type="checkbox"] + .btn-group > label span i:first-child { - display: none; -} -.form-group input[type="checkbox"] + .btn-group > label span i:last-child { - display: inline-block; -} - -.form-group input[type="checkbox"]:checked + .btn-group > label span i:first-child { - display: inline-block; -} -.form-group input[type="checkbox"]:checked + .btn-group > label span i:last-child { - display: none; -} -.form-group input[type="checkbox"]:checked + .btn-group > label { +.filter-choice-active { color: #333; background-color: #e6e6e6; border-color: #adadad; From b49a0ad5569cc91814484b57aefbd8c51d7b765e Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 16 Jul 2017 14:11:04 +0200 Subject: [PATCH 03/54] Accomplished feature parity in filtering. --- schedule/Main.elm | 69 ++++++++++++++++--- schedule/Makefile | 3 + .../templates/schedule_overview_elm.html | 24 +++++++ 3 files changed, 87 insertions(+), 9 deletions(-) create mode 100644 src/program/templates/schedule_overview_elm.html diff --git a/schedule/Main.elm b/schedule/Main.elm index b0c92ba6..d3dcb8f6 100644 --- a/schedule/Main.elm +++ b/schedule/Main.elm @@ -1,7 +1,7 @@ module Main exposing (..) -import Html exposing (Html, Attribute, div, input, text, li, ul, a, h4, label, i, span) -import Html.Attributes exposing (class, classList, id, type_, for) +import Html exposing (Html, Attribute, div, input, text, li, ul, a, h4, label, i, span, hr, small, p) +import Html.Attributes exposing (class, classList, id, type_, for, style) import Html.Events exposing (onClick) import WebSocket exposing (listen) import Json.Decode exposing (int, string, float, list, bool, Decoder) @@ -101,6 +101,7 @@ type alias Flags = } +allDaysDay : Day allDaysDay = Day "All Days" "" "" @@ -288,11 +289,12 @@ view model = [ div [ id "schedule-days", class "btn-group" ] (List.map (\day -> dayButton day model.activeDay) (allDaysDay :: model.days)) ] + , hr [] [] , div [ class "row" ] [ div [ classList [ ( "col-sm-3", True ) - , ( "col-sm-9", True ) + , ( "col-sm-push-9", True ) , ( "schedule-filter", True ) ] ] @@ -302,11 +304,65 @@ view model = , filterView "Location" model.eventLocations model.filter.eventLocations ToggleEventLocationFilter ] ] - , div [] [] + , div + [ classList + [ ( "col-sm-9", True ) + , ( "col-sm-pull-3", True ) + ] + ] + (List.map (\day -> dayRowView day model) model.days) ] ] +dayRowView : Day -> Model -> Html Msg +dayRowView day model = + let + types = + List.map (\eventType -> eventType.slug) + (if List.isEmpty model.filter.eventTypes then + model.eventTypes + else + model.filter.eventTypes + ) + + locations = + List.map (\eventLocation -> eventLocation.slug) + (if List.isEmpty model.filter.eventLocations then + model.eventLocations + else + model.filter.eventLocations + ) + + filteredEventInstances = + List.filter + (\eventInstance -> + ((String.slice 0 10 eventInstance.from) == day.iso) + && List.member eventInstance.location locations + && List.member eventInstance.eventType types + ) + model.eventInstances + in + div [] + [ h4 [] + [ text day.repr ] + , div [ class "schedule-day-row" ] + (List.map dayEventInstanceView filteredEventInstances) + ] + + +dayEventInstanceView : EventInstance -> Html Msg +dayEventInstanceView eventInstance = + a [ class "event", style [ ( "background-color", eventInstance.backgroundColor ), ( "color", eventInstance.forgroundColor ) ] ] + [ small [] + [ text ((String.slice 11 16 eventInstance.from) ++ " - " ++ (String.slice 11 16 eventInstance.to)) ] + , i [ classList [ ( "fa", True ), ( "fa-" ++ eventInstance.locationIcon, True ), ( "pull-right", True ) ] ] [] + , p + [] + [ text eventInstance.title ] + ] + + filterView : String -> List { a | name : String } @@ -348,8 +404,3 @@ filterChoiceView filter currentFilters action = ] ] ] - - -locationFilter : List EventLocation -> Html Msg -locationFilter eventLocations = - div [] [ text "Location:" ] diff --git a/schedule/Makefile b/schedule/Makefile index 1727673c..681e2bb6 100644 --- a/schedule/Makefile +++ b/schedule/Makefile @@ -1,2 +1,5 @@ all: + elm-make Main.elm --output ../src/program/static/js/elm_based_schedule.js + +debug: elm-make Main.elm --debug --output ../src/program/static/js/elm_based_schedule.js diff --git a/src/program/templates/schedule_overview_elm.html b/src/program/templates/schedule_overview_elm.html new file mode 100644 index 00000000..064badb1 --- /dev/null +++ b/src/program/templates/schedule_overview_elm.html @@ -0,0 +1,24 @@ +{% extends 'program_base.html' %} + +{% load commonmark %} +{% load staticfiles %} + +{% block program_content %} + +
+ + + + + +{% endblock %} From db14e7d80e143ccb0115613281b85d5df87290f1 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 16 Jul 2017 14:23:35 +0200 Subject: [PATCH 04/54] Replace schedule_overview.html with schedule_overview_elm.html. --- src/program/static/js/elm_based_schedule.js | 14044 ++++++++++++++++ src/program/templates/schedule_overview.html | 14 +- .../templates/schedule_overview_elm.html | 24 - src/program/views.py | 2 +- 4 files changed, 14053 insertions(+), 31 deletions(-) create mode 100644 src/program/static/js/elm_based_schedule.js delete mode 100644 src/program/templates/schedule_overview_elm.html diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js new file mode 100644 index 00000000..e99670dc --- /dev/null +++ b/src/program/static/js/elm_based_schedule.js @@ -0,0 +1,14044 @@ + +(function() { +'use strict'; + +function F2(fun) +{ + function wrapper(a) { return function(b) { return fun(a,b); }; } + wrapper.arity = 2; + wrapper.func = fun; + return wrapper; +} + +function F3(fun) +{ + function wrapper(a) { + return function(b) { return function(c) { return fun(a, b, c); }; }; + } + wrapper.arity = 3; + wrapper.func = fun; + return wrapper; +} + +function F4(fun) +{ + function wrapper(a) { return function(b) { return function(c) { + return function(d) { return fun(a, b, c, d); }; }; }; + } + wrapper.arity = 4; + wrapper.func = fun; + return wrapper; +} + +function F5(fun) +{ + function wrapper(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; }; + } + wrapper.arity = 5; + wrapper.func = fun; + return wrapper; +} + +function F6(fun) +{ + function wrapper(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return function(f) { + return fun(a, b, c, d, e, f); }; }; }; }; }; + } + wrapper.arity = 6; + wrapper.func = fun; + return wrapper; +} + +function F7(fun) +{ + function wrapper(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return function(f) { + return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; }; + } + wrapper.arity = 7; + wrapper.func = fun; + return wrapper; +} + +function F8(fun) +{ + function wrapper(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return function(f) { + return function(g) { return function(h) { + return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; }; + } + wrapper.arity = 8; + wrapper.func = fun; + return wrapper; +} + +function F9(fun) +{ + function wrapper(a) { return function(b) { return function(c) { + return function(d) { return function(e) { return function(f) { + return function(g) { return function(h) { return function(i) { + return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; }; + } + wrapper.arity = 9; + wrapper.func = fun; + return wrapper; +} + +function A2(fun, a, b) +{ + return fun.arity === 2 + ? fun.func(a, b) + : fun(a)(b); +} +function A3(fun, a, b, c) +{ + return fun.arity === 3 + ? fun.func(a, b, c) + : fun(a)(b)(c); +} +function A4(fun, a, b, c, d) +{ + return fun.arity === 4 + ? fun.func(a, b, c, d) + : fun(a)(b)(c)(d); +} +function A5(fun, a, b, c, d, e) +{ + return fun.arity === 5 + ? fun.func(a, b, c, d, e) + : fun(a)(b)(c)(d)(e); +} +function A6(fun, a, b, c, d, e, f) +{ + return fun.arity === 6 + ? fun.func(a, b, c, d, e, f) + : fun(a)(b)(c)(d)(e)(f); +} +function A7(fun, a, b, c, d, e, f, g) +{ + return fun.arity === 7 + ? fun.func(a, b, c, d, e, f, g) + : fun(a)(b)(c)(d)(e)(f)(g); +} +function A8(fun, a, b, c, d, e, f, g, h) +{ + return fun.arity === 8 + ? fun.func(a, b, c, d, e, f, g, h) + : fun(a)(b)(c)(d)(e)(f)(g)(h); +} +function A9(fun, a, b, c, d, e, f, g, h, i) +{ + return fun.arity === 9 + ? fun.func(a, b, c, d, e, f, g, h, i) + : fun(a)(b)(c)(d)(e)(f)(g)(h)(i); +} + +//import Native.List // + +var _elm_lang$core$Native_Array = function() { + +// A RRB-Tree has two distinct data types. +// Leaf -> "height" is always 0 +// "table" is an array of elements +// Node -> "height" is always greater than 0 +// "table" is an array of child nodes +// "lengths" is an array of accumulated lengths of the child nodes + +// M is the maximal table size. 32 seems fast. E is the allowed increase +// of search steps when concatting to find an index. Lower values will +// decrease balancing, but will increase search steps. +var M = 32; +var E = 2; + +// An empty array. +var empty = { + ctor: '_Array', + height: 0, + table: [] +}; + + +function get(i, array) +{ + if (i < 0 || i >= length(array)) + { + throw new Error( + 'Index ' + i + ' is out of range. Check the length of ' + + 'your array first or use getMaybe or getWithDefault.'); + } + return unsafeGet(i, array); +} + + +function unsafeGet(i, array) +{ + for (var x = array.height; x > 0; x--) + { + var slot = i >> (x * 5); + while (array.lengths[slot] <= i) + { + slot++; + } + if (slot > 0) + { + i -= array.lengths[slot - 1]; + } + array = array.table[slot]; + } + return array.table[i]; +} + + +// Sets the value at the index i. Only the nodes leading to i will get +// copied and updated. +function set(i, item, array) +{ + if (i < 0 || length(array) <= i) + { + return array; + } + return unsafeSet(i, item, array); +} + + +function unsafeSet(i, item, array) +{ + array = nodeCopy(array); + + if (array.height === 0) + { + array.table[i] = item; + } + else + { + var slot = getSlot(i, array); + if (slot > 0) + { + i -= array.lengths[slot - 1]; + } + array.table[slot] = unsafeSet(i, item, array.table[slot]); + } + return array; +} + + +function initialize(len, f) +{ + if (len <= 0) + { + return empty; + } + var h = Math.floor( Math.log(len) / Math.log(M) ); + return initialize_(f, h, 0, len); +} + +function initialize_(f, h, from, to) +{ + if (h === 0) + { + var table = new Array((to - from) % (M + 1)); + for (var i = 0; i < table.length; i++) + { + table[i] = f(from + i); + } + return { + ctor: '_Array', + height: 0, + table: table + }; + } + + var step = Math.pow(M, h); + var table = new Array(Math.ceil((to - from) / step)); + var lengths = new Array(table.length); + for (var i = 0; i < table.length; i++) + { + table[i] = initialize_(f, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); + lengths[i] = length(table[i]) + (i > 0 ? lengths[i-1] : 0); + } + return { + ctor: '_Array', + height: h, + table: table, + lengths: lengths + }; +} + +function fromList(list) +{ + if (list.ctor === '[]') + { + return empty; + } + + // Allocate M sized blocks (table) and write list elements to it. + var table = new Array(M); + var nodes = []; + var i = 0; + + while (list.ctor !== '[]') + { + table[i] = list._0; + list = list._1; + i++; + + // table is full, so we can push a leaf containing it into the + // next node. + if (i === M) + { + var leaf = { + ctor: '_Array', + height: 0, + table: table + }; + fromListPush(leaf, nodes); + table = new Array(M); + i = 0; + } + } + + // Maybe there is something left on the table. + if (i > 0) + { + var leaf = { + ctor: '_Array', + height: 0, + table: table.splice(0, i) + }; + fromListPush(leaf, nodes); + } + + // Go through all of the nodes and eventually push them into higher nodes. + for (var h = 0; h < nodes.length - 1; h++) + { + if (nodes[h].table.length > 0) + { + fromListPush(nodes[h], nodes); + } + } + + var head = nodes[nodes.length - 1]; + if (head.height > 0 && head.table.length === 1) + { + return head.table[0]; + } + else + { + return head; + } +} + +// Push a node into a higher node as a child. +function fromListPush(toPush, nodes) +{ + var h = toPush.height; + + // Maybe the node on this height does not exist. + if (nodes.length === h) + { + var node = { + ctor: '_Array', + height: h + 1, + table: [], + lengths: [] + }; + nodes.push(node); + } + + nodes[h].table.push(toPush); + var len = length(toPush); + if (nodes[h].lengths.length > 0) + { + len += nodes[h].lengths[nodes[h].lengths.length - 1]; + } + nodes[h].lengths.push(len); + + if (nodes[h].table.length === M) + { + fromListPush(nodes[h], nodes); + nodes[h] = { + ctor: '_Array', + height: h + 1, + table: [], + lengths: [] + }; + } +} + +// Pushes an item via push_ to the bottom right of a tree. +function push(item, a) +{ + var pushed = push_(item, a); + if (pushed !== null) + { + return pushed; + } + + var newTree = create(item, a.height); + return siblise(a, newTree); +} + +// Recursively tries to push an item to the bottom-right most +// tree possible. If there is no space left for the item, +// null will be returned. +function push_(item, a) +{ + // Handle resursion stop at leaf level. + if (a.height === 0) + { + if (a.table.length < M) + { + var newA = { + ctor: '_Array', + height: 0, + table: a.table.slice() + }; + newA.table.push(item); + return newA; + } + else + { + return null; + } + } + + // Recursively push + var pushed = push_(item, botRight(a)); + + // There was space in the bottom right tree, so the slot will + // be updated. + if (pushed !== null) + { + var newA = nodeCopy(a); + newA.table[newA.table.length - 1] = pushed; + newA.lengths[newA.lengths.length - 1]++; + return newA; + } + + // When there was no space left, check if there is space left + // for a new slot with a tree which contains only the item + // at the bottom. + if (a.table.length < M) + { + var newSlot = create(item, a.height - 1); + var newA = nodeCopy(a); + newA.table.push(newSlot); + newA.lengths.push(newA.lengths[newA.lengths.length - 1] + length(newSlot)); + return newA; + } + else + { + return null; + } +} + +// Converts an array into a list of elements. +function toList(a) +{ + return toList_(_elm_lang$core$Native_List.Nil, a); +} + +function toList_(list, a) +{ + for (var i = a.table.length - 1; i >= 0; i--) + { + list = + a.height === 0 + ? _elm_lang$core$Native_List.Cons(a.table[i], list) + : toList_(list, a.table[i]); + } + return list; +} + +// Maps a function over the elements of an array. +function map(f, a) +{ + var newA = { + ctor: '_Array', + height: a.height, + table: new Array(a.table.length) + }; + if (a.height > 0) + { + newA.lengths = a.lengths; + } + for (var i = 0; i < a.table.length; i++) + { + newA.table[i] = + a.height === 0 + ? f(a.table[i]) + : map(f, a.table[i]); + } + return newA; +} + +// Maps a function over the elements with their index as first argument. +function indexedMap(f, a) +{ + return indexedMap_(f, a, 0); +} + +function indexedMap_(f, a, from) +{ + var newA = { + ctor: '_Array', + height: a.height, + table: new Array(a.table.length) + }; + if (a.height > 0) + { + newA.lengths = a.lengths; + } + for (var i = 0; i < a.table.length; i++) + { + newA.table[i] = + a.height === 0 + ? A2(f, from + i, a.table[i]) + : indexedMap_(f, a.table[i], i == 0 ? from : from + a.lengths[i - 1]); + } + return newA; +} + +function foldl(f, b, a) +{ + if (a.height === 0) + { + for (var i = 0; i < a.table.length; i++) + { + b = A2(f, a.table[i], b); + } + } + else + { + for (var i = 0; i < a.table.length; i++) + { + b = foldl(f, b, a.table[i]); + } + } + return b; +} + +function foldr(f, b, a) +{ + if (a.height === 0) + { + for (var i = a.table.length; i--; ) + { + b = A2(f, a.table[i], b); + } + } + else + { + for (var i = a.table.length; i--; ) + { + b = foldr(f, b, a.table[i]); + } + } + return b; +} + +// TODO: currently, it slices the right, then the left. This can be +// optimized. +function slice(from, to, a) +{ + if (from < 0) + { + from += length(a); + } + if (to < 0) + { + to += length(a); + } + return sliceLeft(from, sliceRight(to, a)); +} + +function sliceRight(to, a) +{ + if (to === length(a)) + { + return a; + } + + // Handle leaf level. + if (a.height === 0) + { + var newA = { ctor:'_Array', height:0 }; + newA.table = a.table.slice(0, to); + return newA; + } + + // Slice the right recursively. + var right = getSlot(to, a); + var sliced = sliceRight(to - (right > 0 ? a.lengths[right - 1] : 0), a.table[right]); + + // Maybe the a node is not even needed, as sliced contains the whole slice. + if (right === 0) + { + return sliced; + } + + // Create new node. + var newA = { + ctor: '_Array', + height: a.height, + table: a.table.slice(0, right), + lengths: a.lengths.slice(0, right) + }; + if (sliced.table.length > 0) + { + newA.table[right] = sliced; + newA.lengths[right] = length(sliced) + (right > 0 ? newA.lengths[right - 1] : 0); + } + return newA; +} + +function sliceLeft(from, a) +{ + if (from === 0) + { + return a; + } + + // Handle leaf level. + if (a.height === 0) + { + var newA = { ctor:'_Array', height:0 }; + newA.table = a.table.slice(from, a.table.length + 1); + return newA; + } + + // Slice the left recursively. + var left = getSlot(from, a); + var sliced = sliceLeft(from - (left > 0 ? a.lengths[left - 1] : 0), a.table[left]); + + // Maybe the a node is not even needed, as sliced contains the whole slice. + if (left === a.table.length - 1) + { + return sliced; + } + + // Create new node. + var newA = { + ctor: '_Array', + height: a.height, + table: a.table.slice(left, a.table.length + 1), + lengths: new Array(a.table.length - left) + }; + newA.table[0] = sliced; + var len = 0; + for (var i = 0; i < newA.table.length; i++) + { + len += length(newA.table[i]); + newA.lengths[i] = len; + } + + return newA; +} + +// Appends two trees. +function append(a,b) +{ + if (a.table.length === 0) + { + return b; + } + if (b.table.length === 0) + { + return a; + } + + var c = append_(a, b); + + // Check if both nodes can be crunshed together. + if (c[0].table.length + c[1].table.length <= M) + { + if (c[0].table.length === 0) + { + return c[1]; + } + if (c[1].table.length === 0) + { + return c[0]; + } + + // Adjust .table and .lengths + c[0].table = c[0].table.concat(c[1].table); + if (c[0].height > 0) + { + var len = length(c[0]); + for (var i = 0; i < c[1].lengths.length; i++) + { + c[1].lengths[i] += len; + } + c[0].lengths = c[0].lengths.concat(c[1].lengths); + } + + return c[0]; + } + + if (c[0].height > 0) + { + var toRemove = calcToRemove(a, b); + if (toRemove > E) + { + c = shuffle(c[0], c[1], toRemove); + } + } + + return siblise(c[0], c[1]); +} + +// Returns an array of two nodes; right and left. One node _may_ be empty. +function append_(a, b) +{ + if (a.height === 0 && b.height === 0) + { + return [a, b]; + } + + if (a.height !== 1 || b.height !== 1) + { + if (a.height === b.height) + { + a = nodeCopy(a); + b = nodeCopy(b); + var appended = append_(botRight(a), botLeft(b)); + + insertRight(a, appended[1]); + insertLeft(b, appended[0]); + } + else if (a.height > b.height) + { + a = nodeCopy(a); + var appended = append_(botRight(a), b); + + insertRight(a, appended[0]); + b = parentise(appended[1], appended[1].height + 1); + } + else + { + b = nodeCopy(b); + var appended = append_(a, botLeft(b)); + + var left = appended[0].table.length === 0 ? 0 : 1; + var right = left === 0 ? 1 : 0; + insertLeft(b, appended[left]); + a = parentise(appended[right], appended[right].height + 1); + } + } + + // Check if balancing is needed and return based on that. + if (a.table.length === 0 || b.table.length === 0) + { + return [a, b]; + } + + var toRemove = calcToRemove(a, b); + if (toRemove <= E) + { + return [a, b]; + } + return shuffle(a, b, toRemove); +} + +// Helperfunctions for append_. Replaces a child node at the side of the parent. +function insertRight(parent, node) +{ + var index = parent.table.length - 1; + parent.table[index] = node; + parent.lengths[index] = length(node); + parent.lengths[index] += index > 0 ? parent.lengths[index - 1] : 0; +} + +function insertLeft(parent, node) +{ + if (node.table.length > 0) + { + parent.table[0] = node; + parent.lengths[0] = length(node); + + var len = length(parent.table[0]); + for (var i = 1; i < parent.lengths.length; i++) + { + len += length(parent.table[i]); + parent.lengths[i] = len; + } + } + else + { + parent.table.shift(); + for (var i = 1; i < parent.lengths.length; i++) + { + parent.lengths[i] = parent.lengths[i] - parent.lengths[0]; + } + parent.lengths.shift(); + } +} + +// Returns the extra search steps for E. Refer to the paper. +function calcToRemove(a, b) +{ + var subLengths = 0; + for (var i = 0; i < a.table.length; i++) + { + subLengths += a.table[i].table.length; + } + for (var i = 0; i < b.table.length; i++) + { + subLengths += b.table[i].table.length; + } + + var toRemove = a.table.length + b.table.length; + return toRemove - (Math.floor((subLengths - 1) / M) + 1); +} + +// get2, set2 and saveSlot are helpers for accessing elements over two arrays. +function get2(a, b, index) +{ + return index < a.length + ? a[index] + : b[index - a.length]; +} + +function set2(a, b, index, value) +{ + if (index < a.length) + { + a[index] = value; + } + else + { + b[index - a.length] = value; + } +} + +function saveSlot(a, b, index, slot) +{ + set2(a.table, b.table, index, slot); + + var l = (index === 0 || index === a.lengths.length) + ? 0 + : get2(a.lengths, a.lengths, index - 1); + + set2(a.lengths, b.lengths, index, l + length(slot)); +} + +// Creates a node or leaf with a given length at their arrays for perfomance. +// Is only used by shuffle. +function createNode(h, length) +{ + if (length < 0) + { + length = 0; + } + var a = { + ctor: '_Array', + height: h, + table: new Array(length) + }; + if (h > 0) + { + a.lengths = new Array(length); + } + return a; +} + +// Returns an array of two balanced nodes. +function shuffle(a, b, toRemove) +{ + var newA = createNode(a.height, Math.min(M, a.table.length + b.table.length - toRemove)); + var newB = createNode(a.height, newA.table.length - (a.table.length + b.table.length - toRemove)); + + // Skip the slots with size M. More precise: copy the slot references + // to the new node + var read = 0; + while (get2(a.table, b.table, read).table.length % M === 0) + { + set2(newA.table, newB.table, read, get2(a.table, b.table, read)); + set2(newA.lengths, newB.lengths, read, get2(a.lengths, b.lengths, read)); + read++; + } + + // Pulling items from left to right, caching in a slot before writing + // it into the new nodes. + var write = read; + var slot = new createNode(a.height - 1, 0); + var from = 0; + + // If the current slot is still containing data, then there will be at + // least one more write, so we do not break this loop yet. + while (read - write - (slot.table.length > 0 ? 1 : 0) < toRemove) + { + // Find out the max possible items for copying. + var source = get2(a.table, b.table, read); + var to = Math.min(M - slot.table.length, source.table.length); + + // Copy and adjust size table. + slot.table = slot.table.concat(source.table.slice(from, to)); + if (slot.height > 0) + { + var len = slot.lengths.length; + for (var i = len; i < len + to - from; i++) + { + slot.lengths[i] = length(slot.table[i]); + slot.lengths[i] += (i > 0 ? slot.lengths[i - 1] : 0); + } + } + + from += to; + + // Only proceed to next slots[i] if the current one was + // fully copied. + if (source.table.length <= to) + { + read++; from = 0; + } + + // Only create a new slot if the current one is filled up. + if (slot.table.length === M) + { + saveSlot(newA, newB, write, slot); + slot = createNode(a.height - 1, 0); + write++; + } + } + + // Cleanup after the loop. Copy the last slot into the new nodes. + if (slot.table.length > 0) + { + saveSlot(newA, newB, write, slot); + write++; + } + + // Shift the untouched slots to the left + while (read < a.table.length + b.table.length ) + { + saveSlot(newA, newB, write, get2(a.table, b.table, read)); + read++; + write++; + } + + return [newA, newB]; +} + +// Navigation functions +function botRight(a) +{ + return a.table[a.table.length - 1]; +} +function botLeft(a) +{ + return a.table[0]; +} + +// Copies a node for updating. Note that you should not use this if +// only updating only one of "table" or "lengths" for performance reasons. +function nodeCopy(a) +{ + var newA = { + ctor: '_Array', + height: a.height, + table: a.table.slice() + }; + if (a.height > 0) + { + newA.lengths = a.lengths.slice(); + } + return newA; +} + +// Returns how many items are in the tree. +function length(array) +{ + if (array.height === 0) + { + return array.table.length; + } + else + { + return array.lengths[array.lengths.length - 1]; + } +} + +// Calculates in which slot of "table" the item probably is, then +// find the exact slot via forward searching in "lengths". Returns the index. +function getSlot(i, a) +{ + var slot = i >> (5 * a.height); + while (a.lengths[slot] <= i) + { + slot++; + } + return slot; +} + +// Recursively creates a tree with a given height containing +// only the given item. +function create(item, h) +{ + if (h === 0) + { + return { + ctor: '_Array', + height: 0, + table: [item] + }; + } + return { + ctor: '_Array', + height: h, + table: [create(item, h - 1)], + lengths: [1] + }; +} + +// Recursively creates a tree that contains the given tree. +function parentise(tree, h) +{ + if (h === tree.height) + { + return tree; + } + + return { + ctor: '_Array', + height: h, + table: [parentise(tree, h - 1)], + lengths: [length(tree)] + }; +} + +// Emphasizes blood brotherhood beneath two trees. +function siblise(a, b) +{ + return { + ctor: '_Array', + height: a.height + 1, + table: [a, b], + lengths: [length(a), length(a) + length(b)] + }; +} + +function toJSArray(a) +{ + var jsArray = new Array(length(a)); + toJSArray_(jsArray, 0, a); + return jsArray; +} + +function toJSArray_(jsArray, i, a) +{ + for (var t = 0; t < a.table.length; t++) + { + if (a.height === 0) + { + jsArray[i + t] = a.table[t]; + } + else + { + var inc = t === 0 ? 0 : a.lengths[t - 1]; + toJSArray_(jsArray, i + inc, a.table[t]); + } + } +} + +function fromJSArray(jsArray) +{ + if (jsArray.length === 0) + { + return empty; + } + var h = Math.floor(Math.log(jsArray.length) / Math.log(M)); + return fromJSArray_(jsArray, h, 0, jsArray.length); +} + +function fromJSArray_(jsArray, h, from, to) +{ + if (h === 0) + { + return { + ctor: '_Array', + height: 0, + table: jsArray.slice(from, to) + }; + } + + var step = Math.pow(M, h); + var table = new Array(Math.ceil((to - from) / step)); + var lengths = new Array(table.length); + for (var i = 0; i < table.length; i++) + { + table[i] = fromJSArray_(jsArray, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); + lengths[i] = length(table[i]) + (i > 0 ? lengths[i - 1] : 0); + } + return { + ctor: '_Array', + height: h, + table: table, + lengths: lengths + }; +} + +return { + empty: empty, + fromList: fromList, + toList: toList, + initialize: F2(initialize), + append: F2(append), + push: F2(push), + slice: F3(slice), + get: F2(get), + set: F3(set), + map: F2(map), + indexedMap: F2(indexedMap), + foldl: F3(foldl), + foldr: F3(foldr), + length: length, + + toJSArray: toJSArray, + fromJSArray: fromJSArray +}; + +}(); +//import Native.Utils // + +var _elm_lang$core$Native_Basics = function() { + +function div(a, b) +{ + return (a / b) | 0; +} +function rem(a, b) +{ + return a % b; +} +function mod(a, b) +{ + if (b === 0) + { + throw new Error('Cannot perform mod 0. Division by zero error.'); + } + var r = a % b; + var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r + b) : -mod(-a, -b)); + + return m === b ? 0 : m; +} +function logBase(base, n) +{ + return Math.log(n) / Math.log(base); +} +function negate(n) +{ + return -n; +} +function abs(n) +{ + return n < 0 ? -n : n; +} + +function min(a, b) +{ + return _elm_lang$core$Native_Utils.cmp(a, b) < 0 ? a : b; +} +function max(a, b) +{ + return _elm_lang$core$Native_Utils.cmp(a, b) > 0 ? a : b; +} +function clamp(lo, hi, n) +{ + return _elm_lang$core$Native_Utils.cmp(n, lo) < 0 + ? lo + : _elm_lang$core$Native_Utils.cmp(n, hi) > 0 + ? hi + : n; +} + +var ord = ['LT', 'EQ', 'GT']; + +function compare(x, y) +{ + return { ctor: ord[_elm_lang$core$Native_Utils.cmp(x, y) + 1] }; +} + +function xor(a, b) +{ + return a !== b; +} +function not(b) +{ + return !b; +} +function isInfinite(n) +{ + return n === Infinity || n === -Infinity; +} + +function truncate(n) +{ + return n | 0; +} + +function degrees(d) +{ + return d * Math.PI / 180; +} +function turns(t) +{ + return 2 * Math.PI * t; +} +function fromPolar(point) +{ + var r = point._0; + var t = point._1; + return _elm_lang$core$Native_Utils.Tuple2(r * Math.cos(t), r * Math.sin(t)); +} +function toPolar(point) +{ + var x = point._0; + var y = point._1; + return _elm_lang$core$Native_Utils.Tuple2(Math.sqrt(x * x + y * y), Math.atan2(y, x)); +} + +return { + div: F2(div), + rem: F2(rem), + mod: F2(mod), + + 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: F2(Math.atan2), + + degrees: degrees, + turns: turns, + fromPolar: fromPolar, + toPolar: toPolar, + + sqrt: Math.sqrt, + logBase: F2(logBase), + negate: negate, + abs: abs, + min: F2(min), + max: F2(max), + clamp: F3(clamp), + compare: F2(compare), + + xor: F2(xor), + not: not, + + truncate: truncate, + ceiling: Math.ceil, + floor: Math.floor, + round: Math.round, + toFloat: function(x) { return x; }, + isNaN: isNaN, + isInfinite: isInfinite +}; + +}(); +//import // + +var _elm_lang$core$Native_Utils = function() { + +// COMPARISONS + +function eq(x, y) +{ + var stack = []; + var isEqual = eqHelp(x, y, 0, stack); + var pair; + while (isEqual && (pair = stack.pop())) + { + isEqual = eqHelp(pair.x, pair.y, 0, stack); + } + return isEqual; +} + + +function eqHelp(x, y, depth, stack) +{ + if (depth > 100) + { + stack.push({ x: x, y: y }); + return true; + } + + if (x === y) + { + return true; + } + + if (typeof x !== 'object') + { + if (typeof x === '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 (x === null || y === null) + { + return false + } + + if (x instanceof Date) + { + return x.getTime() === y.getTime(); + } + + if (!('ctor' in x)) + { + for (var key in x) + { + if (!eqHelp(x[key], y[key], depth + 1, stack)) + { + return false; + } + } + return true; + } + + // convert Dicts and Sets to lists + if (x.ctor === 'RBNode_elm_builtin' || x.ctor === 'RBEmpty_elm_builtin') + { + x = _elm_lang$core$Dict$toList(x); + y = _elm_lang$core$Dict$toList(y); + } + if (x.ctor === 'Set_elm_builtin') + { + x = _elm_lang$core$Set$toList(x); + y = _elm_lang$core$Set$toList(y); + } + + // check if lists are equal without recursion + if (x.ctor === '::') + { + var a = x; + var b = y; + while (a.ctor === '::' && b.ctor === '::') + { + if (!eqHelp(a._0, b._0, depth + 1, stack)) + { + return false; + } + a = a._1; + b = b._1; + } + return a.ctor === b.ctor; + } + + // check if Arrays are equal + if (x.ctor === '_Array') + { + var xs = _elm_lang$core$Native_Array.toJSArray(x); + var ys = _elm_lang$core$Native_Array.toJSArray(y); + if (xs.length !== ys.length) + { + return false; + } + for (var i = 0; i < xs.length; i++) + { + if (!eqHelp(xs[i], ys[i], depth + 1, stack)) + { + return false; + } + } + return true; + } + + if (!eqHelp(x.ctor, y.ctor, depth + 1, stack)) + { + return false; + } + + for (var key in x) + { + if (!eqHelp(x[key], y[key], depth + 1, stack)) + { + return false; + } + } + return true; +} + +// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on +// the particular integer values assigned to LT, EQ, and GT. + +var LT = -1, EQ = 0, GT = 1; + +function cmp(x, y) +{ + if (typeof x !== 'object') + { + return x === y ? EQ : x < y ? LT : GT; + } + + if (x instanceof String) + { + var a = x.valueOf(); + var b = y.valueOf(); + return a === b ? EQ : a < b ? LT : GT; + } + + if (x.ctor === '::' || x.ctor === '[]') + { + while (x.ctor === '::' && y.ctor === '::') + { + var ord = cmp(x._0, y._0); + if (ord !== EQ) + { + return ord; + } + x = x._1; + y = y._1; + } + return x.ctor === y.ctor ? EQ : x.ctor === '[]' ? LT : GT; + } + + if (x.ctor.slice(0, 6) === '_Tuple') + { + var ord; + var n = x.ctor.slice(6) - 0; + var err = 'cannot compare tuples with more than 6 elements.'; + if (n === 0) return EQ; + if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord; + if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord; + if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord; + if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord; + if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord; + if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord; + if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } } + return EQ; + } + + throw new Error( + 'Comparison error: comparison is only defined on ints, ' + + 'floats, times, chars, strings, lists of comparable values, ' + + 'and tuples of comparable values.' + ); +} + + +// COMMON VALUES + +var Tuple0 = { + ctor: '_Tuple0' +}; + +function Tuple2(x, y) +{ + return { + ctor: '_Tuple2', + _0: x, + _1: y + }; +} + +function chr(c) +{ + return new String(c); +} + + +// GUID + +var count = 0; +function guid(_) +{ + return count++; +} + + +// RECORDS + +function update(oldRecord, updatedFields) +{ + var newRecord = {}; + + for (var key in oldRecord) + { + newRecord[key] = oldRecord[key]; + } + + for (var key in updatedFields) + { + newRecord[key] = updatedFields[key]; + } + + return newRecord; +} + + +//// LIST STUFF //// + +var Nil = { ctor: '[]' }; + +function Cons(hd, tl) +{ + return { + ctor: '::', + _0: hd, + _1: tl + }; +} + +function append(xs, ys) +{ + // append Strings + if (typeof xs === 'string') + { + return xs + ys; + } + + // append Lists + if (xs.ctor === '[]') + { + return ys; + } + var root = Cons(xs._0, Nil); + var curr = root; + xs = xs._1; + while (xs.ctor !== '[]') + { + curr._1 = Cons(xs._0, Nil); + xs = xs._1; + curr = curr._1; + } + curr._1 = ys; + return root; +} + + +// CRASHES + +function crash(moduleName, region) +{ + return function(message) { + throw new Error( + 'Ran into a `Debug.crash` in module `' + moduleName + '` ' + regionToString(region) + '\n' + + 'The message provided by the code author is:\n\n ' + + message + ); + }; +} + +function crashCase(moduleName, region, value) +{ + return function(message) { + throw new Error( + 'Ran into a `Debug.crash` in module `' + moduleName + '`\n\n' + + 'This was caused by the `case` expression ' + regionToString(region) + '.\n' + + 'One of the branches ended with a crash and the following value got through:\n\n ' + toString(value) + '\n\n' + + 'The message provided by the code author is:\n\n ' + + message + ); + }; +} + +function regionToString(region) +{ + if (region.start.line == region.end.line) + { + return 'on line ' + region.start.line; + } + return 'between lines ' + region.start.line + ' and ' + region.end.line; +} + + +// TO STRING + +function toString(v) +{ + var type = typeof v; + if (type === 'function') + { + return ''; + } + + if (type === 'boolean') + { + return v ? 'True' : 'False'; + } + + if (type === 'number') + { + return v + ''; + } + + if (v instanceof String) + { + return '\'' + addSlashes(v, true) + '\''; + } + + if (type === 'string') + { + return '"' + addSlashes(v, false) + '"'; + } + + if (v === null) + { + return 'null'; + } + + if (type === 'object' && 'ctor' in v) + { + var ctorStarter = v.ctor.substring(0, 5); + + if (ctorStarter === '_Tupl') + { + var output = []; + for (var k in v) + { + if (k === 'ctor') continue; + output.push(toString(v[k])); + } + return '(' + output.join(',') + ')'; + } + + if (ctorStarter === '_Task') + { + return '' + } + + if (v.ctor === '_Array') + { + var list = _elm_lang$core$Array$toList(v); + return 'Array.fromList ' + toString(list); + } + + if (v.ctor === '') + { + return ''; + } + + if (v.ctor === '_Process') + { + return ''; + } + + if (v.ctor === '::') + { + var output = '[' + toString(v._0); + v = v._1; + while (v.ctor === '::') + { + output += ',' + toString(v._0); + v = v._1; + } + return output + ']'; + } + + if (v.ctor === '[]') + { + return '[]'; + } + + if (v.ctor === 'Set_elm_builtin') + { + return 'Set.fromList ' + toString(_elm_lang$core$Set$toList(v)); + } + + if (v.ctor === 'RBNode_elm_builtin' || v.ctor === 'RBEmpty_elm_builtin') + { + return 'Dict.fromList ' + toString(_elm_lang$core$Dict$toList(v)); + } + + var output = ''; + for (var i in v) + { + if (i === 'ctor') continue; + var str = toString(v[i]); + var c0 = str[0]; + var parenless = c0 === '{' || c0 === '(' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0; + output += ' ' + (parenless ? str : '(' + str + ')'); + } + return v.ctor + output; + } + + if (type === 'object') + { + if (v instanceof Date) + { + return '<' + v.toString() + '>'; + } + + if (v.elm_web_socket) + { + return ''; + } + + var output = []; + for (var k in v) + { + output.push(k + ' = ' + toString(v[k])); + } + if (output.length === 0) + { + return '{}'; + } + return '{ ' + output.join(', ') + ' }'; + } + + return ''; +} + +function addSlashes(str, isChar) +{ + var s = str.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/\t/g, '\\t') + .replace(/\r/g, '\\r') + .replace(/\v/g, '\\v') + .replace(/\0/g, '\\0'); + if (isChar) + { + return s.replace(/\'/g, '\\\''); + } + else + { + return s.replace(/\"/g, '\\"'); + } +} + + +return { + eq: eq, + cmp: cmp, + Tuple0: Tuple0, + Tuple2: Tuple2, + chr: chr, + update: update, + guid: guid, + + append: F2(append), + + crash: crash, + crashCase: crashCase, + + toString: toString +}; + +}(); +var _elm_lang$core$Basics$never = function (_p0) { + never: + while (true) { + var _p1 = _p0; + var _v1 = _p1._0; + _p0 = _v1; + continue never; + } +}; +var _elm_lang$core$Basics$uncurry = F2( + function (f, _p2) { + var _p3 = _p2; + return A2(f, _p3._0, _p3._1); + }); +var _elm_lang$core$Basics$curry = F3( + function (f, a, b) { + return f( + {ctor: '_Tuple2', _0: a, _1: b}); + }); +var _elm_lang$core$Basics$flip = F3( + function (f, b, a) { + return A2(f, a, b); + }); +var _elm_lang$core$Basics$always = F2( + function (a, _p4) { + return a; + }); +var _elm_lang$core$Basics$identity = function (x) { + return x; +}; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['<|'] = F2( + function (f, x) { + return f(x); + }); +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['|>'] = F2( + function (x, f) { + return f(x); + }); +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['>>'] = F3( + function (f, g, x) { + return g( + f(x)); + }); +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['<<'] = F3( + function (g, f, x) { + return g( + f(x)); + }); +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['++'] = _elm_lang$core$Native_Utils.append; +var _elm_lang$core$Basics$toString = _elm_lang$core$Native_Utils.toString; +var _elm_lang$core$Basics$isInfinite = _elm_lang$core$Native_Basics.isInfinite; +var _elm_lang$core$Basics$isNaN = _elm_lang$core$Native_Basics.isNaN; +var _elm_lang$core$Basics$toFloat = _elm_lang$core$Native_Basics.toFloat; +var _elm_lang$core$Basics$ceiling = _elm_lang$core$Native_Basics.ceiling; +var _elm_lang$core$Basics$floor = _elm_lang$core$Native_Basics.floor; +var _elm_lang$core$Basics$truncate = _elm_lang$core$Native_Basics.truncate; +var _elm_lang$core$Basics$round = _elm_lang$core$Native_Basics.round; +var _elm_lang$core$Basics$not = _elm_lang$core$Native_Basics.not; +var _elm_lang$core$Basics$xor = _elm_lang$core$Native_Basics.xor; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['||'] = _elm_lang$core$Native_Basics.or; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['&&'] = _elm_lang$core$Native_Basics.and; +var _elm_lang$core$Basics$max = _elm_lang$core$Native_Basics.max; +var _elm_lang$core$Basics$min = _elm_lang$core$Native_Basics.min; +var _elm_lang$core$Basics$compare = _elm_lang$core$Native_Basics.compare; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['>='] = _elm_lang$core$Native_Basics.ge; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['<='] = _elm_lang$core$Native_Basics.le; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['>'] = _elm_lang$core$Native_Basics.gt; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['<'] = _elm_lang$core$Native_Basics.lt; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['/='] = _elm_lang$core$Native_Basics.neq; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['=='] = _elm_lang$core$Native_Basics.eq; +var _elm_lang$core$Basics$e = _elm_lang$core$Native_Basics.e; +var _elm_lang$core$Basics$pi = _elm_lang$core$Native_Basics.pi; +var _elm_lang$core$Basics$clamp = _elm_lang$core$Native_Basics.clamp; +var _elm_lang$core$Basics$logBase = _elm_lang$core$Native_Basics.logBase; +var _elm_lang$core$Basics$abs = _elm_lang$core$Native_Basics.abs; +var _elm_lang$core$Basics$negate = _elm_lang$core$Native_Basics.negate; +var _elm_lang$core$Basics$sqrt = _elm_lang$core$Native_Basics.sqrt; +var _elm_lang$core$Basics$atan2 = _elm_lang$core$Native_Basics.atan2; +var _elm_lang$core$Basics$atan = _elm_lang$core$Native_Basics.atan; +var _elm_lang$core$Basics$asin = _elm_lang$core$Native_Basics.asin; +var _elm_lang$core$Basics$acos = _elm_lang$core$Native_Basics.acos; +var _elm_lang$core$Basics$tan = _elm_lang$core$Native_Basics.tan; +var _elm_lang$core$Basics$sin = _elm_lang$core$Native_Basics.sin; +var _elm_lang$core$Basics$cos = _elm_lang$core$Native_Basics.cos; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['^'] = _elm_lang$core$Native_Basics.exp; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['%'] = _elm_lang$core$Native_Basics.mod; +var _elm_lang$core$Basics$rem = _elm_lang$core$Native_Basics.rem; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['//'] = _elm_lang$core$Native_Basics.div; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['/'] = _elm_lang$core$Native_Basics.floatDiv; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['*'] = _elm_lang$core$Native_Basics.mul; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['-'] = _elm_lang$core$Native_Basics.sub; +var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; +_elm_lang$core$Basics_ops['+'] = _elm_lang$core$Native_Basics.add; +var _elm_lang$core$Basics$toPolar = _elm_lang$core$Native_Basics.toPolar; +var _elm_lang$core$Basics$fromPolar = _elm_lang$core$Native_Basics.fromPolar; +var _elm_lang$core$Basics$turns = _elm_lang$core$Native_Basics.turns; +var _elm_lang$core$Basics$degrees = _elm_lang$core$Native_Basics.degrees; +var _elm_lang$core$Basics$radians = function (t) { + return t; +}; +var _elm_lang$core$Basics$GT = {ctor: 'GT'}; +var _elm_lang$core$Basics$EQ = {ctor: 'EQ'}; +var _elm_lang$core$Basics$LT = {ctor: 'LT'}; +var _elm_lang$core$Basics$JustOneMore = function (a) { + return {ctor: 'JustOneMore', _0: a}; +}; + +var _elm_lang$core$Maybe$withDefault = F2( + function ($default, maybe) { + var _p0 = maybe; + if (_p0.ctor === 'Just') { + return _p0._0; + } else { + return $default; + } + }); +var _elm_lang$core$Maybe$Nothing = {ctor: 'Nothing'}; +var _elm_lang$core$Maybe$andThen = F2( + function (callback, maybeValue) { + var _p1 = maybeValue; + if (_p1.ctor === 'Just') { + return callback(_p1._0); + } else { + return _elm_lang$core$Maybe$Nothing; + } + }); +var _elm_lang$core$Maybe$Just = function (a) { + return {ctor: 'Just', _0: a}; +}; +var _elm_lang$core$Maybe$map = F2( + function (f, maybe) { + var _p2 = maybe; + if (_p2.ctor === 'Just') { + return _elm_lang$core$Maybe$Just( + f(_p2._0)); + } else { + return _elm_lang$core$Maybe$Nothing; + } + }); +var _elm_lang$core$Maybe$map2 = F3( + function (func, ma, mb) { + var _p3 = {ctor: '_Tuple2', _0: ma, _1: mb}; + if (((_p3.ctor === '_Tuple2') && (_p3._0.ctor === 'Just')) && (_p3._1.ctor === 'Just')) { + return _elm_lang$core$Maybe$Just( + A2(func, _p3._0._0, _p3._1._0)); + } else { + return _elm_lang$core$Maybe$Nothing; + } + }); +var _elm_lang$core$Maybe$map3 = F4( + function (func, ma, mb, mc) { + var _p4 = {ctor: '_Tuple3', _0: ma, _1: mb, _2: mc}; + if ((((_p4.ctor === '_Tuple3') && (_p4._0.ctor === 'Just')) && (_p4._1.ctor === 'Just')) && (_p4._2.ctor === 'Just')) { + return _elm_lang$core$Maybe$Just( + A3(func, _p4._0._0, _p4._1._0, _p4._2._0)); + } else { + return _elm_lang$core$Maybe$Nothing; + } + }); +var _elm_lang$core$Maybe$map4 = F5( + function (func, ma, mb, mc, md) { + var _p5 = {ctor: '_Tuple4', _0: ma, _1: mb, _2: mc, _3: md}; + if (((((_p5.ctor === '_Tuple4') && (_p5._0.ctor === 'Just')) && (_p5._1.ctor === 'Just')) && (_p5._2.ctor === 'Just')) && (_p5._3.ctor === 'Just')) { + return _elm_lang$core$Maybe$Just( + A4(func, _p5._0._0, _p5._1._0, _p5._2._0, _p5._3._0)); + } else { + return _elm_lang$core$Maybe$Nothing; + } + }); +var _elm_lang$core$Maybe$map5 = F6( + function (func, ma, mb, mc, md, me) { + var _p6 = {ctor: '_Tuple5', _0: ma, _1: mb, _2: mc, _3: md, _4: me}; + if ((((((_p6.ctor === '_Tuple5') && (_p6._0.ctor === 'Just')) && (_p6._1.ctor === 'Just')) && (_p6._2.ctor === 'Just')) && (_p6._3.ctor === 'Just')) && (_p6._4.ctor === 'Just')) { + return _elm_lang$core$Maybe$Just( + A5(func, _p6._0._0, _p6._1._0, _p6._2._0, _p6._3._0, _p6._4._0)); + } else { + return _elm_lang$core$Maybe$Nothing; + } + }); + +//import Native.Utils // + +var _elm_lang$core$Native_List = function() { + +var Nil = { ctor: '[]' }; + +function Cons(hd, tl) +{ + return { ctor: '::', _0: hd, _1: tl }; +} + +function fromArray(arr) +{ + var out = Nil; + for (var i = arr.length; i--; ) + { + out = Cons(arr[i], out); + } + return out; +} + +function toArray(xs) +{ + var out = []; + while (xs.ctor !== '[]') + { + out.push(xs._0); + xs = xs._1; + } + return out; +} + +function foldr(f, b, xs) +{ + var arr = toArray(xs); + var acc = b; + for (var i = arr.length; i--; ) + { + acc = A2(f, arr[i], acc); + } + return acc; +} + +function map2(f, xs, ys) +{ + var arr = []; + while (xs.ctor !== '[]' && ys.ctor !== '[]') + { + arr.push(A2(f, xs._0, ys._0)); + xs = xs._1; + ys = ys._1; + } + return fromArray(arr); +} + +function map3(f, xs, ys, zs) +{ + var arr = []; + while (xs.ctor !== '[]' && ys.ctor !== '[]' && zs.ctor !== '[]') + { + arr.push(A3(f, xs._0, ys._0, zs._0)); + xs = xs._1; + ys = ys._1; + zs = zs._1; + } + return fromArray(arr); +} + +function map4(f, ws, xs, ys, zs) +{ + var arr = []; + while ( ws.ctor !== '[]' + && xs.ctor !== '[]' + && ys.ctor !== '[]' + && zs.ctor !== '[]') + { + arr.push(A4(f, ws._0, xs._0, ys._0, zs._0)); + ws = ws._1; + xs = xs._1; + ys = ys._1; + zs = zs._1; + } + return fromArray(arr); +} + +function map5(f, vs, ws, xs, ys, zs) +{ + var arr = []; + while ( vs.ctor !== '[]' + && ws.ctor !== '[]' + && xs.ctor !== '[]' + && ys.ctor !== '[]' + && zs.ctor !== '[]') + { + arr.push(A5(f, vs._0, ws._0, xs._0, ys._0, zs._0)); + vs = vs._1; + ws = ws._1; + xs = xs._1; + ys = ys._1; + zs = zs._1; + } + return fromArray(arr); +} + +function sortBy(f, xs) +{ + return fromArray(toArray(xs).sort(function(a, b) { + return _elm_lang$core$Native_Utils.cmp(f(a), f(b)); + })); +} + +function sortWith(f, xs) +{ + return fromArray(toArray(xs).sort(function(a, b) { + var ord = f(a)(b).ctor; + return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1; + })); +} + +return { + Nil: Nil, + Cons: Cons, + cons: F2(Cons), + toArray: toArray, + fromArray: fromArray, + + foldr: F3(foldr), + + map2: F3(map2), + map3: F4(map3), + map4: F5(map4), + map5: F6(map5), + sortBy: F2(sortBy), + sortWith: F2(sortWith) +}; + +}(); +var _elm_lang$core$List$sortWith = _elm_lang$core$Native_List.sortWith; +var _elm_lang$core$List$sortBy = _elm_lang$core$Native_List.sortBy; +var _elm_lang$core$List$sort = function (xs) { + return A2(_elm_lang$core$List$sortBy, _elm_lang$core$Basics$identity, xs); +}; +var _elm_lang$core$List$singleton = function (value) { + return { + ctor: '::', + _0: value, + _1: {ctor: '[]'} + }; +}; +var _elm_lang$core$List$drop = F2( + function (n, list) { + drop: + while (true) { + if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { + return list; + } else { + var _p0 = list; + if (_p0.ctor === '[]') { + return list; + } else { + var _v1 = n - 1, + _v2 = _p0._1; + n = _v1; + list = _v2; + continue drop; + } + } + } + }); +var _elm_lang$core$List$map5 = _elm_lang$core$Native_List.map5; +var _elm_lang$core$List$map4 = _elm_lang$core$Native_List.map4; +var _elm_lang$core$List$map3 = _elm_lang$core$Native_List.map3; +var _elm_lang$core$List$map2 = _elm_lang$core$Native_List.map2; +var _elm_lang$core$List$any = F2( + function (isOkay, list) { + any: + while (true) { + var _p1 = list; + if (_p1.ctor === '[]') { + return false; + } else { + if (isOkay(_p1._0)) { + return true; + } else { + var _v4 = isOkay, + _v5 = _p1._1; + isOkay = _v4; + list = _v5; + continue any; + } + } + } + }); +var _elm_lang$core$List$all = F2( + function (isOkay, list) { + return !A2( + _elm_lang$core$List$any, + function (_p2) { + return !isOkay(_p2); + }, + list); + }); +var _elm_lang$core$List$foldr = _elm_lang$core$Native_List.foldr; +var _elm_lang$core$List$foldl = F3( + function (func, acc, list) { + foldl: + while (true) { + var _p3 = list; + if (_p3.ctor === '[]') { + return acc; + } else { + var _v7 = func, + _v8 = A2(func, _p3._0, acc), + _v9 = _p3._1; + func = _v7; + acc = _v8; + list = _v9; + continue foldl; + } + } + }); +var _elm_lang$core$List$length = function (xs) { + return A3( + _elm_lang$core$List$foldl, + F2( + function (_p4, i) { + return i + 1; + }), + 0, + xs); +}; +var _elm_lang$core$List$sum = function (numbers) { + return A3( + _elm_lang$core$List$foldl, + F2( + function (x, y) { + return x + y; + }), + 0, + numbers); +}; +var _elm_lang$core$List$product = function (numbers) { + return A3( + _elm_lang$core$List$foldl, + F2( + function (x, y) { + return x * y; + }), + 1, + numbers); +}; +var _elm_lang$core$List$maximum = function (list) { + var _p5 = list; + if (_p5.ctor === '::') { + return _elm_lang$core$Maybe$Just( + A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$max, _p5._0, _p5._1)); + } else { + return _elm_lang$core$Maybe$Nothing; + } +}; +var _elm_lang$core$List$minimum = function (list) { + var _p6 = list; + if (_p6.ctor === '::') { + return _elm_lang$core$Maybe$Just( + A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$min, _p6._0, _p6._1)); + } else { + return _elm_lang$core$Maybe$Nothing; + } +}; +var _elm_lang$core$List$member = F2( + function (x, xs) { + return A2( + _elm_lang$core$List$any, + function (a) { + return _elm_lang$core$Native_Utils.eq(a, x); + }, + xs); + }); +var _elm_lang$core$List$isEmpty = function (xs) { + var _p7 = xs; + if (_p7.ctor === '[]') { + return true; + } else { + return false; + } +}; +var _elm_lang$core$List$tail = function (list) { + var _p8 = list; + if (_p8.ctor === '::') { + return _elm_lang$core$Maybe$Just(_p8._1); + } else { + return _elm_lang$core$Maybe$Nothing; + } +}; +var _elm_lang$core$List$head = function (list) { + var _p9 = list; + if (_p9.ctor === '::') { + return _elm_lang$core$Maybe$Just(_p9._0); + } else { + return _elm_lang$core$Maybe$Nothing; + } +}; +var _elm_lang$core$List_ops = _elm_lang$core$List_ops || {}; +_elm_lang$core$List_ops['::'] = _elm_lang$core$Native_List.cons; +var _elm_lang$core$List$map = F2( + function (f, xs) { + return A3( + _elm_lang$core$List$foldr, + F2( + function (x, acc) { + return { + ctor: '::', + _0: f(x), + _1: acc + }; + }), + {ctor: '[]'}, + xs); + }); +var _elm_lang$core$List$filter = F2( + function (pred, xs) { + var conditionalCons = F2( + function (front, back) { + return pred(front) ? {ctor: '::', _0: front, _1: back} : back; + }); + return A3( + _elm_lang$core$List$foldr, + conditionalCons, + {ctor: '[]'}, + xs); + }); +var _elm_lang$core$List$maybeCons = F3( + function (f, mx, xs) { + var _p10 = f(mx); + if (_p10.ctor === 'Just') { + return {ctor: '::', _0: _p10._0, _1: xs}; + } else { + return xs; + } + }); +var _elm_lang$core$List$filterMap = F2( + function (f, xs) { + return A3( + _elm_lang$core$List$foldr, + _elm_lang$core$List$maybeCons(f), + {ctor: '[]'}, + xs); + }); +var _elm_lang$core$List$reverse = function (list) { + return A3( + _elm_lang$core$List$foldl, + F2( + function (x, y) { + return {ctor: '::', _0: x, _1: y}; + }), + {ctor: '[]'}, + list); +}; +var _elm_lang$core$List$scanl = F3( + function (f, b, xs) { + var scan1 = F2( + function (x, accAcc) { + var _p11 = accAcc; + if (_p11.ctor === '::') { + return { + ctor: '::', + _0: A2(f, x, _p11._0), + _1: accAcc + }; + } else { + return {ctor: '[]'}; + } + }); + return _elm_lang$core$List$reverse( + A3( + _elm_lang$core$List$foldl, + scan1, + { + ctor: '::', + _0: b, + _1: {ctor: '[]'} + }, + xs)); + }); +var _elm_lang$core$List$append = F2( + function (xs, ys) { + var _p12 = ys; + if (_p12.ctor === '[]') { + return xs; + } else { + return A3( + _elm_lang$core$List$foldr, + F2( + function (x, y) { + return {ctor: '::', _0: x, _1: y}; + }), + ys, + xs); + } + }); +var _elm_lang$core$List$concat = function (lists) { + return A3( + _elm_lang$core$List$foldr, + _elm_lang$core$List$append, + {ctor: '[]'}, + lists); +}; +var _elm_lang$core$List$concatMap = F2( + function (f, list) { + return _elm_lang$core$List$concat( + A2(_elm_lang$core$List$map, f, list)); + }); +var _elm_lang$core$List$partition = F2( + function (pred, list) { + var step = F2( + function (x, _p13) { + var _p14 = _p13; + var _p16 = _p14._0; + var _p15 = _p14._1; + return pred(x) ? { + ctor: '_Tuple2', + _0: {ctor: '::', _0: x, _1: _p16}, + _1: _p15 + } : { + ctor: '_Tuple2', + _0: _p16, + _1: {ctor: '::', _0: x, _1: _p15} + }; + }); + return A3( + _elm_lang$core$List$foldr, + step, + { + ctor: '_Tuple2', + _0: {ctor: '[]'}, + _1: {ctor: '[]'} + }, + list); + }); +var _elm_lang$core$List$unzip = function (pairs) { + var step = F2( + function (_p18, _p17) { + var _p19 = _p18; + var _p20 = _p17; + return { + ctor: '_Tuple2', + _0: {ctor: '::', _0: _p19._0, _1: _p20._0}, + _1: {ctor: '::', _0: _p19._1, _1: _p20._1} + }; + }); + return A3( + _elm_lang$core$List$foldr, + step, + { + ctor: '_Tuple2', + _0: {ctor: '[]'}, + _1: {ctor: '[]'} + }, + pairs); +}; +var _elm_lang$core$List$intersperse = F2( + function (sep, xs) { + var _p21 = xs; + if (_p21.ctor === '[]') { + return {ctor: '[]'}; + } else { + var step = F2( + function (x, rest) { + return { + ctor: '::', + _0: sep, + _1: {ctor: '::', _0: x, _1: rest} + }; + }); + var spersed = A3( + _elm_lang$core$List$foldr, + step, + {ctor: '[]'}, + _p21._1); + return {ctor: '::', _0: _p21._0, _1: spersed}; + } + }); +var _elm_lang$core$List$takeReverse = F3( + function (n, list, taken) { + takeReverse: + while (true) { + if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { + return taken; + } else { + var _p22 = list; + if (_p22.ctor === '[]') { + return taken; + } else { + var _v23 = n - 1, + _v24 = _p22._1, + _v25 = {ctor: '::', _0: _p22._0, _1: taken}; + n = _v23; + list = _v24; + taken = _v25; + continue takeReverse; + } + } + } + }); +var _elm_lang$core$List$takeTailRec = F2( + function (n, list) { + return _elm_lang$core$List$reverse( + A3( + _elm_lang$core$List$takeReverse, + n, + list, + {ctor: '[]'})); + }); +var _elm_lang$core$List$takeFast = F3( + function (ctr, n, list) { + if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { + return {ctor: '[]'}; + } else { + var _p23 = {ctor: '_Tuple2', _0: n, _1: list}; + _v26_5: + do { + _v26_1: + do { + if (_p23.ctor === '_Tuple2') { + if (_p23._1.ctor === '[]') { + return list; + } else { + if (_p23._1._1.ctor === '::') { + switch (_p23._0) { + case 1: + break _v26_1; + case 2: + return { + ctor: '::', + _0: _p23._1._0, + _1: { + ctor: '::', + _0: _p23._1._1._0, + _1: {ctor: '[]'} + } + }; + case 3: + if (_p23._1._1._1.ctor === '::') { + return { + ctor: '::', + _0: _p23._1._0, + _1: { + ctor: '::', + _0: _p23._1._1._0, + _1: { + ctor: '::', + _0: _p23._1._1._1._0, + _1: {ctor: '[]'} + } + } + }; + } else { + break _v26_5; + } + default: + if ((_p23._1._1._1.ctor === '::') && (_p23._1._1._1._1.ctor === '::')) { + var _p28 = _p23._1._1._1._0; + var _p27 = _p23._1._1._0; + var _p26 = _p23._1._0; + var _p25 = _p23._1._1._1._1._0; + var _p24 = _p23._1._1._1._1._1; + return (_elm_lang$core$Native_Utils.cmp(ctr, 1000) > 0) ? { + ctor: '::', + _0: _p26, + _1: { + ctor: '::', + _0: _p27, + _1: { + ctor: '::', + _0: _p28, + _1: { + ctor: '::', + _0: _p25, + _1: A2(_elm_lang$core$List$takeTailRec, n - 4, _p24) + } + } + } + } : { + ctor: '::', + _0: _p26, + _1: { + ctor: '::', + _0: _p27, + _1: { + ctor: '::', + _0: _p28, + _1: { + ctor: '::', + _0: _p25, + _1: A3(_elm_lang$core$List$takeFast, ctr + 1, n - 4, _p24) + } + } + } + }; + } else { + break _v26_5; + } + } + } else { + if (_p23._0 === 1) { + break _v26_1; + } else { + break _v26_5; + } + } + } + } else { + break _v26_5; + } + } while(false); + return { + ctor: '::', + _0: _p23._1._0, + _1: {ctor: '[]'} + }; + } while(false); + return list; + } + }); +var _elm_lang$core$List$take = F2( + function (n, list) { + return A3(_elm_lang$core$List$takeFast, 0, n, list); + }); +var _elm_lang$core$List$repeatHelp = F3( + function (result, n, value) { + repeatHelp: + while (true) { + if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { + return result; + } else { + var _v27 = {ctor: '::', _0: value, _1: result}, + _v28 = n - 1, + _v29 = value; + result = _v27; + n = _v28; + value = _v29; + continue repeatHelp; + } + } + }); +var _elm_lang$core$List$repeat = F2( + function (n, value) { + return A3( + _elm_lang$core$List$repeatHelp, + {ctor: '[]'}, + n, + value); + }); +var _elm_lang$core$List$rangeHelp = F3( + function (lo, hi, list) { + rangeHelp: + while (true) { + if (_elm_lang$core$Native_Utils.cmp(lo, hi) < 1) { + var _v30 = lo, + _v31 = hi - 1, + _v32 = {ctor: '::', _0: hi, _1: list}; + lo = _v30; + hi = _v31; + list = _v32; + continue rangeHelp; + } else { + return list; + } + } + }); +var _elm_lang$core$List$range = F2( + function (lo, hi) { + return A3( + _elm_lang$core$List$rangeHelp, + lo, + hi, + {ctor: '[]'}); + }); +var _elm_lang$core$List$indexedMap = F2( + function (f, xs) { + return A3( + _elm_lang$core$List$map2, + f, + A2( + _elm_lang$core$List$range, + 0, + _elm_lang$core$List$length(xs) - 1), + xs); + }); + +var _elm_lang$core$Array$append = _elm_lang$core$Native_Array.append; +var _elm_lang$core$Array$length = _elm_lang$core$Native_Array.length; +var _elm_lang$core$Array$isEmpty = function (array) { + return _elm_lang$core$Native_Utils.eq( + _elm_lang$core$Array$length(array), + 0); +}; +var _elm_lang$core$Array$slice = _elm_lang$core$Native_Array.slice; +var _elm_lang$core$Array$set = _elm_lang$core$Native_Array.set; +var _elm_lang$core$Array$get = F2( + function (i, array) { + return ((_elm_lang$core$Native_Utils.cmp(0, i) < 1) && (_elm_lang$core$Native_Utils.cmp( + i, + _elm_lang$core$Native_Array.length(array)) < 0)) ? _elm_lang$core$Maybe$Just( + A2(_elm_lang$core$Native_Array.get, i, array)) : _elm_lang$core$Maybe$Nothing; + }); +var _elm_lang$core$Array$push = _elm_lang$core$Native_Array.push; +var _elm_lang$core$Array$empty = _elm_lang$core$Native_Array.empty; +var _elm_lang$core$Array$filter = F2( + function (isOkay, arr) { + var update = F2( + function (x, xs) { + return isOkay(x) ? A2(_elm_lang$core$Native_Array.push, x, xs) : xs; + }); + return A3(_elm_lang$core$Native_Array.foldl, update, _elm_lang$core$Native_Array.empty, arr); + }); +var _elm_lang$core$Array$foldr = _elm_lang$core$Native_Array.foldr; +var _elm_lang$core$Array$foldl = _elm_lang$core$Native_Array.foldl; +var _elm_lang$core$Array$indexedMap = _elm_lang$core$Native_Array.indexedMap; +var _elm_lang$core$Array$map = _elm_lang$core$Native_Array.map; +var _elm_lang$core$Array$toIndexedList = function (array) { + return A3( + _elm_lang$core$List$map2, + F2( + function (v0, v1) { + return {ctor: '_Tuple2', _0: v0, _1: v1}; + }), + A2( + _elm_lang$core$List$range, + 0, + _elm_lang$core$Native_Array.length(array) - 1), + _elm_lang$core$Native_Array.toList(array)); +}; +var _elm_lang$core$Array$toList = _elm_lang$core$Native_Array.toList; +var _elm_lang$core$Array$fromList = _elm_lang$core$Native_Array.fromList; +var _elm_lang$core$Array$initialize = _elm_lang$core$Native_Array.initialize; +var _elm_lang$core$Array$repeat = F2( + function (n, e) { + return A2( + _elm_lang$core$Array$initialize, + n, + _elm_lang$core$Basics$always(e)); + }); +var _elm_lang$core$Array$Array = {ctor: 'Array'}; + +//import Native.Utils // + +var _elm_lang$core$Native_Debug = function() { + +function log(tag, value) +{ + var msg = tag + ': ' + _elm_lang$core$Native_Utils.toString(value); + var process = process || {}; + if (process.stdout) + { + process.stdout.write(msg); + } + else + { + console.log(msg); + } + return value; +} + +function crash(message) +{ + throw new Error(message); +} + +return { + crash: crash, + log: F2(log) +}; + +}(); +//import Maybe, Native.List, Native.Utils, Result // + +var _elm_lang$core$Native_String = function() { + +function isEmpty(str) +{ + return str.length === 0; +} +function cons(chr, str) +{ + return chr + str; +} +function uncons(str) +{ + var hd = str[0]; + if (hd) + { + return _elm_lang$core$Maybe$Just(_elm_lang$core$Native_Utils.Tuple2(_elm_lang$core$Native_Utils.chr(hd), str.slice(1))); + } + return _elm_lang$core$Maybe$Nothing; +} +function append(a, b) +{ + return a + b; +} +function concat(strs) +{ + return _elm_lang$core$Native_List.toArray(strs).join(''); +} +function length(str) +{ + return str.length; +} +function map(f, str) +{ + var out = str.split(''); + for (var i = out.length; i--; ) + { + out[i] = f(_elm_lang$core$Native_Utils.chr(out[i])); + } + return out.join(''); +} +function filter(pred, str) +{ + return str.split('').map(_elm_lang$core$Native_Utils.chr).filter(pred).join(''); +} +function reverse(str) +{ + return str.split('').reverse().join(''); +} +function foldl(f, b, str) +{ + var len = str.length; + for (var i = 0; i < len; ++i) + { + b = A2(f, _elm_lang$core$Native_Utils.chr(str[i]), b); + } + return b; +} +function foldr(f, b, str) +{ + for (var i = str.length; i--; ) + { + b = A2(f, _elm_lang$core$Native_Utils.chr(str[i]), b); + } + return b; +} +function split(sep, str) +{ + return _elm_lang$core$Native_List.fromArray(str.split(sep)); +} +function join(sep, strs) +{ + return _elm_lang$core$Native_List.toArray(strs).join(sep); +} +function repeat(n, str) +{ + var result = ''; + while (n > 0) + { + if (n & 1) + { + result += str; + } + n >>= 1, str += str; + } + return result; +} +function slice(start, end, str) +{ + return str.slice(start, end); +} +function left(n, str) +{ + return n < 1 ? '' : str.slice(0, n); +} +function right(n, str) +{ + return n < 1 ? '' : str.slice(-n); +} +function dropLeft(n, str) +{ + return n < 1 ? str : str.slice(n); +} +function dropRight(n, str) +{ + return n < 1 ? str : str.slice(0, -n); +} +function pad(n, chr, str) +{ + var half = (n - str.length) / 2; + return repeat(Math.ceil(half), chr) + str + repeat(half | 0, chr); +} +function padRight(n, chr, str) +{ + return str + repeat(n - str.length, chr); +} +function padLeft(n, chr, str) +{ + return repeat(n - str.length, chr) + str; +} + +function trim(str) +{ + return str.trim(); +} +function trimLeft(str) +{ + return str.replace(/^\s+/, ''); +} +function trimRight(str) +{ + return str.replace(/\s+$/, ''); +} + +function words(str) +{ + return _elm_lang$core$Native_List.fromArray(str.trim().split(/\s+/g)); +} +function lines(str) +{ + return _elm_lang$core$Native_List.fromArray(str.split(/\r\n|\r|\n/g)); +} + +function toUpper(str) +{ + return str.toUpperCase(); +} +function toLower(str) +{ + return str.toLowerCase(); +} + +function any(pred, str) +{ + for (var i = str.length; i--; ) + { + if (pred(_elm_lang$core$Native_Utils.chr(str[i]))) + { + return true; + } + } + return false; +} +function all(pred, str) +{ + for (var i = str.length; i--; ) + { + if (!pred(_elm_lang$core$Native_Utils.chr(str[i]))) + { + return false; + } + } + return true; +} + +function contains(sub, str) +{ + return str.indexOf(sub) > -1; +} +function startsWith(sub, str) +{ + return str.indexOf(sub) === 0; +} +function endsWith(sub, str) +{ + return str.length >= sub.length && + str.lastIndexOf(sub) === str.length - sub.length; +} +function indexes(sub, str) +{ + var subLen = sub.length; + + if (subLen < 1) + { + return _elm_lang$core$Native_List.Nil; + } + + var i = 0; + var is = []; + + while ((i = str.indexOf(sub, i)) > -1) + { + is.push(i); + i = i + subLen; + } + + return _elm_lang$core$Native_List.fromArray(is); +} + + +function toInt(s) +{ + var len = s.length; + + // if empty + if (len === 0) + { + return intErr(s); + } + + // if hex + var c = s[0]; + if (c === '0' && s[1] === 'x') + { + for (var i = 2; i < len; ++i) + { + var c = s[i]; + if (('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f')) + { + continue; + } + return intErr(s); + } + return _elm_lang$core$Result$Ok(parseInt(s, 16)); + } + + // is decimal + if (c > '9' || (c < '0' && c !== '-' && c !== '+')) + { + return intErr(s); + } + for (var i = 1; i < len; ++i) + { + var c = s[i]; + if (c < '0' || '9' < c) + { + return intErr(s); + } + } + + return _elm_lang$core$Result$Ok(parseInt(s, 10)); +} + +function intErr(s) +{ + return _elm_lang$core$Result$Err("could not convert string '" + s + "' to an Int"); +} + + +function toFloat(s) +{ + // check if it is a hex, octal, or binary number + if (s.length === 0 || /[\sxbo]/.test(s)) + { + return floatErr(s); + } + var n = +s; + // faster isNaN check + return n === n ? _elm_lang$core$Result$Ok(n) : floatErr(s); +} + +function floatErr(s) +{ + return _elm_lang$core$Result$Err("could not convert string '" + s + "' to a Float"); +} + + +function toList(str) +{ + return _elm_lang$core$Native_List.fromArray(str.split('').map(_elm_lang$core$Native_Utils.chr)); +} +function fromList(chars) +{ + return _elm_lang$core$Native_List.toArray(chars).join(''); +} + +return { + isEmpty: isEmpty, + cons: F2(cons), + uncons: uncons, + append: F2(append), + concat: concat, + length: length, + map: F2(map), + filter: F2(filter), + reverse: reverse, + foldl: F3(foldl), + foldr: F3(foldr), + + split: F2(split), + join: F2(join), + repeat: F2(repeat), + + slice: F3(slice), + left: F2(left), + right: F2(right), + dropLeft: F2(dropLeft), + dropRight: F2(dropRight), + + pad: F3(pad), + padLeft: F3(padLeft), + padRight: F3(padRight), + + trim: trim, + trimLeft: trimLeft, + trimRight: trimRight, + + words: words, + lines: lines, + + toUpper: toUpper, + toLower: toLower, + + any: F2(any), + all: F2(all), + + contains: F2(contains), + startsWith: F2(startsWith), + endsWith: F2(endsWith), + indexes: F2(indexes), + + toInt: toInt, + toFloat: toFloat, + toList: toList, + fromList: fromList +}; + +}(); + +//import Native.Utils // + +var _elm_lang$core$Native_Char = function() { + +return { + fromCode: function(c) { return _elm_lang$core$Native_Utils.chr(String.fromCharCode(c)); }, + toCode: function(c) { return c.charCodeAt(0); }, + toUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toUpperCase()); }, + toLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLowerCase()); }, + toLocaleUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleUpperCase()); }, + toLocaleLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleLowerCase()); } +}; + +}(); +var _elm_lang$core$Char$fromCode = _elm_lang$core$Native_Char.fromCode; +var _elm_lang$core$Char$toCode = _elm_lang$core$Native_Char.toCode; +var _elm_lang$core$Char$toLocaleLower = _elm_lang$core$Native_Char.toLocaleLower; +var _elm_lang$core$Char$toLocaleUpper = _elm_lang$core$Native_Char.toLocaleUpper; +var _elm_lang$core$Char$toLower = _elm_lang$core$Native_Char.toLower; +var _elm_lang$core$Char$toUpper = _elm_lang$core$Native_Char.toUpper; +var _elm_lang$core$Char$isBetween = F3( + function (low, high, $char) { + var code = _elm_lang$core$Char$toCode($char); + return (_elm_lang$core$Native_Utils.cmp( + code, + _elm_lang$core$Char$toCode(low)) > -1) && (_elm_lang$core$Native_Utils.cmp( + code, + _elm_lang$core$Char$toCode(high)) < 1); + }); +var _elm_lang$core$Char$isUpper = A2( + _elm_lang$core$Char$isBetween, + _elm_lang$core$Native_Utils.chr('A'), + _elm_lang$core$Native_Utils.chr('Z')); +var _elm_lang$core$Char$isLower = A2( + _elm_lang$core$Char$isBetween, + _elm_lang$core$Native_Utils.chr('a'), + _elm_lang$core$Native_Utils.chr('z')); +var _elm_lang$core$Char$isDigit = A2( + _elm_lang$core$Char$isBetween, + _elm_lang$core$Native_Utils.chr('0'), + _elm_lang$core$Native_Utils.chr('9')); +var _elm_lang$core$Char$isOctDigit = A2( + _elm_lang$core$Char$isBetween, + _elm_lang$core$Native_Utils.chr('0'), + _elm_lang$core$Native_Utils.chr('7')); +var _elm_lang$core$Char$isHexDigit = function ($char) { + return _elm_lang$core$Char$isDigit($char) || (A3( + _elm_lang$core$Char$isBetween, + _elm_lang$core$Native_Utils.chr('a'), + _elm_lang$core$Native_Utils.chr('f'), + $char) || A3( + _elm_lang$core$Char$isBetween, + _elm_lang$core$Native_Utils.chr('A'), + _elm_lang$core$Native_Utils.chr('F'), + $char)); +}; + +var _elm_lang$core$Result$toMaybe = function (result) { + var _p0 = result; + if (_p0.ctor === 'Ok') { + return _elm_lang$core$Maybe$Just(_p0._0); + } else { + return _elm_lang$core$Maybe$Nothing; + } +}; +var _elm_lang$core$Result$withDefault = F2( + function (def, result) { + var _p1 = result; + if (_p1.ctor === 'Ok') { + return _p1._0; + } else { + return def; + } + }); +var _elm_lang$core$Result$Err = function (a) { + return {ctor: 'Err', _0: a}; +}; +var _elm_lang$core$Result$andThen = F2( + function (callback, result) { + var _p2 = result; + if (_p2.ctor === 'Ok') { + return callback(_p2._0); + } else { + return _elm_lang$core$Result$Err(_p2._0); + } + }); +var _elm_lang$core$Result$Ok = function (a) { + return {ctor: 'Ok', _0: a}; +}; +var _elm_lang$core$Result$map = F2( + function (func, ra) { + var _p3 = ra; + if (_p3.ctor === 'Ok') { + return _elm_lang$core$Result$Ok( + func(_p3._0)); + } else { + return _elm_lang$core$Result$Err(_p3._0); + } + }); +var _elm_lang$core$Result$map2 = F3( + function (func, ra, rb) { + var _p4 = {ctor: '_Tuple2', _0: ra, _1: rb}; + if (_p4._0.ctor === 'Ok') { + if (_p4._1.ctor === 'Ok') { + return _elm_lang$core$Result$Ok( + A2(func, _p4._0._0, _p4._1._0)); + } else { + return _elm_lang$core$Result$Err(_p4._1._0); + } + } else { + return _elm_lang$core$Result$Err(_p4._0._0); + } + }); +var _elm_lang$core$Result$map3 = F4( + function (func, ra, rb, rc) { + var _p5 = {ctor: '_Tuple3', _0: ra, _1: rb, _2: rc}; + if (_p5._0.ctor === 'Ok') { + if (_p5._1.ctor === 'Ok') { + if (_p5._2.ctor === 'Ok') { + return _elm_lang$core$Result$Ok( + A3(func, _p5._0._0, _p5._1._0, _p5._2._0)); + } else { + return _elm_lang$core$Result$Err(_p5._2._0); + } + } else { + return _elm_lang$core$Result$Err(_p5._1._0); + } + } else { + return _elm_lang$core$Result$Err(_p5._0._0); + } + }); +var _elm_lang$core$Result$map4 = F5( + function (func, ra, rb, rc, rd) { + var _p6 = {ctor: '_Tuple4', _0: ra, _1: rb, _2: rc, _3: rd}; + if (_p6._0.ctor === 'Ok') { + if (_p6._1.ctor === 'Ok') { + if (_p6._2.ctor === 'Ok') { + if (_p6._3.ctor === 'Ok') { + return _elm_lang$core$Result$Ok( + A4(func, _p6._0._0, _p6._1._0, _p6._2._0, _p6._3._0)); + } else { + return _elm_lang$core$Result$Err(_p6._3._0); + } + } else { + return _elm_lang$core$Result$Err(_p6._2._0); + } + } else { + return _elm_lang$core$Result$Err(_p6._1._0); + } + } else { + return _elm_lang$core$Result$Err(_p6._0._0); + } + }); +var _elm_lang$core$Result$map5 = F6( + function (func, ra, rb, rc, rd, re) { + var _p7 = {ctor: '_Tuple5', _0: ra, _1: rb, _2: rc, _3: rd, _4: re}; + if (_p7._0.ctor === 'Ok') { + if (_p7._1.ctor === 'Ok') { + if (_p7._2.ctor === 'Ok') { + if (_p7._3.ctor === 'Ok') { + if (_p7._4.ctor === 'Ok') { + return _elm_lang$core$Result$Ok( + A5(func, _p7._0._0, _p7._1._0, _p7._2._0, _p7._3._0, _p7._4._0)); + } else { + return _elm_lang$core$Result$Err(_p7._4._0); + } + } else { + return _elm_lang$core$Result$Err(_p7._3._0); + } + } else { + return _elm_lang$core$Result$Err(_p7._2._0); + } + } else { + return _elm_lang$core$Result$Err(_p7._1._0); + } + } else { + return _elm_lang$core$Result$Err(_p7._0._0); + } + }); +var _elm_lang$core$Result$mapError = F2( + function (f, result) { + var _p8 = result; + if (_p8.ctor === 'Ok') { + return _elm_lang$core$Result$Ok(_p8._0); + } else { + return _elm_lang$core$Result$Err( + f(_p8._0)); + } + }); +var _elm_lang$core$Result$fromMaybe = F2( + function (err, maybe) { + var _p9 = maybe; + if (_p9.ctor === 'Just') { + return _elm_lang$core$Result$Ok(_p9._0); + } else { + return _elm_lang$core$Result$Err(err); + } + }); + +var _elm_lang$core$String$fromList = _elm_lang$core$Native_String.fromList; +var _elm_lang$core$String$toList = _elm_lang$core$Native_String.toList; +var _elm_lang$core$String$toFloat = _elm_lang$core$Native_String.toFloat; +var _elm_lang$core$String$toInt = _elm_lang$core$Native_String.toInt; +var _elm_lang$core$String$indices = _elm_lang$core$Native_String.indexes; +var _elm_lang$core$String$indexes = _elm_lang$core$Native_String.indexes; +var _elm_lang$core$String$endsWith = _elm_lang$core$Native_String.endsWith; +var _elm_lang$core$String$startsWith = _elm_lang$core$Native_String.startsWith; +var _elm_lang$core$String$contains = _elm_lang$core$Native_String.contains; +var _elm_lang$core$String$all = _elm_lang$core$Native_String.all; +var _elm_lang$core$String$any = _elm_lang$core$Native_String.any; +var _elm_lang$core$String$toLower = _elm_lang$core$Native_String.toLower; +var _elm_lang$core$String$toUpper = _elm_lang$core$Native_String.toUpper; +var _elm_lang$core$String$lines = _elm_lang$core$Native_String.lines; +var _elm_lang$core$String$words = _elm_lang$core$Native_String.words; +var _elm_lang$core$String$trimRight = _elm_lang$core$Native_String.trimRight; +var _elm_lang$core$String$trimLeft = _elm_lang$core$Native_String.trimLeft; +var _elm_lang$core$String$trim = _elm_lang$core$Native_String.trim; +var _elm_lang$core$String$padRight = _elm_lang$core$Native_String.padRight; +var _elm_lang$core$String$padLeft = _elm_lang$core$Native_String.padLeft; +var _elm_lang$core$String$pad = _elm_lang$core$Native_String.pad; +var _elm_lang$core$String$dropRight = _elm_lang$core$Native_String.dropRight; +var _elm_lang$core$String$dropLeft = _elm_lang$core$Native_String.dropLeft; +var _elm_lang$core$String$right = _elm_lang$core$Native_String.right; +var _elm_lang$core$String$left = _elm_lang$core$Native_String.left; +var _elm_lang$core$String$slice = _elm_lang$core$Native_String.slice; +var _elm_lang$core$String$repeat = _elm_lang$core$Native_String.repeat; +var _elm_lang$core$String$join = _elm_lang$core$Native_String.join; +var _elm_lang$core$String$split = _elm_lang$core$Native_String.split; +var _elm_lang$core$String$foldr = _elm_lang$core$Native_String.foldr; +var _elm_lang$core$String$foldl = _elm_lang$core$Native_String.foldl; +var _elm_lang$core$String$reverse = _elm_lang$core$Native_String.reverse; +var _elm_lang$core$String$filter = _elm_lang$core$Native_String.filter; +var _elm_lang$core$String$map = _elm_lang$core$Native_String.map; +var _elm_lang$core$String$length = _elm_lang$core$Native_String.length; +var _elm_lang$core$String$concat = _elm_lang$core$Native_String.concat; +var _elm_lang$core$String$append = _elm_lang$core$Native_String.append; +var _elm_lang$core$String$uncons = _elm_lang$core$Native_String.uncons; +var _elm_lang$core$String$cons = _elm_lang$core$Native_String.cons; +var _elm_lang$core$String$fromChar = function ($char) { + return A2(_elm_lang$core$String$cons, $char, ''); +}; +var _elm_lang$core$String$isEmpty = _elm_lang$core$Native_String.isEmpty; + +var _elm_lang$core$Dict$foldr = F3( + function (f, acc, t) { + foldr: + while (true) { + var _p0 = t; + if (_p0.ctor === 'RBEmpty_elm_builtin') { + return acc; + } else { + var _v1 = f, + _v2 = A3( + f, + _p0._1, + _p0._2, + A3(_elm_lang$core$Dict$foldr, f, acc, _p0._4)), + _v3 = _p0._3; + f = _v1; + acc = _v2; + t = _v3; + continue foldr; + } + } + }); +var _elm_lang$core$Dict$keys = function (dict) { + return A3( + _elm_lang$core$Dict$foldr, + F3( + function (key, value, keyList) { + return {ctor: '::', _0: key, _1: keyList}; + }), + {ctor: '[]'}, + dict); +}; +var _elm_lang$core$Dict$values = function (dict) { + return A3( + _elm_lang$core$Dict$foldr, + F3( + function (key, value, valueList) { + return {ctor: '::', _0: value, _1: valueList}; + }), + {ctor: '[]'}, + dict); +}; +var _elm_lang$core$Dict$toList = function (dict) { + return A3( + _elm_lang$core$Dict$foldr, + F3( + function (key, value, list) { + return { + ctor: '::', + _0: {ctor: '_Tuple2', _0: key, _1: value}, + _1: list + }; + }), + {ctor: '[]'}, + dict); +}; +var _elm_lang$core$Dict$foldl = F3( + function (f, acc, dict) { + foldl: + while (true) { + var _p1 = dict; + if (_p1.ctor === 'RBEmpty_elm_builtin') { + return acc; + } else { + var _v5 = f, + _v6 = A3( + f, + _p1._1, + _p1._2, + A3(_elm_lang$core$Dict$foldl, f, acc, _p1._3)), + _v7 = _p1._4; + f = _v5; + acc = _v6; + dict = _v7; + continue foldl; + } + } + }); +var _elm_lang$core$Dict$merge = F6( + function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) { + var stepState = F3( + function (rKey, rValue, _p2) { + stepState: + while (true) { + var _p3 = _p2; + var _p9 = _p3._1; + var _p8 = _p3._0; + var _p4 = _p8; + if (_p4.ctor === '[]') { + return { + ctor: '_Tuple2', + _0: _p8, + _1: A3(rightStep, rKey, rValue, _p9) + }; + } else { + var _p7 = _p4._1; + var _p6 = _p4._0._1; + var _p5 = _p4._0._0; + if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) < 0) { + var _v10 = rKey, + _v11 = rValue, + _v12 = { + ctor: '_Tuple2', + _0: _p7, + _1: A3(leftStep, _p5, _p6, _p9) + }; + rKey = _v10; + rValue = _v11; + _p2 = _v12; + continue stepState; + } else { + if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) > 0) { + return { + ctor: '_Tuple2', + _0: _p8, + _1: A3(rightStep, rKey, rValue, _p9) + }; + } else { + return { + ctor: '_Tuple2', + _0: _p7, + _1: A4(bothStep, _p5, _p6, rValue, _p9) + }; + } + } + } + } + }); + var _p10 = A3( + _elm_lang$core$Dict$foldl, + stepState, + { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$toList(leftDict), + _1: initialResult + }, + rightDict); + var leftovers = _p10._0; + var intermediateResult = _p10._1; + return A3( + _elm_lang$core$List$foldl, + F2( + function (_p11, result) { + var _p12 = _p11; + return A3(leftStep, _p12._0, _p12._1, result); + }), + intermediateResult, + leftovers); + }); +var _elm_lang$core$Dict$reportRemBug = F4( + function (msg, c, lgot, rgot) { + return _elm_lang$core$Native_Debug.crash( + _elm_lang$core$String$concat( + { + ctor: '::', + _0: 'Internal red-black tree invariant violated, expected ', + _1: { + ctor: '::', + _0: msg, + _1: { + ctor: '::', + _0: ' and got ', + _1: { + ctor: '::', + _0: _elm_lang$core$Basics$toString(c), + _1: { + ctor: '::', + _0: '/', + _1: { + ctor: '::', + _0: lgot, + _1: { + ctor: '::', + _0: '/', + _1: { + ctor: '::', + _0: rgot, + _1: { + ctor: '::', + _0: '\nPlease report this bug to ', + _1: {ctor: '[]'} + } + } + } + } + } + } + } + } + })); + }); +var _elm_lang$core$Dict$isBBlack = function (dict) { + var _p13 = dict; + _v14_2: + do { + if (_p13.ctor === 'RBNode_elm_builtin') { + if (_p13._0.ctor === 'BBlack') { + return true; + } else { + break _v14_2; + } + } else { + if (_p13._0.ctor === 'LBBlack') { + return true; + } else { + break _v14_2; + } + } + } while(false); + return false; +}; +var _elm_lang$core$Dict$sizeHelp = F2( + function (n, dict) { + sizeHelp: + while (true) { + var _p14 = dict; + if (_p14.ctor === 'RBEmpty_elm_builtin') { + return n; + } else { + var _v16 = A2(_elm_lang$core$Dict$sizeHelp, n + 1, _p14._4), + _v17 = _p14._3; + n = _v16; + dict = _v17; + continue sizeHelp; + } + } + }); +var _elm_lang$core$Dict$size = function (dict) { + return A2(_elm_lang$core$Dict$sizeHelp, 0, dict); +}; +var _elm_lang$core$Dict$get = F2( + function (targetKey, dict) { + get: + while (true) { + var _p15 = dict; + if (_p15.ctor === 'RBEmpty_elm_builtin') { + return _elm_lang$core$Maybe$Nothing; + } else { + var _p16 = A2(_elm_lang$core$Basics$compare, targetKey, _p15._1); + switch (_p16.ctor) { + case 'LT': + var _v20 = targetKey, + _v21 = _p15._3; + targetKey = _v20; + dict = _v21; + continue get; + case 'EQ': + return _elm_lang$core$Maybe$Just(_p15._2); + default: + var _v22 = targetKey, + _v23 = _p15._4; + targetKey = _v22; + dict = _v23; + continue get; + } + } + } + }); +var _elm_lang$core$Dict$member = F2( + function (key, dict) { + var _p17 = A2(_elm_lang$core$Dict$get, key, dict); + if (_p17.ctor === 'Just') { + return true; + } else { + return false; + } + }); +var _elm_lang$core$Dict$maxWithDefault = F3( + function (k, v, r) { + maxWithDefault: + while (true) { + var _p18 = r; + if (_p18.ctor === 'RBEmpty_elm_builtin') { + return {ctor: '_Tuple2', _0: k, _1: v}; + } else { + var _v26 = _p18._1, + _v27 = _p18._2, + _v28 = _p18._4; + k = _v26; + v = _v27; + r = _v28; + continue maxWithDefault; + } + } + }); +var _elm_lang$core$Dict$NBlack = {ctor: 'NBlack'}; +var _elm_lang$core$Dict$BBlack = {ctor: 'BBlack'}; +var _elm_lang$core$Dict$Black = {ctor: 'Black'}; +var _elm_lang$core$Dict$blackish = function (t) { + var _p19 = t; + if (_p19.ctor === 'RBNode_elm_builtin') { + var _p20 = _p19._0; + return _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$Black) || _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$BBlack); + } else { + return true; + } +}; +var _elm_lang$core$Dict$Red = {ctor: 'Red'}; +var _elm_lang$core$Dict$moreBlack = function (color) { + var _p21 = color; + switch (_p21.ctor) { + case 'Black': + return _elm_lang$core$Dict$BBlack; + case 'Red': + return _elm_lang$core$Dict$Black; + case 'NBlack': + return _elm_lang$core$Dict$Red; + default: + return _elm_lang$core$Native_Debug.crash('Can\'t make a double black node more black!'); + } +}; +var _elm_lang$core$Dict$lessBlack = function (color) { + var _p22 = color; + switch (_p22.ctor) { + case 'BBlack': + return _elm_lang$core$Dict$Black; + case 'Black': + return _elm_lang$core$Dict$Red; + case 'Red': + return _elm_lang$core$Dict$NBlack; + default: + return _elm_lang$core$Native_Debug.crash('Can\'t make a negative black node less black!'); + } +}; +var _elm_lang$core$Dict$LBBlack = {ctor: 'LBBlack'}; +var _elm_lang$core$Dict$LBlack = {ctor: 'LBlack'}; +var _elm_lang$core$Dict$RBEmpty_elm_builtin = function (a) { + return {ctor: 'RBEmpty_elm_builtin', _0: a}; +}; +var _elm_lang$core$Dict$empty = _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); +var _elm_lang$core$Dict$isEmpty = function (dict) { + return _elm_lang$core$Native_Utils.eq(dict, _elm_lang$core$Dict$empty); +}; +var _elm_lang$core$Dict$RBNode_elm_builtin = F5( + function (a, b, c, d, e) { + return {ctor: 'RBNode_elm_builtin', _0: a, _1: b, _2: c, _3: d, _4: e}; + }); +var _elm_lang$core$Dict$ensureBlackRoot = function (dict) { + var _p23 = dict; + if ((_p23.ctor === 'RBNode_elm_builtin') && (_p23._0.ctor === 'Red')) { + return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p23._1, _p23._2, _p23._3, _p23._4); + } else { + return dict; + } +}; +var _elm_lang$core$Dict$lessBlackTree = function (dict) { + var _p24 = dict; + if (_p24.ctor === 'RBNode_elm_builtin') { + return A5( + _elm_lang$core$Dict$RBNode_elm_builtin, + _elm_lang$core$Dict$lessBlack(_p24._0), + _p24._1, + _p24._2, + _p24._3, + _p24._4); + } else { + return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); + } +}; +var _elm_lang$core$Dict$balancedTree = function (col) { + return function (xk) { + return function (xv) { + return function (yk) { + return function (yv) { + return function (zk) { + return function (zv) { + return function (a) { + return function (b) { + return function (c) { + return function (d) { + return A5( + _elm_lang$core$Dict$RBNode_elm_builtin, + _elm_lang$core$Dict$lessBlack(col), + yk, + yv, + A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, xk, xv, a, b), + A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, zk, zv, c, d)); + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; +}; +var _elm_lang$core$Dict$blacken = function (t) { + var _p25 = t; + if (_p25.ctor === 'RBEmpty_elm_builtin') { + return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); + } else { + return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p25._1, _p25._2, _p25._3, _p25._4); + } +}; +var _elm_lang$core$Dict$redden = function (t) { + var _p26 = t; + if (_p26.ctor === 'RBEmpty_elm_builtin') { + return _elm_lang$core$Native_Debug.crash('can\'t make a Leaf red'); + } else { + return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, _p26._1, _p26._2, _p26._3, _p26._4); + } +}; +var _elm_lang$core$Dict$balanceHelp = function (tree) { + var _p27 = tree; + _v36_6: + do { + _v36_5: + do { + _v36_4: + do { + _v36_3: + do { + _v36_2: + do { + _v36_1: + do { + _v36_0: + do { + if (_p27.ctor === 'RBNode_elm_builtin') { + if (_p27._3.ctor === 'RBNode_elm_builtin') { + if (_p27._4.ctor === 'RBNode_elm_builtin') { + switch (_p27._3._0.ctor) { + case 'Red': + switch (_p27._4._0.ctor) { + case 'Red': + if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { + break _v36_0; + } else { + if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { + break _v36_1; + } else { + if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { + break _v36_2; + } else { + if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { + break _v36_3; + } else { + break _v36_6; + } + } + } + } + case 'NBlack': + if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { + break _v36_0; + } else { + if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { + break _v36_1; + } else { + if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { + break _v36_4; + } else { + break _v36_6; + } + } + } + default: + if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { + break _v36_0; + } else { + if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { + break _v36_1; + } else { + break _v36_6; + } + } + } + case 'NBlack': + switch (_p27._4._0.ctor) { + case 'Red': + if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { + break _v36_2; + } else { + if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { + break _v36_3; + } else { + if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { + break _v36_5; + } else { + break _v36_6; + } + } + } + case 'NBlack': + if (_p27._0.ctor === 'BBlack') { + if ((((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { + break _v36_4; + } else { + if ((((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { + break _v36_5; + } else { + break _v36_6; + } + } + } else { + break _v36_6; + } + default: + if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { + break _v36_5; + } else { + break _v36_6; + } + } + default: + switch (_p27._4._0.ctor) { + case 'Red': + if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { + break _v36_2; + } else { + if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { + break _v36_3; + } else { + break _v36_6; + } + } + case 'NBlack': + if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { + break _v36_4; + } else { + break _v36_6; + } + default: + break _v36_6; + } + } + } else { + switch (_p27._3._0.ctor) { + case 'Red': + if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { + break _v36_0; + } else { + if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { + break _v36_1; + } else { + break _v36_6; + } + } + case 'NBlack': + if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { + break _v36_5; + } else { + break _v36_6; + } + default: + break _v36_6; + } + } + } else { + if (_p27._4.ctor === 'RBNode_elm_builtin') { + switch (_p27._4._0.ctor) { + case 'Red': + if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { + break _v36_2; + } else { + if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { + break _v36_3; + } else { + break _v36_6; + } + } + case 'NBlack': + if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { + break _v36_4; + } else { + break _v36_6; + } + default: + break _v36_6; + } + } else { + break _v36_6; + } + } + } else { + break _v36_6; + } + } while(false); + return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._3._1)(_p27._3._3._2)(_p27._3._1)(_p27._3._2)(_p27._1)(_p27._2)(_p27._3._3._3)(_p27._3._3._4)(_p27._3._4)(_p27._4); + } while(false); + return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._1)(_p27._3._2)(_p27._3._4._1)(_p27._3._4._2)(_p27._1)(_p27._2)(_p27._3._3)(_p27._3._4._3)(_p27._3._4._4)(_p27._4); + } while(false); + return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._3._1)(_p27._4._3._2)(_p27._4._1)(_p27._4._2)(_p27._3)(_p27._4._3._3)(_p27._4._3._4)(_p27._4._4); + } while(false); + return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._1)(_p27._4._2)(_p27._4._4._1)(_p27._4._4._2)(_p27._3)(_p27._4._3)(_p27._4._4._3)(_p27._4._4._4); + } while(false); + return A5( + _elm_lang$core$Dict$RBNode_elm_builtin, + _elm_lang$core$Dict$Black, + _p27._4._3._1, + _p27._4._3._2, + A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3, _p27._4._3._3), + A5( + _elm_lang$core$Dict$balance, + _elm_lang$core$Dict$Black, + _p27._4._1, + _p27._4._2, + _p27._4._3._4, + _elm_lang$core$Dict$redden(_p27._4._4))); + } while(false); + return A5( + _elm_lang$core$Dict$RBNode_elm_builtin, + _elm_lang$core$Dict$Black, + _p27._3._4._1, + _p27._3._4._2, + A5( + _elm_lang$core$Dict$balance, + _elm_lang$core$Dict$Black, + _p27._3._1, + _p27._3._2, + _elm_lang$core$Dict$redden(_p27._3._3), + _p27._3._4._3), + A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3._4._4, _p27._4)); + } while(false); + return tree; +}; +var _elm_lang$core$Dict$balance = F5( + function (c, k, v, l, r) { + var tree = A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r); + return _elm_lang$core$Dict$blackish(tree) ? _elm_lang$core$Dict$balanceHelp(tree) : tree; + }); +var _elm_lang$core$Dict$bubble = F5( + function (c, k, v, l, r) { + return (_elm_lang$core$Dict$isBBlack(l) || _elm_lang$core$Dict$isBBlack(r)) ? A5( + _elm_lang$core$Dict$balance, + _elm_lang$core$Dict$moreBlack(c), + k, + v, + _elm_lang$core$Dict$lessBlackTree(l), + _elm_lang$core$Dict$lessBlackTree(r)) : A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r); + }); +var _elm_lang$core$Dict$removeMax = F5( + function (c, k, v, l, r) { + var _p28 = r; + if (_p28.ctor === 'RBEmpty_elm_builtin') { + return A3(_elm_lang$core$Dict$rem, c, l, r); + } else { + return A5( + _elm_lang$core$Dict$bubble, + c, + k, + v, + l, + A5(_elm_lang$core$Dict$removeMax, _p28._0, _p28._1, _p28._2, _p28._3, _p28._4)); + } + }); +var _elm_lang$core$Dict$rem = F3( + function (color, left, right) { + var _p29 = {ctor: '_Tuple2', _0: left, _1: right}; + if (_p29._0.ctor === 'RBEmpty_elm_builtin') { + if (_p29._1.ctor === 'RBEmpty_elm_builtin') { + var _p30 = color; + switch (_p30.ctor) { + case 'Red': + return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); + case 'Black': + return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBBlack); + default: + return _elm_lang$core$Native_Debug.crash('cannot have bblack or nblack nodes at this point'); + } + } else { + var _p33 = _p29._1._0; + var _p32 = _p29._0._0; + var _p31 = {ctor: '_Tuple3', _0: color, _1: _p32, _2: _p33}; + if ((((_p31.ctor === '_Tuple3') && (_p31._0.ctor === 'Black')) && (_p31._1.ctor === 'LBlack')) && (_p31._2.ctor === 'Red')) { + return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._1._1, _p29._1._2, _p29._1._3, _p29._1._4); + } else { + return A4( + _elm_lang$core$Dict$reportRemBug, + 'Black/LBlack/Red', + color, + _elm_lang$core$Basics$toString(_p32), + _elm_lang$core$Basics$toString(_p33)); + } + } + } else { + if (_p29._1.ctor === 'RBEmpty_elm_builtin') { + var _p36 = _p29._1._0; + var _p35 = _p29._0._0; + var _p34 = {ctor: '_Tuple3', _0: color, _1: _p35, _2: _p36}; + if ((((_p34.ctor === '_Tuple3') && (_p34._0.ctor === 'Black')) && (_p34._1.ctor === 'Red')) && (_p34._2.ctor === 'LBlack')) { + return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._0._1, _p29._0._2, _p29._0._3, _p29._0._4); + } else { + return A4( + _elm_lang$core$Dict$reportRemBug, + 'Black/Red/LBlack', + color, + _elm_lang$core$Basics$toString(_p35), + _elm_lang$core$Basics$toString(_p36)); + } + } else { + var _p40 = _p29._0._2; + var _p39 = _p29._0._4; + var _p38 = _p29._0._1; + var newLeft = A5(_elm_lang$core$Dict$removeMax, _p29._0._0, _p38, _p40, _p29._0._3, _p39); + var _p37 = A3(_elm_lang$core$Dict$maxWithDefault, _p38, _p40, _p39); + var k = _p37._0; + var v = _p37._1; + return A5(_elm_lang$core$Dict$bubble, color, k, v, newLeft, right); + } + } + }); +var _elm_lang$core$Dict$map = F2( + function (f, dict) { + var _p41 = dict; + if (_p41.ctor === 'RBEmpty_elm_builtin') { + return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); + } else { + var _p42 = _p41._1; + return A5( + _elm_lang$core$Dict$RBNode_elm_builtin, + _p41._0, + _p42, + A2(f, _p42, _p41._2), + A2(_elm_lang$core$Dict$map, f, _p41._3), + A2(_elm_lang$core$Dict$map, f, _p41._4)); + } + }); +var _elm_lang$core$Dict$Same = {ctor: 'Same'}; +var _elm_lang$core$Dict$Remove = {ctor: 'Remove'}; +var _elm_lang$core$Dict$Insert = {ctor: 'Insert'}; +var _elm_lang$core$Dict$update = F3( + function (k, alter, dict) { + var up = function (dict) { + var _p43 = dict; + if (_p43.ctor === 'RBEmpty_elm_builtin') { + var _p44 = alter(_elm_lang$core$Maybe$Nothing); + if (_p44.ctor === 'Nothing') { + return {ctor: '_Tuple2', _0: _elm_lang$core$Dict$Same, _1: _elm_lang$core$Dict$empty}; + } else { + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$Insert, + _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, k, _p44._0, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty) + }; + } + } else { + var _p55 = _p43._2; + var _p54 = _p43._4; + var _p53 = _p43._3; + var _p52 = _p43._1; + var _p51 = _p43._0; + var _p45 = A2(_elm_lang$core$Basics$compare, k, _p52); + switch (_p45.ctor) { + case 'EQ': + var _p46 = alter( + _elm_lang$core$Maybe$Just(_p55)); + if (_p46.ctor === 'Nothing') { + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$Remove, + _1: A3(_elm_lang$core$Dict$rem, _p51, _p53, _p54) + }; + } else { + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$Same, + _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p46._0, _p53, _p54) + }; + } + case 'LT': + var _p47 = up(_p53); + var flag = _p47._0; + var newLeft = _p47._1; + var _p48 = flag; + switch (_p48.ctor) { + case 'Same': + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$Same, + _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, newLeft, _p54) + }; + case 'Insert': + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$Insert, + _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, newLeft, _p54) + }; + default: + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$Remove, + _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, newLeft, _p54) + }; + } + default: + var _p49 = up(_p54); + var flag = _p49._0; + var newRight = _p49._1; + var _p50 = flag; + switch (_p50.ctor) { + case 'Same': + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$Same, + _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, _p53, newRight) + }; + case 'Insert': + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$Insert, + _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, _p53, newRight) + }; + default: + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Dict$Remove, + _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, _p53, newRight) + }; + } + } + } + }; + var _p56 = up(dict); + var flag = _p56._0; + var updatedDict = _p56._1; + var _p57 = flag; + switch (_p57.ctor) { + case 'Same': + return updatedDict; + case 'Insert': + return _elm_lang$core$Dict$ensureBlackRoot(updatedDict); + default: + return _elm_lang$core$Dict$blacken(updatedDict); + } + }); +var _elm_lang$core$Dict$insert = F3( + function (key, value, dict) { + return A3( + _elm_lang$core$Dict$update, + key, + _elm_lang$core$Basics$always( + _elm_lang$core$Maybe$Just(value)), + dict); + }); +var _elm_lang$core$Dict$singleton = F2( + function (key, value) { + return A3(_elm_lang$core$Dict$insert, key, value, _elm_lang$core$Dict$empty); + }); +var _elm_lang$core$Dict$union = F2( + function (t1, t2) { + return A3(_elm_lang$core$Dict$foldl, _elm_lang$core$Dict$insert, t2, t1); + }); +var _elm_lang$core$Dict$filter = F2( + function (predicate, dictionary) { + var add = F3( + function (key, value, dict) { + return A2(predicate, key, value) ? A3(_elm_lang$core$Dict$insert, key, value, dict) : dict; + }); + return A3(_elm_lang$core$Dict$foldl, add, _elm_lang$core$Dict$empty, dictionary); + }); +var _elm_lang$core$Dict$intersect = F2( + function (t1, t2) { + return A2( + _elm_lang$core$Dict$filter, + F2( + function (k, _p58) { + return A2(_elm_lang$core$Dict$member, k, t2); + }), + t1); + }); +var _elm_lang$core$Dict$partition = F2( + function (predicate, dict) { + var add = F3( + function (key, value, _p59) { + var _p60 = _p59; + var _p62 = _p60._1; + var _p61 = _p60._0; + return A2(predicate, key, value) ? { + ctor: '_Tuple2', + _0: A3(_elm_lang$core$Dict$insert, key, value, _p61), + _1: _p62 + } : { + ctor: '_Tuple2', + _0: _p61, + _1: A3(_elm_lang$core$Dict$insert, key, value, _p62) + }; + }); + return A3( + _elm_lang$core$Dict$foldl, + add, + {ctor: '_Tuple2', _0: _elm_lang$core$Dict$empty, _1: _elm_lang$core$Dict$empty}, + dict); + }); +var _elm_lang$core$Dict$fromList = function (assocs) { + return A3( + _elm_lang$core$List$foldl, + F2( + function (_p63, dict) { + var _p64 = _p63; + return A3(_elm_lang$core$Dict$insert, _p64._0, _p64._1, dict); + }), + _elm_lang$core$Dict$empty, + assocs); +}; +var _elm_lang$core$Dict$remove = F2( + function (key, dict) { + return A3( + _elm_lang$core$Dict$update, + key, + _elm_lang$core$Basics$always(_elm_lang$core$Maybe$Nothing), + dict); + }); +var _elm_lang$core$Dict$diff = F2( + function (t1, t2) { + return A3( + _elm_lang$core$Dict$foldl, + F3( + function (k, v, t) { + return A2(_elm_lang$core$Dict$remove, k, t); + }), + t1, + t2); + }); + +//import Maybe, Native.Array, Native.List, Native.Utils, Result // + +var _elm_lang$core$Native_Json = function() { + + +// CORE DECODERS + +function succeed(msg) +{ + return { + ctor: '', + tag: 'succeed', + msg: msg + }; +} + +function fail(msg) +{ + return { + ctor: '', + tag: 'fail', + msg: msg + }; +} + +function decodePrimitive(tag) +{ + return { + ctor: '', + tag: tag + }; +} + +function decodeContainer(tag, decoder) +{ + return { + ctor: '', + tag: tag, + decoder: decoder + }; +} + +function decodeNull(value) +{ + return { + ctor: '', + tag: 'null', + value: value + }; +} + +function decodeField(field, decoder) +{ + return { + ctor: '', + tag: 'field', + field: field, + decoder: decoder + }; +} + +function decodeIndex(index, decoder) +{ + return { + ctor: '', + tag: 'index', + index: index, + decoder: decoder + }; +} + +function decodeKeyValuePairs(decoder) +{ + return { + ctor: '', + tag: 'key-value', + decoder: decoder + }; +} + +function mapMany(f, decoders) +{ + return { + ctor: '', + tag: 'map-many', + func: f, + decoders: decoders + }; +} + +function andThen(callback, decoder) +{ + return { + ctor: '', + tag: 'andThen', + decoder: decoder, + callback: callback + }; +} + +function oneOf(decoders) +{ + return { + ctor: '', + tag: 'oneOf', + decoders: decoders + }; +} + + +// DECODING OBJECTS + +function map1(f, d1) +{ + return mapMany(f, [d1]); +} + +function map2(f, d1, d2) +{ + return mapMany(f, [d1, d2]); +} + +function map3(f, d1, d2, d3) +{ + return mapMany(f, [d1, d2, d3]); +} + +function map4(f, d1, d2, d3, d4) +{ + return mapMany(f, [d1, d2, d3, d4]); +} + +function map5(f, d1, d2, d3, d4, d5) +{ + return mapMany(f, [d1, d2, d3, d4, d5]); +} + +function map6(f, d1, d2, d3, d4, d5, d6) +{ + return mapMany(f, [d1, d2, d3, d4, d5, d6]); +} + +function map7(f, d1, d2, d3, d4, d5, d6, d7) +{ + return mapMany(f, [d1, d2, d3, d4, d5, d6, d7]); +} + +function map8(f, d1, d2, d3, d4, d5, d6, d7, d8) +{ + return mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]); +} + + +// DECODE HELPERS + +function ok(value) +{ + return { tag: 'ok', value: value }; +} + +function badPrimitive(type, value) +{ + return { tag: 'primitive', type: type, value: value }; +} + +function badIndex(index, nestedProblems) +{ + return { tag: 'index', index: index, rest: nestedProblems }; +} + +function badField(field, nestedProblems) +{ + return { tag: 'field', field: field, rest: nestedProblems }; +} + +function badIndex(index, nestedProblems) +{ + return { tag: 'index', index: index, rest: nestedProblems }; +} + +function badOneOf(problems) +{ + return { tag: 'oneOf', problems: problems }; +} + +function bad(msg) +{ + return { tag: 'fail', msg: msg }; +} + +function badToString(problem) +{ + var context = '_'; + while (problem) + { + switch (problem.tag) + { + case 'primitive': + return 'Expecting ' + problem.type + + (context === '_' ? '' : ' at ' + context) + + ' but instead got: ' + jsToString(problem.value); + + case 'index': + context += '[' + problem.index + ']'; + problem = problem.rest; + break; + + case 'field': + context += '.' + problem.field; + problem = problem.rest; + break; + + case 'oneOf': + var problems = problem.problems; + for (var i = 0; i < problems.length; i++) + { + problems[i] = badToString(problems[i]); + } + return 'I ran into the following problems' + + (context === '_' ? '' : ' at ' + context) + + ':\n\n' + problems.join('\n'); + + case 'fail': + return 'I ran into a `fail` decoder' + + (context === '_' ? '' : ' at ' + context) + + ': ' + problem.msg; + } + } +} + +function jsToString(value) +{ + return value === undefined + ? 'undefined' + : JSON.stringify(value); +} + + +// DECODE + +function runOnString(decoder, string) +{ + var json; + try + { + json = JSON.parse(string); + } + catch (e) + { + return _elm_lang$core$Result$Err('Given an invalid JSON: ' + e.message); + } + return run(decoder, json); +} + +function run(decoder, value) +{ + var result = runHelp(decoder, value); + return (result.tag === 'ok') + ? _elm_lang$core$Result$Ok(result.value) + : _elm_lang$core$Result$Err(badToString(result)); +} + +function runHelp(decoder, value) +{ + switch (decoder.tag) + { + case 'bool': + return (typeof value === 'boolean') + ? ok(value) + : badPrimitive('a Bool', value); + + case 'int': + if (typeof value !== 'number') { + return badPrimitive('an Int', value); + } + + if (-2147483647 < value && value < 2147483647 && (value | 0) === value) { + return ok(value); + } + + if (isFinite(value) && !(value % 1)) { + return ok(value); + } + + return badPrimitive('an Int', value); + + case 'float': + return (typeof value === 'number') + ? ok(value) + : badPrimitive('a Float', value); + + case 'string': + return (typeof value === 'string') + ? ok(value) + : (value instanceof String) + ? ok(value + '') + : badPrimitive('a String', value); + + case 'null': + return (value === null) + ? ok(decoder.value) + : badPrimitive('null', value); + + case 'value': + return ok(value); + + case 'list': + if (!(value instanceof Array)) + { + return badPrimitive('a List', value); + } + + var list = _elm_lang$core$Native_List.Nil; + for (var i = value.length; i--; ) + { + var result = runHelp(decoder.decoder, value[i]); + if (result.tag !== 'ok') + { + return badIndex(i, result) + } + list = _elm_lang$core$Native_List.Cons(result.value, list); + } + return ok(list); + + case 'array': + if (!(value instanceof Array)) + { + return badPrimitive('an Array', value); + } + + var len = value.length; + var array = new Array(len); + for (var i = len; i--; ) + { + var result = runHelp(decoder.decoder, value[i]); + if (result.tag !== 'ok') + { + return badIndex(i, result); + } + array[i] = result.value; + } + return ok(_elm_lang$core$Native_Array.fromJSArray(array)); + + case 'maybe': + var result = runHelp(decoder.decoder, value); + return (result.tag === 'ok') + ? ok(_elm_lang$core$Maybe$Just(result.value)) + : ok(_elm_lang$core$Maybe$Nothing); + + case 'field': + var field = decoder.field; + if (typeof value !== 'object' || value === null || !(field in value)) + { + return badPrimitive('an object with a field named `' + field + '`', value); + } + + var result = runHelp(decoder.decoder, value[field]); + return (result.tag === 'ok') ? result : badField(field, result); + + case 'index': + var index = decoder.index; + if (!(value instanceof Array)) + { + return badPrimitive('an array', value); + } + if (index >= value.length) + { + return badPrimitive('a longer array. Need index ' + index + ' but there are only ' + value.length + ' entries', value); + } + + var result = runHelp(decoder.decoder, value[index]); + return (result.tag === 'ok') ? result : badIndex(index, result); + + case 'key-value': + if (typeof value !== 'object' || value === null || value instanceof Array) + { + return badPrimitive('an object', value); + } + + var keyValuePairs = _elm_lang$core$Native_List.Nil; + for (var key in value) + { + var result = runHelp(decoder.decoder, value[key]); + if (result.tag !== 'ok') + { + return badField(key, result); + } + var pair = _elm_lang$core$Native_Utils.Tuple2(key, result.value); + keyValuePairs = _elm_lang$core$Native_List.Cons(pair, keyValuePairs); + } + return ok(keyValuePairs); + + case 'map-many': + var answer = decoder.func; + var decoders = decoder.decoders; + for (var i = 0; i < decoders.length; i++) + { + var result = runHelp(decoders[i], value); + if (result.tag !== 'ok') + { + return result; + } + answer = answer(result.value); + } + return ok(answer); + + case 'andThen': + var result = runHelp(decoder.decoder, value); + return (result.tag !== 'ok') + ? result + : runHelp(decoder.callback(result.value), value); + + case 'oneOf': + var errors = []; + var temp = decoder.decoders; + while (temp.ctor !== '[]') + { + var result = runHelp(temp._0, value); + + if (result.tag === 'ok') + { + return result; + } + + errors.push(result); + + temp = temp._1; + } + return badOneOf(errors); + + case 'fail': + return bad(decoder.msg); + + case 'succeed': + return ok(decoder.msg); + } +} + + +// EQUALITY + +function equality(a, b) +{ + if (a === b) + { + return true; + } + + if (a.tag !== b.tag) + { + return false; + } + + switch (a.tag) + { + case 'succeed': + case 'fail': + return a.msg === b.msg; + + case 'bool': + case 'int': + case 'float': + case 'string': + case 'value': + return true; + + case 'null': + return a.value === b.value; + + case 'list': + case 'array': + case 'maybe': + case 'key-value': + return equality(a.decoder, b.decoder); + + case 'field': + return a.field === b.field && equality(a.decoder, b.decoder); + + case 'index': + return a.index === b.index && equality(a.decoder, b.decoder); + + case 'map-many': + if (a.func !== b.func) + { + return false; + } + return listEquality(a.decoders, b.decoders); + + case 'andThen': + return a.callback === b.callback && equality(a.decoder, b.decoder); + + case 'oneOf': + return listEquality(a.decoders, b.decoders); + } +} + +function listEquality(aDecoders, bDecoders) +{ + var len = aDecoders.length; + if (len !== bDecoders.length) + { + return false; + } + for (var i = 0; i < len; i++) + { + if (!equality(aDecoders[i], bDecoders[i])) + { + return false; + } + } + return true; +} + + +// ENCODE + +function encode(indentLevel, value) +{ + return JSON.stringify(value, null, indentLevel); +} + +function identity(value) +{ + return value; +} + +function encodeObject(keyValuePairs) +{ + var obj = {}; + while (keyValuePairs.ctor !== '[]') + { + var pair = keyValuePairs._0; + obj[pair._0] = pair._1; + keyValuePairs = keyValuePairs._1; + } + return obj; +} + +return { + encode: F2(encode), + runOnString: F2(runOnString), + run: F2(run), + + decodeNull: decodeNull, + decodePrimitive: decodePrimitive, + decodeContainer: F2(decodeContainer), + + decodeField: F2(decodeField), + decodeIndex: F2(decodeIndex), + + map1: F2(map1), + map2: F3(map2), + map3: F4(map3), + map4: F5(map4), + map5: F6(map5), + map6: F7(map6), + map7: F8(map7), + map8: F9(map8), + decodeKeyValuePairs: decodeKeyValuePairs, + + andThen: F2(andThen), + fail: fail, + succeed: succeed, + oneOf: oneOf, + + identity: identity, + encodeNull: null, + encodeArray: _elm_lang$core$Native_Array.toJSArray, + encodeList: _elm_lang$core$Native_List.toArray, + encodeObject: encodeObject, + + equality: equality +}; + +}(); + +var _elm_lang$core$Json_Encode$list = _elm_lang$core$Native_Json.encodeList; +var _elm_lang$core$Json_Encode$array = _elm_lang$core$Native_Json.encodeArray; +var _elm_lang$core$Json_Encode$object = _elm_lang$core$Native_Json.encodeObject; +var _elm_lang$core$Json_Encode$null = _elm_lang$core$Native_Json.encodeNull; +var _elm_lang$core$Json_Encode$bool = _elm_lang$core$Native_Json.identity; +var _elm_lang$core$Json_Encode$float = _elm_lang$core$Native_Json.identity; +var _elm_lang$core$Json_Encode$int = _elm_lang$core$Native_Json.identity; +var _elm_lang$core$Json_Encode$string = _elm_lang$core$Native_Json.identity; +var _elm_lang$core$Json_Encode$encode = _elm_lang$core$Native_Json.encode; +var _elm_lang$core$Json_Encode$Value = {ctor: 'Value'}; + +var _elm_lang$core$Json_Decode$null = _elm_lang$core$Native_Json.decodeNull; +var _elm_lang$core$Json_Decode$value = _elm_lang$core$Native_Json.decodePrimitive('value'); +var _elm_lang$core$Json_Decode$andThen = _elm_lang$core$Native_Json.andThen; +var _elm_lang$core$Json_Decode$fail = _elm_lang$core$Native_Json.fail; +var _elm_lang$core$Json_Decode$succeed = _elm_lang$core$Native_Json.succeed; +var _elm_lang$core$Json_Decode$lazy = function (thunk) { + return A2( + _elm_lang$core$Json_Decode$andThen, + thunk, + _elm_lang$core$Json_Decode$succeed( + {ctor: '_Tuple0'})); +}; +var _elm_lang$core$Json_Decode$decodeValue = _elm_lang$core$Native_Json.run; +var _elm_lang$core$Json_Decode$decodeString = _elm_lang$core$Native_Json.runOnString; +var _elm_lang$core$Json_Decode$map8 = _elm_lang$core$Native_Json.map8; +var _elm_lang$core$Json_Decode$map7 = _elm_lang$core$Native_Json.map7; +var _elm_lang$core$Json_Decode$map6 = _elm_lang$core$Native_Json.map6; +var _elm_lang$core$Json_Decode$map5 = _elm_lang$core$Native_Json.map5; +var _elm_lang$core$Json_Decode$map4 = _elm_lang$core$Native_Json.map4; +var _elm_lang$core$Json_Decode$map3 = _elm_lang$core$Native_Json.map3; +var _elm_lang$core$Json_Decode$map2 = _elm_lang$core$Native_Json.map2; +var _elm_lang$core$Json_Decode$map = _elm_lang$core$Native_Json.map1; +var _elm_lang$core$Json_Decode$oneOf = _elm_lang$core$Native_Json.oneOf; +var _elm_lang$core$Json_Decode$maybe = function (decoder) { + return A2(_elm_lang$core$Native_Json.decodeContainer, 'maybe', decoder); +}; +var _elm_lang$core$Json_Decode$index = _elm_lang$core$Native_Json.decodeIndex; +var _elm_lang$core$Json_Decode$field = _elm_lang$core$Native_Json.decodeField; +var _elm_lang$core$Json_Decode$at = F2( + function (fields, decoder) { + return A3(_elm_lang$core$List$foldr, _elm_lang$core$Json_Decode$field, decoder, fields); + }); +var _elm_lang$core$Json_Decode$keyValuePairs = _elm_lang$core$Native_Json.decodeKeyValuePairs; +var _elm_lang$core$Json_Decode$dict = function (decoder) { + return A2( + _elm_lang$core$Json_Decode$map, + _elm_lang$core$Dict$fromList, + _elm_lang$core$Json_Decode$keyValuePairs(decoder)); +}; +var _elm_lang$core$Json_Decode$array = function (decoder) { + return A2(_elm_lang$core$Native_Json.decodeContainer, 'array', decoder); +}; +var _elm_lang$core$Json_Decode$list = function (decoder) { + return A2(_elm_lang$core$Native_Json.decodeContainer, 'list', decoder); +}; +var _elm_lang$core$Json_Decode$nullable = function (decoder) { + return _elm_lang$core$Json_Decode$oneOf( + { + ctor: '::', + _0: _elm_lang$core$Json_Decode$null(_elm_lang$core$Maybe$Nothing), + _1: { + ctor: '::', + _0: A2(_elm_lang$core$Json_Decode$map, _elm_lang$core$Maybe$Just, decoder), + _1: {ctor: '[]'} + } + }); +}; +var _elm_lang$core$Json_Decode$float = _elm_lang$core$Native_Json.decodePrimitive('float'); +var _elm_lang$core$Json_Decode$int = _elm_lang$core$Native_Json.decodePrimitive('int'); +var _elm_lang$core$Json_Decode$bool = _elm_lang$core$Native_Json.decodePrimitive('bool'); +var _elm_lang$core$Json_Decode$string = _elm_lang$core$Native_Json.decodePrimitive('string'); +var _elm_lang$core$Json_Decode$Decoder = {ctor: 'Decoder'}; + +var _elm_lang$core$Debug$crash = _elm_lang$core$Native_Debug.crash; +var _elm_lang$core$Debug$log = _elm_lang$core$Native_Debug.log; + +var _elm_lang$core$Tuple$mapSecond = F2( + function (func, _p0) { + var _p1 = _p0; + return { + ctor: '_Tuple2', + _0: _p1._0, + _1: func(_p1._1) + }; + }); +var _elm_lang$core$Tuple$mapFirst = F2( + function (func, _p2) { + var _p3 = _p2; + return { + ctor: '_Tuple2', + _0: func(_p3._0), + _1: _p3._1 + }; + }); +var _elm_lang$core$Tuple$second = function (_p4) { + var _p5 = _p4; + return _p5._1; +}; +var _elm_lang$core$Tuple$first = function (_p6) { + var _p7 = _p6; + return _p7._0; +}; + +//import // + +var _elm_lang$core$Native_Platform = function() { + + +// PROGRAMS + +function program(impl) +{ + return function(flagDecoder) + { + return function(object, moduleName) + { + object['worker'] = function worker(flags) + { + if (typeof flags !== 'undefined') + { + throw new Error( + 'The `' + moduleName + '` module does not need flags.\n' + + 'Call ' + moduleName + '.worker() with no arguments and you should be all set!' + ); + } + + return initialize( + impl.init, + impl.update, + impl.subscriptions, + renderer + ); + }; + }; + }; +} + +function programWithFlags(impl) +{ + return function(flagDecoder) + { + return function(object, moduleName) + { + object['worker'] = function worker(flags) + { + if (typeof flagDecoder === 'undefined') + { + throw new Error( + 'Are you trying to sneak a Never value into Elm? Trickster!\n' + + 'It looks like ' + moduleName + '.main is defined with `programWithFlags` but has type `Program Never`.\n' + + 'Use `program` instead if you do not want flags.' + ); + } + + var result = A2(_elm_lang$core$Native_Json.run, flagDecoder, flags); + if (result.ctor === 'Err') + { + throw new Error( + moduleName + '.worker(...) was called with an unexpected argument.\n' + + 'I tried to convert it to an Elm value, but ran into this problem:\n\n' + + result._0 + ); + } + + return initialize( + impl.init(result._0), + impl.update, + impl.subscriptions, + renderer + ); + }; + }; + }; +} + +function renderer(enqueue, _) +{ + return function(_) {}; +} + + +// HTML TO PROGRAM + +function htmlToProgram(vnode) +{ + var emptyBag = batch(_elm_lang$core$Native_List.Nil); + var noChange = _elm_lang$core$Native_Utils.Tuple2( + _elm_lang$core$Native_Utils.Tuple0, + emptyBag + ); + + return _elm_lang$virtual_dom$VirtualDom$program({ + init: noChange, + view: function(model) { return main; }, + update: F2(function(msg, model) { return noChange; }), + subscriptions: function (model) { return emptyBag; } + }); +} + + +// INITIALIZE A PROGRAM + +function initialize(init, update, subscriptions, renderer) +{ + // ambient state + var managers = {}; + var updateView; + + // init and update state in main process + var initApp = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { + var model = init._0; + updateView = renderer(enqueue, model); + var cmds = init._1; + var subs = subscriptions(model); + dispatchEffects(managers, cmds, subs); + callback(_elm_lang$core$Native_Scheduler.succeed(model)); + }); + + function onMessage(msg, model) + { + return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { + var results = A2(update, msg, model); + model = results._0; + updateView(model); + var cmds = results._1; + var subs = subscriptions(model); + dispatchEffects(managers, cmds, subs); + callback(_elm_lang$core$Native_Scheduler.succeed(model)); + }); + } + + var mainProcess = spawnLoop(initApp, onMessage); + + function enqueue(msg) + { + _elm_lang$core$Native_Scheduler.rawSend(mainProcess, msg); + } + + var ports = setupEffects(managers, enqueue); + + return ports ? { ports: ports } : {}; +} + + +// EFFECT MANAGERS + +var effectManagers = {}; + +function setupEffects(managers, callback) +{ + var ports; + + // setup all necessary effect managers + for (var key in effectManagers) + { + var manager = effectManagers[key]; + + if (manager.isForeign) + { + ports = ports || {}; + ports[key] = manager.tag === 'cmd' + ? setupOutgoingPort(key) + : setupIncomingPort(key, callback); + } + + managers[key] = makeManager(manager, callback); + } + + return ports; +} + +function makeManager(info, callback) +{ + var router = { + main: callback, + self: undefined + }; + + var tag = info.tag; + var onEffects = info.onEffects; + var onSelfMsg = info.onSelfMsg; + + function onMessage(msg, state) + { + if (msg.ctor === 'self') + { + return A3(onSelfMsg, router, msg._0, state); + } + + var fx = msg._0; + switch (tag) + { + case 'cmd': + return A3(onEffects, router, fx.cmds, state); + + case 'sub': + return A3(onEffects, router, fx.subs, state); + + case 'fx': + return A4(onEffects, router, fx.cmds, fx.subs, state); + } + } + + var process = spawnLoop(info.init, onMessage); + router.self = process; + return process; +} + +function sendToApp(router, msg) +{ + return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) + { + router.main(msg); + callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0)); + }); +} + +function sendToSelf(router, msg) +{ + return A2(_elm_lang$core$Native_Scheduler.send, router.self, { + ctor: 'self', + _0: msg + }); +} + + +// HELPER for STATEFUL LOOPS + +function spawnLoop(init, onMessage) +{ + var andThen = _elm_lang$core$Native_Scheduler.andThen; + + function loop(state) + { + var handleMsg = _elm_lang$core$Native_Scheduler.receive(function(msg) { + return onMessage(msg, state); + }); + return A2(andThen, loop, handleMsg); + } + + var task = A2(andThen, loop, init); + + return _elm_lang$core$Native_Scheduler.rawSpawn(task); +} + + +// BAGS + +function leaf(home) +{ + return function(value) + { + return { + type: 'leaf', + home: home, + value: value + }; + }; +} + +function batch(list) +{ + return { + type: 'node', + branches: list + }; +} + +function map(tagger, bag) +{ + return { + type: 'map', + tagger: tagger, + tree: bag + } +} + + +// PIPE BAGS INTO EFFECT MANAGERS + +function dispatchEffects(managers, cmdBag, subBag) +{ + var effectsDict = {}; + gatherEffects(true, cmdBag, effectsDict, null); + gatherEffects(false, subBag, effectsDict, null); + + for (var home in managers) + { + var fx = home in effectsDict + ? effectsDict[home] + : { + cmds: _elm_lang$core$Native_List.Nil, + subs: _elm_lang$core$Native_List.Nil + }; + + _elm_lang$core$Native_Scheduler.rawSend(managers[home], { ctor: 'fx', _0: fx }); + } +} + +function gatherEffects(isCmd, bag, effectsDict, taggers) +{ + switch (bag.type) + { + case 'leaf': + var home = bag.home; + var effect = toEffect(isCmd, home, taggers, bag.value); + effectsDict[home] = insert(isCmd, effect, effectsDict[home]); + return; + + case 'node': + var list = bag.branches; + while (list.ctor !== '[]') + { + gatherEffects(isCmd, list._0, effectsDict, taggers); + list = list._1; + } + return; + + case 'map': + gatherEffects(isCmd, bag.tree, effectsDict, { + tagger: bag.tagger, + rest: taggers + }); + return; + } +} + +function toEffect(isCmd, home, taggers, value) +{ + function applyTaggers(x) + { + var temp = taggers; + while (temp) + { + x = temp.tagger(x); + temp = temp.rest; + } + return x; + } + + var map = isCmd + ? effectManagers[home].cmdMap + : effectManagers[home].subMap; + + return A2(map, applyTaggers, value) +} + +function insert(isCmd, newEffect, effects) +{ + effects = effects || { + cmds: _elm_lang$core$Native_List.Nil, + subs: _elm_lang$core$Native_List.Nil + }; + if (isCmd) + { + effects.cmds = _elm_lang$core$Native_List.Cons(newEffect, effects.cmds); + return effects; + } + effects.subs = _elm_lang$core$Native_List.Cons(newEffect, effects.subs); + return effects; +} + + +// PORTS + +function checkPortName(name) +{ + if (name in effectManagers) + { + throw new Error('There can only be one port named `' + name + '`, but your program has multiple.'); + } +} + + +// OUTGOING PORTS + +function outgoingPort(name, converter) +{ + checkPortName(name); + effectManagers[name] = { + tag: 'cmd', + cmdMap: outgoingPortMap, + converter: converter, + isForeign: true + }; + return leaf(name); +} + +var outgoingPortMap = F2(function cmdMap(tagger, value) { + return value; +}); + +function setupOutgoingPort(name) +{ + var subs = []; + var converter = effectManagers[name].converter; + + // CREATE MANAGER + + var init = _elm_lang$core$Native_Scheduler.succeed(null); + + function onEffects(router, cmdList, state) + { + while (cmdList.ctor !== '[]') + { + // grab a separate reference to subs in case unsubscribe is called + var currentSubs = subs; + var value = converter(cmdList._0); + for (var i = 0; i < currentSubs.length; i++) + { + currentSubs[i](value); + } + cmdList = cmdList._1; + } + return init; + } + + effectManagers[name].init = init; + effectManagers[name].onEffects = F3(onEffects); + + // PUBLIC API + + function subscribe(callback) + { + subs.push(callback); + } + + function unsubscribe(callback) + { + // copy subs into a new array in case unsubscribe is called within a + // subscribed callback + subs = subs.slice(); + var index = subs.indexOf(callback); + if (index >= 0) + { + subs.splice(index, 1); + } + } + + return { + subscribe: subscribe, + unsubscribe: unsubscribe + }; +} + + +// INCOMING PORTS + +function incomingPort(name, converter) +{ + checkPortName(name); + effectManagers[name] = { + tag: 'sub', + subMap: incomingPortMap, + converter: converter, + isForeign: true + }; + return leaf(name); +} + +var incomingPortMap = F2(function subMap(tagger, finalTagger) +{ + return function(value) + { + return tagger(finalTagger(value)); + }; +}); + +function setupIncomingPort(name, callback) +{ + var sentBeforeInit = []; + var subs = _elm_lang$core$Native_List.Nil; + var converter = effectManagers[name].converter; + var currentOnEffects = preInitOnEffects; + var currentSend = preInitSend; + + // CREATE MANAGER + + var init = _elm_lang$core$Native_Scheduler.succeed(null); + + function preInitOnEffects(router, subList, state) + { + var postInitResult = postInitOnEffects(router, subList, state); + + for(var i = 0; i < sentBeforeInit.length; i++) + { + postInitSend(sentBeforeInit[i]); + } + + sentBeforeInit = null; // to release objects held in queue + currentSend = postInitSend; + currentOnEffects = postInitOnEffects; + return postInitResult; + } + + function postInitOnEffects(router, subList, state) + { + subs = subList; + return init; + } + + function onEffects(router, subList, state) + { + return currentOnEffects(router, subList, state); + } + + effectManagers[name].init = init; + effectManagers[name].onEffects = F3(onEffects); + + // PUBLIC API + + function preInitSend(value) + { + sentBeforeInit.push(value); + } + + function postInitSend(value) + { + var temp = subs; + while (temp.ctor !== '[]') + { + callback(temp._0(value)); + temp = temp._1; + } + } + + function send(incomingValue) + { + var result = A2(_elm_lang$core$Json_Decode$decodeValue, converter, incomingValue); + if (result.ctor === 'Err') + { + throw new Error('Trying to send an unexpected type of value through port `' + name + '`:\n' + result._0); + } + + currentSend(result._0); + } + + return { send: send }; +} + +return { + // routers + sendToApp: F2(sendToApp), + sendToSelf: F2(sendToSelf), + + // global setup + effectManagers: effectManagers, + outgoingPort: outgoingPort, + incomingPort: incomingPort, + + htmlToProgram: htmlToProgram, + program: program, + programWithFlags: programWithFlags, + initialize: initialize, + + // effect bags + leaf: leaf, + batch: batch, + map: F2(map) +}; + +}(); + +//import Native.Utils // + +var _elm_lang$core$Native_Scheduler = function() { + +var MAX_STEPS = 10000; + + +// TASKS + +function succeed(value) +{ + return { + ctor: '_Task_succeed', + value: value + }; +} + +function fail(error) +{ + return { + ctor: '_Task_fail', + value: error + }; +} + +function nativeBinding(callback) +{ + return { + ctor: '_Task_nativeBinding', + callback: callback, + cancel: null + }; +} + +function andThen(callback, task) +{ + return { + ctor: '_Task_andThen', + callback: callback, + task: task + }; +} + +function onError(callback, task) +{ + return { + ctor: '_Task_onError', + callback: callback, + task: task + }; +} + +function receive(callback) +{ + return { + ctor: '_Task_receive', + callback: callback + }; +} + + +// PROCESSES + +function rawSpawn(task) +{ + var process = { + ctor: '_Process', + id: _elm_lang$core$Native_Utils.guid(), + root: task, + stack: null, + mailbox: [] + }; + + enqueue(process); + + return process; +} + +function spawn(task) +{ + return nativeBinding(function(callback) { + var process = rawSpawn(task); + callback(succeed(process)); + }); +} + +function rawSend(process, msg) +{ + process.mailbox.push(msg); + enqueue(process); +} + +function send(process, msg) +{ + return nativeBinding(function(callback) { + rawSend(process, msg); + callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); + }); +} + +function kill(process) +{ + return nativeBinding(function(callback) { + var root = process.root; + if (root.ctor === '_Task_nativeBinding' && root.cancel) + { + root.cancel(); + } + + process.root = null; + + callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); + }); +} + +function sleep(time) +{ + return nativeBinding(function(callback) { + var id = setTimeout(function() { + callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); + }, time); + + return function() { clearTimeout(id); }; + }); +} + + +// STEP PROCESSES + +function step(numSteps, process) +{ + while (numSteps < MAX_STEPS) + { + var ctor = process.root.ctor; + + if (ctor === '_Task_succeed') + { + while (process.stack && process.stack.ctor === '_Task_onError') + { + process.stack = process.stack.rest; + } + if (process.stack === null) + { + break; + } + process.root = process.stack.callback(process.root.value); + process.stack = process.stack.rest; + ++numSteps; + continue; + } + + if (ctor === '_Task_fail') + { + while (process.stack && process.stack.ctor === '_Task_andThen') + { + process.stack = process.stack.rest; + } + if (process.stack === null) + { + break; + } + process.root = process.stack.callback(process.root.value); + process.stack = process.stack.rest; + ++numSteps; + continue; + } + + if (ctor === '_Task_andThen') + { + process.stack = { + ctor: '_Task_andThen', + callback: process.root.callback, + rest: process.stack + }; + process.root = process.root.task; + ++numSteps; + continue; + } + + if (ctor === '_Task_onError') + { + process.stack = { + ctor: '_Task_onError', + callback: process.root.callback, + rest: process.stack + }; + process.root = process.root.task; + ++numSteps; + continue; + } + + if (ctor === '_Task_nativeBinding') + { + process.root.cancel = process.root.callback(function(newRoot) { + process.root = newRoot; + enqueue(process); + }); + + break; + } + + if (ctor === '_Task_receive') + { + var mailbox = process.mailbox; + if (mailbox.length === 0) + { + break; + } + + process.root = process.root.callback(mailbox.shift()); + ++numSteps; + continue; + } + + throw new Error(ctor); + } + + if (numSteps < MAX_STEPS) + { + return numSteps + 1; + } + enqueue(process); + + return numSteps; +} + + +// WORK QUEUE + +var working = false; +var workQueue = []; + +function enqueue(process) +{ + workQueue.push(process); + + if (!working) + { + setTimeout(work, 0); + working = true; + } +} + +function work() +{ + var numSteps = 0; + var process; + while (numSteps < MAX_STEPS && (process = workQueue.shift())) + { + if (process.root) + { + numSteps = step(numSteps, process); + } + } + if (!process) + { + working = false; + return; + } + setTimeout(work, 0); +} + + +return { + succeed: succeed, + fail: fail, + nativeBinding: nativeBinding, + andThen: F2(andThen), + onError: F2(onError), + receive: receive, + + spawn: spawn, + kill: kill, + sleep: sleep, + send: F2(send), + + rawSpawn: rawSpawn, + rawSend: rawSend +}; + +}(); +var _elm_lang$core$Platform_Cmd$batch = _elm_lang$core$Native_Platform.batch; +var _elm_lang$core$Platform_Cmd$none = _elm_lang$core$Platform_Cmd$batch( + {ctor: '[]'}); +var _elm_lang$core$Platform_Cmd_ops = _elm_lang$core$Platform_Cmd_ops || {}; +_elm_lang$core$Platform_Cmd_ops['!'] = F2( + function (model, commands) { + return { + ctor: '_Tuple2', + _0: model, + _1: _elm_lang$core$Platform_Cmd$batch(commands) + }; + }); +var _elm_lang$core$Platform_Cmd$map = _elm_lang$core$Native_Platform.map; +var _elm_lang$core$Platform_Cmd$Cmd = {ctor: 'Cmd'}; + +var _elm_lang$core$Platform_Sub$batch = _elm_lang$core$Native_Platform.batch; +var _elm_lang$core$Platform_Sub$none = _elm_lang$core$Platform_Sub$batch( + {ctor: '[]'}); +var _elm_lang$core$Platform_Sub$map = _elm_lang$core$Native_Platform.map; +var _elm_lang$core$Platform_Sub$Sub = {ctor: 'Sub'}; + +var _elm_lang$core$Platform$hack = _elm_lang$core$Native_Scheduler.succeed; +var _elm_lang$core$Platform$sendToSelf = _elm_lang$core$Native_Platform.sendToSelf; +var _elm_lang$core$Platform$sendToApp = _elm_lang$core$Native_Platform.sendToApp; +var _elm_lang$core$Platform$programWithFlags = _elm_lang$core$Native_Platform.programWithFlags; +var _elm_lang$core$Platform$program = _elm_lang$core$Native_Platform.program; +var _elm_lang$core$Platform$Program = {ctor: 'Program'}; +var _elm_lang$core$Platform$Task = {ctor: 'Task'}; +var _elm_lang$core$Platform$ProcessId = {ctor: 'ProcessId'}; +var _elm_lang$core$Platform$Router = {ctor: 'Router'}; + +var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode = _elm_lang$core$Json_Decode$succeed; +var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$resolve = _elm_lang$core$Json_Decode$andThen(_elm_lang$core$Basics$identity); +var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom = _elm_lang$core$Json_Decode$map2( + F2( + function (x, y) { + return y(x); + })); +var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$hardcoded = function (_p0) { + return _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom( + _elm_lang$core$Json_Decode$succeed(_p0)); +}; +var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalDecoder = F3( + function (pathDecoder, valDecoder, fallback) { + var nullOr = function (decoder) { + return _elm_lang$core$Json_Decode$oneOf( + { + ctor: '::', + _0: decoder, + _1: { + ctor: '::', + _0: _elm_lang$core$Json_Decode$null(fallback), + _1: {ctor: '[]'} + } + }); + }; + var handleResult = function (input) { + var _p1 = A2(_elm_lang$core$Json_Decode$decodeValue, pathDecoder, input); + if (_p1.ctor === 'Ok') { + var _p2 = A2( + _elm_lang$core$Json_Decode$decodeValue, + nullOr(valDecoder), + _p1._0); + if (_p2.ctor === 'Ok') { + return _elm_lang$core$Json_Decode$succeed(_p2._0); + } else { + return _elm_lang$core$Json_Decode$fail(_p2._0); + } + } else { + return _elm_lang$core$Json_Decode$succeed(fallback); + } + }; + return A2(_elm_lang$core$Json_Decode$andThen, handleResult, _elm_lang$core$Json_Decode$value); + }); +var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalAt = F4( + function (path, valDecoder, fallback, decoder) { + return A2( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalDecoder, + A2(_elm_lang$core$Json_Decode$at, path, _elm_lang$core$Json_Decode$value), + valDecoder, + fallback), + decoder); + }); +var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional = F4( + function (key, valDecoder, fallback, decoder) { + return A2( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalDecoder, + A2(_elm_lang$core$Json_Decode$field, key, _elm_lang$core$Json_Decode$value), + valDecoder, + fallback), + decoder); + }); +var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$requiredAt = F3( + function (path, valDecoder, decoder) { + return A2( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom, + A2(_elm_lang$core$Json_Decode$at, path, valDecoder), + decoder); + }); +var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required = F3( + function (key, valDecoder, decoder) { + return A2( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom, + A2(_elm_lang$core$Json_Decode$field, key, valDecoder), + decoder); + }); + +var _elm_lang$core$Task$onError = _elm_lang$core$Native_Scheduler.onError; +var _elm_lang$core$Task$andThen = _elm_lang$core$Native_Scheduler.andThen; +var _elm_lang$core$Task$spawnCmd = F2( + function (router, _p0) { + var _p1 = _p0; + return _elm_lang$core$Native_Scheduler.spawn( + A2( + _elm_lang$core$Task$andThen, + _elm_lang$core$Platform$sendToApp(router), + _p1._0)); + }); +var _elm_lang$core$Task$fail = _elm_lang$core$Native_Scheduler.fail; +var _elm_lang$core$Task$mapError = F2( + function (convert, task) { + return A2( + _elm_lang$core$Task$onError, + function (_p2) { + return _elm_lang$core$Task$fail( + convert(_p2)); + }, + task); + }); +var _elm_lang$core$Task$succeed = _elm_lang$core$Native_Scheduler.succeed; +var _elm_lang$core$Task$map = F2( + function (func, taskA) { + return A2( + _elm_lang$core$Task$andThen, + function (a) { + return _elm_lang$core$Task$succeed( + func(a)); + }, + taskA); + }); +var _elm_lang$core$Task$map2 = F3( + function (func, taskA, taskB) { + return A2( + _elm_lang$core$Task$andThen, + function (a) { + return A2( + _elm_lang$core$Task$andThen, + function (b) { + return _elm_lang$core$Task$succeed( + A2(func, a, b)); + }, + taskB); + }, + taskA); + }); +var _elm_lang$core$Task$map3 = F4( + function (func, taskA, taskB, taskC) { + return A2( + _elm_lang$core$Task$andThen, + function (a) { + return A2( + _elm_lang$core$Task$andThen, + function (b) { + return A2( + _elm_lang$core$Task$andThen, + function (c) { + return _elm_lang$core$Task$succeed( + A3(func, a, b, c)); + }, + taskC); + }, + taskB); + }, + taskA); + }); +var _elm_lang$core$Task$map4 = F5( + function (func, taskA, taskB, taskC, taskD) { + return A2( + _elm_lang$core$Task$andThen, + function (a) { + return A2( + _elm_lang$core$Task$andThen, + function (b) { + return A2( + _elm_lang$core$Task$andThen, + function (c) { + return A2( + _elm_lang$core$Task$andThen, + function (d) { + return _elm_lang$core$Task$succeed( + A4(func, a, b, c, d)); + }, + taskD); + }, + taskC); + }, + taskB); + }, + taskA); + }); +var _elm_lang$core$Task$map5 = F6( + function (func, taskA, taskB, taskC, taskD, taskE) { + return A2( + _elm_lang$core$Task$andThen, + function (a) { + return A2( + _elm_lang$core$Task$andThen, + function (b) { + return A2( + _elm_lang$core$Task$andThen, + function (c) { + return A2( + _elm_lang$core$Task$andThen, + function (d) { + return A2( + _elm_lang$core$Task$andThen, + function (e) { + return _elm_lang$core$Task$succeed( + A5(func, a, b, c, d, e)); + }, + taskE); + }, + taskD); + }, + taskC); + }, + taskB); + }, + taskA); + }); +var _elm_lang$core$Task$sequence = function (tasks) { + var _p3 = tasks; + if (_p3.ctor === '[]') { + return _elm_lang$core$Task$succeed( + {ctor: '[]'}); + } else { + return A3( + _elm_lang$core$Task$map2, + F2( + function (x, y) { + return {ctor: '::', _0: x, _1: y}; + }), + _p3._0, + _elm_lang$core$Task$sequence(_p3._1)); + } +}; +var _elm_lang$core$Task$onEffects = F3( + function (router, commands, state) { + return A2( + _elm_lang$core$Task$map, + function (_p4) { + return {ctor: '_Tuple0'}; + }, + _elm_lang$core$Task$sequence( + A2( + _elm_lang$core$List$map, + _elm_lang$core$Task$spawnCmd(router), + commands))); + }); +var _elm_lang$core$Task$init = _elm_lang$core$Task$succeed( + {ctor: '_Tuple0'}); +var _elm_lang$core$Task$onSelfMsg = F3( + function (_p7, _p6, _p5) { + return _elm_lang$core$Task$succeed( + {ctor: '_Tuple0'}); + }); +var _elm_lang$core$Task$command = _elm_lang$core$Native_Platform.leaf('Task'); +var _elm_lang$core$Task$Perform = function (a) { + return {ctor: 'Perform', _0: a}; +}; +var _elm_lang$core$Task$perform = F2( + function (toMessage, task) { + return _elm_lang$core$Task$command( + _elm_lang$core$Task$Perform( + A2(_elm_lang$core$Task$map, toMessage, task))); + }); +var _elm_lang$core$Task$attempt = F2( + function (resultToMessage, task) { + return _elm_lang$core$Task$command( + _elm_lang$core$Task$Perform( + A2( + _elm_lang$core$Task$onError, + function (_p8) { + return _elm_lang$core$Task$succeed( + resultToMessage( + _elm_lang$core$Result$Err(_p8))); + }, + A2( + _elm_lang$core$Task$andThen, + function (_p9) { + return _elm_lang$core$Task$succeed( + resultToMessage( + _elm_lang$core$Result$Ok(_p9))); + }, + task)))); + }); +var _elm_lang$core$Task$cmdMap = F2( + function (tagger, _p10) { + var _p11 = _p10; + return _elm_lang$core$Task$Perform( + A2(_elm_lang$core$Task$map, tagger, _p11._0)); + }); +_elm_lang$core$Native_Platform.effectManagers['Task'] = {pkg: 'elm-lang/core', init: _elm_lang$core$Task$init, onEffects: _elm_lang$core$Task$onEffects, onSelfMsg: _elm_lang$core$Task$onSelfMsg, tag: 'cmd', cmdMap: _elm_lang$core$Task$cmdMap}; + +//import Native.Scheduler // + +var _elm_lang$core$Native_Time = function() { + +var now = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) +{ + callback(_elm_lang$core$Native_Scheduler.succeed(Date.now())); +}); + +function setInterval_(interval, task) +{ + return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) + { + var id = setInterval(function() { + _elm_lang$core$Native_Scheduler.rawSpawn(task); + }, interval); + + return function() { clearInterval(id); }; + }); +} + +return { + now: now, + setInterval_: F2(setInterval_) +}; + +}(); +var _elm_lang$core$Time$setInterval = _elm_lang$core$Native_Time.setInterval_; +var _elm_lang$core$Time$spawnHelp = F3( + function (router, intervals, processes) { + var _p0 = intervals; + if (_p0.ctor === '[]') { + return _elm_lang$core$Task$succeed(processes); + } else { + var _p1 = _p0._0; + var spawnRest = function (id) { + return A3( + _elm_lang$core$Time$spawnHelp, + router, + _p0._1, + A3(_elm_lang$core$Dict$insert, _p1, id, processes)); + }; + var spawnTimer = _elm_lang$core$Native_Scheduler.spawn( + A2( + _elm_lang$core$Time$setInterval, + _p1, + A2(_elm_lang$core$Platform$sendToSelf, router, _p1))); + return A2(_elm_lang$core$Task$andThen, spawnRest, spawnTimer); + } + }); +var _elm_lang$core$Time$addMySub = F2( + function (_p2, state) { + var _p3 = _p2; + var _p6 = _p3._1; + var _p5 = _p3._0; + var _p4 = A2(_elm_lang$core$Dict$get, _p5, state); + if (_p4.ctor === 'Nothing') { + return A3( + _elm_lang$core$Dict$insert, + _p5, + { + ctor: '::', + _0: _p6, + _1: {ctor: '[]'} + }, + state); + } else { + return A3( + _elm_lang$core$Dict$insert, + _p5, + {ctor: '::', _0: _p6, _1: _p4._0}, + state); + } + }); +var _elm_lang$core$Time$inMilliseconds = function (t) { + return t; +}; +var _elm_lang$core$Time$millisecond = 1; +var _elm_lang$core$Time$second = 1000 * _elm_lang$core$Time$millisecond; +var _elm_lang$core$Time$minute = 60 * _elm_lang$core$Time$second; +var _elm_lang$core$Time$hour = 60 * _elm_lang$core$Time$minute; +var _elm_lang$core$Time$inHours = function (t) { + return t / _elm_lang$core$Time$hour; +}; +var _elm_lang$core$Time$inMinutes = function (t) { + return t / _elm_lang$core$Time$minute; +}; +var _elm_lang$core$Time$inSeconds = function (t) { + return t / _elm_lang$core$Time$second; +}; +var _elm_lang$core$Time$now = _elm_lang$core$Native_Time.now; +var _elm_lang$core$Time$onSelfMsg = F3( + function (router, interval, state) { + var _p7 = A2(_elm_lang$core$Dict$get, interval, state.taggers); + if (_p7.ctor === 'Nothing') { + return _elm_lang$core$Task$succeed(state); + } else { + var tellTaggers = function (time) { + return _elm_lang$core$Task$sequence( + A2( + _elm_lang$core$List$map, + function (tagger) { + return A2( + _elm_lang$core$Platform$sendToApp, + router, + tagger(time)); + }, + _p7._0)); + }; + return A2( + _elm_lang$core$Task$andThen, + function (_p8) { + return _elm_lang$core$Task$succeed(state); + }, + A2(_elm_lang$core$Task$andThen, tellTaggers, _elm_lang$core$Time$now)); + } + }); +var _elm_lang$core$Time$subscription = _elm_lang$core$Native_Platform.leaf('Time'); +var _elm_lang$core$Time$State = F2( + function (a, b) { + return {taggers: a, processes: b}; + }); +var _elm_lang$core$Time$init = _elm_lang$core$Task$succeed( + A2(_elm_lang$core$Time$State, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty)); +var _elm_lang$core$Time$onEffects = F3( + function (router, subs, _p9) { + var _p10 = _p9; + var rightStep = F3( + function (_p12, id, _p11) { + var _p13 = _p11; + return { + ctor: '_Tuple3', + _0: _p13._0, + _1: _p13._1, + _2: A2( + _elm_lang$core$Task$andThen, + function (_p14) { + return _p13._2; + }, + _elm_lang$core$Native_Scheduler.kill(id)) + }; + }); + var bothStep = F4( + function (interval, taggers, id, _p15) { + var _p16 = _p15; + return { + ctor: '_Tuple3', + _0: _p16._0, + _1: A3(_elm_lang$core$Dict$insert, interval, id, _p16._1), + _2: _p16._2 + }; + }); + var leftStep = F3( + function (interval, taggers, _p17) { + var _p18 = _p17; + return { + ctor: '_Tuple3', + _0: {ctor: '::', _0: interval, _1: _p18._0}, + _1: _p18._1, + _2: _p18._2 + }; + }); + var newTaggers = A3(_elm_lang$core$List$foldl, _elm_lang$core$Time$addMySub, _elm_lang$core$Dict$empty, subs); + var _p19 = A6( + _elm_lang$core$Dict$merge, + leftStep, + bothStep, + rightStep, + newTaggers, + _p10.processes, + { + ctor: '_Tuple3', + _0: {ctor: '[]'}, + _1: _elm_lang$core$Dict$empty, + _2: _elm_lang$core$Task$succeed( + {ctor: '_Tuple0'}) + }); + var spawnList = _p19._0; + var existingDict = _p19._1; + var killTask = _p19._2; + return A2( + _elm_lang$core$Task$andThen, + function (newProcesses) { + return _elm_lang$core$Task$succeed( + A2(_elm_lang$core$Time$State, newTaggers, newProcesses)); + }, + A2( + _elm_lang$core$Task$andThen, + function (_p20) { + return A3(_elm_lang$core$Time$spawnHelp, router, spawnList, existingDict); + }, + killTask)); + }); +var _elm_lang$core$Time$Every = F2( + function (a, b) { + return {ctor: 'Every', _0: a, _1: b}; + }); +var _elm_lang$core$Time$every = F2( + function (interval, tagger) { + return _elm_lang$core$Time$subscription( + A2(_elm_lang$core$Time$Every, interval, tagger)); + }); +var _elm_lang$core$Time$subMap = F2( + function (f, _p21) { + var _p22 = _p21; + return A2( + _elm_lang$core$Time$Every, + _p22._0, + function (_p23) { + return f( + _p22._1(_p23)); + }); + }); +_elm_lang$core$Native_Platform.effectManagers['Time'] = {pkg: 'elm-lang/core', init: _elm_lang$core$Time$init, onEffects: _elm_lang$core$Time$onEffects, onSelfMsg: _elm_lang$core$Time$onSelfMsg, tag: 'sub', subMap: _elm_lang$core$Time$subMap}; + +var _elm_lang$core$Process$kill = _elm_lang$core$Native_Scheduler.kill; +var _elm_lang$core$Process$sleep = _elm_lang$core$Native_Scheduler.sleep; +var _elm_lang$core$Process$spawn = _elm_lang$core$Native_Scheduler.spawn; + +var _elm_lang$virtual_dom$VirtualDom_Debug$wrap; +var _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags; + +var _elm_lang$virtual_dom$Native_VirtualDom = function() { + +var STYLE_KEY = 'STYLE'; +var EVENT_KEY = 'EVENT'; +var ATTR_KEY = 'ATTR'; +var ATTR_NS_KEY = 'ATTR_NS'; + +var localDoc = typeof document !== 'undefined' ? document : {}; + + +//////////// VIRTUAL DOM NODES //////////// + + +function text(string) +{ + return { + type: 'text', + text: string + }; +} + + +function node(tag) +{ + return F2(function(factList, kidList) { + return nodeHelp(tag, factList, kidList); + }); +} + + +function nodeHelp(tag, factList, kidList) +{ + var organized = organizeFacts(factList); + var namespace = organized.namespace; + var facts = organized.facts; + + var children = []; + var descendantsCount = 0; + while (kidList.ctor !== '[]') + { + var kid = kidList._0; + descendantsCount += (kid.descendantsCount || 0); + children.push(kid); + kidList = kidList._1; + } + descendantsCount += children.length; + + return { + type: 'node', + tag: tag, + facts: facts, + children: children, + namespace: namespace, + descendantsCount: descendantsCount + }; +} + + +function keyedNode(tag, factList, kidList) +{ + var organized = organizeFacts(factList); + var namespace = organized.namespace; + var facts = organized.facts; + + var children = []; + var descendantsCount = 0; + while (kidList.ctor !== '[]') + { + var kid = kidList._0; + descendantsCount += (kid._1.descendantsCount || 0); + children.push(kid); + kidList = kidList._1; + } + descendantsCount += children.length; + + return { + type: 'keyed-node', + tag: tag, + facts: facts, + children: children, + namespace: namespace, + descendantsCount: descendantsCount + }; +} + + +function custom(factList, model, impl) +{ + var facts = organizeFacts(factList).facts; + + return { + type: 'custom', + facts: facts, + model: model, + impl: impl + }; +} + + +function map(tagger, node) +{ + return { + type: 'tagger', + tagger: tagger, + node: node, + descendantsCount: 1 + (node.descendantsCount || 0) + }; +} + + +function thunk(func, args, thunk) +{ + return { + type: 'thunk', + func: func, + args: args, + thunk: thunk, + node: undefined + }; +} + +function lazy(fn, a) +{ + return thunk(fn, [a], function() { + return fn(a); + }); +} + +function lazy2(fn, a, b) +{ + return thunk(fn, [a,b], function() { + return A2(fn, a, b); + }); +} + +function lazy3(fn, a, b, c) +{ + return thunk(fn, [a,b,c], function() { + return A3(fn, a, b, c); + }); +} + + + +// FACTS + + +function organizeFacts(factList) +{ + var namespace, facts = {}; + + while (factList.ctor !== '[]') + { + var entry = factList._0; + var key = entry.key; + + if (key === ATTR_KEY || key === ATTR_NS_KEY || key === EVENT_KEY) + { + var subFacts = facts[key] || {}; + subFacts[entry.realKey] = entry.value; + facts[key] = subFacts; + } + else if (key === STYLE_KEY) + { + var styles = facts[key] || {}; + var styleList = entry.value; + while (styleList.ctor !== '[]') + { + var style = styleList._0; + styles[style._0] = style._1; + styleList = styleList._1; + } + facts[key] = styles; + } + else if (key === 'namespace') + { + namespace = entry.value; + } + else if (key === 'className') + { + var classes = facts[key]; + facts[key] = typeof classes === 'undefined' + ? entry.value + : classes + ' ' + entry.value; + } + else + { + facts[key] = entry.value; + } + factList = factList._1; + } + + return { + facts: facts, + namespace: namespace + }; +} + + + +//////////// PROPERTIES AND ATTRIBUTES //////////// + + +function style(value) +{ + return { + key: STYLE_KEY, + value: value + }; +} + + +function property(key, value) +{ + return { + key: key, + value: value + }; +} + + +function attribute(key, value) +{ + return { + key: ATTR_KEY, + realKey: key, + value: value + }; +} + + +function attributeNS(namespace, key, value) +{ + return { + key: ATTR_NS_KEY, + realKey: key, + value: { + value: value, + namespace: namespace + } + }; +} + + +function on(name, options, decoder) +{ + return { + key: EVENT_KEY, + realKey: name, + value: { + options: options, + decoder: decoder + } + }; +} + + +function equalEvents(a, b) +{ + if (a.options !== b.options) + { + if (a.options.stopPropagation !== b.options.stopPropagation || a.options.preventDefault !== b.options.preventDefault) + { + return false; + } + } + return _elm_lang$core$Native_Json.equality(a.decoder, b.decoder); +} + + +function mapProperty(func, property) +{ + if (property.key !== EVENT_KEY) + { + return property; + } + return on( + property.realKey, + property.value.options, + A2(_elm_lang$core$Json_Decode$map, func, property.value.decoder) + ); +} + + +//////////// RENDER //////////// + + +function render(vNode, eventNode) +{ + switch (vNode.type) + { + case 'thunk': + if (!vNode.node) + { + vNode.node = vNode.thunk(); + } + return render(vNode.node, eventNode); + + case 'tagger': + var subNode = vNode.node; + var tagger = vNode.tagger; + + while (subNode.type === 'tagger') + { + typeof tagger !== 'object' + ? tagger = [tagger, subNode.tagger] + : tagger.push(subNode.tagger); + + subNode = subNode.node; + } + + var subEventRoot = { tagger: tagger, parent: eventNode }; + var domNode = render(subNode, subEventRoot); + domNode.elm_event_node_ref = subEventRoot; + return domNode; + + case 'text': + return localDoc.createTextNode(vNode.text); + + case 'node': + var domNode = vNode.namespace + ? localDoc.createElementNS(vNode.namespace, vNode.tag) + : localDoc.createElement(vNode.tag); + + applyFacts(domNode, eventNode, vNode.facts); + + var children = vNode.children; + + for (var i = 0; i < children.length; i++) + { + domNode.appendChild(render(children[i], eventNode)); + } + + return domNode; + + case 'keyed-node': + var domNode = vNode.namespace + ? localDoc.createElementNS(vNode.namespace, vNode.tag) + : localDoc.createElement(vNode.tag); + + applyFacts(domNode, eventNode, vNode.facts); + + var children = vNode.children; + + for (var i = 0; i < children.length; i++) + { + domNode.appendChild(render(children[i]._1, eventNode)); + } + + return domNode; + + case 'custom': + var domNode = vNode.impl.render(vNode.model); + applyFacts(domNode, eventNode, vNode.facts); + return domNode; + } +} + + + +//////////// APPLY FACTS //////////// + + +function applyFacts(domNode, eventNode, facts) +{ + for (var key in facts) + { + var value = facts[key]; + + switch (key) + { + case STYLE_KEY: + applyStyles(domNode, value); + break; + + case EVENT_KEY: + applyEvents(domNode, eventNode, value); + break; + + case ATTR_KEY: + applyAttrs(domNode, value); + break; + + case ATTR_NS_KEY: + applyAttrsNS(domNode, value); + break; + + case 'value': + if (domNode[key] !== value) + { + domNode[key] = value; + } + break; + + default: + domNode[key] = value; + break; + } + } +} + +function applyStyles(domNode, styles) +{ + var domNodeStyle = domNode.style; + + for (var key in styles) + { + domNodeStyle[key] = styles[key]; + } +} + +function applyEvents(domNode, eventNode, events) +{ + var allHandlers = domNode.elm_handlers || {}; + + for (var key in events) + { + var handler = allHandlers[key]; + var value = events[key]; + + if (typeof value === 'undefined') + { + domNode.removeEventListener(key, handler); + allHandlers[key] = undefined; + } + else if (typeof handler === 'undefined') + { + var handler = makeEventHandler(eventNode, value); + domNode.addEventListener(key, handler); + allHandlers[key] = handler; + } + else + { + handler.info = value; + } + } + + domNode.elm_handlers = allHandlers; +} + +function makeEventHandler(eventNode, info) +{ + function eventHandler(event) + { + var info = eventHandler.info; + + var value = A2(_elm_lang$core$Native_Json.run, info.decoder, event); + + if (value.ctor === 'Ok') + { + var options = info.options; + if (options.stopPropagation) + { + event.stopPropagation(); + } + if (options.preventDefault) + { + event.preventDefault(); + } + + var message = value._0; + + var currentEventNode = eventNode; + while (currentEventNode) + { + var tagger = currentEventNode.tagger; + if (typeof tagger === 'function') + { + message = tagger(message); + } + else + { + for (var i = tagger.length; i--; ) + { + message = tagger[i](message); + } + } + currentEventNode = currentEventNode.parent; + } + } + }; + + eventHandler.info = info; + + return eventHandler; +} + +function applyAttrs(domNode, attrs) +{ + for (var key in attrs) + { + var value = attrs[key]; + if (typeof value === 'undefined') + { + domNode.removeAttribute(key); + } + else + { + domNode.setAttribute(key, value); + } + } +} + +function applyAttrsNS(domNode, nsAttrs) +{ + for (var key in nsAttrs) + { + var pair = nsAttrs[key]; + var namespace = pair.namespace; + var value = pair.value; + + if (typeof value === 'undefined') + { + domNode.removeAttributeNS(namespace, key); + } + else + { + domNode.setAttributeNS(namespace, key, value); + } + } +} + + + +//////////// DIFF //////////// + + +function diff(a, b) +{ + var patches = []; + diffHelp(a, b, patches, 0); + return patches; +} + + +function makePatch(type, index, data) +{ + return { + index: index, + type: type, + data: data, + domNode: undefined, + eventNode: undefined + }; +} + + +function diffHelp(a, b, patches, index) +{ + if (a === b) + { + return; + } + + var aType = a.type; + var bType = b.type; + + // Bail if you run into different types of nodes. Implies that the + // structure has changed significantly and it's not worth a diff. + if (aType !== bType) + { + patches.push(makePatch('p-redraw', index, b)); + return; + } + + // Now we know that both nodes are the same type. + switch (bType) + { + case 'thunk': + var aArgs = a.args; + var bArgs = b.args; + var i = aArgs.length; + var same = a.func === b.func && i === bArgs.length; + while (same && i--) + { + same = aArgs[i] === bArgs[i]; + } + if (same) + { + b.node = a.node; + return; + } + b.node = b.thunk(); + var subPatches = []; + diffHelp(a.node, b.node, subPatches, 0); + if (subPatches.length > 0) + { + patches.push(makePatch('p-thunk', index, subPatches)); + } + return; + + case 'tagger': + // gather nested taggers + var aTaggers = a.tagger; + var bTaggers = b.tagger; + var nesting = false; + + var aSubNode = a.node; + while (aSubNode.type === 'tagger') + { + nesting = true; + + typeof aTaggers !== 'object' + ? aTaggers = [aTaggers, aSubNode.tagger] + : aTaggers.push(aSubNode.tagger); + + aSubNode = aSubNode.node; + } + + var bSubNode = b.node; + while (bSubNode.type === 'tagger') + { + nesting = true; + + typeof bTaggers !== 'object' + ? bTaggers = [bTaggers, bSubNode.tagger] + : bTaggers.push(bSubNode.tagger); + + bSubNode = bSubNode.node; + } + + // Just bail if different numbers of taggers. This implies the + // structure of the virtual DOM has changed. + if (nesting && aTaggers.length !== bTaggers.length) + { + patches.push(makePatch('p-redraw', index, b)); + return; + } + + // check if taggers are "the same" + if (nesting ? !pairwiseRefEqual(aTaggers, bTaggers) : aTaggers !== bTaggers) + { + patches.push(makePatch('p-tagger', index, bTaggers)); + } + + // diff everything below the taggers + diffHelp(aSubNode, bSubNode, patches, index + 1); + return; + + case 'text': + if (a.text !== b.text) + { + patches.push(makePatch('p-text', index, b.text)); + return; + } + + return; + + case 'node': + // Bail if obvious indicators have changed. Implies more serious + // structural changes such that it's not worth it to diff. + if (a.tag !== b.tag || a.namespace !== b.namespace) + { + patches.push(makePatch('p-redraw', index, b)); + return; + } + + var factsDiff = diffFacts(a.facts, b.facts); + + if (typeof factsDiff !== 'undefined') + { + patches.push(makePatch('p-facts', index, factsDiff)); + } + + diffChildren(a, b, patches, index); + return; + + case 'keyed-node': + // Bail if obvious indicators have changed. Implies more serious + // structural changes such that it's not worth it to diff. + if (a.tag !== b.tag || a.namespace !== b.namespace) + { + patches.push(makePatch('p-redraw', index, b)); + return; + } + + var factsDiff = diffFacts(a.facts, b.facts); + + if (typeof factsDiff !== 'undefined') + { + patches.push(makePatch('p-facts', index, factsDiff)); + } + + diffKeyedChildren(a, b, patches, index); + return; + + case 'custom': + if (a.impl !== b.impl) + { + patches.push(makePatch('p-redraw', index, b)); + return; + } + + var factsDiff = diffFacts(a.facts, b.facts); + if (typeof factsDiff !== 'undefined') + { + patches.push(makePatch('p-facts', index, factsDiff)); + } + + var patch = b.impl.diff(a,b); + if (patch) + { + patches.push(makePatch('p-custom', index, patch)); + return; + } + + return; + } +} + + +// assumes the incoming arrays are the same length +function pairwiseRefEqual(as, bs) +{ + for (var i = 0; i < as.length; i++) + { + if (as[i] !== bs[i]) + { + return false; + } + } + + return true; +} + + +// TODO Instead of creating a new diff object, it's possible to just test if +// there *is* a diff. During the actual patch, do the diff again and make the +// modifications directly. This way, there's no new allocations. Worth it? +function diffFacts(a, b, category) +{ + var diff; + + // look for changes and removals + for (var aKey in a) + { + if (aKey === STYLE_KEY || aKey === EVENT_KEY || aKey === ATTR_KEY || aKey === ATTR_NS_KEY) + { + var subDiff = diffFacts(a[aKey], b[aKey] || {}, aKey); + if (subDiff) + { + diff = diff || {}; + diff[aKey] = subDiff; + } + continue; + } + + // remove if not in the new facts + if (!(aKey in b)) + { + diff = diff || {}; + diff[aKey] = + (typeof category === 'undefined') + ? (typeof a[aKey] === 'string' ? '' : null) + : + (category === STYLE_KEY) + ? '' + : + (category === EVENT_KEY || category === ATTR_KEY) + ? undefined + : + { namespace: a[aKey].namespace, value: undefined }; + + continue; + } + + var aValue = a[aKey]; + var bValue = b[aKey]; + + // reference equal, so don't worry about it + if (aValue === bValue && aKey !== 'value' + || category === EVENT_KEY && equalEvents(aValue, bValue)) + { + continue; + } + + diff = diff || {}; + diff[aKey] = bValue; + } + + // add new stuff + for (var bKey in b) + { + if (!(bKey in a)) + { + diff = diff || {}; + diff[bKey] = b[bKey]; + } + } + + return diff; +} + + +function diffChildren(aParent, bParent, patches, rootIndex) +{ + var aChildren = aParent.children; + var bChildren = bParent.children; + + var aLen = aChildren.length; + var bLen = bChildren.length; + + // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS + + if (aLen > bLen) + { + patches.push(makePatch('p-remove-last', rootIndex, aLen - bLen)); + } + else if (aLen < bLen) + { + patches.push(makePatch('p-append', rootIndex, bChildren.slice(aLen))); + } + + // PAIRWISE DIFF EVERYTHING ELSE + + var index = rootIndex; + var minLen = aLen < bLen ? aLen : bLen; + for (var i = 0; i < minLen; i++) + { + index++; + var aChild = aChildren[i]; + diffHelp(aChild, bChildren[i], patches, index); + index += aChild.descendantsCount || 0; + } +} + + + +//////////// KEYED DIFF //////////// + + +function diffKeyedChildren(aParent, bParent, patches, rootIndex) +{ + var localPatches = []; + + var changes = {}; // Dict String Entry + var inserts = []; // Array { index : Int, entry : Entry } + // type Entry = { tag : String, vnode : VNode, index : Int, data : _ } + + var aChildren = aParent.children; + var bChildren = bParent.children; + var aLen = aChildren.length; + var bLen = bChildren.length; + var aIndex = 0; + var bIndex = 0; + + var index = rootIndex; + + while (aIndex < aLen && bIndex < bLen) + { + var a = aChildren[aIndex]; + var b = bChildren[bIndex]; + + var aKey = a._0; + var bKey = b._0; + var aNode = a._1; + var bNode = b._1; + + // check if keys match + + if (aKey === bKey) + { + index++; + diffHelp(aNode, bNode, localPatches, index); + index += aNode.descendantsCount || 0; + + aIndex++; + bIndex++; + continue; + } + + // look ahead 1 to detect insertions and removals. + + var aLookAhead = aIndex + 1 < aLen; + var bLookAhead = bIndex + 1 < bLen; + + if (aLookAhead) + { + var aNext = aChildren[aIndex + 1]; + var aNextKey = aNext._0; + var aNextNode = aNext._1; + var oldMatch = bKey === aNextKey; + } + + if (bLookAhead) + { + var bNext = bChildren[bIndex + 1]; + var bNextKey = bNext._0; + var bNextNode = bNext._1; + var newMatch = aKey === bNextKey; + } + + + // swap a and b + if (aLookAhead && bLookAhead && newMatch && oldMatch) + { + index++; + diffHelp(aNode, bNextNode, localPatches, index); + insertNode(changes, localPatches, aKey, bNode, bIndex, inserts); + index += aNode.descendantsCount || 0; + + index++; + removeNode(changes, localPatches, aKey, aNextNode, index); + index += aNextNode.descendantsCount || 0; + + aIndex += 2; + bIndex += 2; + continue; + } + + // insert b + if (bLookAhead && newMatch) + { + index++; + insertNode(changes, localPatches, bKey, bNode, bIndex, inserts); + diffHelp(aNode, bNextNode, localPatches, index); + index += aNode.descendantsCount || 0; + + aIndex += 1; + bIndex += 2; + continue; + } + + // remove a + if (aLookAhead && oldMatch) + { + index++; + removeNode(changes, localPatches, aKey, aNode, index); + index += aNode.descendantsCount || 0; + + index++; + diffHelp(aNextNode, bNode, localPatches, index); + index += aNextNode.descendantsCount || 0; + + aIndex += 2; + bIndex += 1; + continue; + } + + // remove a, insert b + if (aLookAhead && bLookAhead && aNextKey === bNextKey) + { + index++; + removeNode(changes, localPatches, aKey, aNode, index); + insertNode(changes, localPatches, bKey, bNode, bIndex, inserts); + index += aNode.descendantsCount || 0; + + index++; + diffHelp(aNextNode, bNextNode, localPatches, index); + index += aNextNode.descendantsCount || 0; + + aIndex += 2; + bIndex += 2; + continue; + } + + break; + } + + // eat up any remaining nodes with removeNode and insertNode + + while (aIndex < aLen) + { + index++; + var a = aChildren[aIndex]; + var aNode = a._1; + removeNode(changes, localPatches, a._0, aNode, index); + index += aNode.descendantsCount || 0; + aIndex++; + } + + var endInserts; + while (bIndex < bLen) + { + endInserts = endInserts || []; + var b = bChildren[bIndex]; + insertNode(changes, localPatches, b._0, b._1, undefined, endInserts); + bIndex++; + } + + if (localPatches.length > 0 || inserts.length > 0 || typeof endInserts !== 'undefined') + { + patches.push(makePatch('p-reorder', rootIndex, { + patches: localPatches, + inserts: inserts, + endInserts: endInserts + })); + } +} + + + +//////////// CHANGES FROM KEYED DIFF //////////// + + +var POSTFIX = '_elmW6BL'; + + +function insertNode(changes, localPatches, key, vnode, bIndex, inserts) +{ + var entry = changes[key]; + + // never seen this key before + if (typeof entry === 'undefined') + { + entry = { + tag: 'insert', + vnode: vnode, + index: bIndex, + data: undefined + }; + + inserts.push({ index: bIndex, entry: entry }); + changes[key] = entry; + + return; + } + + // this key was removed earlier, a match! + if (entry.tag === 'remove') + { + inserts.push({ index: bIndex, entry: entry }); + + entry.tag = 'move'; + var subPatches = []; + diffHelp(entry.vnode, vnode, subPatches, entry.index); + entry.index = bIndex; + entry.data.data = { + patches: subPatches, + entry: entry + }; + + return; + } + + // this key has already been inserted or moved, a duplicate! + insertNode(changes, localPatches, key + POSTFIX, vnode, bIndex, inserts); +} + + +function removeNode(changes, localPatches, key, vnode, index) +{ + var entry = changes[key]; + + // never seen this key before + if (typeof entry === 'undefined') + { + var patch = makePatch('p-remove', index, undefined); + localPatches.push(patch); + + changes[key] = { + tag: 'remove', + vnode: vnode, + index: index, + data: patch + }; + + return; + } + + // this key was inserted earlier, a match! + if (entry.tag === 'insert') + { + entry.tag = 'move'; + var subPatches = []; + diffHelp(vnode, entry.vnode, subPatches, index); + + var patch = makePatch('p-remove', index, { + patches: subPatches, + entry: entry + }); + localPatches.push(patch); + + return; + } + + // this key has already been removed or moved, a duplicate! + removeNode(changes, localPatches, key + POSTFIX, vnode, index); +} + + + +//////////// ADD DOM NODES //////////// +// +// Each DOM node has an "index" assigned in order of traversal. It is important +// to minimize our crawl over the actual DOM, so these indexes (along with the +// descendantsCount of virtual nodes) let us skip touching entire subtrees of +// the DOM if we know there are no patches there. + + +function addDomNodes(domNode, vNode, patches, eventNode) +{ + addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.descendantsCount, eventNode); +} + + +// assumes `patches` is non-empty and indexes increase monotonically. +function addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) +{ + var patch = patches[i]; + var index = patch.index; + + while (index === low) + { + var patchType = patch.type; + + if (patchType === 'p-thunk') + { + addDomNodes(domNode, vNode.node, patch.data, eventNode); + } + else if (patchType === 'p-reorder') + { + patch.domNode = domNode; + patch.eventNode = eventNode; + + var subPatches = patch.data.patches; + if (subPatches.length > 0) + { + addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + } + } + else if (patchType === 'p-remove') + { + patch.domNode = domNode; + patch.eventNode = eventNode; + + var data = patch.data; + if (typeof data !== 'undefined') + { + data.entry.data = domNode; + var subPatches = data.patches; + if (subPatches.length > 0) + { + addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); + } + } + } + else + { + patch.domNode = domNode; + patch.eventNode = eventNode; + } + + i++; + + if (!(patch = patches[i]) || (index = patch.index) > high) + { + return i; + } + } + + switch (vNode.type) + { + case 'tagger': + var subNode = vNode.node; + + while (subNode.type === "tagger") + { + subNode = subNode.node; + } + + return addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); + + case 'node': + var vChildren = vNode.children; + var childNodes = domNode.childNodes; + for (var j = 0; j < vChildren.length; j++) + { + low++; + var vChild = vChildren[j]; + var nextLow = low + (vChild.descendantsCount || 0); + if (low <= index && index <= nextLow) + { + i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode); + if (!(patch = patches[i]) || (index = patch.index) > high) + { + return i; + } + } + low = nextLow; + } + return i; + + case 'keyed-node': + var vChildren = vNode.children; + var childNodes = domNode.childNodes; + for (var j = 0; j < vChildren.length; j++) + { + low++; + var vChild = vChildren[j]._1; + var nextLow = low + (vChild.descendantsCount || 0); + if (low <= index && index <= nextLow) + { + i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode); + if (!(patch = patches[i]) || (index = patch.index) > high) + { + return i; + } + } + low = nextLow; + } + return i; + + case 'text': + case 'thunk': + throw new Error('should never traverse `text` or `thunk` nodes like this'); + } +} + + + +//////////// APPLY PATCHES //////////// + + +function applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) +{ + if (patches.length === 0) + { + return rootDomNode; + } + + addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); + return applyPatchesHelp(rootDomNode, patches); +} + +function applyPatchesHelp(rootDomNode, patches) +{ + for (var i = 0; i < patches.length; i++) + { + var patch = patches[i]; + var localDomNode = patch.domNode + var newNode = applyPatch(localDomNode, patch); + if (localDomNode === rootDomNode) + { + rootDomNode = newNode; + } + } + return rootDomNode; +} + +function applyPatch(domNode, patch) +{ + switch (patch.type) + { + case 'p-redraw': + return applyPatchRedraw(domNode, patch.data, patch.eventNode); + + case 'p-facts': + applyFacts(domNode, patch.eventNode, patch.data); + return domNode; + + case 'p-text': + domNode.replaceData(0, domNode.length, patch.data); + return domNode; + + case 'p-thunk': + return applyPatchesHelp(domNode, patch.data); + + case 'p-tagger': + if (typeof domNode.elm_event_node_ref !== 'undefined') + { + domNode.elm_event_node_ref.tagger = patch.data; + } + else + { + domNode.elm_event_node_ref = { tagger: patch.data, parent: patch.eventNode }; + } + return domNode; + + case 'p-remove-last': + var i = patch.data; + while (i--) + { + domNode.removeChild(domNode.lastChild); + } + return domNode; + + case 'p-append': + var newNodes = patch.data; + for (var i = 0; i < newNodes.length; i++) + { + domNode.appendChild(render(newNodes[i], patch.eventNode)); + } + return domNode; + + case 'p-remove': + var data = patch.data; + if (typeof data === 'undefined') + { + domNode.parentNode.removeChild(domNode); + return domNode; + } + var entry = data.entry; + if (typeof entry.index !== 'undefined') + { + domNode.parentNode.removeChild(domNode); + } + entry.data = applyPatchesHelp(domNode, data.patches); + return domNode; + + case 'p-reorder': + return applyPatchReorder(domNode, patch); + + case 'p-custom': + var impl = patch.data; + return impl.applyPatch(domNode, impl.data); + + default: + throw new Error('Ran into an unknown patch!'); + } +} + + +function applyPatchRedraw(domNode, vNode, eventNode) +{ + var parentNode = domNode.parentNode; + var newNode = render(vNode, eventNode); + + if (typeof newNode.elm_event_node_ref === 'undefined') + { + newNode.elm_event_node_ref = domNode.elm_event_node_ref; + } + + if (parentNode && newNode !== domNode) + { + parentNode.replaceChild(newNode, domNode); + } + return newNode; +} + + +function applyPatchReorder(domNode, patch) +{ + var data = patch.data; + + // remove end inserts + var frag = applyPatchReorderEndInsertsHelp(data.endInserts, patch); + + // removals + domNode = applyPatchesHelp(domNode, data.patches); + + // inserts + var inserts = data.inserts; + for (var i = 0; i < inserts.length; i++) + { + var insert = inserts[i]; + var entry = insert.entry; + var node = entry.tag === 'move' + ? entry.data + : render(entry.vnode, patch.eventNode); + domNode.insertBefore(node, domNode.childNodes[insert.index]); + } + + // add end inserts + if (typeof frag !== 'undefined') + { + domNode.appendChild(frag); + } + + return domNode; +} + + +function applyPatchReorderEndInsertsHelp(endInserts, patch) +{ + if (typeof endInserts === 'undefined') + { + return; + } + + var frag = localDoc.createDocumentFragment(); + for (var i = 0; i < endInserts.length; i++) + { + var insert = endInserts[i]; + var entry = insert.entry; + frag.appendChild(entry.tag === 'move' + ? entry.data + : render(entry.vnode, patch.eventNode) + ); + } + return frag; +} + + +// PROGRAMS + +var program = makeProgram(checkNoFlags); +var programWithFlags = makeProgram(checkYesFlags); + +function makeProgram(flagChecker) +{ + return F2(function(debugWrap, impl) + { + return function(flagDecoder) + { + return function(object, moduleName, debugMetadata) + { + var checker = flagChecker(flagDecoder, moduleName); + if (typeof debugMetadata === 'undefined') + { + normalSetup(impl, object, moduleName, checker); + } + else + { + debugSetup(A2(debugWrap, debugMetadata, impl), object, moduleName, checker); + } + }; + }; + }); +} + +function staticProgram(vNode) +{ + var nothing = _elm_lang$core$Native_Utils.Tuple2( + _elm_lang$core$Native_Utils.Tuple0, + _elm_lang$core$Platform_Cmd$none + ); + return A2(program, _elm_lang$virtual_dom$VirtualDom_Debug$wrap, { + init: nothing, + view: function() { return vNode; }, + update: F2(function() { return nothing; }), + subscriptions: function() { return _elm_lang$core$Platform_Sub$none; } + })(); +} + + +// FLAG CHECKERS + +function checkNoFlags(flagDecoder, moduleName) +{ + return function(init, flags, domNode) + { + if (typeof flags === 'undefined') + { + return init; + } + + var errorMessage = + 'The `' + moduleName + '` module does not need flags.\n' + + 'Initialize it with no arguments and you should be all set!'; + + crash(errorMessage, domNode); + }; +} + +function checkYesFlags(flagDecoder, moduleName) +{ + return function(init, flags, domNode) + { + if (typeof flagDecoder === 'undefined') + { + var errorMessage = + 'Are you trying to sneak a Never value into Elm? Trickster!\n' + + 'It looks like ' + moduleName + '.main is defined with `programWithFlags` but has type `Program Never`.\n' + + 'Use `program` instead if you do not want flags.' + + crash(errorMessage, domNode); + } + + var result = A2(_elm_lang$core$Native_Json.run, flagDecoder, flags); + if (result.ctor === 'Ok') + { + return init(result._0); + } + + var errorMessage = + 'Trying to initialize the `' + moduleName + '` module with an unexpected flag.\n' + + 'I tried to convert it to an Elm value, but ran into this problem:\n\n' + + result._0; + + crash(errorMessage, domNode); + }; +} + +function crash(errorMessage, domNode) +{ + if (domNode) + { + domNode.innerHTML = + '
' + + '

Oops! Something went wrong when starting your Elm program.

' + + '
' + errorMessage + '
' + + '
'; + } + + throw new Error(errorMessage); +} + + +// NORMAL SETUP + +function normalSetup(impl, object, moduleName, flagChecker) +{ + object['embed'] = function embed(node, flags) + { + while (node.lastChild) + { + node.removeChild(node.lastChild); + } + + return _elm_lang$core$Native_Platform.initialize( + flagChecker(impl.init, flags, node), + impl.update, + impl.subscriptions, + normalRenderer(node, impl.view) + ); + }; + + object['fullscreen'] = function fullscreen(flags) + { + return _elm_lang$core$Native_Platform.initialize( + flagChecker(impl.init, flags, document.body), + impl.update, + impl.subscriptions, + normalRenderer(document.body, impl.view) + ); + }; +} + +function normalRenderer(parentNode, view) +{ + return function(tagger, initialModel) + { + var eventNode = { tagger: tagger, parent: undefined }; + var initialVirtualNode = view(initialModel); + var domNode = render(initialVirtualNode, eventNode); + parentNode.appendChild(domNode); + return makeStepper(domNode, view, initialVirtualNode, eventNode); + }; +} + + +// STEPPER + +var rAF = + typeof requestAnimationFrame !== 'undefined' + ? requestAnimationFrame + : function(callback) { setTimeout(callback, 1000 / 60); }; + +function makeStepper(domNode, view, initialVirtualNode, eventNode) +{ + var state = 'NO_REQUEST'; + var currNode = initialVirtualNode; + var nextModel; + + function updateIfNeeded() + { + switch (state) + { + case 'NO_REQUEST': + throw new Error( + 'Unexpected draw callback.\n' + + 'Please report this to .' + ); + + case 'PENDING_REQUEST': + rAF(updateIfNeeded); + state = 'EXTRA_REQUEST'; + + var nextNode = view(nextModel); + var patches = diff(currNode, nextNode); + domNode = applyPatches(domNode, currNode, patches, eventNode); + currNode = nextNode; + + return; + + case 'EXTRA_REQUEST': + state = 'NO_REQUEST'; + return; + } + } + + return function stepper(model) + { + if (state === 'NO_REQUEST') + { + rAF(updateIfNeeded); + } + state = 'PENDING_REQUEST'; + nextModel = model; + }; +} + + +// DEBUG SETUP + +function debugSetup(impl, object, moduleName, flagChecker) +{ + object['fullscreen'] = function fullscreen(flags) + { + var popoutRef = { doc: undefined }; + return _elm_lang$core$Native_Platform.initialize( + flagChecker(impl.init, flags, document.body), + impl.update(scrollTask(popoutRef)), + impl.subscriptions, + debugRenderer(moduleName, document.body, popoutRef, impl.view, impl.viewIn, impl.viewOut) + ); + }; + + object['embed'] = function fullscreen(node, flags) + { + var popoutRef = { doc: undefined }; + return _elm_lang$core$Native_Platform.initialize( + flagChecker(impl.init, flags, node), + impl.update(scrollTask(popoutRef)), + impl.subscriptions, + debugRenderer(moduleName, node, popoutRef, impl.view, impl.viewIn, impl.viewOut) + ); + }; +} + +function scrollTask(popoutRef) +{ + return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) + { + var doc = popoutRef.doc; + if (doc) + { + var msgs = doc.getElementsByClassName('debugger-sidebar-messages')[0]; + if (msgs) + { + msgs.scrollTop = msgs.scrollHeight; + } + } + callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0)); + }); +} + + +function debugRenderer(moduleName, parentNode, popoutRef, view, viewIn, viewOut) +{ + return function(tagger, initialModel) + { + var appEventNode = { tagger: tagger, parent: undefined }; + var eventNode = { tagger: tagger, parent: undefined }; + + // make normal stepper + var appVirtualNode = view(initialModel); + var appNode = render(appVirtualNode, appEventNode); + parentNode.appendChild(appNode); + var appStepper = makeStepper(appNode, view, appVirtualNode, appEventNode); + + // make overlay stepper + var overVirtualNode = viewIn(initialModel)._1; + var overNode = render(overVirtualNode, eventNode); + parentNode.appendChild(overNode); + var wrappedViewIn = wrapViewIn(appEventNode, overNode, viewIn); + var overStepper = makeStepper(overNode, wrappedViewIn, overVirtualNode, eventNode); + + // make debugger stepper + var debugStepper = makeDebugStepper(initialModel, viewOut, eventNode, parentNode, moduleName, popoutRef); + + return function stepper(model) + { + appStepper(model); + overStepper(model); + debugStepper(model); + } + }; +} + +function makeDebugStepper(initialModel, view, eventNode, parentNode, moduleName, popoutRef) +{ + var curr; + var domNode; + + return function stepper(model) + { + if (!model.isDebuggerOpen) + { + return; + } + + if (!popoutRef.doc) + { + curr = view(model); + domNode = openDebugWindow(moduleName, popoutRef, curr, eventNode); + return; + } + + // switch to document of popout + localDoc = popoutRef.doc; + + var next = view(model); + var patches = diff(curr, next); + domNode = applyPatches(domNode, curr, patches, eventNode); + curr = next; + + // switch back to normal document + localDoc = document; + }; +} + +function openDebugWindow(moduleName, popoutRef, virtualNode, eventNode) +{ + var w = 900; + var h = 360; + var x = screen.width - w; + var y = screen.height - h; + var debugWindow = window.open('', '', 'width=' + w + ',height=' + h + ',left=' + x + ',top=' + y); + + // switch to window document + localDoc = debugWindow.document; + + popoutRef.doc = localDoc; + localDoc.title = 'Debugger - ' + moduleName; + localDoc.body.style.margin = '0'; + localDoc.body.style.padding = '0'; + var domNode = render(virtualNode, eventNode); + localDoc.body.appendChild(domNode); + + localDoc.addEventListener('keydown', function(event) { + if (event.metaKey && event.which === 82) + { + window.location.reload(); + } + if (event.which === 38) + { + eventNode.tagger({ ctor: 'Up' }); + event.preventDefault(); + } + if (event.which === 40) + { + eventNode.tagger({ ctor: 'Down' }); + event.preventDefault(); + } + }); + + function close() + { + popoutRef.doc = undefined; + debugWindow.close(); + } + window.addEventListener('unload', close); + debugWindow.addEventListener('unload', function() { + popoutRef.doc = undefined; + window.removeEventListener('unload', close); + eventNode.tagger({ ctor: 'Close' }); + }); + + // switch back to the normal document + localDoc = document; + + return domNode; +} + + +// BLOCK EVENTS + +function wrapViewIn(appEventNode, overlayNode, viewIn) +{ + var ignorer = makeIgnorer(overlayNode); + var blocking = 'Normal'; + var overflow; + + var normalTagger = appEventNode.tagger; + var blockTagger = function() {}; + + return function(model) + { + var tuple = viewIn(model); + var newBlocking = tuple._0.ctor; + appEventNode.tagger = newBlocking === 'Normal' ? normalTagger : blockTagger; + if (blocking !== newBlocking) + { + traverse('removeEventListener', ignorer, blocking); + traverse('addEventListener', ignorer, newBlocking); + + if (blocking === 'Normal') + { + overflow = document.body.style.overflow; + document.body.style.overflow = 'hidden'; + } + + if (newBlocking === 'Normal') + { + document.body.style.overflow = overflow; + } + + blocking = newBlocking; + } + return tuple._1; + } +} + +function traverse(verbEventListener, ignorer, blocking) +{ + switch(blocking) + { + case 'Normal': + return; + + case 'Pause': + return traverseHelp(verbEventListener, ignorer, mostEvents); + + case 'Message': + return traverseHelp(verbEventListener, ignorer, allEvents); + } +} + +function traverseHelp(verbEventListener, handler, eventNames) +{ + for (var i = 0; i < eventNames.length; i++) + { + document.body[verbEventListener](eventNames[i], handler, true); + } +} + +function makeIgnorer(overlayNode) +{ + return function(event) + { + if (event.type === 'keydown' && event.metaKey && event.which === 82) + { + return; + } + + var isScroll = event.type === 'scroll' || event.type === 'wheel'; + + var node = event.target; + while (node !== null) + { + if (node.className === 'elm-overlay-message-details' && isScroll) + { + return; + } + + if (node === overlayNode && !isScroll) + { + return; + } + node = node.parentNode; + } + + event.stopPropagation(); + event.preventDefault(); + } +} + +var mostEvents = [ + 'click', 'dblclick', 'mousemove', + 'mouseup', 'mousedown', 'mouseenter', 'mouseleave', + 'touchstart', 'touchend', 'touchcancel', 'touchmove', + 'pointerdown', 'pointerup', 'pointerover', 'pointerout', + 'pointerenter', 'pointerleave', 'pointermove', 'pointercancel', + 'dragstart', 'drag', 'dragend', 'dragenter', 'dragover', 'dragleave', 'drop', + 'keyup', 'keydown', 'keypress', + 'input', 'change', + 'focus', 'blur' +]; + +var allEvents = mostEvents.concat('wheel', 'scroll'); + + +return { + node: node, + text: text, + custom: custom, + map: F2(map), + + on: F3(on), + style: style, + property: F2(property), + attribute: F2(attribute), + attributeNS: F3(attributeNS), + mapProperty: F2(mapProperty), + + lazy: F2(lazy), + lazy2: F3(lazy2), + lazy3: F4(lazy3), + keyedNode: F3(keyedNode), + + program: program, + programWithFlags: programWithFlags, + staticProgram: staticProgram +}; + +}(); + +var _elm_lang$virtual_dom$Native_Debug = function() { + + +// IMPORT / EXPORT + +function unsafeCoerce(value) +{ + return value; +} + +var upload = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) +{ + var element = document.createElement('input'); + element.setAttribute('type', 'file'); + element.setAttribute('accept', 'text/json'); + element.style.display = 'none'; + element.addEventListener('change', function(event) + { + var fileReader = new FileReader(); + fileReader.onload = function(e) + { + callback(_elm_lang$core$Native_Scheduler.succeed(e.target.result)); + }; + fileReader.readAsText(event.target.files[0]); + document.body.removeChild(element); + }); + document.body.appendChild(element); + element.click(); +}); + +function download(historyLength, json) +{ + return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) + { + var fileName = 'history-' + historyLength + '.txt'; + var jsonString = JSON.stringify(json); + var mime = 'text/plain;charset=utf-8'; + var done = _elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0); + + // for IE10+ + if (navigator.msSaveBlob) + { + navigator.msSaveBlob(new Blob([jsonString], {type: mime}), fileName); + return callback(done); + } + + // for HTML5 + var element = document.createElement('a'); + element.setAttribute('href', 'data:' + mime + ',' + encodeURIComponent(jsonString)); + element.setAttribute('download', fileName); + element.style.display = 'none'; + document.body.appendChild(element); + element.click(); + document.body.removeChild(element); + callback(done); + }); +} + + +// POPOUT + +function messageToString(value) +{ + switch (typeof value) + { + case 'boolean': + return value ? 'True' : 'False'; + case 'number': + return value + ''; + case 'string': + return '"' + addSlashes(value, false) + '"'; + } + if (value instanceof String) + { + return '\'' + addSlashes(value, true) + '\''; + } + if (typeof value !== 'object' || value === null || !('ctor' in value)) + { + return '…'; + } + + var ctorStarter = value.ctor.substring(0, 5); + if (ctorStarter === '_Tupl' || ctorStarter === '_Task') + { + return '…' + } + if (['_Array', '', '_Process', '::', '[]', 'Set_elm_builtin', 'RBNode_elm_builtin', 'RBEmpty_elm_builtin'].indexOf(value.ctor) >= 0) + { + return '…'; + } + + var keys = Object.keys(value); + switch (keys.length) + { + case 1: + return value.ctor; + case 2: + return value.ctor + ' ' + messageToString(value._0); + default: + return value.ctor + ' … ' + messageToString(value[keys[keys.length - 1]]); + } +} + + +function primitive(str) +{ + return { ctor: 'Primitive', _0: str }; +} + + +function init(value) +{ + var type = typeof value; + + if (type === 'boolean') + { + return { + ctor: 'Constructor', + _0: _elm_lang$core$Maybe$Just(value ? 'True' : 'False'), + _1: true, + _2: _elm_lang$core$Native_List.Nil + }; + } + + if (type === 'number') + { + return primitive(value + ''); + } + + if (type === 'string') + { + return { ctor: 'S', _0: '"' + addSlashes(value, false) + '"' }; + } + + if (value instanceof String) + { + return { ctor: 'S', _0: "'" + addSlashes(value, true) + "'" }; + } + + if (value instanceof Date) + { + return primitive('<' + value.toString() + '>'); + } + + if (value === null) + { + return primitive('XXX'); + } + + if (type === 'object' && 'ctor' in value) + { + var ctor = value.ctor; + + if (ctor === '::' || ctor === '[]') + { + return { + ctor: 'Sequence', + _0: {ctor: 'ListSeq'}, + _1: true, + _2: A2(_elm_lang$core$List$map, init, value) + }; + } + + if (ctor === 'Set_elm_builtin') + { + return { + ctor: 'Sequence', + _0: {ctor: 'SetSeq'}, + _1: true, + _2: A3(_elm_lang$core$Set$foldr, initCons, _elm_lang$core$Native_List.Nil, value) + }; + } + + if (ctor === 'RBNode_elm_builtin' || ctor == 'RBEmpty_elm_builtin') + { + return { + ctor: 'Dictionary', + _0: true, + _1: A3(_elm_lang$core$Dict$foldr, initKeyValueCons, _elm_lang$core$Native_List.Nil, value) + }; + } + + if (ctor === '_Array') + { + return { + ctor: 'Sequence', + _0: {ctor: 'ArraySeq'}, + _1: true, + _2: A3(_elm_lang$core$Array$foldr, initCons, _elm_lang$core$Native_List.Nil, value) + }; + } + + var ctorStarter = value.ctor.substring(0, 5); + if (ctorStarter === '_Task') + { + return primitive(''); + } + + if (ctor === '') + { + return primitive(ctor); + } + + if (ctor === '_Process') + { + return primitive(''); + } + + var list = _elm_lang$core$Native_List.Nil; + for (var i in value) + { + if (i === 'ctor') continue; + list = _elm_lang$core$Native_List.Cons(init(value[i]), list); + } + return { + ctor: 'Constructor', + _0: ctorStarter === '_Tupl' ? _elm_lang$core$Maybe$Nothing : _elm_lang$core$Maybe$Just(ctor), + _1: true, + _2: _elm_lang$core$List$reverse(list) + }; + } + + if (type === 'object') + { + var dict = _elm_lang$core$Dict$empty; + for (var i in value) + { + dict = A3(_elm_lang$core$Dict$insert, i, init(value[i]), dict); + } + return { ctor: 'Record', _0: true, _1: dict }; + } + + return primitive('XXX'); +} + +var initCons = F2(initConsHelp); + +function initConsHelp(value, list) +{ + return _elm_lang$core$Native_List.Cons(init(value), list); +} + +var initKeyValueCons = F3(initKeyValueConsHelp); + +function initKeyValueConsHelp(key, value, list) +{ + return _elm_lang$core$Native_List.Cons( + _elm_lang$core$Native_Utils.Tuple2(init(key), init(value)), + list + ); +} + +function addSlashes(str, isChar) +{ + var s = str.replace(/\\/g, '\\\\') + .replace(/\n/g, '\\n') + .replace(/\t/g, '\\t') + .replace(/\r/g, '\\r') + .replace(/\v/g, '\\v') + .replace(/\0/g, '\\0'); + if (isChar) + { + return s.replace(/\'/g, '\\\''); + } + else + { + return s.replace(/\"/g, '\\"'); + } +} + + +return { + upload: upload, + download: F2(download), + unsafeCoerce: unsafeCoerce, + messageToString: messageToString, + init: init +} + +}(); + +var _elm_lang$virtual_dom$VirtualDom_Helpers$keyedNode = _elm_lang$virtual_dom$Native_VirtualDom.keyedNode; +var _elm_lang$virtual_dom$VirtualDom_Helpers$lazy3 = _elm_lang$virtual_dom$Native_VirtualDom.lazy3; +var _elm_lang$virtual_dom$VirtualDom_Helpers$lazy2 = _elm_lang$virtual_dom$Native_VirtualDom.lazy2; +var _elm_lang$virtual_dom$VirtualDom_Helpers$lazy = _elm_lang$virtual_dom$Native_VirtualDom.lazy; +var _elm_lang$virtual_dom$VirtualDom_Helpers$defaultOptions = {stopPropagation: false, preventDefault: false}; +var _elm_lang$virtual_dom$VirtualDom_Helpers$onWithOptions = _elm_lang$virtual_dom$Native_VirtualDom.on; +var _elm_lang$virtual_dom$VirtualDom_Helpers$on = F2( + function (eventName, decoder) { + return A3(_elm_lang$virtual_dom$VirtualDom_Helpers$onWithOptions, eventName, _elm_lang$virtual_dom$VirtualDom_Helpers$defaultOptions, decoder); + }); +var _elm_lang$virtual_dom$VirtualDom_Helpers$onClick = function (msg) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$on, + 'click', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$virtual_dom$VirtualDom_Helpers$style = _elm_lang$virtual_dom$Native_VirtualDom.style; +var _elm_lang$virtual_dom$VirtualDom_Helpers$attribute = _elm_lang$virtual_dom$Native_VirtualDom.attribute; +var _elm_lang$virtual_dom$VirtualDom_Helpers$id = _elm_lang$virtual_dom$VirtualDom_Helpers$attribute('id'); +var _elm_lang$virtual_dom$VirtualDom_Helpers$property = _elm_lang$virtual_dom$Native_VirtualDom.property; +var _elm_lang$virtual_dom$VirtualDom_Helpers$class = function (name) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$property, + 'className', + _elm_lang$core$Json_Encode$string(name)); +}; +var _elm_lang$virtual_dom$VirtualDom_Helpers$href = function (name) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$property, + 'href', + _elm_lang$core$Json_Encode$string(name)); +}; +var _elm_lang$virtual_dom$VirtualDom_Helpers$map = _elm_lang$virtual_dom$Native_VirtualDom.map; +var _elm_lang$virtual_dom$VirtualDom_Helpers$text = _elm_lang$virtual_dom$Native_VirtualDom.text; +var _elm_lang$virtual_dom$VirtualDom_Helpers$node = _elm_lang$virtual_dom$Native_VirtualDom.node; +var _elm_lang$virtual_dom$VirtualDom_Helpers$div = _elm_lang$virtual_dom$VirtualDom_Helpers$node('div'); +var _elm_lang$virtual_dom$VirtualDom_Helpers$span = _elm_lang$virtual_dom$VirtualDom_Helpers$node('span'); +var _elm_lang$virtual_dom$VirtualDom_Helpers$a = _elm_lang$virtual_dom$VirtualDom_Helpers$node('a'); +var _elm_lang$virtual_dom$VirtualDom_Helpers$h1 = _elm_lang$virtual_dom$VirtualDom_Helpers$node('h1'); +var _elm_lang$virtual_dom$VirtualDom_Helpers$Options = F2( + function (a, b) { + return {stopPropagation: a, preventDefault: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Helpers$Node = {ctor: 'Node'}; +var _elm_lang$virtual_dom$VirtualDom_Helpers$Property = {ctor: 'Property'}; + +var _elm_lang$virtual_dom$VirtualDom_Expando$purple = _elm_lang$virtual_dom$VirtualDom_Helpers$style( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'color', _1: 'rgb(136, 19, 145)'}, + _1: {ctor: '[]'} + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$blue = _elm_lang$virtual_dom$VirtualDom_Helpers$style( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'color', _1: 'rgb(28, 0, 207)'}, + _1: {ctor: '[]'} + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$red = _elm_lang$virtual_dom$VirtualDom_Helpers$style( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'color', _1: 'rgb(196, 26, 22)'}, + _1: {ctor: '[]'} + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$leftPad = function (maybeKey) { + var _p0 = maybeKey; + if (_p0.ctor === 'Nothing') { + return _elm_lang$virtual_dom$VirtualDom_Helpers$style( + {ctor: '[]'}); + } else { + return _elm_lang$virtual_dom$VirtualDom_Helpers$style( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'padding-left', _1: '4ch'}, + _1: {ctor: '[]'} + }); + } +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow = function (arrow) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$style( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'color', _1: '#777'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'padding-left', _1: '2ch'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'width', _1: '2ch'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'display', _1: 'inline-block'}, + _1: {ctor: '[]'} + } + } + } + }), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(arrow), + _1: {ctor: '[]'} + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter = F3( + function (maybeKey, maybeIsClosed, description) { + var arrow = function () { + var _p1 = maybeIsClosed; + if (_p1.ctor === 'Nothing') { + return _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow(''); + } else { + if (_p1._0 === true) { + return _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow('▸'); + } else { + return _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow('▾'); + } + } + }(); + var _p2 = maybeKey; + if (_p2.ctor === 'Nothing') { + return {ctor: '::', _0: arrow, _1: description}; + } else { + return { + ctor: '::', + _0: arrow, + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$purple, + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p2._0), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' = '), + _1: description + } + } + }; + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTinyRecord = F3( + function (length, starter, entries) { + var _p3 = entries; + if (_p3.ctor === '[]') { + return { + ctor: '_Tuple2', + _0: length + 1, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('}'), + _1: {ctor: '[]'} + } + }; + } else { + var _p5 = _p3._0; + var nextLength = (length + _elm_lang$core$String$length(_p5)) + 1; + if (_elm_lang$core$Native_Utils.cmp(nextLength, 18) > 0) { + return { + ctor: '_Tuple2', + _0: length + 2, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('…}'), + _1: {ctor: '[]'} + } + }; + } else { + var _p4 = A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTinyRecord, nextLength, ',', _p3._1); + var finalLength = _p4._0; + var otherNodes = _p4._1; + return { + ctor: '_Tuple2', + _0: finalLength, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$purple, + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p5), + _1: {ctor: '[]'} + }), + _1: otherNodes + } + } + }; + } + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$elideMiddle = function (str) { + return (_elm_lang$core$Native_Utils.cmp( + _elm_lang$core$String$length(str), + 18) < 1) ? str : A2( + _elm_lang$core$Basics_ops['++'], + A2(_elm_lang$core$String$left, 8, str), + A2( + _elm_lang$core$Basics_ops['++'], + '...', + A2(_elm_lang$core$String$right, 8, str))); +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp = function (str) { + return { + ctor: '_Tuple2', + _0: _elm_lang$core$String$length(str), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(str), + _1: {ctor: '[]'} + } + }; +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex = F3( + function (n, func, list) { + var _p6 = list; + if (_p6.ctor === '[]') { + return {ctor: '[]'}; + } else { + var _p8 = _p6._1; + var _p7 = _p6._0; + return (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) ? { + ctor: '::', + _0: func(_p7), + _1: _p8 + } : { + ctor: '::', + _0: _p7, + _1: A3(_elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, n - 1, func, _p8) + }; + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$seqTypeToString = F2( + function (n, seqType) { + var _p9 = seqType; + switch (_p9.ctor) { + case 'ListSeq': + return A2( + _elm_lang$core$Basics_ops['++'], + 'List(', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$core$Basics$toString(n), + ')')); + case 'SetSeq': + return A2( + _elm_lang$core$Basics_ops['++'], + 'Set(', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$core$Basics$toString(n), + ')')); + default: + return A2( + _elm_lang$core$Basics_ops['++'], + 'Array(', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$core$Basics$toString(n), + ')')); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$viewTiny = function (value) { + var _p10 = value; + switch (_p10.ctor) { + case 'S': + var str = _elm_lang$virtual_dom$VirtualDom_Expando$elideMiddle(_p10._0); + return { + ctor: '_Tuple2', + _0: _elm_lang$core$String$length(str), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$red, + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(str), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + }; + case 'Primitive': + var _p11 = _p10._0; + return { + ctor: '_Tuple2', + _0: _elm_lang$core$String$length(_p11), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$blue, + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p11), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + }; + case 'Sequence': + return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( + A2( + _elm_lang$virtual_dom$VirtualDom_Expando$seqTypeToString, + _elm_lang$core$List$length(_p10._2), + _p10._0)); + case 'Dictionary': + return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( + A2( + _elm_lang$core$Basics_ops['++'], + 'Dict(', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$core$Basics$toString( + _elm_lang$core$List$length(_p10._1)), + ')'))); + case 'Record': + return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecord(_p10._1); + default: + if (_p10._2.ctor === '[]') { + return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( + A2(_elm_lang$core$Maybe$withDefault, 'Unit', _p10._0)); + } else { + return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( + function () { + var _p12 = _p10._0; + if (_p12.ctor === 'Nothing') { + return A2( + _elm_lang$core$Basics_ops['++'], + 'Tuple(', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$core$Basics$toString( + _elm_lang$core$List$length(_p10._2)), + ')')); + } else { + return A2(_elm_lang$core$Basics_ops['++'], _p12._0, ' …'); + } + }()); + } + } +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecord = function (record) { + return _elm_lang$core$Dict$isEmpty(record) ? { + ctor: '_Tuple2', + _0: 2, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('{}'), + _1: {ctor: '[]'} + } + } : A3( + _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecordHelp, + 0, + '{ ', + _elm_lang$core$Dict$toList(record)); +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecordHelp = F3( + function (length, starter, entries) { + var _p13 = entries; + if (_p13.ctor === '[]') { + return { + ctor: '_Tuple2', + _0: length + 2, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' }'), + _1: {ctor: '[]'} + } + }; + } else { + var _p16 = _p13._0._0; + var _p14 = _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTiny(_p13._0._1); + var valueLen = _p14._0; + var valueNodes = _p14._1; + var fieldLen = _elm_lang$core$String$length(_p16); + var newLength = ((length + fieldLen) + valueLen) + 5; + if (_elm_lang$core$Native_Utils.cmp(newLength, 60) > 0) { + return { + ctor: '_Tuple2', + _0: length + 4, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', … }'), + _1: {ctor: '[]'} + } + }; + } else { + var _p15 = A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecordHelp, newLength, ', ', _p13._1); + var finalLength = _p15._0; + var otherNodes = _p15._1; + return { + ctor: '_Tuple2', + _0: finalLength, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$purple, + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p16), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' = '), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + {ctor: '[]'}, + valueNodes), + _1: otherNodes + } + } + } + } + }; + } + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTiny = function (value) { + var _p17 = value; + if (_p17.ctor === 'Record') { + return A3( + _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTinyRecord, + 0, + '{', + _elm_lang$core$Dict$keys(_p17._1)); + } else { + return _elm_lang$virtual_dom$VirtualDom_Expando$viewTiny(value); + } +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$Constructor = F3( + function (a, b, c) { + return {ctor: 'Constructor', _0: a, _1: b, _2: c}; + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$Record = F2( + function (a, b) { + return {ctor: 'Record', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary = F2( + function (a, b) { + return {ctor: 'Dictionary', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$Sequence = F3( + function (a, b, c) { + return {ctor: 'Sequence', _0: a, _1: b, _2: c}; + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$initHelp = F2( + function (isOuter, expando) { + var _p18 = expando; + switch (_p18.ctor) { + case 'S': + return expando; + case 'Primitive': + return expando; + case 'Sequence': + var _p20 = _p18._0; + var _p19 = _p18._2; + return isOuter ? A3( + _elm_lang$virtual_dom$VirtualDom_Expando$Sequence, + _p20, + false, + A2( + _elm_lang$core$List$map, + _elm_lang$virtual_dom$VirtualDom_Expando$initHelp(false), + _p19)) : ((_elm_lang$core$Native_Utils.cmp( + _elm_lang$core$List$length(_p19), + 8) < 1) ? A3(_elm_lang$virtual_dom$VirtualDom_Expando$Sequence, _p20, false, _p19) : expando); + case 'Dictionary': + var _p23 = _p18._1; + return isOuter ? A2( + _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, + false, + A2( + _elm_lang$core$List$map, + function (_p21) { + var _p22 = _p21; + return { + ctor: '_Tuple2', + _0: _p22._0, + _1: A2(_elm_lang$virtual_dom$VirtualDom_Expando$initHelp, false, _p22._1) + }; + }, + _p23)) : ((_elm_lang$core$Native_Utils.cmp( + _elm_lang$core$List$length(_p23), + 8) < 1) ? A2(_elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, false, _p23) : expando); + case 'Record': + var _p25 = _p18._1; + return isOuter ? A2( + _elm_lang$virtual_dom$VirtualDom_Expando$Record, + false, + A2( + _elm_lang$core$Dict$map, + F2( + function (_p24, v) { + return A2(_elm_lang$virtual_dom$VirtualDom_Expando$initHelp, false, v); + }), + _p25)) : ((_elm_lang$core$Native_Utils.cmp( + _elm_lang$core$Dict$size(_p25), + 4) < 1) ? A2(_elm_lang$virtual_dom$VirtualDom_Expando$Record, false, _p25) : expando); + default: + var _p27 = _p18._0; + var _p26 = _p18._2; + return isOuter ? A3( + _elm_lang$virtual_dom$VirtualDom_Expando$Constructor, + _p27, + false, + A2( + _elm_lang$core$List$map, + _elm_lang$virtual_dom$VirtualDom_Expando$initHelp(false), + _p26)) : ((_elm_lang$core$Native_Utils.cmp( + _elm_lang$core$List$length(_p26), + 4) < 1) ? A3(_elm_lang$virtual_dom$VirtualDom_Expando$Constructor, _p27, false, _p26) : expando); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$init = function (value) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Expando$initHelp, + true, + _elm_lang$virtual_dom$Native_Debug.init(value)); +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp = F2( + function (old, $new) { + var _p28 = {ctor: '_Tuple2', _0: old, _1: $new}; + _v12_6: + do { + if (_p28.ctor === '_Tuple2') { + switch (_p28._1.ctor) { + case 'S': + return $new; + case 'Primitive': + return $new; + case 'Sequence': + if (_p28._0.ctor === 'Sequence') { + return A3( + _elm_lang$virtual_dom$VirtualDom_Expando$Sequence, + _p28._1._0, + _p28._0._1, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp, _p28._0._2, _p28._1._2)); + } else { + break _v12_6; + } + case 'Dictionary': + if (_p28._0.ctor === 'Dictionary') { + return A2(_elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, _p28._0._0, _p28._1._1); + } else { + break _v12_6; + } + case 'Record': + if (_p28._0.ctor === 'Record') { + return A2( + _elm_lang$virtual_dom$VirtualDom_Expando$Record, + _p28._0._0, + A2( + _elm_lang$core$Dict$map, + _elm_lang$virtual_dom$VirtualDom_Expando$mergeDictHelp(_p28._0._1), + _p28._1._1)); + } else { + break _v12_6; + } + default: + if (_p28._0.ctor === 'Constructor') { + return A3( + _elm_lang$virtual_dom$VirtualDom_Expando$Constructor, + _p28._1._0, + _p28._0._1, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp, _p28._0._2, _p28._1._2)); + } else { + break _v12_6; + } + } + } else { + break _v12_6; + } + } while(false); + return $new; + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$mergeDictHelp = F3( + function (oldDict, key, value) { + var _p29 = A2(_elm_lang$core$Dict$get, key, oldDict); + if (_p29.ctor === 'Nothing') { + return value; + } else { + return A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp, _p29._0, value); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp = F2( + function (olds, news) { + var _p30 = {ctor: '_Tuple2', _0: olds, _1: news}; + if (_p30._0.ctor === '[]') { + return news; + } else { + if (_p30._1.ctor === '[]') { + return news; + } else { + return { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp, _p30._0._0, _p30._1._0), + _1: A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp, _p30._0._1, _p30._1._1) + }; + } + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$merge = F2( + function (value, expando) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp, + expando, + _elm_lang$virtual_dom$Native_Debug.init(value)); + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$update = F2( + function (msg, value) { + var _p31 = value; + switch (_p31.ctor) { + case 'S': + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 168, column: 3}, + end: {line: 235, column: 50} + }, + _p31)('No messages for primitives'); + case 'Primitive': + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 168, column: 3}, + end: {line: 235, column: 50} + }, + _p31)('No messages for primitives'); + case 'Sequence': + var _p39 = _p31._2; + var _p38 = _p31._0; + var _p37 = _p31._1; + var _p34 = msg; + switch (_p34.ctor) { + case 'Toggle': + return A3(_elm_lang$virtual_dom$VirtualDom_Expando$Sequence, _p38, !_p37, _p39); + case 'Index': + if (_p34._0.ctor === 'None') { + return A3( + _elm_lang$virtual_dom$VirtualDom_Expando$Sequence, + _p38, + _p37, + A3( + _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, + _p34._1, + _elm_lang$virtual_dom$VirtualDom_Expando$update(_p34._2), + _p39)); + } else { + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 176, column: 7}, + end: {line: 188, column: 46} + }, + _p34)('No redirected indexes on sequences'); + } + default: + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 176, column: 7}, + end: {line: 188, column: 46} + }, + _p34)('No field on sequences'); + } + case 'Dictionary': + var _p51 = _p31._1; + var _p50 = _p31._0; + var _p40 = msg; + switch (_p40.ctor) { + case 'Toggle': + return A2(_elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, !_p50, _p51); + case 'Index': + var _p48 = _p40._2; + var _p47 = _p40._1; + var _p41 = _p40._0; + switch (_p41.ctor) { + case 'None': + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 196, column: 11}, + end: {line: 206, column: 81} + }, + _p41)('must have redirect for dictionaries'); + case 'Key': + return A2( + _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, + _p50, + A3( + _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, + _p47, + function (_p43) { + var _p44 = _p43; + return { + ctor: '_Tuple2', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, _p48, _p44._0), + _1: _p44._1 + }; + }, + _p51)); + default: + return A2( + _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, + _p50, + A3( + _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, + _p47, + function (_p45) { + var _p46 = _p45; + return { + ctor: '_Tuple2', + _0: _p46._0, + _1: A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, _p48, _p46._1) + }; + }, + _p51)); + } + default: + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 191, column: 7}, + end: {line: 209, column: 50} + }, + _p40)('no field for dictionaries'); + } + case 'Record': + var _p55 = _p31._1; + var _p54 = _p31._0; + var _p52 = msg; + switch (_p52.ctor) { + case 'Toggle': + return A2(_elm_lang$virtual_dom$VirtualDom_Expando$Record, !_p54, _p55); + case 'Index': + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 212, column: 7}, + end: {line: 220, column: 77} + }, + _p52)('No index for records'); + default: + return A2( + _elm_lang$virtual_dom$VirtualDom_Expando$Record, + _p54, + A3( + _elm_lang$core$Dict$update, + _p52._0, + _elm_lang$virtual_dom$VirtualDom_Expando$updateField(_p52._1), + _p55)); + } + default: + var _p61 = _p31._2; + var _p60 = _p31._0; + var _p59 = _p31._1; + var _p56 = msg; + switch (_p56.ctor) { + case 'Toggle': + return A3(_elm_lang$virtual_dom$VirtualDom_Expando$Constructor, _p60, !_p59, _p61); + case 'Index': + if (_p56._0.ctor === 'None') { + return A3( + _elm_lang$virtual_dom$VirtualDom_Expando$Constructor, + _p60, + _p59, + A3( + _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, + _p56._1, + _elm_lang$virtual_dom$VirtualDom_Expando$update(_p56._2), + _p61)); + } else { + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 223, column: 7}, + end: {line: 235, column: 50} + }, + _p56)('No redirected indexes on sequences'); + } + default: + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 223, column: 7}, + end: {line: 235, column: 50} + }, + _p56)('No field for constructors'); + } + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$updateField = F2( + function (msg, maybeExpando) { + var _p62 = maybeExpando; + if (_p62.ctor === 'Nothing') { + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Expando', + { + start: {line: 253, column: 3}, + end: {line: 258, column: 32} + }, + _p62)('key does not exist'); + } else { + return _elm_lang$core$Maybe$Just( + A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, msg, _p62._0)); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$Primitive = function (a) { + return {ctor: 'Primitive', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$S = function (a) { + return {ctor: 'S', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$ArraySeq = {ctor: 'ArraySeq'}; +var _elm_lang$virtual_dom$VirtualDom_Expando$SetSeq = {ctor: 'SetSeq'}; +var _elm_lang$virtual_dom$VirtualDom_Expando$ListSeq = {ctor: 'ListSeq'}; +var _elm_lang$virtual_dom$VirtualDom_Expando$Field = F2( + function (a, b) { + return {ctor: 'Field', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$Index = F3( + function (a, b, c) { + return {ctor: 'Index', _0: a, _1: b, _2: c}; + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$Toggle = {ctor: 'Toggle'}; +var _elm_lang$virtual_dom$VirtualDom_Expando$Value = {ctor: 'Value'}; +var _elm_lang$virtual_dom$VirtualDom_Expando$Key = {ctor: 'Key'}; +var _elm_lang$virtual_dom$VirtualDom_Expando$None = {ctor: 'None'}; +var _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorEntry = F2( + function (index, value) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, index), + A2( + _elm_lang$virtual_dom$VirtualDom_Expando$view, + _elm_lang$core$Maybe$Just( + _elm_lang$core$Basics$toString(index)), + value)); + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$view = F2( + function (maybeKey, expando) { + var _p64 = expando; + switch (_p64.ctor) { + case 'S': + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), + _1: {ctor: '[]'} + }, + A3( + _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, + maybeKey, + _elm_lang$core$Maybe$Nothing, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$red, + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p64._0), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + })); + case 'Primitive': + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), + _1: {ctor: '[]'} + }, + A3( + _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, + maybeKey, + _elm_lang$core$Maybe$Nothing, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$blue, + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p64._0), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + })); + case 'Sequence': + return A4(_elm_lang$virtual_dom$VirtualDom_Expando$viewSequence, maybeKey, _p64._0, _p64._1, _p64._2); + case 'Dictionary': + return A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewDictionary, maybeKey, _p64._0, _p64._1); + case 'Record': + return A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewRecord, maybeKey, _p64._0, _p64._1); + default: + return A4(_elm_lang$virtual_dom$VirtualDom_Expando$viewConstructor, maybeKey, _p64._0, _p64._1, _p64._2); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructor = F4( + function (maybeKey, maybeName, isClosed, valueList) { + var _p65 = function () { + var _p66 = valueList; + if (_p66.ctor === '[]') { + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Nothing, + _1: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + {ctor: '[]'}) + }; + } else { + if (_p66._1.ctor === '[]') { + var _p67 = _p66._0; + switch (_p67.ctor) { + case 'S': + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Nothing, + _1: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + {ctor: '[]'}) + }; + case 'Primitive': + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Nothing, + _1: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + {ctor: '[]'}) + }; + case 'Sequence': + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Just(isClosed), + _1: isClosed ? A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + {ctor: '[]'}) : A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), + _elm_lang$virtual_dom$VirtualDom_Expando$viewSequenceOpen(_p67._2)) + }; + case 'Dictionary': + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Just(isClosed), + _1: isClosed ? A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + {ctor: '[]'}) : A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), + _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryOpen(_p67._1)) + }; + case 'Record': + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Just(isClosed), + _1: isClosed ? A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + {ctor: '[]'}) : A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), + _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordOpen(_p67._1)) + }; + default: + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Just(isClosed), + _1: isClosed ? A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + {ctor: '[]'}) : A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), + _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorOpen(_p67._2)) + }; + } + } else { + return { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Just(isClosed), + _1: isClosed ? A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + {ctor: '[]'}) : _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorOpen(valueList) + }; + } + } + }(); + var maybeIsClosed = _p65._0; + var openHtml = _p65._1; + var tinyArgs = A2( + _elm_lang$core$List$map, + function (_p68) { + return _elm_lang$core$Tuple$second( + _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTiny(_p68)); + }, + valueList); + var description = function () { + var _p69 = {ctor: '_Tuple2', _0: maybeName, _1: tinyArgs}; + if (_p69._0.ctor === 'Nothing') { + if (_p69._1.ctor === '[]') { + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('()'), + _1: {ctor: '[]'} + }; + } else { + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('( '), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + {ctor: '[]'}, + _p69._1._0), + _1: A3( + _elm_lang$core$List$foldr, + F2( + function (args, rest) { + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', '), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + {ctor: '[]'}, + args), + _1: rest + } + }; + }), + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' )'), + _1: {ctor: '[]'} + }, + _p69._1._1) + } + }; + } + } else { + if (_p69._1.ctor === '[]') { + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p69._0._0), + _1: {ctor: '[]'} + }; + } else { + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( + A2(_elm_lang$core$Basics_ops['++'], _p69._0._0, ' ')), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + {ctor: '[]'}, + _p69._1._0), + _1: A3( + _elm_lang$core$List$foldr, + F2( + function (args, rest) { + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' '), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + {ctor: '[]'}, + args), + _1: rest + } + }; + }), + {ctor: '[]'}, + _p69._1._1) + } + }; + } + } + }(); + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), + _1: {ctor: '[]'} + }, + A3(_elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, maybeKey, maybeIsClosed, description)), + _1: { + ctor: '::', + _0: openHtml, + _1: {ctor: '[]'} + } + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorOpen = function (valueList) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + A2(_elm_lang$core$List$indexedMap, _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorEntry, valueList)); +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryOpen = function (keyValuePairs) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + A2(_elm_lang$core$List$indexedMap, _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryEntry, keyValuePairs)); +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryEntry = F2( + function (index, _p70) { + var _p71 = _p70; + var _p74 = _p71._1; + var _p73 = _p71._0; + var _p72 = _p73; + switch (_p72.ctor) { + case 'S': + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Value, index), + A2( + _elm_lang$virtual_dom$VirtualDom_Expando$view, + _elm_lang$core$Maybe$Just(_p72._0), + _p74)); + case 'Primitive': + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Value, index), + A2( + _elm_lang$virtual_dom$VirtualDom_Expando$view, + _elm_lang$core$Maybe$Just(_p72._0), + _p74)); + default: + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Key, index), + A2( + _elm_lang$virtual_dom$VirtualDom_Expando$view, + _elm_lang$core$Maybe$Just('key'), + _p73)), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Value, index), + A2( + _elm_lang$virtual_dom$VirtualDom_Expando$view, + _elm_lang$core$Maybe$Just('value'), + _p74)), + _1: {ctor: '[]'} + } + }); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordOpen = function (record) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + A2( + _elm_lang$core$List$map, + _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordEntry, + _elm_lang$core$Dict$toList(record))); +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordEntry = function (_p75) { + var _p76 = _p75; + var _p77 = _p76._0; + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + _elm_lang$virtual_dom$VirtualDom_Expando$Field(_p77), + A2( + _elm_lang$virtual_dom$VirtualDom_Expando$view, + _elm_lang$core$Maybe$Just(_p77), + _p76._1)); +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$viewSequenceOpen = function (values) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + A2(_elm_lang$core$List$indexedMap, _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorEntry, values)); +}; +var _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionary = F3( + function (maybeKey, isClosed, keyValuePairs) { + var starter = A2( + _elm_lang$core$Basics_ops['++'], + 'Dict(', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$core$Basics$toString( + _elm_lang$core$List$length(keyValuePairs)), + ')')); + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), + _1: {ctor: '[]'} + }, + A3( + _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, + maybeKey, + _elm_lang$core$Maybe$Just(isClosed), + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), + _1: {ctor: '[]'} + })), + _1: { + ctor: '::', + _0: isClosed ? _elm_lang$virtual_dom$VirtualDom_Helpers$text('') : _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryOpen(keyValuePairs), + _1: {ctor: '[]'} + } + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$viewRecord = F3( + function (maybeKey, isClosed, record) { + var _p78 = isClosed ? { + ctor: '_Tuple3', + _0: _elm_lang$core$Tuple$second( + _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecord(record)), + _1: _elm_lang$virtual_dom$VirtualDom_Helpers$text(''), + _2: _elm_lang$virtual_dom$VirtualDom_Helpers$text('') + } : { + ctor: '_Tuple3', + _0: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('{'), + _1: {ctor: '[]'} + }, + _1: _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordOpen(record), + _2: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad( + _elm_lang$core$Maybe$Just( + {ctor: '_Tuple0'})), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('}'), + _1: {ctor: '[]'} + }) + }; + var start = _p78._0; + var middle = _p78._1; + var end = _p78._2; + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), + _1: {ctor: '[]'} + }, + A3( + _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, + maybeKey, + _elm_lang$core$Maybe$Just(isClosed), + start)), + _1: { + ctor: '::', + _0: middle, + _1: { + ctor: '::', + _0: end, + _1: {ctor: '[]'} + } + } + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Expando$viewSequence = F4( + function (maybeKey, seqType, isClosed, valueList) { + var starter = A2( + _elm_lang$virtual_dom$VirtualDom_Expando$seqTypeToString, + _elm_lang$core$List$length(valueList), + seqType); + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), + _1: {ctor: '[]'} + }, + A3( + _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, + maybeKey, + _elm_lang$core$Maybe$Just(isClosed), + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), + _1: {ctor: '[]'} + })), + _1: { + ctor: '::', + _0: isClosed ? _elm_lang$virtual_dom$VirtualDom_Helpers$text('') : _elm_lang$virtual_dom$VirtualDom_Expando$viewSequenceOpen(valueList), + _1: {ctor: '[]'} + } + }); + }); + +var _elm_lang$virtual_dom$VirtualDom_Report$some = function (list) { + return !_elm_lang$core$List$isEmpty(list); +}; +var _elm_lang$virtual_dom$VirtualDom_Report$TagChanges = F4( + function (a, b, c, d) { + return {removed: a, changed: b, added: c, argsMatch: d}; + }); +var _elm_lang$virtual_dom$VirtualDom_Report$emptyTagChanges = function (argsMatch) { + return A4( + _elm_lang$virtual_dom$VirtualDom_Report$TagChanges, + {ctor: '[]'}, + {ctor: '[]'}, + {ctor: '[]'}, + argsMatch); +}; +var _elm_lang$virtual_dom$VirtualDom_Report$hasTagChanges = function (tagChanges) { + return _elm_lang$core$Native_Utils.eq( + tagChanges, + A4( + _elm_lang$virtual_dom$VirtualDom_Report$TagChanges, + {ctor: '[]'}, + {ctor: '[]'}, + {ctor: '[]'}, + true)); +}; +var _elm_lang$virtual_dom$VirtualDom_Report$SomethingChanged = function (a) { + return {ctor: 'SomethingChanged', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Report$MessageChanged = F2( + function (a, b) { + return {ctor: 'MessageChanged', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Report$VersionChanged = F2( + function (a, b) { + return {ctor: 'VersionChanged', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Report$CorruptHistory = {ctor: 'CorruptHistory'}; +var _elm_lang$virtual_dom$VirtualDom_Report$UnionChange = F2( + function (a, b) { + return {ctor: 'UnionChange', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Report$AliasChange = function (a) { + return {ctor: 'AliasChange', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Report$Fine = {ctor: 'Fine'}; +var _elm_lang$virtual_dom$VirtualDom_Report$Risky = {ctor: 'Risky'}; +var _elm_lang$virtual_dom$VirtualDom_Report$Impossible = {ctor: 'Impossible'}; +var _elm_lang$virtual_dom$VirtualDom_Report$worstCase = F2( + function (status, statusList) { + worstCase: + while (true) { + var _p0 = statusList; + if (_p0.ctor === '[]') { + return status; + } else { + switch (_p0._0.ctor) { + case 'Impossible': + return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; + case 'Risky': + var _v1 = _elm_lang$virtual_dom$VirtualDom_Report$Risky, + _v2 = _p0._1; + status = _v1; + statusList = _v2; + continue worstCase; + default: + var _v3 = status, + _v4 = _p0._1; + status = _v3; + statusList = _v4; + continue worstCase; + } + } + } + }); +var _elm_lang$virtual_dom$VirtualDom_Report$evaluateChange = function (change) { + var _p1 = change; + if (_p1.ctor === 'AliasChange') { + return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; + } else { + return ((!_p1._1.argsMatch) || (_elm_lang$virtual_dom$VirtualDom_Report$some(_p1._1.changed) || _elm_lang$virtual_dom$VirtualDom_Report$some(_p1._1.removed))) ? _elm_lang$virtual_dom$VirtualDom_Report$Impossible : (_elm_lang$virtual_dom$VirtualDom_Report$some(_p1._1.added) ? _elm_lang$virtual_dom$VirtualDom_Report$Risky : _elm_lang$virtual_dom$VirtualDom_Report$Fine); + } +}; +var _elm_lang$virtual_dom$VirtualDom_Report$evaluate = function (report) { + var _p2 = report; + switch (_p2.ctor) { + case 'CorruptHistory': + return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; + case 'VersionChanged': + return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; + case 'MessageChanged': + return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; + default: + return A2( + _elm_lang$virtual_dom$VirtualDom_Report$worstCase, + _elm_lang$virtual_dom$VirtualDom_Report$Fine, + A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Report$evaluateChange, _p2._0)); + } +}; + +var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict = F2( + function (f, dict) { + return _elm_lang$core$Json_Encode$object( + _elm_lang$core$Dict$toList( + A2( + _elm_lang$core$Dict$map, + F2( + function (key, value) { + return f(value); + }), + dict))); + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeUnion = function (_p0) { + var _p1 = _p0; + return _elm_lang$core$Json_Encode$object( + { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'args', + _1: _elm_lang$core$Json_Encode$list( + A2(_elm_lang$core$List$map, _elm_lang$core$Json_Encode$string, _p1.args)) + }, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'tags', + _1: A2( + _elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict, + function (_p2) { + return _elm_lang$core$Json_Encode$list( + A2(_elm_lang$core$List$map, _elm_lang$core$Json_Encode$string, _p2)); + }, + _p1.tags) + }, + _1: {ctor: '[]'} + } + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeAlias = function (_p3) { + var _p4 = _p3; + return _elm_lang$core$Json_Encode$object( + { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'args', + _1: _elm_lang$core$Json_Encode$list( + A2(_elm_lang$core$List$map, _elm_lang$core$Json_Encode$string, _p4.args)) + }, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'type', + _1: _elm_lang$core$Json_Encode$string(_p4.tipe) + }, + _1: {ctor: '[]'} + } + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeTypes = function (_p5) { + var _p6 = _p5; + return _elm_lang$core$Json_Encode$object( + { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'message', + _1: _elm_lang$core$Json_Encode$string(_p6.message) + }, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'aliases', + _1: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict, _elm_lang$virtual_dom$VirtualDom_Metadata$encodeAlias, _p6.aliases) + }, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'unions', + _1: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict, _elm_lang$virtual_dom$VirtualDom_Metadata$encodeUnion, _p6.unions) + }, + _1: {ctor: '[]'} + } + } + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeVersions = function (_p7) { + var _p8 = _p7; + return _elm_lang$core$Json_Encode$object( + { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'elm', + _1: _elm_lang$core$Json_Encode$string(_p8.elm) + }, + _1: {ctor: '[]'} + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$encode = function (_p9) { + var _p10 = _p9; + return _elm_lang$core$Json_Encode$object( + { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'versions', + _1: _elm_lang$virtual_dom$VirtualDom_Metadata$encodeVersions(_p10.versions) + }, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'types', + _1: _elm_lang$virtual_dom$VirtualDom_Metadata$encodeTypes(_p10.types) + }, + _1: {ctor: '[]'} + } + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$checkTag = F4( + function (tag, old, $new, changes) { + return _elm_lang$core$Native_Utils.eq(old, $new) ? changes : _elm_lang$core$Native_Utils.update( + changes, + { + changed: {ctor: '::', _0: tag, _1: changes.changed} + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$addTag = F3( + function (tag, _p11, changes) { + return _elm_lang$core$Native_Utils.update( + changes, + { + added: {ctor: '::', _0: tag, _1: changes.added} + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$removeTag = F3( + function (tag, _p12, changes) { + return _elm_lang$core$Native_Utils.update( + changes, + { + removed: {ctor: '::', _0: tag, _1: changes.removed} + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$checkUnion = F4( + function (name, old, $new, changes) { + var tagChanges = A6( + _elm_lang$core$Dict$merge, + _elm_lang$virtual_dom$VirtualDom_Metadata$removeTag, + _elm_lang$virtual_dom$VirtualDom_Metadata$checkTag, + _elm_lang$virtual_dom$VirtualDom_Metadata$addTag, + old.tags, + $new.tags, + _elm_lang$virtual_dom$VirtualDom_Report$emptyTagChanges( + _elm_lang$core$Native_Utils.eq(old.args, $new.args))); + return _elm_lang$virtual_dom$VirtualDom_Report$hasTagChanges(tagChanges) ? changes : { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Report$UnionChange, name, tagChanges), + _1: changes + }; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$checkAlias = F4( + function (name, old, $new, changes) { + return (_elm_lang$core$Native_Utils.eq(old.tipe, $new.tipe) && _elm_lang$core$Native_Utils.eq(old.args, $new.args)) ? changes : { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Report$AliasChange(name), + _1: changes + }; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$ignore = F3( + function (key, value, report) { + return report; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$checkTypes = F2( + function (old, $new) { + return (!_elm_lang$core$Native_Utils.eq(old.message, $new.message)) ? A2(_elm_lang$virtual_dom$VirtualDom_Report$MessageChanged, old.message, $new.message) : _elm_lang$virtual_dom$VirtualDom_Report$SomethingChanged( + A6( + _elm_lang$core$Dict$merge, + _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, + _elm_lang$virtual_dom$VirtualDom_Metadata$checkUnion, + _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, + old.unions, + $new.unions, + A6( + _elm_lang$core$Dict$merge, + _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, + _elm_lang$virtual_dom$VirtualDom_Metadata$checkAlias, + _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, + old.aliases, + $new.aliases, + {ctor: '[]'}))); + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$check = F2( + function (old, $new) { + return (!_elm_lang$core$Native_Utils.eq(old.versions.elm, $new.versions.elm)) ? A2(_elm_lang$virtual_dom$VirtualDom_Report$VersionChanged, old.versions.elm, $new.versions.elm) : A2(_elm_lang$virtual_dom$VirtualDom_Metadata$checkTypes, old.types, $new.types); + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$hasProblem = F2( + function (tipe, _p13) { + var _p14 = _p13; + return A2(_elm_lang$core$String$contains, _p14._1, tipe) ? _elm_lang$core$Maybe$Just(_p14._0) : _elm_lang$core$Maybe$Nothing; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$Metadata = F2( + function (a, b) { + return {versions: a, types: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$Versions = function (a) { + return {elm: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeVersions = A2( + _elm_lang$core$Json_Decode$map, + _elm_lang$virtual_dom$VirtualDom_Metadata$Versions, + A2(_elm_lang$core$Json_Decode$field, 'elm', _elm_lang$core$Json_Decode$string)); +var _elm_lang$virtual_dom$VirtualDom_Metadata$Types = F3( + function (a, b, c) { + return {message: a, aliases: b, unions: c}; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$Alias = F2( + function (a, b) { + return {args: a, tipe: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeAlias = A3( + _elm_lang$core$Json_Decode$map2, + _elm_lang$virtual_dom$VirtualDom_Metadata$Alias, + A2( + _elm_lang$core$Json_Decode$field, + 'args', + _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string)), + A2(_elm_lang$core$Json_Decode$field, 'type', _elm_lang$core$Json_Decode$string)); +var _elm_lang$virtual_dom$VirtualDom_Metadata$Union = F2( + function (a, b) { + return {args: a, tags: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeUnion = A3( + _elm_lang$core$Json_Decode$map2, + _elm_lang$virtual_dom$VirtualDom_Metadata$Union, + A2( + _elm_lang$core$Json_Decode$field, + 'args', + _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string)), + A2( + _elm_lang$core$Json_Decode$field, + 'tags', + _elm_lang$core$Json_Decode$dict( + _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string)))); +var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeTypes = A4( + _elm_lang$core$Json_Decode$map3, + _elm_lang$virtual_dom$VirtualDom_Metadata$Types, + A2(_elm_lang$core$Json_Decode$field, 'message', _elm_lang$core$Json_Decode$string), + A2( + _elm_lang$core$Json_Decode$field, + 'aliases', + _elm_lang$core$Json_Decode$dict(_elm_lang$virtual_dom$VirtualDom_Metadata$decodeAlias)), + A2( + _elm_lang$core$Json_Decode$field, + 'unions', + _elm_lang$core$Json_Decode$dict(_elm_lang$virtual_dom$VirtualDom_Metadata$decodeUnion))); +var _elm_lang$virtual_dom$VirtualDom_Metadata$decoder = A3( + _elm_lang$core$Json_Decode$map2, + _elm_lang$virtual_dom$VirtualDom_Metadata$Metadata, + A2(_elm_lang$core$Json_Decode$field, 'versions', _elm_lang$virtual_dom$VirtualDom_Metadata$decodeVersions), + A2(_elm_lang$core$Json_Decode$field, 'types', _elm_lang$virtual_dom$VirtualDom_Metadata$decodeTypes)); +var _elm_lang$virtual_dom$VirtualDom_Metadata$Error = F2( + function (a, b) { + return {message: a, problems: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$ProblemType = F2( + function (a, b) { + return {name: a, problems: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$VirtualDom = {ctor: 'VirtualDom'}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$Program = {ctor: 'Program'}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$Request = {ctor: 'Request'}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$Socket = {ctor: 'Socket'}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$Process = {ctor: 'Process'}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$Task = {ctor: 'Task'}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$Decoder = {ctor: 'Decoder'}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$Function = {ctor: 'Function'}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$problemTable = { + ctor: '::', + _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Function, _1: '->'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Decoder, _1: 'Json.Decode.Decoder'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Task, _1: 'Task.Task'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Process, _1: 'Process.Id'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Socket, _1: 'WebSocket.LowLevel.WebSocket'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Request, _1: 'Http.Request'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Program, _1: 'Platform.Program'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$VirtualDom, _1: 'VirtualDom.Node'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$VirtualDom, _1: 'VirtualDom.Attribute'}, + _1: {ctor: '[]'} + } + } + } + } + } + } + } + } +}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$findProblems = function (tipe) { + return A2( + _elm_lang$core$List$filterMap, + _elm_lang$virtual_dom$VirtualDom_Metadata$hasProblem(tipe), + _elm_lang$virtual_dom$VirtualDom_Metadata$problemTable); +}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadAliases = F3( + function (name, _p15, list) { + var _p16 = _p15; + var _p17 = _elm_lang$virtual_dom$VirtualDom_Metadata$findProblems(_p16.tipe); + if (_p17.ctor === '[]') { + return list; + } else { + return { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$ProblemType, name, _p17), + _1: list + }; + } + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadUnions = F3( + function (name, _p18, list) { + var _p19 = _p18; + var _p20 = A2( + _elm_lang$core$List$concatMap, + _elm_lang$virtual_dom$VirtualDom_Metadata$findProblems, + _elm_lang$core$List$concat( + _elm_lang$core$Dict$values(_p19.tags))); + if (_p20.ctor === '[]') { + return list; + } else { + return { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$ProblemType, name, _p20), + _1: list + }; + } + }); +var _elm_lang$virtual_dom$VirtualDom_Metadata$isPortable = function (_p21) { + var _p22 = _p21; + var _p24 = _p22.types; + var badAliases = A3( + _elm_lang$core$Dict$foldl, + _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadAliases, + {ctor: '[]'}, + _p24.aliases); + var _p23 = A3(_elm_lang$core$Dict$foldl, _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadUnions, badAliases, _p24.unions); + if (_p23.ctor === '[]') { + return _elm_lang$core$Maybe$Nothing; + } else { + return _elm_lang$core$Maybe$Just( + A2(_elm_lang$virtual_dom$VirtualDom_Metadata$Error, _p24.message, _p23)); + } +}; +var _elm_lang$virtual_dom$VirtualDom_Metadata$decode = function (value) { + var _p25 = A2(_elm_lang$core$Json_Decode$decodeValue, _elm_lang$virtual_dom$VirtualDom_Metadata$decoder, value); + if (_p25.ctor === 'Err') { + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.Metadata', + { + start: {line: 229, column: 3}, + end: {line: 239, column: 20} + }, + _p25)('Compiler is generating bad metadata. Report this at .'); + } else { + var _p28 = _p25._0; + var _p27 = _elm_lang$virtual_dom$VirtualDom_Metadata$isPortable(_p28); + if (_p27.ctor === 'Nothing') { + return _elm_lang$core$Result$Ok(_p28); + } else { + return _elm_lang$core$Result$Err(_p27._0); + } + } +}; + +var _elm_lang$virtual_dom$VirtualDom_History$viewMessage = F3( + function (currentIndex, index, msg) { + var messageName = _elm_lang$virtual_dom$Native_Debug.messageToString(msg); + var className = _elm_lang$core$Native_Utils.eq(currentIndex, index) ? 'messages-entry messages-entry-selected' : 'messages-entry'; + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class(className), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$on, + 'click', + _elm_lang$core$Json_Decode$succeed(index)), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('messages-entry-content'), + _1: { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Helpers$attribute, 'title', messageName), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(messageName), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('messages-entry-index'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( + _elm_lang$core$Basics$toString(index)), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + }); + }); +var _elm_lang$virtual_dom$VirtualDom_History$consMsg = F3( + function (currentIndex, msg, _p0) { + var _p1 = _p0; + var _p2 = _p1._0; + return { + ctor: '_Tuple2', + _0: _p2 - 1, + _1: { + ctor: '::', + _0: A4(_elm_lang$virtual_dom$VirtualDom_Helpers$lazy3, _elm_lang$virtual_dom$VirtualDom_History$viewMessage, currentIndex, _p2, msg), + _1: _p1._1 + } + }; + }); +var _elm_lang$virtual_dom$VirtualDom_History$viewSnapshot = F3( + function (currentIndex, index, _p3) { + var _p4 = _p3; + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + _elm_lang$core$Tuple$second( + A3( + _elm_lang$core$Array$foldl, + _elm_lang$virtual_dom$VirtualDom_History$consMsg(currentIndex), + { + ctor: '_Tuple2', + _0: index - 1, + _1: {ctor: '[]'} + }, + _p4.messages))); + }); +var _elm_lang$virtual_dom$VirtualDom_History$undone = function (getResult) { + var _p5 = getResult; + if (_p5.ctor === 'Done') { + return {ctor: '_Tuple2', _0: _p5._1, _1: _p5._0}; + } else { + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.History', + { + start: {line: 195, column: 3}, + end: {line: 200, column: 39} + }, + _p5)('Bug in History.get'); + } +}; +var _elm_lang$virtual_dom$VirtualDom_History$elmToJs = _elm_lang$virtual_dom$Native_Debug.unsafeCoerce; +var _elm_lang$virtual_dom$VirtualDom_History$encodeHelp = F2( + function (snapshot, allMessages) { + return A3( + _elm_lang$core$Array$foldl, + F2( + function (elm, msgs) { + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_History$elmToJs(elm), + _1: msgs + }; + }), + allMessages, + snapshot.messages); + }); +var _elm_lang$virtual_dom$VirtualDom_History$encode = function (_p7) { + var _p8 = _p7; + var recentJson = A2( + _elm_lang$core$List$map, + _elm_lang$virtual_dom$VirtualDom_History$elmToJs, + _elm_lang$core$List$reverse(_p8.recent.messages)); + return _elm_lang$core$Json_Encode$list( + A3(_elm_lang$core$Array$foldr, _elm_lang$virtual_dom$VirtualDom_History$encodeHelp, recentJson, _p8.snapshots)); +}; +var _elm_lang$virtual_dom$VirtualDom_History$jsToElm = _elm_lang$virtual_dom$Native_Debug.unsafeCoerce; +var _elm_lang$virtual_dom$VirtualDom_History$initialModel = function (_p9) { + var _p10 = _p9; + var _p11 = A2(_elm_lang$core$Array$get, 0, _p10.snapshots); + if (_p11.ctor === 'Just') { + return _p11._0.model; + } else { + return _p10.recent.model; + } +}; +var _elm_lang$virtual_dom$VirtualDom_History$size = function (history) { + return history.numMessages; +}; +var _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize = 64; +var _elm_lang$virtual_dom$VirtualDom_History$consSnapshot = F3( + function (currentIndex, snapshot, _p12) { + var _p13 = _p12; + var _p14 = _p13._0; + var nextIndex = _p14 - _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize; + var currentIndexHelp = ((_elm_lang$core$Native_Utils.cmp(nextIndex, currentIndex) < 1) && (_elm_lang$core$Native_Utils.cmp(currentIndex, _p14) < 0)) ? currentIndex : -1; + return { + ctor: '_Tuple2', + _0: _p14 - _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize, + _1: { + ctor: '::', + _0: A4(_elm_lang$virtual_dom$VirtualDom_Helpers$lazy3, _elm_lang$virtual_dom$VirtualDom_History$viewSnapshot, currentIndexHelp, _p14, snapshot), + _1: _p13._1 + } + }; + }); +var _elm_lang$virtual_dom$VirtualDom_History$viewSnapshots = F2( + function (currentIndex, snapshots) { + var highIndex = _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize * _elm_lang$core$Array$length(snapshots); + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + {ctor: '[]'}, + _elm_lang$core$Tuple$second( + A3( + _elm_lang$core$Array$foldr, + _elm_lang$virtual_dom$VirtualDom_History$consSnapshot(currentIndex), + { + ctor: '_Tuple2', + _0: highIndex, + _1: {ctor: '[]'} + }, + snapshots))); + }); +var _elm_lang$virtual_dom$VirtualDom_History$view = F2( + function (maybeIndex, _p15) { + var _p16 = _p15; + var _p17 = function () { + var _p18 = maybeIndex; + if (_p18.ctor === 'Nothing') { + return {ctor: '_Tuple2', _0: -1, _1: 'debugger-sidebar-messages'}; + } else { + return {ctor: '_Tuple2', _0: _p18._0, _1: 'debugger-sidebar-messages-paused'}; + } + }(); + var index = _p17._0; + var className = _p17._1; + var oldStuff = A3(_elm_lang$virtual_dom$VirtualDom_Helpers$lazy2, _elm_lang$virtual_dom$VirtualDom_History$viewSnapshots, index, _p16.snapshots); + var newStuff = _elm_lang$core$Tuple$second( + A3( + _elm_lang$core$List$foldl, + _elm_lang$virtual_dom$VirtualDom_History$consMsg(index), + { + ctor: '_Tuple2', + _0: _p16.numMessages - 1, + _1: {ctor: '[]'} + }, + _p16.recent.messages)); + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class(className), + _1: {ctor: '[]'} + }, + {ctor: '::', _0: oldStuff, _1: newStuff}); + }); +var _elm_lang$virtual_dom$VirtualDom_History$History = F3( + function (a, b, c) { + return {snapshots: a, recent: b, numMessages: c}; + }); +var _elm_lang$virtual_dom$VirtualDom_History$RecentHistory = F3( + function (a, b, c) { + return {model: a, messages: b, numMessages: c}; + }); +var _elm_lang$virtual_dom$VirtualDom_History$empty = function (model) { + return A3( + _elm_lang$virtual_dom$VirtualDom_History$History, + _elm_lang$core$Array$empty, + A3( + _elm_lang$virtual_dom$VirtualDom_History$RecentHistory, + model, + {ctor: '[]'}, + 0), + 0); +}; +var _elm_lang$virtual_dom$VirtualDom_History$Snapshot = F2( + function (a, b) { + return {model: a, messages: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_History$addRecent = F3( + function (msg, newModel, _p19) { + var _p20 = _p19; + var _p23 = _p20.numMessages; + var _p22 = _p20.model; + var _p21 = _p20.messages; + return _elm_lang$core$Native_Utils.eq(_p23, _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize) ? { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Just( + A2( + _elm_lang$virtual_dom$VirtualDom_History$Snapshot, + _p22, + _elm_lang$core$Array$fromList(_p21))), + _1: A3( + _elm_lang$virtual_dom$VirtualDom_History$RecentHistory, + newModel, + { + ctor: '::', + _0: msg, + _1: {ctor: '[]'} + }, + 1) + } : { + ctor: '_Tuple2', + _0: _elm_lang$core$Maybe$Nothing, + _1: A3( + _elm_lang$virtual_dom$VirtualDom_History$RecentHistory, + _p22, + {ctor: '::', _0: msg, _1: _p21}, + _p23 + 1) + }; + }); +var _elm_lang$virtual_dom$VirtualDom_History$add = F3( + function (msg, model, _p24) { + var _p25 = _p24; + var _p28 = _p25.snapshots; + var _p27 = _p25.numMessages; + var _p26 = A3(_elm_lang$virtual_dom$VirtualDom_History$addRecent, msg, model, _p25.recent); + if (_p26._0.ctor === 'Just') { + return A3( + _elm_lang$virtual_dom$VirtualDom_History$History, + A2(_elm_lang$core$Array$push, _p26._0._0, _p28), + _p26._1, + _p27 + 1); + } else { + return A3(_elm_lang$virtual_dom$VirtualDom_History$History, _p28, _p26._1, _p27 + 1); + } + }); +var _elm_lang$virtual_dom$VirtualDom_History$decoder = F2( + function (initialModel, update) { + var addMessage = F2( + function (rawMsg, _p29) { + var _p30 = _p29; + var _p31 = _p30._0; + var msg = _elm_lang$virtual_dom$VirtualDom_History$jsToElm(rawMsg); + return { + ctor: '_Tuple2', + _0: A2(update, msg, _p31), + _1: A3(_elm_lang$virtual_dom$VirtualDom_History$add, msg, _p31, _p30._1) + }; + }); + var updateModel = function (rawMsgs) { + return A3( + _elm_lang$core$List$foldl, + addMessage, + { + ctor: '_Tuple2', + _0: initialModel, + _1: _elm_lang$virtual_dom$VirtualDom_History$empty(initialModel) + }, + rawMsgs); + }; + return A2( + _elm_lang$core$Json_Decode$map, + updateModel, + _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$value)); + }); +var _elm_lang$virtual_dom$VirtualDom_History$Done = F2( + function (a, b) { + return {ctor: 'Done', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_History$Stepping = F2( + function (a, b) { + return {ctor: 'Stepping', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_History$getHelp = F3( + function (update, msg, getResult) { + var _p32 = getResult; + if (_p32.ctor === 'Done') { + return getResult; + } else { + var _p34 = _p32._0; + var _p33 = _p32._1; + return _elm_lang$core$Native_Utils.eq(_p34, 0) ? A2( + _elm_lang$virtual_dom$VirtualDom_History$Done, + msg, + _elm_lang$core$Tuple$first( + A2(update, msg, _p33))) : A2( + _elm_lang$virtual_dom$VirtualDom_History$Stepping, + _p34 - 1, + _elm_lang$core$Tuple$first( + A2(update, msg, _p33))); + } + }); +var _elm_lang$virtual_dom$VirtualDom_History$get = F3( + function (update, index, _p35) { + var _p36 = _p35; + var _p39 = _p36.recent; + var snapshotMax = _p36.numMessages - _p39.numMessages; + if (_elm_lang$core$Native_Utils.cmp(index, snapshotMax) > -1) { + return _elm_lang$virtual_dom$VirtualDom_History$undone( + A3( + _elm_lang$core$List$foldr, + _elm_lang$virtual_dom$VirtualDom_History$getHelp(update), + A2(_elm_lang$virtual_dom$VirtualDom_History$Stepping, index - snapshotMax, _p39.model), + _p39.messages)); + } else { + var _p37 = A2(_elm_lang$core$Array$get, (index / _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize) | 0, _p36.snapshots); + if (_p37.ctor === 'Nothing') { + return _elm_lang$core$Native_Utils.crashCase( + 'VirtualDom.History', + { + start: {line: 165, column: 7}, + end: {line: 171, column: 95} + }, + _p37)('UI should only let you ask for real indexes!'); + } else { + return _elm_lang$virtual_dom$VirtualDom_History$undone( + A3( + _elm_lang$core$Array$foldr, + _elm_lang$virtual_dom$VirtualDom_History$getHelp(update), + A2( + _elm_lang$virtual_dom$VirtualDom_History$Stepping, + A2(_elm_lang$core$Basics$rem, index, _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize), + _p37._0.model), + _p37._0.messages)); + } + } + }); + +var _elm_lang$virtual_dom$VirtualDom_Overlay$styles = A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'style', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('\n\n.elm-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: white;\n pointer-events: none;\n font-family: \'Trebuchet MS\', \'Lucida Grande\', \'Bitstream Vera Sans\', \'Helvetica Neue\', sans-serif;\n}\n\n.elm-overlay-resume {\n width: 100%;\n height: 100%;\n cursor: pointer;\n text-align: center;\n pointer-events: auto;\n background-color: rgba(200, 200, 200, 0.7);\n}\n\n.elm-overlay-resume-words {\n position: absolute;\n top: calc(50% - 40px);\n font-size: 80px;\n line-height: 80px;\n height: 80px;\n width: 100%;\n}\n\n.elm-mini-controls {\n position: fixed;\n bottom: 0;\n right: 6px;\n border-radius: 4px;\n background-color: rgb(61, 61, 61);\n font-family: monospace;\n pointer-events: auto;\n}\n\n.elm-mini-controls-button {\n padding: 6px;\n cursor: pointer;\n text-align: center;\n min-width: 24ch;\n}\n\n.elm-mini-controls-import-export {\n padding: 4px 0;\n font-size: 0.8em;\n text-align: center;\n background-color: rgb(50, 50, 50);\n}\n\n.elm-overlay-message {\n position: absolute;\n width: 600px;\n height: 100%;\n padding-left: calc(50% - 300px);\n padding-right: calc(50% - 300px);\n background-color: rgba(200, 200, 200, 0.7);\n pointer-events: auto;\n}\n\n.elm-overlay-message-title {\n font-size: 36px;\n height: 80px;\n background-color: rgb(50, 50, 50);\n padding-left: 22px;\n vertical-align: middle;\n line-height: 80px;\n}\n\n.elm-overlay-message-details {\n padding: 8px 20px;\n overflow-y: auto;\n max-height: calc(100% - 156px);\n background-color: rgb(61, 61, 61);\n}\n\n.elm-overlay-message-details-type {\n font-size: 1.5em;\n}\n\n.elm-overlay-message-details ul {\n list-style-type: none;\n padding-left: 20px;\n}\n\n.elm-overlay-message-details ul ul {\n list-style-type: disc;\n padding-left: 2em;\n}\n\n.elm-overlay-message-details li {\n margin: 8px 0;\n}\n\n.elm-overlay-message-buttons {\n height: 60px;\n line-height: 60px;\n text-align: right;\n background-color: rgb(50, 50, 50);\n}\n\n.elm-overlay-message-buttons button {\n margin-right: 20px;\n}\n\n'), + _1: {ctor: '[]'} + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$button = F2( + function (msg, label) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(msg), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$style( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'cursor', _1: 'pointer'}, + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(label), + _1: {ctor: '[]'} + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewImportExport = F3( + function (props, importMsg, exportMsg) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + props, + { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$button, importMsg, 'Import'), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' / '), + _1: { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$button, exportMsg, 'Export'), + _1: {ctor: '[]'} + } + } + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewMiniControls = F2( + function (config, numMsgs) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-mini-controls'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(config.open), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-mini-controls-button'), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( + A2( + _elm_lang$core$Basics_ops['++'], + 'Explore History (', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$core$Basics$toString(numMsgs), + ')'))), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Overlay$viewImportExport, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-mini-controls-import-export'), + _1: {ctor: '[]'} + }, + config.importHistory, + config.exportHistory), + _1: {ctor: '[]'} + } + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$addCommas = function (items) { + var _p0 = items; + if (_p0.ctor === '[]') { + return ''; + } else { + if (_p0._1.ctor === '[]') { + return _p0._0; + } else { + if (_p0._1._1.ctor === '[]') { + return A2( + _elm_lang$core$Basics_ops['++'], + _p0._0, + A2(_elm_lang$core$Basics_ops['++'], ' and ', _p0._1._0)); + } else { + return A2( + _elm_lang$core$String$join, + ', ', + A2( + _elm_lang$core$Basics_ops['++'], + _p0._1, + { + ctor: '::', + _0: A2(_elm_lang$core$Basics_ops['++'], ' and ', _p0._0), + _1: {ctor: '[]'} + })); + } + } + } +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$problemToString = function (problem) { + var _p1 = problem; + switch (_p1.ctor) { + case 'Function': + return 'functions'; + case 'Decoder': + return 'JSON decoders'; + case 'Task': + return 'tasks'; + case 'Process': + return 'processes'; + case 'Socket': + return 'web sockets'; + case 'Request': + return 'HTTP requests'; + case 'Program': + return 'programs'; + default: + return 'virtual DOM values'; + } +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$goodNews2 = '\nfunction can pattern match on that data and call whatever functions, JSON\ndecoders, etc. you need. This makes the code much more explicit and easy to\nfollow for other readers (or you in a few months!)\n'; +var _elm_lang$virtual_dom$VirtualDom_Overlay$goodNews1 = '\nThe good news is that having values like this in your message type is not\nso great in the long run. You are better off using simpler data, like\n'; +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode = function (name) { + return A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'code', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(name), + _1: {ctor: '[]'} + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewMention = F2( + function (tags, verbed) { + var _p2 = A2( + _elm_lang$core$List$map, + _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode, + _elm_lang$core$List$reverse(tags)); + if (_p2.ctor === '[]') { + return _elm_lang$virtual_dom$VirtualDom_Helpers$text(''); + } else { + if (_p2._1.ctor === '[]') { + return A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'li', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(verbed), + _1: { + ctor: '::', + _0: _p2._0, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('.'), + _1: {ctor: '[]'} + } + } + }); + } else { + if (_p2._1._1.ctor === '[]') { + return A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'li', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(verbed), + _1: { + ctor: '::', + _0: _p2._1._0, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' and '), + _1: { + ctor: '::', + _0: _p2._0, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('.'), + _1: {ctor: '[]'} + } + } + } + } + }); + } else { + return A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'li', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(verbed), + _1: A2( + _elm_lang$core$Basics_ops['++'], + A2( + _elm_lang$core$List$intersperse, + _elm_lang$virtual_dom$VirtualDom_Helpers$text(', '), + _elm_lang$core$List$reverse(_p2._1)), + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', and '), + _1: { + ctor: '::', + _0: _p2._0, + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('.'), + _1: {ctor: '[]'} + } + } + }) + }); + } + } + } + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewChange = function (change) { + return A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'li', + {ctor: '[]'}, + function () { + var _p3 = change; + if (_p3.ctor === 'AliasChange') { + return { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-details-type'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p3._0), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + }; + } else { + return { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-details-type'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p3._0), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'ul', + {ctor: '[]'}, + { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMention, _p3._1.removed, 'Removed '), + _1: { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMention, _p3._1.changed, 'Changed '), + _1: { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMention, _p3._1.added, 'Added '), + _1: {ctor: '[]'} + } + } + }), + _1: { + ctor: '::', + _0: _p3._1.argsMatch ? _elm_lang$virtual_dom$VirtualDom_Helpers$text('') : _elm_lang$virtual_dom$VirtualDom_Helpers$text('This may be due to the fact that the type variable names changed.'), + _1: {ctor: '[]'} + } + } + }; + } + }()); +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewProblemType = function (_p4) { + var _p5 = _p4; + return A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'li', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p5.name), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( + A2( + _elm_lang$core$Basics_ops['++'], + ' can contain ', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$virtual_dom$VirtualDom_Overlay$addCommas( + A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Overlay$problemToString, _p5.problems)), + '.'))), + _1: {ctor: '[]'} + } + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewBadMetadata = function (_p6) { + var _p7 = _p6; + return { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'p', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('The '), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p7.message), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' type of your program cannot be reliably serialized for history files.'), + _1: {ctor: '[]'} + } + } + }), + _1: { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'p', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Functions cannot be serialized, nor can values that contain functions. This is a problem in these places:'), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'ul', + {ctor: '[]'}, + A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Overlay$viewProblemType, _p7.problems)), + _1: { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'p', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_elm_lang$virtual_dom$VirtualDom_Overlay$goodNews1), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$a, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$href('https://guide.elm-lang.org/types/union_types.html'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('union types'), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', in your messages. From there, your '), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode('update'), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_elm_lang$virtual_dom$VirtualDom_Overlay$goodNews2), + _1: {ctor: '[]'} + } + } + } + } + }), + _1: {ctor: '[]'} + } + } + } + }; +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$explanationRisky = '\nThis history seems old. It will work with this program, but some\nmessages have been added since the history was created:\n'; +var _elm_lang$virtual_dom$VirtualDom_Overlay$explanationBad = '\nThe messages in this history do not match the messages handled by your\nprogram. I noticed changes in the following types:\n'; +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewReport = F2( + function (isBad, report) { + var _p8 = report; + switch (_p8.ctor) { + case 'CorruptHistory': + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Looks like this history file is corrupt. I cannot understand it.'), + _1: {ctor: '[]'} + }; + case 'VersionChanged': + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( + A2( + _elm_lang$core$Basics_ops['++'], + 'This history was created with Elm ', + A2( + _elm_lang$core$Basics_ops['++'], + _p8._0, + A2( + _elm_lang$core$Basics_ops['++'], + ', but you are using Elm ', + A2(_elm_lang$core$Basics_ops['++'], _p8._1, ' right now.'))))), + _1: {ctor: '[]'} + }; + case 'MessageChanged': + return { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( + A2(_elm_lang$core$Basics_ops['++'], 'To import some other history, the overall message type must', ' be the same. The old history has ')), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p8._0), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' messages, but the new program works with '), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p8._1), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' messages.'), + _1: {ctor: '[]'} + } + } + } + } + }; + default: + return { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'p', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( + isBad ? _elm_lang$virtual_dom$VirtualDom_Overlay$explanationBad : _elm_lang$virtual_dom$VirtualDom_Overlay$explanationRisky), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'ul', + {ctor: '[]'}, + A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Overlay$viewChange, _p8._0)), + _1: {ctor: '[]'} + } + }; + } + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewResume = function (config) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-resume'), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(config.resume), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-resume-words'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Click to Resume'), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$uploadDecoder = A3( + _elm_lang$core$Json_Decode$map2, + F2( + function (v0, v1) { + return {ctor: '_Tuple2', _0: v0, _1: v1}; + }), + A2(_elm_lang$core$Json_Decode$field, 'metadata', _elm_lang$virtual_dom$VirtualDom_Metadata$decoder), + A2(_elm_lang$core$Json_Decode$field, 'history', _elm_lang$core$Json_Decode$value)); +var _elm_lang$virtual_dom$VirtualDom_Overlay$close = F2( + function (msg, state) { + var _p9 = state; + switch (_p9.ctor) { + case 'None': + return _elm_lang$core$Maybe$Nothing; + case 'BadMetadata': + return _elm_lang$core$Maybe$Nothing; + case 'BadImport': + return _elm_lang$core$Maybe$Nothing; + default: + var _p10 = msg; + if (_p10.ctor === 'Cancel') { + return _elm_lang$core$Maybe$Nothing; + } else { + return _elm_lang$core$Maybe$Just(_p9._1); + } + } + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$isBlocking = function (state) { + var _p11 = state; + if (_p11.ctor === 'None') { + return false; + } else { + return true; + } +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$Config = F5( + function (a, b, c, d, e) { + return {resume: a, open: b, importHistory: c, exportHistory: d, wrap: e}; + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$RiskyImport = F2( + function (a, b) { + return {ctor: 'RiskyImport', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$BadImport = function (a) { + return {ctor: 'BadImport', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$corruptImport = _elm_lang$virtual_dom$VirtualDom_Overlay$BadImport(_elm_lang$virtual_dom$VirtualDom_Report$CorruptHistory); +var _elm_lang$virtual_dom$VirtualDom_Overlay$assessImport = F2( + function (metadata, jsonString) { + var _p12 = A2(_elm_lang$core$Json_Decode$decodeString, _elm_lang$virtual_dom$VirtualDom_Overlay$uploadDecoder, jsonString); + if (_p12.ctor === 'Err') { + return _elm_lang$core$Result$Err(_elm_lang$virtual_dom$VirtualDom_Overlay$corruptImport); + } else { + var _p14 = _p12._0._1; + var report = A2(_elm_lang$virtual_dom$VirtualDom_Metadata$check, _p12._0._0, metadata); + var _p13 = _elm_lang$virtual_dom$VirtualDom_Report$evaluate(report); + switch (_p13.ctor) { + case 'Impossible': + return _elm_lang$core$Result$Err( + _elm_lang$virtual_dom$VirtualDom_Overlay$BadImport(report)); + case 'Risky': + return _elm_lang$core$Result$Err( + A2(_elm_lang$virtual_dom$VirtualDom_Overlay$RiskyImport, report, _p14)); + default: + return _elm_lang$core$Result$Ok(_p14); + } + } + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$BadMetadata = function (a) { + return {ctor: 'BadMetadata', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$badMetadata = _elm_lang$virtual_dom$VirtualDom_Overlay$BadMetadata; +var _elm_lang$virtual_dom$VirtualDom_Overlay$None = {ctor: 'None'}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$none = _elm_lang$virtual_dom$VirtualDom_Overlay$None; +var _elm_lang$virtual_dom$VirtualDom_Overlay$Proceed = {ctor: 'Proceed'}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$Cancel = {ctor: 'Cancel'}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewButtons = function (buttons) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-buttons'), + _1: {ctor: '[]'} + }, + function () { + var _p15 = buttons; + if (_p15.ctor === 'Accept') { + return { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'button', + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Overlay$Proceed), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p15._0), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + }; + } else { + return { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'button', + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Overlay$Cancel), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p15._0), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'button', + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Overlay$Proceed), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p15._1), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + }; + } + }()); +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$Message = {ctor: 'Message'}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage = F4( + function (config, title, details, buttons) { + return { + ctor: '_Tuple2', + _0: _elm_lang$virtual_dom$VirtualDom_Overlay$Message, + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-title'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(title), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-details'), + _1: {ctor: '[]'} + }, + details), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + config.wrap, + _elm_lang$virtual_dom$VirtualDom_Overlay$viewButtons(buttons)), + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + } + }; + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$Pause = {ctor: 'Pause'}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$Normal = {ctor: 'Normal'}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$Choose = F2( + function (a, b) { + return {ctor: 'Choose', _0: a, _1: b}; + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$Accept = function (a) { + return {ctor: 'Accept', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Overlay$viewHelp = F5( + function (config, isPaused, isOpen, numMsgs, state) { + var _p16 = state; + switch (_p16.ctor) { + case 'None': + var miniControls = isOpen ? {ctor: '[]'} : { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMiniControls, config, numMsgs), + _1: {ctor: '[]'} + }; + return { + ctor: '_Tuple2', + _0: isPaused ? _elm_lang$virtual_dom$VirtualDom_Overlay$Pause : _elm_lang$virtual_dom$VirtualDom_Overlay$Normal, + _1: (isPaused && (!isOpen)) ? { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewResume(config), + _1: miniControls + } : miniControls + }; + case 'BadMetadata': + return A4( + _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage, + config, + 'Cannot use Import or Export', + _elm_lang$virtual_dom$VirtualDom_Overlay$viewBadMetadata(_p16._0), + _elm_lang$virtual_dom$VirtualDom_Overlay$Accept('Ok')); + case 'BadImport': + return A4( + _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage, + config, + 'Cannot Import History', + A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewReport, true, _p16._0), + _elm_lang$virtual_dom$VirtualDom_Overlay$Accept('Ok')); + default: + return A4( + _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage, + config, + 'Warning', + A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewReport, false, _p16._0), + A2(_elm_lang$virtual_dom$VirtualDom_Overlay$Choose, 'Cancel', 'Import Anyway')); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Overlay$view = F5( + function (config, isPaused, isOpen, numMsgs, state) { + var _p17 = A5(_elm_lang$virtual_dom$VirtualDom_Overlay$viewHelp, config, isPaused, isOpen, numMsgs, state); + var block = _p17._0; + var nodes = _p17._1; + return { + ctor: '_Tuple2', + _0: block, + _1: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay'), + _1: {ctor: '[]'} + }, + {ctor: '::', _0: _elm_lang$virtual_dom$VirtualDom_Overlay$styles, _1: nodes}) + }; + }); + +var _elm_lang$virtual_dom$VirtualDom_Debug$styles = A3( + _elm_lang$virtual_dom$VirtualDom_Helpers$node, + 'style', + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('\n\nhtml {\n overflow: hidden;\n height: 100%;\n}\n\nbody {\n height: 100%;\n overflow: auto;\n}\n\n#debugger {\n width: 100%\n height: 100%;\n font-family: monospace;\n}\n\n#values {\n display: block;\n float: left;\n height: 100%;\n width: calc(100% - 30ch);\n margin: 0;\n overflow: auto;\n cursor: default;\n}\n\n.debugger-sidebar {\n display: block;\n float: left;\n width: 30ch;\n height: 100%;\n color: white;\n background-color: rgb(61, 61, 61);\n}\n\n.debugger-sidebar-controls {\n width: 100%;\n text-align: center;\n background-color: rgb(50, 50, 50);\n}\n\n.debugger-sidebar-controls-import-export {\n width: 100%;\n height: 24px;\n line-height: 24px;\n font-size: 12px;\n}\n\n.debugger-sidebar-controls-resume {\n width: 100%;\n height: 30px;\n line-height: 30px;\n cursor: pointer;\n}\n\n.debugger-sidebar-controls-resume:hover {\n background-color: rgb(41, 41, 41);\n}\n\n.debugger-sidebar-messages {\n width: 100%;\n overflow-y: auto;\n height: calc(100% - 24px);\n}\n\n.debugger-sidebar-messages-paused {\n width: 100%;\n overflow-y: auto;\n height: calc(100% - 54px);\n}\n\n.messages-entry {\n cursor: pointer;\n width: 100%;\n}\n\n.messages-entry:hover {\n background-color: rgb(41, 41, 41);\n}\n\n.messages-entry-selected, .messages-entry-selected:hover {\n background-color: rgb(10, 10, 10);\n}\n\n.messages-entry-content {\n width: calc(100% - 7ch);\n padding-top: 4px;\n padding-bottom: 4px;\n padding-left: 1ch;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n}\n\n.messages-entry-index {\n color: #666;\n width: 5ch;\n padding-top: 4px;\n padding-bottom: 4px;\n padding-right: 1ch;\n text-align: right;\n display: block;\n float: right;\n}\n\n'), + _1: {ctor: '[]'} + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$button = F2( + function (msg, label) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$span, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(msg), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$style( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'cursor', _1: 'pointer'}, + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(label), + _1: {ctor: '[]'} + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel = function (state) { + var _p0 = state; + if (_p0.ctor === 'Running') { + return _p0._0; + } else { + return _p0._2; + } +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata = F2( + function (model, func) { + var _p1 = model.metadata; + if (_p1.ctor === 'Ok') { + return func(_p1._0); + } else { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + { + overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$badMetadata(_p1._0) + }), + {ctor: '[]'}); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$Model = F6( + function (a, b, c, d, e, f) { + return {history: a, state: b, expando: c, metadata: d, overlay: e, isDebuggerOpen: f}; + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$Paused = F3( + function (a, b, c) { + return {ctor: 'Paused', _0: a, _1: b, _2: c}; + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$Running = function (a) { + return {ctor: 'Running', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$loadNewHistory = F3( + function (rawHistory, userUpdate, model) { + var pureUserUpdate = F2( + function (msg, userModel) { + return _elm_lang$core$Tuple$first( + A2(userUpdate, msg, userModel)); + }); + var initialUserModel = _elm_lang$virtual_dom$VirtualDom_History$initialModel(model.history); + var decoder = A2(_elm_lang$virtual_dom$VirtualDom_History$decoder, initialUserModel, pureUserUpdate); + var _p2 = A2(_elm_lang$core$Json_Decode$decodeValue, decoder, rawHistory); + if (_p2.ctor === 'Err') { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + {overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$corruptImport}), + {ctor: '[]'}); + } else { + var _p3 = _p2._0._0; + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + { + history: _p2._0._1, + state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(_p3), + expando: _elm_lang$virtual_dom$VirtualDom_Expando$init(_p3), + overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$none + }), + {ctor: '[]'}); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$OverlayMsg = function (a) { + return {ctor: 'OverlayMsg', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$Upload = function (a) { + return {ctor: 'Upload', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$upload = A2(_elm_lang$core$Task$perform, _elm_lang$virtual_dom$VirtualDom_Debug$Upload, _elm_lang$virtual_dom$Native_Debug.upload); +var _elm_lang$virtual_dom$VirtualDom_Debug$Export = {ctor: 'Export'}; +var _elm_lang$virtual_dom$VirtualDom_Debug$Import = {ctor: 'Import'}; +var _elm_lang$virtual_dom$VirtualDom_Debug$Down = {ctor: 'Down'}; +var _elm_lang$virtual_dom$VirtualDom_Debug$Up = {ctor: 'Up'}; +var _elm_lang$virtual_dom$VirtualDom_Debug$Close = {ctor: 'Close'}; +var _elm_lang$virtual_dom$VirtualDom_Debug$Open = {ctor: 'Open'}; +var _elm_lang$virtual_dom$VirtualDom_Debug$Jump = function (a) { + return {ctor: 'Jump', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$Resume = {ctor: 'Resume'}; +var _elm_lang$virtual_dom$VirtualDom_Debug$overlayConfig = {resume: _elm_lang$virtual_dom$VirtualDom_Debug$Resume, open: _elm_lang$virtual_dom$VirtualDom_Debug$Open, importHistory: _elm_lang$virtual_dom$VirtualDom_Debug$Import, exportHistory: _elm_lang$virtual_dom$VirtualDom_Debug$Export, wrap: _elm_lang$virtual_dom$VirtualDom_Debug$OverlayMsg}; +var _elm_lang$virtual_dom$VirtualDom_Debug$viewIn = function (_p4) { + var _p5 = _p4; + var isPaused = function () { + var _p6 = _p5.state; + if (_p6.ctor === 'Running') { + return false; + } else { + return true; + } + }(); + return A5( + _elm_lang$virtual_dom$VirtualDom_Overlay$view, + _elm_lang$virtual_dom$VirtualDom_Debug$overlayConfig, + isPaused, + _p5.isDebuggerOpen, + _elm_lang$virtual_dom$VirtualDom_History$size(_p5.history), + _p5.overlay); +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$resumeButton = A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Debug$Resume), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar-controls-resume'), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Resume'), + _1: {ctor: '[]'} + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$viewResumeButton = function (maybeIndex) { + var _p7 = maybeIndex; + if (_p7.ctor === 'Nothing') { + return _elm_lang$virtual_dom$VirtualDom_Helpers$text(''); + } else { + return _elm_lang$virtual_dom$VirtualDom_Debug$resumeButton; + } +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$playButton = function (maybeIndex) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar-controls'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Debug$viewResumeButton(maybeIndex), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar-controls-import-export'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$button, _elm_lang$virtual_dom$VirtualDom_Debug$Import, 'Import'), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' / '), + _1: { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$button, _elm_lang$virtual_dom$VirtualDom_Debug$Export, 'Export'), + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + } + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$viewSidebar = F2( + function (state, history) { + var maybeIndex = function () { + var _p8 = state; + if (_p8.ctor === 'Running') { + return _elm_lang$core$Maybe$Nothing; + } else { + return _elm_lang$core$Maybe$Just(_p8._0); + } + }(); + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + _elm_lang$virtual_dom$VirtualDom_Debug$Jump, + A2(_elm_lang$virtual_dom$VirtualDom_History$view, maybeIndex, history)), + _1: { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Debug$playButton(maybeIndex), + _1: {ctor: '[]'} + } + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$ExpandoMsg = function (a) { + return {ctor: 'ExpandoMsg', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$viewOut = function (_p9) { + var _p10 = _p9; + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$id('debugger'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Debug$styles, + _1: { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$viewSidebar, _p10.state, _p10.history), + _1: { + ctor: '::', + _0: A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + _elm_lang$virtual_dom$VirtualDom_Debug$ExpandoMsg, + A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$div, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Helpers$id('values'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Expando$view, _elm_lang$core$Maybe$Nothing, _p10.expando), + _1: {ctor: '[]'} + })), + _1: {ctor: '[]'} + } + } + }); +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg = function (a) { + return {ctor: 'UserMsg', _0: a}; +}; +var _elm_lang$virtual_dom$VirtualDom_Debug$wrapInit = F2( + function (metadata, _p11) { + var _p12 = _p11; + var _p13 = _p12._0; + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + { + history: _elm_lang$virtual_dom$VirtualDom_History$empty(_p13), + state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(_p13), + expando: _elm_lang$virtual_dom$VirtualDom_Expando$init(_p13), + metadata: _elm_lang$virtual_dom$VirtualDom_Metadata$decode(metadata), + overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$none, + isDebuggerOpen: false + }, + { + ctor: '::', + _0: A2(_elm_lang$core$Platform_Cmd$map, _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, _p12._1), + _1: {ctor: '[]'} + }); + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$wrapSubs = F2( + function (userSubscriptions, _p14) { + var _p15 = _p14; + return A2( + _elm_lang$core$Platform_Sub$map, + _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, + userSubscriptions( + _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel(_p15.state))); + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$wrapView = F2( + function (userView, _p16) { + var _p17 = _p16; + var currentModel = function () { + var _p18 = _p17.state; + if (_p18.ctor === 'Running') { + return _p18._0; + } else { + return _p18._1; + } + }(); + return A2( + _elm_lang$virtual_dom$VirtualDom_Helpers$map, + _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, + userView(currentModel)); + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$NoOp = {ctor: 'NoOp'}; +var _elm_lang$virtual_dom$VirtualDom_Debug$download = F2( + function (metadata, history) { + var json = _elm_lang$core$Json_Encode$object( + { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'metadata', + _1: _elm_lang$virtual_dom$VirtualDom_Metadata$encode(metadata) + }, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'history', + _1: _elm_lang$virtual_dom$VirtualDom_History$encode(history) + }, + _1: {ctor: '[]'} + } + }); + var historyLength = _elm_lang$virtual_dom$VirtualDom_History$size(history); + return A2( + _elm_lang$core$Task$perform, + function (_p19) { + return _elm_lang$virtual_dom$VirtualDom_Debug$NoOp; + }, + A2(_elm_lang$virtual_dom$Native_Debug.download, historyLength, json)); + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$runIf = F2( + function (bool, task) { + return bool ? A2( + _elm_lang$core$Task$perform, + _elm_lang$core$Basics$always(_elm_lang$virtual_dom$VirtualDom_Debug$NoOp), + task) : _elm_lang$core$Platform_Cmd$none; + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$updateUserMsg = F4( + function (userUpdate, scrollTask, userMsg, _p20) { + var _p21 = _p20; + var _p25 = _p21.state; + var _p24 = _p21; + var userModel = _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel(_p25); + var newHistory = A3(_elm_lang$virtual_dom$VirtualDom_History$add, userMsg, userModel, _p21.history); + var _p22 = A2(userUpdate, userMsg, userModel); + var newUserModel = _p22._0; + var userCmds = _p22._1; + var commands = A2(_elm_lang$core$Platform_Cmd$map, _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, userCmds); + var _p23 = _p25; + if (_p23.ctor === 'Running') { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + _p24, + { + history: newHistory, + state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(newUserModel), + expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$merge, newUserModel, _p21.expando) + }), + { + ctor: '::', + _0: commands, + _1: { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$runIf, _p24.isDebuggerOpen, scrollTask), + _1: {ctor: '[]'} + } + }); + } else { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + _p24, + { + history: newHistory, + state: A3(_elm_lang$virtual_dom$VirtualDom_Debug$Paused, _p23._0, _p23._1, newUserModel) + }), + { + ctor: '::', + _0: commands, + _1: {ctor: '[]'} + }); + } + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$wrapUpdate = F4( + function (userUpdate, scrollTask, msg, model) { + wrapUpdate: + while (true) { + var _p26 = msg; + switch (_p26.ctor) { + case 'NoOp': + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + model, + {ctor: '[]'}); + case 'UserMsg': + return A4(_elm_lang$virtual_dom$VirtualDom_Debug$updateUserMsg, userUpdate, scrollTask, _p26._0, model); + case 'ExpandoMsg': + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + { + expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, _p26._0, model.expando) + }), + {ctor: '[]'}); + case 'Resume': + var _p27 = model.state; + if (_p27.ctor === 'Running') { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + model, + {ctor: '[]'}); + } else { + var _p28 = _p27._2; + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + { + state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(_p28), + expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$merge, _p28, model.expando) + }), + { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$runIf, model.isDebuggerOpen, scrollTask), + _1: {ctor: '[]'} + }); + } + case 'Jump': + var _p30 = _p26._0; + var _p29 = A3(_elm_lang$virtual_dom$VirtualDom_History$get, userUpdate, _p30, model.history); + var indexModel = _p29._0; + var indexMsg = _p29._1; + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + { + state: A3( + _elm_lang$virtual_dom$VirtualDom_Debug$Paused, + _p30, + indexModel, + _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel(model.state)), + expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$merge, indexModel, model.expando) + }), + {ctor: '[]'}); + case 'Open': + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + {isDebuggerOpen: true}), + {ctor: '[]'}); + case 'Close': + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + {isDebuggerOpen: false}), + {ctor: '[]'}); + case 'Up': + var index = function () { + var _p31 = model.state; + if (_p31.ctor === 'Paused') { + return _p31._0; + } else { + return _elm_lang$virtual_dom$VirtualDom_History$size(model.history); + } + }(); + if (_elm_lang$core$Native_Utils.cmp(index, 0) > 0) { + var _v17 = userUpdate, + _v18 = scrollTask, + _v19 = _elm_lang$virtual_dom$VirtualDom_Debug$Jump(index - 1), + _v20 = model; + userUpdate = _v17; + scrollTask = _v18; + msg = _v19; + model = _v20; + continue wrapUpdate; + } else { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + model, + {ctor: '[]'}); + } + case 'Down': + var _p32 = model.state; + if (_p32.ctor === 'Running') { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + model, + {ctor: '[]'}); + } else { + var _p33 = _p32._0; + if (_elm_lang$core$Native_Utils.eq( + _p33, + _elm_lang$virtual_dom$VirtualDom_History$size(model.history) - 1)) { + var _v22 = userUpdate, + _v23 = scrollTask, + _v24 = _elm_lang$virtual_dom$VirtualDom_Debug$Resume, + _v25 = model; + userUpdate = _v22; + scrollTask = _v23; + msg = _v24; + model = _v25; + continue wrapUpdate; + } else { + var _v26 = userUpdate, + _v27 = scrollTask, + _v28 = _elm_lang$virtual_dom$VirtualDom_Debug$Jump(_p33 + 1), + _v29 = model; + userUpdate = _v26; + scrollTask = _v27; + msg = _v28; + model = _v29; + continue wrapUpdate; + } + } + case 'Import': + return A2( + _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata, + model, + function (_p34) { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + model, + { + ctor: '::', + _0: _elm_lang$virtual_dom$VirtualDom_Debug$upload, + _1: {ctor: '[]'} + }); + }); + case 'Export': + return A2( + _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata, + model, + function (metadata) { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + model, + { + ctor: '::', + _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$download, metadata, model.history), + _1: {ctor: '[]'} + }); + }); + case 'Upload': + return A2( + _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata, + model, + function (metadata) { + var _p35 = A2(_elm_lang$virtual_dom$VirtualDom_Overlay$assessImport, metadata, _p26._0); + if (_p35.ctor === 'Err') { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + {overlay: _p35._0}), + {ctor: '[]'}); + } else { + return A3(_elm_lang$virtual_dom$VirtualDom_Debug$loadNewHistory, _p35._0, userUpdate, model); + } + }); + default: + var _p36 = A2(_elm_lang$virtual_dom$VirtualDom_Overlay$close, _p26._0, model.overlay); + if (_p36.ctor === 'Nothing') { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + {overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$none}), + {ctor: '[]'}); + } else { + return A3(_elm_lang$virtual_dom$VirtualDom_Debug$loadNewHistory, _p36._0, userUpdate, model); + } + } + } + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$wrap = F2( + function (metadata, _p37) { + var _p38 = _p37; + return { + init: A2(_elm_lang$virtual_dom$VirtualDom_Debug$wrapInit, metadata, _p38.init), + view: _elm_lang$virtual_dom$VirtualDom_Debug$wrapView(_p38.view), + update: _elm_lang$virtual_dom$VirtualDom_Debug$wrapUpdate(_p38.update), + viewIn: _elm_lang$virtual_dom$VirtualDom_Debug$viewIn, + viewOut: _elm_lang$virtual_dom$VirtualDom_Debug$viewOut, + subscriptions: _elm_lang$virtual_dom$VirtualDom_Debug$wrapSubs(_p38.subscriptions) + }; + }); +var _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags = F2( + function (metadata, _p39) { + var _p40 = _p39; + return { + init: function (flags) { + return A2( + _elm_lang$virtual_dom$VirtualDom_Debug$wrapInit, + metadata, + _p40.init(flags)); + }, + view: _elm_lang$virtual_dom$VirtualDom_Debug$wrapView(_p40.view), + update: _elm_lang$virtual_dom$VirtualDom_Debug$wrapUpdate(_p40.update), + viewIn: _elm_lang$virtual_dom$VirtualDom_Debug$viewIn, + viewOut: _elm_lang$virtual_dom$VirtualDom_Debug$viewOut, + subscriptions: _elm_lang$virtual_dom$VirtualDom_Debug$wrapSubs(_p40.subscriptions) + }; + }); + +var _elm_lang$virtual_dom$VirtualDom$programWithFlags = function (impl) { + return A2(_elm_lang$virtual_dom$Native_VirtualDom.programWithFlags, _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags, impl); +}; +var _elm_lang$virtual_dom$VirtualDom$program = function (impl) { + return A2(_elm_lang$virtual_dom$Native_VirtualDom.program, _elm_lang$virtual_dom$VirtualDom_Debug$wrap, impl); +}; +var _elm_lang$virtual_dom$VirtualDom$keyedNode = _elm_lang$virtual_dom$Native_VirtualDom.keyedNode; +var _elm_lang$virtual_dom$VirtualDom$lazy3 = _elm_lang$virtual_dom$Native_VirtualDom.lazy3; +var _elm_lang$virtual_dom$VirtualDom$lazy2 = _elm_lang$virtual_dom$Native_VirtualDom.lazy2; +var _elm_lang$virtual_dom$VirtualDom$lazy = _elm_lang$virtual_dom$Native_VirtualDom.lazy; +var _elm_lang$virtual_dom$VirtualDom$defaultOptions = {stopPropagation: false, preventDefault: false}; +var _elm_lang$virtual_dom$VirtualDom$onWithOptions = _elm_lang$virtual_dom$Native_VirtualDom.on; +var _elm_lang$virtual_dom$VirtualDom$on = F2( + function (eventName, decoder) { + return A3(_elm_lang$virtual_dom$VirtualDom$onWithOptions, eventName, _elm_lang$virtual_dom$VirtualDom$defaultOptions, decoder); + }); +var _elm_lang$virtual_dom$VirtualDom$style = _elm_lang$virtual_dom$Native_VirtualDom.style; +var _elm_lang$virtual_dom$VirtualDom$mapProperty = _elm_lang$virtual_dom$Native_VirtualDom.mapProperty; +var _elm_lang$virtual_dom$VirtualDom$attributeNS = _elm_lang$virtual_dom$Native_VirtualDom.attributeNS; +var _elm_lang$virtual_dom$VirtualDom$attribute = _elm_lang$virtual_dom$Native_VirtualDom.attribute; +var _elm_lang$virtual_dom$VirtualDom$property = _elm_lang$virtual_dom$Native_VirtualDom.property; +var _elm_lang$virtual_dom$VirtualDom$map = _elm_lang$virtual_dom$Native_VirtualDom.map; +var _elm_lang$virtual_dom$VirtualDom$text = _elm_lang$virtual_dom$Native_VirtualDom.text; +var _elm_lang$virtual_dom$VirtualDom$node = _elm_lang$virtual_dom$Native_VirtualDom.node; +var _elm_lang$virtual_dom$VirtualDom$Options = F2( + function (a, b) { + return {stopPropagation: a, preventDefault: b}; + }); +var _elm_lang$virtual_dom$VirtualDom$Node = {ctor: 'Node'}; +var _elm_lang$virtual_dom$VirtualDom$Property = {ctor: 'Property'}; + +var _elm_lang$html$Html$programWithFlags = _elm_lang$virtual_dom$VirtualDom$programWithFlags; +var _elm_lang$html$Html$program = _elm_lang$virtual_dom$VirtualDom$program; +var _elm_lang$html$Html$beginnerProgram = function (_p0) { + var _p1 = _p0; + return _elm_lang$html$Html$program( + { + init: A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _p1.model, + {ctor: '[]'}), + update: F2( + function (msg, model) { + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + A2(_p1.update, msg, model), + {ctor: '[]'}); + }), + view: _p1.view, + subscriptions: function (_p2) { + return _elm_lang$core$Platform_Sub$none; + } + }); +}; +var _elm_lang$html$Html$map = _elm_lang$virtual_dom$VirtualDom$map; +var _elm_lang$html$Html$text = _elm_lang$virtual_dom$VirtualDom$text; +var _elm_lang$html$Html$node = _elm_lang$virtual_dom$VirtualDom$node; +var _elm_lang$html$Html$body = _elm_lang$html$Html$node('body'); +var _elm_lang$html$Html$section = _elm_lang$html$Html$node('section'); +var _elm_lang$html$Html$nav = _elm_lang$html$Html$node('nav'); +var _elm_lang$html$Html$article = _elm_lang$html$Html$node('article'); +var _elm_lang$html$Html$aside = _elm_lang$html$Html$node('aside'); +var _elm_lang$html$Html$h1 = _elm_lang$html$Html$node('h1'); +var _elm_lang$html$Html$h2 = _elm_lang$html$Html$node('h2'); +var _elm_lang$html$Html$h3 = _elm_lang$html$Html$node('h3'); +var _elm_lang$html$Html$h4 = _elm_lang$html$Html$node('h4'); +var _elm_lang$html$Html$h5 = _elm_lang$html$Html$node('h5'); +var _elm_lang$html$Html$h6 = _elm_lang$html$Html$node('h6'); +var _elm_lang$html$Html$header = _elm_lang$html$Html$node('header'); +var _elm_lang$html$Html$footer = _elm_lang$html$Html$node('footer'); +var _elm_lang$html$Html$address = _elm_lang$html$Html$node('address'); +var _elm_lang$html$Html$main_ = _elm_lang$html$Html$node('main'); +var _elm_lang$html$Html$p = _elm_lang$html$Html$node('p'); +var _elm_lang$html$Html$hr = _elm_lang$html$Html$node('hr'); +var _elm_lang$html$Html$pre = _elm_lang$html$Html$node('pre'); +var _elm_lang$html$Html$blockquote = _elm_lang$html$Html$node('blockquote'); +var _elm_lang$html$Html$ol = _elm_lang$html$Html$node('ol'); +var _elm_lang$html$Html$ul = _elm_lang$html$Html$node('ul'); +var _elm_lang$html$Html$li = _elm_lang$html$Html$node('li'); +var _elm_lang$html$Html$dl = _elm_lang$html$Html$node('dl'); +var _elm_lang$html$Html$dt = _elm_lang$html$Html$node('dt'); +var _elm_lang$html$Html$dd = _elm_lang$html$Html$node('dd'); +var _elm_lang$html$Html$figure = _elm_lang$html$Html$node('figure'); +var _elm_lang$html$Html$figcaption = _elm_lang$html$Html$node('figcaption'); +var _elm_lang$html$Html$div = _elm_lang$html$Html$node('div'); +var _elm_lang$html$Html$a = _elm_lang$html$Html$node('a'); +var _elm_lang$html$Html$em = _elm_lang$html$Html$node('em'); +var _elm_lang$html$Html$strong = _elm_lang$html$Html$node('strong'); +var _elm_lang$html$Html$small = _elm_lang$html$Html$node('small'); +var _elm_lang$html$Html$s = _elm_lang$html$Html$node('s'); +var _elm_lang$html$Html$cite = _elm_lang$html$Html$node('cite'); +var _elm_lang$html$Html$q = _elm_lang$html$Html$node('q'); +var _elm_lang$html$Html$dfn = _elm_lang$html$Html$node('dfn'); +var _elm_lang$html$Html$abbr = _elm_lang$html$Html$node('abbr'); +var _elm_lang$html$Html$time = _elm_lang$html$Html$node('time'); +var _elm_lang$html$Html$code = _elm_lang$html$Html$node('code'); +var _elm_lang$html$Html$var = _elm_lang$html$Html$node('var'); +var _elm_lang$html$Html$samp = _elm_lang$html$Html$node('samp'); +var _elm_lang$html$Html$kbd = _elm_lang$html$Html$node('kbd'); +var _elm_lang$html$Html$sub = _elm_lang$html$Html$node('sub'); +var _elm_lang$html$Html$sup = _elm_lang$html$Html$node('sup'); +var _elm_lang$html$Html$i = _elm_lang$html$Html$node('i'); +var _elm_lang$html$Html$b = _elm_lang$html$Html$node('b'); +var _elm_lang$html$Html$u = _elm_lang$html$Html$node('u'); +var _elm_lang$html$Html$mark = _elm_lang$html$Html$node('mark'); +var _elm_lang$html$Html$ruby = _elm_lang$html$Html$node('ruby'); +var _elm_lang$html$Html$rt = _elm_lang$html$Html$node('rt'); +var _elm_lang$html$Html$rp = _elm_lang$html$Html$node('rp'); +var _elm_lang$html$Html$bdi = _elm_lang$html$Html$node('bdi'); +var _elm_lang$html$Html$bdo = _elm_lang$html$Html$node('bdo'); +var _elm_lang$html$Html$span = _elm_lang$html$Html$node('span'); +var _elm_lang$html$Html$br = _elm_lang$html$Html$node('br'); +var _elm_lang$html$Html$wbr = _elm_lang$html$Html$node('wbr'); +var _elm_lang$html$Html$ins = _elm_lang$html$Html$node('ins'); +var _elm_lang$html$Html$del = _elm_lang$html$Html$node('del'); +var _elm_lang$html$Html$img = _elm_lang$html$Html$node('img'); +var _elm_lang$html$Html$iframe = _elm_lang$html$Html$node('iframe'); +var _elm_lang$html$Html$embed = _elm_lang$html$Html$node('embed'); +var _elm_lang$html$Html$object = _elm_lang$html$Html$node('object'); +var _elm_lang$html$Html$param = _elm_lang$html$Html$node('param'); +var _elm_lang$html$Html$video = _elm_lang$html$Html$node('video'); +var _elm_lang$html$Html$audio = _elm_lang$html$Html$node('audio'); +var _elm_lang$html$Html$source = _elm_lang$html$Html$node('source'); +var _elm_lang$html$Html$track = _elm_lang$html$Html$node('track'); +var _elm_lang$html$Html$canvas = _elm_lang$html$Html$node('canvas'); +var _elm_lang$html$Html$math = _elm_lang$html$Html$node('math'); +var _elm_lang$html$Html$table = _elm_lang$html$Html$node('table'); +var _elm_lang$html$Html$caption = _elm_lang$html$Html$node('caption'); +var _elm_lang$html$Html$colgroup = _elm_lang$html$Html$node('colgroup'); +var _elm_lang$html$Html$col = _elm_lang$html$Html$node('col'); +var _elm_lang$html$Html$tbody = _elm_lang$html$Html$node('tbody'); +var _elm_lang$html$Html$thead = _elm_lang$html$Html$node('thead'); +var _elm_lang$html$Html$tfoot = _elm_lang$html$Html$node('tfoot'); +var _elm_lang$html$Html$tr = _elm_lang$html$Html$node('tr'); +var _elm_lang$html$Html$td = _elm_lang$html$Html$node('td'); +var _elm_lang$html$Html$th = _elm_lang$html$Html$node('th'); +var _elm_lang$html$Html$form = _elm_lang$html$Html$node('form'); +var _elm_lang$html$Html$fieldset = _elm_lang$html$Html$node('fieldset'); +var _elm_lang$html$Html$legend = _elm_lang$html$Html$node('legend'); +var _elm_lang$html$Html$label = _elm_lang$html$Html$node('label'); +var _elm_lang$html$Html$input = _elm_lang$html$Html$node('input'); +var _elm_lang$html$Html$button = _elm_lang$html$Html$node('button'); +var _elm_lang$html$Html$select = _elm_lang$html$Html$node('select'); +var _elm_lang$html$Html$datalist = _elm_lang$html$Html$node('datalist'); +var _elm_lang$html$Html$optgroup = _elm_lang$html$Html$node('optgroup'); +var _elm_lang$html$Html$option = _elm_lang$html$Html$node('option'); +var _elm_lang$html$Html$textarea = _elm_lang$html$Html$node('textarea'); +var _elm_lang$html$Html$keygen = _elm_lang$html$Html$node('keygen'); +var _elm_lang$html$Html$output = _elm_lang$html$Html$node('output'); +var _elm_lang$html$Html$progress = _elm_lang$html$Html$node('progress'); +var _elm_lang$html$Html$meter = _elm_lang$html$Html$node('meter'); +var _elm_lang$html$Html$details = _elm_lang$html$Html$node('details'); +var _elm_lang$html$Html$summary = _elm_lang$html$Html$node('summary'); +var _elm_lang$html$Html$menuitem = _elm_lang$html$Html$node('menuitem'); +var _elm_lang$html$Html$menu = _elm_lang$html$Html$node('menu'); + +var _elm_lang$html$Html_Attributes$map = _elm_lang$virtual_dom$VirtualDom$mapProperty; +var _elm_lang$html$Html_Attributes$attribute = _elm_lang$virtual_dom$VirtualDom$attribute; +var _elm_lang$html$Html_Attributes$contextmenu = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'contextmenu', value); +}; +var _elm_lang$html$Html_Attributes$draggable = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'draggable', value); +}; +var _elm_lang$html$Html_Attributes$itemprop = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'itemprop', value); +}; +var _elm_lang$html$Html_Attributes$tabindex = function (n) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'tabIndex', + _elm_lang$core$Basics$toString(n)); +}; +var _elm_lang$html$Html_Attributes$charset = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'charset', value); +}; +var _elm_lang$html$Html_Attributes$height = function (value) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'height', + _elm_lang$core$Basics$toString(value)); +}; +var _elm_lang$html$Html_Attributes$width = function (value) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'width', + _elm_lang$core$Basics$toString(value)); +}; +var _elm_lang$html$Html_Attributes$formaction = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'formAction', value); +}; +var _elm_lang$html$Html_Attributes$list = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'list', value); +}; +var _elm_lang$html$Html_Attributes$minlength = function (n) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'minLength', + _elm_lang$core$Basics$toString(n)); +}; +var _elm_lang$html$Html_Attributes$maxlength = function (n) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'maxlength', + _elm_lang$core$Basics$toString(n)); +}; +var _elm_lang$html$Html_Attributes$size = function (n) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'size', + _elm_lang$core$Basics$toString(n)); +}; +var _elm_lang$html$Html_Attributes$form = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'form', value); +}; +var _elm_lang$html$Html_Attributes$cols = function (n) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'cols', + _elm_lang$core$Basics$toString(n)); +}; +var _elm_lang$html$Html_Attributes$rows = function (n) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'rows', + _elm_lang$core$Basics$toString(n)); +}; +var _elm_lang$html$Html_Attributes$challenge = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'challenge', value); +}; +var _elm_lang$html$Html_Attributes$media = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'media', value); +}; +var _elm_lang$html$Html_Attributes$rel = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'rel', value); +}; +var _elm_lang$html$Html_Attributes$datetime = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'datetime', value); +}; +var _elm_lang$html$Html_Attributes$pubdate = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'pubdate', value); +}; +var _elm_lang$html$Html_Attributes$colspan = function (n) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'colspan', + _elm_lang$core$Basics$toString(n)); +}; +var _elm_lang$html$Html_Attributes$rowspan = function (n) { + return A2( + _elm_lang$html$Html_Attributes$attribute, + 'rowspan', + _elm_lang$core$Basics$toString(n)); +}; +var _elm_lang$html$Html_Attributes$manifest = function (value) { + return A2(_elm_lang$html$Html_Attributes$attribute, 'manifest', value); +}; +var _elm_lang$html$Html_Attributes$property = _elm_lang$virtual_dom$VirtualDom$property; +var _elm_lang$html$Html_Attributes$stringProperty = F2( + function (name, string) { + return A2( + _elm_lang$html$Html_Attributes$property, + name, + _elm_lang$core$Json_Encode$string(string)); + }); +var _elm_lang$html$Html_Attributes$class = function (name) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'className', name); +}; +var _elm_lang$html$Html_Attributes$id = function (name) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'id', name); +}; +var _elm_lang$html$Html_Attributes$title = function (name) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'title', name); +}; +var _elm_lang$html$Html_Attributes$accesskey = function ($char) { + return A2( + _elm_lang$html$Html_Attributes$stringProperty, + 'accessKey', + _elm_lang$core$String$fromChar($char)); +}; +var _elm_lang$html$Html_Attributes$dir = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dir', value); +}; +var _elm_lang$html$Html_Attributes$dropzone = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dropzone', value); +}; +var _elm_lang$html$Html_Attributes$lang = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'lang', value); +}; +var _elm_lang$html$Html_Attributes$content = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'content', value); +}; +var _elm_lang$html$Html_Attributes$httpEquiv = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'httpEquiv', value); +}; +var _elm_lang$html$Html_Attributes$language = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'language', value); +}; +var _elm_lang$html$Html_Attributes$src = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'src', value); +}; +var _elm_lang$html$Html_Attributes$alt = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'alt', value); +}; +var _elm_lang$html$Html_Attributes$preload = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'preload', value); +}; +var _elm_lang$html$Html_Attributes$poster = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'poster', value); +}; +var _elm_lang$html$Html_Attributes$kind = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'kind', value); +}; +var _elm_lang$html$Html_Attributes$srclang = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srclang', value); +}; +var _elm_lang$html$Html_Attributes$sandbox = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'sandbox', value); +}; +var _elm_lang$html$Html_Attributes$srcdoc = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srcdoc', value); +}; +var _elm_lang$html$Html_Attributes$type_ = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'type', value); +}; +var _elm_lang$html$Html_Attributes$value = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'value', value); +}; +var _elm_lang$html$Html_Attributes$defaultValue = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'defaultValue', value); +}; +var _elm_lang$html$Html_Attributes$placeholder = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'placeholder', value); +}; +var _elm_lang$html$Html_Attributes$accept = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'accept', value); +}; +var _elm_lang$html$Html_Attributes$acceptCharset = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'acceptCharset', value); +}; +var _elm_lang$html$Html_Attributes$action = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'action', value); +}; +var _elm_lang$html$Html_Attributes$autocomplete = function (bool) { + return A2( + _elm_lang$html$Html_Attributes$stringProperty, + 'autocomplete', + bool ? 'on' : 'off'); +}; +var _elm_lang$html$Html_Attributes$enctype = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'enctype', value); +}; +var _elm_lang$html$Html_Attributes$method = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'method', value); +}; +var _elm_lang$html$Html_Attributes$name = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'name', value); +}; +var _elm_lang$html$Html_Attributes$pattern = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'pattern', value); +}; +var _elm_lang$html$Html_Attributes$for = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'htmlFor', value); +}; +var _elm_lang$html$Html_Attributes$max = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'max', value); +}; +var _elm_lang$html$Html_Attributes$min = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'min', value); +}; +var _elm_lang$html$Html_Attributes$step = function (n) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'step', n); +}; +var _elm_lang$html$Html_Attributes$wrap = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'wrap', value); +}; +var _elm_lang$html$Html_Attributes$usemap = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'useMap', value); +}; +var _elm_lang$html$Html_Attributes$shape = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'shape', value); +}; +var _elm_lang$html$Html_Attributes$coords = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'coords', value); +}; +var _elm_lang$html$Html_Attributes$keytype = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'keytype', value); +}; +var _elm_lang$html$Html_Attributes$align = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'align', value); +}; +var _elm_lang$html$Html_Attributes$cite = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'cite', value); +}; +var _elm_lang$html$Html_Attributes$href = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'href', value); +}; +var _elm_lang$html$Html_Attributes$target = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'target', value); +}; +var _elm_lang$html$Html_Attributes$downloadAs = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'download', value); +}; +var _elm_lang$html$Html_Attributes$hreflang = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'hreflang', value); +}; +var _elm_lang$html$Html_Attributes$ping = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'ping', value); +}; +var _elm_lang$html$Html_Attributes$start = function (n) { + return A2( + _elm_lang$html$Html_Attributes$stringProperty, + 'start', + _elm_lang$core$Basics$toString(n)); +}; +var _elm_lang$html$Html_Attributes$headers = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'headers', value); +}; +var _elm_lang$html$Html_Attributes$scope = function (value) { + return A2(_elm_lang$html$Html_Attributes$stringProperty, 'scope', value); +}; +var _elm_lang$html$Html_Attributes$boolProperty = F2( + function (name, bool) { + return A2( + _elm_lang$html$Html_Attributes$property, + name, + _elm_lang$core$Json_Encode$bool(bool)); + }); +var _elm_lang$html$Html_Attributes$hidden = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'hidden', bool); +}; +var _elm_lang$html$Html_Attributes$contenteditable = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'contentEditable', bool); +}; +var _elm_lang$html$Html_Attributes$spellcheck = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'spellcheck', bool); +}; +var _elm_lang$html$Html_Attributes$async = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'async', bool); +}; +var _elm_lang$html$Html_Attributes$defer = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'defer', bool); +}; +var _elm_lang$html$Html_Attributes$scoped = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'scoped', bool); +}; +var _elm_lang$html$Html_Attributes$autoplay = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autoplay', bool); +}; +var _elm_lang$html$Html_Attributes$controls = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'controls', bool); +}; +var _elm_lang$html$Html_Attributes$loop = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'loop', bool); +}; +var _elm_lang$html$Html_Attributes$default = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'default', bool); +}; +var _elm_lang$html$Html_Attributes$seamless = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'seamless', bool); +}; +var _elm_lang$html$Html_Attributes$checked = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'checked', bool); +}; +var _elm_lang$html$Html_Attributes$selected = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'selected', bool); +}; +var _elm_lang$html$Html_Attributes$autofocus = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autofocus', bool); +}; +var _elm_lang$html$Html_Attributes$disabled = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'disabled', bool); +}; +var _elm_lang$html$Html_Attributes$multiple = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'multiple', bool); +}; +var _elm_lang$html$Html_Attributes$novalidate = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'noValidate', bool); +}; +var _elm_lang$html$Html_Attributes$readonly = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'readOnly', bool); +}; +var _elm_lang$html$Html_Attributes$required = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'required', bool); +}; +var _elm_lang$html$Html_Attributes$ismap = function (value) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'isMap', value); +}; +var _elm_lang$html$Html_Attributes$download = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'download', bool); +}; +var _elm_lang$html$Html_Attributes$reversed = function (bool) { + return A2(_elm_lang$html$Html_Attributes$boolProperty, 'reversed', bool); +}; +var _elm_lang$html$Html_Attributes$classList = function (list) { + return _elm_lang$html$Html_Attributes$class( + A2( + _elm_lang$core$String$join, + ' ', + A2( + _elm_lang$core$List$map, + _elm_lang$core$Tuple$first, + A2(_elm_lang$core$List$filter, _elm_lang$core$Tuple$second, list)))); +}; +var _elm_lang$html$Html_Attributes$style = _elm_lang$virtual_dom$VirtualDom$style; + +var _elm_lang$html$Html_Events$keyCode = A2(_elm_lang$core$Json_Decode$field, 'keyCode', _elm_lang$core$Json_Decode$int); +var _elm_lang$html$Html_Events$targetChecked = A2( + _elm_lang$core$Json_Decode$at, + { + ctor: '::', + _0: 'target', + _1: { + ctor: '::', + _0: 'checked', + _1: {ctor: '[]'} + } + }, + _elm_lang$core$Json_Decode$bool); +var _elm_lang$html$Html_Events$targetValue = A2( + _elm_lang$core$Json_Decode$at, + { + ctor: '::', + _0: 'target', + _1: { + ctor: '::', + _0: 'value', + _1: {ctor: '[]'} + } + }, + _elm_lang$core$Json_Decode$string); +var _elm_lang$html$Html_Events$defaultOptions = _elm_lang$virtual_dom$VirtualDom$defaultOptions; +var _elm_lang$html$Html_Events$onWithOptions = _elm_lang$virtual_dom$VirtualDom$onWithOptions; +var _elm_lang$html$Html_Events$on = _elm_lang$virtual_dom$VirtualDom$on; +var _elm_lang$html$Html_Events$onFocus = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'focus', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onBlur = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'blur', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onSubmitOptions = _elm_lang$core$Native_Utils.update( + _elm_lang$html$Html_Events$defaultOptions, + {preventDefault: true}); +var _elm_lang$html$Html_Events$onSubmit = function (msg) { + return A3( + _elm_lang$html$Html_Events$onWithOptions, + 'submit', + _elm_lang$html$Html_Events$onSubmitOptions, + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onCheck = function (tagger) { + return A2( + _elm_lang$html$Html_Events$on, + 'change', + A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetChecked)); +}; +var _elm_lang$html$Html_Events$onInput = function (tagger) { + return A2( + _elm_lang$html$Html_Events$on, + 'input', + A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetValue)); +}; +var _elm_lang$html$Html_Events$onMouseOut = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'mouseout', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onMouseOver = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'mouseover', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onMouseLeave = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'mouseleave', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onMouseEnter = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'mouseenter', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onMouseUp = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'mouseup', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onMouseDown = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'mousedown', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onDoubleClick = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'dblclick', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$onClick = function (msg) { + return A2( + _elm_lang$html$Html_Events$on, + 'click', + _elm_lang$core$Json_Decode$succeed(msg)); +}; +var _elm_lang$html$Html_Events$Options = F2( + function (a, b) { + return {stopPropagation: a, preventDefault: b}; + }); + +var _elm_lang$websocket$Native_WebSocket = function() { + +function open(url, settings) +{ + return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) + { + try + { + var socket = new WebSocket(url); + socket.elm_web_socket = true; + } + catch(err) + { + return callback(_elm_lang$core$Native_Scheduler.fail({ + ctor: err.name === 'SecurityError' ? 'BadSecurity' : 'BadArgs', + _0: err.message + })); + } + + socket.addEventListener("open", function(event) { + callback(_elm_lang$core$Native_Scheduler.succeed(socket)); + }); + + socket.addEventListener("message", function(event) { + _elm_lang$core$Native_Scheduler.rawSpawn(A2(settings.onMessage, socket, event.data)); + }); + + socket.addEventListener("close", function(event) { + _elm_lang$core$Native_Scheduler.rawSpawn(settings.onClose({ + code: event.code, + reason: event.reason, + wasClean: event.wasClean + })); + }); + + return function() + { + if (socket && socket.close) + { + socket.close(); + } + }; + }); +} + +function send(socket, string) +{ + return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) + { + var result = + socket.readyState === WebSocket.OPEN + ? _elm_lang$core$Maybe$Nothing + : _elm_lang$core$Maybe$Just({ ctor: 'NotOpen' }); + + try + { + socket.send(string); + } + catch(err) + { + result = _elm_lang$core$Maybe$Just({ ctor: 'BadString' }); + } + + callback(_elm_lang$core$Native_Scheduler.succeed(result)); + }); +} + +function close(code, reason, socket) +{ + return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { + try + { + socket.close(code, reason); + } + catch(err) + { + return callback(_elm_lang$core$Native_Scheduler.fail(_elm_lang$core$Maybe$Just({ + ctor: err.name === 'SyntaxError' ? 'BadReason' : 'BadCode' + }))); + } + callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Maybe$Nothing)); + }); +} + +function bytesQueued(socket) +{ + return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { + callback(_elm_lang$core$Native_Scheduler.succeed(socket.bufferedAmount)); + }); +} + +return { + open: F2(open), + send: F2(send), + close: F3(close), + bytesQueued: bytesQueued +}; + +}(); + +var _elm_lang$websocket$WebSocket_LowLevel$bytesQueued = _elm_lang$websocket$Native_WebSocket.bytesQueued; +var _elm_lang$websocket$WebSocket_LowLevel$send = _elm_lang$websocket$Native_WebSocket.send; +var _elm_lang$websocket$WebSocket_LowLevel$closeWith = _elm_lang$websocket$Native_WebSocket.close; +var _elm_lang$websocket$WebSocket_LowLevel$close = function (socket) { + return A2( + _elm_lang$core$Task$map, + _elm_lang$core$Basics$always( + {ctor: '_Tuple0'}), + A3(_elm_lang$websocket$WebSocket_LowLevel$closeWith, 1000, '', socket)); +}; +var _elm_lang$websocket$WebSocket_LowLevel$open = _elm_lang$websocket$Native_WebSocket.open; +var _elm_lang$websocket$WebSocket_LowLevel$Settings = F2( + function (a, b) { + return {onMessage: a, onClose: b}; + }); +var _elm_lang$websocket$WebSocket_LowLevel$WebSocket = {ctor: 'WebSocket'}; +var _elm_lang$websocket$WebSocket_LowLevel$BadArgs = {ctor: 'BadArgs'}; +var _elm_lang$websocket$WebSocket_LowLevel$BadSecurity = {ctor: 'BadSecurity'}; +var _elm_lang$websocket$WebSocket_LowLevel$BadReason = {ctor: 'BadReason'}; +var _elm_lang$websocket$WebSocket_LowLevel$BadCode = {ctor: 'BadCode'}; +var _elm_lang$websocket$WebSocket_LowLevel$BadString = {ctor: 'BadString'}; +var _elm_lang$websocket$WebSocket_LowLevel$NotOpen = {ctor: 'NotOpen'}; + +var _elm_lang$websocket$WebSocket$closeConnection = function (connection) { + var _p0 = connection; + if (_p0.ctor === 'Opening') { + return _elm_lang$core$Process$kill(_p0._1); + } else { + return _elm_lang$websocket$WebSocket_LowLevel$close(_p0._0); + } +}; +var _elm_lang$websocket$WebSocket$after = function (backoff) { + return (_elm_lang$core$Native_Utils.cmp(backoff, 1) < 0) ? _elm_lang$core$Task$succeed( + {ctor: '_Tuple0'}) : _elm_lang$core$Process$sleep( + _elm_lang$core$Basics$toFloat( + 10 * Math.pow(2, backoff))); +}; +var _elm_lang$websocket$WebSocket$removeQueue = F2( + function (name, state) { + return _elm_lang$core$Native_Utils.update( + state, + { + queues: A2(_elm_lang$core$Dict$remove, name, state.queues) + }); + }); +var _elm_lang$websocket$WebSocket$updateSocket = F3( + function (name, connection, state) { + return _elm_lang$core$Native_Utils.update( + state, + { + sockets: A3(_elm_lang$core$Dict$insert, name, connection, state.sockets) + }); + }); +var _elm_lang$websocket$WebSocket$add = F2( + function (value, maybeList) { + var _p1 = maybeList; + if (_p1.ctor === 'Nothing') { + return _elm_lang$core$Maybe$Just( + { + ctor: '::', + _0: value, + _1: {ctor: '[]'} + }); + } else { + return _elm_lang$core$Maybe$Just( + {ctor: '::', _0: value, _1: _p1._0}); + } + }); +var _elm_lang$websocket$WebSocket$buildSubDict = F2( + function (subs, dict) { + buildSubDict: + while (true) { + var _p2 = subs; + if (_p2.ctor === '[]') { + return dict; + } else { + if (_p2._0.ctor === 'Listen') { + var _v3 = _p2._1, + _v4 = A3( + _elm_lang$core$Dict$update, + _p2._0._0, + _elm_lang$websocket$WebSocket$add(_p2._0._1), + dict); + subs = _v3; + dict = _v4; + continue buildSubDict; + } else { + var _v5 = _p2._1, + _v6 = A3( + _elm_lang$core$Dict$update, + _p2._0._0, + function (_p3) { + return _elm_lang$core$Maybe$Just( + A2( + _elm_lang$core$Maybe$withDefault, + {ctor: '[]'}, + _p3)); + }, + dict); + subs = _v5; + dict = _v6; + continue buildSubDict; + } + } + } + }); +var _elm_lang$websocket$WebSocket_ops = _elm_lang$websocket$WebSocket_ops || {}; +_elm_lang$websocket$WebSocket_ops['&>'] = F2( + function (t1, t2) { + return A2( + _elm_lang$core$Task$andThen, + function (_p4) { + return t2; + }, + t1); + }); +var _elm_lang$websocket$WebSocket$sendMessagesHelp = F3( + function (cmds, socketsDict, queuesDict) { + sendMessagesHelp: + while (true) { + var _p5 = cmds; + if (_p5.ctor === '[]') { + return _elm_lang$core$Task$succeed(queuesDict); + } else { + var _p9 = _p5._1; + var _p8 = _p5._0._0; + var _p7 = _p5._0._1; + var _p6 = A2(_elm_lang$core$Dict$get, _p8, socketsDict); + if ((_p6.ctor === 'Just') && (_p6._0.ctor === 'Connected')) { + return A2( + _elm_lang$websocket$WebSocket_ops['&>'], + A2(_elm_lang$websocket$WebSocket_LowLevel$send, _p6._0._0, _p7), + A3(_elm_lang$websocket$WebSocket$sendMessagesHelp, _p9, socketsDict, queuesDict)); + } else { + var _v9 = _p9, + _v10 = socketsDict, + _v11 = A3( + _elm_lang$core$Dict$update, + _p8, + _elm_lang$websocket$WebSocket$add(_p7), + queuesDict); + cmds = _v9; + socketsDict = _v10; + queuesDict = _v11; + continue sendMessagesHelp; + } + } + } + }); +var _elm_lang$websocket$WebSocket$subscription = _elm_lang$core$Native_Platform.leaf('WebSocket'); +var _elm_lang$websocket$WebSocket$command = _elm_lang$core$Native_Platform.leaf('WebSocket'); +var _elm_lang$websocket$WebSocket$State = F3( + function (a, b, c) { + return {sockets: a, queues: b, subs: c}; + }); +var _elm_lang$websocket$WebSocket$init = _elm_lang$core$Task$succeed( + A3(_elm_lang$websocket$WebSocket$State, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty)); +var _elm_lang$websocket$WebSocket$Send = F2( + function (a, b) { + return {ctor: 'Send', _0: a, _1: b}; + }); +var _elm_lang$websocket$WebSocket$send = F2( + function (url, message) { + return _elm_lang$websocket$WebSocket$command( + A2(_elm_lang$websocket$WebSocket$Send, url, message)); + }); +var _elm_lang$websocket$WebSocket$cmdMap = F2( + function (_p11, _p10) { + var _p12 = _p10; + return A2(_elm_lang$websocket$WebSocket$Send, _p12._0, _p12._1); + }); +var _elm_lang$websocket$WebSocket$KeepAlive = function (a) { + return {ctor: 'KeepAlive', _0: a}; +}; +var _elm_lang$websocket$WebSocket$keepAlive = function (url) { + return _elm_lang$websocket$WebSocket$subscription( + _elm_lang$websocket$WebSocket$KeepAlive(url)); +}; +var _elm_lang$websocket$WebSocket$Listen = F2( + function (a, b) { + return {ctor: 'Listen', _0: a, _1: b}; + }); +var _elm_lang$websocket$WebSocket$listen = F2( + function (url, tagger) { + return _elm_lang$websocket$WebSocket$subscription( + A2(_elm_lang$websocket$WebSocket$Listen, url, tagger)); + }); +var _elm_lang$websocket$WebSocket$subMap = F2( + function (func, sub) { + var _p13 = sub; + if (_p13.ctor === 'Listen') { + return A2( + _elm_lang$websocket$WebSocket$Listen, + _p13._0, + function (_p14) { + return func( + _p13._1(_p14)); + }); + } else { + return _elm_lang$websocket$WebSocket$KeepAlive(_p13._0); + } + }); +var _elm_lang$websocket$WebSocket$Connected = function (a) { + return {ctor: 'Connected', _0: a}; +}; +var _elm_lang$websocket$WebSocket$Opening = F2( + function (a, b) { + return {ctor: 'Opening', _0: a, _1: b}; + }); +var _elm_lang$websocket$WebSocket$BadOpen = function (a) { + return {ctor: 'BadOpen', _0: a}; +}; +var _elm_lang$websocket$WebSocket$GoodOpen = F2( + function (a, b) { + return {ctor: 'GoodOpen', _0: a, _1: b}; + }); +var _elm_lang$websocket$WebSocket$Die = function (a) { + return {ctor: 'Die', _0: a}; +}; +var _elm_lang$websocket$WebSocket$Receive = F2( + function (a, b) { + return {ctor: 'Receive', _0: a, _1: b}; + }); +var _elm_lang$websocket$WebSocket$open = F2( + function (name, router) { + return A2( + _elm_lang$websocket$WebSocket_LowLevel$open, + name, + { + onMessage: F2( + function (_p15, msg) { + return A2( + _elm_lang$core$Platform$sendToSelf, + router, + A2(_elm_lang$websocket$WebSocket$Receive, name, msg)); + }), + onClose: function (details) { + return A2( + _elm_lang$core$Platform$sendToSelf, + router, + _elm_lang$websocket$WebSocket$Die(name)); + } + }); + }); +var _elm_lang$websocket$WebSocket$attemptOpen = F3( + function (router, backoff, name) { + var badOpen = function (_p16) { + return A2( + _elm_lang$core$Platform$sendToSelf, + router, + _elm_lang$websocket$WebSocket$BadOpen(name)); + }; + var goodOpen = function (ws) { + return A2( + _elm_lang$core$Platform$sendToSelf, + router, + A2(_elm_lang$websocket$WebSocket$GoodOpen, name, ws)); + }; + var actuallyAttemptOpen = A2( + _elm_lang$core$Task$onError, + badOpen, + A2( + _elm_lang$core$Task$andThen, + goodOpen, + A2(_elm_lang$websocket$WebSocket$open, name, router))); + return _elm_lang$core$Process$spawn( + A2( + _elm_lang$websocket$WebSocket_ops['&>'], + _elm_lang$websocket$WebSocket$after(backoff), + actuallyAttemptOpen)); + }); +var _elm_lang$websocket$WebSocket$onEffects = F4( + function (router, cmds, subs, state) { + var newSubs = A2(_elm_lang$websocket$WebSocket$buildSubDict, subs, _elm_lang$core$Dict$empty); + var cleanup = function (newQueues) { + var rightStep = F3( + function (name, connection, getNewSockets) { + return A2( + _elm_lang$websocket$WebSocket_ops['&>'], + _elm_lang$websocket$WebSocket$closeConnection(connection), + getNewSockets); + }); + var bothStep = F4( + function (name, _p17, connection, getNewSockets) { + return A2( + _elm_lang$core$Task$map, + A2(_elm_lang$core$Dict$insert, name, connection), + getNewSockets); + }); + var leftStep = F3( + function (name, _p18, getNewSockets) { + return A2( + _elm_lang$core$Task$andThen, + function (newSockets) { + return A2( + _elm_lang$core$Task$andThen, + function (pid) { + return _elm_lang$core$Task$succeed( + A3( + _elm_lang$core$Dict$insert, + name, + A2(_elm_lang$websocket$WebSocket$Opening, 0, pid), + newSockets)); + }, + A3(_elm_lang$websocket$WebSocket$attemptOpen, router, 0, name)); + }, + getNewSockets); + }); + var newEntries = A2( + _elm_lang$core$Dict$union, + newQueues, + A2( + _elm_lang$core$Dict$map, + F2( + function (k, v) { + return {ctor: '[]'}; + }), + newSubs)); + var collectNewSockets = A6( + _elm_lang$core$Dict$merge, + leftStep, + bothStep, + rightStep, + newEntries, + state.sockets, + _elm_lang$core$Task$succeed(_elm_lang$core$Dict$empty)); + return A2( + _elm_lang$core$Task$andThen, + function (newSockets) { + return _elm_lang$core$Task$succeed( + A3(_elm_lang$websocket$WebSocket$State, newSockets, newQueues, newSubs)); + }, + collectNewSockets); + }; + var sendMessagesGetNewQueues = A3(_elm_lang$websocket$WebSocket$sendMessagesHelp, cmds, state.sockets, state.queues); + return A2(_elm_lang$core$Task$andThen, cleanup, sendMessagesGetNewQueues); + }); +var _elm_lang$websocket$WebSocket$onSelfMsg = F3( + function (router, selfMsg, state) { + var _p19 = selfMsg; + switch (_p19.ctor) { + case 'Receive': + var sends = A2( + _elm_lang$core$List$map, + function (tagger) { + return A2( + _elm_lang$core$Platform$sendToApp, + router, + tagger(_p19._1)); + }, + A2( + _elm_lang$core$Maybe$withDefault, + {ctor: '[]'}, + A2(_elm_lang$core$Dict$get, _p19._0, state.subs))); + return A2( + _elm_lang$websocket$WebSocket_ops['&>'], + _elm_lang$core$Task$sequence(sends), + _elm_lang$core$Task$succeed(state)); + case 'Die': + var _p21 = _p19._0; + var _p20 = A2(_elm_lang$core$Dict$get, _p21, state.sockets); + if (_p20.ctor === 'Nothing') { + return _elm_lang$core$Task$succeed(state); + } else { + return A2( + _elm_lang$core$Task$andThen, + function (pid) { + return _elm_lang$core$Task$succeed( + A3( + _elm_lang$websocket$WebSocket$updateSocket, + _p21, + A2(_elm_lang$websocket$WebSocket$Opening, 0, pid), + state)); + }, + A3(_elm_lang$websocket$WebSocket$attemptOpen, router, 0, _p21)); + } + case 'GoodOpen': + var _p24 = _p19._1; + var _p23 = _p19._0; + var _p22 = A2(_elm_lang$core$Dict$get, _p23, state.queues); + if (_p22.ctor === 'Nothing') { + return _elm_lang$core$Task$succeed( + A3( + _elm_lang$websocket$WebSocket$updateSocket, + _p23, + _elm_lang$websocket$WebSocket$Connected(_p24), + state)); + } else { + return A3( + _elm_lang$core$List$foldl, + F2( + function (msg, task) { + return A2( + _elm_lang$websocket$WebSocket_ops['&>'], + A2(_elm_lang$websocket$WebSocket_LowLevel$send, _p24, msg), + task); + }), + _elm_lang$core$Task$succeed( + A2( + _elm_lang$websocket$WebSocket$removeQueue, + _p23, + A3( + _elm_lang$websocket$WebSocket$updateSocket, + _p23, + _elm_lang$websocket$WebSocket$Connected(_p24), + state))), + _p22._0); + } + default: + var _p27 = _p19._0; + var _p25 = A2(_elm_lang$core$Dict$get, _p27, state.sockets); + if (_p25.ctor === 'Nothing') { + return _elm_lang$core$Task$succeed(state); + } else { + if (_p25._0.ctor === 'Opening') { + var _p26 = _p25._0._0; + return A2( + _elm_lang$core$Task$andThen, + function (pid) { + return _elm_lang$core$Task$succeed( + A3( + _elm_lang$websocket$WebSocket$updateSocket, + _p27, + A2(_elm_lang$websocket$WebSocket$Opening, _p26 + 1, pid), + state)); + }, + A3(_elm_lang$websocket$WebSocket$attemptOpen, router, _p26 + 1, _p27)); + } else { + return _elm_lang$core$Task$succeed(state); + } + } + } + }); +_elm_lang$core$Native_Platform.effectManagers['WebSocket'] = {pkg: 'elm-lang/websocket', init: _elm_lang$websocket$WebSocket$init, onEffects: _elm_lang$websocket$WebSocket$onEffects, onSelfMsg: _elm_lang$websocket$WebSocket$onSelfMsg, tag: 'fx', cmdMap: _elm_lang$websocket$WebSocket$cmdMap, subMap: _elm_lang$websocket$WebSocket$subMap}; + +var _user$project$Main$filterChoiceView = F3( + function (filter, currentFilters, action) { + var active = A2(_elm_lang$core$List$member, filter, currentFilters); + var notActive = !active; + return A2( + _elm_lang$html$Html$li, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'filter-choice-active', _1: active}, + _1: {ctor: '[]'} + } + } + }), + _1: { + ctor: '::', + _0: _elm_lang$html$Html_Events$onClick( + action(filter)), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$span, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-minus', _1: active}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-plus', _1: notActive}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: { + ctor: '::', + _0: _elm_lang$html$Html$text( + A2(_elm_lang$core$Basics_ops['++'], ' ', filter.name)), + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + }); + }); +var _user$project$Main$filterView = F4( + function (name, possibleFilters, currentFilters, action) { + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text( + A2(_elm_lang$core$Basics_ops['++'], name, ':')), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$ul, + {ctor: '[]'}, + A2( + _elm_lang$core$List$map, + function (filter) { + return A3(_user$project$Main$filterChoiceView, filter, currentFilters, action); + }, + possibleFilters)), + _1: {ctor: '[]'} + } + }); + }); +var _user$project$Main$dayEventInstanceView = function (eventInstance) { + return A2( + _elm_lang$html$Html$a, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('event'), + _1: { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$style( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'background-color', _1: eventInstance.backgroundColor}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'color', _1: eventInstance.forgroundColor}, + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$small, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text( + A2( + _elm_lang$core$Basics_ops['++'], + A3(_elm_lang$core$String$slice, 11, 16, eventInstance.from), + A2( + _elm_lang$core$Basics_ops['++'], + ' - ', + A3(_elm_lang$core$String$slice, 11, 16, eventInstance.to)))), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: A2(_elm_lang$core$Basics_ops['++'], 'fa-', eventInstance.locationIcon), + _1: true + }, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$p, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text(eventInstance.title), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + } + }); +}; +var _user$project$Main$dayRowView = F2( + function (day, model) { + var locations = A2( + _elm_lang$core$List$map, + function (eventLocation) { + return eventLocation.slug; + }, + _elm_lang$core$List$isEmpty(model.filter.eventLocations) ? model.eventLocations : model.filter.eventLocations); + var types = A2( + _elm_lang$core$List$map, + function (eventType) { + return eventType.slug; + }, + _elm_lang$core$List$isEmpty(model.filter.eventTypes) ? model.eventTypes : model.filter.eventTypes); + var filteredEventInstances = A2( + _elm_lang$core$List$filter, + function (eventInstance) { + return _elm_lang$core$Native_Utils.eq( + A3(_elm_lang$core$String$slice, 0, 10, eventInstance.from), + day.iso) && (A2(_elm_lang$core$List$member, eventInstance.location, locations) && A2(_elm_lang$core$List$member, eventInstance.eventType, types)); + }, + model.eventInstances); + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$h4, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text(day.repr), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('schedule-day-row'), + _1: {ctor: '[]'} + }, + A2(_elm_lang$core$List$map, _user$project$Main$dayEventInstanceView, filteredEventInstances)), + _1: {ctor: '[]'} + } + }); + }); +var _user$project$Main$scheduleServer = 'ws://localhost:8000/schedule/'; +var _user$project$Main$sendInitMessage = function (camp_slug) { + return A2( + _elm_lang$websocket$WebSocket$send, + _user$project$Main$scheduleServer, + A2( + _elm_lang$core$Json_Encode$encode, + 0, + _elm_lang$core$Json_Encode$object( + { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'action', + _1: _elm_lang$core$Json_Encode$string('init') + }, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'camp_slug', + _1: _elm_lang$core$Json_Encode$string(camp_slug) + }, + _1: {ctor: '[]'} + } + }))); +}; +var _user$project$Main$Model = F7( + function (a, b, c, d, e, f, g) { + return {days: a, eventInstances: b, eventLocations: c, eventTypes: d, flags: e, activeDay: f, filter: g}; + }); +var _user$project$Main$Filter = F2( + function (a, b) { + return {eventTypes: a, eventLocations: b}; + }); +var _user$project$Main$Day = F3( + function (a, b, c) { + return {day_name: a, iso: b, repr: c}; + }); +var _user$project$Main$allDaysDay = A3(_user$project$Main$Day, 'All Days', '', ''); +var _user$project$Main$init = function (flags) { + return { + ctor: '_Tuple2', + _0: A7( + _user$project$Main$Model, + {ctor: '[]'}, + {ctor: '[]'}, + {ctor: '[]'}, + {ctor: '[]'}, + flags, + _user$project$Main$allDaysDay, + A2( + _user$project$Main$Filter, + {ctor: '[]'}, + {ctor: '[]'})), + _1: _user$project$Main$sendInitMessage(flags.camp_slug) + }; +}; +var _user$project$Main$dayDecoder = A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'repr', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'iso', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'day_name', + _elm_lang$core$Json_Decode$string, + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$Day)))); +var _user$project$Main$Speaker = F2( + function (a, b) { + return {name: a, url: b}; + }); +var _user$project$Main$speakerDecoder = A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'url', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'name', + _elm_lang$core$Json_Decode$string, + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$Speaker))); +var _user$project$Main$EventInstance = function (a) { + return function (b) { + return function (c) { + return function (d) { + return function (e) { + return function (f) { + return function (g) { + return function (h) { + return function (i) { + return function (j) { + return function (k) { + return function (l) { + return function (m) { + return function (n) { + return function (o) { + return function (p) { + return {title: a, id: b, url: c, $abstract: d, eventSlug: e, eventType: f, backgroundColor: g, forgroundColor: h, from: i, to: j, timeslots: k, location: l, locationIcon: m, speakers: n, videoRecording: o, videoUrl: p}; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; +}; +var _user$project$Main$eventInstanceDecoder = A4( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, + 'video_url', + _elm_lang$core$Json_Decode$string, + '', + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'video_recording', + _elm_lang$core$Json_Decode$bool, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'speakers', + _elm_lang$core$Json_Decode$list(_user$project$Main$speakerDecoder), + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'location_icon', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'location', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'timeslots', + _elm_lang$core$Json_Decode$float, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'to', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'from', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'fg-color', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'bg-color', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'event_type', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'event_slug', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'abstract', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'url', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'id', + _elm_lang$core$Json_Decode$int, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'title', + _elm_lang$core$Json_Decode$string, + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$EventInstance))))))))))))))))); +var _user$project$Main$EventLocation = F3( + function (a, b, c) { + return {name: a, slug: b, icon: c}; + }); +var _user$project$Main$eventLocationDecoder = A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'icon', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'slug', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'name', + _elm_lang$core$Json_Decode$string, + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$EventLocation)))); +var _user$project$Main$EventType = F4( + function (a, b, c, d) { + return {name: a, slug: b, color: c, lightText: d}; + }); +var _user$project$Main$eventTypeDecoder = A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'light_text', + _elm_lang$core$Json_Decode$bool, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'color', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'slug', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'name', + _elm_lang$core$Json_Decode$string, + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$EventType))))); +var _user$project$Main$initDataDecoder = A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'event_types', + _elm_lang$core$Json_Decode$list(_user$project$Main$eventTypeDecoder), + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'event_locations', + _elm_lang$core$Json_Decode$list(_user$project$Main$eventLocationDecoder), + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'event_instances', + _elm_lang$core$Json_Decode$list(_user$project$Main$eventInstanceDecoder), + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'days', + _elm_lang$core$Json_Decode$list(_user$project$Main$dayDecoder), + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$Model))))); +var _user$project$Main$update = F2( + function (msg, model) { + var _p0 = msg; + switch (_p0.ctor) { + case 'NoOp': + return {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; + case 'WebSocketPayload': + var newModel = function () { + var _p1 = A2(_elm_lang$core$Json_Decode$decodeString, _user$project$Main$initDataDecoder, _p0._0); + if (_p1.ctor === 'Ok') { + return A3( + _p1._0, + model.flags, + _user$project$Main$allDaysDay, + A2( + _user$project$Main$Filter, + {ctor: '[]'}, + {ctor: '[]'})); + } else { + return model; + } + }(); + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + newModel, + {ctor: '[]'}); + case 'MakeActiveday': + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + {activeDay: _p0._0}), + {ctor: '[]'}); + case 'ToggleEventTypeFilter': + var _p2 = _p0._0; + var currentFilter = model.filter; + var eventTypesFilter = A2(_elm_lang$core$List$member, _p2, model.filter.eventTypes) ? A2( + _elm_lang$core$List$filter, + function (x) { + return !_elm_lang$core$Native_Utils.eq(x, _p2); + }, + model.filter.eventTypes) : {ctor: '::', _0: _p2, _1: model.filter.eventTypes}; + var newFilter = _elm_lang$core$Native_Utils.update( + currentFilter, + {eventTypes: eventTypesFilter}); + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + {filter: newFilter}), + {ctor: '[]'}); + default: + var _p3 = _p0._0; + var currentFilter = model.filter; + var eventLocationsFilter = A2(_elm_lang$core$List$member, _p3, model.filter.eventLocations) ? A2( + _elm_lang$core$List$filter, + function (x) { + return !_elm_lang$core$Native_Utils.eq(x, _p3); + }, + model.filter.eventLocations) : {ctor: '::', _0: _p3, _1: model.filter.eventLocations}; + var newFilter = _elm_lang$core$Native_Utils.update( + currentFilter, + {eventLocations: eventLocationsFilter}); + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + {filter: newFilter}), + {ctor: '[]'}); + } + }); +var _user$project$Main$Flags = F4( + function (a, b, c, d) { + return {schedule_timeslot_length_minutes: a, schedule_midnight_offset_hours: b, ics_button_href: c, camp_slug: d}; + }); +var _user$project$Main$ToggleEventLocationFilter = function (a) { + return {ctor: 'ToggleEventLocationFilter', _0: a}; +}; +var _user$project$Main$ToggleEventTypeFilter = function (a) { + return {ctor: 'ToggleEventTypeFilter', _0: a}; +}; +var _user$project$Main$MakeActiveday = function (a) { + return {ctor: 'MakeActiveday', _0: a}; +}; +var _user$project$Main$dayButton = F2( + function (day, activeDay) { + return A2( + _elm_lang$html$Html$a, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'btn-default', + _1: !_elm_lang$core$Native_Utils.eq(day, activeDay) + }, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'btn-primary', + _1: _elm_lang$core$Native_Utils.eq(day, activeDay) + }, + _1: {ctor: '[]'} + } + } + }), + _1: { + ctor: '::', + _0: _elm_lang$html$Html_Events$onClick( + _user$project$Main$MakeActiveday(day)), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: _elm_lang$html$Html$text(day.day_name), + _1: {ctor: '[]'} + }); + }); +var _user$project$Main$view = function (model) { + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('row'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$id('schedule-days'), + _1: { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('btn-group'), + _1: {ctor: '[]'} + } + }, + A2( + _elm_lang$core$List$map, + function (day) { + return A2(_user$project$Main$dayButton, day, model.activeDay); + }, + {ctor: '::', _0: _user$project$Main$allDaysDay, _1: model.days})), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$hr, + {ctor: '[]'}, + {ctor: '[]'}), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('row'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'col-sm-3', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'col-sm-push-9', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'schedule-filter', _1: true}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$h4, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Filter'), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('form-group'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A4(_user$project$Main$filterView, 'Type', model.eventTypes, model.filter.eventTypes, _user$project$Main$ToggleEventTypeFilter), + _1: { + ctor: '::', + _0: A4(_user$project$Main$filterView, 'Location', model.eventLocations, model.filter.eventLocations, _user$project$Main$ToggleEventLocationFilter), + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + } + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'col-sm-9', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'col-sm-pull-3', _1: true}, + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + }, + A2( + _elm_lang$core$List$map, + function (day) { + return A2(_user$project$Main$dayRowView, day, model); + }, + model.days)), + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + } + } + }); +}; +var _user$project$Main$WebSocketPayload = function (a) { + return {ctor: 'WebSocketPayload', _0: a}; +}; +var _user$project$Main$subscriptions = function (model) { + return A2(_elm_lang$websocket$WebSocket$listen, _user$project$Main$scheduleServer, _user$project$Main$WebSocketPayload); +}; +var _user$project$Main$main = _elm_lang$html$Html$programWithFlags( + {init: _user$project$Main$init, view: _user$project$Main$view, update: _user$project$Main$update, subscriptions: _user$project$Main$subscriptions})( + A2( + _elm_lang$core$Json_Decode$andThen, + function (camp_slug) { + return A2( + _elm_lang$core$Json_Decode$andThen, + function (ics_button_href) { + return A2( + _elm_lang$core$Json_Decode$andThen, + function (schedule_midnight_offset_hours) { + return A2( + _elm_lang$core$Json_Decode$andThen, + function (schedule_timeslot_length_minutes) { + return _elm_lang$core$Json_Decode$succeed( + {camp_slug: camp_slug, ics_button_href: ics_button_href, schedule_midnight_offset_hours: schedule_midnight_offset_hours, schedule_timeslot_length_minutes: schedule_timeslot_length_minutes}); + }, + A2(_elm_lang$core$Json_Decode$field, 'schedule_timeslot_length_minutes', _elm_lang$core$Json_Decode$int)); + }, + A2(_elm_lang$core$Json_Decode$field, 'schedule_midnight_offset_hours', _elm_lang$core$Json_Decode$int)); + }, + A2(_elm_lang$core$Json_Decode$field, 'ics_button_href', _elm_lang$core$Json_Decode$string)); + }, + A2(_elm_lang$core$Json_Decode$field, 'camp_slug', _elm_lang$core$Json_Decode$string))); +var _user$project$Main$NoOp = {ctor: 'NoOp'}; + +var Elm = {}; +Elm['Main'] = Elm['Main'] || {}; +if (typeof _user$project$Main$main !== 'undefined') { + _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Main.Msg":{"args":[],"tags":{"MakeActiveday":["Main.Day"],"WebSocketPayload":["String"],"ToggleEventLocationFilter":["Main.EventLocation"],"NoOp":[],"ToggleEventTypeFilter":["Main.EventType"]}}},"aliases":{"Main.Day":{"args":[],"type":"{ day_name : String, iso : String, repr : String }"},"Main.EventType":{"args":[],"type":"{ name : String, slug : String, color : String, lightText : Bool }"},"Main.EventLocation":{"args":[],"type":"{ name : String, slug : String, icon : String }"}},"message":"Main.Msg"},"versions":{"elm":"0.18.0"}}); +} + +if (typeof define === "function" && define['amd']) +{ + define([], function() { return Elm; }); + return; +} + +if (typeof module === "object") +{ + module['exports'] = Elm; + return; +} + +var globalElm = this['Elm']; +if (typeof globalElm === "undefined") +{ + this['Elm'] = Elm; + return; +} + +for (var publicModule in Elm) +{ + if (publicModule in globalElm) + { + throw new Error('There are two Elm modules called `' + publicModule + '` on this page! Rename one of them.'); + } + globalElm[publicModule] = Elm[publicModule]; +} + +}).call(this); + diff --git a/src/program/templates/schedule_overview.html b/src/program/templates/schedule_overview.html index d5a587b7..064badb1 100644 --- a/src/program/templates/schedule_overview.html +++ b/src/program/templates/schedule_overview.html @@ -1,22 +1,24 @@ -{% extends 'schedule_base.html' %} +{% extends 'program_base.html' %} {% load commonmark %} {% load staticfiles %} -{% block schedule_content %} +{% block program_content %}
- - + -{% endblock schedule_content %} +{% endblock %} diff --git a/src/program/templates/schedule_overview_elm.html b/src/program/templates/schedule_overview_elm.html deleted file mode 100644 index 064badb1..00000000 --- a/src/program/templates/schedule_overview_elm.html +++ /dev/null @@ -1,24 +0,0 @@ -{% extends 'program_base.html' %} - -{% load commonmark %} -{% load staticfiles %} - -{% block program_content %} - -
- - - - - -{% endblock %} diff --git a/src/program/views.py b/src/program/views.py index a866afc4..ca63e4b5 100644 --- a/src/program/views.py +++ b/src/program/views.py @@ -264,7 +264,7 @@ class EventDetailView(CampViewMixin, DetailView): class ScheduleView(CampViewMixin, TemplateView): - template_name = 'schedule_overview_elm.html' + template_name = 'schedule_overview.html' def get_context_data(self, *args, **kwargs): context = super(ScheduleView, self).get_context_data(**kwargs) From ebf452642528350ac1b397b57a22c4b3ece18192 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 16 Jul 2017 14:24:54 +0200 Subject: [PATCH 05/54] Woops, no need to commit compiled version yet. --- src/program/static/js/elm_based_schedule.js | 14044 ------------------ 1 file changed, 14044 deletions(-) delete mode 100644 src/program/static/js/elm_based_schedule.js diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js deleted file mode 100644 index e99670dc..00000000 --- a/src/program/static/js/elm_based_schedule.js +++ /dev/null @@ -1,14044 +0,0 @@ - -(function() { -'use strict'; - -function F2(fun) -{ - function wrapper(a) { return function(b) { return fun(a,b); }; } - wrapper.arity = 2; - wrapper.func = fun; - return wrapper; -} - -function F3(fun) -{ - function wrapper(a) { - return function(b) { return function(c) { return fun(a, b, c); }; }; - } - wrapper.arity = 3; - wrapper.func = fun; - return wrapper; -} - -function F4(fun) -{ - function wrapper(a) { return function(b) { return function(c) { - return function(d) { return fun(a, b, c, d); }; }; }; - } - wrapper.arity = 4; - wrapper.func = fun; - return wrapper; -} - -function F5(fun) -{ - function wrapper(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; }; - } - wrapper.arity = 5; - wrapper.func = fun; - return wrapper; -} - -function F6(fun) -{ - function wrapper(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return function(f) { - return fun(a, b, c, d, e, f); }; }; }; }; }; - } - wrapper.arity = 6; - wrapper.func = fun; - return wrapper; -} - -function F7(fun) -{ - function wrapper(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return function(f) { - return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; }; - } - wrapper.arity = 7; - wrapper.func = fun; - return wrapper; -} - -function F8(fun) -{ - function wrapper(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return function(f) { - return function(g) { return function(h) { - return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; }; - } - wrapper.arity = 8; - wrapper.func = fun; - return wrapper; -} - -function F9(fun) -{ - function wrapper(a) { return function(b) { return function(c) { - return function(d) { return function(e) { return function(f) { - return function(g) { return function(h) { return function(i) { - return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; }; - } - wrapper.arity = 9; - wrapper.func = fun; - return wrapper; -} - -function A2(fun, a, b) -{ - return fun.arity === 2 - ? fun.func(a, b) - : fun(a)(b); -} -function A3(fun, a, b, c) -{ - return fun.arity === 3 - ? fun.func(a, b, c) - : fun(a)(b)(c); -} -function A4(fun, a, b, c, d) -{ - return fun.arity === 4 - ? fun.func(a, b, c, d) - : fun(a)(b)(c)(d); -} -function A5(fun, a, b, c, d, e) -{ - return fun.arity === 5 - ? fun.func(a, b, c, d, e) - : fun(a)(b)(c)(d)(e); -} -function A6(fun, a, b, c, d, e, f) -{ - return fun.arity === 6 - ? fun.func(a, b, c, d, e, f) - : fun(a)(b)(c)(d)(e)(f); -} -function A7(fun, a, b, c, d, e, f, g) -{ - return fun.arity === 7 - ? fun.func(a, b, c, d, e, f, g) - : fun(a)(b)(c)(d)(e)(f)(g); -} -function A8(fun, a, b, c, d, e, f, g, h) -{ - return fun.arity === 8 - ? fun.func(a, b, c, d, e, f, g, h) - : fun(a)(b)(c)(d)(e)(f)(g)(h); -} -function A9(fun, a, b, c, d, e, f, g, h, i) -{ - return fun.arity === 9 - ? fun.func(a, b, c, d, e, f, g, h, i) - : fun(a)(b)(c)(d)(e)(f)(g)(h)(i); -} - -//import Native.List // - -var _elm_lang$core$Native_Array = function() { - -// A RRB-Tree has two distinct data types. -// Leaf -> "height" is always 0 -// "table" is an array of elements -// Node -> "height" is always greater than 0 -// "table" is an array of child nodes -// "lengths" is an array of accumulated lengths of the child nodes - -// M is the maximal table size. 32 seems fast. E is the allowed increase -// of search steps when concatting to find an index. Lower values will -// decrease balancing, but will increase search steps. -var M = 32; -var E = 2; - -// An empty array. -var empty = { - ctor: '_Array', - height: 0, - table: [] -}; - - -function get(i, array) -{ - if (i < 0 || i >= length(array)) - { - throw new Error( - 'Index ' + i + ' is out of range. Check the length of ' + - 'your array first or use getMaybe or getWithDefault.'); - } - return unsafeGet(i, array); -} - - -function unsafeGet(i, array) -{ - for (var x = array.height; x > 0; x--) - { - var slot = i >> (x * 5); - while (array.lengths[slot] <= i) - { - slot++; - } - if (slot > 0) - { - i -= array.lengths[slot - 1]; - } - array = array.table[slot]; - } - return array.table[i]; -} - - -// Sets the value at the index i. Only the nodes leading to i will get -// copied and updated. -function set(i, item, array) -{ - if (i < 0 || length(array) <= i) - { - return array; - } - return unsafeSet(i, item, array); -} - - -function unsafeSet(i, item, array) -{ - array = nodeCopy(array); - - if (array.height === 0) - { - array.table[i] = item; - } - else - { - var slot = getSlot(i, array); - if (slot > 0) - { - i -= array.lengths[slot - 1]; - } - array.table[slot] = unsafeSet(i, item, array.table[slot]); - } - return array; -} - - -function initialize(len, f) -{ - if (len <= 0) - { - return empty; - } - var h = Math.floor( Math.log(len) / Math.log(M) ); - return initialize_(f, h, 0, len); -} - -function initialize_(f, h, from, to) -{ - if (h === 0) - { - var table = new Array((to - from) % (M + 1)); - for (var i = 0; i < table.length; i++) - { - table[i] = f(from + i); - } - return { - ctor: '_Array', - height: 0, - table: table - }; - } - - var step = Math.pow(M, h); - var table = new Array(Math.ceil((to - from) / step)); - var lengths = new Array(table.length); - for (var i = 0; i < table.length; i++) - { - table[i] = initialize_(f, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); - lengths[i] = length(table[i]) + (i > 0 ? lengths[i-1] : 0); - } - return { - ctor: '_Array', - height: h, - table: table, - lengths: lengths - }; -} - -function fromList(list) -{ - if (list.ctor === '[]') - { - return empty; - } - - // Allocate M sized blocks (table) and write list elements to it. - var table = new Array(M); - var nodes = []; - var i = 0; - - while (list.ctor !== '[]') - { - table[i] = list._0; - list = list._1; - i++; - - // table is full, so we can push a leaf containing it into the - // next node. - if (i === M) - { - var leaf = { - ctor: '_Array', - height: 0, - table: table - }; - fromListPush(leaf, nodes); - table = new Array(M); - i = 0; - } - } - - // Maybe there is something left on the table. - if (i > 0) - { - var leaf = { - ctor: '_Array', - height: 0, - table: table.splice(0, i) - }; - fromListPush(leaf, nodes); - } - - // Go through all of the nodes and eventually push them into higher nodes. - for (var h = 0; h < nodes.length - 1; h++) - { - if (nodes[h].table.length > 0) - { - fromListPush(nodes[h], nodes); - } - } - - var head = nodes[nodes.length - 1]; - if (head.height > 0 && head.table.length === 1) - { - return head.table[0]; - } - else - { - return head; - } -} - -// Push a node into a higher node as a child. -function fromListPush(toPush, nodes) -{ - var h = toPush.height; - - // Maybe the node on this height does not exist. - if (nodes.length === h) - { - var node = { - ctor: '_Array', - height: h + 1, - table: [], - lengths: [] - }; - nodes.push(node); - } - - nodes[h].table.push(toPush); - var len = length(toPush); - if (nodes[h].lengths.length > 0) - { - len += nodes[h].lengths[nodes[h].lengths.length - 1]; - } - nodes[h].lengths.push(len); - - if (nodes[h].table.length === M) - { - fromListPush(nodes[h], nodes); - nodes[h] = { - ctor: '_Array', - height: h + 1, - table: [], - lengths: [] - }; - } -} - -// Pushes an item via push_ to the bottom right of a tree. -function push(item, a) -{ - var pushed = push_(item, a); - if (pushed !== null) - { - return pushed; - } - - var newTree = create(item, a.height); - return siblise(a, newTree); -} - -// Recursively tries to push an item to the bottom-right most -// tree possible. If there is no space left for the item, -// null will be returned. -function push_(item, a) -{ - // Handle resursion stop at leaf level. - if (a.height === 0) - { - if (a.table.length < M) - { - var newA = { - ctor: '_Array', - height: 0, - table: a.table.slice() - }; - newA.table.push(item); - return newA; - } - else - { - return null; - } - } - - // Recursively push - var pushed = push_(item, botRight(a)); - - // There was space in the bottom right tree, so the slot will - // be updated. - if (pushed !== null) - { - var newA = nodeCopy(a); - newA.table[newA.table.length - 1] = pushed; - newA.lengths[newA.lengths.length - 1]++; - return newA; - } - - // When there was no space left, check if there is space left - // for a new slot with a tree which contains only the item - // at the bottom. - if (a.table.length < M) - { - var newSlot = create(item, a.height - 1); - var newA = nodeCopy(a); - newA.table.push(newSlot); - newA.lengths.push(newA.lengths[newA.lengths.length - 1] + length(newSlot)); - return newA; - } - else - { - return null; - } -} - -// Converts an array into a list of elements. -function toList(a) -{ - return toList_(_elm_lang$core$Native_List.Nil, a); -} - -function toList_(list, a) -{ - for (var i = a.table.length - 1; i >= 0; i--) - { - list = - a.height === 0 - ? _elm_lang$core$Native_List.Cons(a.table[i], list) - : toList_(list, a.table[i]); - } - return list; -} - -// Maps a function over the elements of an array. -function map(f, a) -{ - var newA = { - ctor: '_Array', - height: a.height, - table: new Array(a.table.length) - }; - if (a.height > 0) - { - newA.lengths = a.lengths; - } - for (var i = 0; i < a.table.length; i++) - { - newA.table[i] = - a.height === 0 - ? f(a.table[i]) - : map(f, a.table[i]); - } - return newA; -} - -// Maps a function over the elements with their index as first argument. -function indexedMap(f, a) -{ - return indexedMap_(f, a, 0); -} - -function indexedMap_(f, a, from) -{ - var newA = { - ctor: '_Array', - height: a.height, - table: new Array(a.table.length) - }; - if (a.height > 0) - { - newA.lengths = a.lengths; - } - for (var i = 0; i < a.table.length; i++) - { - newA.table[i] = - a.height === 0 - ? A2(f, from + i, a.table[i]) - : indexedMap_(f, a.table[i], i == 0 ? from : from + a.lengths[i - 1]); - } - return newA; -} - -function foldl(f, b, a) -{ - if (a.height === 0) - { - for (var i = 0; i < a.table.length; i++) - { - b = A2(f, a.table[i], b); - } - } - else - { - for (var i = 0; i < a.table.length; i++) - { - b = foldl(f, b, a.table[i]); - } - } - return b; -} - -function foldr(f, b, a) -{ - if (a.height === 0) - { - for (var i = a.table.length; i--; ) - { - b = A2(f, a.table[i], b); - } - } - else - { - for (var i = a.table.length; i--; ) - { - b = foldr(f, b, a.table[i]); - } - } - return b; -} - -// TODO: currently, it slices the right, then the left. This can be -// optimized. -function slice(from, to, a) -{ - if (from < 0) - { - from += length(a); - } - if (to < 0) - { - to += length(a); - } - return sliceLeft(from, sliceRight(to, a)); -} - -function sliceRight(to, a) -{ - if (to === length(a)) - { - return a; - } - - // Handle leaf level. - if (a.height === 0) - { - var newA = { ctor:'_Array', height:0 }; - newA.table = a.table.slice(0, to); - return newA; - } - - // Slice the right recursively. - var right = getSlot(to, a); - var sliced = sliceRight(to - (right > 0 ? a.lengths[right - 1] : 0), a.table[right]); - - // Maybe the a node is not even needed, as sliced contains the whole slice. - if (right === 0) - { - return sliced; - } - - // Create new node. - var newA = { - ctor: '_Array', - height: a.height, - table: a.table.slice(0, right), - lengths: a.lengths.slice(0, right) - }; - if (sliced.table.length > 0) - { - newA.table[right] = sliced; - newA.lengths[right] = length(sliced) + (right > 0 ? newA.lengths[right - 1] : 0); - } - return newA; -} - -function sliceLeft(from, a) -{ - if (from === 0) - { - return a; - } - - // Handle leaf level. - if (a.height === 0) - { - var newA = { ctor:'_Array', height:0 }; - newA.table = a.table.slice(from, a.table.length + 1); - return newA; - } - - // Slice the left recursively. - var left = getSlot(from, a); - var sliced = sliceLeft(from - (left > 0 ? a.lengths[left - 1] : 0), a.table[left]); - - // Maybe the a node is not even needed, as sliced contains the whole slice. - if (left === a.table.length - 1) - { - return sliced; - } - - // Create new node. - var newA = { - ctor: '_Array', - height: a.height, - table: a.table.slice(left, a.table.length + 1), - lengths: new Array(a.table.length - left) - }; - newA.table[0] = sliced; - var len = 0; - for (var i = 0; i < newA.table.length; i++) - { - len += length(newA.table[i]); - newA.lengths[i] = len; - } - - return newA; -} - -// Appends two trees. -function append(a,b) -{ - if (a.table.length === 0) - { - return b; - } - if (b.table.length === 0) - { - return a; - } - - var c = append_(a, b); - - // Check if both nodes can be crunshed together. - if (c[0].table.length + c[1].table.length <= M) - { - if (c[0].table.length === 0) - { - return c[1]; - } - if (c[1].table.length === 0) - { - return c[0]; - } - - // Adjust .table and .lengths - c[0].table = c[0].table.concat(c[1].table); - if (c[0].height > 0) - { - var len = length(c[0]); - for (var i = 0; i < c[1].lengths.length; i++) - { - c[1].lengths[i] += len; - } - c[0].lengths = c[0].lengths.concat(c[1].lengths); - } - - return c[0]; - } - - if (c[0].height > 0) - { - var toRemove = calcToRemove(a, b); - if (toRemove > E) - { - c = shuffle(c[0], c[1], toRemove); - } - } - - return siblise(c[0], c[1]); -} - -// Returns an array of two nodes; right and left. One node _may_ be empty. -function append_(a, b) -{ - if (a.height === 0 && b.height === 0) - { - return [a, b]; - } - - if (a.height !== 1 || b.height !== 1) - { - if (a.height === b.height) - { - a = nodeCopy(a); - b = nodeCopy(b); - var appended = append_(botRight(a), botLeft(b)); - - insertRight(a, appended[1]); - insertLeft(b, appended[0]); - } - else if (a.height > b.height) - { - a = nodeCopy(a); - var appended = append_(botRight(a), b); - - insertRight(a, appended[0]); - b = parentise(appended[1], appended[1].height + 1); - } - else - { - b = nodeCopy(b); - var appended = append_(a, botLeft(b)); - - var left = appended[0].table.length === 0 ? 0 : 1; - var right = left === 0 ? 1 : 0; - insertLeft(b, appended[left]); - a = parentise(appended[right], appended[right].height + 1); - } - } - - // Check if balancing is needed and return based on that. - if (a.table.length === 0 || b.table.length === 0) - { - return [a, b]; - } - - var toRemove = calcToRemove(a, b); - if (toRemove <= E) - { - return [a, b]; - } - return shuffle(a, b, toRemove); -} - -// Helperfunctions for append_. Replaces a child node at the side of the parent. -function insertRight(parent, node) -{ - var index = parent.table.length - 1; - parent.table[index] = node; - parent.lengths[index] = length(node); - parent.lengths[index] += index > 0 ? parent.lengths[index - 1] : 0; -} - -function insertLeft(parent, node) -{ - if (node.table.length > 0) - { - parent.table[0] = node; - parent.lengths[0] = length(node); - - var len = length(parent.table[0]); - for (var i = 1; i < parent.lengths.length; i++) - { - len += length(parent.table[i]); - parent.lengths[i] = len; - } - } - else - { - parent.table.shift(); - for (var i = 1; i < parent.lengths.length; i++) - { - parent.lengths[i] = parent.lengths[i] - parent.lengths[0]; - } - parent.lengths.shift(); - } -} - -// Returns the extra search steps for E. Refer to the paper. -function calcToRemove(a, b) -{ - var subLengths = 0; - for (var i = 0; i < a.table.length; i++) - { - subLengths += a.table[i].table.length; - } - for (var i = 0; i < b.table.length; i++) - { - subLengths += b.table[i].table.length; - } - - var toRemove = a.table.length + b.table.length; - return toRemove - (Math.floor((subLengths - 1) / M) + 1); -} - -// get2, set2 and saveSlot are helpers for accessing elements over two arrays. -function get2(a, b, index) -{ - return index < a.length - ? a[index] - : b[index - a.length]; -} - -function set2(a, b, index, value) -{ - if (index < a.length) - { - a[index] = value; - } - else - { - b[index - a.length] = value; - } -} - -function saveSlot(a, b, index, slot) -{ - set2(a.table, b.table, index, slot); - - var l = (index === 0 || index === a.lengths.length) - ? 0 - : get2(a.lengths, a.lengths, index - 1); - - set2(a.lengths, b.lengths, index, l + length(slot)); -} - -// Creates a node or leaf with a given length at their arrays for perfomance. -// Is only used by shuffle. -function createNode(h, length) -{ - if (length < 0) - { - length = 0; - } - var a = { - ctor: '_Array', - height: h, - table: new Array(length) - }; - if (h > 0) - { - a.lengths = new Array(length); - } - return a; -} - -// Returns an array of two balanced nodes. -function shuffle(a, b, toRemove) -{ - var newA = createNode(a.height, Math.min(M, a.table.length + b.table.length - toRemove)); - var newB = createNode(a.height, newA.table.length - (a.table.length + b.table.length - toRemove)); - - // Skip the slots with size M. More precise: copy the slot references - // to the new node - var read = 0; - while (get2(a.table, b.table, read).table.length % M === 0) - { - set2(newA.table, newB.table, read, get2(a.table, b.table, read)); - set2(newA.lengths, newB.lengths, read, get2(a.lengths, b.lengths, read)); - read++; - } - - // Pulling items from left to right, caching in a slot before writing - // it into the new nodes. - var write = read; - var slot = new createNode(a.height - 1, 0); - var from = 0; - - // If the current slot is still containing data, then there will be at - // least one more write, so we do not break this loop yet. - while (read - write - (slot.table.length > 0 ? 1 : 0) < toRemove) - { - // Find out the max possible items for copying. - var source = get2(a.table, b.table, read); - var to = Math.min(M - slot.table.length, source.table.length); - - // Copy and adjust size table. - slot.table = slot.table.concat(source.table.slice(from, to)); - if (slot.height > 0) - { - var len = slot.lengths.length; - for (var i = len; i < len + to - from; i++) - { - slot.lengths[i] = length(slot.table[i]); - slot.lengths[i] += (i > 0 ? slot.lengths[i - 1] : 0); - } - } - - from += to; - - // Only proceed to next slots[i] if the current one was - // fully copied. - if (source.table.length <= to) - { - read++; from = 0; - } - - // Only create a new slot if the current one is filled up. - if (slot.table.length === M) - { - saveSlot(newA, newB, write, slot); - slot = createNode(a.height - 1, 0); - write++; - } - } - - // Cleanup after the loop. Copy the last slot into the new nodes. - if (slot.table.length > 0) - { - saveSlot(newA, newB, write, slot); - write++; - } - - // Shift the untouched slots to the left - while (read < a.table.length + b.table.length ) - { - saveSlot(newA, newB, write, get2(a.table, b.table, read)); - read++; - write++; - } - - return [newA, newB]; -} - -// Navigation functions -function botRight(a) -{ - return a.table[a.table.length - 1]; -} -function botLeft(a) -{ - return a.table[0]; -} - -// Copies a node for updating. Note that you should not use this if -// only updating only one of "table" or "lengths" for performance reasons. -function nodeCopy(a) -{ - var newA = { - ctor: '_Array', - height: a.height, - table: a.table.slice() - }; - if (a.height > 0) - { - newA.lengths = a.lengths.slice(); - } - return newA; -} - -// Returns how many items are in the tree. -function length(array) -{ - if (array.height === 0) - { - return array.table.length; - } - else - { - return array.lengths[array.lengths.length - 1]; - } -} - -// Calculates in which slot of "table" the item probably is, then -// find the exact slot via forward searching in "lengths". Returns the index. -function getSlot(i, a) -{ - var slot = i >> (5 * a.height); - while (a.lengths[slot] <= i) - { - slot++; - } - return slot; -} - -// Recursively creates a tree with a given height containing -// only the given item. -function create(item, h) -{ - if (h === 0) - { - return { - ctor: '_Array', - height: 0, - table: [item] - }; - } - return { - ctor: '_Array', - height: h, - table: [create(item, h - 1)], - lengths: [1] - }; -} - -// Recursively creates a tree that contains the given tree. -function parentise(tree, h) -{ - if (h === tree.height) - { - return tree; - } - - return { - ctor: '_Array', - height: h, - table: [parentise(tree, h - 1)], - lengths: [length(tree)] - }; -} - -// Emphasizes blood brotherhood beneath two trees. -function siblise(a, b) -{ - return { - ctor: '_Array', - height: a.height + 1, - table: [a, b], - lengths: [length(a), length(a) + length(b)] - }; -} - -function toJSArray(a) -{ - var jsArray = new Array(length(a)); - toJSArray_(jsArray, 0, a); - return jsArray; -} - -function toJSArray_(jsArray, i, a) -{ - for (var t = 0; t < a.table.length; t++) - { - if (a.height === 0) - { - jsArray[i + t] = a.table[t]; - } - else - { - var inc = t === 0 ? 0 : a.lengths[t - 1]; - toJSArray_(jsArray, i + inc, a.table[t]); - } - } -} - -function fromJSArray(jsArray) -{ - if (jsArray.length === 0) - { - return empty; - } - var h = Math.floor(Math.log(jsArray.length) / Math.log(M)); - return fromJSArray_(jsArray, h, 0, jsArray.length); -} - -function fromJSArray_(jsArray, h, from, to) -{ - if (h === 0) - { - return { - ctor: '_Array', - height: 0, - table: jsArray.slice(from, to) - }; - } - - var step = Math.pow(M, h); - var table = new Array(Math.ceil((to - from) / step)); - var lengths = new Array(table.length); - for (var i = 0; i < table.length; i++) - { - table[i] = fromJSArray_(jsArray, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); - lengths[i] = length(table[i]) + (i > 0 ? lengths[i - 1] : 0); - } - return { - ctor: '_Array', - height: h, - table: table, - lengths: lengths - }; -} - -return { - empty: empty, - fromList: fromList, - toList: toList, - initialize: F2(initialize), - append: F2(append), - push: F2(push), - slice: F3(slice), - get: F2(get), - set: F3(set), - map: F2(map), - indexedMap: F2(indexedMap), - foldl: F3(foldl), - foldr: F3(foldr), - length: length, - - toJSArray: toJSArray, - fromJSArray: fromJSArray -}; - -}(); -//import Native.Utils // - -var _elm_lang$core$Native_Basics = function() { - -function div(a, b) -{ - return (a / b) | 0; -} -function rem(a, b) -{ - return a % b; -} -function mod(a, b) -{ - if (b === 0) - { - throw new Error('Cannot perform mod 0. Division by zero error.'); - } - var r = a % b; - var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r + b) : -mod(-a, -b)); - - return m === b ? 0 : m; -} -function logBase(base, n) -{ - return Math.log(n) / Math.log(base); -} -function negate(n) -{ - return -n; -} -function abs(n) -{ - return n < 0 ? -n : n; -} - -function min(a, b) -{ - return _elm_lang$core$Native_Utils.cmp(a, b) < 0 ? a : b; -} -function max(a, b) -{ - return _elm_lang$core$Native_Utils.cmp(a, b) > 0 ? a : b; -} -function clamp(lo, hi, n) -{ - return _elm_lang$core$Native_Utils.cmp(n, lo) < 0 - ? lo - : _elm_lang$core$Native_Utils.cmp(n, hi) > 0 - ? hi - : n; -} - -var ord = ['LT', 'EQ', 'GT']; - -function compare(x, y) -{ - return { ctor: ord[_elm_lang$core$Native_Utils.cmp(x, y) + 1] }; -} - -function xor(a, b) -{ - return a !== b; -} -function not(b) -{ - return !b; -} -function isInfinite(n) -{ - return n === Infinity || n === -Infinity; -} - -function truncate(n) -{ - return n | 0; -} - -function degrees(d) -{ - return d * Math.PI / 180; -} -function turns(t) -{ - return 2 * Math.PI * t; -} -function fromPolar(point) -{ - var r = point._0; - var t = point._1; - return _elm_lang$core$Native_Utils.Tuple2(r * Math.cos(t), r * Math.sin(t)); -} -function toPolar(point) -{ - var x = point._0; - var y = point._1; - return _elm_lang$core$Native_Utils.Tuple2(Math.sqrt(x * x + y * y), Math.atan2(y, x)); -} - -return { - div: F2(div), - rem: F2(rem), - mod: F2(mod), - - 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: F2(Math.atan2), - - degrees: degrees, - turns: turns, - fromPolar: fromPolar, - toPolar: toPolar, - - sqrt: Math.sqrt, - logBase: F2(logBase), - negate: negate, - abs: abs, - min: F2(min), - max: F2(max), - clamp: F3(clamp), - compare: F2(compare), - - xor: F2(xor), - not: not, - - truncate: truncate, - ceiling: Math.ceil, - floor: Math.floor, - round: Math.round, - toFloat: function(x) { return x; }, - isNaN: isNaN, - isInfinite: isInfinite -}; - -}(); -//import // - -var _elm_lang$core$Native_Utils = function() { - -// COMPARISONS - -function eq(x, y) -{ - var stack = []; - var isEqual = eqHelp(x, y, 0, stack); - var pair; - while (isEqual && (pair = stack.pop())) - { - isEqual = eqHelp(pair.x, pair.y, 0, stack); - } - return isEqual; -} - - -function eqHelp(x, y, depth, stack) -{ - if (depth > 100) - { - stack.push({ x: x, y: y }); - return true; - } - - if (x === y) - { - return true; - } - - if (typeof x !== 'object') - { - if (typeof x === '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 (x === null || y === null) - { - return false - } - - if (x instanceof Date) - { - return x.getTime() === y.getTime(); - } - - if (!('ctor' in x)) - { - for (var key in x) - { - if (!eqHelp(x[key], y[key], depth + 1, stack)) - { - return false; - } - } - return true; - } - - // convert Dicts and Sets to lists - if (x.ctor === 'RBNode_elm_builtin' || x.ctor === 'RBEmpty_elm_builtin') - { - x = _elm_lang$core$Dict$toList(x); - y = _elm_lang$core$Dict$toList(y); - } - if (x.ctor === 'Set_elm_builtin') - { - x = _elm_lang$core$Set$toList(x); - y = _elm_lang$core$Set$toList(y); - } - - // check if lists are equal without recursion - if (x.ctor === '::') - { - var a = x; - var b = y; - while (a.ctor === '::' && b.ctor === '::') - { - if (!eqHelp(a._0, b._0, depth + 1, stack)) - { - return false; - } - a = a._1; - b = b._1; - } - return a.ctor === b.ctor; - } - - // check if Arrays are equal - if (x.ctor === '_Array') - { - var xs = _elm_lang$core$Native_Array.toJSArray(x); - var ys = _elm_lang$core$Native_Array.toJSArray(y); - if (xs.length !== ys.length) - { - return false; - } - for (var i = 0; i < xs.length; i++) - { - if (!eqHelp(xs[i], ys[i], depth + 1, stack)) - { - return false; - } - } - return true; - } - - if (!eqHelp(x.ctor, y.ctor, depth + 1, stack)) - { - return false; - } - - for (var key in x) - { - if (!eqHelp(x[key], y[key], depth + 1, stack)) - { - return false; - } - } - return true; -} - -// Code in Generate/JavaScript.hs, Basics.js, and List.js depends on -// the particular integer values assigned to LT, EQ, and GT. - -var LT = -1, EQ = 0, GT = 1; - -function cmp(x, y) -{ - if (typeof x !== 'object') - { - return x === y ? EQ : x < y ? LT : GT; - } - - if (x instanceof String) - { - var a = x.valueOf(); - var b = y.valueOf(); - return a === b ? EQ : a < b ? LT : GT; - } - - if (x.ctor === '::' || x.ctor === '[]') - { - while (x.ctor === '::' && y.ctor === '::') - { - var ord = cmp(x._0, y._0); - if (ord !== EQ) - { - return ord; - } - x = x._1; - y = y._1; - } - return x.ctor === y.ctor ? EQ : x.ctor === '[]' ? LT : GT; - } - - if (x.ctor.slice(0, 6) === '_Tuple') - { - var ord; - var n = x.ctor.slice(6) - 0; - var err = 'cannot compare tuples with more than 6 elements.'; - if (n === 0) return EQ; - if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord; - if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord; - if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord; - if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord; - if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord; - if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord; - if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } } - return EQ; - } - - throw new Error( - 'Comparison error: comparison is only defined on ints, ' - + 'floats, times, chars, strings, lists of comparable values, ' - + 'and tuples of comparable values.' - ); -} - - -// COMMON VALUES - -var Tuple0 = { - ctor: '_Tuple0' -}; - -function Tuple2(x, y) -{ - return { - ctor: '_Tuple2', - _0: x, - _1: y - }; -} - -function chr(c) -{ - return new String(c); -} - - -// GUID - -var count = 0; -function guid(_) -{ - return count++; -} - - -// RECORDS - -function update(oldRecord, updatedFields) -{ - var newRecord = {}; - - for (var key in oldRecord) - { - newRecord[key] = oldRecord[key]; - } - - for (var key in updatedFields) - { - newRecord[key] = updatedFields[key]; - } - - return newRecord; -} - - -//// LIST STUFF //// - -var Nil = { ctor: '[]' }; - -function Cons(hd, tl) -{ - return { - ctor: '::', - _0: hd, - _1: tl - }; -} - -function append(xs, ys) -{ - // append Strings - if (typeof xs === 'string') - { - return xs + ys; - } - - // append Lists - if (xs.ctor === '[]') - { - return ys; - } - var root = Cons(xs._0, Nil); - var curr = root; - xs = xs._1; - while (xs.ctor !== '[]') - { - curr._1 = Cons(xs._0, Nil); - xs = xs._1; - curr = curr._1; - } - curr._1 = ys; - return root; -} - - -// CRASHES - -function crash(moduleName, region) -{ - return function(message) { - throw new Error( - 'Ran into a `Debug.crash` in module `' + moduleName + '` ' + regionToString(region) + '\n' - + 'The message provided by the code author is:\n\n ' - + message - ); - }; -} - -function crashCase(moduleName, region, value) -{ - return function(message) { - throw new Error( - 'Ran into a `Debug.crash` in module `' + moduleName + '`\n\n' - + 'This was caused by the `case` expression ' + regionToString(region) + '.\n' - + 'One of the branches ended with a crash and the following value got through:\n\n ' + toString(value) + '\n\n' - + 'The message provided by the code author is:\n\n ' - + message - ); - }; -} - -function regionToString(region) -{ - if (region.start.line == region.end.line) - { - return 'on line ' + region.start.line; - } - return 'between lines ' + region.start.line + ' and ' + region.end.line; -} - - -// TO STRING - -function toString(v) -{ - var type = typeof v; - if (type === 'function') - { - return ''; - } - - if (type === 'boolean') - { - return v ? 'True' : 'False'; - } - - if (type === 'number') - { - return v + ''; - } - - if (v instanceof String) - { - return '\'' + addSlashes(v, true) + '\''; - } - - if (type === 'string') - { - return '"' + addSlashes(v, false) + '"'; - } - - if (v === null) - { - return 'null'; - } - - if (type === 'object' && 'ctor' in v) - { - var ctorStarter = v.ctor.substring(0, 5); - - if (ctorStarter === '_Tupl') - { - var output = []; - for (var k in v) - { - if (k === 'ctor') continue; - output.push(toString(v[k])); - } - return '(' + output.join(',') + ')'; - } - - if (ctorStarter === '_Task') - { - return '' - } - - if (v.ctor === '_Array') - { - var list = _elm_lang$core$Array$toList(v); - return 'Array.fromList ' + toString(list); - } - - if (v.ctor === '') - { - return ''; - } - - if (v.ctor === '_Process') - { - return ''; - } - - if (v.ctor === '::') - { - var output = '[' + toString(v._0); - v = v._1; - while (v.ctor === '::') - { - output += ',' + toString(v._0); - v = v._1; - } - return output + ']'; - } - - if (v.ctor === '[]') - { - return '[]'; - } - - if (v.ctor === 'Set_elm_builtin') - { - return 'Set.fromList ' + toString(_elm_lang$core$Set$toList(v)); - } - - if (v.ctor === 'RBNode_elm_builtin' || v.ctor === 'RBEmpty_elm_builtin') - { - return 'Dict.fromList ' + toString(_elm_lang$core$Dict$toList(v)); - } - - var output = ''; - for (var i in v) - { - if (i === 'ctor') continue; - var str = toString(v[i]); - var c0 = str[0]; - var parenless = c0 === '{' || c0 === '(' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0; - output += ' ' + (parenless ? str : '(' + str + ')'); - } - return v.ctor + output; - } - - if (type === 'object') - { - if (v instanceof Date) - { - return '<' + v.toString() + '>'; - } - - if (v.elm_web_socket) - { - return ''; - } - - var output = []; - for (var k in v) - { - output.push(k + ' = ' + toString(v[k])); - } - if (output.length === 0) - { - return '{}'; - } - return '{ ' + output.join(', ') + ' }'; - } - - return ''; -} - -function addSlashes(str, isChar) -{ - var s = str.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\n') - .replace(/\t/g, '\\t') - .replace(/\r/g, '\\r') - .replace(/\v/g, '\\v') - .replace(/\0/g, '\\0'); - if (isChar) - { - return s.replace(/\'/g, '\\\''); - } - else - { - return s.replace(/\"/g, '\\"'); - } -} - - -return { - eq: eq, - cmp: cmp, - Tuple0: Tuple0, - Tuple2: Tuple2, - chr: chr, - update: update, - guid: guid, - - append: F2(append), - - crash: crash, - crashCase: crashCase, - - toString: toString -}; - -}(); -var _elm_lang$core$Basics$never = function (_p0) { - never: - while (true) { - var _p1 = _p0; - var _v1 = _p1._0; - _p0 = _v1; - continue never; - } -}; -var _elm_lang$core$Basics$uncurry = F2( - function (f, _p2) { - var _p3 = _p2; - return A2(f, _p3._0, _p3._1); - }); -var _elm_lang$core$Basics$curry = F3( - function (f, a, b) { - return f( - {ctor: '_Tuple2', _0: a, _1: b}); - }); -var _elm_lang$core$Basics$flip = F3( - function (f, b, a) { - return A2(f, a, b); - }); -var _elm_lang$core$Basics$always = F2( - function (a, _p4) { - return a; - }); -var _elm_lang$core$Basics$identity = function (x) { - return x; -}; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['<|'] = F2( - function (f, x) { - return f(x); - }); -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['|>'] = F2( - function (x, f) { - return f(x); - }); -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['>>'] = F3( - function (f, g, x) { - return g( - f(x)); - }); -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['<<'] = F3( - function (g, f, x) { - return g( - f(x)); - }); -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['++'] = _elm_lang$core$Native_Utils.append; -var _elm_lang$core$Basics$toString = _elm_lang$core$Native_Utils.toString; -var _elm_lang$core$Basics$isInfinite = _elm_lang$core$Native_Basics.isInfinite; -var _elm_lang$core$Basics$isNaN = _elm_lang$core$Native_Basics.isNaN; -var _elm_lang$core$Basics$toFloat = _elm_lang$core$Native_Basics.toFloat; -var _elm_lang$core$Basics$ceiling = _elm_lang$core$Native_Basics.ceiling; -var _elm_lang$core$Basics$floor = _elm_lang$core$Native_Basics.floor; -var _elm_lang$core$Basics$truncate = _elm_lang$core$Native_Basics.truncate; -var _elm_lang$core$Basics$round = _elm_lang$core$Native_Basics.round; -var _elm_lang$core$Basics$not = _elm_lang$core$Native_Basics.not; -var _elm_lang$core$Basics$xor = _elm_lang$core$Native_Basics.xor; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['||'] = _elm_lang$core$Native_Basics.or; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['&&'] = _elm_lang$core$Native_Basics.and; -var _elm_lang$core$Basics$max = _elm_lang$core$Native_Basics.max; -var _elm_lang$core$Basics$min = _elm_lang$core$Native_Basics.min; -var _elm_lang$core$Basics$compare = _elm_lang$core$Native_Basics.compare; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['>='] = _elm_lang$core$Native_Basics.ge; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['<='] = _elm_lang$core$Native_Basics.le; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['>'] = _elm_lang$core$Native_Basics.gt; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['<'] = _elm_lang$core$Native_Basics.lt; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['/='] = _elm_lang$core$Native_Basics.neq; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['=='] = _elm_lang$core$Native_Basics.eq; -var _elm_lang$core$Basics$e = _elm_lang$core$Native_Basics.e; -var _elm_lang$core$Basics$pi = _elm_lang$core$Native_Basics.pi; -var _elm_lang$core$Basics$clamp = _elm_lang$core$Native_Basics.clamp; -var _elm_lang$core$Basics$logBase = _elm_lang$core$Native_Basics.logBase; -var _elm_lang$core$Basics$abs = _elm_lang$core$Native_Basics.abs; -var _elm_lang$core$Basics$negate = _elm_lang$core$Native_Basics.negate; -var _elm_lang$core$Basics$sqrt = _elm_lang$core$Native_Basics.sqrt; -var _elm_lang$core$Basics$atan2 = _elm_lang$core$Native_Basics.atan2; -var _elm_lang$core$Basics$atan = _elm_lang$core$Native_Basics.atan; -var _elm_lang$core$Basics$asin = _elm_lang$core$Native_Basics.asin; -var _elm_lang$core$Basics$acos = _elm_lang$core$Native_Basics.acos; -var _elm_lang$core$Basics$tan = _elm_lang$core$Native_Basics.tan; -var _elm_lang$core$Basics$sin = _elm_lang$core$Native_Basics.sin; -var _elm_lang$core$Basics$cos = _elm_lang$core$Native_Basics.cos; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['^'] = _elm_lang$core$Native_Basics.exp; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['%'] = _elm_lang$core$Native_Basics.mod; -var _elm_lang$core$Basics$rem = _elm_lang$core$Native_Basics.rem; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['//'] = _elm_lang$core$Native_Basics.div; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['/'] = _elm_lang$core$Native_Basics.floatDiv; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['*'] = _elm_lang$core$Native_Basics.mul; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['-'] = _elm_lang$core$Native_Basics.sub; -var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; -_elm_lang$core$Basics_ops['+'] = _elm_lang$core$Native_Basics.add; -var _elm_lang$core$Basics$toPolar = _elm_lang$core$Native_Basics.toPolar; -var _elm_lang$core$Basics$fromPolar = _elm_lang$core$Native_Basics.fromPolar; -var _elm_lang$core$Basics$turns = _elm_lang$core$Native_Basics.turns; -var _elm_lang$core$Basics$degrees = _elm_lang$core$Native_Basics.degrees; -var _elm_lang$core$Basics$radians = function (t) { - return t; -}; -var _elm_lang$core$Basics$GT = {ctor: 'GT'}; -var _elm_lang$core$Basics$EQ = {ctor: 'EQ'}; -var _elm_lang$core$Basics$LT = {ctor: 'LT'}; -var _elm_lang$core$Basics$JustOneMore = function (a) { - return {ctor: 'JustOneMore', _0: a}; -}; - -var _elm_lang$core$Maybe$withDefault = F2( - function ($default, maybe) { - var _p0 = maybe; - if (_p0.ctor === 'Just') { - return _p0._0; - } else { - return $default; - } - }); -var _elm_lang$core$Maybe$Nothing = {ctor: 'Nothing'}; -var _elm_lang$core$Maybe$andThen = F2( - function (callback, maybeValue) { - var _p1 = maybeValue; - if (_p1.ctor === 'Just') { - return callback(_p1._0); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$Just = function (a) { - return {ctor: 'Just', _0: a}; -}; -var _elm_lang$core$Maybe$map = F2( - function (f, maybe) { - var _p2 = maybe; - if (_p2.ctor === 'Just') { - return _elm_lang$core$Maybe$Just( - f(_p2._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$map2 = F3( - function (func, ma, mb) { - var _p3 = {ctor: '_Tuple2', _0: ma, _1: mb}; - if (((_p3.ctor === '_Tuple2') && (_p3._0.ctor === 'Just')) && (_p3._1.ctor === 'Just')) { - return _elm_lang$core$Maybe$Just( - A2(func, _p3._0._0, _p3._1._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$map3 = F4( - function (func, ma, mb, mc) { - var _p4 = {ctor: '_Tuple3', _0: ma, _1: mb, _2: mc}; - if ((((_p4.ctor === '_Tuple3') && (_p4._0.ctor === 'Just')) && (_p4._1.ctor === 'Just')) && (_p4._2.ctor === 'Just')) { - return _elm_lang$core$Maybe$Just( - A3(func, _p4._0._0, _p4._1._0, _p4._2._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$map4 = F5( - function (func, ma, mb, mc, md) { - var _p5 = {ctor: '_Tuple4', _0: ma, _1: mb, _2: mc, _3: md}; - if (((((_p5.ctor === '_Tuple4') && (_p5._0.ctor === 'Just')) && (_p5._1.ctor === 'Just')) && (_p5._2.ctor === 'Just')) && (_p5._3.ctor === 'Just')) { - return _elm_lang$core$Maybe$Just( - A4(func, _p5._0._0, _p5._1._0, _p5._2._0, _p5._3._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); -var _elm_lang$core$Maybe$map5 = F6( - function (func, ma, mb, mc, md, me) { - var _p6 = {ctor: '_Tuple5', _0: ma, _1: mb, _2: mc, _3: md, _4: me}; - if ((((((_p6.ctor === '_Tuple5') && (_p6._0.ctor === 'Just')) && (_p6._1.ctor === 'Just')) && (_p6._2.ctor === 'Just')) && (_p6._3.ctor === 'Just')) && (_p6._4.ctor === 'Just')) { - return _elm_lang$core$Maybe$Just( - A5(func, _p6._0._0, _p6._1._0, _p6._2._0, _p6._3._0, _p6._4._0)); - } else { - return _elm_lang$core$Maybe$Nothing; - } - }); - -//import Native.Utils // - -var _elm_lang$core$Native_List = function() { - -var Nil = { ctor: '[]' }; - -function Cons(hd, tl) -{ - return { ctor: '::', _0: hd, _1: tl }; -} - -function fromArray(arr) -{ - var out = Nil; - for (var i = arr.length; i--; ) - { - out = Cons(arr[i], out); - } - return out; -} - -function toArray(xs) -{ - var out = []; - while (xs.ctor !== '[]') - { - out.push(xs._0); - xs = xs._1; - } - return out; -} - -function foldr(f, b, xs) -{ - var arr = toArray(xs); - var acc = b; - for (var i = arr.length; i--; ) - { - acc = A2(f, arr[i], acc); - } - return acc; -} - -function map2(f, xs, ys) -{ - var arr = []; - while (xs.ctor !== '[]' && ys.ctor !== '[]') - { - arr.push(A2(f, xs._0, ys._0)); - xs = xs._1; - ys = ys._1; - } - return fromArray(arr); -} - -function map3(f, xs, ys, zs) -{ - var arr = []; - while (xs.ctor !== '[]' && ys.ctor !== '[]' && zs.ctor !== '[]') - { - arr.push(A3(f, xs._0, ys._0, zs._0)); - xs = xs._1; - ys = ys._1; - zs = zs._1; - } - return fromArray(arr); -} - -function map4(f, ws, xs, ys, zs) -{ - var arr = []; - while ( ws.ctor !== '[]' - && xs.ctor !== '[]' - && ys.ctor !== '[]' - && zs.ctor !== '[]') - { - arr.push(A4(f, ws._0, xs._0, ys._0, zs._0)); - ws = ws._1; - xs = xs._1; - ys = ys._1; - zs = zs._1; - } - return fromArray(arr); -} - -function map5(f, vs, ws, xs, ys, zs) -{ - var arr = []; - while ( vs.ctor !== '[]' - && ws.ctor !== '[]' - && xs.ctor !== '[]' - && ys.ctor !== '[]' - && zs.ctor !== '[]') - { - arr.push(A5(f, vs._0, ws._0, xs._0, ys._0, zs._0)); - vs = vs._1; - ws = ws._1; - xs = xs._1; - ys = ys._1; - zs = zs._1; - } - return fromArray(arr); -} - -function sortBy(f, xs) -{ - return fromArray(toArray(xs).sort(function(a, b) { - return _elm_lang$core$Native_Utils.cmp(f(a), f(b)); - })); -} - -function sortWith(f, xs) -{ - return fromArray(toArray(xs).sort(function(a, b) { - var ord = f(a)(b).ctor; - return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1; - })); -} - -return { - Nil: Nil, - Cons: Cons, - cons: F2(Cons), - toArray: toArray, - fromArray: fromArray, - - foldr: F3(foldr), - - map2: F3(map2), - map3: F4(map3), - map4: F5(map4), - map5: F6(map5), - sortBy: F2(sortBy), - sortWith: F2(sortWith) -}; - -}(); -var _elm_lang$core$List$sortWith = _elm_lang$core$Native_List.sortWith; -var _elm_lang$core$List$sortBy = _elm_lang$core$Native_List.sortBy; -var _elm_lang$core$List$sort = function (xs) { - return A2(_elm_lang$core$List$sortBy, _elm_lang$core$Basics$identity, xs); -}; -var _elm_lang$core$List$singleton = function (value) { - return { - ctor: '::', - _0: value, - _1: {ctor: '[]'} - }; -}; -var _elm_lang$core$List$drop = F2( - function (n, list) { - drop: - while (true) { - if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { - return list; - } else { - var _p0 = list; - if (_p0.ctor === '[]') { - return list; - } else { - var _v1 = n - 1, - _v2 = _p0._1; - n = _v1; - list = _v2; - continue drop; - } - } - } - }); -var _elm_lang$core$List$map5 = _elm_lang$core$Native_List.map5; -var _elm_lang$core$List$map4 = _elm_lang$core$Native_List.map4; -var _elm_lang$core$List$map3 = _elm_lang$core$Native_List.map3; -var _elm_lang$core$List$map2 = _elm_lang$core$Native_List.map2; -var _elm_lang$core$List$any = F2( - function (isOkay, list) { - any: - while (true) { - var _p1 = list; - if (_p1.ctor === '[]') { - return false; - } else { - if (isOkay(_p1._0)) { - return true; - } else { - var _v4 = isOkay, - _v5 = _p1._1; - isOkay = _v4; - list = _v5; - continue any; - } - } - } - }); -var _elm_lang$core$List$all = F2( - function (isOkay, list) { - return !A2( - _elm_lang$core$List$any, - function (_p2) { - return !isOkay(_p2); - }, - list); - }); -var _elm_lang$core$List$foldr = _elm_lang$core$Native_List.foldr; -var _elm_lang$core$List$foldl = F3( - function (func, acc, list) { - foldl: - while (true) { - var _p3 = list; - if (_p3.ctor === '[]') { - return acc; - } else { - var _v7 = func, - _v8 = A2(func, _p3._0, acc), - _v9 = _p3._1; - func = _v7; - acc = _v8; - list = _v9; - continue foldl; - } - } - }); -var _elm_lang$core$List$length = function (xs) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (_p4, i) { - return i + 1; - }), - 0, - xs); -}; -var _elm_lang$core$List$sum = function (numbers) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (x, y) { - return x + y; - }), - 0, - numbers); -}; -var _elm_lang$core$List$product = function (numbers) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (x, y) { - return x * y; - }), - 1, - numbers); -}; -var _elm_lang$core$List$maximum = function (list) { - var _p5 = list; - if (_p5.ctor === '::') { - return _elm_lang$core$Maybe$Just( - A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$max, _p5._0, _p5._1)); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$List$minimum = function (list) { - var _p6 = list; - if (_p6.ctor === '::') { - return _elm_lang$core$Maybe$Just( - A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$min, _p6._0, _p6._1)); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$List$member = F2( - function (x, xs) { - return A2( - _elm_lang$core$List$any, - function (a) { - return _elm_lang$core$Native_Utils.eq(a, x); - }, - xs); - }); -var _elm_lang$core$List$isEmpty = function (xs) { - var _p7 = xs; - if (_p7.ctor === '[]') { - return true; - } else { - return false; - } -}; -var _elm_lang$core$List$tail = function (list) { - var _p8 = list; - if (_p8.ctor === '::') { - return _elm_lang$core$Maybe$Just(_p8._1); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$List$head = function (list) { - var _p9 = list; - if (_p9.ctor === '::') { - return _elm_lang$core$Maybe$Just(_p9._0); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$List_ops = _elm_lang$core$List_ops || {}; -_elm_lang$core$List_ops['::'] = _elm_lang$core$Native_List.cons; -var _elm_lang$core$List$map = F2( - function (f, xs) { - return A3( - _elm_lang$core$List$foldr, - F2( - function (x, acc) { - return { - ctor: '::', - _0: f(x), - _1: acc - }; - }), - {ctor: '[]'}, - xs); - }); -var _elm_lang$core$List$filter = F2( - function (pred, xs) { - var conditionalCons = F2( - function (front, back) { - return pred(front) ? {ctor: '::', _0: front, _1: back} : back; - }); - return A3( - _elm_lang$core$List$foldr, - conditionalCons, - {ctor: '[]'}, - xs); - }); -var _elm_lang$core$List$maybeCons = F3( - function (f, mx, xs) { - var _p10 = f(mx); - if (_p10.ctor === 'Just') { - return {ctor: '::', _0: _p10._0, _1: xs}; - } else { - return xs; - } - }); -var _elm_lang$core$List$filterMap = F2( - function (f, xs) { - return A3( - _elm_lang$core$List$foldr, - _elm_lang$core$List$maybeCons(f), - {ctor: '[]'}, - xs); - }); -var _elm_lang$core$List$reverse = function (list) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (x, y) { - return {ctor: '::', _0: x, _1: y}; - }), - {ctor: '[]'}, - list); -}; -var _elm_lang$core$List$scanl = F3( - function (f, b, xs) { - var scan1 = F2( - function (x, accAcc) { - var _p11 = accAcc; - if (_p11.ctor === '::') { - return { - ctor: '::', - _0: A2(f, x, _p11._0), - _1: accAcc - }; - } else { - return {ctor: '[]'}; - } - }); - return _elm_lang$core$List$reverse( - A3( - _elm_lang$core$List$foldl, - scan1, - { - ctor: '::', - _0: b, - _1: {ctor: '[]'} - }, - xs)); - }); -var _elm_lang$core$List$append = F2( - function (xs, ys) { - var _p12 = ys; - if (_p12.ctor === '[]') { - return xs; - } else { - return A3( - _elm_lang$core$List$foldr, - F2( - function (x, y) { - return {ctor: '::', _0: x, _1: y}; - }), - ys, - xs); - } - }); -var _elm_lang$core$List$concat = function (lists) { - return A3( - _elm_lang$core$List$foldr, - _elm_lang$core$List$append, - {ctor: '[]'}, - lists); -}; -var _elm_lang$core$List$concatMap = F2( - function (f, list) { - return _elm_lang$core$List$concat( - A2(_elm_lang$core$List$map, f, list)); - }); -var _elm_lang$core$List$partition = F2( - function (pred, list) { - var step = F2( - function (x, _p13) { - var _p14 = _p13; - var _p16 = _p14._0; - var _p15 = _p14._1; - return pred(x) ? { - ctor: '_Tuple2', - _0: {ctor: '::', _0: x, _1: _p16}, - _1: _p15 - } : { - ctor: '_Tuple2', - _0: _p16, - _1: {ctor: '::', _0: x, _1: _p15} - }; - }); - return A3( - _elm_lang$core$List$foldr, - step, - { - ctor: '_Tuple2', - _0: {ctor: '[]'}, - _1: {ctor: '[]'} - }, - list); - }); -var _elm_lang$core$List$unzip = function (pairs) { - var step = F2( - function (_p18, _p17) { - var _p19 = _p18; - var _p20 = _p17; - return { - ctor: '_Tuple2', - _0: {ctor: '::', _0: _p19._0, _1: _p20._0}, - _1: {ctor: '::', _0: _p19._1, _1: _p20._1} - }; - }); - return A3( - _elm_lang$core$List$foldr, - step, - { - ctor: '_Tuple2', - _0: {ctor: '[]'}, - _1: {ctor: '[]'} - }, - pairs); -}; -var _elm_lang$core$List$intersperse = F2( - function (sep, xs) { - var _p21 = xs; - if (_p21.ctor === '[]') { - return {ctor: '[]'}; - } else { - var step = F2( - function (x, rest) { - return { - ctor: '::', - _0: sep, - _1: {ctor: '::', _0: x, _1: rest} - }; - }); - var spersed = A3( - _elm_lang$core$List$foldr, - step, - {ctor: '[]'}, - _p21._1); - return {ctor: '::', _0: _p21._0, _1: spersed}; - } - }); -var _elm_lang$core$List$takeReverse = F3( - function (n, list, taken) { - takeReverse: - while (true) { - if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { - return taken; - } else { - var _p22 = list; - if (_p22.ctor === '[]') { - return taken; - } else { - var _v23 = n - 1, - _v24 = _p22._1, - _v25 = {ctor: '::', _0: _p22._0, _1: taken}; - n = _v23; - list = _v24; - taken = _v25; - continue takeReverse; - } - } - } - }); -var _elm_lang$core$List$takeTailRec = F2( - function (n, list) { - return _elm_lang$core$List$reverse( - A3( - _elm_lang$core$List$takeReverse, - n, - list, - {ctor: '[]'})); - }); -var _elm_lang$core$List$takeFast = F3( - function (ctr, n, list) { - if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { - return {ctor: '[]'}; - } else { - var _p23 = {ctor: '_Tuple2', _0: n, _1: list}; - _v26_5: - do { - _v26_1: - do { - if (_p23.ctor === '_Tuple2') { - if (_p23._1.ctor === '[]') { - return list; - } else { - if (_p23._1._1.ctor === '::') { - switch (_p23._0) { - case 1: - break _v26_1; - case 2: - return { - ctor: '::', - _0: _p23._1._0, - _1: { - ctor: '::', - _0: _p23._1._1._0, - _1: {ctor: '[]'} - } - }; - case 3: - if (_p23._1._1._1.ctor === '::') { - return { - ctor: '::', - _0: _p23._1._0, - _1: { - ctor: '::', - _0: _p23._1._1._0, - _1: { - ctor: '::', - _0: _p23._1._1._1._0, - _1: {ctor: '[]'} - } - } - }; - } else { - break _v26_5; - } - default: - if ((_p23._1._1._1.ctor === '::') && (_p23._1._1._1._1.ctor === '::')) { - var _p28 = _p23._1._1._1._0; - var _p27 = _p23._1._1._0; - var _p26 = _p23._1._0; - var _p25 = _p23._1._1._1._1._0; - var _p24 = _p23._1._1._1._1._1; - return (_elm_lang$core$Native_Utils.cmp(ctr, 1000) > 0) ? { - ctor: '::', - _0: _p26, - _1: { - ctor: '::', - _0: _p27, - _1: { - ctor: '::', - _0: _p28, - _1: { - ctor: '::', - _0: _p25, - _1: A2(_elm_lang$core$List$takeTailRec, n - 4, _p24) - } - } - } - } : { - ctor: '::', - _0: _p26, - _1: { - ctor: '::', - _0: _p27, - _1: { - ctor: '::', - _0: _p28, - _1: { - ctor: '::', - _0: _p25, - _1: A3(_elm_lang$core$List$takeFast, ctr + 1, n - 4, _p24) - } - } - } - }; - } else { - break _v26_5; - } - } - } else { - if (_p23._0 === 1) { - break _v26_1; - } else { - break _v26_5; - } - } - } - } else { - break _v26_5; - } - } while(false); - return { - ctor: '::', - _0: _p23._1._0, - _1: {ctor: '[]'} - }; - } while(false); - return list; - } - }); -var _elm_lang$core$List$take = F2( - function (n, list) { - return A3(_elm_lang$core$List$takeFast, 0, n, list); - }); -var _elm_lang$core$List$repeatHelp = F3( - function (result, n, value) { - repeatHelp: - while (true) { - if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { - return result; - } else { - var _v27 = {ctor: '::', _0: value, _1: result}, - _v28 = n - 1, - _v29 = value; - result = _v27; - n = _v28; - value = _v29; - continue repeatHelp; - } - } - }); -var _elm_lang$core$List$repeat = F2( - function (n, value) { - return A3( - _elm_lang$core$List$repeatHelp, - {ctor: '[]'}, - n, - value); - }); -var _elm_lang$core$List$rangeHelp = F3( - function (lo, hi, list) { - rangeHelp: - while (true) { - if (_elm_lang$core$Native_Utils.cmp(lo, hi) < 1) { - var _v30 = lo, - _v31 = hi - 1, - _v32 = {ctor: '::', _0: hi, _1: list}; - lo = _v30; - hi = _v31; - list = _v32; - continue rangeHelp; - } else { - return list; - } - } - }); -var _elm_lang$core$List$range = F2( - function (lo, hi) { - return A3( - _elm_lang$core$List$rangeHelp, - lo, - hi, - {ctor: '[]'}); - }); -var _elm_lang$core$List$indexedMap = F2( - function (f, xs) { - return A3( - _elm_lang$core$List$map2, - f, - A2( - _elm_lang$core$List$range, - 0, - _elm_lang$core$List$length(xs) - 1), - xs); - }); - -var _elm_lang$core$Array$append = _elm_lang$core$Native_Array.append; -var _elm_lang$core$Array$length = _elm_lang$core$Native_Array.length; -var _elm_lang$core$Array$isEmpty = function (array) { - return _elm_lang$core$Native_Utils.eq( - _elm_lang$core$Array$length(array), - 0); -}; -var _elm_lang$core$Array$slice = _elm_lang$core$Native_Array.slice; -var _elm_lang$core$Array$set = _elm_lang$core$Native_Array.set; -var _elm_lang$core$Array$get = F2( - function (i, array) { - return ((_elm_lang$core$Native_Utils.cmp(0, i) < 1) && (_elm_lang$core$Native_Utils.cmp( - i, - _elm_lang$core$Native_Array.length(array)) < 0)) ? _elm_lang$core$Maybe$Just( - A2(_elm_lang$core$Native_Array.get, i, array)) : _elm_lang$core$Maybe$Nothing; - }); -var _elm_lang$core$Array$push = _elm_lang$core$Native_Array.push; -var _elm_lang$core$Array$empty = _elm_lang$core$Native_Array.empty; -var _elm_lang$core$Array$filter = F2( - function (isOkay, arr) { - var update = F2( - function (x, xs) { - return isOkay(x) ? A2(_elm_lang$core$Native_Array.push, x, xs) : xs; - }); - return A3(_elm_lang$core$Native_Array.foldl, update, _elm_lang$core$Native_Array.empty, arr); - }); -var _elm_lang$core$Array$foldr = _elm_lang$core$Native_Array.foldr; -var _elm_lang$core$Array$foldl = _elm_lang$core$Native_Array.foldl; -var _elm_lang$core$Array$indexedMap = _elm_lang$core$Native_Array.indexedMap; -var _elm_lang$core$Array$map = _elm_lang$core$Native_Array.map; -var _elm_lang$core$Array$toIndexedList = function (array) { - return A3( - _elm_lang$core$List$map2, - F2( - function (v0, v1) { - return {ctor: '_Tuple2', _0: v0, _1: v1}; - }), - A2( - _elm_lang$core$List$range, - 0, - _elm_lang$core$Native_Array.length(array) - 1), - _elm_lang$core$Native_Array.toList(array)); -}; -var _elm_lang$core$Array$toList = _elm_lang$core$Native_Array.toList; -var _elm_lang$core$Array$fromList = _elm_lang$core$Native_Array.fromList; -var _elm_lang$core$Array$initialize = _elm_lang$core$Native_Array.initialize; -var _elm_lang$core$Array$repeat = F2( - function (n, e) { - return A2( - _elm_lang$core$Array$initialize, - n, - _elm_lang$core$Basics$always(e)); - }); -var _elm_lang$core$Array$Array = {ctor: 'Array'}; - -//import Native.Utils // - -var _elm_lang$core$Native_Debug = function() { - -function log(tag, value) -{ - var msg = tag + ': ' + _elm_lang$core$Native_Utils.toString(value); - var process = process || {}; - if (process.stdout) - { - process.stdout.write(msg); - } - else - { - console.log(msg); - } - return value; -} - -function crash(message) -{ - throw new Error(message); -} - -return { - crash: crash, - log: F2(log) -}; - -}(); -//import Maybe, Native.List, Native.Utils, Result // - -var _elm_lang$core$Native_String = function() { - -function isEmpty(str) -{ - return str.length === 0; -} -function cons(chr, str) -{ - return chr + str; -} -function uncons(str) -{ - var hd = str[0]; - if (hd) - { - return _elm_lang$core$Maybe$Just(_elm_lang$core$Native_Utils.Tuple2(_elm_lang$core$Native_Utils.chr(hd), str.slice(1))); - } - return _elm_lang$core$Maybe$Nothing; -} -function append(a, b) -{ - return a + b; -} -function concat(strs) -{ - return _elm_lang$core$Native_List.toArray(strs).join(''); -} -function length(str) -{ - return str.length; -} -function map(f, str) -{ - var out = str.split(''); - for (var i = out.length; i--; ) - { - out[i] = f(_elm_lang$core$Native_Utils.chr(out[i])); - } - return out.join(''); -} -function filter(pred, str) -{ - return str.split('').map(_elm_lang$core$Native_Utils.chr).filter(pred).join(''); -} -function reverse(str) -{ - return str.split('').reverse().join(''); -} -function foldl(f, b, str) -{ - var len = str.length; - for (var i = 0; i < len; ++i) - { - b = A2(f, _elm_lang$core$Native_Utils.chr(str[i]), b); - } - return b; -} -function foldr(f, b, str) -{ - for (var i = str.length; i--; ) - { - b = A2(f, _elm_lang$core$Native_Utils.chr(str[i]), b); - } - return b; -} -function split(sep, str) -{ - return _elm_lang$core$Native_List.fromArray(str.split(sep)); -} -function join(sep, strs) -{ - return _elm_lang$core$Native_List.toArray(strs).join(sep); -} -function repeat(n, str) -{ - var result = ''; - while (n > 0) - { - if (n & 1) - { - result += str; - } - n >>= 1, str += str; - } - return result; -} -function slice(start, end, str) -{ - return str.slice(start, end); -} -function left(n, str) -{ - return n < 1 ? '' : str.slice(0, n); -} -function right(n, str) -{ - return n < 1 ? '' : str.slice(-n); -} -function dropLeft(n, str) -{ - return n < 1 ? str : str.slice(n); -} -function dropRight(n, str) -{ - return n < 1 ? str : str.slice(0, -n); -} -function pad(n, chr, str) -{ - var half = (n - str.length) / 2; - return repeat(Math.ceil(half), chr) + str + repeat(half | 0, chr); -} -function padRight(n, chr, str) -{ - return str + repeat(n - str.length, chr); -} -function padLeft(n, chr, str) -{ - return repeat(n - str.length, chr) + str; -} - -function trim(str) -{ - return str.trim(); -} -function trimLeft(str) -{ - return str.replace(/^\s+/, ''); -} -function trimRight(str) -{ - return str.replace(/\s+$/, ''); -} - -function words(str) -{ - return _elm_lang$core$Native_List.fromArray(str.trim().split(/\s+/g)); -} -function lines(str) -{ - return _elm_lang$core$Native_List.fromArray(str.split(/\r\n|\r|\n/g)); -} - -function toUpper(str) -{ - return str.toUpperCase(); -} -function toLower(str) -{ - return str.toLowerCase(); -} - -function any(pred, str) -{ - for (var i = str.length; i--; ) - { - if (pred(_elm_lang$core$Native_Utils.chr(str[i]))) - { - return true; - } - } - return false; -} -function all(pred, str) -{ - for (var i = str.length; i--; ) - { - if (!pred(_elm_lang$core$Native_Utils.chr(str[i]))) - { - return false; - } - } - return true; -} - -function contains(sub, str) -{ - return str.indexOf(sub) > -1; -} -function startsWith(sub, str) -{ - return str.indexOf(sub) === 0; -} -function endsWith(sub, str) -{ - return str.length >= sub.length && - str.lastIndexOf(sub) === str.length - sub.length; -} -function indexes(sub, str) -{ - var subLen = sub.length; - - if (subLen < 1) - { - return _elm_lang$core$Native_List.Nil; - } - - var i = 0; - var is = []; - - while ((i = str.indexOf(sub, i)) > -1) - { - is.push(i); - i = i + subLen; - } - - return _elm_lang$core$Native_List.fromArray(is); -} - - -function toInt(s) -{ - var len = s.length; - - // if empty - if (len === 0) - { - return intErr(s); - } - - // if hex - var c = s[0]; - if (c === '0' && s[1] === 'x') - { - for (var i = 2; i < len; ++i) - { - var c = s[i]; - if (('0' <= c && c <= '9') || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f')) - { - continue; - } - return intErr(s); - } - return _elm_lang$core$Result$Ok(parseInt(s, 16)); - } - - // is decimal - if (c > '9' || (c < '0' && c !== '-' && c !== '+')) - { - return intErr(s); - } - for (var i = 1; i < len; ++i) - { - var c = s[i]; - if (c < '0' || '9' < c) - { - return intErr(s); - } - } - - return _elm_lang$core$Result$Ok(parseInt(s, 10)); -} - -function intErr(s) -{ - return _elm_lang$core$Result$Err("could not convert string '" + s + "' to an Int"); -} - - -function toFloat(s) -{ - // check if it is a hex, octal, or binary number - if (s.length === 0 || /[\sxbo]/.test(s)) - { - return floatErr(s); - } - var n = +s; - // faster isNaN check - return n === n ? _elm_lang$core$Result$Ok(n) : floatErr(s); -} - -function floatErr(s) -{ - return _elm_lang$core$Result$Err("could not convert string '" + s + "' to a Float"); -} - - -function toList(str) -{ - return _elm_lang$core$Native_List.fromArray(str.split('').map(_elm_lang$core$Native_Utils.chr)); -} -function fromList(chars) -{ - return _elm_lang$core$Native_List.toArray(chars).join(''); -} - -return { - isEmpty: isEmpty, - cons: F2(cons), - uncons: uncons, - append: F2(append), - concat: concat, - length: length, - map: F2(map), - filter: F2(filter), - reverse: reverse, - foldl: F3(foldl), - foldr: F3(foldr), - - split: F2(split), - join: F2(join), - repeat: F2(repeat), - - slice: F3(slice), - left: F2(left), - right: F2(right), - dropLeft: F2(dropLeft), - dropRight: F2(dropRight), - - pad: F3(pad), - padLeft: F3(padLeft), - padRight: F3(padRight), - - trim: trim, - trimLeft: trimLeft, - trimRight: trimRight, - - words: words, - lines: lines, - - toUpper: toUpper, - toLower: toLower, - - any: F2(any), - all: F2(all), - - contains: F2(contains), - startsWith: F2(startsWith), - endsWith: F2(endsWith), - indexes: F2(indexes), - - toInt: toInt, - toFloat: toFloat, - toList: toList, - fromList: fromList -}; - -}(); - -//import Native.Utils // - -var _elm_lang$core$Native_Char = function() { - -return { - fromCode: function(c) { return _elm_lang$core$Native_Utils.chr(String.fromCharCode(c)); }, - toCode: function(c) { return c.charCodeAt(0); }, - toUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toUpperCase()); }, - toLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLowerCase()); }, - toLocaleUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleUpperCase()); }, - toLocaleLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleLowerCase()); } -}; - -}(); -var _elm_lang$core$Char$fromCode = _elm_lang$core$Native_Char.fromCode; -var _elm_lang$core$Char$toCode = _elm_lang$core$Native_Char.toCode; -var _elm_lang$core$Char$toLocaleLower = _elm_lang$core$Native_Char.toLocaleLower; -var _elm_lang$core$Char$toLocaleUpper = _elm_lang$core$Native_Char.toLocaleUpper; -var _elm_lang$core$Char$toLower = _elm_lang$core$Native_Char.toLower; -var _elm_lang$core$Char$toUpper = _elm_lang$core$Native_Char.toUpper; -var _elm_lang$core$Char$isBetween = F3( - function (low, high, $char) { - var code = _elm_lang$core$Char$toCode($char); - return (_elm_lang$core$Native_Utils.cmp( - code, - _elm_lang$core$Char$toCode(low)) > -1) && (_elm_lang$core$Native_Utils.cmp( - code, - _elm_lang$core$Char$toCode(high)) < 1); - }); -var _elm_lang$core$Char$isUpper = A2( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('A'), - _elm_lang$core$Native_Utils.chr('Z')); -var _elm_lang$core$Char$isLower = A2( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('a'), - _elm_lang$core$Native_Utils.chr('z')); -var _elm_lang$core$Char$isDigit = A2( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('0'), - _elm_lang$core$Native_Utils.chr('9')); -var _elm_lang$core$Char$isOctDigit = A2( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('0'), - _elm_lang$core$Native_Utils.chr('7')); -var _elm_lang$core$Char$isHexDigit = function ($char) { - return _elm_lang$core$Char$isDigit($char) || (A3( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('a'), - _elm_lang$core$Native_Utils.chr('f'), - $char) || A3( - _elm_lang$core$Char$isBetween, - _elm_lang$core$Native_Utils.chr('A'), - _elm_lang$core$Native_Utils.chr('F'), - $char)); -}; - -var _elm_lang$core$Result$toMaybe = function (result) { - var _p0 = result; - if (_p0.ctor === 'Ok') { - return _elm_lang$core$Maybe$Just(_p0._0); - } else { - return _elm_lang$core$Maybe$Nothing; - } -}; -var _elm_lang$core$Result$withDefault = F2( - function (def, result) { - var _p1 = result; - if (_p1.ctor === 'Ok') { - return _p1._0; - } else { - return def; - } - }); -var _elm_lang$core$Result$Err = function (a) { - return {ctor: 'Err', _0: a}; -}; -var _elm_lang$core$Result$andThen = F2( - function (callback, result) { - var _p2 = result; - if (_p2.ctor === 'Ok') { - return callback(_p2._0); - } else { - return _elm_lang$core$Result$Err(_p2._0); - } - }); -var _elm_lang$core$Result$Ok = function (a) { - return {ctor: 'Ok', _0: a}; -}; -var _elm_lang$core$Result$map = F2( - function (func, ra) { - var _p3 = ra; - if (_p3.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - func(_p3._0)); - } else { - return _elm_lang$core$Result$Err(_p3._0); - } - }); -var _elm_lang$core$Result$map2 = F3( - function (func, ra, rb) { - var _p4 = {ctor: '_Tuple2', _0: ra, _1: rb}; - if (_p4._0.ctor === 'Ok') { - if (_p4._1.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - A2(func, _p4._0._0, _p4._1._0)); - } else { - return _elm_lang$core$Result$Err(_p4._1._0); - } - } else { - return _elm_lang$core$Result$Err(_p4._0._0); - } - }); -var _elm_lang$core$Result$map3 = F4( - function (func, ra, rb, rc) { - var _p5 = {ctor: '_Tuple3', _0: ra, _1: rb, _2: rc}; - if (_p5._0.ctor === 'Ok') { - if (_p5._1.ctor === 'Ok') { - if (_p5._2.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - A3(func, _p5._0._0, _p5._1._0, _p5._2._0)); - } else { - return _elm_lang$core$Result$Err(_p5._2._0); - } - } else { - return _elm_lang$core$Result$Err(_p5._1._0); - } - } else { - return _elm_lang$core$Result$Err(_p5._0._0); - } - }); -var _elm_lang$core$Result$map4 = F5( - function (func, ra, rb, rc, rd) { - var _p6 = {ctor: '_Tuple4', _0: ra, _1: rb, _2: rc, _3: rd}; - if (_p6._0.ctor === 'Ok') { - if (_p6._1.ctor === 'Ok') { - if (_p6._2.ctor === 'Ok') { - if (_p6._3.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - A4(func, _p6._0._0, _p6._1._0, _p6._2._0, _p6._3._0)); - } else { - return _elm_lang$core$Result$Err(_p6._3._0); - } - } else { - return _elm_lang$core$Result$Err(_p6._2._0); - } - } else { - return _elm_lang$core$Result$Err(_p6._1._0); - } - } else { - return _elm_lang$core$Result$Err(_p6._0._0); - } - }); -var _elm_lang$core$Result$map5 = F6( - function (func, ra, rb, rc, rd, re) { - var _p7 = {ctor: '_Tuple5', _0: ra, _1: rb, _2: rc, _3: rd, _4: re}; - if (_p7._0.ctor === 'Ok') { - if (_p7._1.ctor === 'Ok') { - if (_p7._2.ctor === 'Ok') { - if (_p7._3.ctor === 'Ok') { - if (_p7._4.ctor === 'Ok') { - return _elm_lang$core$Result$Ok( - A5(func, _p7._0._0, _p7._1._0, _p7._2._0, _p7._3._0, _p7._4._0)); - } else { - return _elm_lang$core$Result$Err(_p7._4._0); - } - } else { - return _elm_lang$core$Result$Err(_p7._3._0); - } - } else { - return _elm_lang$core$Result$Err(_p7._2._0); - } - } else { - return _elm_lang$core$Result$Err(_p7._1._0); - } - } else { - return _elm_lang$core$Result$Err(_p7._0._0); - } - }); -var _elm_lang$core$Result$mapError = F2( - function (f, result) { - var _p8 = result; - if (_p8.ctor === 'Ok') { - return _elm_lang$core$Result$Ok(_p8._0); - } else { - return _elm_lang$core$Result$Err( - f(_p8._0)); - } - }); -var _elm_lang$core$Result$fromMaybe = F2( - function (err, maybe) { - var _p9 = maybe; - if (_p9.ctor === 'Just') { - return _elm_lang$core$Result$Ok(_p9._0); - } else { - return _elm_lang$core$Result$Err(err); - } - }); - -var _elm_lang$core$String$fromList = _elm_lang$core$Native_String.fromList; -var _elm_lang$core$String$toList = _elm_lang$core$Native_String.toList; -var _elm_lang$core$String$toFloat = _elm_lang$core$Native_String.toFloat; -var _elm_lang$core$String$toInt = _elm_lang$core$Native_String.toInt; -var _elm_lang$core$String$indices = _elm_lang$core$Native_String.indexes; -var _elm_lang$core$String$indexes = _elm_lang$core$Native_String.indexes; -var _elm_lang$core$String$endsWith = _elm_lang$core$Native_String.endsWith; -var _elm_lang$core$String$startsWith = _elm_lang$core$Native_String.startsWith; -var _elm_lang$core$String$contains = _elm_lang$core$Native_String.contains; -var _elm_lang$core$String$all = _elm_lang$core$Native_String.all; -var _elm_lang$core$String$any = _elm_lang$core$Native_String.any; -var _elm_lang$core$String$toLower = _elm_lang$core$Native_String.toLower; -var _elm_lang$core$String$toUpper = _elm_lang$core$Native_String.toUpper; -var _elm_lang$core$String$lines = _elm_lang$core$Native_String.lines; -var _elm_lang$core$String$words = _elm_lang$core$Native_String.words; -var _elm_lang$core$String$trimRight = _elm_lang$core$Native_String.trimRight; -var _elm_lang$core$String$trimLeft = _elm_lang$core$Native_String.trimLeft; -var _elm_lang$core$String$trim = _elm_lang$core$Native_String.trim; -var _elm_lang$core$String$padRight = _elm_lang$core$Native_String.padRight; -var _elm_lang$core$String$padLeft = _elm_lang$core$Native_String.padLeft; -var _elm_lang$core$String$pad = _elm_lang$core$Native_String.pad; -var _elm_lang$core$String$dropRight = _elm_lang$core$Native_String.dropRight; -var _elm_lang$core$String$dropLeft = _elm_lang$core$Native_String.dropLeft; -var _elm_lang$core$String$right = _elm_lang$core$Native_String.right; -var _elm_lang$core$String$left = _elm_lang$core$Native_String.left; -var _elm_lang$core$String$slice = _elm_lang$core$Native_String.slice; -var _elm_lang$core$String$repeat = _elm_lang$core$Native_String.repeat; -var _elm_lang$core$String$join = _elm_lang$core$Native_String.join; -var _elm_lang$core$String$split = _elm_lang$core$Native_String.split; -var _elm_lang$core$String$foldr = _elm_lang$core$Native_String.foldr; -var _elm_lang$core$String$foldl = _elm_lang$core$Native_String.foldl; -var _elm_lang$core$String$reverse = _elm_lang$core$Native_String.reverse; -var _elm_lang$core$String$filter = _elm_lang$core$Native_String.filter; -var _elm_lang$core$String$map = _elm_lang$core$Native_String.map; -var _elm_lang$core$String$length = _elm_lang$core$Native_String.length; -var _elm_lang$core$String$concat = _elm_lang$core$Native_String.concat; -var _elm_lang$core$String$append = _elm_lang$core$Native_String.append; -var _elm_lang$core$String$uncons = _elm_lang$core$Native_String.uncons; -var _elm_lang$core$String$cons = _elm_lang$core$Native_String.cons; -var _elm_lang$core$String$fromChar = function ($char) { - return A2(_elm_lang$core$String$cons, $char, ''); -}; -var _elm_lang$core$String$isEmpty = _elm_lang$core$Native_String.isEmpty; - -var _elm_lang$core$Dict$foldr = F3( - function (f, acc, t) { - foldr: - while (true) { - var _p0 = t; - if (_p0.ctor === 'RBEmpty_elm_builtin') { - return acc; - } else { - var _v1 = f, - _v2 = A3( - f, - _p0._1, - _p0._2, - A3(_elm_lang$core$Dict$foldr, f, acc, _p0._4)), - _v3 = _p0._3; - f = _v1; - acc = _v2; - t = _v3; - continue foldr; - } - } - }); -var _elm_lang$core$Dict$keys = function (dict) { - return A3( - _elm_lang$core$Dict$foldr, - F3( - function (key, value, keyList) { - return {ctor: '::', _0: key, _1: keyList}; - }), - {ctor: '[]'}, - dict); -}; -var _elm_lang$core$Dict$values = function (dict) { - return A3( - _elm_lang$core$Dict$foldr, - F3( - function (key, value, valueList) { - return {ctor: '::', _0: value, _1: valueList}; - }), - {ctor: '[]'}, - dict); -}; -var _elm_lang$core$Dict$toList = function (dict) { - return A3( - _elm_lang$core$Dict$foldr, - F3( - function (key, value, list) { - return { - ctor: '::', - _0: {ctor: '_Tuple2', _0: key, _1: value}, - _1: list - }; - }), - {ctor: '[]'}, - dict); -}; -var _elm_lang$core$Dict$foldl = F3( - function (f, acc, dict) { - foldl: - while (true) { - var _p1 = dict; - if (_p1.ctor === 'RBEmpty_elm_builtin') { - return acc; - } else { - var _v5 = f, - _v6 = A3( - f, - _p1._1, - _p1._2, - A3(_elm_lang$core$Dict$foldl, f, acc, _p1._3)), - _v7 = _p1._4; - f = _v5; - acc = _v6; - dict = _v7; - continue foldl; - } - } - }); -var _elm_lang$core$Dict$merge = F6( - function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) { - var stepState = F3( - function (rKey, rValue, _p2) { - stepState: - while (true) { - var _p3 = _p2; - var _p9 = _p3._1; - var _p8 = _p3._0; - var _p4 = _p8; - if (_p4.ctor === '[]') { - return { - ctor: '_Tuple2', - _0: _p8, - _1: A3(rightStep, rKey, rValue, _p9) - }; - } else { - var _p7 = _p4._1; - var _p6 = _p4._0._1; - var _p5 = _p4._0._0; - if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) < 0) { - var _v10 = rKey, - _v11 = rValue, - _v12 = { - ctor: '_Tuple2', - _0: _p7, - _1: A3(leftStep, _p5, _p6, _p9) - }; - rKey = _v10; - rValue = _v11; - _p2 = _v12; - continue stepState; - } else { - if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) > 0) { - return { - ctor: '_Tuple2', - _0: _p8, - _1: A3(rightStep, rKey, rValue, _p9) - }; - } else { - return { - ctor: '_Tuple2', - _0: _p7, - _1: A4(bothStep, _p5, _p6, rValue, _p9) - }; - } - } - } - } - }); - var _p10 = A3( - _elm_lang$core$Dict$foldl, - stepState, - { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$toList(leftDict), - _1: initialResult - }, - rightDict); - var leftovers = _p10._0; - var intermediateResult = _p10._1; - return A3( - _elm_lang$core$List$foldl, - F2( - function (_p11, result) { - var _p12 = _p11; - return A3(leftStep, _p12._0, _p12._1, result); - }), - intermediateResult, - leftovers); - }); -var _elm_lang$core$Dict$reportRemBug = F4( - function (msg, c, lgot, rgot) { - return _elm_lang$core$Native_Debug.crash( - _elm_lang$core$String$concat( - { - ctor: '::', - _0: 'Internal red-black tree invariant violated, expected ', - _1: { - ctor: '::', - _0: msg, - _1: { - ctor: '::', - _0: ' and got ', - _1: { - ctor: '::', - _0: _elm_lang$core$Basics$toString(c), - _1: { - ctor: '::', - _0: '/', - _1: { - ctor: '::', - _0: lgot, - _1: { - ctor: '::', - _0: '/', - _1: { - ctor: '::', - _0: rgot, - _1: { - ctor: '::', - _0: '\nPlease report this bug to ', - _1: {ctor: '[]'} - } - } - } - } - } - } - } - } - })); - }); -var _elm_lang$core$Dict$isBBlack = function (dict) { - var _p13 = dict; - _v14_2: - do { - if (_p13.ctor === 'RBNode_elm_builtin') { - if (_p13._0.ctor === 'BBlack') { - return true; - } else { - break _v14_2; - } - } else { - if (_p13._0.ctor === 'LBBlack') { - return true; - } else { - break _v14_2; - } - } - } while(false); - return false; -}; -var _elm_lang$core$Dict$sizeHelp = F2( - function (n, dict) { - sizeHelp: - while (true) { - var _p14 = dict; - if (_p14.ctor === 'RBEmpty_elm_builtin') { - return n; - } else { - var _v16 = A2(_elm_lang$core$Dict$sizeHelp, n + 1, _p14._4), - _v17 = _p14._3; - n = _v16; - dict = _v17; - continue sizeHelp; - } - } - }); -var _elm_lang$core$Dict$size = function (dict) { - return A2(_elm_lang$core$Dict$sizeHelp, 0, dict); -}; -var _elm_lang$core$Dict$get = F2( - function (targetKey, dict) { - get: - while (true) { - var _p15 = dict; - if (_p15.ctor === 'RBEmpty_elm_builtin') { - return _elm_lang$core$Maybe$Nothing; - } else { - var _p16 = A2(_elm_lang$core$Basics$compare, targetKey, _p15._1); - switch (_p16.ctor) { - case 'LT': - var _v20 = targetKey, - _v21 = _p15._3; - targetKey = _v20; - dict = _v21; - continue get; - case 'EQ': - return _elm_lang$core$Maybe$Just(_p15._2); - default: - var _v22 = targetKey, - _v23 = _p15._4; - targetKey = _v22; - dict = _v23; - continue get; - } - } - } - }); -var _elm_lang$core$Dict$member = F2( - function (key, dict) { - var _p17 = A2(_elm_lang$core$Dict$get, key, dict); - if (_p17.ctor === 'Just') { - return true; - } else { - return false; - } - }); -var _elm_lang$core$Dict$maxWithDefault = F3( - function (k, v, r) { - maxWithDefault: - while (true) { - var _p18 = r; - if (_p18.ctor === 'RBEmpty_elm_builtin') { - return {ctor: '_Tuple2', _0: k, _1: v}; - } else { - var _v26 = _p18._1, - _v27 = _p18._2, - _v28 = _p18._4; - k = _v26; - v = _v27; - r = _v28; - continue maxWithDefault; - } - } - }); -var _elm_lang$core$Dict$NBlack = {ctor: 'NBlack'}; -var _elm_lang$core$Dict$BBlack = {ctor: 'BBlack'}; -var _elm_lang$core$Dict$Black = {ctor: 'Black'}; -var _elm_lang$core$Dict$blackish = function (t) { - var _p19 = t; - if (_p19.ctor === 'RBNode_elm_builtin') { - var _p20 = _p19._0; - return _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$Black) || _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$BBlack); - } else { - return true; - } -}; -var _elm_lang$core$Dict$Red = {ctor: 'Red'}; -var _elm_lang$core$Dict$moreBlack = function (color) { - var _p21 = color; - switch (_p21.ctor) { - case 'Black': - return _elm_lang$core$Dict$BBlack; - case 'Red': - return _elm_lang$core$Dict$Black; - case 'NBlack': - return _elm_lang$core$Dict$Red; - default: - return _elm_lang$core$Native_Debug.crash('Can\'t make a double black node more black!'); - } -}; -var _elm_lang$core$Dict$lessBlack = function (color) { - var _p22 = color; - switch (_p22.ctor) { - case 'BBlack': - return _elm_lang$core$Dict$Black; - case 'Black': - return _elm_lang$core$Dict$Red; - case 'Red': - return _elm_lang$core$Dict$NBlack; - default: - return _elm_lang$core$Native_Debug.crash('Can\'t make a negative black node less black!'); - } -}; -var _elm_lang$core$Dict$LBBlack = {ctor: 'LBBlack'}; -var _elm_lang$core$Dict$LBlack = {ctor: 'LBlack'}; -var _elm_lang$core$Dict$RBEmpty_elm_builtin = function (a) { - return {ctor: 'RBEmpty_elm_builtin', _0: a}; -}; -var _elm_lang$core$Dict$empty = _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); -var _elm_lang$core$Dict$isEmpty = function (dict) { - return _elm_lang$core$Native_Utils.eq(dict, _elm_lang$core$Dict$empty); -}; -var _elm_lang$core$Dict$RBNode_elm_builtin = F5( - function (a, b, c, d, e) { - return {ctor: 'RBNode_elm_builtin', _0: a, _1: b, _2: c, _3: d, _4: e}; - }); -var _elm_lang$core$Dict$ensureBlackRoot = function (dict) { - var _p23 = dict; - if ((_p23.ctor === 'RBNode_elm_builtin') && (_p23._0.ctor === 'Red')) { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p23._1, _p23._2, _p23._3, _p23._4); - } else { - return dict; - } -}; -var _elm_lang$core$Dict$lessBlackTree = function (dict) { - var _p24 = dict; - if (_p24.ctor === 'RBNode_elm_builtin') { - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _elm_lang$core$Dict$lessBlack(_p24._0), - _p24._1, - _p24._2, - _p24._3, - _p24._4); - } else { - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); - } -}; -var _elm_lang$core$Dict$balancedTree = function (col) { - return function (xk) { - return function (xv) { - return function (yk) { - return function (yv) { - return function (zk) { - return function (zv) { - return function (a) { - return function (b) { - return function (c) { - return function (d) { - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _elm_lang$core$Dict$lessBlack(col), - yk, - yv, - A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, xk, xv, a, b), - A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, zk, zv, c, d)); - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; -}; -var _elm_lang$core$Dict$blacken = function (t) { - var _p25 = t; - if (_p25.ctor === 'RBEmpty_elm_builtin') { - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); - } else { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p25._1, _p25._2, _p25._3, _p25._4); - } -}; -var _elm_lang$core$Dict$redden = function (t) { - var _p26 = t; - if (_p26.ctor === 'RBEmpty_elm_builtin') { - return _elm_lang$core$Native_Debug.crash('can\'t make a Leaf red'); - } else { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, _p26._1, _p26._2, _p26._3, _p26._4); - } -}; -var _elm_lang$core$Dict$balanceHelp = function (tree) { - var _p27 = tree; - _v36_6: - do { - _v36_5: - do { - _v36_4: - do { - _v36_3: - do { - _v36_2: - do { - _v36_1: - do { - _v36_0: - do { - if (_p27.ctor === 'RBNode_elm_builtin') { - if (_p27._3.ctor === 'RBNode_elm_builtin') { - if (_p27._4.ctor === 'RBNode_elm_builtin') { - switch (_p27._3._0.ctor) { - case 'Red': - switch (_p27._4._0.ctor) { - case 'Red': - if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { - break _v36_0; - } else { - if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { - break _v36_1; - } else { - if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { - break _v36_2; - } else { - if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { - break _v36_3; - } else { - break _v36_6; - } - } - } - } - case 'NBlack': - if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { - break _v36_0; - } else { - if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { - break _v36_1; - } else { - if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { - break _v36_4; - } else { - break _v36_6; - } - } - } - default: - if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { - break _v36_0; - } else { - if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { - break _v36_1; - } else { - break _v36_6; - } - } - } - case 'NBlack': - switch (_p27._4._0.ctor) { - case 'Red': - if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { - break _v36_2; - } else { - if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { - break _v36_3; - } else { - if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { - break _v36_5; - } else { - break _v36_6; - } - } - } - case 'NBlack': - if (_p27._0.ctor === 'BBlack') { - if ((((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { - break _v36_4; - } else { - if ((((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { - break _v36_5; - } else { - break _v36_6; - } - } - } else { - break _v36_6; - } - default: - if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { - break _v36_5; - } else { - break _v36_6; - } - } - default: - switch (_p27._4._0.ctor) { - case 'Red': - if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { - break _v36_2; - } else { - if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { - break _v36_3; - } else { - break _v36_6; - } - } - case 'NBlack': - if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { - break _v36_4; - } else { - break _v36_6; - } - default: - break _v36_6; - } - } - } else { - switch (_p27._3._0.ctor) { - case 'Red': - if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { - break _v36_0; - } else { - if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { - break _v36_1; - } else { - break _v36_6; - } - } - case 'NBlack': - if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { - break _v36_5; - } else { - break _v36_6; - } - default: - break _v36_6; - } - } - } else { - if (_p27._4.ctor === 'RBNode_elm_builtin') { - switch (_p27._4._0.ctor) { - case 'Red': - if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { - break _v36_2; - } else { - if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { - break _v36_3; - } else { - break _v36_6; - } - } - case 'NBlack': - if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { - break _v36_4; - } else { - break _v36_6; - } - default: - break _v36_6; - } - } else { - break _v36_6; - } - } - } else { - break _v36_6; - } - } while(false); - return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._3._1)(_p27._3._3._2)(_p27._3._1)(_p27._3._2)(_p27._1)(_p27._2)(_p27._3._3._3)(_p27._3._3._4)(_p27._3._4)(_p27._4); - } while(false); - return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._1)(_p27._3._2)(_p27._3._4._1)(_p27._3._4._2)(_p27._1)(_p27._2)(_p27._3._3)(_p27._3._4._3)(_p27._3._4._4)(_p27._4); - } while(false); - return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._3._1)(_p27._4._3._2)(_p27._4._1)(_p27._4._2)(_p27._3)(_p27._4._3._3)(_p27._4._3._4)(_p27._4._4); - } while(false); - return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._1)(_p27._4._2)(_p27._4._4._1)(_p27._4._4._2)(_p27._3)(_p27._4._3)(_p27._4._4._3)(_p27._4._4._4); - } while(false); - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _elm_lang$core$Dict$Black, - _p27._4._3._1, - _p27._4._3._2, - A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3, _p27._4._3._3), - A5( - _elm_lang$core$Dict$balance, - _elm_lang$core$Dict$Black, - _p27._4._1, - _p27._4._2, - _p27._4._3._4, - _elm_lang$core$Dict$redden(_p27._4._4))); - } while(false); - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _elm_lang$core$Dict$Black, - _p27._3._4._1, - _p27._3._4._2, - A5( - _elm_lang$core$Dict$balance, - _elm_lang$core$Dict$Black, - _p27._3._1, - _p27._3._2, - _elm_lang$core$Dict$redden(_p27._3._3), - _p27._3._4._3), - A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3._4._4, _p27._4)); - } while(false); - return tree; -}; -var _elm_lang$core$Dict$balance = F5( - function (c, k, v, l, r) { - var tree = A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r); - return _elm_lang$core$Dict$blackish(tree) ? _elm_lang$core$Dict$balanceHelp(tree) : tree; - }); -var _elm_lang$core$Dict$bubble = F5( - function (c, k, v, l, r) { - return (_elm_lang$core$Dict$isBBlack(l) || _elm_lang$core$Dict$isBBlack(r)) ? A5( - _elm_lang$core$Dict$balance, - _elm_lang$core$Dict$moreBlack(c), - k, - v, - _elm_lang$core$Dict$lessBlackTree(l), - _elm_lang$core$Dict$lessBlackTree(r)) : A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r); - }); -var _elm_lang$core$Dict$removeMax = F5( - function (c, k, v, l, r) { - var _p28 = r; - if (_p28.ctor === 'RBEmpty_elm_builtin') { - return A3(_elm_lang$core$Dict$rem, c, l, r); - } else { - return A5( - _elm_lang$core$Dict$bubble, - c, - k, - v, - l, - A5(_elm_lang$core$Dict$removeMax, _p28._0, _p28._1, _p28._2, _p28._3, _p28._4)); - } - }); -var _elm_lang$core$Dict$rem = F3( - function (color, left, right) { - var _p29 = {ctor: '_Tuple2', _0: left, _1: right}; - if (_p29._0.ctor === 'RBEmpty_elm_builtin') { - if (_p29._1.ctor === 'RBEmpty_elm_builtin') { - var _p30 = color; - switch (_p30.ctor) { - case 'Red': - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); - case 'Black': - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBBlack); - default: - return _elm_lang$core$Native_Debug.crash('cannot have bblack or nblack nodes at this point'); - } - } else { - var _p33 = _p29._1._0; - var _p32 = _p29._0._0; - var _p31 = {ctor: '_Tuple3', _0: color, _1: _p32, _2: _p33}; - if ((((_p31.ctor === '_Tuple3') && (_p31._0.ctor === 'Black')) && (_p31._1.ctor === 'LBlack')) && (_p31._2.ctor === 'Red')) { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._1._1, _p29._1._2, _p29._1._3, _p29._1._4); - } else { - return A4( - _elm_lang$core$Dict$reportRemBug, - 'Black/LBlack/Red', - color, - _elm_lang$core$Basics$toString(_p32), - _elm_lang$core$Basics$toString(_p33)); - } - } - } else { - if (_p29._1.ctor === 'RBEmpty_elm_builtin') { - var _p36 = _p29._1._0; - var _p35 = _p29._0._0; - var _p34 = {ctor: '_Tuple3', _0: color, _1: _p35, _2: _p36}; - if ((((_p34.ctor === '_Tuple3') && (_p34._0.ctor === 'Black')) && (_p34._1.ctor === 'Red')) && (_p34._2.ctor === 'LBlack')) { - return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._0._1, _p29._0._2, _p29._0._3, _p29._0._4); - } else { - return A4( - _elm_lang$core$Dict$reportRemBug, - 'Black/Red/LBlack', - color, - _elm_lang$core$Basics$toString(_p35), - _elm_lang$core$Basics$toString(_p36)); - } - } else { - var _p40 = _p29._0._2; - var _p39 = _p29._0._4; - var _p38 = _p29._0._1; - var newLeft = A5(_elm_lang$core$Dict$removeMax, _p29._0._0, _p38, _p40, _p29._0._3, _p39); - var _p37 = A3(_elm_lang$core$Dict$maxWithDefault, _p38, _p40, _p39); - var k = _p37._0; - var v = _p37._1; - return A5(_elm_lang$core$Dict$bubble, color, k, v, newLeft, right); - } - } - }); -var _elm_lang$core$Dict$map = F2( - function (f, dict) { - var _p41 = dict; - if (_p41.ctor === 'RBEmpty_elm_builtin') { - return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); - } else { - var _p42 = _p41._1; - return A5( - _elm_lang$core$Dict$RBNode_elm_builtin, - _p41._0, - _p42, - A2(f, _p42, _p41._2), - A2(_elm_lang$core$Dict$map, f, _p41._3), - A2(_elm_lang$core$Dict$map, f, _p41._4)); - } - }); -var _elm_lang$core$Dict$Same = {ctor: 'Same'}; -var _elm_lang$core$Dict$Remove = {ctor: 'Remove'}; -var _elm_lang$core$Dict$Insert = {ctor: 'Insert'}; -var _elm_lang$core$Dict$update = F3( - function (k, alter, dict) { - var up = function (dict) { - var _p43 = dict; - if (_p43.ctor === 'RBEmpty_elm_builtin') { - var _p44 = alter(_elm_lang$core$Maybe$Nothing); - if (_p44.ctor === 'Nothing') { - return {ctor: '_Tuple2', _0: _elm_lang$core$Dict$Same, _1: _elm_lang$core$Dict$empty}; - } else { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Insert, - _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, k, _p44._0, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty) - }; - } - } else { - var _p55 = _p43._2; - var _p54 = _p43._4; - var _p53 = _p43._3; - var _p52 = _p43._1; - var _p51 = _p43._0; - var _p45 = A2(_elm_lang$core$Basics$compare, k, _p52); - switch (_p45.ctor) { - case 'EQ': - var _p46 = alter( - _elm_lang$core$Maybe$Just(_p55)); - if (_p46.ctor === 'Nothing') { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Remove, - _1: A3(_elm_lang$core$Dict$rem, _p51, _p53, _p54) - }; - } else { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Same, - _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p46._0, _p53, _p54) - }; - } - case 'LT': - var _p47 = up(_p53); - var flag = _p47._0; - var newLeft = _p47._1; - var _p48 = flag; - switch (_p48.ctor) { - case 'Same': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Same, - _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, newLeft, _p54) - }; - case 'Insert': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Insert, - _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, newLeft, _p54) - }; - default: - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Remove, - _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, newLeft, _p54) - }; - } - default: - var _p49 = up(_p54); - var flag = _p49._0; - var newRight = _p49._1; - var _p50 = flag; - switch (_p50.ctor) { - case 'Same': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Same, - _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, _p53, newRight) - }; - case 'Insert': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Insert, - _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, _p53, newRight) - }; - default: - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Dict$Remove, - _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, _p53, newRight) - }; - } - } - } - }; - var _p56 = up(dict); - var flag = _p56._0; - var updatedDict = _p56._1; - var _p57 = flag; - switch (_p57.ctor) { - case 'Same': - return updatedDict; - case 'Insert': - return _elm_lang$core$Dict$ensureBlackRoot(updatedDict); - default: - return _elm_lang$core$Dict$blacken(updatedDict); - } - }); -var _elm_lang$core$Dict$insert = F3( - function (key, value, dict) { - return A3( - _elm_lang$core$Dict$update, - key, - _elm_lang$core$Basics$always( - _elm_lang$core$Maybe$Just(value)), - dict); - }); -var _elm_lang$core$Dict$singleton = F2( - function (key, value) { - return A3(_elm_lang$core$Dict$insert, key, value, _elm_lang$core$Dict$empty); - }); -var _elm_lang$core$Dict$union = F2( - function (t1, t2) { - return A3(_elm_lang$core$Dict$foldl, _elm_lang$core$Dict$insert, t2, t1); - }); -var _elm_lang$core$Dict$filter = F2( - function (predicate, dictionary) { - var add = F3( - function (key, value, dict) { - return A2(predicate, key, value) ? A3(_elm_lang$core$Dict$insert, key, value, dict) : dict; - }); - return A3(_elm_lang$core$Dict$foldl, add, _elm_lang$core$Dict$empty, dictionary); - }); -var _elm_lang$core$Dict$intersect = F2( - function (t1, t2) { - return A2( - _elm_lang$core$Dict$filter, - F2( - function (k, _p58) { - return A2(_elm_lang$core$Dict$member, k, t2); - }), - t1); - }); -var _elm_lang$core$Dict$partition = F2( - function (predicate, dict) { - var add = F3( - function (key, value, _p59) { - var _p60 = _p59; - var _p62 = _p60._1; - var _p61 = _p60._0; - return A2(predicate, key, value) ? { - ctor: '_Tuple2', - _0: A3(_elm_lang$core$Dict$insert, key, value, _p61), - _1: _p62 - } : { - ctor: '_Tuple2', - _0: _p61, - _1: A3(_elm_lang$core$Dict$insert, key, value, _p62) - }; - }); - return A3( - _elm_lang$core$Dict$foldl, - add, - {ctor: '_Tuple2', _0: _elm_lang$core$Dict$empty, _1: _elm_lang$core$Dict$empty}, - dict); - }); -var _elm_lang$core$Dict$fromList = function (assocs) { - return A3( - _elm_lang$core$List$foldl, - F2( - function (_p63, dict) { - var _p64 = _p63; - return A3(_elm_lang$core$Dict$insert, _p64._0, _p64._1, dict); - }), - _elm_lang$core$Dict$empty, - assocs); -}; -var _elm_lang$core$Dict$remove = F2( - function (key, dict) { - return A3( - _elm_lang$core$Dict$update, - key, - _elm_lang$core$Basics$always(_elm_lang$core$Maybe$Nothing), - dict); - }); -var _elm_lang$core$Dict$diff = F2( - function (t1, t2) { - return A3( - _elm_lang$core$Dict$foldl, - F3( - function (k, v, t) { - return A2(_elm_lang$core$Dict$remove, k, t); - }), - t1, - t2); - }); - -//import Maybe, Native.Array, Native.List, Native.Utils, Result // - -var _elm_lang$core$Native_Json = function() { - - -// CORE DECODERS - -function succeed(msg) -{ - return { - ctor: '', - tag: 'succeed', - msg: msg - }; -} - -function fail(msg) -{ - return { - ctor: '', - tag: 'fail', - msg: msg - }; -} - -function decodePrimitive(tag) -{ - return { - ctor: '', - tag: tag - }; -} - -function decodeContainer(tag, decoder) -{ - return { - ctor: '', - tag: tag, - decoder: decoder - }; -} - -function decodeNull(value) -{ - return { - ctor: '', - tag: 'null', - value: value - }; -} - -function decodeField(field, decoder) -{ - return { - ctor: '', - tag: 'field', - field: field, - decoder: decoder - }; -} - -function decodeIndex(index, decoder) -{ - return { - ctor: '', - tag: 'index', - index: index, - decoder: decoder - }; -} - -function decodeKeyValuePairs(decoder) -{ - return { - ctor: '', - tag: 'key-value', - decoder: decoder - }; -} - -function mapMany(f, decoders) -{ - return { - ctor: '', - tag: 'map-many', - func: f, - decoders: decoders - }; -} - -function andThen(callback, decoder) -{ - return { - ctor: '', - tag: 'andThen', - decoder: decoder, - callback: callback - }; -} - -function oneOf(decoders) -{ - return { - ctor: '', - tag: 'oneOf', - decoders: decoders - }; -} - - -// DECODING OBJECTS - -function map1(f, d1) -{ - return mapMany(f, [d1]); -} - -function map2(f, d1, d2) -{ - return mapMany(f, [d1, d2]); -} - -function map3(f, d1, d2, d3) -{ - return mapMany(f, [d1, d2, d3]); -} - -function map4(f, d1, d2, d3, d4) -{ - return mapMany(f, [d1, d2, d3, d4]); -} - -function map5(f, d1, d2, d3, d4, d5) -{ - return mapMany(f, [d1, d2, d3, d4, d5]); -} - -function map6(f, d1, d2, d3, d4, d5, d6) -{ - return mapMany(f, [d1, d2, d3, d4, d5, d6]); -} - -function map7(f, d1, d2, d3, d4, d5, d6, d7) -{ - return mapMany(f, [d1, d2, d3, d4, d5, d6, d7]); -} - -function map8(f, d1, d2, d3, d4, d5, d6, d7, d8) -{ - return mapMany(f, [d1, d2, d3, d4, d5, d6, d7, d8]); -} - - -// DECODE HELPERS - -function ok(value) -{ - return { tag: 'ok', value: value }; -} - -function badPrimitive(type, value) -{ - return { tag: 'primitive', type: type, value: value }; -} - -function badIndex(index, nestedProblems) -{ - return { tag: 'index', index: index, rest: nestedProblems }; -} - -function badField(field, nestedProblems) -{ - return { tag: 'field', field: field, rest: nestedProblems }; -} - -function badIndex(index, nestedProblems) -{ - return { tag: 'index', index: index, rest: nestedProblems }; -} - -function badOneOf(problems) -{ - return { tag: 'oneOf', problems: problems }; -} - -function bad(msg) -{ - return { tag: 'fail', msg: msg }; -} - -function badToString(problem) -{ - var context = '_'; - while (problem) - { - switch (problem.tag) - { - case 'primitive': - return 'Expecting ' + problem.type - + (context === '_' ? '' : ' at ' + context) - + ' but instead got: ' + jsToString(problem.value); - - case 'index': - context += '[' + problem.index + ']'; - problem = problem.rest; - break; - - case 'field': - context += '.' + problem.field; - problem = problem.rest; - break; - - case 'oneOf': - var problems = problem.problems; - for (var i = 0; i < problems.length; i++) - { - problems[i] = badToString(problems[i]); - } - return 'I ran into the following problems' - + (context === '_' ? '' : ' at ' + context) - + ':\n\n' + problems.join('\n'); - - case 'fail': - return 'I ran into a `fail` decoder' - + (context === '_' ? '' : ' at ' + context) - + ': ' + problem.msg; - } - } -} - -function jsToString(value) -{ - return value === undefined - ? 'undefined' - : JSON.stringify(value); -} - - -// DECODE - -function runOnString(decoder, string) -{ - var json; - try - { - json = JSON.parse(string); - } - catch (e) - { - return _elm_lang$core$Result$Err('Given an invalid JSON: ' + e.message); - } - return run(decoder, json); -} - -function run(decoder, value) -{ - var result = runHelp(decoder, value); - return (result.tag === 'ok') - ? _elm_lang$core$Result$Ok(result.value) - : _elm_lang$core$Result$Err(badToString(result)); -} - -function runHelp(decoder, value) -{ - switch (decoder.tag) - { - case 'bool': - return (typeof value === 'boolean') - ? ok(value) - : badPrimitive('a Bool', value); - - case 'int': - if (typeof value !== 'number') { - return badPrimitive('an Int', value); - } - - if (-2147483647 < value && value < 2147483647 && (value | 0) === value) { - return ok(value); - } - - if (isFinite(value) && !(value % 1)) { - return ok(value); - } - - return badPrimitive('an Int', value); - - case 'float': - return (typeof value === 'number') - ? ok(value) - : badPrimitive('a Float', value); - - case 'string': - return (typeof value === 'string') - ? ok(value) - : (value instanceof String) - ? ok(value + '') - : badPrimitive('a String', value); - - case 'null': - return (value === null) - ? ok(decoder.value) - : badPrimitive('null', value); - - case 'value': - return ok(value); - - case 'list': - if (!(value instanceof Array)) - { - return badPrimitive('a List', value); - } - - var list = _elm_lang$core$Native_List.Nil; - for (var i = value.length; i--; ) - { - var result = runHelp(decoder.decoder, value[i]); - if (result.tag !== 'ok') - { - return badIndex(i, result) - } - list = _elm_lang$core$Native_List.Cons(result.value, list); - } - return ok(list); - - case 'array': - if (!(value instanceof Array)) - { - return badPrimitive('an Array', value); - } - - var len = value.length; - var array = new Array(len); - for (var i = len; i--; ) - { - var result = runHelp(decoder.decoder, value[i]); - if (result.tag !== 'ok') - { - return badIndex(i, result); - } - array[i] = result.value; - } - return ok(_elm_lang$core$Native_Array.fromJSArray(array)); - - case 'maybe': - var result = runHelp(decoder.decoder, value); - return (result.tag === 'ok') - ? ok(_elm_lang$core$Maybe$Just(result.value)) - : ok(_elm_lang$core$Maybe$Nothing); - - case 'field': - var field = decoder.field; - if (typeof value !== 'object' || value === null || !(field in value)) - { - return badPrimitive('an object with a field named `' + field + '`', value); - } - - var result = runHelp(decoder.decoder, value[field]); - return (result.tag === 'ok') ? result : badField(field, result); - - case 'index': - var index = decoder.index; - if (!(value instanceof Array)) - { - return badPrimitive('an array', value); - } - if (index >= value.length) - { - return badPrimitive('a longer array. Need index ' + index + ' but there are only ' + value.length + ' entries', value); - } - - var result = runHelp(decoder.decoder, value[index]); - return (result.tag === 'ok') ? result : badIndex(index, result); - - case 'key-value': - if (typeof value !== 'object' || value === null || value instanceof Array) - { - return badPrimitive('an object', value); - } - - var keyValuePairs = _elm_lang$core$Native_List.Nil; - for (var key in value) - { - var result = runHelp(decoder.decoder, value[key]); - if (result.tag !== 'ok') - { - return badField(key, result); - } - var pair = _elm_lang$core$Native_Utils.Tuple2(key, result.value); - keyValuePairs = _elm_lang$core$Native_List.Cons(pair, keyValuePairs); - } - return ok(keyValuePairs); - - case 'map-many': - var answer = decoder.func; - var decoders = decoder.decoders; - for (var i = 0; i < decoders.length; i++) - { - var result = runHelp(decoders[i], value); - if (result.tag !== 'ok') - { - return result; - } - answer = answer(result.value); - } - return ok(answer); - - case 'andThen': - var result = runHelp(decoder.decoder, value); - return (result.tag !== 'ok') - ? result - : runHelp(decoder.callback(result.value), value); - - case 'oneOf': - var errors = []; - var temp = decoder.decoders; - while (temp.ctor !== '[]') - { - var result = runHelp(temp._0, value); - - if (result.tag === 'ok') - { - return result; - } - - errors.push(result); - - temp = temp._1; - } - return badOneOf(errors); - - case 'fail': - return bad(decoder.msg); - - case 'succeed': - return ok(decoder.msg); - } -} - - -// EQUALITY - -function equality(a, b) -{ - if (a === b) - { - return true; - } - - if (a.tag !== b.tag) - { - return false; - } - - switch (a.tag) - { - case 'succeed': - case 'fail': - return a.msg === b.msg; - - case 'bool': - case 'int': - case 'float': - case 'string': - case 'value': - return true; - - case 'null': - return a.value === b.value; - - case 'list': - case 'array': - case 'maybe': - case 'key-value': - return equality(a.decoder, b.decoder); - - case 'field': - return a.field === b.field && equality(a.decoder, b.decoder); - - case 'index': - return a.index === b.index && equality(a.decoder, b.decoder); - - case 'map-many': - if (a.func !== b.func) - { - return false; - } - return listEquality(a.decoders, b.decoders); - - case 'andThen': - return a.callback === b.callback && equality(a.decoder, b.decoder); - - case 'oneOf': - return listEquality(a.decoders, b.decoders); - } -} - -function listEquality(aDecoders, bDecoders) -{ - var len = aDecoders.length; - if (len !== bDecoders.length) - { - return false; - } - for (var i = 0; i < len; i++) - { - if (!equality(aDecoders[i], bDecoders[i])) - { - return false; - } - } - return true; -} - - -// ENCODE - -function encode(indentLevel, value) -{ - return JSON.stringify(value, null, indentLevel); -} - -function identity(value) -{ - return value; -} - -function encodeObject(keyValuePairs) -{ - var obj = {}; - while (keyValuePairs.ctor !== '[]') - { - var pair = keyValuePairs._0; - obj[pair._0] = pair._1; - keyValuePairs = keyValuePairs._1; - } - return obj; -} - -return { - encode: F2(encode), - runOnString: F2(runOnString), - run: F2(run), - - decodeNull: decodeNull, - decodePrimitive: decodePrimitive, - decodeContainer: F2(decodeContainer), - - decodeField: F2(decodeField), - decodeIndex: F2(decodeIndex), - - map1: F2(map1), - map2: F3(map2), - map3: F4(map3), - map4: F5(map4), - map5: F6(map5), - map6: F7(map6), - map7: F8(map7), - map8: F9(map8), - decodeKeyValuePairs: decodeKeyValuePairs, - - andThen: F2(andThen), - fail: fail, - succeed: succeed, - oneOf: oneOf, - - identity: identity, - encodeNull: null, - encodeArray: _elm_lang$core$Native_Array.toJSArray, - encodeList: _elm_lang$core$Native_List.toArray, - encodeObject: encodeObject, - - equality: equality -}; - -}(); - -var _elm_lang$core$Json_Encode$list = _elm_lang$core$Native_Json.encodeList; -var _elm_lang$core$Json_Encode$array = _elm_lang$core$Native_Json.encodeArray; -var _elm_lang$core$Json_Encode$object = _elm_lang$core$Native_Json.encodeObject; -var _elm_lang$core$Json_Encode$null = _elm_lang$core$Native_Json.encodeNull; -var _elm_lang$core$Json_Encode$bool = _elm_lang$core$Native_Json.identity; -var _elm_lang$core$Json_Encode$float = _elm_lang$core$Native_Json.identity; -var _elm_lang$core$Json_Encode$int = _elm_lang$core$Native_Json.identity; -var _elm_lang$core$Json_Encode$string = _elm_lang$core$Native_Json.identity; -var _elm_lang$core$Json_Encode$encode = _elm_lang$core$Native_Json.encode; -var _elm_lang$core$Json_Encode$Value = {ctor: 'Value'}; - -var _elm_lang$core$Json_Decode$null = _elm_lang$core$Native_Json.decodeNull; -var _elm_lang$core$Json_Decode$value = _elm_lang$core$Native_Json.decodePrimitive('value'); -var _elm_lang$core$Json_Decode$andThen = _elm_lang$core$Native_Json.andThen; -var _elm_lang$core$Json_Decode$fail = _elm_lang$core$Native_Json.fail; -var _elm_lang$core$Json_Decode$succeed = _elm_lang$core$Native_Json.succeed; -var _elm_lang$core$Json_Decode$lazy = function (thunk) { - return A2( - _elm_lang$core$Json_Decode$andThen, - thunk, - _elm_lang$core$Json_Decode$succeed( - {ctor: '_Tuple0'})); -}; -var _elm_lang$core$Json_Decode$decodeValue = _elm_lang$core$Native_Json.run; -var _elm_lang$core$Json_Decode$decodeString = _elm_lang$core$Native_Json.runOnString; -var _elm_lang$core$Json_Decode$map8 = _elm_lang$core$Native_Json.map8; -var _elm_lang$core$Json_Decode$map7 = _elm_lang$core$Native_Json.map7; -var _elm_lang$core$Json_Decode$map6 = _elm_lang$core$Native_Json.map6; -var _elm_lang$core$Json_Decode$map5 = _elm_lang$core$Native_Json.map5; -var _elm_lang$core$Json_Decode$map4 = _elm_lang$core$Native_Json.map4; -var _elm_lang$core$Json_Decode$map3 = _elm_lang$core$Native_Json.map3; -var _elm_lang$core$Json_Decode$map2 = _elm_lang$core$Native_Json.map2; -var _elm_lang$core$Json_Decode$map = _elm_lang$core$Native_Json.map1; -var _elm_lang$core$Json_Decode$oneOf = _elm_lang$core$Native_Json.oneOf; -var _elm_lang$core$Json_Decode$maybe = function (decoder) { - return A2(_elm_lang$core$Native_Json.decodeContainer, 'maybe', decoder); -}; -var _elm_lang$core$Json_Decode$index = _elm_lang$core$Native_Json.decodeIndex; -var _elm_lang$core$Json_Decode$field = _elm_lang$core$Native_Json.decodeField; -var _elm_lang$core$Json_Decode$at = F2( - function (fields, decoder) { - return A3(_elm_lang$core$List$foldr, _elm_lang$core$Json_Decode$field, decoder, fields); - }); -var _elm_lang$core$Json_Decode$keyValuePairs = _elm_lang$core$Native_Json.decodeKeyValuePairs; -var _elm_lang$core$Json_Decode$dict = function (decoder) { - return A2( - _elm_lang$core$Json_Decode$map, - _elm_lang$core$Dict$fromList, - _elm_lang$core$Json_Decode$keyValuePairs(decoder)); -}; -var _elm_lang$core$Json_Decode$array = function (decoder) { - return A2(_elm_lang$core$Native_Json.decodeContainer, 'array', decoder); -}; -var _elm_lang$core$Json_Decode$list = function (decoder) { - return A2(_elm_lang$core$Native_Json.decodeContainer, 'list', decoder); -}; -var _elm_lang$core$Json_Decode$nullable = function (decoder) { - return _elm_lang$core$Json_Decode$oneOf( - { - ctor: '::', - _0: _elm_lang$core$Json_Decode$null(_elm_lang$core$Maybe$Nothing), - _1: { - ctor: '::', - _0: A2(_elm_lang$core$Json_Decode$map, _elm_lang$core$Maybe$Just, decoder), - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$core$Json_Decode$float = _elm_lang$core$Native_Json.decodePrimitive('float'); -var _elm_lang$core$Json_Decode$int = _elm_lang$core$Native_Json.decodePrimitive('int'); -var _elm_lang$core$Json_Decode$bool = _elm_lang$core$Native_Json.decodePrimitive('bool'); -var _elm_lang$core$Json_Decode$string = _elm_lang$core$Native_Json.decodePrimitive('string'); -var _elm_lang$core$Json_Decode$Decoder = {ctor: 'Decoder'}; - -var _elm_lang$core$Debug$crash = _elm_lang$core$Native_Debug.crash; -var _elm_lang$core$Debug$log = _elm_lang$core$Native_Debug.log; - -var _elm_lang$core$Tuple$mapSecond = F2( - function (func, _p0) { - var _p1 = _p0; - return { - ctor: '_Tuple2', - _0: _p1._0, - _1: func(_p1._1) - }; - }); -var _elm_lang$core$Tuple$mapFirst = F2( - function (func, _p2) { - var _p3 = _p2; - return { - ctor: '_Tuple2', - _0: func(_p3._0), - _1: _p3._1 - }; - }); -var _elm_lang$core$Tuple$second = function (_p4) { - var _p5 = _p4; - return _p5._1; -}; -var _elm_lang$core$Tuple$first = function (_p6) { - var _p7 = _p6; - return _p7._0; -}; - -//import // - -var _elm_lang$core$Native_Platform = function() { - - -// PROGRAMS - -function program(impl) -{ - return function(flagDecoder) - { - return function(object, moduleName) - { - object['worker'] = function worker(flags) - { - if (typeof flags !== 'undefined') - { - throw new Error( - 'The `' + moduleName + '` module does not need flags.\n' - + 'Call ' + moduleName + '.worker() with no arguments and you should be all set!' - ); - } - - return initialize( - impl.init, - impl.update, - impl.subscriptions, - renderer - ); - }; - }; - }; -} - -function programWithFlags(impl) -{ - return function(flagDecoder) - { - return function(object, moduleName) - { - object['worker'] = function worker(flags) - { - if (typeof flagDecoder === 'undefined') - { - throw new Error( - 'Are you trying to sneak a Never value into Elm? Trickster!\n' - + 'It looks like ' + moduleName + '.main is defined with `programWithFlags` but has type `Program Never`.\n' - + 'Use `program` instead if you do not want flags.' - ); - } - - var result = A2(_elm_lang$core$Native_Json.run, flagDecoder, flags); - if (result.ctor === 'Err') - { - throw new Error( - moduleName + '.worker(...) was called with an unexpected argument.\n' - + 'I tried to convert it to an Elm value, but ran into this problem:\n\n' - + result._0 - ); - } - - return initialize( - impl.init(result._0), - impl.update, - impl.subscriptions, - renderer - ); - }; - }; - }; -} - -function renderer(enqueue, _) -{ - return function(_) {}; -} - - -// HTML TO PROGRAM - -function htmlToProgram(vnode) -{ - var emptyBag = batch(_elm_lang$core$Native_List.Nil); - var noChange = _elm_lang$core$Native_Utils.Tuple2( - _elm_lang$core$Native_Utils.Tuple0, - emptyBag - ); - - return _elm_lang$virtual_dom$VirtualDom$program({ - init: noChange, - view: function(model) { return main; }, - update: F2(function(msg, model) { return noChange; }), - subscriptions: function (model) { return emptyBag; } - }); -} - - -// INITIALIZE A PROGRAM - -function initialize(init, update, subscriptions, renderer) -{ - // ambient state - var managers = {}; - var updateView; - - // init and update state in main process - var initApp = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { - var model = init._0; - updateView = renderer(enqueue, model); - var cmds = init._1; - var subs = subscriptions(model); - dispatchEffects(managers, cmds, subs); - callback(_elm_lang$core$Native_Scheduler.succeed(model)); - }); - - function onMessage(msg, model) - { - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { - var results = A2(update, msg, model); - model = results._0; - updateView(model); - var cmds = results._1; - var subs = subscriptions(model); - dispatchEffects(managers, cmds, subs); - callback(_elm_lang$core$Native_Scheduler.succeed(model)); - }); - } - - var mainProcess = spawnLoop(initApp, onMessage); - - function enqueue(msg) - { - _elm_lang$core$Native_Scheduler.rawSend(mainProcess, msg); - } - - var ports = setupEffects(managers, enqueue); - - return ports ? { ports: ports } : {}; -} - - -// EFFECT MANAGERS - -var effectManagers = {}; - -function setupEffects(managers, callback) -{ - var ports; - - // setup all necessary effect managers - for (var key in effectManagers) - { - var manager = effectManagers[key]; - - if (manager.isForeign) - { - ports = ports || {}; - ports[key] = manager.tag === 'cmd' - ? setupOutgoingPort(key) - : setupIncomingPort(key, callback); - } - - managers[key] = makeManager(manager, callback); - } - - return ports; -} - -function makeManager(info, callback) -{ - var router = { - main: callback, - self: undefined - }; - - var tag = info.tag; - var onEffects = info.onEffects; - var onSelfMsg = info.onSelfMsg; - - function onMessage(msg, state) - { - if (msg.ctor === 'self') - { - return A3(onSelfMsg, router, msg._0, state); - } - - var fx = msg._0; - switch (tag) - { - case 'cmd': - return A3(onEffects, router, fx.cmds, state); - - case 'sub': - return A3(onEffects, router, fx.subs, state); - - case 'fx': - return A4(onEffects, router, fx.cmds, fx.subs, state); - } - } - - var process = spawnLoop(info.init, onMessage); - router.self = process; - return process; -} - -function sendToApp(router, msg) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) - { - router.main(msg); - callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0)); - }); -} - -function sendToSelf(router, msg) -{ - return A2(_elm_lang$core$Native_Scheduler.send, router.self, { - ctor: 'self', - _0: msg - }); -} - - -// HELPER for STATEFUL LOOPS - -function spawnLoop(init, onMessage) -{ - var andThen = _elm_lang$core$Native_Scheduler.andThen; - - function loop(state) - { - var handleMsg = _elm_lang$core$Native_Scheduler.receive(function(msg) { - return onMessage(msg, state); - }); - return A2(andThen, loop, handleMsg); - } - - var task = A2(andThen, loop, init); - - return _elm_lang$core$Native_Scheduler.rawSpawn(task); -} - - -// BAGS - -function leaf(home) -{ - return function(value) - { - return { - type: 'leaf', - home: home, - value: value - }; - }; -} - -function batch(list) -{ - return { - type: 'node', - branches: list - }; -} - -function map(tagger, bag) -{ - return { - type: 'map', - tagger: tagger, - tree: bag - } -} - - -// PIPE BAGS INTO EFFECT MANAGERS - -function dispatchEffects(managers, cmdBag, subBag) -{ - var effectsDict = {}; - gatherEffects(true, cmdBag, effectsDict, null); - gatherEffects(false, subBag, effectsDict, null); - - for (var home in managers) - { - var fx = home in effectsDict - ? effectsDict[home] - : { - cmds: _elm_lang$core$Native_List.Nil, - subs: _elm_lang$core$Native_List.Nil - }; - - _elm_lang$core$Native_Scheduler.rawSend(managers[home], { ctor: 'fx', _0: fx }); - } -} - -function gatherEffects(isCmd, bag, effectsDict, taggers) -{ - switch (bag.type) - { - case 'leaf': - var home = bag.home; - var effect = toEffect(isCmd, home, taggers, bag.value); - effectsDict[home] = insert(isCmd, effect, effectsDict[home]); - return; - - case 'node': - var list = bag.branches; - while (list.ctor !== '[]') - { - gatherEffects(isCmd, list._0, effectsDict, taggers); - list = list._1; - } - return; - - case 'map': - gatherEffects(isCmd, bag.tree, effectsDict, { - tagger: bag.tagger, - rest: taggers - }); - return; - } -} - -function toEffect(isCmd, home, taggers, value) -{ - function applyTaggers(x) - { - var temp = taggers; - while (temp) - { - x = temp.tagger(x); - temp = temp.rest; - } - return x; - } - - var map = isCmd - ? effectManagers[home].cmdMap - : effectManagers[home].subMap; - - return A2(map, applyTaggers, value) -} - -function insert(isCmd, newEffect, effects) -{ - effects = effects || { - cmds: _elm_lang$core$Native_List.Nil, - subs: _elm_lang$core$Native_List.Nil - }; - if (isCmd) - { - effects.cmds = _elm_lang$core$Native_List.Cons(newEffect, effects.cmds); - return effects; - } - effects.subs = _elm_lang$core$Native_List.Cons(newEffect, effects.subs); - return effects; -} - - -// PORTS - -function checkPortName(name) -{ - if (name in effectManagers) - { - throw new Error('There can only be one port named `' + name + '`, but your program has multiple.'); - } -} - - -// OUTGOING PORTS - -function outgoingPort(name, converter) -{ - checkPortName(name); - effectManagers[name] = { - tag: 'cmd', - cmdMap: outgoingPortMap, - converter: converter, - isForeign: true - }; - return leaf(name); -} - -var outgoingPortMap = F2(function cmdMap(tagger, value) { - return value; -}); - -function setupOutgoingPort(name) -{ - var subs = []; - var converter = effectManagers[name].converter; - - // CREATE MANAGER - - var init = _elm_lang$core$Native_Scheduler.succeed(null); - - function onEffects(router, cmdList, state) - { - while (cmdList.ctor !== '[]') - { - // grab a separate reference to subs in case unsubscribe is called - var currentSubs = subs; - var value = converter(cmdList._0); - for (var i = 0; i < currentSubs.length; i++) - { - currentSubs[i](value); - } - cmdList = cmdList._1; - } - return init; - } - - effectManagers[name].init = init; - effectManagers[name].onEffects = F3(onEffects); - - // PUBLIC API - - function subscribe(callback) - { - subs.push(callback); - } - - function unsubscribe(callback) - { - // copy subs into a new array in case unsubscribe is called within a - // subscribed callback - subs = subs.slice(); - var index = subs.indexOf(callback); - if (index >= 0) - { - subs.splice(index, 1); - } - } - - return { - subscribe: subscribe, - unsubscribe: unsubscribe - }; -} - - -// INCOMING PORTS - -function incomingPort(name, converter) -{ - checkPortName(name); - effectManagers[name] = { - tag: 'sub', - subMap: incomingPortMap, - converter: converter, - isForeign: true - }; - return leaf(name); -} - -var incomingPortMap = F2(function subMap(tagger, finalTagger) -{ - return function(value) - { - return tagger(finalTagger(value)); - }; -}); - -function setupIncomingPort(name, callback) -{ - var sentBeforeInit = []; - var subs = _elm_lang$core$Native_List.Nil; - var converter = effectManagers[name].converter; - var currentOnEffects = preInitOnEffects; - var currentSend = preInitSend; - - // CREATE MANAGER - - var init = _elm_lang$core$Native_Scheduler.succeed(null); - - function preInitOnEffects(router, subList, state) - { - var postInitResult = postInitOnEffects(router, subList, state); - - for(var i = 0; i < sentBeforeInit.length; i++) - { - postInitSend(sentBeforeInit[i]); - } - - sentBeforeInit = null; // to release objects held in queue - currentSend = postInitSend; - currentOnEffects = postInitOnEffects; - return postInitResult; - } - - function postInitOnEffects(router, subList, state) - { - subs = subList; - return init; - } - - function onEffects(router, subList, state) - { - return currentOnEffects(router, subList, state); - } - - effectManagers[name].init = init; - effectManagers[name].onEffects = F3(onEffects); - - // PUBLIC API - - function preInitSend(value) - { - sentBeforeInit.push(value); - } - - function postInitSend(value) - { - var temp = subs; - while (temp.ctor !== '[]') - { - callback(temp._0(value)); - temp = temp._1; - } - } - - function send(incomingValue) - { - var result = A2(_elm_lang$core$Json_Decode$decodeValue, converter, incomingValue); - if (result.ctor === 'Err') - { - throw new Error('Trying to send an unexpected type of value through port `' + name + '`:\n' + result._0); - } - - currentSend(result._0); - } - - return { send: send }; -} - -return { - // routers - sendToApp: F2(sendToApp), - sendToSelf: F2(sendToSelf), - - // global setup - effectManagers: effectManagers, - outgoingPort: outgoingPort, - incomingPort: incomingPort, - - htmlToProgram: htmlToProgram, - program: program, - programWithFlags: programWithFlags, - initialize: initialize, - - // effect bags - leaf: leaf, - batch: batch, - map: F2(map) -}; - -}(); - -//import Native.Utils // - -var _elm_lang$core$Native_Scheduler = function() { - -var MAX_STEPS = 10000; - - -// TASKS - -function succeed(value) -{ - return { - ctor: '_Task_succeed', - value: value - }; -} - -function fail(error) -{ - return { - ctor: '_Task_fail', - value: error - }; -} - -function nativeBinding(callback) -{ - return { - ctor: '_Task_nativeBinding', - callback: callback, - cancel: null - }; -} - -function andThen(callback, task) -{ - return { - ctor: '_Task_andThen', - callback: callback, - task: task - }; -} - -function onError(callback, task) -{ - return { - ctor: '_Task_onError', - callback: callback, - task: task - }; -} - -function receive(callback) -{ - return { - ctor: '_Task_receive', - callback: callback - }; -} - - -// PROCESSES - -function rawSpawn(task) -{ - var process = { - ctor: '_Process', - id: _elm_lang$core$Native_Utils.guid(), - root: task, - stack: null, - mailbox: [] - }; - - enqueue(process); - - return process; -} - -function spawn(task) -{ - return nativeBinding(function(callback) { - var process = rawSpawn(task); - callback(succeed(process)); - }); -} - -function rawSend(process, msg) -{ - process.mailbox.push(msg); - enqueue(process); -} - -function send(process, msg) -{ - return nativeBinding(function(callback) { - rawSend(process, msg); - callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); - }); -} - -function kill(process) -{ - return nativeBinding(function(callback) { - var root = process.root; - if (root.ctor === '_Task_nativeBinding' && root.cancel) - { - root.cancel(); - } - - process.root = null; - - callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); - }); -} - -function sleep(time) -{ - return nativeBinding(function(callback) { - var id = setTimeout(function() { - callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); - }, time); - - return function() { clearTimeout(id); }; - }); -} - - -// STEP PROCESSES - -function step(numSteps, process) -{ - while (numSteps < MAX_STEPS) - { - var ctor = process.root.ctor; - - if (ctor === '_Task_succeed') - { - while (process.stack && process.stack.ctor === '_Task_onError') - { - process.stack = process.stack.rest; - } - if (process.stack === null) - { - break; - } - process.root = process.stack.callback(process.root.value); - process.stack = process.stack.rest; - ++numSteps; - continue; - } - - if (ctor === '_Task_fail') - { - while (process.stack && process.stack.ctor === '_Task_andThen') - { - process.stack = process.stack.rest; - } - if (process.stack === null) - { - break; - } - process.root = process.stack.callback(process.root.value); - process.stack = process.stack.rest; - ++numSteps; - continue; - } - - if (ctor === '_Task_andThen') - { - process.stack = { - ctor: '_Task_andThen', - callback: process.root.callback, - rest: process.stack - }; - process.root = process.root.task; - ++numSteps; - continue; - } - - if (ctor === '_Task_onError') - { - process.stack = { - ctor: '_Task_onError', - callback: process.root.callback, - rest: process.stack - }; - process.root = process.root.task; - ++numSteps; - continue; - } - - if (ctor === '_Task_nativeBinding') - { - process.root.cancel = process.root.callback(function(newRoot) { - process.root = newRoot; - enqueue(process); - }); - - break; - } - - if (ctor === '_Task_receive') - { - var mailbox = process.mailbox; - if (mailbox.length === 0) - { - break; - } - - process.root = process.root.callback(mailbox.shift()); - ++numSteps; - continue; - } - - throw new Error(ctor); - } - - if (numSteps < MAX_STEPS) - { - return numSteps + 1; - } - enqueue(process); - - return numSteps; -} - - -// WORK QUEUE - -var working = false; -var workQueue = []; - -function enqueue(process) -{ - workQueue.push(process); - - if (!working) - { - setTimeout(work, 0); - working = true; - } -} - -function work() -{ - var numSteps = 0; - var process; - while (numSteps < MAX_STEPS && (process = workQueue.shift())) - { - if (process.root) - { - numSteps = step(numSteps, process); - } - } - if (!process) - { - working = false; - return; - } - setTimeout(work, 0); -} - - -return { - succeed: succeed, - fail: fail, - nativeBinding: nativeBinding, - andThen: F2(andThen), - onError: F2(onError), - receive: receive, - - spawn: spawn, - kill: kill, - sleep: sleep, - send: F2(send), - - rawSpawn: rawSpawn, - rawSend: rawSend -}; - -}(); -var _elm_lang$core$Platform_Cmd$batch = _elm_lang$core$Native_Platform.batch; -var _elm_lang$core$Platform_Cmd$none = _elm_lang$core$Platform_Cmd$batch( - {ctor: '[]'}); -var _elm_lang$core$Platform_Cmd_ops = _elm_lang$core$Platform_Cmd_ops || {}; -_elm_lang$core$Platform_Cmd_ops['!'] = F2( - function (model, commands) { - return { - ctor: '_Tuple2', - _0: model, - _1: _elm_lang$core$Platform_Cmd$batch(commands) - }; - }); -var _elm_lang$core$Platform_Cmd$map = _elm_lang$core$Native_Platform.map; -var _elm_lang$core$Platform_Cmd$Cmd = {ctor: 'Cmd'}; - -var _elm_lang$core$Platform_Sub$batch = _elm_lang$core$Native_Platform.batch; -var _elm_lang$core$Platform_Sub$none = _elm_lang$core$Platform_Sub$batch( - {ctor: '[]'}); -var _elm_lang$core$Platform_Sub$map = _elm_lang$core$Native_Platform.map; -var _elm_lang$core$Platform_Sub$Sub = {ctor: 'Sub'}; - -var _elm_lang$core$Platform$hack = _elm_lang$core$Native_Scheduler.succeed; -var _elm_lang$core$Platform$sendToSelf = _elm_lang$core$Native_Platform.sendToSelf; -var _elm_lang$core$Platform$sendToApp = _elm_lang$core$Native_Platform.sendToApp; -var _elm_lang$core$Platform$programWithFlags = _elm_lang$core$Native_Platform.programWithFlags; -var _elm_lang$core$Platform$program = _elm_lang$core$Native_Platform.program; -var _elm_lang$core$Platform$Program = {ctor: 'Program'}; -var _elm_lang$core$Platform$Task = {ctor: 'Task'}; -var _elm_lang$core$Platform$ProcessId = {ctor: 'ProcessId'}; -var _elm_lang$core$Platform$Router = {ctor: 'Router'}; - -var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode = _elm_lang$core$Json_Decode$succeed; -var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$resolve = _elm_lang$core$Json_Decode$andThen(_elm_lang$core$Basics$identity); -var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom = _elm_lang$core$Json_Decode$map2( - F2( - function (x, y) { - return y(x); - })); -var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$hardcoded = function (_p0) { - return _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom( - _elm_lang$core$Json_Decode$succeed(_p0)); -}; -var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalDecoder = F3( - function (pathDecoder, valDecoder, fallback) { - var nullOr = function (decoder) { - return _elm_lang$core$Json_Decode$oneOf( - { - ctor: '::', - _0: decoder, - _1: { - ctor: '::', - _0: _elm_lang$core$Json_Decode$null(fallback), - _1: {ctor: '[]'} - } - }); - }; - var handleResult = function (input) { - var _p1 = A2(_elm_lang$core$Json_Decode$decodeValue, pathDecoder, input); - if (_p1.ctor === 'Ok') { - var _p2 = A2( - _elm_lang$core$Json_Decode$decodeValue, - nullOr(valDecoder), - _p1._0); - if (_p2.ctor === 'Ok') { - return _elm_lang$core$Json_Decode$succeed(_p2._0); - } else { - return _elm_lang$core$Json_Decode$fail(_p2._0); - } - } else { - return _elm_lang$core$Json_Decode$succeed(fallback); - } - }; - return A2(_elm_lang$core$Json_Decode$andThen, handleResult, _elm_lang$core$Json_Decode$value); - }); -var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalAt = F4( - function (path, valDecoder, fallback, decoder) { - return A2( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalDecoder, - A2(_elm_lang$core$Json_Decode$at, path, _elm_lang$core$Json_Decode$value), - valDecoder, - fallback), - decoder); - }); -var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional = F4( - function (key, valDecoder, fallback, decoder) { - return A2( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optionalDecoder, - A2(_elm_lang$core$Json_Decode$field, key, _elm_lang$core$Json_Decode$value), - valDecoder, - fallback), - decoder); - }); -var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$requiredAt = F3( - function (path, valDecoder, decoder) { - return A2( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom, - A2(_elm_lang$core$Json_Decode$at, path, valDecoder), - decoder); - }); -var _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required = F3( - function (key, valDecoder, decoder) { - return A2( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$custom, - A2(_elm_lang$core$Json_Decode$field, key, valDecoder), - decoder); - }); - -var _elm_lang$core$Task$onError = _elm_lang$core$Native_Scheduler.onError; -var _elm_lang$core$Task$andThen = _elm_lang$core$Native_Scheduler.andThen; -var _elm_lang$core$Task$spawnCmd = F2( - function (router, _p0) { - var _p1 = _p0; - return _elm_lang$core$Native_Scheduler.spawn( - A2( - _elm_lang$core$Task$andThen, - _elm_lang$core$Platform$sendToApp(router), - _p1._0)); - }); -var _elm_lang$core$Task$fail = _elm_lang$core$Native_Scheduler.fail; -var _elm_lang$core$Task$mapError = F2( - function (convert, task) { - return A2( - _elm_lang$core$Task$onError, - function (_p2) { - return _elm_lang$core$Task$fail( - convert(_p2)); - }, - task); - }); -var _elm_lang$core$Task$succeed = _elm_lang$core$Native_Scheduler.succeed; -var _elm_lang$core$Task$map = F2( - function (func, taskA) { - return A2( - _elm_lang$core$Task$andThen, - function (a) { - return _elm_lang$core$Task$succeed( - func(a)); - }, - taskA); - }); -var _elm_lang$core$Task$map2 = F3( - function (func, taskA, taskB) { - return A2( - _elm_lang$core$Task$andThen, - function (a) { - return A2( - _elm_lang$core$Task$andThen, - function (b) { - return _elm_lang$core$Task$succeed( - A2(func, a, b)); - }, - taskB); - }, - taskA); - }); -var _elm_lang$core$Task$map3 = F4( - function (func, taskA, taskB, taskC) { - return A2( - _elm_lang$core$Task$andThen, - function (a) { - return A2( - _elm_lang$core$Task$andThen, - function (b) { - return A2( - _elm_lang$core$Task$andThen, - function (c) { - return _elm_lang$core$Task$succeed( - A3(func, a, b, c)); - }, - taskC); - }, - taskB); - }, - taskA); - }); -var _elm_lang$core$Task$map4 = F5( - function (func, taskA, taskB, taskC, taskD) { - return A2( - _elm_lang$core$Task$andThen, - function (a) { - return A2( - _elm_lang$core$Task$andThen, - function (b) { - return A2( - _elm_lang$core$Task$andThen, - function (c) { - return A2( - _elm_lang$core$Task$andThen, - function (d) { - return _elm_lang$core$Task$succeed( - A4(func, a, b, c, d)); - }, - taskD); - }, - taskC); - }, - taskB); - }, - taskA); - }); -var _elm_lang$core$Task$map5 = F6( - function (func, taskA, taskB, taskC, taskD, taskE) { - return A2( - _elm_lang$core$Task$andThen, - function (a) { - return A2( - _elm_lang$core$Task$andThen, - function (b) { - return A2( - _elm_lang$core$Task$andThen, - function (c) { - return A2( - _elm_lang$core$Task$andThen, - function (d) { - return A2( - _elm_lang$core$Task$andThen, - function (e) { - return _elm_lang$core$Task$succeed( - A5(func, a, b, c, d, e)); - }, - taskE); - }, - taskD); - }, - taskC); - }, - taskB); - }, - taskA); - }); -var _elm_lang$core$Task$sequence = function (tasks) { - var _p3 = tasks; - if (_p3.ctor === '[]') { - return _elm_lang$core$Task$succeed( - {ctor: '[]'}); - } else { - return A3( - _elm_lang$core$Task$map2, - F2( - function (x, y) { - return {ctor: '::', _0: x, _1: y}; - }), - _p3._0, - _elm_lang$core$Task$sequence(_p3._1)); - } -}; -var _elm_lang$core$Task$onEffects = F3( - function (router, commands, state) { - return A2( - _elm_lang$core$Task$map, - function (_p4) { - return {ctor: '_Tuple0'}; - }, - _elm_lang$core$Task$sequence( - A2( - _elm_lang$core$List$map, - _elm_lang$core$Task$spawnCmd(router), - commands))); - }); -var _elm_lang$core$Task$init = _elm_lang$core$Task$succeed( - {ctor: '_Tuple0'}); -var _elm_lang$core$Task$onSelfMsg = F3( - function (_p7, _p6, _p5) { - return _elm_lang$core$Task$succeed( - {ctor: '_Tuple0'}); - }); -var _elm_lang$core$Task$command = _elm_lang$core$Native_Platform.leaf('Task'); -var _elm_lang$core$Task$Perform = function (a) { - return {ctor: 'Perform', _0: a}; -}; -var _elm_lang$core$Task$perform = F2( - function (toMessage, task) { - return _elm_lang$core$Task$command( - _elm_lang$core$Task$Perform( - A2(_elm_lang$core$Task$map, toMessage, task))); - }); -var _elm_lang$core$Task$attempt = F2( - function (resultToMessage, task) { - return _elm_lang$core$Task$command( - _elm_lang$core$Task$Perform( - A2( - _elm_lang$core$Task$onError, - function (_p8) { - return _elm_lang$core$Task$succeed( - resultToMessage( - _elm_lang$core$Result$Err(_p8))); - }, - A2( - _elm_lang$core$Task$andThen, - function (_p9) { - return _elm_lang$core$Task$succeed( - resultToMessage( - _elm_lang$core$Result$Ok(_p9))); - }, - task)))); - }); -var _elm_lang$core$Task$cmdMap = F2( - function (tagger, _p10) { - var _p11 = _p10; - return _elm_lang$core$Task$Perform( - A2(_elm_lang$core$Task$map, tagger, _p11._0)); - }); -_elm_lang$core$Native_Platform.effectManagers['Task'] = {pkg: 'elm-lang/core', init: _elm_lang$core$Task$init, onEffects: _elm_lang$core$Task$onEffects, onSelfMsg: _elm_lang$core$Task$onSelfMsg, tag: 'cmd', cmdMap: _elm_lang$core$Task$cmdMap}; - -//import Native.Scheduler // - -var _elm_lang$core$Native_Time = function() { - -var now = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) -{ - callback(_elm_lang$core$Native_Scheduler.succeed(Date.now())); -}); - -function setInterval_(interval, task) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) - { - var id = setInterval(function() { - _elm_lang$core$Native_Scheduler.rawSpawn(task); - }, interval); - - return function() { clearInterval(id); }; - }); -} - -return { - now: now, - setInterval_: F2(setInterval_) -}; - -}(); -var _elm_lang$core$Time$setInterval = _elm_lang$core$Native_Time.setInterval_; -var _elm_lang$core$Time$spawnHelp = F3( - function (router, intervals, processes) { - var _p0 = intervals; - if (_p0.ctor === '[]') { - return _elm_lang$core$Task$succeed(processes); - } else { - var _p1 = _p0._0; - var spawnRest = function (id) { - return A3( - _elm_lang$core$Time$spawnHelp, - router, - _p0._1, - A3(_elm_lang$core$Dict$insert, _p1, id, processes)); - }; - var spawnTimer = _elm_lang$core$Native_Scheduler.spawn( - A2( - _elm_lang$core$Time$setInterval, - _p1, - A2(_elm_lang$core$Platform$sendToSelf, router, _p1))); - return A2(_elm_lang$core$Task$andThen, spawnRest, spawnTimer); - } - }); -var _elm_lang$core$Time$addMySub = F2( - function (_p2, state) { - var _p3 = _p2; - var _p6 = _p3._1; - var _p5 = _p3._0; - var _p4 = A2(_elm_lang$core$Dict$get, _p5, state); - if (_p4.ctor === 'Nothing') { - return A3( - _elm_lang$core$Dict$insert, - _p5, - { - ctor: '::', - _0: _p6, - _1: {ctor: '[]'} - }, - state); - } else { - return A3( - _elm_lang$core$Dict$insert, - _p5, - {ctor: '::', _0: _p6, _1: _p4._0}, - state); - } - }); -var _elm_lang$core$Time$inMilliseconds = function (t) { - return t; -}; -var _elm_lang$core$Time$millisecond = 1; -var _elm_lang$core$Time$second = 1000 * _elm_lang$core$Time$millisecond; -var _elm_lang$core$Time$minute = 60 * _elm_lang$core$Time$second; -var _elm_lang$core$Time$hour = 60 * _elm_lang$core$Time$minute; -var _elm_lang$core$Time$inHours = function (t) { - return t / _elm_lang$core$Time$hour; -}; -var _elm_lang$core$Time$inMinutes = function (t) { - return t / _elm_lang$core$Time$minute; -}; -var _elm_lang$core$Time$inSeconds = function (t) { - return t / _elm_lang$core$Time$second; -}; -var _elm_lang$core$Time$now = _elm_lang$core$Native_Time.now; -var _elm_lang$core$Time$onSelfMsg = F3( - function (router, interval, state) { - var _p7 = A2(_elm_lang$core$Dict$get, interval, state.taggers); - if (_p7.ctor === 'Nothing') { - return _elm_lang$core$Task$succeed(state); - } else { - var tellTaggers = function (time) { - return _elm_lang$core$Task$sequence( - A2( - _elm_lang$core$List$map, - function (tagger) { - return A2( - _elm_lang$core$Platform$sendToApp, - router, - tagger(time)); - }, - _p7._0)); - }; - return A2( - _elm_lang$core$Task$andThen, - function (_p8) { - return _elm_lang$core$Task$succeed(state); - }, - A2(_elm_lang$core$Task$andThen, tellTaggers, _elm_lang$core$Time$now)); - } - }); -var _elm_lang$core$Time$subscription = _elm_lang$core$Native_Platform.leaf('Time'); -var _elm_lang$core$Time$State = F2( - function (a, b) { - return {taggers: a, processes: b}; - }); -var _elm_lang$core$Time$init = _elm_lang$core$Task$succeed( - A2(_elm_lang$core$Time$State, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty)); -var _elm_lang$core$Time$onEffects = F3( - function (router, subs, _p9) { - var _p10 = _p9; - var rightStep = F3( - function (_p12, id, _p11) { - var _p13 = _p11; - return { - ctor: '_Tuple3', - _0: _p13._0, - _1: _p13._1, - _2: A2( - _elm_lang$core$Task$andThen, - function (_p14) { - return _p13._2; - }, - _elm_lang$core$Native_Scheduler.kill(id)) - }; - }); - var bothStep = F4( - function (interval, taggers, id, _p15) { - var _p16 = _p15; - return { - ctor: '_Tuple3', - _0: _p16._0, - _1: A3(_elm_lang$core$Dict$insert, interval, id, _p16._1), - _2: _p16._2 - }; - }); - var leftStep = F3( - function (interval, taggers, _p17) { - var _p18 = _p17; - return { - ctor: '_Tuple3', - _0: {ctor: '::', _0: interval, _1: _p18._0}, - _1: _p18._1, - _2: _p18._2 - }; - }); - var newTaggers = A3(_elm_lang$core$List$foldl, _elm_lang$core$Time$addMySub, _elm_lang$core$Dict$empty, subs); - var _p19 = A6( - _elm_lang$core$Dict$merge, - leftStep, - bothStep, - rightStep, - newTaggers, - _p10.processes, - { - ctor: '_Tuple3', - _0: {ctor: '[]'}, - _1: _elm_lang$core$Dict$empty, - _2: _elm_lang$core$Task$succeed( - {ctor: '_Tuple0'}) - }); - var spawnList = _p19._0; - var existingDict = _p19._1; - var killTask = _p19._2; - return A2( - _elm_lang$core$Task$andThen, - function (newProcesses) { - return _elm_lang$core$Task$succeed( - A2(_elm_lang$core$Time$State, newTaggers, newProcesses)); - }, - A2( - _elm_lang$core$Task$andThen, - function (_p20) { - return A3(_elm_lang$core$Time$spawnHelp, router, spawnList, existingDict); - }, - killTask)); - }); -var _elm_lang$core$Time$Every = F2( - function (a, b) { - return {ctor: 'Every', _0: a, _1: b}; - }); -var _elm_lang$core$Time$every = F2( - function (interval, tagger) { - return _elm_lang$core$Time$subscription( - A2(_elm_lang$core$Time$Every, interval, tagger)); - }); -var _elm_lang$core$Time$subMap = F2( - function (f, _p21) { - var _p22 = _p21; - return A2( - _elm_lang$core$Time$Every, - _p22._0, - function (_p23) { - return f( - _p22._1(_p23)); - }); - }); -_elm_lang$core$Native_Platform.effectManagers['Time'] = {pkg: 'elm-lang/core', init: _elm_lang$core$Time$init, onEffects: _elm_lang$core$Time$onEffects, onSelfMsg: _elm_lang$core$Time$onSelfMsg, tag: 'sub', subMap: _elm_lang$core$Time$subMap}; - -var _elm_lang$core$Process$kill = _elm_lang$core$Native_Scheduler.kill; -var _elm_lang$core$Process$sleep = _elm_lang$core$Native_Scheduler.sleep; -var _elm_lang$core$Process$spawn = _elm_lang$core$Native_Scheduler.spawn; - -var _elm_lang$virtual_dom$VirtualDom_Debug$wrap; -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags; - -var _elm_lang$virtual_dom$Native_VirtualDom = function() { - -var STYLE_KEY = 'STYLE'; -var EVENT_KEY = 'EVENT'; -var ATTR_KEY = 'ATTR'; -var ATTR_NS_KEY = 'ATTR_NS'; - -var localDoc = typeof document !== 'undefined' ? document : {}; - - -//////////// VIRTUAL DOM NODES //////////// - - -function text(string) -{ - return { - type: 'text', - text: string - }; -} - - -function node(tag) -{ - return F2(function(factList, kidList) { - return nodeHelp(tag, factList, kidList); - }); -} - - -function nodeHelp(tag, factList, kidList) -{ - var organized = organizeFacts(factList); - var namespace = organized.namespace; - var facts = organized.facts; - - var children = []; - var descendantsCount = 0; - while (kidList.ctor !== '[]') - { - var kid = kidList._0; - descendantsCount += (kid.descendantsCount || 0); - children.push(kid); - kidList = kidList._1; - } - descendantsCount += children.length; - - return { - type: 'node', - tag: tag, - facts: facts, - children: children, - namespace: namespace, - descendantsCount: descendantsCount - }; -} - - -function keyedNode(tag, factList, kidList) -{ - var organized = organizeFacts(factList); - var namespace = organized.namespace; - var facts = organized.facts; - - var children = []; - var descendantsCount = 0; - while (kidList.ctor !== '[]') - { - var kid = kidList._0; - descendantsCount += (kid._1.descendantsCount || 0); - children.push(kid); - kidList = kidList._1; - } - descendantsCount += children.length; - - return { - type: 'keyed-node', - tag: tag, - facts: facts, - children: children, - namespace: namespace, - descendantsCount: descendantsCount - }; -} - - -function custom(factList, model, impl) -{ - var facts = organizeFacts(factList).facts; - - return { - type: 'custom', - facts: facts, - model: model, - impl: impl - }; -} - - -function map(tagger, node) -{ - return { - type: 'tagger', - tagger: tagger, - node: node, - descendantsCount: 1 + (node.descendantsCount || 0) - }; -} - - -function thunk(func, args, thunk) -{ - return { - type: 'thunk', - func: func, - args: args, - thunk: thunk, - node: undefined - }; -} - -function lazy(fn, a) -{ - return thunk(fn, [a], function() { - return fn(a); - }); -} - -function lazy2(fn, a, b) -{ - return thunk(fn, [a,b], function() { - return A2(fn, a, b); - }); -} - -function lazy3(fn, a, b, c) -{ - return thunk(fn, [a,b,c], function() { - return A3(fn, a, b, c); - }); -} - - - -// FACTS - - -function organizeFacts(factList) -{ - var namespace, facts = {}; - - while (factList.ctor !== '[]') - { - var entry = factList._0; - var key = entry.key; - - if (key === ATTR_KEY || key === ATTR_NS_KEY || key === EVENT_KEY) - { - var subFacts = facts[key] || {}; - subFacts[entry.realKey] = entry.value; - facts[key] = subFacts; - } - else if (key === STYLE_KEY) - { - var styles = facts[key] || {}; - var styleList = entry.value; - while (styleList.ctor !== '[]') - { - var style = styleList._0; - styles[style._0] = style._1; - styleList = styleList._1; - } - facts[key] = styles; - } - else if (key === 'namespace') - { - namespace = entry.value; - } - else if (key === 'className') - { - var classes = facts[key]; - facts[key] = typeof classes === 'undefined' - ? entry.value - : classes + ' ' + entry.value; - } - else - { - facts[key] = entry.value; - } - factList = factList._1; - } - - return { - facts: facts, - namespace: namespace - }; -} - - - -//////////// PROPERTIES AND ATTRIBUTES //////////// - - -function style(value) -{ - return { - key: STYLE_KEY, - value: value - }; -} - - -function property(key, value) -{ - return { - key: key, - value: value - }; -} - - -function attribute(key, value) -{ - return { - key: ATTR_KEY, - realKey: key, - value: value - }; -} - - -function attributeNS(namespace, key, value) -{ - return { - key: ATTR_NS_KEY, - realKey: key, - value: { - value: value, - namespace: namespace - } - }; -} - - -function on(name, options, decoder) -{ - return { - key: EVENT_KEY, - realKey: name, - value: { - options: options, - decoder: decoder - } - }; -} - - -function equalEvents(a, b) -{ - if (a.options !== b.options) - { - if (a.options.stopPropagation !== b.options.stopPropagation || a.options.preventDefault !== b.options.preventDefault) - { - return false; - } - } - return _elm_lang$core$Native_Json.equality(a.decoder, b.decoder); -} - - -function mapProperty(func, property) -{ - if (property.key !== EVENT_KEY) - { - return property; - } - return on( - property.realKey, - property.value.options, - A2(_elm_lang$core$Json_Decode$map, func, property.value.decoder) - ); -} - - -//////////// RENDER //////////// - - -function render(vNode, eventNode) -{ - switch (vNode.type) - { - case 'thunk': - if (!vNode.node) - { - vNode.node = vNode.thunk(); - } - return render(vNode.node, eventNode); - - case 'tagger': - var subNode = vNode.node; - var tagger = vNode.tagger; - - while (subNode.type === 'tagger') - { - typeof tagger !== 'object' - ? tagger = [tagger, subNode.tagger] - : tagger.push(subNode.tagger); - - subNode = subNode.node; - } - - var subEventRoot = { tagger: tagger, parent: eventNode }; - var domNode = render(subNode, subEventRoot); - domNode.elm_event_node_ref = subEventRoot; - return domNode; - - case 'text': - return localDoc.createTextNode(vNode.text); - - case 'node': - var domNode = vNode.namespace - ? localDoc.createElementNS(vNode.namespace, vNode.tag) - : localDoc.createElement(vNode.tag); - - applyFacts(domNode, eventNode, vNode.facts); - - var children = vNode.children; - - for (var i = 0; i < children.length; i++) - { - domNode.appendChild(render(children[i], eventNode)); - } - - return domNode; - - case 'keyed-node': - var domNode = vNode.namespace - ? localDoc.createElementNS(vNode.namespace, vNode.tag) - : localDoc.createElement(vNode.tag); - - applyFacts(domNode, eventNode, vNode.facts); - - var children = vNode.children; - - for (var i = 0; i < children.length; i++) - { - domNode.appendChild(render(children[i]._1, eventNode)); - } - - return domNode; - - case 'custom': - var domNode = vNode.impl.render(vNode.model); - applyFacts(domNode, eventNode, vNode.facts); - return domNode; - } -} - - - -//////////// APPLY FACTS //////////// - - -function applyFacts(domNode, eventNode, facts) -{ - for (var key in facts) - { - var value = facts[key]; - - switch (key) - { - case STYLE_KEY: - applyStyles(domNode, value); - break; - - case EVENT_KEY: - applyEvents(domNode, eventNode, value); - break; - - case ATTR_KEY: - applyAttrs(domNode, value); - break; - - case ATTR_NS_KEY: - applyAttrsNS(domNode, value); - break; - - case 'value': - if (domNode[key] !== value) - { - domNode[key] = value; - } - break; - - default: - domNode[key] = value; - break; - } - } -} - -function applyStyles(domNode, styles) -{ - var domNodeStyle = domNode.style; - - for (var key in styles) - { - domNodeStyle[key] = styles[key]; - } -} - -function applyEvents(domNode, eventNode, events) -{ - var allHandlers = domNode.elm_handlers || {}; - - for (var key in events) - { - var handler = allHandlers[key]; - var value = events[key]; - - if (typeof value === 'undefined') - { - domNode.removeEventListener(key, handler); - allHandlers[key] = undefined; - } - else if (typeof handler === 'undefined') - { - var handler = makeEventHandler(eventNode, value); - domNode.addEventListener(key, handler); - allHandlers[key] = handler; - } - else - { - handler.info = value; - } - } - - domNode.elm_handlers = allHandlers; -} - -function makeEventHandler(eventNode, info) -{ - function eventHandler(event) - { - var info = eventHandler.info; - - var value = A2(_elm_lang$core$Native_Json.run, info.decoder, event); - - if (value.ctor === 'Ok') - { - var options = info.options; - if (options.stopPropagation) - { - event.stopPropagation(); - } - if (options.preventDefault) - { - event.preventDefault(); - } - - var message = value._0; - - var currentEventNode = eventNode; - while (currentEventNode) - { - var tagger = currentEventNode.tagger; - if (typeof tagger === 'function') - { - message = tagger(message); - } - else - { - for (var i = tagger.length; i--; ) - { - message = tagger[i](message); - } - } - currentEventNode = currentEventNode.parent; - } - } - }; - - eventHandler.info = info; - - return eventHandler; -} - -function applyAttrs(domNode, attrs) -{ - for (var key in attrs) - { - var value = attrs[key]; - if (typeof value === 'undefined') - { - domNode.removeAttribute(key); - } - else - { - domNode.setAttribute(key, value); - } - } -} - -function applyAttrsNS(domNode, nsAttrs) -{ - for (var key in nsAttrs) - { - var pair = nsAttrs[key]; - var namespace = pair.namespace; - var value = pair.value; - - if (typeof value === 'undefined') - { - domNode.removeAttributeNS(namespace, key); - } - else - { - domNode.setAttributeNS(namespace, key, value); - } - } -} - - - -//////////// DIFF //////////// - - -function diff(a, b) -{ - var patches = []; - diffHelp(a, b, patches, 0); - return patches; -} - - -function makePatch(type, index, data) -{ - return { - index: index, - type: type, - data: data, - domNode: undefined, - eventNode: undefined - }; -} - - -function diffHelp(a, b, patches, index) -{ - if (a === b) - { - return; - } - - var aType = a.type; - var bType = b.type; - - // Bail if you run into different types of nodes. Implies that the - // structure has changed significantly and it's not worth a diff. - if (aType !== bType) - { - patches.push(makePatch('p-redraw', index, b)); - return; - } - - // Now we know that both nodes are the same type. - switch (bType) - { - case 'thunk': - var aArgs = a.args; - var bArgs = b.args; - var i = aArgs.length; - var same = a.func === b.func && i === bArgs.length; - while (same && i--) - { - same = aArgs[i] === bArgs[i]; - } - if (same) - { - b.node = a.node; - return; - } - b.node = b.thunk(); - var subPatches = []; - diffHelp(a.node, b.node, subPatches, 0); - if (subPatches.length > 0) - { - patches.push(makePatch('p-thunk', index, subPatches)); - } - return; - - case 'tagger': - // gather nested taggers - var aTaggers = a.tagger; - var bTaggers = b.tagger; - var nesting = false; - - var aSubNode = a.node; - while (aSubNode.type === 'tagger') - { - nesting = true; - - typeof aTaggers !== 'object' - ? aTaggers = [aTaggers, aSubNode.tagger] - : aTaggers.push(aSubNode.tagger); - - aSubNode = aSubNode.node; - } - - var bSubNode = b.node; - while (bSubNode.type === 'tagger') - { - nesting = true; - - typeof bTaggers !== 'object' - ? bTaggers = [bTaggers, bSubNode.tagger] - : bTaggers.push(bSubNode.tagger); - - bSubNode = bSubNode.node; - } - - // Just bail if different numbers of taggers. This implies the - // structure of the virtual DOM has changed. - if (nesting && aTaggers.length !== bTaggers.length) - { - patches.push(makePatch('p-redraw', index, b)); - return; - } - - // check if taggers are "the same" - if (nesting ? !pairwiseRefEqual(aTaggers, bTaggers) : aTaggers !== bTaggers) - { - patches.push(makePatch('p-tagger', index, bTaggers)); - } - - // diff everything below the taggers - diffHelp(aSubNode, bSubNode, patches, index + 1); - return; - - case 'text': - if (a.text !== b.text) - { - patches.push(makePatch('p-text', index, b.text)); - return; - } - - return; - - case 'node': - // Bail if obvious indicators have changed. Implies more serious - // structural changes such that it's not worth it to diff. - if (a.tag !== b.tag || a.namespace !== b.namespace) - { - patches.push(makePatch('p-redraw', index, b)); - return; - } - - var factsDiff = diffFacts(a.facts, b.facts); - - if (typeof factsDiff !== 'undefined') - { - patches.push(makePatch('p-facts', index, factsDiff)); - } - - diffChildren(a, b, patches, index); - return; - - case 'keyed-node': - // Bail if obvious indicators have changed. Implies more serious - // structural changes such that it's not worth it to diff. - if (a.tag !== b.tag || a.namespace !== b.namespace) - { - patches.push(makePatch('p-redraw', index, b)); - return; - } - - var factsDiff = diffFacts(a.facts, b.facts); - - if (typeof factsDiff !== 'undefined') - { - patches.push(makePatch('p-facts', index, factsDiff)); - } - - diffKeyedChildren(a, b, patches, index); - return; - - case 'custom': - if (a.impl !== b.impl) - { - patches.push(makePatch('p-redraw', index, b)); - return; - } - - var factsDiff = diffFacts(a.facts, b.facts); - if (typeof factsDiff !== 'undefined') - { - patches.push(makePatch('p-facts', index, factsDiff)); - } - - var patch = b.impl.diff(a,b); - if (patch) - { - patches.push(makePatch('p-custom', index, patch)); - return; - } - - return; - } -} - - -// assumes the incoming arrays are the same length -function pairwiseRefEqual(as, bs) -{ - for (var i = 0; i < as.length; i++) - { - if (as[i] !== bs[i]) - { - return false; - } - } - - return true; -} - - -// TODO Instead of creating a new diff object, it's possible to just test if -// there *is* a diff. During the actual patch, do the diff again and make the -// modifications directly. This way, there's no new allocations. Worth it? -function diffFacts(a, b, category) -{ - var diff; - - // look for changes and removals - for (var aKey in a) - { - if (aKey === STYLE_KEY || aKey === EVENT_KEY || aKey === ATTR_KEY || aKey === ATTR_NS_KEY) - { - var subDiff = diffFacts(a[aKey], b[aKey] || {}, aKey); - if (subDiff) - { - diff = diff || {}; - diff[aKey] = subDiff; - } - continue; - } - - // remove if not in the new facts - if (!(aKey in b)) - { - diff = diff || {}; - diff[aKey] = - (typeof category === 'undefined') - ? (typeof a[aKey] === 'string' ? '' : null) - : - (category === STYLE_KEY) - ? '' - : - (category === EVENT_KEY || category === ATTR_KEY) - ? undefined - : - { namespace: a[aKey].namespace, value: undefined }; - - continue; - } - - var aValue = a[aKey]; - var bValue = b[aKey]; - - // reference equal, so don't worry about it - if (aValue === bValue && aKey !== 'value' - || category === EVENT_KEY && equalEvents(aValue, bValue)) - { - continue; - } - - diff = diff || {}; - diff[aKey] = bValue; - } - - // add new stuff - for (var bKey in b) - { - if (!(bKey in a)) - { - diff = diff || {}; - diff[bKey] = b[bKey]; - } - } - - return diff; -} - - -function diffChildren(aParent, bParent, patches, rootIndex) -{ - var aChildren = aParent.children; - var bChildren = bParent.children; - - var aLen = aChildren.length; - var bLen = bChildren.length; - - // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS - - if (aLen > bLen) - { - patches.push(makePatch('p-remove-last', rootIndex, aLen - bLen)); - } - else if (aLen < bLen) - { - patches.push(makePatch('p-append', rootIndex, bChildren.slice(aLen))); - } - - // PAIRWISE DIFF EVERYTHING ELSE - - var index = rootIndex; - var minLen = aLen < bLen ? aLen : bLen; - for (var i = 0; i < minLen; i++) - { - index++; - var aChild = aChildren[i]; - diffHelp(aChild, bChildren[i], patches, index); - index += aChild.descendantsCount || 0; - } -} - - - -//////////// KEYED DIFF //////////// - - -function diffKeyedChildren(aParent, bParent, patches, rootIndex) -{ - var localPatches = []; - - var changes = {}; // Dict String Entry - var inserts = []; // Array { index : Int, entry : Entry } - // type Entry = { tag : String, vnode : VNode, index : Int, data : _ } - - var aChildren = aParent.children; - var bChildren = bParent.children; - var aLen = aChildren.length; - var bLen = bChildren.length; - var aIndex = 0; - var bIndex = 0; - - var index = rootIndex; - - while (aIndex < aLen && bIndex < bLen) - { - var a = aChildren[aIndex]; - var b = bChildren[bIndex]; - - var aKey = a._0; - var bKey = b._0; - var aNode = a._1; - var bNode = b._1; - - // check if keys match - - if (aKey === bKey) - { - index++; - diffHelp(aNode, bNode, localPatches, index); - index += aNode.descendantsCount || 0; - - aIndex++; - bIndex++; - continue; - } - - // look ahead 1 to detect insertions and removals. - - var aLookAhead = aIndex + 1 < aLen; - var bLookAhead = bIndex + 1 < bLen; - - if (aLookAhead) - { - var aNext = aChildren[aIndex + 1]; - var aNextKey = aNext._0; - var aNextNode = aNext._1; - var oldMatch = bKey === aNextKey; - } - - if (bLookAhead) - { - var bNext = bChildren[bIndex + 1]; - var bNextKey = bNext._0; - var bNextNode = bNext._1; - var newMatch = aKey === bNextKey; - } - - - // swap a and b - if (aLookAhead && bLookAhead && newMatch && oldMatch) - { - index++; - diffHelp(aNode, bNextNode, localPatches, index); - insertNode(changes, localPatches, aKey, bNode, bIndex, inserts); - index += aNode.descendantsCount || 0; - - index++; - removeNode(changes, localPatches, aKey, aNextNode, index); - index += aNextNode.descendantsCount || 0; - - aIndex += 2; - bIndex += 2; - continue; - } - - // insert b - if (bLookAhead && newMatch) - { - index++; - insertNode(changes, localPatches, bKey, bNode, bIndex, inserts); - diffHelp(aNode, bNextNode, localPatches, index); - index += aNode.descendantsCount || 0; - - aIndex += 1; - bIndex += 2; - continue; - } - - // remove a - if (aLookAhead && oldMatch) - { - index++; - removeNode(changes, localPatches, aKey, aNode, index); - index += aNode.descendantsCount || 0; - - index++; - diffHelp(aNextNode, bNode, localPatches, index); - index += aNextNode.descendantsCount || 0; - - aIndex += 2; - bIndex += 1; - continue; - } - - // remove a, insert b - if (aLookAhead && bLookAhead && aNextKey === bNextKey) - { - index++; - removeNode(changes, localPatches, aKey, aNode, index); - insertNode(changes, localPatches, bKey, bNode, bIndex, inserts); - index += aNode.descendantsCount || 0; - - index++; - diffHelp(aNextNode, bNextNode, localPatches, index); - index += aNextNode.descendantsCount || 0; - - aIndex += 2; - bIndex += 2; - continue; - } - - break; - } - - // eat up any remaining nodes with removeNode and insertNode - - while (aIndex < aLen) - { - index++; - var a = aChildren[aIndex]; - var aNode = a._1; - removeNode(changes, localPatches, a._0, aNode, index); - index += aNode.descendantsCount || 0; - aIndex++; - } - - var endInserts; - while (bIndex < bLen) - { - endInserts = endInserts || []; - var b = bChildren[bIndex]; - insertNode(changes, localPatches, b._0, b._1, undefined, endInserts); - bIndex++; - } - - if (localPatches.length > 0 || inserts.length > 0 || typeof endInserts !== 'undefined') - { - patches.push(makePatch('p-reorder', rootIndex, { - patches: localPatches, - inserts: inserts, - endInserts: endInserts - })); - } -} - - - -//////////// CHANGES FROM KEYED DIFF //////////// - - -var POSTFIX = '_elmW6BL'; - - -function insertNode(changes, localPatches, key, vnode, bIndex, inserts) -{ - var entry = changes[key]; - - // never seen this key before - if (typeof entry === 'undefined') - { - entry = { - tag: 'insert', - vnode: vnode, - index: bIndex, - data: undefined - }; - - inserts.push({ index: bIndex, entry: entry }); - changes[key] = entry; - - return; - } - - // this key was removed earlier, a match! - if (entry.tag === 'remove') - { - inserts.push({ index: bIndex, entry: entry }); - - entry.tag = 'move'; - var subPatches = []; - diffHelp(entry.vnode, vnode, subPatches, entry.index); - entry.index = bIndex; - entry.data.data = { - patches: subPatches, - entry: entry - }; - - return; - } - - // this key has already been inserted or moved, a duplicate! - insertNode(changes, localPatches, key + POSTFIX, vnode, bIndex, inserts); -} - - -function removeNode(changes, localPatches, key, vnode, index) -{ - var entry = changes[key]; - - // never seen this key before - if (typeof entry === 'undefined') - { - var patch = makePatch('p-remove', index, undefined); - localPatches.push(patch); - - changes[key] = { - tag: 'remove', - vnode: vnode, - index: index, - data: patch - }; - - return; - } - - // this key was inserted earlier, a match! - if (entry.tag === 'insert') - { - entry.tag = 'move'; - var subPatches = []; - diffHelp(vnode, entry.vnode, subPatches, index); - - var patch = makePatch('p-remove', index, { - patches: subPatches, - entry: entry - }); - localPatches.push(patch); - - return; - } - - // this key has already been removed or moved, a duplicate! - removeNode(changes, localPatches, key + POSTFIX, vnode, index); -} - - - -//////////// ADD DOM NODES //////////// -// -// Each DOM node has an "index" assigned in order of traversal. It is important -// to minimize our crawl over the actual DOM, so these indexes (along with the -// descendantsCount of virtual nodes) let us skip touching entire subtrees of -// the DOM if we know there are no patches there. - - -function addDomNodes(domNode, vNode, patches, eventNode) -{ - addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.descendantsCount, eventNode); -} - - -// assumes `patches` is non-empty and indexes increase monotonically. -function addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) -{ - var patch = patches[i]; - var index = patch.index; - - while (index === low) - { - var patchType = patch.type; - - if (patchType === 'p-thunk') - { - addDomNodes(domNode, vNode.node, patch.data, eventNode); - } - else if (patchType === 'p-reorder') - { - patch.domNode = domNode; - patch.eventNode = eventNode; - - var subPatches = patch.data.patches; - if (subPatches.length > 0) - { - addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); - } - } - else if (patchType === 'p-remove') - { - patch.domNode = domNode; - patch.eventNode = eventNode; - - var data = patch.data; - if (typeof data !== 'undefined') - { - data.entry.data = domNode; - var subPatches = data.patches; - if (subPatches.length > 0) - { - addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); - } - } - } - else - { - patch.domNode = domNode; - patch.eventNode = eventNode; - } - - i++; - - if (!(patch = patches[i]) || (index = patch.index) > high) - { - return i; - } - } - - switch (vNode.type) - { - case 'tagger': - var subNode = vNode.node; - - while (subNode.type === "tagger") - { - subNode = subNode.node; - } - - return addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); - - case 'node': - var vChildren = vNode.children; - var childNodes = domNode.childNodes; - for (var j = 0; j < vChildren.length; j++) - { - low++; - var vChild = vChildren[j]; - var nextLow = low + (vChild.descendantsCount || 0); - if (low <= index && index <= nextLow) - { - i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode); - if (!(patch = patches[i]) || (index = patch.index) > high) - { - return i; - } - } - low = nextLow; - } - return i; - - case 'keyed-node': - var vChildren = vNode.children; - var childNodes = domNode.childNodes; - for (var j = 0; j < vChildren.length; j++) - { - low++; - var vChild = vChildren[j]._1; - var nextLow = low + (vChild.descendantsCount || 0); - if (low <= index && index <= nextLow) - { - i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode); - if (!(patch = patches[i]) || (index = patch.index) > high) - { - return i; - } - } - low = nextLow; - } - return i; - - case 'text': - case 'thunk': - throw new Error('should never traverse `text` or `thunk` nodes like this'); - } -} - - - -//////////// APPLY PATCHES //////////// - - -function applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) -{ - if (patches.length === 0) - { - return rootDomNode; - } - - addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); - return applyPatchesHelp(rootDomNode, patches); -} - -function applyPatchesHelp(rootDomNode, patches) -{ - for (var i = 0; i < patches.length; i++) - { - var patch = patches[i]; - var localDomNode = patch.domNode - var newNode = applyPatch(localDomNode, patch); - if (localDomNode === rootDomNode) - { - rootDomNode = newNode; - } - } - return rootDomNode; -} - -function applyPatch(domNode, patch) -{ - switch (patch.type) - { - case 'p-redraw': - return applyPatchRedraw(domNode, patch.data, patch.eventNode); - - case 'p-facts': - applyFacts(domNode, patch.eventNode, patch.data); - return domNode; - - case 'p-text': - domNode.replaceData(0, domNode.length, patch.data); - return domNode; - - case 'p-thunk': - return applyPatchesHelp(domNode, patch.data); - - case 'p-tagger': - if (typeof domNode.elm_event_node_ref !== 'undefined') - { - domNode.elm_event_node_ref.tagger = patch.data; - } - else - { - domNode.elm_event_node_ref = { tagger: patch.data, parent: patch.eventNode }; - } - return domNode; - - case 'p-remove-last': - var i = patch.data; - while (i--) - { - domNode.removeChild(domNode.lastChild); - } - return domNode; - - case 'p-append': - var newNodes = patch.data; - for (var i = 0; i < newNodes.length; i++) - { - domNode.appendChild(render(newNodes[i], patch.eventNode)); - } - return domNode; - - case 'p-remove': - var data = patch.data; - if (typeof data === 'undefined') - { - domNode.parentNode.removeChild(domNode); - return domNode; - } - var entry = data.entry; - if (typeof entry.index !== 'undefined') - { - domNode.parentNode.removeChild(domNode); - } - entry.data = applyPatchesHelp(domNode, data.patches); - return domNode; - - case 'p-reorder': - return applyPatchReorder(domNode, patch); - - case 'p-custom': - var impl = patch.data; - return impl.applyPatch(domNode, impl.data); - - default: - throw new Error('Ran into an unknown patch!'); - } -} - - -function applyPatchRedraw(domNode, vNode, eventNode) -{ - var parentNode = domNode.parentNode; - var newNode = render(vNode, eventNode); - - if (typeof newNode.elm_event_node_ref === 'undefined') - { - newNode.elm_event_node_ref = domNode.elm_event_node_ref; - } - - if (parentNode && newNode !== domNode) - { - parentNode.replaceChild(newNode, domNode); - } - return newNode; -} - - -function applyPatchReorder(domNode, patch) -{ - var data = patch.data; - - // remove end inserts - var frag = applyPatchReorderEndInsertsHelp(data.endInserts, patch); - - // removals - domNode = applyPatchesHelp(domNode, data.patches); - - // inserts - var inserts = data.inserts; - for (var i = 0; i < inserts.length; i++) - { - var insert = inserts[i]; - var entry = insert.entry; - var node = entry.tag === 'move' - ? entry.data - : render(entry.vnode, patch.eventNode); - domNode.insertBefore(node, domNode.childNodes[insert.index]); - } - - // add end inserts - if (typeof frag !== 'undefined') - { - domNode.appendChild(frag); - } - - return domNode; -} - - -function applyPatchReorderEndInsertsHelp(endInserts, patch) -{ - if (typeof endInserts === 'undefined') - { - return; - } - - var frag = localDoc.createDocumentFragment(); - for (var i = 0; i < endInserts.length; i++) - { - var insert = endInserts[i]; - var entry = insert.entry; - frag.appendChild(entry.tag === 'move' - ? entry.data - : render(entry.vnode, patch.eventNode) - ); - } - return frag; -} - - -// PROGRAMS - -var program = makeProgram(checkNoFlags); -var programWithFlags = makeProgram(checkYesFlags); - -function makeProgram(flagChecker) -{ - return F2(function(debugWrap, impl) - { - return function(flagDecoder) - { - return function(object, moduleName, debugMetadata) - { - var checker = flagChecker(flagDecoder, moduleName); - if (typeof debugMetadata === 'undefined') - { - normalSetup(impl, object, moduleName, checker); - } - else - { - debugSetup(A2(debugWrap, debugMetadata, impl), object, moduleName, checker); - } - }; - }; - }); -} - -function staticProgram(vNode) -{ - var nothing = _elm_lang$core$Native_Utils.Tuple2( - _elm_lang$core$Native_Utils.Tuple0, - _elm_lang$core$Platform_Cmd$none - ); - return A2(program, _elm_lang$virtual_dom$VirtualDom_Debug$wrap, { - init: nothing, - view: function() { return vNode; }, - update: F2(function() { return nothing; }), - subscriptions: function() { return _elm_lang$core$Platform_Sub$none; } - })(); -} - - -// FLAG CHECKERS - -function checkNoFlags(flagDecoder, moduleName) -{ - return function(init, flags, domNode) - { - if (typeof flags === 'undefined') - { - return init; - } - - var errorMessage = - 'The `' + moduleName + '` module does not need flags.\n' - + 'Initialize it with no arguments and you should be all set!'; - - crash(errorMessage, domNode); - }; -} - -function checkYesFlags(flagDecoder, moduleName) -{ - return function(init, flags, domNode) - { - if (typeof flagDecoder === 'undefined') - { - var errorMessage = - 'Are you trying to sneak a Never value into Elm? Trickster!\n' - + 'It looks like ' + moduleName + '.main is defined with `programWithFlags` but has type `Program Never`.\n' - + 'Use `program` instead if you do not want flags.' - - crash(errorMessage, domNode); - } - - var result = A2(_elm_lang$core$Native_Json.run, flagDecoder, flags); - if (result.ctor === 'Ok') - { - return init(result._0); - } - - var errorMessage = - 'Trying to initialize the `' + moduleName + '` module with an unexpected flag.\n' - + 'I tried to convert it to an Elm value, but ran into this problem:\n\n' - + result._0; - - crash(errorMessage, domNode); - }; -} - -function crash(errorMessage, domNode) -{ - if (domNode) - { - domNode.innerHTML = - '
' - + '

Oops! Something went wrong when starting your Elm program.

' - + '
' + errorMessage + '
' - + '
'; - } - - throw new Error(errorMessage); -} - - -// NORMAL SETUP - -function normalSetup(impl, object, moduleName, flagChecker) -{ - object['embed'] = function embed(node, flags) - { - while (node.lastChild) - { - node.removeChild(node.lastChild); - } - - return _elm_lang$core$Native_Platform.initialize( - flagChecker(impl.init, flags, node), - impl.update, - impl.subscriptions, - normalRenderer(node, impl.view) - ); - }; - - object['fullscreen'] = function fullscreen(flags) - { - return _elm_lang$core$Native_Platform.initialize( - flagChecker(impl.init, flags, document.body), - impl.update, - impl.subscriptions, - normalRenderer(document.body, impl.view) - ); - }; -} - -function normalRenderer(parentNode, view) -{ - return function(tagger, initialModel) - { - var eventNode = { tagger: tagger, parent: undefined }; - var initialVirtualNode = view(initialModel); - var domNode = render(initialVirtualNode, eventNode); - parentNode.appendChild(domNode); - return makeStepper(domNode, view, initialVirtualNode, eventNode); - }; -} - - -// STEPPER - -var rAF = - typeof requestAnimationFrame !== 'undefined' - ? requestAnimationFrame - : function(callback) { setTimeout(callback, 1000 / 60); }; - -function makeStepper(domNode, view, initialVirtualNode, eventNode) -{ - var state = 'NO_REQUEST'; - var currNode = initialVirtualNode; - var nextModel; - - function updateIfNeeded() - { - switch (state) - { - case 'NO_REQUEST': - throw new Error( - 'Unexpected draw callback.\n' + - 'Please report this to .' - ); - - case 'PENDING_REQUEST': - rAF(updateIfNeeded); - state = 'EXTRA_REQUEST'; - - var nextNode = view(nextModel); - var patches = diff(currNode, nextNode); - domNode = applyPatches(domNode, currNode, patches, eventNode); - currNode = nextNode; - - return; - - case 'EXTRA_REQUEST': - state = 'NO_REQUEST'; - return; - } - } - - return function stepper(model) - { - if (state === 'NO_REQUEST') - { - rAF(updateIfNeeded); - } - state = 'PENDING_REQUEST'; - nextModel = model; - }; -} - - -// DEBUG SETUP - -function debugSetup(impl, object, moduleName, flagChecker) -{ - object['fullscreen'] = function fullscreen(flags) - { - var popoutRef = { doc: undefined }; - return _elm_lang$core$Native_Platform.initialize( - flagChecker(impl.init, flags, document.body), - impl.update(scrollTask(popoutRef)), - impl.subscriptions, - debugRenderer(moduleName, document.body, popoutRef, impl.view, impl.viewIn, impl.viewOut) - ); - }; - - object['embed'] = function fullscreen(node, flags) - { - var popoutRef = { doc: undefined }; - return _elm_lang$core$Native_Platform.initialize( - flagChecker(impl.init, flags, node), - impl.update(scrollTask(popoutRef)), - impl.subscriptions, - debugRenderer(moduleName, node, popoutRef, impl.view, impl.viewIn, impl.viewOut) - ); - }; -} - -function scrollTask(popoutRef) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) - { - var doc = popoutRef.doc; - if (doc) - { - var msgs = doc.getElementsByClassName('debugger-sidebar-messages')[0]; - if (msgs) - { - msgs.scrollTop = msgs.scrollHeight; - } - } - callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0)); - }); -} - - -function debugRenderer(moduleName, parentNode, popoutRef, view, viewIn, viewOut) -{ - return function(tagger, initialModel) - { - var appEventNode = { tagger: tagger, parent: undefined }; - var eventNode = { tagger: tagger, parent: undefined }; - - // make normal stepper - var appVirtualNode = view(initialModel); - var appNode = render(appVirtualNode, appEventNode); - parentNode.appendChild(appNode); - var appStepper = makeStepper(appNode, view, appVirtualNode, appEventNode); - - // make overlay stepper - var overVirtualNode = viewIn(initialModel)._1; - var overNode = render(overVirtualNode, eventNode); - parentNode.appendChild(overNode); - var wrappedViewIn = wrapViewIn(appEventNode, overNode, viewIn); - var overStepper = makeStepper(overNode, wrappedViewIn, overVirtualNode, eventNode); - - // make debugger stepper - var debugStepper = makeDebugStepper(initialModel, viewOut, eventNode, parentNode, moduleName, popoutRef); - - return function stepper(model) - { - appStepper(model); - overStepper(model); - debugStepper(model); - } - }; -} - -function makeDebugStepper(initialModel, view, eventNode, parentNode, moduleName, popoutRef) -{ - var curr; - var domNode; - - return function stepper(model) - { - if (!model.isDebuggerOpen) - { - return; - } - - if (!popoutRef.doc) - { - curr = view(model); - domNode = openDebugWindow(moduleName, popoutRef, curr, eventNode); - return; - } - - // switch to document of popout - localDoc = popoutRef.doc; - - var next = view(model); - var patches = diff(curr, next); - domNode = applyPatches(domNode, curr, patches, eventNode); - curr = next; - - // switch back to normal document - localDoc = document; - }; -} - -function openDebugWindow(moduleName, popoutRef, virtualNode, eventNode) -{ - var w = 900; - var h = 360; - var x = screen.width - w; - var y = screen.height - h; - var debugWindow = window.open('', '', 'width=' + w + ',height=' + h + ',left=' + x + ',top=' + y); - - // switch to window document - localDoc = debugWindow.document; - - popoutRef.doc = localDoc; - localDoc.title = 'Debugger - ' + moduleName; - localDoc.body.style.margin = '0'; - localDoc.body.style.padding = '0'; - var domNode = render(virtualNode, eventNode); - localDoc.body.appendChild(domNode); - - localDoc.addEventListener('keydown', function(event) { - if (event.metaKey && event.which === 82) - { - window.location.reload(); - } - if (event.which === 38) - { - eventNode.tagger({ ctor: 'Up' }); - event.preventDefault(); - } - if (event.which === 40) - { - eventNode.tagger({ ctor: 'Down' }); - event.preventDefault(); - } - }); - - function close() - { - popoutRef.doc = undefined; - debugWindow.close(); - } - window.addEventListener('unload', close); - debugWindow.addEventListener('unload', function() { - popoutRef.doc = undefined; - window.removeEventListener('unload', close); - eventNode.tagger({ ctor: 'Close' }); - }); - - // switch back to the normal document - localDoc = document; - - return domNode; -} - - -// BLOCK EVENTS - -function wrapViewIn(appEventNode, overlayNode, viewIn) -{ - var ignorer = makeIgnorer(overlayNode); - var blocking = 'Normal'; - var overflow; - - var normalTagger = appEventNode.tagger; - var blockTagger = function() {}; - - return function(model) - { - var tuple = viewIn(model); - var newBlocking = tuple._0.ctor; - appEventNode.tagger = newBlocking === 'Normal' ? normalTagger : blockTagger; - if (blocking !== newBlocking) - { - traverse('removeEventListener', ignorer, blocking); - traverse('addEventListener', ignorer, newBlocking); - - if (blocking === 'Normal') - { - overflow = document.body.style.overflow; - document.body.style.overflow = 'hidden'; - } - - if (newBlocking === 'Normal') - { - document.body.style.overflow = overflow; - } - - blocking = newBlocking; - } - return tuple._1; - } -} - -function traverse(verbEventListener, ignorer, blocking) -{ - switch(blocking) - { - case 'Normal': - return; - - case 'Pause': - return traverseHelp(verbEventListener, ignorer, mostEvents); - - case 'Message': - return traverseHelp(verbEventListener, ignorer, allEvents); - } -} - -function traverseHelp(verbEventListener, handler, eventNames) -{ - for (var i = 0; i < eventNames.length; i++) - { - document.body[verbEventListener](eventNames[i], handler, true); - } -} - -function makeIgnorer(overlayNode) -{ - return function(event) - { - if (event.type === 'keydown' && event.metaKey && event.which === 82) - { - return; - } - - var isScroll = event.type === 'scroll' || event.type === 'wheel'; - - var node = event.target; - while (node !== null) - { - if (node.className === 'elm-overlay-message-details' && isScroll) - { - return; - } - - if (node === overlayNode && !isScroll) - { - return; - } - node = node.parentNode; - } - - event.stopPropagation(); - event.preventDefault(); - } -} - -var mostEvents = [ - 'click', 'dblclick', 'mousemove', - 'mouseup', 'mousedown', 'mouseenter', 'mouseleave', - 'touchstart', 'touchend', 'touchcancel', 'touchmove', - 'pointerdown', 'pointerup', 'pointerover', 'pointerout', - 'pointerenter', 'pointerleave', 'pointermove', 'pointercancel', - 'dragstart', 'drag', 'dragend', 'dragenter', 'dragover', 'dragleave', 'drop', - 'keyup', 'keydown', 'keypress', - 'input', 'change', - 'focus', 'blur' -]; - -var allEvents = mostEvents.concat('wheel', 'scroll'); - - -return { - node: node, - text: text, - custom: custom, - map: F2(map), - - on: F3(on), - style: style, - property: F2(property), - attribute: F2(attribute), - attributeNS: F3(attributeNS), - mapProperty: F2(mapProperty), - - lazy: F2(lazy), - lazy2: F3(lazy2), - lazy3: F4(lazy3), - keyedNode: F3(keyedNode), - - program: program, - programWithFlags: programWithFlags, - staticProgram: staticProgram -}; - -}(); - -var _elm_lang$virtual_dom$Native_Debug = function() { - - -// IMPORT / EXPORT - -function unsafeCoerce(value) -{ - return value; -} - -var upload = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) -{ - var element = document.createElement('input'); - element.setAttribute('type', 'file'); - element.setAttribute('accept', 'text/json'); - element.style.display = 'none'; - element.addEventListener('change', function(event) - { - var fileReader = new FileReader(); - fileReader.onload = function(e) - { - callback(_elm_lang$core$Native_Scheduler.succeed(e.target.result)); - }; - fileReader.readAsText(event.target.files[0]); - document.body.removeChild(element); - }); - document.body.appendChild(element); - element.click(); -}); - -function download(historyLength, json) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) - { - var fileName = 'history-' + historyLength + '.txt'; - var jsonString = JSON.stringify(json); - var mime = 'text/plain;charset=utf-8'; - var done = _elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0); - - // for IE10+ - if (navigator.msSaveBlob) - { - navigator.msSaveBlob(new Blob([jsonString], {type: mime}), fileName); - return callback(done); - } - - // for HTML5 - var element = document.createElement('a'); - element.setAttribute('href', 'data:' + mime + ',' + encodeURIComponent(jsonString)); - element.setAttribute('download', fileName); - element.style.display = 'none'; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); - callback(done); - }); -} - - -// POPOUT - -function messageToString(value) -{ - switch (typeof value) - { - case 'boolean': - return value ? 'True' : 'False'; - case 'number': - return value + ''; - case 'string': - return '"' + addSlashes(value, false) + '"'; - } - if (value instanceof String) - { - return '\'' + addSlashes(value, true) + '\''; - } - if (typeof value !== 'object' || value === null || !('ctor' in value)) - { - return '…'; - } - - var ctorStarter = value.ctor.substring(0, 5); - if (ctorStarter === '_Tupl' || ctorStarter === '_Task') - { - return '…' - } - if (['_Array', '', '_Process', '::', '[]', 'Set_elm_builtin', 'RBNode_elm_builtin', 'RBEmpty_elm_builtin'].indexOf(value.ctor) >= 0) - { - return '…'; - } - - var keys = Object.keys(value); - switch (keys.length) - { - case 1: - return value.ctor; - case 2: - return value.ctor + ' ' + messageToString(value._0); - default: - return value.ctor + ' … ' + messageToString(value[keys[keys.length - 1]]); - } -} - - -function primitive(str) -{ - return { ctor: 'Primitive', _0: str }; -} - - -function init(value) -{ - var type = typeof value; - - if (type === 'boolean') - { - return { - ctor: 'Constructor', - _0: _elm_lang$core$Maybe$Just(value ? 'True' : 'False'), - _1: true, - _2: _elm_lang$core$Native_List.Nil - }; - } - - if (type === 'number') - { - return primitive(value + ''); - } - - if (type === 'string') - { - return { ctor: 'S', _0: '"' + addSlashes(value, false) + '"' }; - } - - if (value instanceof String) - { - return { ctor: 'S', _0: "'" + addSlashes(value, true) + "'" }; - } - - if (value instanceof Date) - { - return primitive('<' + value.toString() + '>'); - } - - if (value === null) - { - return primitive('XXX'); - } - - if (type === 'object' && 'ctor' in value) - { - var ctor = value.ctor; - - if (ctor === '::' || ctor === '[]') - { - return { - ctor: 'Sequence', - _0: {ctor: 'ListSeq'}, - _1: true, - _2: A2(_elm_lang$core$List$map, init, value) - }; - } - - if (ctor === 'Set_elm_builtin') - { - return { - ctor: 'Sequence', - _0: {ctor: 'SetSeq'}, - _1: true, - _2: A3(_elm_lang$core$Set$foldr, initCons, _elm_lang$core$Native_List.Nil, value) - }; - } - - if (ctor === 'RBNode_elm_builtin' || ctor == 'RBEmpty_elm_builtin') - { - return { - ctor: 'Dictionary', - _0: true, - _1: A3(_elm_lang$core$Dict$foldr, initKeyValueCons, _elm_lang$core$Native_List.Nil, value) - }; - } - - if (ctor === '_Array') - { - return { - ctor: 'Sequence', - _0: {ctor: 'ArraySeq'}, - _1: true, - _2: A3(_elm_lang$core$Array$foldr, initCons, _elm_lang$core$Native_List.Nil, value) - }; - } - - var ctorStarter = value.ctor.substring(0, 5); - if (ctorStarter === '_Task') - { - return primitive(''); - } - - if (ctor === '') - { - return primitive(ctor); - } - - if (ctor === '_Process') - { - return primitive(''); - } - - var list = _elm_lang$core$Native_List.Nil; - for (var i in value) - { - if (i === 'ctor') continue; - list = _elm_lang$core$Native_List.Cons(init(value[i]), list); - } - return { - ctor: 'Constructor', - _0: ctorStarter === '_Tupl' ? _elm_lang$core$Maybe$Nothing : _elm_lang$core$Maybe$Just(ctor), - _1: true, - _2: _elm_lang$core$List$reverse(list) - }; - } - - if (type === 'object') - { - var dict = _elm_lang$core$Dict$empty; - for (var i in value) - { - dict = A3(_elm_lang$core$Dict$insert, i, init(value[i]), dict); - } - return { ctor: 'Record', _0: true, _1: dict }; - } - - return primitive('XXX'); -} - -var initCons = F2(initConsHelp); - -function initConsHelp(value, list) -{ - return _elm_lang$core$Native_List.Cons(init(value), list); -} - -var initKeyValueCons = F3(initKeyValueConsHelp); - -function initKeyValueConsHelp(key, value, list) -{ - return _elm_lang$core$Native_List.Cons( - _elm_lang$core$Native_Utils.Tuple2(init(key), init(value)), - list - ); -} - -function addSlashes(str, isChar) -{ - var s = str.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\n') - .replace(/\t/g, '\\t') - .replace(/\r/g, '\\r') - .replace(/\v/g, '\\v') - .replace(/\0/g, '\\0'); - if (isChar) - { - return s.replace(/\'/g, '\\\''); - } - else - { - return s.replace(/\"/g, '\\"'); - } -} - - -return { - upload: upload, - download: F2(download), - unsafeCoerce: unsafeCoerce, - messageToString: messageToString, - init: init -} - -}(); - -var _elm_lang$virtual_dom$VirtualDom_Helpers$keyedNode = _elm_lang$virtual_dom$Native_VirtualDom.keyedNode; -var _elm_lang$virtual_dom$VirtualDom_Helpers$lazy3 = _elm_lang$virtual_dom$Native_VirtualDom.lazy3; -var _elm_lang$virtual_dom$VirtualDom_Helpers$lazy2 = _elm_lang$virtual_dom$Native_VirtualDom.lazy2; -var _elm_lang$virtual_dom$VirtualDom_Helpers$lazy = _elm_lang$virtual_dom$Native_VirtualDom.lazy; -var _elm_lang$virtual_dom$VirtualDom_Helpers$defaultOptions = {stopPropagation: false, preventDefault: false}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$onWithOptions = _elm_lang$virtual_dom$Native_VirtualDom.on; -var _elm_lang$virtual_dom$VirtualDom_Helpers$on = F2( - function (eventName, decoder) { - return A3(_elm_lang$virtual_dom$VirtualDom_Helpers$onWithOptions, eventName, _elm_lang$virtual_dom$VirtualDom_Helpers$defaultOptions, decoder); - }); -var _elm_lang$virtual_dom$VirtualDom_Helpers$onClick = function (msg) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$on, - 'click', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$style = _elm_lang$virtual_dom$Native_VirtualDom.style; -var _elm_lang$virtual_dom$VirtualDom_Helpers$attribute = _elm_lang$virtual_dom$Native_VirtualDom.attribute; -var _elm_lang$virtual_dom$VirtualDom_Helpers$id = _elm_lang$virtual_dom$VirtualDom_Helpers$attribute('id'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$property = _elm_lang$virtual_dom$Native_VirtualDom.property; -var _elm_lang$virtual_dom$VirtualDom_Helpers$class = function (name) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$property, - 'className', - _elm_lang$core$Json_Encode$string(name)); -}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$href = function (name) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$property, - 'href', - _elm_lang$core$Json_Encode$string(name)); -}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$map = _elm_lang$virtual_dom$Native_VirtualDom.map; -var _elm_lang$virtual_dom$VirtualDom_Helpers$text = _elm_lang$virtual_dom$Native_VirtualDom.text; -var _elm_lang$virtual_dom$VirtualDom_Helpers$node = _elm_lang$virtual_dom$Native_VirtualDom.node; -var _elm_lang$virtual_dom$VirtualDom_Helpers$div = _elm_lang$virtual_dom$VirtualDom_Helpers$node('div'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$span = _elm_lang$virtual_dom$VirtualDom_Helpers$node('span'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$a = _elm_lang$virtual_dom$VirtualDom_Helpers$node('a'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$h1 = _elm_lang$virtual_dom$VirtualDom_Helpers$node('h1'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$Options = F2( - function (a, b) { - return {stopPropagation: a, preventDefault: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Helpers$Node = {ctor: 'Node'}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$Property = {ctor: 'Property'}; - -var _elm_lang$virtual_dom$VirtualDom_Expando$purple = _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'color', _1: 'rgb(136, 19, 145)'}, - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$blue = _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'color', _1: 'rgb(28, 0, 207)'}, - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$red = _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'color', _1: 'rgb(196, 26, 22)'}, - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$leftPad = function (maybeKey) { - var _p0 = maybeKey; - if (_p0.ctor === 'Nothing') { - return _elm_lang$virtual_dom$VirtualDom_Helpers$style( - {ctor: '[]'}); - } else { - return _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'padding-left', _1: '4ch'}, - _1: {ctor: '[]'} - }); - } -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow = function (arrow) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'color', _1: '#777'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'padding-left', _1: '2ch'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'width', _1: '2ch'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'display', _1: 'inline-block'}, - _1: {ctor: '[]'} - } - } - } - }), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(arrow), - _1: {ctor: '[]'} - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter = F3( - function (maybeKey, maybeIsClosed, description) { - var arrow = function () { - var _p1 = maybeIsClosed; - if (_p1.ctor === 'Nothing') { - return _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow(''); - } else { - if (_p1._0 === true) { - return _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow('▸'); - } else { - return _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow('▾'); - } - } - }(); - var _p2 = maybeKey; - if (_p2.ctor === 'Nothing') { - return {ctor: '::', _0: arrow, _1: description}; - } else { - return { - ctor: '::', - _0: arrow, - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$purple, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p2._0), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' = '), - _1: description - } - } - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTinyRecord = F3( - function (length, starter, entries) { - var _p3 = entries; - if (_p3.ctor === '[]') { - return { - ctor: '_Tuple2', - _0: length + 1, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('}'), - _1: {ctor: '[]'} - } - }; - } else { - var _p5 = _p3._0; - var nextLength = (length + _elm_lang$core$String$length(_p5)) + 1; - if (_elm_lang$core$Native_Utils.cmp(nextLength, 18) > 0) { - return { - ctor: '_Tuple2', - _0: length + 2, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('…}'), - _1: {ctor: '[]'} - } - }; - } else { - var _p4 = A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTinyRecord, nextLength, ',', _p3._1); - var finalLength = _p4._0; - var otherNodes = _p4._1; - return { - ctor: '_Tuple2', - _0: finalLength, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$purple, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p5), - _1: {ctor: '[]'} - }), - _1: otherNodes - } - } - }; - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$elideMiddle = function (str) { - return (_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$String$length(str), - 18) < 1) ? str : A2( - _elm_lang$core$Basics_ops['++'], - A2(_elm_lang$core$String$left, 8, str), - A2( - _elm_lang$core$Basics_ops['++'], - '...', - A2(_elm_lang$core$String$right, 8, str))); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp = function (str) { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$String$length(str), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(str), - _1: {ctor: '[]'} - } - }; -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex = F3( - function (n, func, list) { - var _p6 = list; - if (_p6.ctor === '[]') { - return {ctor: '[]'}; - } else { - var _p8 = _p6._1; - var _p7 = _p6._0; - return (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) ? { - ctor: '::', - _0: func(_p7), - _1: _p8 - } : { - ctor: '::', - _0: _p7, - _1: A3(_elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, n - 1, func, _p8) - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$seqTypeToString = F2( - function (n, seqType) { - var _p9 = seqType; - switch (_p9.ctor) { - case 'ListSeq': - return A2( - _elm_lang$core$Basics_ops['++'], - 'List(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(n), - ')')); - case 'SetSeq': - return A2( - _elm_lang$core$Basics_ops['++'], - 'Set(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(n), - ')')); - default: - return A2( - _elm_lang$core$Basics_ops['++'], - 'Array(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(n), - ')')); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewTiny = function (value) { - var _p10 = value; - switch (_p10.ctor) { - case 'S': - var str = _elm_lang$virtual_dom$VirtualDom_Expando$elideMiddle(_p10._0); - return { - ctor: '_Tuple2', - _0: _elm_lang$core$String$length(str), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$red, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(str), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }; - case 'Primitive': - var _p11 = _p10._0; - return { - ctor: '_Tuple2', - _0: _elm_lang$core$String$length(_p11), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$blue, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p11), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }; - case 'Sequence': - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$seqTypeToString, - _elm_lang$core$List$length(_p10._2), - _p10._0)); - case 'Dictionary': - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( - A2( - _elm_lang$core$Basics_ops['++'], - 'Dict(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString( - _elm_lang$core$List$length(_p10._1)), - ')'))); - case 'Record': - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecord(_p10._1); - default: - if (_p10._2.ctor === '[]') { - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( - A2(_elm_lang$core$Maybe$withDefault, 'Unit', _p10._0)); - } else { - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( - function () { - var _p12 = _p10._0; - if (_p12.ctor === 'Nothing') { - return A2( - _elm_lang$core$Basics_ops['++'], - 'Tuple(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString( - _elm_lang$core$List$length(_p10._2)), - ')')); - } else { - return A2(_elm_lang$core$Basics_ops['++'], _p12._0, ' …'); - } - }()); - } - } -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecord = function (record) { - return _elm_lang$core$Dict$isEmpty(record) ? { - ctor: '_Tuple2', - _0: 2, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('{}'), - _1: {ctor: '[]'} - } - } : A3( - _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecordHelp, - 0, - '{ ', - _elm_lang$core$Dict$toList(record)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecordHelp = F3( - function (length, starter, entries) { - var _p13 = entries; - if (_p13.ctor === '[]') { - return { - ctor: '_Tuple2', - _0: length + 2, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' }'), - _1: {ctor: '[]'} - } - }; - } else { - var _p16 = _p13._0._0; - var _p14 = _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTiny(_p13._0._1); - var valueLen = _p14._0; - var valueNodes = _p14._1; - var fieldLen = _elm_lang$core$String$length(_p16); - var newLength = ((length + fieldLen) + valueLen) + 5; - if (_elm_lang$core$Native_Utils.cmp(newLength, 60) > 0) { - return { - ctor: '_Tuple2', - _0: length + 4, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', … }'), - _1: {ctor: '[]'} - } - }; - } else { - var _p15 = A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecordHelp, newLength, ', ', _p13._1); - var finalLength = _p15._0; - var otherNodes = _p15._1; - return { - ctor: '_Tuple2', - _0: finalLength, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$purple, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p16), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' = '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - valueNodes), - _1: otherNodes - } - } - } - } - }; - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTiny = function (value) { - var _p17 = value; - if (_p17.ctor === 'Record') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTinyRecord, - 0, - '{', - _elm_lang$core$Dict$keys(_p17._1)); - } else { - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTiny(value); - } -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$Constructor = F3( - function (a, b, c) { - return {ctor: 'Constructor', _0: a, _1: b, _2: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Record = F2( - function (a, b) { - return {ctor: 'Record', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary = F2( - function (a, b) { - return {ctor: 'Dictionary', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Sequence = F3( - function (a, b, c) { - return {ctor: 'Sequence', _0: a, _1: b, _2: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$initHelp = F2( - function (isOuter, expando) { - var _p18 = expando; - switch (_p18.ctor) { - case 'S': - return expando; - case 'Primitive': - return expando; - case 'Sequence': - var _p20 = _p18._0; - var _p19 = _p18._2; - return isOuter ? A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Sequence, - _p20, - false, - A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_Expando$initHelp(false), - _p19)) : ((_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$List$length(_p19), - 8) < 1) ? A3(_elm_lang$virtual_dom$VirtualDom_Expando$Sequence, _p20, false, _p19) : expando); - case 'Dictionary': - var _p23 = _p18._1; - return isOuter ? A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, - false, - A2( - _elm_lang$core$List$map, - function (_p21) { - var _p22 = _p21; - return { - ctor: '_Tuple2', - _0: _p22._0, - _1: A2(_elm_lang$virtual_dom$VirtualDom_Expando$initHelp, false, _p22._1) - }; - }, - _p23)) : ((_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$List$length(_p23), - 8) < 1) ? A2(_elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, false, _p23) : expando); - case 'Record': - var _p25 = _p18._1; - return isOuter ? A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Record, - false, - A2( - _elm_lang$core$Dict$map, - F2( - function (_p24, v) { - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$initHelp, false, v); - }), - _p25)) : ((_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$Dict$size(_p25), - 4) < 1) ? A2(_elm_lang$virtual_dom$VirtualDom_Expando$Record, false, _p25) : expando); - default: - var _p27 = _p18._0; - var _p26 = _p18._2; - return isOuter ? A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Constructor, - _p27, - false, - A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_Expando$initHelp(false), - _p26)) : ((_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$List$length(_p26), - 4) < 1) ? A3(_elm_lang$virtual_dom$VirtualDom_Expando$Constructor, _p27, false, _p26) : expando); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$init = function (value) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$initHelp, - true, - _elm_lang$virtual_dom$Native_Debug.init(value)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp = F2( - function (old, $new) { - var _p28 = {ctor: '_Tuple2', _0: old, _1: $new}; - _v12_6: - do { - if (_p28.ctor === '_Tuple2') { - switch (_p28._1.ctor) { - case 'S': - return $new; - case 'Primitive': - return $new; - case 'Sequence': - if (_p28._0.ctor === 'Sequence') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Sequence, - _p28._1._0, - _p28._0._1, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp, _p28._0._2, _p28._1._2)); - } else { - break _v12_6; - } - case 'Dictionary': - if (_p28._0.ctor === 'Dictionary') { - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, _p28._0._0, _p28._1._1); - } else { - break _v12_6; - } - case 'Record': - if (_p28._0.ctor === 'Record') { - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Record, - _p28._0._0, - A2( - _elm_lang$core$Dict$map, - _elm_lang$virtual_dom$VirtualDom_Expando$mergeDictHelp(_p28._0._1), - _p28._1._1)); - } else { - break _v12_6; - } - default: - if (_p28._0.ctor === 'Constructor') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Constructor, - _p28._1._0, - _p28._0._1, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp, _p28._0._2, _p28._1._2)); - } else { - break _v12_6; - } - } - } else { - break _v12_6; - } - } while(false); - return $new; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$mergeDictHelp = F3( - function (oldDict, key, value) { - var _p29 = A2(_elm_lang$core$Dict$get, key, oldDict); - if (_p29.ctor === 'Nothing') { - return value; - } else { - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp, _p29._0, value); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp = F2( - function (olds, news) { - var _p30 = {ctor: '_Tuple2', _0: olds, _1: news}; - if (_p30._0.ctor === '[]') { - return news; - } else { - if (_p30._1.ctor === '[]') { - return news; - } else { - return { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp, _p30._0._0, _p30._1._0), - _1: A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp, _p30._0._1, _p30._1._1) - }; - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$merge = F2( - function (value, expando) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp, - expando, - _elm_lang$virtual_dom$Native_Debug.init(value)); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$update = F2( - function (msg, value) { - var _p31 = value; - switch (_p31.ctor) { - case 'S': - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 168, column: 3}, - end: {line: 235, column: 50} - }, - _p31)('No messages for primitives'); - case 'Primitive': - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 168, column: 3}, - end: {line: 235, column: 50} - }, - _p31)('No messages for primitives'); - case 'Sequence': - var _p39 = _p31._2; - var _p38 = _p31._0; - var _p37 = _p31._1; - var _p34 = msg; - switch (_p34.ctor) { - case 'Toggle': - return A3(_elm_lang$virtual_dom$VirtualDom_Expando$Sequence, _p38, !_p37, _p39); - case 'Index': - if (_p34._0.ctor === 'None') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Sequence, - _p38, - _p37, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, - _p34._1, - _elm_lang$virtual_dom$VirtualDom_Expando$update(_p34._2), - _p39)); - } else { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 176, column: 7}, - end: {line: 188, column: 46} - }, - _p34)('No redirected indexes on sequences'); - } - default: - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 176, column: 7}, - end: {line: 188, column: 46} - }, - _p34)('No field on sequences'); - } - case 'Dictionary': - var _p51 = _p31._1; - var _p50 = _p31._0; - var _p40 = msg; - switch (_p40.ctor) { - case 'Toggle': - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, !_p50, _p51); - case 'Index': - var _p48 = _p40._2; - var _p47 = _p40._1; - var _p41 = _p40._0; - switch (_p41.ctor) { - case 'None': - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 196, column: 11}, - end: {line: 206, column: 81} - }, - _p41)('must have redirect for dictionaries'); - case 'Key': - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, - _p50, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, - _p47, - function (_p43) { - var _p44 = _p43; - return { - ctor: '_Tuple2', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, _p48, _p44._0), - _1: _p44._1 - }; - }, - _p51)); - default: - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, - _p50, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, - _p47, - function (_p45) { - var _p46 = _p45; - return { - ctor: '_Tuple2', - _0: _p46._0, - _1: A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, _p48, _p46._1) - }; - }, - _p51)); - } - default: - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 191, column: 7}, - end: {line: 209, column: 50} - }, - _p40)('no field for dictionaries'); - } - case 'Record': - var _p55 = _p31._1; - var _p54 = _p31._0; - var _p52 = msg; - switch (_p52.ctor) { - case 'Toggle': - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$Record, !_p54, _p55); - case 'Index': - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 212, column: 7}, - end: {line: 220, column: 77} - }, - _p52)('No index for records'); - default: - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Record, - _p54, - A3( - _elm_lang$core$Dict$update, - _p52._0, - _elm_lang$virtual_dom$VirtualDom_Expando$updateField(_p52._1), - _p55)); - } - default: - var _p61 = _p31._2; - var _p60 = _p31._0; - var _p59 = _p31._1; - var _p56 = msg; - switch (_p56.ctor) { - case 'Toggle': - return A3(_elm_lang$virtual_dom$VirtualDom_Expando$Constructor, _p60, !_p59, _p61); - case 'Index': - if (_p56._0.ctor === 'None') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Constructor, - _p60, - _p59, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, - _p56._1, - _elm_lang$virtual_dom$VirtualDom_Expando$update(_p56._2), - _p61)); - } else { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 223, column: 7}, - end: {line: 235, column: 50} - }, - _p56)('No redirected indexes on sequences'); - } - default: - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 223, column: 7}, - end: {line: 235, column: 50} - }, - _p56)('No field for constructors'); - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$updateField = F2( - function (msg, maybeExpando) { - var _p62 = maybeExpando; - if (_p62.ctor === 'Nothing') { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 253, column: 3}, - end: {line: 258, column: 32} - }, - _p62)('key does not exist'); - } else { - return _elm_lang$core$Maybe$Just( - A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, msg, _p62._0)); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Primitive = function (a) { - return {ctor: 'Primitive', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$S = function (a) { - return {ctor: 'S', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$ArraySeq = {ctor: 'ArraySeq'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$SetSeq = {ctor: 'SetSeq'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$ListSeq = {ctor: 'ListSeq'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$Field = F2( - function (a, b) { - return {ctor: 'Field', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Index = F3( - function (a, b, c) { - return {ctor: 'Index', _0: a, _1: b, _2: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Toggle = {ctor: 'Toggle'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$Value = {ctor: 'Value'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$Key = {ctor: 'Key'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$None = {ctor: 'None'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorEntry = F2( - function (index, value) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just( - _elm_lang$core$Basics$toString(index)), - value)); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$view = F2( - function (maybeKey, expando) { - var _p64 = expando; - switch (_p64.ctor) { - case 'S': - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Nothing, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$red, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p64._0), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - })); - case 'Primitive': - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Nothing, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$blue, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p64._0), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - })); - case 'Sequence': - return A4(_elm_lang$virtual_dom$VirtualDom_Expando$viewSequence, maybeKey, _p64._0, _p64._1, _p64._2); - case 'Dictionary': - return A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewDictionary, maybeKey, _p64._0, _p64._1); - case 'Record': - return A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewRecord, maybeKey, _p64._0, _p64._1); - default: - return A4(_elm_lang$virtual_dom$VirtualDom_Expando$viewConstructor, maybeKey, _p64._0, _p64._1, _p64._2); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructor = F4( - function (maybeKey, maybeName, isClosed, valueList) { - var _p65 = function () { - var _p66 = valueList; - if (_p66.ctor === '[]') { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Nothing, - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) - }; - } else { - if (_p66._1.ctor === '[]') { - var _p67 = _p66._0; - switch (_p67.ctor) { - case 'S': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Nothing, - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) - }; - case 'Primitive': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Nothing, - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) - }; - case 'Sequence': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), - _elm_lang$virtual_dom$VirtualDom_Expando$viewSequenceOpen(_p67._2)) - }; - case 'Dictionary': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), - _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryOpen(_p67._1)) - }; - case 'Record': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), - _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordOpen(_p67._1)) - }; - default: - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), - _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorOpen(_p67._2)) - }; - } - } else { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorOpen(valueList) - }; - } - } - }(); - var maybeIsClosed = _p65._0; - var openHtml = _p65._1; - var tinyArgs = A2( - _elm_lang$core$List$map, - function (_p68) { - return _elm_lang$core$Tuple$second( - _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTiny(_p68)); - }, - valueList); - var description = function () { - var _p69 = {ctor: '_Tuple2', _0: maybeName, _1: tinyArgs}; - if (_p69._0.ctor === 'Nothing') { - if (_p69._1.ctor === '[]') { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('()'), - _1: {ctor: '[]'} - }; - } else { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('( '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - _p69._1._0), - _1: A3( - _elm_lang$core$List$foldr, - F2( - function (args, rest) { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - args), - _1: rest - } - }; - }), - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' )'), - _1: {ctor: '[]'} - }, - _p69._1._1) - } - }; - } - } else { - if (_p69._1.ctor === '[]') { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p69._0._0), - _1: {ctor: '[]'} - }; - } else { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2(_elm_lang$core$Basics_ops['++'], _p69._0._0, ' ')), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - _p69._1._0), - _1: A3( - _elm_lang$core$List$foldr, - F2( - function (args, rest) { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - args), - _1: rest - } - }; - }), - {ctor: '[]'}, - _p69._1._1) - } - }; - } - } - }(); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), - _1: {ctor: '[]'} - }, - A3(_elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, maybeKey, maybeIsClosed, description)), - _1: { - ctor: '::', - _0: openHtml, - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorOpen = function (valueList) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - A2(_elm_lang$core$List$indexedMap, _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorEntry, valueList)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryOpen = function (keyValuePairs) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - A2(_elm_lang$core$List$indexedMap, _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryEntry, keyValuePairs)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryEntry = F2( - function (index, _p70) { - var _p71 = _p70; - var _p74 = _p71._1; - var _p73 = _p71._0; - var _p72 = _p73; - switch (_p72.ctor) { - case 'S': - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Value, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just(_p72._0), - _p74)); - case 'Primitive': - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Value, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just(_p72._0), - _p74)); - default: - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Key, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just('key'), - _p73)), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Value, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just('value'), - _p74)), - _1: {ctor: '[]'} - } - }); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordOpen = function (record) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordEntry, - _elm_lang$core$Dict$toList(record))); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordEntry = function (_p75) { - var _p76 = _p75; - var _p77 = _p76._0; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - _elm_lang$virtual_dom$VirtualDom_Expando$Field(_p77), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just(_p77), - _p76._1)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewSequenceOpen = function (values) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - A2(_elm_lang$core$List$indexedMap, _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorEntry, values)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionary = F3( - function (maybeKey, isClosed, keyValuePairs) { - var starter = A2( - _elm_lang$core$Basics_ops['++'], - 'Dict(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString( - _elm_lang$core$List$length(keyValuePairs)), - ')')); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Just(isClosed), - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), - _1: {ctor: '[]'} - })), - _1: { - ctor: '::', - _0: isClosed ? _elm_lang$virtual_dom$VirtualDom_Helpers$text('') : _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryOpen(keyValuePairs), - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewRecord = F3( - function (maybeKey, isClosed, record) { - var _p78 = isClosed ? { - ctor: '_Tuple3', - _0: _elm_lang$core$Tuple$second( - _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecord(record)), - _1: _elm_lang$virtual_dom$VirtualDom_Helpers$text(''), - _2: _elm_lang$virtual_dom$VirtualDom_Helpers$text('') - } : { - ctor: '_Tuple3', - _0: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('{'), - _1: {ctor: '[]'} - }, - _1: _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordOpen(record), - _2: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad( - _elm_lang$core$Maybe$Just( - {ctor: '_Tuple0'})), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('}'), - _1: {ctor: '[]'} - }) - }; - var start = _p78._0; - var middle = _p78._1; - var end = _p78._2; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Just(isClosed), - start)), - _1: { - ctor: '::', - _0: middle, - _1: { - ctor: '::', - _0: end, - _1: {ctor: '[]'} - } - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewSequence = F4( - function (maybeKey, seqType, isClosed, valueList) { - var starter = A2( - _elm_lang$virtual_dom$VirtualDom_Expando$seqTypeToString, - _elm_lang$core$List$length(valueList), - seqType); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Just(isClosed), - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), - _1: {ctor: '[]'} - })), - _1: { - ctor: '::', - _0: isClosed ? _elm_lang$virtual_dom$VirtualDom_Helpers$text('') : _elm_lang$virtual_dom$VirtualDom_Expando$viewSequenceOpen(valueList), - _1: {ctor: '[]'} - } - }); - }); - -var _elm_lang$virtual_dom$VirtualDom_Report$some = function (list) { - return !_elm_lang$core$List$isEmpty(list); -}; -var _elm_lang$virtual_dom$VirtualDom_Report$TagChanges = F4( - function (a, b, c, d) { - return {removed: a, changed: b, added: c, argsMatch: d}; - }); -var _elm_lang$virtual_dom$VirtualDom_Report$emptyTagChanges = function (argsMatch) { - return A4( - _elm_lang$virtual_dom$VirtualDom_Report$TagChanges, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}, - argsMatch); -}; -var _elm_lang$virtual_dom$VirtualDom_Report$hasTagChanges = function (tagChanges) { - return _elm_lang$core$Native_Utils.eq( - tagChanges, - A4( - _elm_lang$virtual_dom$VirtualDom_Report$TagChanges, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}, - true)); -}; -var _elm_lang$virtual_dom$VirtualDom_Report$SomethingChanged = function (a) { - return {ctor: 'SomethingChanged', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Report$MessageChanged = F2( - function (a, b) { - return {ctor: 'MessageChanged', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Report$VersionChanged = F2( - function (a, b) { - return {ctor: 'VersionChanged', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Report$CorruptHistory = {ctor: 'CorruptHistory'}; -var _elm_lang$virtual_dom$VirtualDom_Report$UnionChange = F2( - function (a, b) { - return {ctor: 'UnionChange', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Report$AliasChange = function (a) { - return {ctor: 'AliasChange', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Report$Fine = {ctor: 'Fine'}; -var _elm_lang$virtual_dom$VirtualDom_Report$Risky = {ctor: 'Risky'}; -var _elm_lang$virtual_dom$VirtualDom_Report$Impossible = {ctor: 'Impossible'}; -var _elm_lang$virtual_dom$VirtualDom_Report$worstCase = F2( - function (status, statusList) { - worstCase: - while (true) { - var _p0 = statusList; - if (_p0.ctor === '[]') { - return status; - } else { - switch (_p0._0.ctor) { - case 'Impossible': - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - case 'Risky': - var _v1 = _elm_lang$virtual_dom$VirtualDom_Report$Risky, - _v2 = _p0._1; - status = _v1; - statusList = _v2; - continue worstCase; - default: - var _v3 = status, - _v4 = _p0._1; - status = _v3; - statusList = _v4; - continue worstCase; - } - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Report$evaluateChange = function (change) { - var _p1 = change; - if (_p1.ctor === 'AliasChange') { - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - } else { - return ((!_p1._1.argsMatch) || (_elm_lang$virtual_dom$VirtualDom_Report$some(_p1._1.changed) || _elm_lang$virtual_dom$VirtualDom_Report$some(_p1._1.removed))) ? _elm_lang$virtual_dom$VirtualDom_Report$Impossible : (_elm_lang$virtual_dom$VirtualDom_Report$some(_p1._1.added) ? _elm_lang$virtual_dom$VirtualDom_Report$Risky : _elm_lang$virtual_dom$VirtualDom_Report$Fine); - } -}; -var _elm_lang$virtual_dom$VirtualDom_Report$evaluate = function (report) { - var _p2 = report; - switch (_p2.ctor) { - case 'CorruptHistory': - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - case 'VersionChanged': - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - case 'MessageChanged': - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - default: - return A2( - _elm_lang$virtual_dom$VirtualDom_Report$worstCase, - _elm_lang$virtual_dom$VirtualDom_Report$Fine, - A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Report$evaluateChange, _p2._0)); - } -}; - -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict = F2( - function (f, dict) { - return _elm_lang$core$Json_Encode$object( - _elm_lang$core$Dict$toList( - A2( - _elm_lang$core$Dict$map, - F2( - function (key, value) { - return f(value); - }), - dict))); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeUnion = function (_p0) { - var _p1 = _p0; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'args', - _1: _elm_lang$core$Json_Encode$list( - A2(_elm_lang$core$List$map, _elm_lang$core$Json_Encode$string, _p1.args)) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'tags', - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict, - function (_p2) { - return _elm_lang$core$Json_Encode$list( - A2(_elm_lang$core$List$map, _elm_lang$core$Json_Encode$string, _p2)); - }, - _p1.tags) - }, - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeAlias = function (_p3) { - var _p4 = _p3; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'args', - _1: _elm_lang$core$Json_Encode$list( - A2(_elm_lang$core$List$map, _elm_lang$core$Json_Encode$string, _p4.args)) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'type', - _1: _elm_lang$core$Json_Encode$string(_p4.tipe) - }, - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeTypes = function (_p5) { - var _p6 = _p5; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'message', - _1: _elm_lang$core$Json_Encode$string(_p6.message) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'aliases', - _1: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict, _elm_lang$virtual_dom$VirtualDom_Metadata$encodeAlias, _p6.aliases) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'unions', - _1: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict, _elm_lang$virtual_dom$VirtualDom_Metadata$encodeUnion, _p6.unions) - }, - _1: {ctor: '[]'} - } - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeVersions = function (_p7) { - var _p8 = _p7; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'elm', - _1: _elm_lang$core$Json_Encode$string(_p8.elm) - }, - _1: {ctor: '[]'} - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$encode = function (_p9) { - var _p10 = _p9; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'versions', - _1: _elm_lang$virtual_dom$VirtualDom_Metadata$encodeVersions(_p10.versions) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'types', - _1: _elm_lang$virtual_dom$VirtualDom_Metadata$encodeTypes(_p10.types) - }, - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$checkTag = F4( - function (tag, old, $new, changes) { - return _elm_lang$core$Native_Utils.eq(old, $new) ? changes : _elm_lang$core$Native_Utils.update( - changes, - { - changed: {ctor: '::', _0: tag, _1: changes.changed} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$addTag = F3( - function (tag, _p11, changes) { - return _elm_lang$core$Native_Utils.update( - changes, - { - added: {ctor: '::', _0: tag, _1: changes.added} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$removeTag = F3( - function (tag, _p12, changes) { - return _elm_lang$core$Native_Utils.update( - changes, - { - removed: {ctor: '::', _0: tag, _1: changes.removed} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$checkUnion = F4( - function (name, old, $new, changes) { - var tagChanges = A6( - _elm_lang$core$Dict$merge, - _elm_lang$virtual_dom$VirtualDom_Metadata$removeTag, - _elm_lang$virtual_dom$VirtualDom_Metadata$checkTag, - _elm_lang$virtual_dom$VirtualDom_Metadata$addTag, - old.tags, - $new.tags, - _elm_lang$virtual_dom$VirtualDom_Report$emptyTagChanges( - _elm_lang$core$Native_Utils.eq(old.args, $new.args))); - return _elm_lang$virtual_dom$VirtualDom_Report$hasTagChanges(tagChanges) ? changes : { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Report$UnionChange, name, tagChanges), - _1: changes - }; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$checkAlias = F4( - function (name, old, $new, changes) { - return (_elm_lang$core$Native_Utils.eq(old.tipe, $new.tipe) && _elm_lang$core$Native_Utils.eq(old.args, $new.args)) ? changes : { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Report$AliasChange(name), - _1: changes - }; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$ignore = F3( - function (key, value, report) { - return report; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$checkTypes = F2( - function (old, $new) { - return (!_elm_lang$core$Native_Utils.eq(old.message, $new.message)) ? A2(_elm_lang$virtual_dom$VirtualDom_Report$MessageChanged, old.message, $new.message) : _elm_lang$virtual_dom$VirtualDom_Report$SomethingChanged( - A6( - _elm_lang$core$Dict$merge, - _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, - _elm_lang$virtual_dom$VirtualDom_Metadata$checkUnion, - _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, - old.unions, - $new.unions, - A6( - _elm_lang$core$Dict$merge, - _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, - _elm_lang$virtual_dom$VirtualDom_Metadata$checkAlias, - _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, - old.aliases, - $new.aliases, - {ctor: '[]'}))); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$check = F2( - function (old, $new) { - return (!_elm_lang$core$Native_Utils.eq(old.versions.elm, $new.versions.elm)) ? A2(_elm_lang$virtual_dom$VirtualDom_Report$VersionChanged, old.versions.elm, $new.versions.elm) : A2(_elm_lang$virtual_dom$VirtualDom_Metadata$checkTypes, old.types, $new.types); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$hasProblem = F2( - function (tipe, _p13) { - var _p14 = _p13; - return A2(_elm_lang$core$String$contains, _p14._1, tipe) ? _elm_lang$core$Maybe$Just(_p14._0) : _elm_lang$core$Maybe$Nothing; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Metadata = F2( - function (a, b) { - return {versions: a, types: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Versions = function (a) { - return {elm: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeVersions = A2( - _elm_lang$core$Json_Decode$map, - _elm_lang$virtual_dom$VirtualDom_Metadata$Versions, - A2(_elm_lang$core$Json_Decode$field, 'elm', _elm_lang$core$Json_Decode$string)); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Types = F3( - function (a, b, c) { - return {message: a, aliases: b, unions: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Alias = F2( - function (a, b) { - return {args: a, tipe: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeAlias = A3( - _elm_lang$core$Json_Decode$map2, - _elm_lang$virtual_dom$VirtualDom_Metadata$Alias, - A2( - _elm_lang$core$Json_Decode$field, - 'args', - _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string)), - A2(_elm_lang$core$Json_Decode$field, 'type', _elm_lang$core$Json_Decode$string)); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Union = F2( - function (a, b) { - return {args: a, tags: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeUnion = A3( - _elm_lang$core$Json_Decode$map2, - _elm_lang$virtual_dom$VirtualDom_Metadata$Union, - A2( - _elm_lang$core$Json_Decode$field, - 'args', - _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string)), - A2( - _elm_lang$core$Json_Decode$field, - 'tags', - _elm_lang$core$Json_Decode$dict( - _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string)))); -var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeTypes = A4( - _elm_lang$core$Json_Decode$map3, - _elm_lang$virtual_dom$VirtualDom_Metadata$Types, - A2(_elm_lang$core$Json_Decode$field, 'message', _elm_lang$core$Json_Decode$string), - A2( - _elm_lang$core$Json_Decode$field, - 'aliases', - _elm_lang$core$Json_Decode$dict(_elm_lang$virtual_dom$VirtualDom_Metadata$decodeAlias)), - A2( - _elm_lang$core$Json_Decode$field, - 'unions', - _elm_lang$core$Json_Decode$dict(_elm_lang$virtual_dom$VirtualDom_Metadata$decodeUnion))); -var _elm_lang$virtual_dom$VirtualDom_Metadata$decoder = A3( - _elm_lang$core$Json_Decode$map2, - _elm_lang$virtual_dom$VirtualDom_Metadata$Metadata, - A2(_elm_lang$core$Json_Decode$field, 'versions', _elm_lang$virtual_dom$VirtualDom_Metadata$decodeVersions), - A2(_elm_lang$core$Json_Decode$field, 'types', _elm_lang$virtual_dom$VirtualDom_Metadata$decodeTypes)); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Error = F2( - function (a, b) { - return {message: a, problems: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$ProblemType = F2( - function (a, b) { - return {name: a, problems: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$VirtualDom = {ctor: 'VirtualDom'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Program = {ctor: 'Program'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Request = {ctor: 'Request'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Socket = {ctor: 'Socket'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Process = {ctor: 'Process'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Task = {ctor: 'Task'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Decoder = {ctor: 'Decoder'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Function = {ctor: 'Function'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$problemTable = { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Function, _1: '->'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Decoder, _1: 'Json.Decode.Decoder'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Task, _1: 'Task.Task'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Process, _1: 'Process.Id'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Socket, _1: 'WebSocket.LowLevel.WebSocket'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Request, _1: 'Http.Request'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Program, _1: 'Platform.Program'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$VirtualDom, _1: 'VirtualDom.Node'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$VirtualDom, _1: 'VirtualDom.Attribute'}, - _1: {ctor: '[]'} - } - } - } - } - } - } - } - } -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$findProblems = function (tipe) { - return A2( - _elm_lang$core$List$filterMap, - _elm_lang$virtual_dom$VirtualDom_Metadata$hasProblem(tipe), - _elm_lang$virtual_dom$VirtualDom_Metadata$problemTable); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadAliases = F3( - function (name, _p15, list) { - var _p16 = _p15; - var _p17 = _elm_lang$virtual_dom$VirtualDom_Metadata$findProblems(_p16.tipe); - if (_p17.ctor === '[]') { - return list; - } else { - return { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$ProblemType, name, _p17), - _1: list - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadUnions = F3( - function (name, _p18, list) { - var _p19 = _p18; - var _p20 = A2( - _elm_lang$core$List$concatMap, - _elm_lang$virtual_dom$VirtualDom_Metadata$findProblems, - _elm_lang$core$List$concat( - _elm_lang$core$Dict$values(_p19.tags))); - if (_p20.ctor === '[]') { - return list; - } else { - return { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$ProblemType, name, _p20), - _1: list - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$isPortable = function (_p21) { - var _p22 = _p21; - var _p24 = _p22.types; - var badAliases = A3( - _elm_lang$core$Dict$foldl, - _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadAliases, - {ctor: '[]'}, - _p24.aliases); - var _p23 = A3(_elm_lang$core$Dict$foldl, _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadUnions, badAliases, _p24.unions); - if (_p23.ctor === '[]') { - return _elm_lang$core$Maybe$Nothing; - } else { - return _elm_lang$core$Maybe$Just( - A2(_elm_lang$virtual_dom$VirtualDom_Metadata$Error, _p24.message, _p23)); - } -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$decode = function (value) { - var _p25 = A2(_elm_lang$core$Json_Decode$decodeValue, _elm_lang$virtual_dom$VirtualDom_Metadata$decoder, value); - if (_p25.ctor === 'Err') { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Metadata', - { - start: {line: 229, column: 3}, - end: {line: 239, column: 20} - }, - _p25)('Compiler is generating bad metadata. Report this at .'); - } else { - var _p28 = _p25._0; - var _p27 = _elm_lang$virtual_dom$VirtualDom_Metadata$isPortable(_p28); - if (_p27.ctor === 'Nothing') { - return _elm_lang$core$Result$Ok(_p28); - } else { - return _elm_lang$core$Result$Err(_p27._0); - } - } -}; - -var _elm_lang$virtual_dom$VirtualDom_History$viewMessage = F3( - function (currentIndex, index, msg) { - var messageName = _elm_lang$virtual_dom$Native_Debug.messageToString(msg); - var className = _elm_lang$core$Native_Utils.eq(currentIndex, index) ? 'messages-entry messages-entry-selected' : 'messages-entry'; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class(className), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$on, - 'click', - _elm_lang$core$Json_Decode$succeed(index)), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('messages-entry-content'), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Helpers$attribute, 'title', messageName), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(messageName), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('messages-entry-index'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - _elm_lang$core$Basics$toString(index)), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_History$consMsg = F3( - function (currentIndex, msg, _p0) { - var _p1 = _p0; - var _p2 = _p1._0; - return { - ctor: '_Tuple2', - _0: _p2 - 1, - _1: { - ctor: '::', - _0: A4(_elm_lang$virtual_dom$VirtualDom_Helpers$lazy3, _elm_lang$virtual_dom$VirtualDom_History$viewMessage, currentIndex, _p2, msg), - _1: _p1._1 - } - }; - }); -var _elm_lang$virtual_dom$VirtualDom_History$viewSnapshot = F3( - function (currentIndex, index, _p3) { - var _p4 = _p3; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - _elm_lang$core$Tuple$second( - A3( - _elm_lang$core$Array$foldl, - _elm_lang$virtual_dom$VirtualDom_History$consMsg(currentIndex), - { - ctor: '_Tuple2', - _0: index - 1, - _1: {ctor: '[]'} - }, - _p4.messages))); - }); -var _elm_lang$virtual_dom$VirtualDom_History$undone = function (getResult) { - var _p5 = getResult; - if (_p5.ctor === 'Done') { - return {ctor: '_Tuple2', _0: _p5._1, _1: _p5._0}; - } else { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.History', - { - start: {line: 195, column: 3}, - end: {line: 200, column: 39} - }, - _p5)('Bug in History.get'); - } -}; -var _elm_lang$virtual_dom$VirtualDom_History$elmToJs = _elm_lang$virtual_dom$Native_Debug.unsafeCoerce; -var _elm_lang$virtual_dom$VirtualDom_History$encodeHelp = F2( - function (snapshot, allMessages) { - return A3( - _elm_lang$core$Array$foldl, - F2( - function (elm, msgs) { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_History$elmToJs(elm), - _1: msgs - }; - }), - allMessages, - snapshot.messages); - }); -var _elm_lang$virtual_dom$VirtualDom_History$encode = function (_p7) { - var _p8 = _p7; - var recentJson = A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_History$elmToJs, - _elm_lang$core$List$reverse(_p8.recent.messages)); - return _elm_lang$core$Json_Encode$list( - A3(_elm_lang$core$Array$foldr, _elm_lang$virtual_dom$VirtualDom_History$encodeHelp, recentJson, _p8.snapshots)); -}; -var _elm_lang$virtual_dom$VirtualDom_History$jsToElm = _elm_lang$virtual_dom$Native_Debug.unsafeCoerce; -var _elm_lang$virtual_dom$VirtualDom_History$initialModel = function (_p9) { - var _p10 = _p9; - var _p11 = A2(_elm_lang$core$Array$get, 0, _p10.snapshots); - if (_p11.ctor === 'Just') { - return _p11._0.model; - } else { - return _p10.recent.model; - } -}; -var _elm_lang$virtual_dom$VirtualDom_History$size = function (history) { - return history.numMessages; -}; -var _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize = 64; -var _elm_lang$virtual_dom$VirtualDom_History$consSnapshot = F3( - function (currentIndex, snapshot, _p12) { - var _p13 = _p12; - var _p14 = _p13._0; - var nextIndex = _p14 - _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize; - var currentIndexHelp = ((_elm_lang$core$Native_Utils.cmp(nextIndex, currentIndex) < 1) && (_elm_lang$core$Native_Utils.cmp(currentIndex, _p14) < 0)) ? currentIndex : -1; - return { - ctor: '_Tuple2', - _0: _p14 - _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize, - _1: { - ctor: '::', - _0: A4(_elm_lang$virtual_dom$VirtualDom_Helpers$lazy3, _elm_lang$virtual_dom$VirtualDom_History$viewSnapshot, currentIndexHelp, _p14, snapshot), - _1: _p13._1 - } - }; - }); -var _elm_lang$virtual_dom$VirtualDom_History$viewSnapshots = F2( - function (currentIndex, snapshots) { - var highIndex = _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize * _elm_lang$core$Array$length(snapshots); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - _elm_lang$core$Tuple$second( - A3( - _elm_lang$core$Array$foldr, - _elm_lang$virtual_dom$VirtualDom_History$consSnapshot(currentIndex), - { - ctor: '_Tuple2', - _0: highIndex, - _1: {ctor: '[]'} - }, - snapshots))); - }); -var _elm_lang$virtual_dom$VirtualDom_History$view = F2( - function (maybeIndex, _p15) { - var _p16 = _p15; - var _p17 = function () { - var _p18 = maybeIndex; - if (_p18.ctor === 'Nothing') { - return {ctor: '_Tuple2', _0: -1, _1: 'debugger-sidebar-messages'}; - } else { - return {ctor: '_Tuple2', _0: _p18._0, _1: 'debugger-sidebar-messages-paused'}; - } - }(); - var index = _p17._0; - var className = _p17._1; - var oldStuff = A3(_elm_lang$virtual_dom$VirtualDom_Helpers$lazy2, _elm_lang$virtual_dom$VirtualDom_History$viewSnapshots, index, _p16.snapshots); - var newStuff = _elm_lang$core$Tuple$second( - A3( - _elm_lang$core$List$foldl, - _elm_lang$virtual_dom$VirtualDom_History$consMsg(index), - { - ctor: '_Tuple2', - _0: _p16.numMessages - 1, - _1: {ctor: '[]'} - }, - _p16.recent.messages)); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class(className), - _1: {ctor: '[]'} - }, - {ctor: '::', _0: oldStuff, _1: newStuff}); - }); -var _elm_lang$virtual_dom$VirtualDom_History$History = F3( - function (a, b, c) { - return {snapshots: a, recent: b, numMessages: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$RecentHistory = F3( - function (a, b, c) { - return {model: a, messages: b, numMessages: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$empty = function (model) { - return A3( - _elm_lang$virtual_dom$VirtualDom_History$History, - _elm_lang$core$Array$empty, - A3( - _elm_lang$virtual_dom$VirtualDom_History$RecentHistory, - model, - {ctor: '[]'}, - 0), - 0); -}; -var _elm_lang$virtual_dom$VirtualDom_History$Snapshot = F2( - function (a, b) { - return {model: a, messages: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$addRecent = F3( - function (msg, newModel, _p19) { - var _p20 = _p19; - var _p23 = _p20.numMessages; - var _p22 = _p20.model; - var _p21 = _p20.messages; - return _elm_lang$core$Native_Utils.eq(_p23, _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize) ? { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just( - A2( - _elm_lang$virtual_dom$VirtualDom_History$Snapshot, - _p22, - _elm_lang$core$Array$fromList(_p21))), - _1: A3( - _elm_lang$virtual_dom$VirtualDom_History$RecentHistory, - newModel, - { - ctor: '::', - _0: msg, - _1: {ctor: '[]'} - }, - 1) - } : { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Nothing, - _1: A3( - _elm_lang$virtual_dom$VirtualDom_History$RecentHistory, - _p22, - {ctor: '::', _0: msg, _1: _p21}, - _p23 + 1) - }; - }); -var _elm_lang$virtual_dom$VirtualDom_History$add = F3( - function (msg, model, _p24) { - var _p25 = _p24; - var _p28 = _p25.snapshots; - var _p27 = _p25.numMessages; - var _p26 = A3(_elm_lang$virtual_dom$VirtualDom_History$addRecent, msg, model, _p25.recent); - if (_p26._0.ctor === 'Just') { - return A3( - _elm_lang$virtual_dom$VirtualDom_History$History, - A2(_elm_lang$core$Array$push, _p26._0._0, _p28), - _p26._1, - _p27 + 1); - } else { - return A3(_elm_lang$virtual_dom$VirtualDom_History$History, _p28, _p26._1, _p27 + 1); - } - }); -var _elm_lang$virtual_dom$VirtualDom_History$decoder = F2( - function (initialModel, update) { - var addMessage = F2( - function (rawMsg, _p29) { - var _p30 = _p29; - var _p31 = _p30._0; - var msg = _elm_lang$virtual_dom$VirtualDom_History$jsToElm(rawMsg); - return { - ctor: '_Tuple2', - _0: A2(update, msg, _p31), - _1: A3(_elm_lang$virtual_dom$VirtualDom_History$add, msg, _p31, _p30._1) - }; - }); - var updateModel = function (rawMsgs) { - return A3( - _elm_lang$core$List$foldl, - addMessage, - { - ctor: '_Tuple2', - _0: initialModel, - _1: _elm_lang$virtual_dom$VirtualDom_History$empty(initialModel) - }, - rawMsgs); - }; - return A2( - _elm_lang$core$Json_Decode$map, - updateModel, - _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$value)); - }); -var _elm_lang$virtual_dom$VirtualDom_History$Done = F2( - function (a, b) { - return {ctor: 'Done', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$Stepping = F2( - function (a, b) { - return {ctor: 'Stepping', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$getHelp = F3( - function (update, msg, getResult) { - var _p32 = getResult; - if (_p32.ctor === 'Done') { - return getResult; - } else { - var _p34 = _p32._0; - var _p33 = _p32._1; - return _elm_lang$core$Native_Utils.eq(_p34, 0) ? A2( - _elm_lang$virtual_dom$VirtualDom_History$Done, - msg, - _elm_lang$core$Tuple$first( - A2(update, msg, _p33))) : A2( - _elm_lang$virtual_dom$VirtualDom_History$Stepping, - _p34 - 1, - _elm_lang$core$Tuple$first( - A2(update, msg, _p33))); - } - }); -var _elm_lang$virtual_dom$VirtualDom_History$get = F3( - function (update, index, _p35) { - var _p36 = _p35; - var _p39 = _p36.recent; - var snapshotMax = _p36.numMessages - _p39.numMessages; - if (_elm_lang$core$Native_Utils.cmp(index, snapshotMax) > -1) { - return _elm_lang$virtual_dom$VirtualDom_History$undone( - A3( - _elm_lang$core$List$foldr, - _elm_lang$virtual_dom$VirtualDom_History$getHelp(update), - A2(_elm_lang$virtual_dom$VirtualDom_History$Stepping, index - snapshotMax, _p39.model), - _p39.messages)); - } else { - var _p37 = A2(_elm_lang$core$Array$get, (index / _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize) | 0, _p36.snapshots); - if (_p37.ctor === 'Nothing') { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.History', - { - start: {line: 165, column: 7}, - end: {line: 171, column: 95} - }, - _p37)('UI should only let you ask for real indexes!'); - } else { - return _elm_lang$virtual_dom$VirtualDom_History$undone( - A3( - _elm_lang$core$Array$foldr, - _elm_lang$virtual_dom$VirtualDom_History$getHelp(update), - A2( - _elm_lang$virtual_dom$VirtualDom_History$Stepping, - A2(_elm_lang$core$Basics$rem, index, _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize), - _p37._0.model), - _p37._0.messages)); - } - } - }); - -var _elm_lang$virtual_dom$VirtualDom_Overlay$styles = A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'style', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('\n\n.elm-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: white;\n pointer-events: none;\n font-family: \'Trebuchet MS\', \'Lucida Grande\', \'Bitstream Vera Sans\', \'Helvetica Neue\', sans-serif;\n}\n\n.elm-overlay-resume {\n width: 100%;\n height: 100%;\n cursor: pointer;\n text-align: center;\n pointer-events: auto;\n background-color: rgba(200, 200, 200, 0.7);\n}\n\n.elm-overlay-resume-words {\n position: absolute;\n top: calc(50% - 40px);\n font-size: 80px;\n line-height: 80px;\n height: 80px;\n width: 100%;\n}\n\n.elm-mini-controls {\n position: fixed;\n bottom: 0;\n right: 6px;\n border-radius: 4px;\n background-color: rgb(61, 61, 61);\n font-family: monospace;\n pointer-events: auto;\n}\n\n.elm-mini-controls-button {\n padding: 6px;\n cursor: pointer;\n text-align: center;\n min-width: 24ch;\n}\n\n.elm-mini-controls-import-export {\n padding: 4px 0;\n font-size: 0.8em;\n text-align: center;\n background-color: rgb(50, 50, 50);\n}\n\n.elm-overlay-message {\n position: absolute;\n width: 600px;\n height: 100%;\n padding-left: calc(50% - 300px);\n padding-right: calc(50% - 300px);\n background-color: rgba(200, 200, 200, 0.7);\n pointer-events: auto;\n}\n\n.elm-overlay-message-title {\n font-size: 36px;\n height: 80px;\n background-color: rgb(50, 50, 50);\n padding-left: 22px;\n vertical-align: middle;\n line-height: 80px;\n}\n\n.elm-overlay-message-details {\n padding: 8px 20px;\n overflow-y: auto;\n max-height: calc(100% - 156px);\n background-color: rgb(61, 61, 61);\n}\n\n.elm-overlay-message-details-type {\n font-size: 1.5em;\n}\n\n.elm-overlay-message-details ul {\n list-style-type: none;\n padding-left: 20px;\n}\n\n.elm-overlay-message-details ul ul {\n list-style-type: disc;\n padding-left: 2em;\n}\n\n.elm-overlay-message-details li {\n margin: 8px 0;\n}\n\n.elm-overlay-message-buttons {\n height: 60px;\n line-height: 60px;\n text-align: right;\n background-color: rgb(50, 50, 50);\n}\n\n.elm-overlay-message-buttons button {\n margin-right: 20px;\n}\n\n'), - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$button = F2( - function (msg, label) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(msg), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'cursor', _1: 'pointer'}, - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(label), - _1: {ctor: '[]'} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewImportExport = F3( - function (props, importMsg, exportMsg) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - props, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$button, importMsg, 'Import'), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' / '), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$button, exportMsg, 'Export'), - _1: {ctor: '[]'} - } - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewMiniControls = F2( - function (config, numMsgs) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-mini-controls'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(config.open), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-mini-controls-button'), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2( - _elm_lang$core$Basics_ops['++'], - 'Explore History (', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(numMsgs), - ')'))), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Overlay$viewImportExport, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-mini-controls-import-export'), - _1: {ctor: '[]'} - }, - config.importHistory, - config.exportHistory), - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$addCommas = function (items) { - var _p0 = items; - if (_p0.ctor === '[]') { - return ''; - } else { - if (_p0._1.ctor === '[]') { - return _p0._0; - } else { - if (_p0._1._1.ctor === '[]') { - return A2( - _elm_lang$core$Basics_ops['++'], - _p0._0, - A2(_elm_lang$core$Basics_ops['++'], ' and ', _p0._1._0)); - } else { - return A2( - _elm_lang$core$String$join, - ', ', - A2( - _elm_lang$core$Basics_ops['++'], - _p0._1, - { - ctor: '::', - _0: A2(_elm_lang$core$Basics_ops['++'], ' and ', _p0._0), - _1: {ctor: '[]'} - })); - } - } - } -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$problemToString = function (problem) { - var _p1 = problem; - switch (_p1.ctor) { - case 'Function': - return 'functions'; - case 'Decoder': - return 'JSON decoders'; - case 'Task': - return 'tasks'; - case 'Process': - return 'processes'; - case 'Socket': - return 'web sockets'; - case 'Request': - return 'HTTP requests'; - case 'Program': - return 'programs'; - default: - return 'virtual DOM values'; - } -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$goodNews2 = '\nfunction can pattern match on that data and call whatever functions, JSON\ndecoders, etc. you need. This makes the code much more explicit and easy to\nfollow for other readers (or you in a few months!)\n'; -var _elm_lang$virtual_dom$VirtualDom_Overlay$goodNews1 = '\nThe good news is that having values like this in your message type is not\nso great in the long run. You are better off using simpler data, like\n'; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode = function (name) { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'code', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(name), - _1: {ctor: '[]'} - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewMention = F2( - function (tags, verbed) { - var _p2 = A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode, - _elm_lang$core$List$reverse(tags)); - if (_p2.ctor === '[]') { - return _elm_lang$virtual_dom$VirtualDom_Helpers$text(''); - } else { - if (_p2._1.ctor === '[]') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(verbed), - _1: { - ctor: '::', - _0: _p2._0, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('.'), - _1: {ctor: '[]'} - } - } - }); - } else { - if (_p2._1._1.ctor === '[]') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(verbed), - _1: { - ctor: '::', - _0: _p2._1._0, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' and '), - _1: { - ctor: '::', - _0: _p2._0, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('.'), - _1: {ctor: '[]'} - } - } - } - } - }); - } else { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(verbed), - _1: A2( - _elm_lang$core$Basics_ops['++'], - A2( - _elm_lang$core$List$intersperse, - _elm_lang$virtual_dom$VirtualDom_Helpers$text(', '), - _elm_lang$core$List$reverse(_p2._1)), - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', and '), - _1: { - ctor: '::', - _0: _p2._0, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('.'), - _1: {ctor: '[]'} - } - } - }) - }); - } - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewChange = function (change) { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - function () { - var _p3 = change; - if (_p3.ctor === 'AliasChange') { - return { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-details-type'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p3._0), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }; - } else { - return { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-details-type'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p3._0), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'ul', - {ctor: '[]'}, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMention, _p3._1.removed, 'Removed '), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMention, _p3._1.changed, 'Changed '), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMention, _p3._1.added, 'Added '), - _1: {ctor: '[]'} - } - } - }), - _1: { - ctor: '::', - _0: _p3._1.argsMatch ? _elm_lang$virtual_dom$VirtualDom_Helpers$text('') : _elm_lang$virtual_dom$VirtualDom_Helpers$text('This may be due to the fact that the type variable names changed.'), - _1: {ctor: '[]'} - } - } - }; - } - }()); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewProblemType = function (_p4) { - var _p5 = _p4; - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p5.name), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2( - _elm_lang$core$Basics_ops['++'], - ' can contain ', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$virtual_dom$VirtualDom_Overlay$addCommas( - A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Overlay$problemToString, _p5.problems)), - '.'))), - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewBadMetadata = function (_p6) { - var _p7 = _p6; - return { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'p', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('The '), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p7.message), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' type of your program cannot be reliably serialized for history files.'), - _1: {ctor: '[]'} - } - } - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'p', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Functions cannot be serialized, nor can values that contain functions. This is a problem in these places:'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'ul', - {ctor: '[]'}, - A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Overlay$viewProblemType, _p7.problems)), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'p', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_elm_lang$virtual_dom$VirtualDom_Overlay$goodNews1), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$a, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$href('https://guide.elm-lang.org/types/union_types.html'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('union types'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', in your messages. From there, your '), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode('update'), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_elm_lang$virtual_dom$VirtualDom_Overlay$goodNews2), - _1: {ctor: '[]'} - } - } - } - } - }), - _1: {ctor: '[]'} - } - } - } - }; -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$explanationRisky = '\nThis history seems old. It will work with this program, but some\nmessages have been added since the history was created:\n'; -var _elm_lang$virtual_dom$VirtualDom_Overlay$explanationBad = '\nThe messages in this history do not match the messages handled by your\nprogram. I noticed changes in the following types:\n'; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewReport = F2( - function (isBad, report) { - var _p8 = report; - switch (_p8.ctor) { - case 'CorruptHistory': - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Looks like this history file is corrupt. I cannot understand it.'), - _1: {ctor: '[]'} - }; - case 'VersionChanged': - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2( - _elm_lang$core$Basics_ops['++'], - 'This history was created with Elm ', - A2( - _elm_lang$core$Basics_ops['++'], - _p8._0, - A2( - _elm_lang$core$Basics_ops['++'], - ', but you are using Elm ', - A2(_elm_lang$core$Basics_ops['++'], _p8._1, ' right now.'))))), - _1: {ctor: '[]'} - }; - case 'MessageChanged': - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2(_elm_lang$core$Basics_ops['++'], 'To import some other history, the overall message type must', ' be the same. The old history has ')), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p8._0), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' messages, but the new program works with '), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p8._1), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' messages.'), - _1: {ctor: '[]'} - } - } - } - } - }; - default: - return { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'p', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - isBad ? _elm_lang$virtual_dom$VirtualDom_Overlay$explanationBad : _elm_lang$virtual_dom$VirtualDom_Overlay$explanationRisky), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'ul', - {ctor: '[]'}, - A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Overlay$viewChange, _p8._0)), - _1: {ctor: '[]'} - } - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewResume = function (config) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-resume'), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(config.resume), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-resume-words'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Click to Resume'), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$uploadDecoder = A3( - _elm_lang$core$Json_Decode$map2, - F2( - function (v0, v1) { - return {ctor: '_Tuple2', _0: v0, _1: v1}; - }), - A2(_elm_lang$core$Json_Decode$field, 'metadata', _elm_lang$virtual_dom$VirtualDom_Metadata$decoder), - A2(_elm_lang$core$Json_Decode$field, 'history', _elm_lang$core$Json_Decode$value)); -var _elm_lang$virtual_dom$VirtualDom_Overlay$close = F2( - function (msg, state) { - var _p9 = state; - switch (_p9.ctor) { - case 'None': - return _elm_lang$core$Maybe$Nothing; - case 'BadMetadata': - return _elm_lang$core$Maybe$Nothing; - case 'BadImport': - return _elm_lang$core$Maybe$Nothing; - default: - var _p10 = msg; - if (_p10.ctor === 'Cancel') { - return _elm_lang$core$Maybe$Nothing; - } else { - return _elm_lang$core$Maybe$Just(_p9._1); - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$isBlocking = function (state) { - var _p11 = state; - if (_p11.ctor === 'None') { - return false; - } else { - return true; - } -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Config = F5( - function (a, b, c, d, e) { - return {resume: a, open: b, importHistory: c, exportHistory: d, wrap: e}; - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$RiskyImport = F2( - function (a, b) { - return {ctor: 'RiskyImport', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$BadImport = function (a) { - return {ctor: 'BadImport', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$corruptImport = _elm_lang$virtual_dom$VirtualDom_Overlay$BadImport(_elm_lang$virtual_dom$VirtualDom_Report$CorruptHistory); -var _elm_lang$virtual_dom$VirtualDom_Overlay$assessImport = F2( - function (metadata, jsonString) { - var _p12 = A2(_elm_lang$core$Json_Decode$decodeString, _elm_lang$virtual_dom$VirtualDom_Overlay$uploadDecoder, jsonString); - if (_p12.ctor === 'Err') { - return _elm_lang$core$Result$Err(_elm_lang$virtual_dom$VirtualDom_Overlay$corruptImport); - } else { - var _p14 = _p12._0._1; - var report = A2(_elm_lang$virtual_dom$VirtualDom_Metadata$check, _p12._0._0, metadata); - var _p13 = _elm_lang$virtual_dom$VirtualDom_Report$evaluate(report); - switch (_p13.ctor) { - case 'Impossible': - return _elm_lang$core$Result$Err( - _elm_lang$virtual_dom$VirtualDom_Overlay$BadImport(report)); - case 'Risky': - return _elm_lang$core$Result$Err( - A2(_elm_lang$virtual_dom$VirtualDom_Overlay$RiskyImport, report, _p14)); - default: - return _elm_lang$core$Result$Ok(_p14); - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$BadMetadata = function (a) { - return {ctor: 'BadMetadata', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$badMetadata = _elm_lang$virtual_dom$VirtualDom_Overlay$BadMetadata; -var _elm_lang$virtual_dom$VirtualDom_Overlay$None = {ctor: 'None'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$none = _elm_lang$virtual_dom$VirtualDom_Overlay$None; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Proceed = {ctor: 'Proceed'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Cancel = {ctor: 'Cancel'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewButtons = function (buttons) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-buttons'), - _1: {ctor: '[]'} - }, - function () { - var _p15 = buttons; - if (_p15.ctor === 'Accept') { - return { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'button', - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Overlay$Proceed), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p15._0), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }; - } else { - return { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'button', - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Overlay$Cancel), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p15._0), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'button', - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Overlay$Proceed), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p15._1), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }; - } - }()); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Message = {ctor: 'Message'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage = F4( - function (config, title, details, buttons) { - return { - ctor: '_Tuple2', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$Message, - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-title'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(title), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-details'), - _1: {ctor: '[]'} - }, - details), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - config.wrap, - _elm_lang$virtual_dom$VirtualDom_Overlay$viewButtons(buttons)), - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - } - }; - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$Pause = {ctor: 'Pause'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Normal = {ctor: 'Normal'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Choose = F2( - function (a, b) { - return {ctor: 'Choose', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$Accept = function (a) { - return {ctor: 'Accept', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewHelp = F5( - function (config, isPaused, isOpen, numMsgs, state) { - var _p16 = state; - switch (_p16.ctor) { - case 'None': - var miniControls = isOpen ? {ctor: '[]'} : { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMiniControls, config, numMsgs), - _1: {ctor: '[]'} - }; - return { - ctor: '_Tuple2', - _0: isPaused ? _elm_lang$virtual_dom$VirtualDom_Overlay$Pause : _elm_lang$virtual_dom$VirtualDom_Overlay$Normal, - _1: (isPaused && (!isOpen)) ? { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewResume(config), - _1: miniControls - } : miniControls - }; - case 'BadMetadata': - return A4( - _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage, - config, - 'Cannot use Import or Export', - _elm_lang$virtual_dom$VirtualDom_Overlay$viewBadMetadata(_p16._0), - _elm_lang$virtual_dom$VirtualDom_Overlay$Accept('Ok')); - case 'BadImport': - return A4( - _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage, - config, - 'Cannot Import History', - A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewReport, true, _p16._0), - _elm_lang$virtual_dom$VirtualDom_Overlay$Accept('Ok')); - default: - return A4( - _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage, - config, - 'Warning', - A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewReport, false, _p16._0), - A2(_elm_lang$virtual_dom$VirtualDom_Overlay$Choose, 'Cancel', 'Import Anyway')); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$view = F5( - function (config, isPaused, isOpen, numMsgs, state) { - var _p17 = A5(_elm_lang$virtual_dom$VirtualDom_Overlay$viewHelp, config, isPaused, isOpen, numMsgs, state); - var block = _p17._0; - var nodes = _p17._1; - return { - ctor: '_Tuple2', - _0: block, - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay'), - _1: {ctor: '[]'} - }, - {ctor: '::', _0: _elm_lang$virtual_dom$VirtualDom_Overlay$styles, _1: nodes}) - }; - }); - -var _elm_lang$virtual_dom$VirtualDom_Debug$styles = A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'style', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('\n\nhtml {\n overflow: hidden;\n height: 100%;\n}\n\nbody {\n height: 100%;\n overflow: auto;\n}\n\n#debugger {\n width: 100%\n height: 100%;\n font-family: monospace;\n}\n\n#values {\n display: block;\n float: left;\n height: 100%;\n width: calc(100% - 30ch);\n margin: 0;\n overflow: auto;\n cursor: default;\n}\n\n.debugger-sidebar {\n display: block;\n float: left;\n width: 30ch;\n height: 100%;\n color: white;\n background-color: rgb(61, 61, 61);\n}\n\n.debugger-sidebar-controls {\n width: 100%;\n text-align: center;\n background-color: rgb(50, 50, 50);\n}\n\n.debugger-sidebar-controls-import-export {\n width: 100%;\n height: 24px;\n line-height: 24px;\n font-size: 12px;\n}\n\n.debugger-sidebar-controls-resume {\n width: 100%;\n height: 30px;\n line-height: 30px;\n cursor: pointer;\n}\n\n.debugger-sidebar-controls-resume:hover {\n background-color: rgb(41, 41, 41);\n}\n\n.debugger-sidebar-messages {\n width: 100%;\n overflow-y: auto;\n height: calc(100% - 24px);\n}\n\n.debugger-sidebar-messages-paused {\n width: 100%;\n overflow-y: auto;\n height: calc(100% - 54px);\n}\n\n.messages-entry {\n cursor: pointer;\n width: 100%;\n}\n\n.messages-entry:hover {\n background-color: rgb(41, 41, 41);\n}\n\n.messages-entry-selected, .messages-entry-selected:hover {\n background-color: rgb(10, 10, 10);\n}\n\n.messages-entry-content {\n width: calc(100% - 7ch);\n padding-top: 4px;\n padding-bottom: 4px;\n padding-left: 1ch;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n}\n\n.messages-entry-index {\n color: #666;\n width: 5ch;\n padding-top: 4px;\n padding-bottom: 4px;\n padding-right: 1ch;\n text-align: right;\n display: block;\n float: right;\n}\n\n'), - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$button = F2( - function (msg, label) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(msg), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'cursor', _1: 'pointer'}, - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(label), - _1: {ctor: '[]'} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel = function (state) { - var _p0 = state; - if (_p0.ctor === 'Running') { - return _p0._0; - } else { - return _p0._2; - } -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata = F2( - function (model, func) { - var _p1 = model.metadata; - if (_p1.ctor === 'Ok') { - return func(_p1._0); - } else { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$badMetadata(_p1._0) - }), - {ctor: '[]'}); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$Model = F6( - function (a, b, c, d, e, f) { - return {history: a, state: b, expando: c, metadata: d, overlay: e, isDebuggerOpen: f}; - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$Paused = F3( - function (a, b, c) { - return {ctor: 'Paused', _0: a, _1: b, _2: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$Running = function (a) { - return {ctor: 'Running', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$loadNewHistory = F3( - function (rawHistory, userUpdate, model) { - var pureUserUpdate = F2( - function (msg, userModel) { - return _elm_lang$core$Tuple$first( - A2(userUpdate, msg, userModel)); - }); - var initialUserModel = _elm_lang$virtual_dom$VirtualDom_History$initialModel(model.history); - var decoder = A2(_elm_lang$virtual_dom$VirtualDom_History$decoder, initialUserModel, pureUserUpdate); - var _p2 = A2(_elm_lang$core$Json_Decode$decodeValue, decoder, rawHistory); - if (_p2.ctor === 'Err') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$corruptImport}), - {ctor: '[]'}); - } else { - var _p3 = _p2._0._0; - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - history: _p2._0._1, - state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(_p3), - expando: _elm_lang$virtual_dom$VirtualDom_Expando$init(_p3), - overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$none - }), - {ctor: '[]'}); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$OverlayMsg = function (a) { - return {ctor: 'OverlayMsg', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Upload = function (a) { - return {ctor: 'Upload', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$upload = A2(_elm_lang$core$Task$perform, _elm_lang$virtual_dom$VirtualDom_Debug$Upload, _elm_lang$virtual_dom$Native_Debug.upload); -var _elm_lang$virtual_dom$VirtualDom_Debug$Export = {ctor: 'Export'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Import = {ctor: 'Import'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Down = {ctor: 'Down'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Up = {ctor: 'Up'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Close = {ctor: 'Close'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Open = {ctor: 'Open'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Jump = function (a) { - return {ctor: 'Jump', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Resume = {ctor: 'Resume'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$overlayConfig = {resume: _elm_lang$virtual_dom$VirtualDom_Debug$Resume, open: _elm_lang$virtual_dom$VirtualDom_Debug$Open, importHistory: _elm_lang$virtual_dom$VirtualDom_Debug$Import, exportHistory: _elm_lang$virtual_dom$VirtualDom_Debug$Export, wrap: _elm_lang$virtual_dom$VirtualDom_Debug$OverlayMsg}; -var _elm_lang$virtual_dom$VirtualDom_Debug$viewIn = function (_p4) { - var _p5 = _p4; - var isPaused = function () { - var _p6 = _p5.state; - if (_p6.ctor === 'Running') { - return false; - } else { - return true; - } - }(); - return A5( - _elm_lang$virtual_dom$VirtualDom_Overlay$view, - _elm_lang$virtual_dom$VirtualDom_Debug$overlayConfig, - isPaused, - _p5.isDebuggerOpen, - _elm_lang$virtual_dom$VirtualDom_History$size(_p5.history), - _p5.overlay); -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$resumeButton = A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Debug$Resume), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar-controls-resume'), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Resume'), - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$viewResumeButton = function (maybeIndex) { - var _p7 = maybeIndex; - if (_p7.ctor === 'Nothing') { - return _elm_lang$virtual_dom$VirtualDom_Helpers$text(''); - } else { - return _elm_lang$virtual_dom$VirtualDom_Debug$resumeButton; - } -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$playButton = function (maybeIndex) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar-controls'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Debug$viewResumeButton(maybeIndex), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar-controls-import-export'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$button, _elm_lang$virtual_dom$VirtualDom_Debug$Import, 'Import'), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' / '), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$button, _elm_lang$virtual_dom$VirtualDom_Debug$Export, 'Export'), - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$viewSidebar = F2( - function (state, history) { - var maybeIndex = function () { - var _p8 = state; - if (_p8.ctor === 'Running') { - return _elm_lang$core$Maybe$Nothing; - } else { - return _elm_lang$core$Maybe$Just(_p8._0); - } - }(); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - _elm_lang$virtual_dom$VirtualDom_Debug$Jump, - A2(_elm_lang$virtual_dom$VirtualDom_History$view, maybeIndex, history)), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Debug$playButton(maybeIndex), - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$ExpandoMsg = function (a) { - return {ctor: 'ExpandoMsg', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$viewOut = function (_p9) { - var _p10 = _p9; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$id('debugger'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Debug$styles, - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$viewSidebar, _p10.state, _p10.history), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - _elm_lang$virtual_dom$VirtualDom_Debug$ExpandoMsg, - A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$id('values'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Expando$view, _elm_lang$core$Maybe$Nothing, _p10.expando), - _1: {ctor: '[]'} - })), - _1: {ctor: '[]'} - } - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg = function (a) { - return {ctor: 'UserMsg', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapInit = F2( - function (metadata, _p11) { - var _p12 = _p11; - var _p13 = _p12._0; - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - { - history: _elm_lang$virtual_dom$VirtualDom_History$empty(_p13), - state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(_p13), - expando: _elm_lang$virtual_dom$VirtualDom_Expando$init(_p13), - metadata: _elm_lang$virtual_dom$VirtualDom_Metadata$decode(metadata), - overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$none, - isDebuggerOpen: false - }, - { - ctor: '::', - _0: A2(_elm_lang$core$Platform_Cmd$map, _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, _p12._1), - _1: {ctor: '[]'} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapSubs = F2( - function (userSubscriptions, _p14) { - var _p15 = _p14; - return A2( - _elm_lang$core$Platform_Sub$map, - _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, - userSubscriptions( - _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel(_p15.state))); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapView = F2( - function (userView, _p16) { - var _p17 = _p16; - var currentModel = function () { - var _p18 = _p17.state; - if (_p18.ctor === 'Running') { - return _p18._0; - } else { - return _p18._1; - } - }(); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, - userView(currentModel)); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$NoOp = {ctor: 'NoOp'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$download = F2( - function (metadata, history) { - var json = _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'metadata', - _1: _elm_lang$virtual_dom$VirtualDom_Metadata$encode(metadata) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'history', - _1: _elm_lang$virtual_dom$VirtualDom_History$encode(history) - }, - _1: {ctor: '[]'} - } - }); - var historyLength = _elm_lang$virtual_dom$VirtualDom_History$size(history); - return A2( - _elm_lang$core$Task$perform, - function (_p19) { - return _elm_lang$virtual_dom$VirtualDom_Debug$NoOp; - }, - A2(_elm_lang$virtual_dom$Native_Debug.download, historyLength, json)); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$runIf = F2( - function (bool, task) { - return bool ? A2( - _elm_lang$core$Task$perform, - _elm_lang$core$Basics$always(_elm_lang$virtual_dom$VirtualDom_Debug$NoOp), - task) : _elm_lang$core$Platform_Cmd$none; - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$updateUserMsg = F4( - function (userUpdate, scrollTask, userMsg, _p20) { - var _p21 = _p20; - var _p25 = _p21.state; - var _p24 = _p21; - var userModel = _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel(_p25); - var newHistory = A3(_elm_lang$virtual_dom$VirtualDom_History$add, userMsg, userModel, _p21.history); - var _p22 = A2(userUpdate, userMsg, userModel); - var newUserModel = _p22._0; - var userCmds = _p22._1; - var commands = A2(_elm_lang$core$Platform_Cmd$map, _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, userCmds); - var _p23 = _p25; - if (_p23.ctor === 'Running') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - _p24, - { - history: newHistory, - state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(newUserModel), - expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$merge, newUserModel, _p21.expando) - }), - { - ctor: '::', - _0: commands, - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$runIf, _p24.isDebuggerOpen, scrollTask), - _1: {ctor: '[]'} - } - }); - } else { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - _p24, - { - history: newHistory, - state: A3(_elm_lang$virtual_dom$VirtualDom_Debug$Paused, _p23._0, _p23._1, newUserModel) - }), - { - ctor: '::', - _0: commands, - _1: {ctor: '[]'} - }); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapUpdate = F4( - function (userUpdate, scrollTask, msg, model) { - wrapUpdate: - while (true) { - var _p26 = msg; - switch (_p26.ctor) { - case 'NoOp': - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - {ctor: '[]'}); - case 'UserMsg': - return A4(_elm_lang$virtual_dom$VirtualDom_Debug$updateUserMsg, userUpdate, scrollTask, _p26._0, model); - case 'ExpandoMsg': - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, _p26._0, model.expando) - }), - {ctor: '[]'}); - case 'Resume': - var _p27 = model.state; - if (_p27.ctor === 'Running') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - {ctor: '[]'}); - } else { - var _p28 = _p27._2; - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(_p28), - expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$merge, _p28, model.expando) - }), - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$runIf, model.isDebuggerOpen, scrollTask), - _1: {ctor: '[]'} - }); - } - case 'Jump': - var _p30 = _p26._0; - var _p29 = A3(_elm_lang$virtual_dom$VirtualDom_History$get, userUpdate, _p30, model.history); - var indexModel = _p29._0; - var indexMsg = _p29._1; - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - state: A3( - _elm_lang$virtual_dom$VirtualDom_Debug$Paused, - _p30, - indexModel, - _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel(model.state)), - expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$merge, indexModel, model.expando) - }), - {ctor: '[]'}); - case 'Open': - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {isDebuggerOpen: true}), - {ctor: '[]'}); - case 'Close': - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {isDebuggerOpen: false}), - {ctor: '[]'}); - case 'Up': - var index = function () { - var _p31 = model.state; - if (_p31.ctor === 'Paused') { - return _p31._0; - } else { - return _elm_lang$virtual_dom$VirtualDom_History$size(model.history); - } - }(); - if (_elm_lang$core$Native_Utils.cmp(index, 0) > 0) { - var _v17 = userUpdate, - _v18 = scrollTask, - _v19 = _elm_lang$virtual_dom$VirtualDom_Debug$Jump(index - 1), - _v20 = model; - userUpdate = _v17; - scrollTask = _v18; - msg = _v19; - model = _v20; - continue wrapUpdate; - } else { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - {ctor: '[]'}); - } - case 'Down': - var _p32 = model.state; - if (_p32.ctor === 'Running') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - {ctor: '[]'}); - } else { - var _p33 = _p32._0; - if (_elm_lang$core$Native_Utils.eq( - _p33, - _elm_lang$virtual_dom$VirtualDom_History$size(model.history) - 1)) { - var _v22 = userUpdate, - _v23 = scrollTask, - _v24 = _elm_lang$virtual_dom$VirtualDom_Debug$Resume, - _v25 = model; - userUpdate = _v22; - scrollTask = _v23; - msg = _v24; - model = _v25; - continue wrapUpdate; - } else { - var _v26 = userUpdate, - _v27 = scrollTask, - _v28 = _elm_lang$virtual_dom$VirtualDom_Debug$Jump(_p33 + 1), - _v29 = model; - userUpdate = _v26; - scrollTask = _v27; - msg = _v28; - model = _v29; - continue wrapUpdate; - } - } - case 'Import': - return A2( - _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata, - model, - function (_p34) { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Debug$upload, - _1: {ctor: '[]'} - }); - }); - case 'Export': - return A2( - _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata, - model, - function (metadata) { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$download, metadata, model.history), - _1: {ctor: '[]'} - }); - }); - case 'Upload': - return A2( - _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata, - model, - function (metadata) { - var _p35 = A2(_elm_lang$virtual_dom$VirtualDom_Overlay$assessImport, metadata, _p26._0); - if (_p35.ctor === 'Err') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {overlay: _p35._0}), - {ctor: '[]'}); - } else { - return A3(_elm_lang$virtual_dom$VirtualDom_Debug$loadNewHistory, _p35._0, userUpdate, model); - } - }); - default: - var _p36 = A2(_elm_lang$virtual_dom$VirtualDom_Overlay$close, _p26._0, model.overlay); - if (_p36.ctor === 'Nothing') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$none}), - {ctor: '[]'}); - } else { - return A3(_elm_lang$virtual_dom$VirtualDom_Debug$loadNewHistory, _p36._0, userUpdate, model); - } - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrap = F2( - function (metadata, _p37) { - var _p38 = _p37; - return { - init: A2(_elm_lang$virtual_dom$VirtualDom_Debug$wrapInit, metadata, _p38.init), - view: _elm_lang$virtual_dom$VirtualDom_Debug$wrapView(_p38.view), - update: _elm_lang$virtual_dom$VirtualDom_Debug$wrapUpdate(_p38.update), - viewIn: _elm_lang$virtual_dom$VirtualDom_Debug$viewIn, - viewOut: _elm_lang$virtual_dom$VirtualDom_Debug$viewOut, - subscriptions: _elm_lang$virtual_dom$VirtualDom_Debug$wrapSubs(_p38.subscriptions) - }; - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags = F2( - function (metadata, _p39) { - var _p40 = _p39; - return { - init: function (flags) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Debug$wrapInit, - metadata, - _p40.init(flags)); - }, - view: _elm_lang$virtual_dom$VirtualDom_Debug$wrapView(_p40.view), - update: _elm_lang$virtual_dom$VirtualDom_Debug$wrapUpdate(_p40.update), - viewIn: _elm_lang$virtual_dom$VirtualDom_Debug$viewIn, - viewOut: _elm_lang$virtual_dom$VirtualDom_Debug$viewOut, - subscriptions: _elm_lang$virtual_dom$VirtualDom_Debug$wrapSubs(_p40.subscriptions) - }; - }); - -var _elm_lang$virtual_dom$VirtualDom$programWithFlags = function (impl) { - return A2(_elm_lang$virtual_dom$Native_VirtualDom.programWithFlags, _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags, impl); -}; -var _elm_lang$virtual_dom$VirtualDom$program = function (impl) { - return A2(_elm_lang$virtual_dom$Native_VirtualDom.program, _elm_lang$virtual_dom$VirtualDom_Debug$wrap, impl); -}; -var _elm_lang$virtual_dom$VirtualDom$keyedNode = _elm_lang$virtual_dom$Native_VirtualDom.keyedNode; -var _elm_lang$virtual_dom$VirtualDom$lazy3 = _elm_lang$virtual_dom$Native_VirtualDom.lazy3; -var _elm_lang$virtual_dom$VirtualDom$lazy2 = _elm_lang$virtual_dom$Native_VirtualDom.lazy2; -var _elm_lang$virtual_dom$VirtualDom$lazy = _elm_lang$virtual_dom$Native_VirtualDom.lazy; -var _elm_lang$virtual_dom$VirtualDom$defaultOptions = {stopPropagation: false, preventDefault: false}; -var _elm_lang$virtual_dom$VirtualDom$onWithOptions = _elm_lang$virtual_dom$Native_VirtualDom.on; -var _elm_lang$virtual_dom$VirtualDom$on = F2( - function (eventName, decoder) { - return A3(_elm_lang$virtual_dom$VirtualDom$onWithOptions, eventName, _elm_lang$virtual_dom$VirtualDom$defaultOptions, decoder); - }); -var _elm_lang$virtual_dom$VirtualDom$style = _elm_lang$virtual_dom$Native_VirtualDom.style; -var _elm_lang$virtual_dom$VirtualDom$mapProperty = _elm_lang$virtual_dom$Native_VirtualDom.mapProperty; -var _elm_lang$virtual_dom$VirtualDom$attributeNS = _elm_lang$virtual_dom$Native_VirtualDom.attributeNS; -var _elm_lang$virtual_dom$VirtualDom$attribute = _elm_lang$virtual_dom$Native_VirtualDom.attribute; -var _elm_lang$virtual_dom$VirtualDom$property = _elm_lang$virtual_dom$Native_VirtualDom.property; -var _elm_lang$virtual_dom$VirtualDom$map = _elm_lang$virtual_dom$Native_VirtualDom.map; -var _elm_lang$virtual_dom$VirtualDom$text = _elm_lang$virtual_dom$Native_VirtualDom.text; -var _elm_lang$virtual_dom$VirtualDom$node = _elm_lang$virtual_dom$Native_VirtualDom.node; -var _elm_lang$virtual_dom$VirtualDom$Options = F2( - function (a, b) { - return {stopPropagation: a, preventDefault: b}; - }); -var _elm_lang$virtual_dom$VirtualDom$Node = {ctor: 'Node'}; -var _elm_lang$virtual_dom$VirtualDom$Property = {ctor: 'Property'}; - -var _elm_lang$html$Html$programWithFlags = _elm_lang$virtual_dom$VirtualDom$programWithFlags; -var _elm_lang$html$Html$program = _elm_lang$virtual_dom$VirtualDom$program; -var _elm_lang$html$Html$beginnerProgram = function (_p0) { - var _p1 = _p0; - return _elm_lang$html$Html$program( - { - init: A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _p1.model, - {ctor: '[]'}), - update: F2( - function (msg, model) { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - A2(_p1.update, msg, model), - {ctor: '[]'}); - }), - view: _p1.view, - subscriptions: function (_p2) { - return _elm_lang$core$Platform_Sub$none; - } - }); -}; -var _elm_lang$html$Html$map = _elm_lang$virtual_dom$VirtualDom$map; -var _elm_lang$html$Html$text = _elm_lang$virtual_dom$VirtualDom$text; -var _elm_lang$html$Html$node = _elm_lang$virtual_dom$VirtualDom$node; -var _elm_lang$html$Html$body = _elm_lang$html$Html$node('body'); -var _elm_lang$html$Html$section = _elm_lang$html$Html$node('section'); -var _elm_lang$html$Html$nav = _elm_lang$html$Html$node('nav'); -var _elm_lang$html$Html$article = _elm_lang$html$Html$node('article'); -var _elm_lang$html$Html$aside = _elm_lang$html$Html$node('aside'); -var _elm_lang$html$Html$h1 = _elm_lang$html$Html$node('h1'); -var _elm_lang$html$Html$h2 = _elm_lang$html$Html$node('h2'); -var _elm_lang$html$Html$h3 = _elm_lang$html$Html$node('h3'); -var _elm_lang$html$Html$h4 = _elm_lang$html$Html$node('h4'); -var _elm_lang$html$Html$h5 = _elm_lang$html$Html$node('h5'); -var _elm_lang$html$Html$h6 = _elm_lang$html$Html$node('h6'); -var _elm_lang$html$Html$header = _elm_lang$html$Html$node('header'); -var _elm_lang$html$Html$footer = _elm_lang$html$Html$node('footer'); -var _elm_lang$html$Html$address = _elm_lang$html$Html$node('address'); -var _elm_lang$html$Html$main_ = _elm_lang$html$Html$node('main'); -var _elm_lang$html$Html$p = _elm_lang$html$Html$node('p'); -var _elm_lang$html$Html$hr = _elm_lang$html$Html$node('hr'); -var _elm_lang$html$Html$pre = _elm_lang$html$Html$node('pre'); -var _elm_lang$html$Html$blockquote = _elm_lang$html$Html$node('blockquote'); -var _elm_lang$html$Html$ol = _elm_lang$html$Html$node('ol'); -var _elm_lang$html$Html$ul = _elm_lang$html$Html$node('ul'); -var _elm_lang$html$Html$li = _elm_lang$html$Html$node('li'); -var _elm_lang$html$Html$dl = _elm_lang$html$Html$node('dl'); -var _elm_lang$html$Html$dt = _elm_lang$html$Html$node('dt'); -var _elm_lang$html$Html$dd = _elm_lang$html$Html$node('dd'); -var _elm_lang$html$Html$figure = _elm_lang$html$Html$node('figure'); -var _elm_lang$html$Html$figcaption = _elm_lang$html$Html$node('figcaption'); -var _elm_lang$html$Html$div = _elm_lang$html$Html$node('div'); -var _elm_lang$html$Html$a = _elm_lang$html$Html$node('a'); -var _elm_lang$html$Html$em = _elm_lang$html$Html$node('em'); -var _elm_lang$html$Html$strong = _elm_lang$html$Html$node('strong'); -var _elm_lang$html$Html$small = _elm_lang$html$Html$node('small'); -var _elm_lang$html$Html$s = _elm_lang$html$Html$node('s'); -var _elm_lang$html$Html$cite = _elm_lang$html$Html$node('cite'); -var _elm_lang$html$Html$q = _elm_lang$html$Html$node('q'); -var _elm_lang$html$Html$dfn = _elm_lang$html$Html$node('dfn'); -var _elm_lang$html$Html$abbr = _elm_lang$html$Html$node('abbr'); -var _elm_lang$html$Html$time = _elm_lang$html$Html$node('time'); -var _elm_lang$html$Html$code = _elm_lang$html$Html$node('code'); -var _elm_lang$html$Html$var = _elm_lang$html$Html$node('var'); -var _elm_lang$html$Html$samp = _elm_lang$html$Html$node('samp'); -var _elm_lang$html$Html$kbd = _elm_lang$html$Html$node('kbd'); -var _elm_lang$html$Html$sub = _elm_lang$html$Html$node('sub'); -var _elm_lang$html$Html$sup = _elm_lang$html$Html$node('sup'); -var _elm_lang$html$Html$i = _elm_lang$html$Html$node('i'); -var _elm_lang$html$Html$b = _elm_lang$html$Html$node('b'); -var _elm_lang$html$Html$u = _elm_lang$html$Html$node('u'); -var _elm_lang$html$Html$mark = _elm_lang$html$Html$node('mark'); -var _elm_lang$html$Html$ruby = _elm_lang$html$Html$node('ruby'); -var _elm_lang$html$Html$rt = _elm_lang$html$Html$node('rt'); -var _elm_lang$html$Html$rp = _elm_lang$html$Html$node('rp'); -var _elm_lang$html$Html$bdi = _elm_lang$html$Html$node('bdi'); -var _elm_lang$html$Html$bdo = _elm_lang$html$Html$node('bdo'); -var _elm_lang$html$Html$span = _elm_lang$html$Html$node('span'); -var _elm_lang$html$Html$br = _elm_lang$html$Html$node('br'); -var _elm_lang$html$Html$wbr = _elm_lang$html$Html$node('wbr'); -var _elm_lang$html$Html$ins = _elm_lang$html$Html$node('ins'); -var _elm_lang$html$Html$del = _elm_lang$html$Html$node('del'); -var _elm_lang$html$Html$img = _elm_lang$html$Html$node('img'); -var _elm_lang$html$Html$iframe = _elm_lang$html$Html$node('iframe'); -var _elm_lang$html$Html$embed = _elm_lang$html$Html$node('embed'); -var _elm_lang$html$Html$object = _elm_lang$html$Html$node('object'); -var _elm_lang$html$Html$param = _elm_lang$html$Html$node('param'); -var _elm_lang$html$Html$video = _elm_lang$html$Html$node('video'); -var _elm_lang$html$Html$audio = _elm_lang$html$Html$node('audio'); -var _elm_lang$html$Html$source = _elm_lang$html$Html$node('source'); -var _elm_lang$html$Html$track = _elm_lang$html$Html$node('track'); -var _elm_lang$html$Html$canvas = _elm_lang$html$Html$node('canvas'); -var _elm_lang$html$Html$math = _elm_lang$html$Html$node('math'); -var _elm_lang$html$Html$table = _elm_lang$html$Html$node('table'); -var _elm_lang$html$Html$caption = _elm_lang$html$Html$node('caption'); -var _elm_lang$html$Html$colgroup = _elm_lang$html$Html$node('colgroup'); -var _elm_lang$html$Html$col = _elm_lang$html$Html$node('col'); -var _elm_lang$html$Html$tbody = _elm_lang$html$Html$node('tbody'); -var _elm_lang$html$Html$thead = _elm_lang$html$Html$node('thead'); -var _elm_lang$html$Html$tfoot = _elm_lang$html$Html$node('tfoot'); -var _elm_lang$html$Html$tr = _elm_lang$html$Html$node('tr'); -var _elm_lang$html$Html$td = _elm_lang$html$Html$node('td'); -var _elm_lang$html$Html$th = _elm_lang$html$Html$node('th'); -var _elm_lang$html$Html$form = _elm_lang$html$Html$node('form'); -var _elm_lang$html$Html$fieldset = _elm_lang$html$Html$node('fieldset'); -var _elm_lang$html$Html$legend = _elm_lang$html$Html$node('legend'); -var _elm_lang$html$Html$label = _elm_lang$html$Html$node('label'); -var _elm_lang$html$Html$input = _elm_lang$html$Html$node('input'); -var _elm_lang$html$Html$button = _elm_lang$html$Html$node('button'); -var _elm_lang$html$Html$select = _elm_lang$html$Html$node('select'); -var _elm_lang$html$Html$datalist = _elm_lang$html$Html$node('datalist'); -var _elm_lang$html$Html$optgroup = _elm_lang$html$Html$node('optgroup'); -var _elm_lang$html$Html$option = _elm_lang$html$Html$node('option'); -var _elm_lang$html$Html$textarea = _elm_lang$html$Html$node('textarea'); -var _elm_lang$html$Html$keygen = _elm_lang$html$Html$node('keygen'); -var _elm_lang$html$Html$output = _elm_lang$html$Html$node('output'); -var _elm_lang$html$Html$progress = _elm_lang$html$Html$node('progress'); -var _elm_lang$html$Html$meter = _elm_lang$html$Html$node('meter'); -var _elm_lang$html$Html$details = _elm_lang$html$Html$node('details'); -var _elm_lang$html$Html$summary = _elm_lang$html$Html$node('summary'); -var _elm_lang$html$Html$menuitem = _elm_lang$html$Html$node('menuitem'); -var _elm_lang$html$Html$menu = _elm_lang$html$Html$node('menu'); - -var _elm_lang$html$Html_Attributes$map = _elm_lang$virtual_dom$VirtualDom$mapProperty; -var _elm_lang$html$Html_Attributes$attribute = _elm_lang$virtual_dom$VirtualDom$attribute; -var _elm_lang$html$Html_Attributes$contextmenu = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'contextmenu', value); -}; -var _elm_lang$html$Html_Attributes$draggable = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'draggable', value); -}; -var _elm_lang$html$Html_Attributes$itemprop = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'itemprop', value); -}; -var _elm_lang$html$Html_Attributes$tabindex = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'tabIndex', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$charset = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'charset', value); -}; -var _elm_lang$html$Html_Attributes$height = function (value) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'height', - _elm_lang$core$Basics$toString(value)); -}; -var _elm_lang$html$Html_Attributes$width = function (value) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'width', - _elm_lang$core$Basics$toString(value)); -}; -var _elm_lang$html$Html_Attributes$formaction = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'formAction', value); -}; -var _elm_lang$html$Html_Attributes$list = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'list', value); -}; -var _elm_lang$html$Html_Attributes$minlength = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'minLength', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$maxlength = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'maxlength', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$size = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'size', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$form = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'form', value); -}; -var _elm_lang$html$Html_Attributes$cols = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'cols', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$rows = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'rows', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$challenge = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'challenge', value); -}; -var _elm_lang$html$Html_Attributes$media = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'media', value); -}; -var _elm_lang$html$Html_Attributes$rel = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'rel', value); -}; -var _elm_lang$html$Html_Attributes$datetime = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'datetime', value); -}; -var _elm_lang$html$Html_Attributes$pubdate = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'pubdate', value); -}; -var _elm_lang$html$Html_Attributes$colspan = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'colspan', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$rowspan = function (n) { - return A2( - _elm_lang$html$Html_Attributes$attribute, - 'rowspan', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$manifest = function (value) { - return A2(_elm_lang$html$Html_Attributes$attribute, 'manifest', value); -}; -var _elm_lang$html$Html_Attributes$property = _elm_lang$virtual_dom$VirtualDom$property; -var _elm_lang$html$Html_Attributes$stringProperty = F2( - function (name, string) { - return A2( - _elm_lang$html$Html_Attributes$property, - name, - _elm_lang$core$Json_Encode$string(string)); - }); -var _elm_lang$html$Html_Attributes$class = function (name) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'className', name); -}; -var _elm_lang$html$Html_Attributes$id = function (name) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'id', name); -}; -var _elm_lang$html$Html_Attributes$title = function (name) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'title', name); -}; -var _elm_lang$html$Html_Attributes$accesskey = function ($char) { - return A2( - _elm_lang$html$Html_Attributes$stringProperty, - 'accessKey', - _elm_lang$core$String$fromChar($char)); -}; -var _elm_lang$html$Html_Attributes$dir = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dir', value); -}; -var _elm_lang$html$Html_Attributes$dropzone = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dropzone', value); -}; -var _elm_lang$html$Html_Attributes$lang = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'lang', value); -}; -var _elm_lang$html$Html_Attributes$content = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'content', value); -}; -var _elm_lang$html$Html_Attributes$httpEquiv = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'httpEquiv', value); -}; -var _elm_lang$html$Html_Attributes$language = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'language', value); -}; -var _elm_lang$html$Html_Attributes$src = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'src', value); -}; -var _elm_lang$html$Html_Attributes$alt = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'alt', value); -}; -var _elm_lang$html$Html_Attributes$preload = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'preload', value); -}; -var _elm_lang$html$Html_Attributes$poster = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'poster', value); -}; -var _elm_lang$html$Html_Attributes$kind = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'kind', value); -}; -var _elm_lang$html$Html_Attributes$srclang = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srclang', value); -}; -var _elm_lang$html$Html_Attributes$sandbox = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'sandbox', value); -}; -var _elm_lang$html$Html_Attributes$srcdoc = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srcdoc', value); -}; -var _elm_lang$html$Html_Attributes$type_ = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'type', value); -}; -var _elm_lang$html$Html_Attributes$value = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'value', value); -}; -var _elm_lang$html$Html_Attributes$defaultValue = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'defaultValue', value); -}; -var _elm_lang$html$Html_Attributes$placeholder = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'placeholder', value); -}; -var _elm_lang$html$Html_Attributes$accept = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'accept', value); -}; -var _elm_lang$html$Html_Attributes$acceptCharset = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'acceptCharset', value); -}; -var _elm_lang$html$Html_Attributes$action = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'action', value); -}; -var _elm_lang$html$Html_Attributes$autocomplete = function (bool) { - return A2( - _elm_lang$html$Html_Attributes$stringProperty, - 'autocomplete', - bool ? 'on' : 'off'); -}; -var _elm_lang$html$Html_Attributes$enctype = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'enctype', value); -}; -var _elm_lang$html$Html_Attributes$method = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'method', value); -}; -var _elm_lang$html$Html_Attributes$name = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'name', value); -}; -var _elm_lang$html$Html_Attributes$pattern = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'pattern', value); -}; -var _elm_lang$html$Html_Attributes$for = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'htmlFor', value); -}; -var _elm_lang$html$Html_Attributes$max = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'max', value); -}; -var _elm_lang$html$Html_Attributes$min = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'min', value); -}; -var _elm_lang$html$Html_Attributes$step = function (n) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'step', n); -}; -var _elm_lang$html$Html_Attributes$wrap = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'wrap', value); -}; -var _elm_lang$html$Html_Attributes$usemap = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'useMap', value); -}; -var _elm_lang$html$Html_Attributes$shape = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'shape', value); -}; -var _elm_lang$html$Html_Attributes$coords = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'coords', value); -}; -var _elm_lang$html$Html_Attributes$keytype = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'keytype', value); -}; -var _elm_lang$html$Html_Attributes$align = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'align', value); -}; -var _elm_lang$html$Html_Attributes$cite = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'cite', value); -}; -var _elm_lang$html$Html_Attributes$href = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'href', value); -}; -var _elm_lang$html$Html_Attributes$target = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'target', value); -}; -var _elm_lang$html$Html_Attributes$downloadAs = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'download', value); -}; -var _elm_lang$html$Html_Attributes$hreflang = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'hreflang', value); -}; -var _elm_lang$html$Html_Attributes$ping = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'ping', value); -}; -var _elm_lang$html$Html_Attributes$start = function (n) { - return A2( - _elm_lang$html$Html_Attributes$stringProperty, - 'start', - _elm_lang$core$Basics$toString(n)); -}; -var _elm_lang$html$Html_Attributes$headers = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'headers', value); -}; -var _elm_lang$html$Html_Attributes$scope = function (value) { - return A2(_elm_lang$html$Html_Attributes$stringProperty, 'scope', value); -}; -var _elm_lang$html$Html_Attributes$boolProperty = F2( - function (name, bool) { - return A2( - _elm_lang$html$Html_Attributes$property, - name, - _elm_lang$core$Json_Encode$bool(bool)); - }); -var _elm_lang$html$Html_Attributes$hidden = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'hidden', bool); -}; -var _elm_lang$html$Html_Attributes$contenteditable = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'contentEditable', bool); -}; -var _elm_lang$html$Html_Attributes$spellcheck = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'spellcheck', bool); -}; -var _elm_lang$html$Html_Attributes$async = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'async', bool); -}; -var _elm_lang$html$Html_Attributes$defer = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'defer', bool); -}; -var _elm_lang$html$Html_Attributes$scoped = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'scoped', bool); -}; -var _elm_lang$html$Html_Attributes$autoplay = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autoplay', bool); -}; -var _elm_lang$html$Html_Attributes$controls = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'controls', bool); -}; -var _elm_lang$html$Html_Attributes$loop = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'loop', bool); -}; -var _elm_lang$html$Html_Attributes$default = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'default', bool); -}; -var _elm_lang$html$Html_Attributes$seamless = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'seamless', bool); -}; -var _elm_lang$html$Html_Attributes$checked = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'checked', bool); -}; -var _elm_lang$html$Html_Attributes$selected = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'selected', bool); -}; -var _elm_lang$html$Html_Attributes$autofocus = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autofocus', bool); -}; -var _elm_lang$html$Html_Attributes$disabled = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'disabled', bool); -}; -var _elm_lang$html$Html_Attributes$multiple = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'multiple', bool); -}; -var _elm_lang$html$Html_Attributes$novalidate = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'noValidate', bool); -}; -var _elm_lang$html$Html_Attributes$readonly = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'readOnly', bool); -}; -var _elm_lang$html$Html_Attributes$required = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'required', bool); -}; -var _elm_lang$html$Html_Attributes$ismap = function (value) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'isMap', value); -}; -var _elm_lang$html$Html_Attributes$download = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'download', bool); -}; -var _elm_lang$html$Html_Attributes$reversed = function (bool) { - return A2(_elm_lang$html$Html_Attributes$boolProperty, 'reversed', bool); -}; -var _elm_lang$html$Html_Attributes$classList = function (list) { - return _elm_lang$html$Html_Attributes$class( - A2( - _elm_lang$core$String$join, - ' ', - A2( - _elm_lang$core$List$map, - _elm_lang$core$Tuple$first, - A2(_elm_lang$core$List$filter, _elm_lang$core$Tuple$second, list)))); -}; -var _elm_lang$html$Html_Attributes$style = _elm_lang$virtual_dom$VirtualDom$style; - -var _elm_lang$html$Html_Events$keyCode = A2(_elm_lang$core$Json_Decode$field, 'keyCode', _elm_lang$core$Json_Decode$int); -var _elm_lang$html$Html_Events$targetChecked = A2( - _elm_lang$core$Json_Decode$at, - { - ctor: '::', - _0: 'target', - _1: { - ctor: '::', - _0: 'checked', - _1: {ctor: '[]'} - } - }, - _elm_lang$core$Json_Decode$bool); -var _elm_lang$html$Html_Events$targetValue = A2( - _elm_lang$core$Json_Decode$at, - { - ctor: '::', - _0: 'target', - _1: { - ctor: '::', - _0: 'value', - _1: {ctor: '[]'} - } - }, - _elm_lang$core$Json_Decode$string); -var _elm_lang$html$Html_Events$defaultOptions = _elm_lang$virtual_dom$VirtualDom$defaultOptions; -var _elm_lang$html$Html_Events$onWithOptions = _elm_lang$virtual_dom$VirtualDom$onWithOptions; -var _elm_lang$html$Html_Events$on = _elm_lang$virtual_dom$VirtualDom$on; -var _elm_lang$html$Html_Events$onFocus = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'focus', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onBlur = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'blur', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onSubmitOptions = _elm_lang$core$Native_Utils.update( - _elm_lang$html$Html_Events$defaultOptions, - {preventDefault: true}); -var _elm_lang$html$Html_Events$onSubmit = function (msg) { - return A3( - _elm_lang$html$Html_Events$onWithOptions, - 'submit', - _elm_lang$html$Html_Events$onSubmitOptions, - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onCheck = function (tagger) { - return A2( - _elm_lang$html$Html_Events$on, - 'change', - A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetChecked)); -}; -var _elm_lang$html$Html_Events$onInput = function (tagger) { - return A2( - _elm_lang$html$Html_Events$on, - 'input', - A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetValue)); -}; -var _elm_lang$html$Html_Events$onMouseOut = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseout', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseOver = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseover', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseLeave = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseleave', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseEnter = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseenter', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseUp = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mouseup', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onMouseDown = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'mousedown', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onDoubleClick = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'dblclick', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$onClick = function (msg) { - return A2( - _elm_lang$html$Html_Events$on, - 'click', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$html$Html_Events$Options = F2( - function (a, b) { - return {stopPropagation: a, preventDefault: b}; - }); - -var _elm_lang$websocket$Native_WebSocket = function() { - -function open(url, settings) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) - { - try - { - var socket = new WebSocket(url); - socket.elm_web_socket = true; - } - catch(err) - { - return callback(_elm_lang$core$Native_Scheduler.fail({ - ctor: err.name === 'SecurityError' ? 'BadSecurity' : 'BadArgs', - _0: err.message - })); - } - - socket.addEventListener("open", function(event) { - callback(_elm_lang$core$Native_Scheduler.succeed(socket)); - }); - - socket.addEventListener("message", function(event) { - _elm_lang$core$Native_Scheduler.rawSpawn(A2(settings.onMessage, socket, event.data)); - }); - - socket.addEventListener("close", function(event) { - _elm_lang$core$Native_Scheduler.rawSpawn(settings.onClose({ - code: event.code, - reason: event.reason, - wasClean: event.wasClean - })); - }); - - return function() - { - if (socket && socket.close) - { - socket.close(); - } - }; - }); -} - -function send(socket, string) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) - { - var result = - socket.readyState === WebSocket.OPEN - ? _elm_lang$core$Maybe$Nothing - : _elm_lang$core$Maybe$Just({ ctor: 'NotOpen' }); - - try - { - socket.send(string); - } - catch(err) - { - result = _elm_lang$core$Maybe$Just({ ctor: 'BadString' }); - } - - callback(_elm_lang$core$Native_Scheduler.succeed(result)); - }); -} - -function close(code, reason, socket) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { - try - { - socket.close(code, reason); - } - catch(err) - { - return callback(_elm_lang$core$Native_Scheduler.fail(_elm_lang$core$Maybe$Just({ - ctor: err.name === 'SyntaxError' ? 'BadReason' : 'BadCode' - }))); - } - callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Maybe$Nothing)); - }); -} - -function bytesQueued(socket) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { - callback(_elm_lang$core$Native_Scheduler.succeed(socket.bufferedAmount)); - }); -} - -return { - open: F2(open), - send: F2(send), - close: F3(close), - bytesQueued: bytesQueued -}; - -}(); - -var _elm_lang$websocket$WebSocket_LowLevel$bytesQueued = _elm_lang$websocket$Native_WebSocket.bytesQueued; -var _elm_lang$websocket$WebSocket_LowLevel$send = _elm_lang$websocket$Native_WebSocket.send; -var _elm_lang$websocket$WebSocket_LowLevel$closeWith = _elm_lang$websocket$Native_WebSocket.close; -var _elm_lang$websocket$WebSocket_LowLevel$close = function (socket) { - return A2( - _elm_lang$core$Task$map, - _elm_lang$core$Basics$always( - {ctor: '_Tuple0'}), - A3(_elm_lang$websocket$WebSocket_LowLevel$closeWith, 1000, '', socket)); -}; -var _elm_lang$websocket$WebSocket_LowLevel$open = _elm_lang$websocket$Native_WebSocket.open; -var _elm_lang$websocket$WebSocket_LowLevel$Settings = F2( - function (a, b) { - return {onMessage: a, onClose: b}; - }); -var _elm_lang$websocket$WebSocket_LowLevel$WebSocket = {ctor: 'WebSocket'}; -var _elm_lang$websocket$WebSocket_LowLevel$BadArgs = {ctor: 'BadArgs'}; -var _elm_lang$websocket$WebSocket_LowLevel$BadSecurity = {ctor: 'BadSecurity'}; -var _elm_lang$websocket$WebSocket_LowLevel$BadReason = {ctor: 'BadReason'}; -var _elm_lang$websocket$WebSocket_LowLevel$BadCode = {ctor: 'BadCode'}; -var _elm_lang$websocket$WebSocket_LowLevel$BadString = {ctor: 'BadString'}; -var _elm_lang$websocket$WebSocket_LowLevel$NotOpen = {ctor: 'NotOpen'}; - -var _elm_lang$websocket$WebSocket$closeConnection = function (connection) { - var _p0 = connection; - if (_p0.ctor === 'Opening') { - return _elm_lang$core$Process$kill(_p0._1); - } else { - return _elm_lang$websocket$WebSocket_LowLevel$close(_p0._0); - } -}; -var _elm_lang$websocket$WebSocket$after = function (backoff) { - return (_elm_lang$core$Native_Utils.cmp(backoff, 1) < 0) ? _elm_lang$core$Task$succeed( - {ctor: '_Tuple0'}) : _elm_lang$core$Process$sleep( - _elm_lang$core$Basics$toFloat( - 10 * Math.pow(2, backoff))); -}; -var _elm_lang$websocket$WebSocket$removeQueue = F2( - function (name, state) { - return _elm_lang$core$Native_Utils.update( - state, - { - queues: A2(_elm_lang$core$Dict$remove, name, state.queues) - }); - }); -var _elm_lang$websocket$WebSocket$updateSocket = F3( - function (name, connection, state) { - return _elm_lang$core$Native_Utils.update( - state, - { - sockets: A3(_elm_lang$core$Dict$insert, name, connection, state.sockets) - }); - }); -var _elm_lang$websocket$WebSocket$add = F2( - function (value, maybeList) { - var _p1 = maybeList; - if (_p1.ctor === 'Nothing') { - return _elm_lang$core$Maybe$Just( - { - ctor: '::', - _0: value, - _1: {ctor: '[]'} - }); - } else { - return _elm_lang$core$Maybe$Just( - {ctor: '::', _0: value, _1: _p1._0}); - } - }); -var _elm_lang$websocket$WebSocket$buildSubDict = F2( - function (subs, dict) { - buildSubDict: - while (true) { - var _p2 = subs; - if (_p2.ctor === '[]') { - return dict; - } else { - if (_p2._0.ctor === 'Listen') { - var _v3 = _p2._1, - _v4 = A3( - _elm_lang$core$Dict$update, - _p2._0._0, - _elm_lang$websocket$WebSocket$add(_p2._0._1), - dict); - subs = _v3; - dict = _v4; - continue buildSubDict; - } else { - var _v5 = _p2._1, - _v6 = A3( - _elm_lang$core$Dict$update, - _p2._0._0, - function (_p3) { - return _elm_lang$core$Maybe$Just( - A2( - _elm_lang$core$Maybe$withDefault, - {ctor: '[]'}, - _p3)); - }, - dict); - subs = _v5; - dict = _v6; - continue buildSubDict; - } - } - } - }); -var _elm_lang$websocket$WebSocket_ops = _elm_lang$websocket$WebSocket_ops || {}; -_elm_lang$websocket$WebSocket_ops['&>'] = F2( - function (t1, t2) { - return A2( - _elm_lang$core$Task$andThen, - function (_p4) { - return t2; - }, - t1); - }); -var _elm_lang$websocket$WebSocket$sendMessagesHelp = F3( - function (cmds, socketsDict, queuesDict) { - sendMessagesHelp: - while (true) { - var _p5 = cmds; - if (_p5.ctor === '[]') { - return _elm_lang$core$Task$succeed(queuesDict); - } else { - var _p9 = _p5._1; - var _p8 = _p5._0._0; - var _p7 = _p5._0._1; - var _p6 = A2(_elm_lang$core$Dict$get, _p8, socketsDict); - if ((_p6.ctor === 'Just') && (_p6._0.ctor === 'Connected')) { - return A2( - _elm_lang$websocket$WebSocket_ops['&>'], - A2(_elm_lang$websocket$WebSocket_LowLevel$send, _p6._0._0, _p7), - A3(_elm_lang$websocket$WebSocket$sendMessagesHelp, _p9, socketsDict, queuesDict)); - } else { - var _v9 = _p9, - _v10 = socketsDict, - _v11 = A3( - _elm_lang$core$Dict$update, - _p8, - _elm_lang$websocket$WebSocket$add(_p7), - queuesDict); - cmds = _v9; - socketsDict = _v10; - queuesDict = _v11; - continue sendMessagesHelp; - } - } - } - }); -var _elm_lang$websocket$WebSocket$subscription = _elm_lang$core$Native_Platform.leaf('WebSocket'); -var _elm_lang$websocket$WebSocket$command = _elm_lang$core$Native_Platform.leaf('WebSocket'); -var _elm_lang$websocket$WebSocket$State = F3( - function (a, b, c) { - return {sockets: a, queues: b, subs: c}; - }); -var _elm_lang$websocket$WebSocket$init = _elm_lang$core$Task$succeed( - A3(_elm_lang$websocket$WebSocket$State, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty)); -var _elm_lang$websocket$WebSocket$Send = F2( - function (a, b) { - return {ctor: 'Send', _0: a, _1: b}; - }); -var _elm_lang$websocket$WebSocket$send = F2( - function (url, message) { - return _elm_lang$websocket$WebSocket$command( - A2(_elm_lang$websocket$WebSocket$Send, url, message)); - }); -var _elm_lang$websocket$WebSocket$cmdMap = F2( - function (_p11, _p10) { - var _p12 = _p10; - return A2(_elm_lang$websocket$WebSocket$Send, _p12._0, _p12._1); - }); -var _elm_lang$websocket$WebSocket$KeepAlive = function (a) { - return {ctor: 'KeepAlive', _0: a}; -}; -var _elm_lang$websocket$WebSocket$keepAlive = function (url) { - return _elm_lang$websocket$WebSocket$subscription( - _elm_lang$websocket$WebSocket$KeepAlive(url)); -}; -var _elm_lang$websocket$WebSocket$Listen = F2( - function (a, b) { - return {ctor: 'Listen', _0: a, _1: b}; - }); -var _elm_lang$websocket$WebSocket$listen = F2( - function (url, tagger) { - return _elm_lang$websocket$WebSocket$subscription( - A2(_elm_lang$websocket$WebSocket$Listen, url, tagger)); - }); -var _elm_lang$websocket$WebSocket$subMap = F2( - function (func, sub) { - var _p13 = sub; - if (_p13.ctor === 'Listen') { - return A2( - _elm_lang$websocket$WebSocket$Listen, - _p13._0, - function (_p14) { - return func( - _p13._1(_p14)); - }); - } else { - return _elm_lang$websocket$WebSocket$KeepAlive(_p13._0); - } - }); -var _elm_lang$websocket$WebSocket$Connected = function (a) { - return {ctor: 'Connected', _0: a}; -}; -var _elm_lang$websocket$WebSocket$Opening = F2( - function (a, b) { - return {ctor: 'Opening', _0: a, _1: b}; - }); -var _elm_lang$websocket$WebSocket$BadOpen = function (a) { - return {ctor: 'BadOpen', _0: a}; -}; -var _elm_lang$websocket$WebSocket$GoodOpen = F2( - function (a, b) { - return {ctor: 'GoodOpen', _0: a, _1: b}; - }); -var _elm_lang$websocket$WebSocket$Die = function (a) { - return {ctor: 'Die', _0: a}; -}; -var _elm_lang$websocket$WebSocket$Receive = F2( - function (a, b) { - return {ctor: 'Receive', _0: a, _1: b}; - }); -var _elm_lang$websocket$WebSocket$open = F2( - function (name, router) { - return A2( - _elm_lang$websocket$WebSocket_LowLevel$open, - name, - { - onMessage: F2( - function (_p15, msg) { - return A2( - _elm_lang$core$Platform$sendToSelf, - router, - A2(_elm_lang$websocket$WebSocket$Receive, name, msg)); - }), - onClose: function (details) { - return A2( - _elm_lang$core$Platform$sendToSelf, - router, - _elm_lang$websocket$WebSocket$Die(name)); - } - }); - }); -var _elm_lang$websocket$WebSocket$attemptOpen = F3( - function (router, backoff, name) { - var badOpen = function (_p16) { - return A2( - _elm_lang$core$Platform$sendToSelf, - router, - _elm_lang$websocket$WebSocket$BadOpen(name)); - }; - var goodOpen = function (ws) { - return A2( - _elm_lang$core$Platform$sendToSelf, - router, - A2(_elm_lang$websocket$WebSocket$GoodOpen, name, ws)); - }; - var actuallyAttemptOpen = A2( - _elm_lang$core$Task$onError, - badOpen, - A2( - _elm_lang$core$Task$andThen, - goodOpen, - A2(_elm_lang$websocket$WebSocket$open, name, router))); - return _elm_lang$core$Process$spawn( - A2( - _elm_lang$websocket$WebSocket_ops['&>'], - _elm_lang$websocket$WebSocket$after(backoff), - actuallyAttemptOpen)); - }); -var _elm_lang$websocket$WebSocket$onEffects = F4( - function (router, cmds, subs, state) { - var newSubs = A2(_elm_lang$websocket$WebSocket$buildSubDict, subs, _elm_lang$core$Dict$empty); - var cleanup = function (newQueues) { - var rightStep = F3( - function (name, connection, getNewSockets) { - return A2( - _elm_lang$websocket$WebSocket_ops['&>'], - _elm_lang$websocket$WebSocket$closeConnection(connection), - getNewSockets); - }); - var bothStep = F4( - function (name, _p17, connection, getNewSockets) { - return A2( - _elm_lang$core$Task$map, - A2(_elm_lang$core$Dict$insert, name, connection), - getNewSockets); - }); - var leftStep = F3( - function (name, _p18, getNewSockets) { - return A2( - _elm_lang$core$Task$andThen, - function (newSockets) { - return A2( - _elm_lang$core$Task$andThen, - function (pid) { - return _elm_lang$core$Task$succeed( - A3( - _elm_lang$core$Dict$insert, - name, - A2(_elm_lang$websocket$WebSocket$Opening, 0, pid), - newSockets)); - }, - A3(_elm_lang$websocket$WebSocket$attemptOpen, router, 0, name)); - }, - getNewSockets); - }); - var newEntries = A2( - _elm_lang$core$Dict$union, - newQueues, - A2( - _elm_lang$core$Dict$map, - F2( - function (k, v) { - return {ctor: '[]'}; - }), - newSubs)); - var collectNewSockets = A6( - _elm_lang$core$Dict$merge, - leftStep, - bothStep, - rightStep, - newEntries, - state.sockets, - _elm_lang$core$Task$succeed(_elm_lang$core$Dict$empty)); - return A2( - _elm_lang$core$Task$andThen, - function (newSockets) { - return _elm_lang$core$Task$succeed( - A3(_elm_lang$websocket$WebSocket$State, newSockets, newQueues, newSubs)); - }, - collectNewSockets); - }; - var sendMessagesGetNewQueues = A3(_elm_lang$websocket$WebSocket$sendMessagesHelp, cmds, state.sockets, state.queues); - return A2(_elm_lang$core$Task$andThen, cleanup, sendMessagesGetNewQueues); - }); -var _elm_lang$websocket$WebSocket$onSelfMsg = F3( - function (router, selfMsg, state) { - var _p19 = selfMsg; - switch (_p19.ctor) { - case 'Receive': - var sends = A2( - _elm_lang$core$List$map, - function (tagger) { - return A2( - _elm_lang$core$Platform$sendToApp, - router, - tagger(_p19._1)); - }, - A2( - _elm_lang$core$Maybe$withDefault, - {ctor: '[]'}, - A2(_elm_lang$core$Dict$get, _p19._0, state.subs))); - return A2( - _elm_lang$websocket$WebSocket_ops['&>'], - _elm_lang$core$Task$sequence(sends), - _elm_lang$core$Task$succeed(state)); - case 'Die': - var _p21 = _p19._0; - var _p20 = A2(_elm_lang$core$Dict$get, _p21, state.sockets); - if (_p20.ctor === 'Nothing') { - return _elm_lang$core$Task$succeed(state); - } else { - return A2( - _elm_lang$core$Task$andThen, - function (pid) { - return _elm_lang$core$Task$succeed( - A3( - _elm_lang$websocket$WebSocket$updateSocket, - _p21, - A2(_elm_lang$websocket$WebSocket$Opening, 0, pid), - state)); - }, - A3(_elm_lang$websocket$WebSocket$attemptOpen, router, 0, _p21)); - } - case 'GoodOpen': - var _p24 = _p19._1; - var _p23 = _p19._0; - var _p22 = A2(_elm_lang$core$Dict$get, _p23, state.queues); - if (_p22.ctor === 'Nothing') { - return _elm_lang$core$Task$succeed( - A3( - _elm_lang$websocket$WebSocket$updateSocket, - _p23, - _elm_lang$websocket$WebSocket$Connected(_p24), - state)); - } else { - return A3( - _elm_lang$core$List$foldl, - F2( - function (msg, task) { - return A2( - _elm_lang$websocket$WebSocket_ops['&>'], - A2(_elm_lang$websocket$WebSocket_LowLevel$send, _p24, msg), - task); - }), - _elm_lang$core$Task$succeed( - A2( - _elm_lang$websocket$WebSocket$removeQueue, - _p23, - A3( - _elm_lang$websocket$WebSocket$updateSocket, - _p23, - _elm_lang$websocket$WebSocket$Connected(_p24), - state))), - _p22._0); - } - default: - var _p27 = _p19._0; - var _p25 = A2(_elm_lang$core$Dict$get, _p27, state.sockets); - if (_p25.ctor === 'Nothing') { - return _elm_lang$core$Task$succeed(state); - } else { - if (_p25._0.ctor === 'Opening') { - var _p26 = _p25._0._0; - return A2( - _elm_lang$core$Task$andThen, - function (pid) { - return _elm_lang$core$Task$succeed( - A3( - _elm_lang$websocket$WebSocket$updateSocket, - _p27, - A2(_elm_lang$websocket$WebSocket$Opening, _p26 + 1, pid), - state)); - }, - A3(_elm_lang$websocket$WebSocket$attemptOpen, router, _p26 + 1, _p27)); - } else { - return _elm_lang$core$Task$succeed(state); - } - } - } - }); -_elm_lang$core$Native_Platform.effectManagers['WebSocket'] = {pkg: 'elm-lang/websocket', init: _elm_lang$websocket$WebSocket$init, onEffects: _elm_lang$websocket$WebSocket$onEffects, onSelfMsg: _elm_lang$websocket$WebSocket$onSelfMsg, tag: 'fx', cmdMap: _elm_lang$websocket$WebSocket$cmdMap, subMap: _elm_lang$websocket$WebSocket$subMap}; - -var _user$project$Main$filterChoiceView = F3( - function (filter, currentFilters, action) { - var active = A2(_elm_lang$core$List$member, filter, currentFilters); - var notActive = !active; - return A2( - _elm_lang$html$Html$li, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'filter-choice-active', _1: active}, - _1: {ctor: '[]'} - } - } - }), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Events$onClick( - action(filter)), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$span, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$i, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa-minus', _1: active}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa-plus', _1: notActive}, - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - }, - {ctor: '[]'}), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text( - A2(_elm_lang$core$Basics_ops['++'], ' ', filter.name)), - _1: {ctor: '[]'} - } - }), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }); - }); -var _user$project$Main$filterView = F4( - function (name, possibleFilters, currentFilters, action) { - return A2( - _elm_lang$html$Html$div, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text( - A2(_elm_lang$core$Basics_ops['++'], name, ':')), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$ul, - {ctor: '[]'}, - A2( - _elm_lang$core$List$map, - function (filter) { - return A3(_user$project$Main$filterChoiceView, filter, currentFilters, action); - }, - possibleFilters)), - _1: {ctor: '[]'} - } - }); - }); -var _user$project$Main$dayEventInstanceView = function (eventInstance) { - return A2( - _elm_lang$html$Html$a, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('event'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'background-color', _1: eventInstance.backgroundColor}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'color', _1: eventInstance.forgroundColor}, - _1: {ctor: '[]'} - } - }), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$small, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text( - A2( - _elm_lang$core$Basics_ops['++'], - A3(_elm_lang$core$String$slice, 11, 16, eventInstance.from), - A2( - _elm_lang$core$Basics_ops['++'], - ' - ', - A3(_elm_lang$core$String$slice, 11, 16, eventInstance.to)))), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$i, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: A2(_elm_lang$core$Basics_ops['++'], 'fa-', eventInstance.locationIcon), - _1: true - }, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true}, - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - }, - {ctor: '[]'}), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$p, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text(eventInstance.title), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - } - }); -}; -var _user$project$Main$dayRowView = F2( - function (day, model) { - var locations = A2( - _elm_lang$core$List$map, - function (eventLocation) { - return eventLocation.slug; - }, - _elm_lang$core$List$isEmpty(model.filter.eventLocations) ? model.eventLocations : model.filter.eventLocations); - var types = A2( - _elm_lang$core$List$map, - function (eventType) { - return eventType.slug; - }, - _elm_lang$core$List$isEmpty(model.filter.eventTypes) ? model.eventTypes : model.filter.eventTypes); - var filteredEventInstances = A2( - _elm_lang$core$List$filter, - function (eventInstance) { - return _elm_lang$core$Native_Utils.eq( - A3(_elm_lang$core$String$slice, 0, 10, eventInstance.from), - day.iso) && (A2(_elm_lang$core$List$member, eventInstance.location, locations) && A2(_elm_lang$core$List$member, eventInstance.eventType, types)); - }, - model.eventInstances); - return A2( - _elm_lang$html$Html$div, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$h4, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text(day.repr), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('schedule-day-row'), - _1: {ctor: '[]'} - }, - A2(_elm_lang$core$List$map, _user$project$Main$dayEventInstanceView, filteredEventInstances)), - _1: {ctor: '[]'} - } - }); - }); -var _user$project$Main$scheduleServer = 'ws://localhost:8000/schedule/'; -var _user$project$Main$sendInitMessage = function (camp_slug) { - return A2( - _elm_lang$websocket$WebSocket$send, - _user$project$Main$scheduleServer, - A2( - _elm_lang$core$Json_Encode$encode, - 0, - _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'action', - _1: _elm_lang$core$Json_Encode$string('init') - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'camp_slug', - _1: _elm_lang$core$Json_Encode$string(camp_slug) - }, - _1: {ctor: '[]'} - } - }))); -}; -var _user$project$Main$Model = F7( - function (a, b, c, d, e, f, g) { - return {days: a, eventInstances: b, eventLocations: c, eventTypes: d, flags: e, activeDay: f, filter: g}; - }); -var _user$project$Main$Filter = F2( - function (a, b) { - return {eventTypes: a, eventLocations: b}; - }); -var _user$project$Main$Day = F3( - function (a, b, c) { - return {day_name: a, iso: b, repr: c}; - }); -var _user$project$Main$allDaysDay = A3(_user$project$Main$Day, 'All Days', '', ''); -var _user$project$Main$init = function (flags) { - return { - ctor: '_Tuple2', - _0: A7( - _user$project$Main$Model, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}, - flags, - _user$project$Main$allDaysDay, - A2( - _user$project$Main$Filter, - {ctor: '[]'}, - {ctor: '[]'})), - _1: _user$project$Main$sendInitMessage(flags.camp_slug) - }; -}; -var _user$project$Main$dayDecoder = A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'repr', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'iso', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'day_name', - _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$Day)))); -var _user$project$Main$Speaker = F2( - function (a, b) { - return {name: a, url: b}; - }); -var _user$project$Main$speakerDecoder = A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'url', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'name', - _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$Speaker))); -var _user$project$Main$EventInstance = function (a) { - return function (b) { - return function (c) { - return function (d) { - return function (e) { - return function (f) { - return function (g) { - return function (h) { - return function (i) { - return function (j) { - return function (k) { - return function (l) { - return function (m) { - return function (n) { - return function (o) { - return function (p) { - return {title: a, id: b, url: c, $abstract: d, eventSlug: e, eventType: f, backgroundColor: g, forgroundColor: h, from: i, to: j, timeslots: k, location: l, locationIcon: m, speakers: n, videoRecording: o, videoUrl: p}; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; - }; -}; -var _user$project$Main$eventInstanceDecoder = A4( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, - 'video_url', - _elm_lang$core$Json_Decode$string, - '', - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'video_recording', - _elm_lang$core$Json_Decode$bool, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'speakers', - _elm_lang$core$Json_Decode$list(_user$project$Main$speakerDecoder), - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'location_icon', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'location', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'timeslots', - _elm_lang$core$Json_Decode$float, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'to', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'from', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'fg-color', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'bg-color', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_type', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_slug', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'abstract', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'url', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'id', - _elm_lang$core$Json_Decode$int, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'title', - _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$EventInstance))))))))))))))))); -var _user$project$Main$EventLocation = F3( - function (a, b, c) { - return {name: a, slug: b, icon: c}; - }); -var _user$project$Main$eventLocationDecoder = A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'icon', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'slug', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'name', - _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$EventLocation)))); -var _user$project$Main$EventType = F4( - function (a, b, c, d) { - return {name: a, slug: b, color: c, lightText: d}; - }); -var _user$project$Main$eventTypeDecoder = A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'light_text', - _elm_lang$core$Json_Decode$bool, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'color', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'slug', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'name', - _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$EventType))))); -var _user$project$Main$initDataDecoder = A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_types', - _elm_lang$core$Json_Decode$list(_user$project$Main$eventTypeDecoder), - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_locations', - _elm_lang$core$Json_Decode$list(_user$project$Main$eventLocationDecoder), - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_instances', - _elm_lang$core$Json_Decode$list(_user$project$Main$eventInstanceDecoder), - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'days', - _elm_lang$core$Json_Decode$list(_user$project$Main$dayDecoder), - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Main$Model))))); -var _user$project$Main$update = F2( - function (msg, model) { - var _p0 = msg; - switch (_p0.ctor) { - case 'NoOp': - return {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; - case 'WebSocketPayload': - var newModel = function () { - var _p1 = A2(_elm_lang$core$Json_Decode$decodeString, _user$project$Main$initDataDecoder, _p0._0); - if (_p1.ctor === 'Ok') { - return A3( - _p1._0, - model.flags, - _user$project$Main$allDaysDay, - A2( - _user$project$Main$Filter, - {ctor: '[]'}, - {ctor: '[]'})); - } else { - return model; - } - }(); - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - newModel, - {ctor: '[]'}); - case 'MakeActiveday': - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {activeDay: _p0._0}), - {ctor: '[]'}); - case 'ToggleEventTypeFilter': - var _p2 = _p0._0; - var currentFilter = model.filter; - var eventTypesFilter = A2(_elm_lang$core$List$member, _p2, model.filter.eventTypes) ? A2( - _elm_lang$core$List$filter, - function (x) { - return !_elm_lang$core$Native_Utils.eq(x, _p2); - }, - model.filter.eventTypes) : {ctor: '::', _0: _p2, _1: model.filter.eventTypes}; - var newFilter = _elm_lang$core$Native_Utils.update( - currentFilter, - {eventTypes: eventTypesFilter}); - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {filter: newFilter}), - {ctor: '[]'}); - default: - var _p3 = _p0._0; - var currentFilter = model.filter; - var eventLocationsFilter = A2(_elm_lang$core$List$member, _p3, model.filter.eventLocations) ? A2( - _elm_lang$core$List$filter, - function (x) { - return !_elm_lang$core$Native_Utils.eq(x, _p3); - }, - model.filter.eventLocations) : {ctor: '::', _0: _p3, _1: model.filter.eventLocations}; - var newFilter = _elm_lang$core$Native_Utils.update( - currentFilter, - {eventLocations: eventLocationsFilter}); - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {filter: newFilter}), - {ctor: '[]'}); - } - }); -var _user$project$Main$Flags = F4( - function (a, b, c, d) { - return {schedule_timeslot_length_minutes: a, schedule_midnight_offset_hours: b, ics_button_href: c, camp_slug: d}; - }); -var _user$project$Main$ToggleEventLocationFilter = function (a) { - return {ctor: 'ToggleEventLocationFilter', _0: a}; -}; -var _user$project$Main$ToggleEventTypeFilter = function (a) { - return {ctor: 'ToggleEventTypeFilter', _0: a}; -}; -var _user$project$Main$MakeActiveday = function (a) { - return {ctor: 'MakeActiveday', _0: a}; -}; -var _user$project$Main$dayButton = F2( - function (day, activeDay) { - return A2( - _elm_lang$html$Html$a, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'btn-default', - _1: !_elm_lang$core$Native_Utils.eq(day, activeDay) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'btn-primary', - _1: _elm_lang$core$Native_Utils.eq(day, activeDay) - }, - _1: {ctor: '[]'} - } - } - }), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Events$onClick( - _user$project$Main$MakeActiveday(day)), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$html$Html$text(day.day_name), - _1: {ctor: '[]'} - }); - }); -var _user$project$Main$view = function (model) { - return A2( - _elm_lang$html$Html$div, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('row'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$id('schedule-days'), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('btn-group'), - _1: {ctor: '[]'} - } - }, - A2( - _elm_lang$core$List$map, - function (day) { - return A2(_user$project$Main$dayButton, day, model.activeDay); - }, - {ctor: '::', _0: _user$project$Main$allDaysDay, _1: model.days})), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$hr, - {ctor: '[]'}, - {ctor: '[]'}), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('row'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'col-sm-3', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'col-sm-push-9', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'schedule-filter', _1: true}, - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$h4, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('Filter'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('form-group'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A4(_user$project$Main$filterView, 'Type', model.eventTypes, model.filter.eventTypes, _user$project$Main$ToggleEventTypeFilter), - _1: { - ctor: '::', - _0: A4(_user$project$Main$filterView, 'Location', model.eventLocations, model.filter.eventLocations, _user$project$Main$ToggleEventLocationFilter), - _1: {ctor: '[]'} - } - }), - _1: {ctor: '[]'} - } - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'col-sm-9', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'col-sm-pull-3', _1: true}, - _1: {ctor: '[]'} - } - }), - _1: {ctor: '[]'} - }, - A2( - _elm_lang$core$List$map, - function (day) { - return A2(_user$project$Main$dayRowView, day, model); - }, - model.days)), - _1: {ctor: '[]'} - } - }), - _1: {ctor: '[]'} - } - } - }); -}; -var _user$project$Main$WebSocketPayload = function (a) { - return {ctor: 'WebSocketPayload', _0: a}; -}; -var _user$project$Main$subscriptions = function (model) { - return A2(_elm_lang$websocket$WebSocket$listen, _user$project$Main$scheduleServer, _user$project$Main$WebSocketPayload); -}; -var _user$project$Main$main = _elm_lang$html$Html$programWithFlags( - {init: _user$project$Main$init, view: _user$project$Main$view, update: _user$project$Main$update, subscriptions: _user$project$Main$subscriptions})( - A2( - _elm_lang$core$Json_Decode$andThen, - function (camp_slug) { - return A2( - _elm_lang$core$Json_Decode$andThen, - function (ics_button_href) { - return A2( - _elm_lang$core$Json_Decode$andThen, - function (schedule_midnight_offset_hours) { - return A2( - _elm_lang$core$Json_Decode$andThen, - function (schedule_timeslot_length_minutes) { - return _elm_lang$core$Json_Decode$succeed( - {camp_slug: camp_slug, ics_button_href: ics_button_href, schedule_midnight_offset_hours: schedule_midnight_offset_hours, schedule_timeslot_length_minutes: schedule_timeslot_length_minutes}); - }, - A2(_elm_lang$core$Json_Decode$field, 'schedule_timeslot_length_minutes', _elm_lang$core$Json_Decode$int)); - }, - A2(_elm_lang$core$Json_Decode$field, 'schedule_midnight_offset_hours', _elm_lang$core$Json_Decode$int)); - }, - A2(_elm_lang$core$Json_Decode$field, 'ics_button_href', _elm_lang$core$Json_Decode$string)); - }, - A2(_elm_lang$core$Json_Decode$field, 'camp_slug', _elm_lang$core$Json_Decode$string))); -var _user$project$Main$NoOp = {ctor: 'NoOp'}; - -var Elm = {}; -Elm['Main'] = Elm['Main'] || {}; -if (typeof _user$project$Main$main !== 'undefined') { - _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Main.Msg":{"args":[],"tags":{"MakeActiveday":["Main.Day"],"WebSocketPayload":["String"],"ToggleEventLocationFilter":["Main.EventLocation"],"NoOp":[],"ToggleEventTypeFilter":["Main.EventType"]}}},"aliases":{"Main.Day":{"args":[],"type":"{ day_name : String, iso : String, repr : String }"},"Main.EventType":{"args":[],"type":"{ name : String, slug : String, color : String, lightText : Bool }"},"Main.EventLocation":{"args":[],"type":"{ name : String, slug : String, icon : String }"}},"message":"Main.Msg"},"versions":{"elm":"0.18.0"}}); -} - -if (typeof define === "function" && define['amd']) -{ - define([], function() { return Elm; }); - return; -} - -if (typeof module === "object") -{ - module['exports'] = Elm; - return; -} - -var globalElm = this['Elm']; -if (typeof globalElm === "undefined") -{ - this['Elm'] = Elm; - return; -} - -for (var publicModule in Elm) -{ - if (publicModule in globalElm) - { - throw new Error('There are two Elm modules called `' + publicModule + '` on this page! Rename one of them.'); - } - globalElm[publicModule] = Elm[publicModule]; -} - -}).call(this); - From 9b36959057f14c2865ea8ba2a693974fbdf9981a Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 16 Jul 2017 14:37:38 +0200 Subject: [PATCH 06/54] Remove that javascript garbage. --- .../static/js/event_instance_websocket.js | 552 ------------------ 1 file changed, 552 deletions(-) delete mode 100644 src/program/static/js/event_instance_websocket.js diff --git a/src/program/static/js/event_instance_websocket.js b/src/program/static/js/event_instance_websocket.js deleted file mode 100644 index f6ed297b..00000000 --- a/src/program/static/js/event_instance_websocket.js +++ /dev/null @@ -1,552 +0,0 @@ -const webSocketBridge = new channels.WebSocketBridge(); -var modals = {}; -var EVENT_INSTANCES = [], DAYS = [], CONFIG = {}; - -function toggleFavoriteButton(button) { - if(button.getAttribute('data-state') == 'true') { - favorite_button.classList.remove('btn-success'); - favorite_button.classList.add('btn-danger'); - favorite_button.innerHTML = ' Remove favorite'; - - favorite_button.onclick = function(e) { - button.setAttribute('data-state', 'false') - webSocketBridge.send({action: 'unfavorite', event_instance_id: event_instance_id}); - toggleFavoriteButton(button) - } - } else { - favorite_button.classList.remove('btn-danger'); - favorite_button.classList.add('btn-success'); - favorite_button.innerHTML = ' Favorite'; - - favorite_button.onclick = function(e) { - button.setAttribute('data-state', 'true') - webSocketBridge.send({action: 'favorite', event_instance_id: event_instance_id}); - toggleFavoriteButton(button) - } - - } -} - -function setup_websocket() { - webSocketBridge.connect('/schedule/'); - webSocketBridge.listen(function(payload, stream) { - if(payload['action'] == 'init') { - EVENT_INSTANCES = payload['event_instances']; - DAYS = payload['days']; - render(); - } - }); -} - -function init(config) { - CONFIG = config; - setup_websocket(); - render(); -} - -function findGetParameter(parameterName) { - var result = null, - tmp = []; - location.search - .substr(1) - .split("&") - .forEach(function (item) { - tmp = item.split("="); - if (tmp[0] === parameterName) { - result = decodeURIComponent(tmp[1]); - } - }); - return result; -} - -function get_parameters() { - - var day_parameter = findGetParameter('day'); - var filter_day = day_parameter != null ? day_parameter.split(',') : []; - var type_parameter = findGetParameter('type'); - var filter_types = type_parameter != null ? type_parameter.split(',') : []; - var location_parameter = findGetParameter('location') - var filter_locations = location_parameter != null ? location_parameter.split(',') : []; - - return { - 'day': filter_day[0], - 'types': filter_types, - 'locations': filter_locations - } -} - -function render() { - parameters = get_parameters(); - toggleFilterBoxes(parameters['types'], parameters['locations']); - render_day_menu(parameters['day']); - setICSButtonHref(location.search); - - if(parameters['day'] != null) { - render_day(parameters['types'], parameters['locations'], parameters['day']); - } else { - render_schedule(parameters['types'], parameters['locations']); - } -} - -function render_day_menu(active_iso) { - var container = document.getElementById('schedule-days'); - container.innerHTML = ''; - - var mobile_container = document.getElementById('schedule-days-mobile'); - mobile_container.innerHTML = ''; - - function set_btn_type(classList, primary) { - if(primary == true) { - classList.add('btn-primary'); - } else { - classList.add('btn-default'); - } - } - - function dayEvent(e) { - setHistoryState({ - 'day': this.dataset.iso - }); - render(); - } - - var all_days = document.createElement('a'); - all_days.classList.add('btn'); - set_btn_type(all_days.classList, active_iso == null); - all_days.innerHTML = 'All days'; - all_days.dataset.iso = 'all-days'; - all_days.addEventListener('click', dayEvent); - container.appendChild(all_days); - - all_days_mobile = all_days.cloneNode(true); - all_days_mobile.addEventListener('click', dayEvent); - mobile_container.appendChild(all_days_mobile); - - for(var day_id in DAYS) { - var day_link = document.createElement('a'); - day_link.classList.add('btn'); - set_btn_type(day_link.classList, DAYS[day_id]['iso'] == active_iso); - day_link.dataset.iso = DAYS[day_id]['iso']; - day_link.innerHTML = DAYS[day_id]['day_name']; - - day_link.addEventListener('click', dayEvent); - container.appendChild(day_link); - - day_link_mobile = day_link.cloneNode(true); - day_link_mobile.addEventListener('click', dayEvent); - mobile_container.appendChild(day_link_mobile); - } -} - -function render_day(types, locations, day) { - - function hoursTohhmm(hours){ - var hour = Math.floor(Math.abs(hours)); - var minutes = Math.floor((Math.abs(hours) * 60) % 60); - if(hour > 24) { - hour = hour - 24; - } - return (hour < 10 ? "0" : "") + hour + ":" + (minutes < 10 ? "0" : "") + minutes; - } - - var event_instances = get_instances(types, locations, day); - var schedule_container = document.getElementById('schedule-container'); - schedule_container.innerHTML = ''; - - var day_table = document.createElement('table'); - schedule_container.appendChild(day_table); - day_table.classList.add('table'); - day_table.classList.add('day-table'); - day_table_body = document.createElement('tbody'); - day_table.appendChild(day_table_body); - - var array_length = (24*60)/CONFIG['schedule_timeslot_length_minutes']; - var timeslots_ = Array(array_length); - var timeslots = []; - for(var i=0; i 0) { - var type_part = 'type=' + types; - query = query + type_part + "&"; - } - - locations = locations == undefined ? findGetParameter('location') : locations.join(','); - if(locations != null && locations.length > 0) { - var location_part = 'location=' + locations; - query = query + location_part; - } - - history.replaceState({}, '', query); - setICSButtonHref(query); -} - -function setICSButtonHref(query) { - // Update ICS button as well - var ics_button = document.querySelector('#ics-button'); - ics_button.setAttribute('href', CONFIG['ics_button_href'] + query); -} - -function toggleFilterBoxes(types, locations) { - var type_input = Array.prototype.slice.call(document.querySelectorAll('.event-type-checkbox')); - type_input.map(function(box) { - if(types.includes(box.value)) { - box.checked = true; - } - return box; - }); - var location_input = Array.prototype.slice.call(document.querySelectorAll('.location-checkbox')); - location_input.map(function(box) { - if(locations.includes(box.value)) { - box.checked = true; - } - return box; - }); -} From 543347aaffd8cee7e6a20c3372800b3a1105ae76 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 16 Jul 2017 17:32:26 +0200 Subject: [PATCH 07/54] Adding detail view for event intances. --- schedule/Main.elm | 97 +++++++++++++++++++++++++-------- schedule/elm-package.json | 3 +- src/static_src/css/bornhack.css | 3 +- 3 files changed, 77 insertions(+), 26 deletions(-) diff --git a/schedule/Main.elm b/schedule/Main.elm index d3dcb8f6..0062bc98 100644 --- a/schedule/Main.elm +++ b/schedule/Main.elm @@ -7,6 +7,7 @@ import WebSocket exposing (listen) import Json.Decode exposing (int, string, float, list, bool, Decoder) import Json.Encode import Json.Decode.Pipeline exposing (decode, required, optional, hardcoded) +import Markdown main : Program Flags Model Msg @@ -36,6 +37,7 @@ type alias Model = , flags : Flags , activeDay : Day , filter : Filter + , activeEventInstance : Maybe EventInstance } @@ -108,7 +110,7 @@ allDaysDay = init : Flags -> ( Model, Cmd Msg ) init flags = - ( Model [] [] [] [] flags allDaysDay (Filter [] []), sendInitMessage flags.camp_slug ) + ( Model [] [] [] [] flags allDaysDay (Filter [] []) Nothing, sendInitMessage flags.camp_slug ) sendInitMessage : String -> Cmd Msg @@ -133,6 +135,8 @@ type Msg | MakeActiveday Day | ToggleEventTypeFilter EventType | ToggleEventLocationFilter EventLocation + | OpenEventInstanceDetail EventInstance + | CloseEventInstanceDetail update : Msg -> Model -> ( Model, Cmd Msg ) @@ -146,7 +150,7 @@ update msg model = newModel = case Json.Decode.decodeString initDataDecoder str of Ok m -> - m model.flags allDaysDay (Filter [] []) + m model.flags allDaysDay (Filter [] []) Nothing Err error -> model @@ -188,6 +192,12 @@ update msg model = in { model | filter = newFilter } ! [] + OpenEventInstanceDetail eventInstance -> + { model | activeEventInstance = Just eventInstance } ! [] + + CloseEventInstanceDetail -> + { model | activeEventInstance = Nothing } ! [] + -- SUBSCRIPTIONS @@ -255,7 +265,7 @@ eventTypeDecoder = |> required "light_text" bool -initDataDecoder : Decoder (Flags -> Day -> Filter -> Model) +initDataDecoder : Decoder (Flags -> Day -> Filter -> Maybe EventInstance -> Model) initDataDecoder = decode Model |> required "days" (list dayDecoder) @@ -290,28 +300,60 @@ view model = (List.map (\day -> dayButton day model.activeDay) (allDaysDay :: model.days)) ] , hr [] [] - , div [ class "row" ] - [ div - [ classList - [ ( "col-sm-3", True ) - , ( "col-sm-push-9", True ) - , ( "schedule-filter", True ) - ] + , case model.activeEventInstance of + Just eventInstance -> + eventInstanceDetailView eventInstance + + Nothing -> + scheduleOverviewView model + ] + + +eventInstanceDetailView : EventInstance -> Html Msg +eventInstanceDetailView eventInstance = + div [ class "row" ] + [ div [ class "col-sm-9" ] + [ div [ onClick CloseEventInstanceDetail ] + [ text "Back" ] - [ h4 [] [ text "Filter" ] - , div [ class "form-group" ] - [ filterView "Type" model.eventTypes model.filter.eventTypes ToggleEventTypeFilter - , filterView "Location" model.eventLocations model.filter.eventLocations ToggleEventLocationFilter - ] - ] - , div - [ classList - [ ( "col-sm-9", True ) - , ( "col-sm-pull-3", True ) - ] - ] - (List.map (\day -> dayRowView day model) model.days) + , h4 [] [ text eventInstance.title ] + , p [] [ Markdown.toHtml [] eventInstance.abstract ] ] + , div + [ classList + [ ( "col-sm-3", True ) + , ( "schedule-sidebar", True ) + ] + ] + [ h4 [] [ text "Speakers" ] + ] + ] + + +scheduleOverviewView : Model -> Html Msg +scheduleOverviewView model = + div [ class "row" ] + [ div + [ classList + [ ( "col-sm-3", True ) + , ( "col-sm-push-9", True ) + , ( "schedule-sidebar", True ) + , ( "schedule-filter", True ) + ] + ] + [ h4 [] [ text "Filter" ] + , div [ class "form-group" ] + [ filterView "Type" model.eventTypes model.filter.eventTypes ToggleEventTypeFilter + , filterView "Location" model.eventLocations model.filter.eventLocations ToggleEventLocationFilter + ] + ] + , div + [ classList + [ ( "col-sm-9", True ) + , ( "col-sm-pull-3", True ) + ] + ] + (List.map (\day -> dayRowView day model) model.days) ] @@ -353,7 +395,14 @@ dayRowView day model = dayEventInstanceView : EventInstance -> Html Msg dayEventInstanceView eventInstance = - a [ class "event", style [ ( "background-color", eventInstance.backgroundColor ), ( "color", eventInstance.forgroundColor ) ] ] + a + [ class "event" + , onClick (OpenEventInstanceDetail eventInstance) + , style + [ ( "background-color", eventInstance.backgroundColor ) + , ( "color", eventInstance.forgroundColor ) + ] + ] [ small [] [ text ((String.slice 11 16 eventInstance.from) ++ " - " ++ (String.slice 11 16 eventInstance.to)) ] , i [ classList [ ( "fa", True ), ( "fa-" ++ eventInstance.locationIcon, True ), ( "pull-right", True ) ] ] [] diff --git a/schedule/elm-package.json b/schedule/elm-package.json index d17058e1..1400efe5 100644 --- a/schedule/elm-package.json +++ b/schedule/elm-package.json @@ -11,7 +11,8 @@ "NoRedInk/elm-decode-pipeline": "3.0.0 <= v < 4.0.0", "elm-lang/core": "5.1.1 <= v < 6.0.0", "elm-lang/html": "2.0.0 <= v < 3.0.0", - "elm-lang/websocket": "1.0.2 <= v < 2.0.0" + "elm-lang/websocket": "1.0.2 <= v < 2.0.0", + "evancz/elm-markdown": "3.0.2 <= v < 4.0.0" }, "elm-version": "0.18.0 <= v < 0.19.0" } diff --git a/src/static_src/css/bornhack.css b/src/static_src/css/bornhack.css index 2132be61..105e0b59 100644 --- a/src/static_src/css/bornhack.css +++ b/src/static_src/css/bornhack.css @@ -1,6 +1,7 @@ body { margin-top: 85px; margin-bottom: 35px; + overflow: scroll; } * { @@ -215,7 +216,7 @@ footer { @media (min-width: 520px) { - .schedule-filter { + .schedule-sidebar { border-left: 1px solid #eee; } } From b0086d6a8184f68496aa228d5c12a6dc01b132d3 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 16 Jul 2017 18:22:19 +0200 Subject: [PATCH 08/54] Adding routing so event instances are accessable directly. --- schedule/Main.elm | 143 ++++++++++++++++++++++++++++---------- schedule/elm-package.json | 4 +- 2 files changed, 108 insertions(+), 39 deletions(-) diff --git a/schedule/Main.elm b/schedule/Main.elm index 0062bc98..e79a26f2 100644 --- a/schedule/Main.elm +++ b/schedule/Main.elm @@ -1,18 +1,21 @@ module Main exposing (..) import Html exposing (Html, Attribute, div, input, text, li, ul, a, h4, label, i, span, hr, small, p) -import Html.Attributes exposing (class, classList, id, type_, for, style) +import Html.Attributes exposing (class, classList, id, type_, for, style, href) import Html.Events exposing (onClick) import WebSocket exposing (listen) import Json.Decode exposing (int, string, float, list, bool, Decoder) import Json.Encode import Json.Decode.Pipeline exposing (decode, required, optional, hardcoded) import Markdown +import Navigation exposing (Location) +import UrlParser exposing (()) main : Program Flags Model Msg main = - Html.programWithFlags + Navigation.programWithFlags + OnLocationChange { init = init , view = view , update = update @@ -26,6 +29,34 @@ scheduleServer = +-- ROUTING + + +type Route + = OverviewRoute + | EventInstanceRoute EventInstanceId + | NotFoundRoute + + +matchers : UrlParser.Parser (Route -> a) a +matchers = + UrlParser.oneOf + [ UrlParser.map OverviewRoute UrlParser.top + , UrlParser.map EventInstanceRoute (UrlParser.s "event" UrlParser.int) + ] + + +parseLocation : Location -> Route +parseLocation location = + case UrlParser.parseHash matchers location of + Just route -> + route + + Nothing -> + NotFoundRoute + + + -- MODEL @@ -37,7 +68,7 @@ type alias Model = , flags : Flags , activeDay : Day , filter : Filter - , activeEventInstance : Maybe EventInstance + , route : Route } @@ -60,9 +91,13 @@ type alias Speaker = } +type alias EventInstanceId = + Int + + type alias EventInstance = { title : String - , id : Int + , id : EventInstanceId , url : String , abstract : String , eventSlug : String @@ -80,6 +115,26 @@ type alias EventInstance = } +emptyEventInstance = + { title = "This should not happen!" + , id = 0 + , url = "" + , abstract = "" + , eventSlug = "" + , eventType = "" + , backgroundColor = "" + , forgroundColor = "" + , from = "" + , to = "" + , timeslots = 0.0 + , location = "" + , locationIcon = "" + , speakers = [] + , videoRecording = False + , videoUrl = "" + } + + type alias EventLocation = { name : String , slug : String @@ -108,9 +163,9 @@ allDaysDay = Day "All Days" "" "" -init : Flags -> ( Model, Cmd Msg ) -init flags = - ( Model [] [] [] [] flags allDaysDay (Filter [] []) Nothing, sendInitMessage flags.camp_slug ) +init : Flags -> Location -> ( Model, Cmd Msg ) +init flags location = + ( Model [] [] [] [] flags allDaysDay (Filter [] []) (parseLocation location), sendInitMessage flags.camp_slug ) sendInitMessage : String -> Cmd Msg @@ -135,8 +190,7 @@ type Msg | MakeActiveday Day | ToggleEventTypeFilter EventType | ToggleEventLocationFilter EventLocation - | OpenEventInstanceDetail EventInstance - | CloseEventInstanceDetail + | OnLocationChange Location update : Msg -> Model -> ( Model, Cmd Msg ) @@ -150,7 +204,7 @@ update msg model = newModel = case Json.Decode.decodeString initDataDecoder str of Ok m -> - m model.flags allDaysDay (Filter [] []) Nothing + m model.flags allDaysDay (Filter [] []) model.route Err error -> model @@ -192,11 +246,12 @@ update msg model = in { model | filter = newFilter } ! [] - OpenEventInstanceDetail eventInstance -> - { model | activeEventInstance = Just eventInstance } ! [] - - CloseEventInstanceDetail -> - { model | activeEventInstance = Nothing } ! [] + OnLocationChange location -> + let + newRoute = + parseLocation location + in + { model | route = newRoute } ! [] @@ -265,7 +320,7 @@ eventTypeDecoder = |> required "light_text" bool -initDataDecoder : Decoder (Flags -> Day -> Filter -> Maybe EventInstance -> Model) +initDataDecoder : Decoder (Flags -> Day -> Filter -> Route -> Model) initDataDecoder = decode Model |> required "days" (list dayDecoder) @@ -300,34 +355,46 @@ view model = (List.map (\day -> dayButton day model.activeDay) (allDaysDay :: model.days)) ] , hr [] [] - , case model.activeEventInstance of - Just eventInstance -> - eventInstanceDetailView eventInstance - - Nothing -> + , case model.route of + OverviewRoute -> scheduleOverviewView model + + EventInstanceRoute eventInstanceId -> + eventInstanceDetailView eventInstanceId model.eventInstances + + NotFoundRoute -> + div [] [ text "Not found!" ] ] -eventInstanceDetailView : EventInstance -> Html Msg -eventInstanceDetailView eventInstance = - div [ class "row" ] - [ div [ class "col-sm-9" ] - [ div [ onClick CloseEventInstanceDetail ] - [ text "Back" +eventInstanceDetailView : EventInstanceId -> List EventInstance -> Html Msg +eventInstanceDetailView eventInstanceId eventInstances = + let + eventInstance = + case List.head (List.filter (\e -> e.id == eventInstanceId) eventInstances) of + Just eventInstance -> + eventInstance + + Nothing -> + emptyEventInstance + in + div [ class "row" ] + [ div [ class "col-sm-9" ] + [ a [ href "#" ] + [ text "Back" + ] + , h4 [] [ text eventInstance.title ] + , p [] [ Markdown.toHtml [] eventInstance.abstract ] ] - , h4 [] [ text eventInstance.title ] - , p [] [ Markdown.toHtml [] eventInstance.abstract ] - ] - , div - [ classList - [ ( "col-sm-3", True ) - , ( "schedule-sidebar", True ) + , div + [ classList + [ ( "col-sm-3", True ) + , ( "schedule-sidebar", True ) + ] + ] + [ h4 [] [ text "Speakers" ] ] ] - [ h4 [] [ text "Speakers" ] - ] - ] scheduleOverviewView : Model -> Html Msg @@ -397,7 +464,7 @@ dayEventInstanceView : EventInstance -> Html Msg dayEventInstanceView eventInstance = a [ class "event" - , onClick (OpenEventInstanceDetail eventInstance) + , href ("#event/" ++ (toString eventInstance.id)) , style [ ( "background-color", eventInstance.backgroundColor ) , ( "color", eventInstance.forgroundColor ) diff --git a/schedule/elm-package.json b/schedule/elm-package.json index 1400efe5..8dbc336d 100644 --- a/schedule/elm-package.json +++ b/schedule/elm-package.json @@ -11,8 +11,10 @@ "NoRedInk/elm-decode-pipeline": "3.0.0 <= v < 4.0.0", "elm-lang/core": "5.1.1 <= v < 6.0.0", "elm-lang/html": "2.0.0 <= v < 3.0.0", + "elm-lang/navigation": "2.1.0 <= v < 3.0.0", "elm-lang/websocket": "1.0.2 <= v < 2.0.0", - "evancz/elm-markdown": "3.0.2 <= v < 4.0.0" + "evancz/elm-markdown": "3.0.2 <= v < 4.0.0", + "evancz/url-parser": "2.0.1 <= v < 3.0.0" }, "elm-version": "0.18.0 <= v < 0.19.0" } From a5ef793dcf60c7cccd8dc130cf8335fb573f62e8 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 16 Jul 2017 18:31:29 +0200 Subject: [PATCH 09/54] Use a slug instead, makes for niccer urls --- schedule/Main.elm | 19 ++++++++++--------- schedule/Makefile | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/schedule/Main.elm b/schedule/Main.elm index e79a26f2..7219dd56 100644 --- a/schedule/Main.elm +++ b/schedule/Main.elm @@ -34,7 +34,7 @@ scheduleServer = type Route = OverviewRoute - | EventInstanceRoute EventInstanceId + | EventInstanceRoute EventInstanceSlug | NotFoundRoute @@ -42,7 +42,7 @@ matchers : UrlParser.Parser (Route -> a) a matchers = UrlParser.oneOf [ UrlParser.map OverviewRoute UrlParser.top - , UrlParser.map EventInstanceRoute (UrlParser.s "event" UrlParser.int) + , UrlParser.map EventInstanceRoute (UrlParser.s "event" UrlParser.string) ] @@ -91,16 +91,16 @@ type alias Speaker = } -type alias EventInstanceId = - Int +type alias EventInstanceSlug = + String type alias EventInstance = { title : String - , id : EventInstanceId + , id : Int , url : String , abstract : String - , eventSlug : String + , eventSlug : EventInstanceSlug , eventType : String , backgroundColor : String , forgroundColor : String @@ -115,6 +115,7 @@ type alias EventInstance = } +emptyEventInstance : EventInstance emptyEventInstance = { title = "This should not happen!" , id = 0 @@ -367,11 +368,11 @@ view model = ] -eventInstanceDetailView : EventInstanceId -> List EventInstance -> Html Msg +eventInstanceDetailView : EventInstanceSlug -> List EventInstance -> Html Msg eventInstanceDetailView eventInstanceId eventInstances = let eventInstance = - case List.head (List.filter (\e -> e.id == eventInstanceId) eventInstances) of + case List.head (List.filter (\e -> e.eventSlug == eventInstanceId) eventInstances) of Just eventInstance -> eventInstance @@ -464,7 +465,7 @@ dayEventInstanceView : EventInstance -> Html Msg dayEventInstanceView eventInstance = a [ class "event" - , href ("#event/" ++ (toString eventInstance.id)) + , href ("#event/" ++ eventInstance.eventSlug) , style [ ( "background-color", eventInstance.backgroundColor ) , ( "color", eventInstance.forgroundColor ) diff --git a/schedule/Makefile b/schedule/Makefile index 681e2bb6..5cfdeb9c 100644 --- a/schedule/Makefile +++ b/schedule/Makefile @@ -1,5 +1,5 @@ all: - elm-make Main.elm --output ../src/program/static/js/elm_based_schedule.js + elm-make Main.elm --warn --output ../src/program/static/js/elm_based_schedule.js debug: - elm-make Main.elm --debug --output ../src/program/static/js/elm_based_schedule.js + elm-make Main.elm --debug --warn --output ../src/program/static/js/elm_based_schedule.js From e8c0ab194196550be193d9154d6d25a46cd0f081 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Mon, 17 Jul 2017 11:25:57 +0200 Subject: [PATCH 10/54] Organized the code in a more sane manner. Also some websocket work. --- schedule/Main.elm | 523 ------------------- schedule/Makefile | 4 +- schedule/elm-package.json | 2 +- schedule/src/Decoders.elm | 95 ++++ schedule/src/Main.elm | 41 ++ schedule/src/Messages.elm | 19 + schedule/src/Models.elm | 126 +++++ schedule/src/Routing.elm | 30 ++ schedule/src/Update.elm | 110 ++++ schedule/src/Views.elm | 241 +++++++++ schedule/src/WebSocketCalls.elm | 42 ++ src/program/consumers.py | 29 +- src/program/models.py | 35 +- src/program/templates/schedule_overview.html | 2 +- 14 files changed, 751 insertions(+), 548 deletions(-) delete mode 100644 schedule/Main.elm create mode 100644 schedule/src/Decoders.elm create mode 100644 schedule/src/Main.elm create mode 100644 schedule/src/Messages.elm create mode 100644 schedule/src/Models.elm create mode 100644 schedule/src/Routing.elm create mode 100644 schedule/src/Update.elm create mode 100644 schedule/src/Views.elm create mode 100644 schedule/src/WebSocketCalls.elm diff --git a/schedule/Main.elm b/schedule/Main.elm deleted file mode 100644 index 7219dd56..00000000 --- a/schedule/Main.elm +++ /dev/null @@ -1,523 +0,0 @@ -module Main exposing (..) - -import Html exposing (Html, Attribute, div, input, text, li, ul, a, h4, label, i, span, hr, small, p) -import Html.Attributes exposing (class, classList, id, type_, for, style, href) -import Html.Events exposing (onClick) -import WebSocket exposing (listen) -import Json.Decode exposing (int, string, float, list, bool, Decoder) -import Json.Encode -import Json.Decode.Pipeline exposing (decode, required, optional, hardcoded) -import Markdown -import Navigation exposing (Location) -import UrlParser exposing (()) - - -main : Program Flags Model Msg -main = - Navigation.programWithFlags - OnLocationChange - { init = init - , view = view - , update = update - , subscriptions = subscriptions - } - - -scheduleServer : String -scheduleServer = - "ws://localhost:8000/schedule/" - - - --- ROUTING - - -type Route - = OverviewRoute - | EventInstanceRoute EventInstanceSlug - | NotFoundRoute - - -matchers : UrlParser.Parser (Route -> a) a -matchers = - UrlParser.oneOf - [ UrlParser.map OverviewRoute UrlParser.top - , UrlParser.map EventInstanceRoute (UrlParser.s "event" UrlParser.string) - ] - - -parseLocation : Location -> Route -parseLocation location = - case UrlParser.parseHash matchers location of - Just route -> - route - - Nothing -> - NotFoundRoute - - - --- MODEL - - -type alias Model = - { days : List Day - , eventInstances : List EventInstance - , eventLocations : List EventLocation - , eventTypes : List EventType - , flags : Flags - , activeDay : Day - , filter : Filter - , route : Route - } - - -type alias Filter = - { eventTypes : List EventType - , eventLocations : List EventLocation - } - - -type alias Day = - { day_name : String - , iso : String - , repr : String - } - - -type alias Speaker = - { name : String - , url : String - } - - -type alias EventInstanceSlug = - String - - -type alias EventInstance = - { title : String - , id : Int - , url : String - , abstract : String - , eventSlug : EventInstanceSlug - , eventType : String - , backgroundColor : String - , forgroundColor : String - , from : String - , to : String - , timeslots : Float - , location : String - , locationIcon : String - , speakers : List Speaker - , videoRecording : Bool - , videoUrl : String - } - - -emptyEventInstance : EventInstance -emptyEventInstance = - { title = "This should not happen!" - , id = 0 - , url = "" - , abstract = "" - , eventSlug = "" - , eventType = "" - , backgroundColor = "" - , forgroundColor = "" - , from = "" - , to = "" - , timeslots = 0.0 - , location = "" - , locationIcon = "" - , speakers = [] - , videoRecording = False - , videoUrl = "" - } - - -type alias EventLocation = - { name : String - , slug : String - , icon : String - } - - -type alias EventType = - { name : String - , slug : String - , color : String - , lightText : Bool - } - - -type alias Flags = - { schedule_timeslot_length_minutes : Int - , schedule_midnight_offset_hours : Int - , ics_button_href : String - , camp_slug : String - } - - -allDaysDay : Day -allDaysDay = - Day "All Days" "" "" - - -init : Flags -> Location -> ( Model, Cmd Msg ) -init flags location = - ( Model [] [] [] [] flags allDaysDay (Filter [] []) (parseLocation location), sendInitMessage flags.camp_slug ) - - -sendInitMessage : String -> Cmd Msg -sendInitMessage camp_slug = - WebSocket.send scheduleServer - (Json.Encode.encode 0 - (Json.Encode.object - [ ( "action", Json.Encode.string "init" ) - , ( "camp_slug", Json.Encode.string camp_slug ) - ] - ) - ) - - - --- UPDATE - - -type Msg - = NoOp - | WebSocketPayload String - | MakeActiveday Day - | ToggleEventTypeFilter EventType - | ToggleEventLocationFilter EventLocation - | OnLocationChange Location - - -update : Msg -> Model -> ( Model, Cmd Msg ) -update msg model = - case msg of - NoOp -> - ( model, Cmd.none ) - - WebSocketPayload str -> - let - newModel = - case Json.Decode.decodeString initDataDecoder str of - Ok m -> - m model.flags allDaysDay (Filter [] []) model.route - - Err error -> - model - in - newModel ! [] - - MakeActiveday day -> - { model | activeDay = day } ! [] - - ToggleEventTypeFilter eventType -> - let - eventTypesFilter = - if List.member eventType model.filter.eventTypes then - List.filter (\x -> x /= eventType) model.filter.eventTypes - else - eventType :: model.filter.eventTypes - - currentFilter = - model.filter - - newFilter = - { currentFilter | eventTypes = eventTypesFilter } - in - { model | filter = newFilter } ! [] - - ToggleEventLocationFilter eventLocation -> - let - eventLocationsFilter = - if List.member eventLocation model.filter.eventLocations then - List.filter (\x -> x /= eventLocation) model.filter.eventLocations - else - eventLocation :: model.filter.eventLocations - - currentFilter = - model.filter - - newFilter = - { currentFilter | eventLocations = eventLocationsFilter } - in - { model | filter = newFilter } ! [] - - OnLocationChange location -> - let - newRoute = - parseLocation location - in - { model | route = newRoute } ! [] - - - --- SUBSCRIPTIONS - - -subscriptions : Model -> Sub Msg -subscriptions model = - WebSocket.listen scheduleServer WebSocketPayload - - - --- DECODERS - - -dayDecoder : Decoder Day -dayDecoder = - decode Day - |> required "day_name" string - |> required "iso" string - |> required "repr" string - - -speakerDecoder : Decoder Speaker -speakerDecoder = - decode Speaker - |> required "name" string - |> required "url" string - - -eventInstanceDecoder : Decoder EventInstance -eventInstanceDecoder = - decode EventInstance - |> required "title" string - |> required "id" int - |> required "url" string - |> required "abstract" string - |> required "event_slug" string - |> required "event_type" string - |> required "bg-color" string - |> required "fg-color" string - |> required "from" string - |> required "to" string - |> required "timeslots" float - |> required "location" string - |> required "location_icon" string - |> required "speakers" (list speakerDecoder) - |> required "video_recording" bool - |> optional "video_url" string "" - - -eventLocationDecoder : Decoder EventLocation -eventLocationDecoder = - decode EventLocation - |> required "name" string - |> required "slug" string - |> required "icon" string - - -eventTypeDecoder : Decoder EventType -eventTypeDecoder = - decode EventType - |> required "name" string - |> required "slug" string - |> required "color" string - |> required "light_text" bool - - -initDataDecoder : Decoder (Flags -> Day -> Filter -> Route -> Model) -initDataDecoder = - decode Model - |> required "days" (list dayDecoder) - |> required "event_instances" (list eventInstanceDecoder) - |> required "event_locations" (list eventLocationDecoder) - |> required "event_types" (list eventTypeDecoder) - - - --- VIEW - - -dayButton : Day -> Day -> Html Msg -dayButton day activeDay = - a - [ classList - [ ( "btn", True ) - , ( "btn-default", day /= activeDay ) - , ( "btn-primary", day == activeDay ) - ] - , onClick (MakeActiveday day) - ] - [ text day.day_name - ] - - -view : Model -> Html Msg -view model = - div [] - [ div [ class "row" ] - [ div [ id "schedule-days", class "btn-group" ] - (List.map (\day -> dayButton day model.activeDay) (allDaysDay :: model.days)) - ] - , hr [] [] - , case model.route of - OverviewRoute -> - scheduleOverviewView model - - EventInstanceRoute eventInstanceId -> - eventInstanceDetailView eventInstanceId model.eventInstances - - NotFoundRoute -> - div [] [ text "Not found!" ] - ] - - -eventInstanceDetailView : EventInstanceSlug -> List EventInstance -> Html Msg -eventInstanceDetailView eventInstanceId eventInstances = - let - eventInstance = - case List.head (List.filter (\e -> e.eventSlug == eventInstanceId) eventInstances) of - Just eventInstance -> - eventInstance - - Nothing -> - emptyEventInstance - in - div [ class "row" ] - [ div [ class "col-sm-9" ] - [ a [ href "#" ] - [ text "Back" - ] - , h4 [] [ text eventInstance.title ] - , p [] [ Markdown.toHtml [] eventInstance.abstract ] - ] - , div - [ classList - [ ( "col-sm-3", True ) - , ( "schedule-sidebar", True ) - ] - ] - [ h4 [] [ text "Speakers" ] - ] - ] - - -scheduleOverviewView : Model -> Html Msg -scheduleOverviewView model = - div [ class "row" ] - [ div - [ classList - [ ( "col-sm-3", True ) - , ( "col-sm-push-9", True ) - , ( "schedule-sidebar", True ) - , ( "schedule-filter", True ) - ] - ] - [ h4 [] [ text "Filter" ] - , div [ class "form-group" ] - [ filterView "Type" model.eventTypes model.filter.eventTypes ToggleEventTypeFilter - , filterView "Location" model.eventLocations model.filter.eventLocations ToggleEventLocationFilter - ] - ] - , div - [ classList - [ ( "col-sm-9", True ) - , ( "col-sm-pull-3", True ) - ] - ] - (List.map (\day -> dayRowView day model) model.days) - ] - - -dayRowView : Day -> Model -> Html Msg -dayRowView day model = - let - types = - List.map (\eventType -> eventType.slug) - (if List.isEmpty model.filter.eventTypes then - model.eventTypes - else - model.filter.eventTypes - ) - - locations = - List.map (\eventLocation -> eventLocation.slug) - (if List.isEmpty model.filter.eventLocations then - model.eventLocations - else - model.filter.eventLocations - ) - - filteredEventInstances = - List.filter - (\eventInstance -> - ((String.slice 0 10 eventInstance.from) == day.iso) - && List.member eventInstance.location locations - && List.member eventInstance.eventType types - ) - model.eventInstances - in - div [] - [ h4 [] - [ text day.repr ] - , div [ class "schedule-day-row" ] - (List.map dayEventInstanceView filteredEventInstances) - ] - - -dayEventInstanceView : EventInstance -> Html Msg -dayEventInstanceView eventInstance = - a - [ class "event" - , href ("#event/" ++ eventInstance.eventSlug) - , style - [ ( "background-color", eventInstance.backgroundColor ) - , ( "color", eventInstance.forgroundColor ) - ] - ] - [ small [] - [ text ((String.slice 11 16 eventInstance.from) ++ " - " ++ (String.slice 11 16 eventInstance.to)) ] - , i [ classList [ ( "fa", True ), ( "fa-" ++ eventInstance.locationIcon, True ), ( "pull-right", True ) ] ] [] - , p - [] - [ text eventInstance.title ] - ] - - -filterView : - String - -> List { a | name : String } - -> List { a | name : String } - -> ({ a | name : String } -> Msg) - -> Html Msg -filterView name possibleFilters currentFilters action = - div [] - [ text (name ++ ":") - , ul [] (List.map (\filter -> filterChoiceView filter currentFilters action) possibleFilters) - ] - - -filterChoiceView : - { a | name : String } - -> List { a | name : String } - -> ({ a | name : String } -> Msg) - -> Html Msg -filterChoiceView filter currentFilters action = - let - active = - List.member filter currentFilters - - notActive = - not active - in - li [] - [ div - [ classList - [ ( "btn", True ) - , ( "btn-default", True ) - , ( "filter-choice-active", active ) - ] - , onClick (action filter) - ] - [ span [] - [ i [ classList [ ( "fa", True ), ( "fa-minus", active ), ( "fa-plus", notActive ) ] ] [] - , text (" " ++ filter.name) - ] - ] - ] diff --git a/schedule/Makefile b/schedule/Makefile index 5cfdeb9c..d093dced 100644 --- a/schedule/Makefile +++ b/schedule/Makefile @@ -1,5 +1,5 @@ all: - elm-make Main.elm --warn --output ../src/program/static/js/elm_based_schedule.js + elm-make src/Main.elm --warn --output ../src/program/static/js/elm_based_schedule.js debug: - elm-make Main.elm --debug --warn --output ../src/program/static/js/elm_based_schedule.js + elm-make src/Main.elm --debug --warn --output ../src/program/static/js/elm_based_schedule.js diff --git a/schedule/elm-package.json b/schedule/elm-package.json index 8dbc336d..5b8b4855 100644 --- a/schedule/elm-package.json +++ b/schedule/elm-package.json @@ -4,7 +4,7 @@ "repository": "https://github.com/user/project.git", "license": "BSD3", "source-directories": [ - "." + "src/" ], "exposed-modules": [], "dependencies": { diff --git a/schedule/src/Decoders.elm b/schedule/src/Decoders.elm new file mode 100644 index 00000000..65c34d08 --- /dev/null +++ b/schedule/src/Decoders.elm @@ -0,0 +1,95 @@ +module Decoders exposing (..) + +-- Local modules + +import Models exposing (Day, Speaker, Event, EventInstance, EventLocation, EventType, Model, Flags, Filter, Route(..)) + + +-- Core modules + +import Json.Decode exposing (int, string, float, list, bool, dict, Decoder) +import Json.Decode.Pipeline exposing (decode, required, optional, hardcoded) + + +-- DECODERS + + +type alias WebSocketAction = + { action : String + } + + +webSocketActionDecoder : Decoder WebSocketAction +webSocketActionDecoder = + decode WebSocketAction + |> required "action" string + + +dayDecoder : Decoder Day +dayDecoder = + decode Day + |> required "day_name" string + |> required "iso" string + |> required "repr" string + + +speakerDecoder : Decoder Speaker +speakerDecoder = + decode Speaker + |> required "name" string + + +eventDecoder : Decoder Event +eventDecoder = + decode Event + |> required "title" string + |> required "slug" string + |> required "abstract" string + |> required "speakers" (list speakerDecoder) + + +eventInstanceDecoder : Decoder EventInstance +eventInstanceDecoder = + decode EventInstance + |> required "title" string + |> required "slug" string + |> required "id" int + |> required "url" string + |> required "event_slug" string + |> required "event_type" string + |> required "bg-color" string + |> required "fg-color" string + |> required "from" string + |> required "to" string + |> required "timeslots" float + |> required "location" string + |> required "location_icon" string + |> required "video_recording" bool + |> optional "video_url" string "" + + +eventLocationDecoder : Decoder EventLocation +eventLocationDecoder = + decode EventLocation + |> required "name" string + |> required "slug" string + |> required "icon" string + + +eventTypeDecoder : Decoder EventType +eventTypeDecoder = + decode EventType + |> required "name" string + |> required "slug" string + |> required "color" string + |> required "light_text" bool + + +initDataDecoder : Decoder (Flags -> Day -> Filter -> Route -> Model) +initDataDecoder = + decode Model + |> required "days" (list dayDecoder) + |> required "event_instances" (list eventInstanceDecoder) + |> required "event_locations" (list eventLocationDecoder) + |> required "event_types" (list eventTypeDecoder) + |> hardcoded [] diff --git a/schedule/src/Main.elm b/schedule/src/Main.elm new file mode 100644 index 00000000..acd95d73 --- /dev/null +++ b/schedule/src/Main.elm @@ -0,0 +1,41 @@ +module Main exposing (..) + +-- Local modules + +import Models exposing (..) +import Routing exposing (parseLocation) +import Update exposing (update) +import Messages exposing (Msg(..)) +import WebSocketCalls exposing (scheduleServer, sendInitMessage) +import Views exposing (view) + + +-- External modules + +import WebSocket exposing (listen) +import Navigation exposing (Location) + + +main : Program Flags Model Msg +main = + Navigation.programWithFlags + OnLocationChange + { init = init + , view = view + , update = update + , subscriptions = subscriptions + } + + +init : Flags -> Location -> ( Model, Cmd Msg ) +init flags location = + ( Model [] [] [] [] [] flags allDaysDay (Filter [] []) (parseLocation location), sendInitMessage flags.camp_slug ) + + + +-- SUBSCRIPTIONS + + +subscriptions : Model -> Sub Msg +subscriptions model = + WebSocket.listen scheduleServer WebSocketPayload diff --git a/schedule/src/Messages.elm b/schedule/src/Messages.elm new file mode 100644 index 00000000..399914b3 --- /dev/null +++ b/schedule/src/Messages.elm @@ -0,0 +1,19 @@ +module Messages exposing (Msg(..)) + +-- Local modules + +import Models exposing (Day, EventType, EventLocation) + + +-- External modules + +import Navigation exposing (Location) + + +type Msg + = NoOp + | WebSocketPayload String + | MakeActiveday Day + | ToggleEventTypeFilter EventType + | ToggleEventLocationFilter EventLocation + | OnLocationChange Location diff --git a/schedule/src/Models.elm b/schedule/src/Models.elm new file mode 100644 index 00000000..f8afe6d4 --- /dev/null +++ b/schedule/src/Models.elm @@ -0,0 +1,126 @@ +module Models exposing (..) + + +type Route + = OverviewRoute + | DayRoute DayIso + | EventInstanceRoute EventInstanceSlug + | NotFoundRoute + + +type alias Model = + { days : List Day + , eventInstances : List EventInstance + , eventLocations : List EventLocation + , eventTypes : List EventType + , events : List Event + , flags : Flags + , activeDay : Day + , filter : Filter + , route : Route + } + + +type alias Filter = + { eventTypes : List EventType + , eventLocations : List EventLocation + } + + +type alias DayIso = + String + + +type alias Day = + { day_name : String + , iso : DayIso + , repr : String + } + + +type alias Speaker = + { name : String + } + + +type alias EventSlug = + String + + +type alias EventInstanceSlug = + String + + +type alias EventInstance = + { title : String + , slug : EventInstanceSlug + , id : Int + , url : String + , eventSlug : EventSlug + , eventType : String + , backgroundColor : String + , forgroundColor : String + , from : String + , to : String + , timeslots : Float + , location : String + , locationIcon : String + , videoRecording : Bool + , videoUrl : String + } + + +type alias Event = + { title : String + , slug : EventSlug + , abstract : String + , speakers : List Speaker + } + + +emptyEventInstance : EventInstance +emptyEventInstance = + { title = "This should not happen!" + , slug = "this-should-not-happen" + , id = 0 + , url = "" + , eventSlug = "" + , eventType = "" + , backgroundColor = "" + , forgroundColor = "" + , from = "" + , to = "" + , timeslots = 0.0 + , location = "" + , locationIcon = "" + , videoRecording = False + , videoUrl = "" + } + + +type alias EventLocation = + { name : String + , slug : String + , icon : String + } + + +type alias EventType = + { name : String + , slug : String + , color : String + , lightText : Bool + } + + +type alias Flags = + { schedule_timeslot_length_minutes : Int + , schedule_midnight_offset_hours : Int + , ics_button_href : String + , camp_slug : String + } + + +allDaysDay : Day +allDaysDay = + Day "All Days" "" "" diff --git a/schedule/src/Routing.elm b/schedule/src/Routing.elm new file mode 100644 index 00000000..f3caeef5 --- /dev/null +++ b/schedule/src/Routing.elm @@ -0,0 +1,30 @@ +module Routing exposing (..) + +-- Local modules + +import Models exposing (DayIso, EventInstanceSlug, Route(..)) + + +-- External modules + +import Navigation exposing (Location) +import UrlParser exposing (()) + + +matchers : UrlParser.Parser (Route -> a) a +matchers = + UrlParser.oneOf + [ UrlParser.map OverviewRoute UrlParser.top + , UrlParser.map DayRoute (UrlParser.s "day" UrlParser.string) + , UrlParser.map EventInstanceRoute (UrlParser.s "event" UrlParser.string) + ] + + +parseLocation : Location -> Route +parseLocation location = + case UrlParser.parseHash matchers location of + Just route -> + route + + Nothing -> + NotFoundRoute diff --git a/schedule/src/Update.elm b/schedule/src/Update.elm new file mode 100644 index 00000000..70ca0818 --- /dev/null +++ b/schedule/src/Update.elm @@ -0,0 +1,110 @@ +module Update exposing (update) + +-- Local modules + +import Models exposing (Model, Route(EventInstanceRoute), emptyEventInstance, allDaysDay, Filter) +import Messages exposing (Msg(..)) +import Decoders exposing (webSocketActionDecoder, initDataDecoder, eventDecoder) +import Routing exposing (parseLocation) +import WebSocketCalls exposing (sendGetEventContent) + + +-- Core modules + +import Json.Decode + + +update : Msg -> Model -> ( Model, Cmd Msg ) +update msg model = + case msg of + NoOp -> + ( model, Cmd.none ) + + WebSocketPayload str -> + let + newModel = + case Json.Decode.decodeString webSocketActionDecoder str of + Ok webSocketAction -> + case webSocketAction.action of + "init" -> + case Json.Decode.decodeString initDataDecoder str of + Ok m -> + m model.flags allDaysDay (Filter [] []) model.route + + Err error -> + model + + "get_event_content" -> + case Json.Decode.decodeString eventDecoder str of + Ok event -> + { model | events = event :: model.events } + + Err error -> + model + + _ -> + model + + Err error -> + model + in + newModel ! [] + + MakeActiveday day -> + { model | activeDay = day } ! [] + + ToggleEventTypeFilter eventType -> + let + eventTypesFilter = + if List.member eventType model.filter.eventTypes then + List.filter (\x -> x /= eventType) model.filter.eventTypes + else + eventType :: model.filter.eventTypes + + currentFilter = + model.filter + + newFilter = + { currentFilter | eventTypes = eventTypesFilter } + in + { model | filter = newFilter } ! [] + + ToggleEventLocationFilter eventLocation -> + let + eventLocationsFilter = + if List.member eventLocation model.filter.eventLocations then + List.filter (\x -> x /= eventLocation) model.filter.eventLocations + else + eventLocation :: model.filter.eventLocations + + currentFilter = + model.filter + + newFilter = + { currentFilter | eventLocations = eventLocationsFilter } + in + { model | filter = newFilter } ! [] + + OnLocationChange location -> + let + newRoute = + parseLocation (Debug.log "location" location) + + onLoadCmd = + case newRoute of + EventInstanceRoute eventInstanceSlug -> + let + eventInstance = + case List.head (List.filter (\x -> x.slug == eventInstanceSlug) model.eventInstances) of + Just eventInstance -> + eventInstance + + Nothing -> + emptyEventInstance + in + sendGetEventContent model.flags.camp_slug eventInstance.eventSlug + + _ -> + Cmd.none + in + { model | route = newRoute } ! [ onLoadCmd ] diff --git a/schedule/src/Views.elm b/schedule/src/Views.elm new file mode 100644 index 00000000..c199c5c4 --- /dev/null +++ b/schedule/src/Views.elm @@ -0,0 +1,241 @@ +module Views exposing (..) + +-- Local modules + +import Models exposing (..) +import Messages exposing (Msg(..)) + + +-- Core modules + +import Html exposing (Html, Attribute, div, input, text, li, ul, a, h4, label, i, span, hr, small, p) +import Html.Attributes exposing (class, classList, id, type_, for, style, href) +import Html.Events exposing (onClick) + + +-- External modules + +import Markdown + + +dayButton : Day -> Day -> Html Msg +dayButton day activeDay = + a + [ classList + [ ( "btn", True ) + , ( "btn-default", day /= activeDay ) + , ( "btn-primary", day == activeDay ) + ] + , onClick (MakeActiveday day) + , href + ("#" + ++ case day.iso of + "" -> + "" + + iso -> + "day/" ++ iso + ) + ] + [ text day.day_name + ] + + +view : Model -> Html Msg +view model = + div [] + [ div [ class "row" ] + [ div [ id "schedule-days", class "btn-group" ] + (List.map (\day -> dayButton day model.activeDay) (allDaysDay :: model.days)) + ] + , hr [] [] + , case model.route of + OverviewRoute -> + scheduleOverviewView model + + DayRoute dayIso -> + dayView dayIso model + + EventInstanceRoute eventInstanceSlug -> + eventInstanceDetailView eventInstanceSlug model + + NotFoundRoute -> + div [] [ text "Not found!" ] + ] + + +dayView : DayIso -> Model -> Html Msg +dayView dayIso model = + div [] + [ filterSideBar model + ] + + +eventInstanceDetailView : EventInstanceSlug -> Model -> Html Msg +eventInstanceDetailView eventInstanceSlug model = + let + eventInstance = + case List.head (List.filter (\e -> e.slug == eventInstanceSlug) model.eventInstances) of + Just eventInstance -> + eventInstance + + Nothing -> + emptyEventInstance + + event = + case List.head (List.filter (\e -> e.slug == eventInstance.eventSlug) model.events) of + Just event -> + event + + Nothing -> + { title = "", slug = "", abstract = "", speakers = [] } + in + div [ class "row" ] + [ div [ class "col-sm-9" ] + [ a [ href "#" ] + [ text "Back" + ] + , h4 [] [ text eventInstance.title ] + , p [] [ Markdown.toHtml [] event.abstract ] + , hr [] [] + , h4 [] [ text "TODO: Show all instances here!" ] + ] + , div + [ classList + [ ( "col-sm-3", True ) + , ( "schedule-sidebar", True ) + ] + ] + [ h4 [] [ text "Speakers" ] + ] + ] + + +filterSideBar : Model -> Html Msg +filterSideBar model = + div + [ classList + [ ( "col-sm-3", True ) + , ( "col-sm-push-9", True ) + , ( "schedule-sidebar", True ) + , ( "schedule-filter", True ) + ] + ] + [ h4 [] [ text "Filter" ] + , div [ class "form-group" ] + [ filterView "Type" model.eventTypes model.filter.eventTypes ToggleEventTypeFilter + , filterView "Location" model.eventLocations model.filter.eventLocations ToggleEventLocationFilter + ] + ] + + +scheduleOverviewView : Model -> Html Msg +scheduleOverviewView model = + div [ class "row" ] + [ filterSideBar model + , div + [ classList + [ ( "col-sm-9", True ) + , ( "col-sm-pull-3", True ) + ] + ] + (List.map (\day -> dayRowView day model) model.days) + ] + + +dayRowView : Day -> Model -> Html Msg +dayRowView day model = + let + types = + List.map (\eventType -> eventType.slug) + (if List.isEmpty model.filter.eventTypes then + model.eventTypes + else + model.filter.eventTypes + ) + + locations = + List.map (\eventLocation -> eventLocation.slug) + (if List.isEmpty model.filter.eventLocations then + model.eventLocations + else + model.filter.eventLocations + ) + + filteredEventInstances = + List.filter + (\eventInstance -> + ((String.slice 0 10 eventInstance.from) == day.iso) + && List.member eventInstance.location locations + && List.member eventInstance.eventType types + ) + model.eventInstances + in + div [] + [ h4 [] + [ text day.repr ] + , div [ class "schedule-day-row" ] + (List.map dayEventInstanceView filteredEventInstances) + ] + + +dayEventInstanceView : EventInstance -> Html Msg +dayEventInstanceView eventInstance = + a + [ class "event" + , href ("#event/" ++ eventInstance.slug) + , style + [ ( "background-color", eventInstance.backgroundColor ) + , ( "color", eventInstance.forgroundColor ) + ] + ] + [ small [] + [ text ((String.slice 11 16 eventInstance.from) ++ " - " ++ (String.slice 11 16 eventInstance.to)) ] + , i [ classList [ ( "fa", True ), ( "fa-" ++ eventInstance.locationIcon, True ), ( "pull-right", True ) ] ] [] + , p + [] + [ text eventInstance.title ] + ] + + +filterView : + String + -> List { a | name : String } + -> List { a | name : String } + -> ({ a | name : String } -> Msg) + -> Html Msg +filterView name possibleFilters currentFilters action = + div [] + [ text (name ++ ":") + , ul [] (List.map (\filter -> filterChoiceView filter currentFilters action) possibleFilters) + ] + + +filterChoiceView : + { a | name : String } + -> List { a | name : String } + -> ({ a | name : String } -> Msg) + -> Html Msg +filterChoiceView filter currentFilters action = + let + active = + List.member filter currentFilters + + notActive = + not active + in + li [] + [ div + [ classList + [ ( "btn", True ) + , ( "btn-default", True ) + , ( "filter-choice-active", active ) + ] + , onClick (action filter) + ] + [ span [] + [ i [ classList [ ( "fa", True ), ( "fa-minus", active ), ( "fa-plus", notActive ) ] ] [] + , text (" " ++ filter.name) + ] + ] + ] diff --git a/schedule/src/WebSocketCalls.elm b/schedule/src/WebSocketCalls.elm new file mode 100644 index 00000000..cfde5396 --- /dev/null +++ b/schedule/src/WebSocketCalls.elm @@ -0,0 +1,42 @@ +module WebSocketCalls exposing (scheduleServer, sendInitMessage, sendGetEventContent) + +-- Internal modules + +import Models exposing (EventSlug) +import Messages exposing (Msg) + + +-- External modules + +import WebSocket +import Json.Encode + + +scheduleServer : String +scheduleServer = + "ws://localhost:8000/schedule/" + + +sendInitMessage : String -> Cmd Msg +sendInitMessage camp_slug = + WebSocket.send scheduleServer + (Json.Encode.encode 0 + (Json.Encode.object + [ ( "action", Json.Encode.string "init" ) + , ( "camp_slug", Json.Encode.string camp_slug ) + ] + ) + ) + + +sendGetEventContent : String -> EventSlug -> Cmd Msg +sendGetEventContent campSlug eventSlug = + WebSocket.send scheduleServer + (Json.Encode.encode 0 + (Json.Encode.object + [ ( "action", Json.Encode.string "get_event_content" ) + , ( "event_slug", Json.Encode.string eventSlug ) + , ( "camp_slug", Json.Encode.string campSlug ) + ] + ) + ) diff --git a/src/program/consumers.py b/src/program/consumers.py index 725a849e..6d88cd56 100644 --- a/src/program/consumers.py +++ b/src/program/consumers.py @@ -1,7 +1,7 @@ from channels.generic.websockets import JsonWebsocketConsumer from camps.models import Camp -from .models import EventInstance, Favorite, EventLocation, EventType +from .models import Event, EventInstance, Favorite, EventLocation, EventType class ScheduleConsumer(JsonWebsocketConsumer): @@ -21,32 +21,45 @@ class ScheduleConsumer(JsonWebsocketConsumer): camp = Camp.objects.get(slug=camp_slug) days = list(map( lambda day: - { 'repr': day.lower.strftime('%A %Y-%m-%d') - , 'iso': day.lower.strftime('%Y-%m-%d') - , 'day_name': day.lower.strftime('%A') + { + 'repr': day.lower.strftime('%A %Y-%m-%d'), + 'iso': day.lower.strftime('%Y-%m-%d'), + 'day_name': day.lower.strftime('%A'), }, camp.get_days('camp') )) event_instances_query_set = EventInstance.objects.filter(event__camp=camp) - event_instances = list([x.to_json(user=message.user) for x in event_instances_query_set]) + event_instances = list([x.serialize(user=message.user) for x in event_instances_query_set]) event_locations_query_set = EventLocation.objects.filter(camp=camp) - event_locations = list([x.to_json() for x in event_locations_query_set]) + event_locations = list([x.serialize() for x in event_locations_query_set]) event_types_query_set = EventType.objects.filter() - event_types = list([x.to_json() for x in event_types_query_set]) + event_types = list([x.serialize() for x in event_types_query_set]) data = { + "action": "init", "event_locations": event_locations, "event_types": event_types, "accept": True, "event_instances": event_instances, "days": days, - "action": "init" } except Camp.DoesNotExist: pass + if action == 'get_event_content': + camp_slug = content.get('camp_slug') + event_slug = content.get('event_slug') + print(camp_slug) + print(event_slug) + event = Event.objects.get( + slug=event_slug, + camp__slug=camp_slug + ) + data = event.serialize() + data['action'] = "get_event_content" + if action == 'favorite': event_instance_id = content.get('event_instance_id') event_instance = EventInstance.objects.get(id=event_instance_id) diff --git a/src/program/models.py b/src/program/models.py index 7b3dbb9e..b6ac2626 100644 --- a/src/program/models.py +++ b/src/program/models.py @@ -311,7 +311,7 @@ class EventLocation(CampRelatedModel): class Meta: unique_together = (('camp', 'slug'), ('camp', 'name')) - def to_json(self): + def serialize(self): return { "name": self.name, "slug": self.slug, @@ -357,7 +357,7 @@ class EventType(CreatedUpdatedModel): def __str__(self): return self.name - def to_json(self): + def serialize(self): return { "name": self.name, "slug": self.slug, @@ -428,6 +428,18 @@ class Event(CampRelatedModel): def get_absolute_url(self): return reverse_lazy('event_detail', kwargs={'camp_slug': self.camp.slug, 'slug': self.slug}) + def serialize(self): + data = { + 'title': self.title, + 'slug': self.slug, + 'abstract': self.abstract, + 'speakers': [ + speaker.serialize() + for speaker in self.speakers.all() + ], + } + return data + class EventInstance(CampRelatedModel): """ An instance of an event """ @@ -490,24 +502,15 @@ class EventInstance(CampRelatedModel): ievent['location'] = icalendar.vText(self.location.name) return ievent - def to_json(self, user=None): - parser = CommonMark.Parser() - renderer = CommonMark.HtmlRenderer() - ast = parser.parse(self.event.abstract) - abstract = renderer.render(ast) - + def serialize(self, user=None): data = { 'title': self.event.title, + 'slug': self.event.slug + '-' + str(self.id), 'event_slug': self.event.slug, - 'abstract': abstract, 'from': self.when.lower.astimezone().isoformat(), 'to': self.when.upper.astimezone().isoformat(), 'url': str(self.event.get_absolute_url()), 'id': self.id, - 'speakers': [ - {'name': speaker.name, 'url': str(speaker.get_absolute_url())} - for speaker in self.event.speakers.all() - ], 'bg-color': self.event.event_type.color, 'fg-color': '#fff' if self.event.event_type.light_text else '#000', 'event_type': self.event.event_type.slug, @@ -604,6 +607,12 @@ class Speaker(CampRelatedModel): def get_absolute_url(self): return reverse_lazy('speaker_detail', kwargs={'camp_slug': self.camp.slug, 'slug': self.slug}) + def serialize(self): + data = { + 'name': self.name, + } + return data + class Favorite(models.Model): user = models.ForeignKey('auth.User', related_name='favorites') diff --git a/src/program/templates/schedule_overview.html b/src/program/templates/schedule_overview.html index 064badb1..1fe22a2f 100644 --- a/src/program/templates/schedule_overview.html +++ b/src/program/templates/schedule_overview.html @@ -11,7 +11,7 @@ From 99c48130d2a7261018a92b8aaf77fdd9e4009d18 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Thu, 20 Jul 2017 13:21:37 +0200 Subject: [PATCH 25/54] Make sidebar on event detail sticky. --- schedule/src/Views/EventDetail.elm | 1 + 1 file changed, 1 insertion(+) diff --git a/schedule/src/Views/EventDetail.elm b/schedule/src/Views/EventDetail.elm index 286ca2d6..9f231514 100644 --- a/schedule/src/Views/EventDetail.elm +++ b/schedule/src/Views/EventDetail.elm @@ -41,6 +41,7 @@ eventDetailView eventSlug model = [ classList [ ( "col-sm-3", True ) , ( "schedule-sidebar", True ) + , ( "sticky", True ) ] ] [ videoRecordingSidebar event From 1d366295ad881c0834530936a30e446b9aed843d Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 23 Jul 2017 02:08:59 +0200 Subject: [PATCH 26/54] Adding some type annotations to DayView functions. --- schedule/src/Views/DayView.elm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/schedule/src/Views/DayView.elm b/schedule/src/Views/DayView.elm index 6d4d5340..77d15ec3 100644 --- a/schedule/src/Views/DayView.elm +++ b/schedule/src/Views/DayView.elm @@ -3,7 +3,7 @@ module Views.DayView exposing (dayView) -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, Day, EventInstance) +import Models exposing (Model, Day, EventInstance, EventLocation) -- Core modules @@ -56,6 +56,7 @@ dayView day model = ] +locationColumns : List EventInstance -> List EventLocation -> Int -> Html Msg locationColumns eventInstances eventLocations offset = let columnWidth = @@ -73,6 +74,7 @@ locationColumns eventInstances eventLocations offset = (List.map (\location -> locationColumn columnWidth eventInstances offset location) eventLocations) +locationColumn : Float -> List EventInstance -> Int -> EventLocation -> Html Msg locationColumn columnWidth eventInstances offset location = let locationInstances = @@ -104,6 +106,7 @@ locationColumn columnWidth eventInstances offset location = ) +renderGroup : Int -> List EventInstance -> Html Msg renderGroup offset group = let sortedGroup = From 84b0919cd67bf47685e9e0b891098a740314d0b0 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 23 Jul 2017 02:51:39 +0200 Subject: [PATCH 27/54] A whole lot of filtering. URL now reflects filters. --- schedule/src/Decoders.elm | 3 +- schedule/src/Main.elm | 8 +-- schedule/src/Messages.elm | 2 +- schedule/src/Models.elm | 11 ++- schedule/src/Routing.elm | 19 ++++++ schedule/src/Update.elm | 44 ++++++++++-- schedule/src/Views.elm | 3 + schedule/src/Views/FilterView.elm | 91 +++++++++++++++++++++++-- schedule/src/Views/ScheduleOverview.elm | 4 +- 9 files changed, 163 insertions(+), 22 deletions(-) diff --git a/schedule/src/Decoders.elm b/schedule/src/Decoders.elm index 6e68bff6..f0433b49 100644 --- a/schedule/src/Decoders.elm +++ b/schedule/src/Decoders.elm @@ -15,6 +15,7 @@ import Date exposing (Date, Month(..)) -- External modules import Date.Extra +import Navigation exposing (Location) -- DECODERS @@ -107,7 +108,7 @@ eventTypeDecoder = |> required "light_text" bool -initDataDecoder : Decoder (Flags -> Filter -> Route -> Model) +initDataDecoder : Decoder (Flags -> Filter -> Location -> Route -> Model) initDataDecoder = decode Model |> required "days" (list dayDecoder) diff --git a/schedule/src/Main.elm b/schedule/src/Main.elm index bea165e6..3a8ab0d5 100644 --- a/schedule/src/Main.elm +++ b/schedule/src/Main.elm @@ -32,15 +32,15 @@ init : Flags -> Location -> ( Model, Cmd Msg ) init flags location = let currentRoute = - parseLocation location + parseLocation (Debug.log "location" location) emptyFilter = Filter [] [] [] - initModel = - Model [] [] [] [] [] flags emptyFilter currentRoute + model = + Model [] [] [] [] [] flags emptyFilter location currentRoute in - initModel ! [ sendInitMessage flags.camp_slug flags.websocket_server ] + model ! [ sendInitMessage flags.camp_slug flags.websocket_server ] diff --git a/schedule/src/Messages.elm b/schedule/src/Messages.elm index 705ed40a..502f29cd 100644 --- a/schedule/src/Messages.elm +++ b/schedule/src/Messages.elm @@ -15,6 +15,6 @@ type Msg | WebSocketPayload String | ToggleEventTypeFilter EventType | ToggleEventLocationFilter EventLocation - | ToggleVideoRecordingFilter { name : String, filter : EventInstance -> Bool } + | ToggleVideoRecordingFilter { name : String, slug : String, filter : EventInstance -> Bool } | OnLocationChange Location | BackInHistory diff --git a/schedule/src/Models.elm b/schedule/src/Models.elm index 5e168516..233f96f4 100644 --- a/schedule/src/Models.elm +++ b/schedule/src/Models.elm @@ -1,10 +1,18 @@ module Models exposing (..) +-- Core modules + import Date exposing (Date, now) +-- External modules + +import Navigation exposing (Location) + + type Route = OverviewRoute + | OverviewFilteredRoute String | DayRoute String | EventRoute EventSlug | NotFoundRoute @@ -18,6 +26,7 @@ type alias Model = , eventTypes : List EventType , flags : Flags , filter : Filter + , location : Location , route : Route } @@ -25,7 +34,7 @@ type alias Model = type alias Filter = { eventTypes : List EventType , eventLocations : List EventLocation - , videoRecording : List { name : String, filter : EventInstance -> Bool } + , videoRecording : List { name : String, slug : String, filter : EventInstance -> Bool } } diff --git a/schedule/src/Routing.elm b/schedule/src/Routing.elm index 0530a036..17417bf3 100644 --- a/schedule/src/Routing.elm +++ b/schedule/src/Routing.elm @@ -11,10 +11,29 @@ import Navigation exposing (Location) import UrlParser exposing (Parser, (), oneOf, map, top, s, string, parseHash) +{-- +URLs to support: + +- # + This show the overview of the schedule + +- #?type={types},location={locations},video={no,yes,link} + This is the overview, just with filters enable + +- #day/{year}-{month}-{day} + Show a particular day + +- #event/{slug} + Show a particular event + +--} + + matchers : Parser (Route -> a) a matchers = oneOf [ map OverviewRoute top + , map OverviewFilteredRoute (top string) , map DayRoute (s "day" string) , map EventRoute (s "event" string) ] diff --git a/schedule/src/Update.elm b/schedule/src/Update.elm index 6d839307..d9bea033 100644 --- a/schedule/src/Update.elm +++ b/schedule/src/Update.elm @@ -2,10 +2,11 @@ module Update exposing (update) -- Local modules -import Models exposing (Model, Route(OverviewRoute, EventRoute), Filter) +import Models exposing (Model, Route(..), Filter) import Messages exposing (Msg(..)) import Decoders exposing (webSocketActionDecoder, initDataDecoder, eventDecoder) import Routing exposing (parseLocation) +import Views.FilterView exposing (parseFilterFromQuery, filterToQuery) -- Core modules @@ -33,7 +34,7 @@ update msg model = "init" -> case Json.Decode.decodeString initDataDecoder str of Ok m -> - m model.flags (Filter [] [] []) model.route + m model.flags model.filter model.location model.route Err error -> model @@ -43,8 +44,11 @@ update msg model = Err error -> model + + ( newModel_, _ ) = + update (OnLocationChange model.location) newModel in - newModel ! [] + newModel_ ! [] ToggleEventTypeFilter eventType -> let @@ -59,8 +63,14 @@ update msg model = newFilter = { currentFilter | eventTypes = eventTypesFilter } + + query = + filterToQuery newFilter + + cmd = + Navigation.newUrl query in - { model | filter = newFilter } ! [] + { model | filter = newFilter } ! [ cmd ] ToggleEventLocationFilter eventLocation -> let @@ -75,8 +85,14 @@ update msg model = newFilter = { currentFilter | eventLocations = eventLocationsFilter } + + query = + filterToQuery newFilter + + cmd = + Navigation.newUrl query in - { model | filter = newFilter } ! [] + { model | filter = newFilter } ! [ cmd ] ToggleVideoRecordingFilter videoRecording -> let @@ -91,15 +107,29 @@ update msg model = newFilter = { currentFilter | videoRecording = videoRecordingFilter } + + query = + filterToQuery newFilter + + cmd = + Navigation.newUrl query in - { model | filter = newFilter } ! [] + { model | filter = newFilter } ! [ cmd ] OnLocationChange location -> let newRoute = parseLocation location + + newFilter = + case newRoute of + OverviewFilteredRoute query -> + parseFilterFromQuery query model + + _ -> + model.filter in - { model | route = newRoute } ! [] + { model | filter = newFilter, route = newRoute, location = location } ! [] BackInHistory -> model ! [ Navigation.back 1 ] diff --git a/schedule/src/Views.elm b/schedule/src/Views.elm index 4e5ce5d0..cff006a1 100644 --- a/schedule/src/Views.elm +++ b/schedule/src/Views.elm @@ -30,6 +30,9 @@ view model = OverviewRoute -> scheduleOverviewView model + OverviewFilteredRoute _ -> + scheduleOverviewView model + DayRoute dayIso -> let day = diff --git a/schedule/src/Views/FilterView.elm b/schedule/src/Views/FilterView.elm index e738bea4..2718b418 100644 --- a/schedule/src/Views/FilterView.elm +++ b/schedule/src/Views/FilterView.elm @@ -1,9 +1,14 @@ -module Views.FilterView exposing (filterSidebar, applyFilters) +module Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQuery, filterToQuery) -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, EventInstance) +import Models exposing (Model, EventInstance, Filter, Day) + + +-- Core modules + +import Regex -- External modules @@ -14,6 +19,7 @@ import Html.Events exposing (onClick) import Date.Extra exposing (Interval(..), equalBy) +applyFilters : Day -> Model -> List EventInstance applyFilters day model = let types = @@ -89,11 +95,11 @@ hasRecordingFilter eventInstance = eventInstance.videoUrl /= "" -videoRecordingFilters : List { name : String, filter : EventInstance -> Bool } +videoRecordingFilters : List { name : String, slug : String, filter : EventInstance -> Bool } videoRecordingFilters = - [ { name = "Will not be recorded", filter = notRecordedFilter } - , { name = "Will recorded", filter = recordedFilter } - , { name = "Has recording", filter = hasRecordingFilter } + [ { name = "Will not be recorded", slug = "not-to-be-recorded", filter = notRecordedFilter } + , { name = "Will recorded", slug = "to-be-recorded", filter = recordedFilter } + , { name = "Has recording", slug = "has-recording", filter = hasRecordingFilter } ] @@ -147,3 +153,76 @@ filterChoiceView filter currentFilters action = ] ] ] + + +findFilter : List { a | slug : String } -> String -> Maybe { a | slug : String } +findFilter modelItems filterSlug = + List.head (List.filter (\x -> x.slug == filterSlug) modelItems) + + +getFilter : String -> List { a | slug : String } -> String -> List { a | slug : String } +getFilter filterType modelItems query = + let + filterMatch = + query + |> Regex.find (Regex.AtMost 1) (Regex.regex (filterType ++ "=([\\w,_-]+)&*")) + |> List.concatMap .submatches + |> List.head + |> Maybe.withDefault Nothing + |> Maybe.withDefault "" + + filterSlugs = + String.split "," filterMatch + in + List.filterMap (\x -> findFilter modelItems x) filterSlugs + + +parseFilterFromQuery : String -> Model -> Filter +parseFilterFromQuery query model = + let + types = + getFilter "type" model.eventTypes query + + locations = + getFilter "location" model.eventLocations query + + videoFilters = + getFilter "video" videoRecordingFilters query + in + { eventTypes = types + , eventLocations = locations + , videoRecording = videoFilters + } + + +filterToQuery : Filter -> String +filterToQuery filter = + let + typePart = + case String.join "," (List.map .slug filter.eventTypes) of + "" -> + "" + + types -> + "type=" ++ types + + locationPart = + case String.join "," (List.map .slug filter.eventLocations) of + "" -> + "" + + locations -> + "location=" ++ locations + + videoPart = + case String.join "," (List.map .slug filter.videoRecording) of + "" -> + "" + + video -> + "video=" ++ video + + result = + String.join "&" (List.filter (\x -> x /= "") [ typePart, locationPart, videoPart ]) + in + "#" ++ result diff --git a/schedule/src/Views/ScheduleOverview.elm b/schedule/src/Views/ScheduleOverview.elm index 32ce0e9a..04c4a332 100644 --- a/schedule/src/Views/ScheduleOverview.elm +++ b/schedule/src/Views/ScheduleOverview.elm @@ -3,8 +3,8 @@ module Views.ScheduleOverview exposing (scheduleOverviewView) -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, Day, EventInstance) -import Views.FilterView exposing (filterSidebar, applyFilters) +import Models exposing (Model, Day, EventInstance, Filter) +import Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQuery) -- External modules From d77564064fabee16527dd228bf3ec76ea01ea548 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 23 Jul 2017 02:52:56 +0200 Subject: [PATCH 28/54] Adding compiled version with debug enabled. --- src/program/static/js/elm_based_schedule.js | 725 ++++++++++++-------- 1 file changed, 442 insertions(+), 283 deletions(-) diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js index e0076090..81301584 100644 --- a/src/program/static/js/elm_based_schedule.js +++ b/src/program/static/js/elm_based_schedule.js @@ -17831,9 +17831,9 @@ var _justinmimbs$elm_date_extra$Date_Extra$equalBy = F3( var _justinmimbs$elm_date_extra$Date_Extra$Second = {ctor: 'Second'}; var _justinmimbs$elm_date_extra$Date_Extra$Millisecond = {ctor: 'Millisecond'}; -var _user$project$Models$Model = F8( - function (a, b, c, d, e, f, g, h) { - return {days: a, events: b, eventInstances: c, eventLocations: d, eventTypes: e, flags: f, filter: g, route: h}; +var _user$project$Models$Model = F9( + function (a, b, c, d, e, f, g, h, i) { + return {days: a, events: b, eventInstances: c, eventLocations: d, eventTypes: e, flags: f, filter: g, location: h, route: i}; }); var _user$project$Models$Filter = F3( function (a, b, c) { @@ -17900,6 +17900,9 @@ var _user$project$Models$EventRoute = function (a) { var _user$project$Models$DayRoute = function (a) { return {ctor: 'DayRoute', _0: a}; }; +var _user$project$Models$OverviewFilteredRoute = function (a) { + return {ctor: 'OverviewFilteredRoute', _0: a}; +}; var _user$project$Models$OverviewRoute = {ctor: 'OverviewRoute'}; var _user$project$Decoders$eventTypeDecoder = A3( @@ -18087,21 +18090,28 @@ var _user$project$Routing$matchers = _evancz$url_parser$UrlParser$oneOf( ctor: '::', _0: A2( _evancz$url_parser$UrlParser$map, - _user$project$Models$DayRoute, - A2( - _evancz$url_parser$UrlParser_ops[''], - _evancz$url_parser$UrlParser$s('day'), - _evancz$url_parser$UrlParser$string)), + _user$project$Models$OverviewFilteredRoute, + A2(_evancz$url_parser$UrlParser_ops[''], _evancz$url_parser$UrlParser$top, _evancz$url_parser$UrlParser$string)), _1: { ctor: '::', _0: A2( _evancz$url_parser$UrlParser$map, - _user$project$Models$EventRoute, + _user$project$Models$DayRoute, A2( _evancz$url_parser$UrlParser_ops[''], - _evancz$url_parser$UrlParser$s('event'), + _evancz$url_parser$UrlParser$s('day'), _evancz$url_parser$UrlParser$string)), - _1: {ctor: '[]'} + _1: { + ctor: '::', + _0: A2( + _evancz$url_parser$UrlParser$map, + _user$project$Models$EventRoute, + A2( + _evancz$url_parser$UrlParser_ops[''], + _evancz$url_parser$UrlParser$s('event'), + _evancz$url_parser$UrlParser$string)), + _1: {ctor: '[]'} + } } } }); @@ -18132,6 +18142,347 @@ var _user$project$Messages$WebSocketPayload = function (a) { }; var _user$project$Messages$NoOp = {ctor: 'NoOp'}; +var _user$project$Views_FilterView$filterToQuery = function (filter) { + var videoPart = function () { + var _p0 = A2( + _elm_lang$core$String$join, + ',', + A2( + _elm_lang$core$List$map, + function (_) { + return _.slug; + }, + filter.videoRecording)); + if (_p0 === '') { + return ''; + } else { + return A2(_elm_lang$core$Basics_ops['++'], 'video=', _p0); + } + }(); + var locationPart = function () { + var _p1 = A2( + _elm_lang$core$String$join, + ',', + A2( + _elm_lang$core$List$map, + function (_) { + return _.slug; + }, + filter.eventLocations)); + if (_p1 === '') { + return ''; + } else { + return A2(_elm_lang$core$Basics_ops['++'], 'location=', _p1); + } + }(); + var typePart = function () { + var _p2 = A2( + _elm_lang$core$String$join, + ',', + A2( + _elm_lang$core$List$map, + function (_) { + return _.slug; + }, + filter.eventTypes)); + if (_p2 === '') { + return ''; + } else { + return A2(_elm_lang$core$Basics_ops['++'], 'type=', _p2); + } + }(); + var result = A2( + _elm_lang$core$String$join, + '&', + A2( + _elm_lang$core$List$filter, + function (x) { + return !_elm_lang$core$Native_Utils.eq(x, ''); + }, + { + ctor: '::', + _0: typePart, + _1: { + ctor: '::', + _0: locationPart, + _1: { + ctor: '::', + _0: videoPart, + _1: {ctor: '[]'} + } + } + })); + return A2(_elm_lang$core$Basics_ops['++'], '#', result); +}; +var _user$project$Views_FilterView$findFilter = F2( + function (modelItems, filterSlug) { + return _elm_lang$core$List$head( + A2( + _elm_lang$core$List$filter, + function (x) { + return _elm_lang$core$Native_Utils.eq(x.slug, filterSlug); + }, + modelItems)); + }); +var _user$project$Views_FilterView$getFilter = F3( + function (filterType, modelItems, query) { + var filterMatch = A2( + _elm_lang$core$Maybe$withDefault, + '', + A2( + _elm_lang$core$Maybe$withDefault, + _elm_lang$core$Maybe$Nothing, + _elm_lang$core$List$head( + A2( + _elm_lang$core$List$concatMap, + function (_) { + return _.submatches; + }, + A3( + _elm_lang$core$Regex$find, + _elm_lang$core$Regex$AtMost(1), + _elm_lang$core$Regex$regex( + A2(_elm_lang$core$Basics_ops['++'], filterType, '=([\\w,_-]+)&*')), + query))))); + var filterSlugs = A2(_elm_lang$core$String$split, ',', filterMatch); + return A2( + _elm_lang$core$List$filterMap, + function (x) { + return A2(_user$project$Views_FilterView$findFilter, modelItems, x); + }, + filterSlugs); + }); +var _user$project$Views_FilterView$filterChoiceView = F3( + function (filter, currentFilters, action) { + var active = A2(_elm_lang$core$List$member, filter, currentFilters); + var notActive = !active; + return A2( + _elm_lang$html$Html$li, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'filter-choice-active', _1: active}, + _1: {ctor: '[]'} + } + } + }), + _1: { + ctor: '::', + _0: _elm_lang$html$Html_Events$onClick( + action(filter)), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$span, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-minus', _1: active}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-plus', _1: notActive}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: { + ctor: '::', + _0: _elm_lang$html$Html$text( + A2(_elm_lang$core$Basics_ops['++'], ' ', filter.name)), + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + }); + }); +var _user$project$Views_FilterView$filterView = F4( + function (name, possibleFilters, currentFilters, action) { + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text( + A2(_elm_lang$core$Basics_ops['++'], name, ':')), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$ul, + {ctor: '[]'}, + A2( + _elm_lang$core$List$map, + function (filter) { + return A3(_user$project$Views_FilterView$filterChoiceView, filter, currentFilters, action); + }, + possibleFilters)), + _1: {ctor: '[]'} + } + }); + }); +var _user$project$Views_FilterView$applyVideoRecordingFilters = F2( + function (filters, eventInstance) { + var results = A2( + _elm_lang$core$List$map, + function (filter) { + return filter(eventInstance); + }, + filters); + return A2(_elm_lang$core$List$member, true, results); + }); +var _user$project$Views_FilterView$hasRecordingFilter = function (eventInstance) { + return !_elm_lang$core$Native_Utils.eq(eventInstance.videoUrl, ''); +}; +var _user$project$Views_FilterView$recordedFilter = function (eventInstance) { + return _elm_lang$core$Native_Utils.eq(eventInstance.videoRecording, true); +}; +var _user$project$Views_FilterView$notRecordedFilter = function (eventInstance) { + return _elm_lang$core$Native_Utils.eq(eventInstance.videoRecording, false); +}; +var _user$project$Views_FilterView$videoRecordingFilters = { + ctor: '::', + _0: {name: 'Will not be recorded', slug: 'not-to-be-recorded', filter: _user$project$Views_FilterView$notRecordedFilter}, + _1: { + ctor: '::', + _0: {name: 'Will recorded', slug: 'to-be-recorded', filter: _user$project$Views_FilterView$recordedFilter}, + _1: { + ctor: '::', + _0: {name: 'Has recording', slug: 'has-recording', filter: _user$project$Views_FilterView$hasRecordingFilter}, + _1: {ctor: '[]'} + } + } +}; +var _user$project$Views_FilterView$parseFilterFromQuery = F2( + function (query, model) { + var videoFilters = A3(_user$project$Views_FilterView$getFilter, 'video', _user$project$Views_FilterView$videoRecordingFilters, query); + var locations = A3(_user$project$Views_FilterView$getFilter, 'location', model.eventLocations, query); + var types = A3(_user$project$Views_FilterView$getFilter, 'type', model.eventTypes, query); + return {eventTypes: types, eventLocations: locations, videoRecording: videoFilters}; + }); +var _user$project$Views_FilterView$filterSidebar = function (model) { + return A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'col-sm-3', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'col-sm-push-9', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'schedule-sidebar', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'schedule-filter', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'sticky', _1: true}, + _1: {ctor: '[]'} + } + } + } + } + }), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$h4, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Filter'), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('form-group'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A4(_user$project$Views_FilterView$filterView, 'Type', model.eventTypes, model.filter.eventTypes, _user$project$Messages$ToggleEventTypeFilter), + _1: { + ctor: '::', + _0: A4(_user$project$Views_FilterView$filterView, 'Location', model.eventLocations, model.filter.eventLocations, _user$project$Messages$ToggleEventLocationFilter), + _1: { + ctor: '::', + _0: A4(_user$project$Views_FilterView$filterView, 'Video', _user$project$Views_FilterView$videoRecordingFilters, model.filter.videoRecording, _user$project$Messages$ToggleVideoRecordingFilter), + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + } + }); +}; +var _user$project$Views_FilterView$applyFilters = F2( + function (day, model) { + var videoFilters = A2( + _elm_lang$core$List$map, + function (filter) { + return filter.filter; + }, + _elm_lang$core$List$isEmpty(model.filter.videoRecording) ? _user$project$Views_FilterView$videoRecordingFilters : model.filter.videoRecording); + var locations = A2( + _elm_lang$core$List$map, + function (eventLocation) { + return eventLocation.slug; + }, + _elm_lang$core$List$isEmpty(model.filter.eventLocations) ? model.eventLocations : model.filter.eventLocations); + var types = A2( + _elm_lang$core$List$map, + function (eventType) { + return eventType.slug; + }, + _elm_lang$core$List$isEmpty(model.filter.eventTypes) ? model.eventTypes : model.filter.eventTypes); + var filteredEventInstances = A2( + _elm_lang$core$List$filter, + function (eventInstance) { + return A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Month, eventInstance.from, day.date) && (A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Day, eventInstance.from, day.date) && (A2(_elm_lang$core$List$member, eventInstance.location, locations) && (A2(_elm_lang$core$List$member, eventInstance.eventType, types) && A2(_user$project$Views_FilterView$applyVideoRecordingFilters, videoFilters, eventInstance)))); + }, + model.eventInstances); + return filteredEventInstances; + }); + var _user$project$Update$update = F2( function (msg, model) { var _p0 = msg; @@ -18139,23 +18490,15 @@ var _user$project$Update$update = F2( case 'NoOp': return {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; case 'WebSocketPayload': - var _p4 = _p0._0; + var _p5 = _p0._0; var newModel = function () { - var _p1 = A2(_elm_lang$core$Json_Decode$decodeString, _user$project$Decoders$webSocketActionDecoder, _p4); + var _p1 = A2(_elm_lang$core$Json_Decode$decodeString, _user$project$Decoders$webSocketActionDecoder, _p5); if (_p1.ctor === 'Ok') { var _p2 = _p1._0.action; if (_p2 === 'init') { - var _p3 = A2(_elm_lang$core$Json_Decode$decodeString, _user$project$Decoders$initDataDecoder, _p4); + var _p3 = A2(_elm_lang$core$Json_Decode$decodeString, _user$project$Decoders$initDataDecoder, _p5); if (_p3.ctor === 'Ok') { - return A3( - _p3._0, - model.flags, - A3( - _user$project$Models$Filter, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}), - model.route); + return A4(_p3._0, model.flags, model.filter, model.location, model.route); } else { return model; } @@ -18166,71 +18509,103 @@ var _user$project$Update$update = F2( return model; } }(); + var _p4 = A2( + _user$project$Update$update, + _user$project$Messages$OnLocationChange(model.location), + newModel); + var newModel_ = _p4._0; return A2( _elm_lang$core$Platform_Cmd_ops['!'], - newModel, + newModel_, {ctor: '[]'}); case 'ToggleEventTypeFilter': - var _p5 = _p0._0; - var currentFilter = model.filter; - var eventTypesFilter = A2(_elm_lang$core$List$member, _p5, model.filter.eventTypes) ? A2( - _elm_lang$core$List$filter, - function (x) { - return !_elm_lang$core$Native_Utils.eq(x, _p5); - }, - model.filter.eventTypes) : {ctor: '::', _0: _p5, _1: model.filter.eventTypes}; - var newFilter = _elm_lang$core$Native_Utils.update( - currentFilter, - {eventTypes: eventTypesFilter}); - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {filter: newFilter}), - {ctor: '[]'}); - case 'ToggleEventLocationFilter': var _p6 = _p0._0; var currentFilter = model.filter; - var eventLocationsFilter = A2(_elm_lang$core$List$member, _p6, model.filter.eventLocations) ? A2( + var eventTypesFilter = A2(_elm_lang$core$List$member, _p6, model.filter.eventTypes) ? A2( _elm_lang$core$List$filter, function (x) { return !_elm_lang$core$Native_Utils.eq(x, _p6); }, - model.filter.eventLocations) : {ctor: '::', _0: _p6, _1: model.filter.eventLocations}; + model.filter.eventTypes) : {ctor: '::', _0: _p6, _1: model.filter.eventTypes}; var newFilter = _elm_lang$core$Native_Utils.update( currentFilter, - {eventLocations: eventLocationsFilter}); + {eventTypes: eventTypesFilter}); + var query = _user$project$Views_FilterView$filterToQuery(newFilter); + var cmd = _elm_lang$navigation$Navigation$newUrl(query); return A2( _elm_lang$core$Platform_Cmd_ops['!'], _elm_lang$core$Native_Utils.update( model, {filter: newFilter}), - {ctor: '[]'}); - case 'ToggleVideoRecordingFilter': + { + ctor: '::', + _0: cmd, + _1: {ctor: '[]'} + }); + case 'ToggleEventLocationFilter': var _p7 = _p0._0; var currentFilter = model.filter; - var videoRecordingFilter = A2(_elm_lang$core$List$member, _p7, model.filter.videoRecording) ? A2( + var eventLocationsFilter = A2(_elm_lang$core$List$member, _p7, model.filter.eventLocations) ? A2( _elm_lang$core$List$filter, function (x) { return !_elm_lang$core$Native_Utils.eq(x, _p7); }, - model.filter.videoRecording) : {ctor: '::', _0: _p7, _1: model.filter.videoRecording}; + model.filter.eventLocations) : {ctor: '::', _0: _p7, _1: model.filter.eventLocations}; var newFilter = _elm_lang$core$Native_Utils.update( currentFilter, - {videoRecording: videoRecordingFilter}); + {eventLocations: eventLocationsFilter}); + var query = _user$project$Views_FilterView$filterToQuery(newFilter); + var cmd = _elm_lang$navigation$Navigation$newUrl(query); return A2( _elm_lang$core$Platform_Cmd_ops['!'], _elm_lang$core$Native_Utils.update( model, {filter: newFilter}), - {ctor: '[]'}); - case 'OnLocationChange': - var newRoute = _user$project$Routing$parseLocation(_p0._0); + { + ctor: '::', + _0: cmd, + _1: {ctor: '[]'} + }); + case 'ToggleVideoRecordingFilter': + var _p8 = _p0._0; + var currentFilter = model.filter; + var videoRecordingFilter = A2(_elm_lang$core$List$member, _p8, model.filter.videoRecording) ? A2( + _elm_lang$core$List$filter, + function (x) { + return !_elm_lang$core$Native_Utils.eq(x, _p8); + }, + model.filter.videoRecording) : {ctor: '::', _0: _p8, _1: model.filter.videoRecording}; + var newFilter = _elm_lang$core$Native_Utils.update( + currentFilter, + {videoRecording: videoRecordingFilter}); + var query = _user$project$Views_FilterView$filterToQuery(newFilter); + var cmd = _elm_lang$navigation$Navigation$newUrl(query); return A2( _elm_lang$core$Platform_Cmd_ops['!'], _elm_lang$core$Native_Utils.update( model, - {route: newRoute}), + {filter: newFilter}), + { + ctor: '::', + _0: cmd, + _1: {ctor: '[]'} + }); + case 'OnLocationChange': + var _p10 = _p0._0; + var newRoute = _user$project$Routing$parseLocation(_p10); + var newFilter = function () { + var _p9 = newRoute; + if (_p9.ctor === 'OverviewFilteredRoute') { + return A2(_user$project$Views_FilterView$parseFilterFromQuery, _p9._0, model); + } else { + return model.filter; + } + }(); + return A2( + _elm_lang$core$Platform_Cmd_ops['!'], + _elm_lang$core$Native_Utils.update( + model, + {filter: newFilter, route: newRoute, location: _p10}), {ctor: '[]'}); default: return A2( @@ -19142,7 +19517,11 @@ var _user$project$Views_EventDetail$eventDetailView = F2( _1: { ctor: '::', _0: {ctor: '_Tuple2', _0: 'schedule-sidebar', _1: true}, - _1: {ctor: '[]'} + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'sticky', _1: true}, + _1: {ctor: '[]'} + } } }), _1: {ctor: '[]'} @@ -19161,230 +19540,6 @@ var _user$project$Views_EventDetail$eventDetailView = F2( }); }); -var _user$project$Views_FilterView$filterChoiceView = F3( - function (filter, currentFilters, action) { - var active = A2(_elm_lang$core$List$member, filter, currentFilters); - var notActive = !active; - return A2( - _elm_lang$html$Html$li, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'filter-choice-active', _1: active}, - _1: {ctor: '[]'} - } - } - }), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Events$onClick( - action(filter)), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$span, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$i, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa-minus', _1: active}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa-plus', _1: notActive}, - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - }, - {ctor: '[]'}), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text( - A2(_elm_lang$core$Basics_ops['++'], ' ', filter.name)), - _1: {ctor: '[]'} - } - }), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }); - }); -var _user$project$Views_FilterView$filterView = F4( - function (name, possibleFilters, currentFilters, action) { - return A2( - _elm_lang$html$Html$div, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text( - A2(_elm_lang$core$Basics_ops['++'], name, ':')), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$ul, - {ctor: '[]'}, - A2( - _elm_lang$core$List$map, - function (filter) { - return A3(_user$project$Views_FilterView$filterChoiceView, filter, currentFilters, action); - }, - possibleFilters)), - _1: {ctor: '[]'} - } - }); - }); -var _user$project$Views_FilterView$applyVideoRecordingFilters = F2( - function (filters, eventInstance) { - var results = A2( - _elm_lang$core$List$map, - function (filter) { - return filter(eventInstance); - }, - filters); - return A2(_elm_lang$core$List$member, true, results); - }); -var _user$project$Views_FilterView$hasRecordingFilter = function (eventInstance) { - return !_elm_lang$core$Native_Utils.eq(eventInstance.videoUrl, ''); -}; -var _user$project$Views_FilterView$recordedFilter = function (eventInstance) { - return _elm_lang$core$Native_Utils.eq(eventInstance.videoRecording, true); -}; -var _user$project$Views_FilterView$notRecordedFilter = function (eventInstance) { - return _elm_lang$core$Native_Utils.eq(eventInstance.videoRecording, false); -}; -var _user$project$Views_FilterView$videoRecordingFilters = { - ctor: '::', - _0: {name: 'Will not be recorded', filter: _user$project$Views_FilterView$notRecordedFilter}, - _1: { - ctor: '::', - _0: {name: 'Will recorded', filter: _user$project$Views_FilterView$recordedFilter}, - _1: { - ctor: '::', - _0: {name: 'Has recording', filter: _user$project$Views_FilterView$hasRecordingFilter}, - _1: {ctor: '[]'} - } - } -}; -var _user$project$Views_FilterView$filterSidebar = function (model) { - return A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'col-sm-3', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'col-sm-push-9', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'schedule-sidebar', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'schedule-filter', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'sticky', _1: true}, - _1: {ctor: '[]'} - } - } - } - } - }), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$h4, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('Filter'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('form-group'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A4(_user$project$Views_FilterView$filterView, 'Type', model.eventTypes, model.filter.eventTypes, _user$project$Messages$ToggleEventTypeFilter), - _1: { - ctor: '::', - _0: A4(_user$project$Views_FilterView$filterView, 'Location', model.eventLocations, model.filter.eventLocations, _user$project$Messages$ToggleEventLocationFilter), - _1: { - ctor: '::', - _0: A4(_user$project$Views_FilterView$filterView, 'Video', _user$project$Views_FilterView$videoRecordingFilters, model.filter.videoRecording, _user$project$Messages$ToggleVideoRecordingFilter), - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - } - }); -}; -var _user$project$Views_FilterView$applyFilters = F2( - function (day, model) { - var videoFilters = A2( - _elm_lang$core$List$map, - function (filter) { - return filter.filter; - }, - _elm_lang$core$List$isEmpty(model.filter.videoRecording) ? _user$project$Views_FilterView$videoRecordingFilters : model.filter.videoRecording); - var locations = A2( - _elm_lang$core$List$map, - function (eventLocation) { - return eventLocation.slug; - }, - _elm_lang$core$List$isEmpty(model.filter.eventLocations) ? model.eventLocations : model.filter.eventLocations); - var types = A2( - _elm_lang$core$List$map, - function (eventType) { - return eventType.slug; - }, - _elm_lang$core$List$isEmpty(model.filter.eventTypes) ? model.eventTypes : model.filter.eventTypes); - var filteredEventInstances = A2( - _elm_lang$core$List$filter, - function (eventInstance) { - return A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Month, eventInstance.from, day.date) && (A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Day, eventInstance.from, day.date) && (A2(_elm_lang$core$List$member, eventInstance.location, locations) && (A2(_elm_lang$core$List$member, eventInstance.eventType, types) && A2(_user$project$Views_FilterView$applyVideoRecordingFilters, videoFilters, eventInstance)))); - }, - model.eventInstances); - return filteredEventInstances; - }); - var _user$project$Views_ScheduleOverview$dayEventInstanceIcons = function (eventInstance) { var videoIcon = (!_elm_lang$core$Native_Utils.eq(eventInstance.videoUrl, '')) ? { ctor: '::', @@ -19633,6 +19788,8 @@ var _user$project$Views$view = function (model) { switch (_p0.ctor) { case 'OverviewRoute': return _user$project$Views_ScheduleOverview$scheduleOverviewView(model); + case 'OverviewFilteredRoute': + return _user$project$Views_ScheduleOverview$scheduleOverviewView(model); case 'DayRoute': var day = function () { var _p1 = _elm_lang$core$List$head( @@ -19684,8 +19841,9 @@ var _user$project$Main$init = F2( {ctor: '[]'}, {ctor: '[]'}, {ctor: '[]'}); - var currentRoute = _user$project$Routing$parseLocation(location); - var initModel = A8( + var currentRoute = _user$project$Routing$parseLocation( + A2(_elm_lang$core$Debug$log, 'location', location)); + var model = A9( _user$project$Models$Model, {ctor: '[]'}, {ctor: '[]'}, @@ -19694,10 +19852,11 @@ var _user$project$Main$init = F2( {ctor: '[]'}, flags, emptyFilter, + location, currentRoute); return A2( _elm_lang$core$Platform_Cmd_ops['!'], - initModel, + model, { ctor: '::', _0: A2(_user$project$WebSocketCalls$sendInitMessage, flags.camp_slug, flags.websocket_server), @@ -19744,7 +19903,7 @@ var _user$project$Main$main = A2( var Elm = {}; Elm['Main'] = Elm['Main'] || {}; if (typeof _user$project$Main$main !== 'undefined') { - _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Messages.Msg":{"args":[],"tags":{"OnLocationChange":["Navigation.Location"],"WebSocketPayload":["String"],"ToggleEventLocationFilter":["Models.EventLocation"],"NoOp":[],"ToggleVideoRecordingFilter":["{ name : String, filter : Models.EventInstance -> Bool }"],"ToggleEventTypeFilter":["Models.EventType"],"BackInHistory":[]}},"Date.Date":{"args":[],"tags":{"Date":[]}}},"aliases":{"Models.EventLocation":{"args":[],"type":"{ name : String, slug : String, icon : String }"},"Models.EventSlug":{"args":[],"type":"String"},"Models.EventType":{"args":[],"type":"{ name : String, slug : String, color : String, lightText : Bool }"},"Models.EventInstance":{"args":[],"type":"{ title : String , slug : Models.EventInstanceSlug , id : Int , url : String , eventSlug : Models.EventSlug , eventType : String , backgroundColor : String , forgroundColor : String , from : Date.Date , to : Date.Date , timeslots : Float , location : String , locationIcon : String , videoRecording : Bool , videoUrl : String }"},"Models.EventInstanceSlug":{"args":[],"type":"String"},"Navigation.Location":{"args":[],"type":"{ href : String , host : String , hostname : String , protocol : String , origin : String , port_ : String , pathname : String , search : String , hash : String , username : String , password : String }"}},"message":"Messages.Msg"},"versions":{"elm":"0.18.0"}}); + _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Messages.Msg":{"args":[],"tags":{"OnLocationChange":["Navigation.Location"],"WebSocketPayload":["String"],"ToggleEventLocationFilter":["Models.EventLocation"],"NoOp":[],"ToggleVideoRecordingFilter":["{ name : String , slug : String , filter : Models.EventInstance -> Bool }"],"ToggleEventTypeFilter":["Models.EventType"],"BackInHistory":[]}},"Date.Date":{"args":[],"tags":{"Date":[]}}},"aliases":{"Models.EventLocation":{"args":[],"type":"{ name : String, slug : String, icon : String }"},"Models.EventSlug":{"args":[],"type":"String"},"Models.EventType":{"args":[],"type":"{ name : String, slug : String, color : String, lightText : Bool }"},"Models.EventInstance":{"args":[],"type":"{ title : String , slug : Models.EventInstanceSlug , id : Int , url : String , eventSlug : Models.EventSlug , eventType : String , backgroundColor : String , forgroundColor : String , from : Date.Date , to : Date.Date , timeslots : Float , location : String , locationIcon : String , videoRecording : Bool , videoUrl : String }"},"Models.EventInstanceSlug":{"args":[],"type":"String"},"Navigation.Location":{"args":[],"type":"{ href : String , host : String , hostname : String , protocol : String , origin : String , port_ : String , pathname : String , search : String , hash : String , username : String , password : String }"}},"message":"Messages.Msg"},"versions":{"elm":"0.18.0"}}); } if (typeof define === "function" && define['amd']) From 3411aee34a2fe5212fe3d07b2972891e7fe0df8a Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 23 Jul 2017 11:31:22 +0200 Subject: [PATCH 29/54] Make a noscript fallback version of the schedule. --- src/bornhack/urls.py | 5 ++ src/program/templates/schedule_overview.html | 19 +++++++ src/program/views.py | 52 ++++---------------- 3 files changed, 34 insertions(+), 42 deletions(-) diff --git a/src/bornhack/urls.py b/src/bornhack/urls.py index e2092980..aa3eec00 100644 --- a/src/bornhack/urls.py +++ b/src/bornhack/urls.py @@ -132,6 +132,11 @@ urlpatterns = [ ScheduleView.as_view(), name='schedule_index' ), + url( + r'^noscript/$', + NoScriptScheduleView.as_view(), + name='noscript_schedule_index' + ), url( r'^ics/', ICSView.as_view(), name="ics_view" ), diff --git a/src/program/templates/schedule_overview.html b/src/program/templates/schedule_overview.html index b6776e33..f12afe7c 100644 --- a/src/program/templates/schedule_overview.html +++ b/src/program/templates/schedule_overview.html @@ -3,8 +3,27 @@ {% load commonmark %} {% load staticfiles %} +{% block extra_head %} + +{% endblock %} + {% block program_content %} + +
diff --git a/src/program/views.py b/src/program/views.py index ca63e4b5..dc16c036 100644 --- a/src/program/views.py +++ b/src/program/views.py @@ -263,54 +263,22 @@ class EventDetailView(CampViewMixin, DetailView): ################## schedule ############################################# +class NoScriptScheduleView(CampViewMixin, TemplateView): + template_name = "noscript_schedule_view.html" + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(**kwargs) + context['eventinstances'] = models.EventInstance.objects.filter(event__camp=self.camp).order_by('when') + return context + + + class ScheduleView(CampViewMixin, TemplateView): template_name = 'schedule_overview.html' def get_context_data(self, *args, **kwargs): context = super(ScheduleView, self).get_context_data(**kwargs) - - # Do stuff if we are dealing with a day schedule - if 'day' in kwargs: - when = datetime.datetime(year=int(self.kwargs['year']), month=int(self.kwargs['month']), day=int(self.kwargs['day'])) - eventinstances = models.EventInstance.objects.filter(event__in=self.camp.events.all()) - skip = [] - for ei in eventinstances: - if ei.schedule_date != when.date(): - skip.append(ei.id) - else: - if 'type' in self.request.GET: - eventtype = models.EventType.objects.get( - slug=self.request.GET['type'] - ) - if ei.event.event_type != eventtype: - skip.append(ei.id) - eventinstances = eventinstances.exclude(id__in=skip).order_by('event__event_type') - if 'location' in self.request.GET: - eventlocation = models.EventLocation.objects.get( - camp=self.camp, - slug=self.request.GET['location'] - ) - eventinstances = eventinstances.filter(location=eventlocation) - - context['eventinstances'] = eventinstances - - start = when + datetime.timedelta(hours=settings.SCHEDULE_MIDNIGHT_OFFSET_HOURS) - timeslots = [] - # calculate how many timeslots we have in the schedule based on the lenght of the timeslots in minutes, - # and the number of minutes in 24 hours - for i in range(0,int((24*60)/settings.SCHEDULE_TIMESLOT_LENGTH_MINUTES)): - timeslot = start + datetime.timedelta(minutes=i*settings.SCHEDULE_TIMESLOT_LENGTH_MINUTES) - timeslots.append(timeslot) - context['timeslots'] = timeslots - - # include the components to make the urls - context['urlyear'] = self.kwargs['year'] - context['urlmonth'] = self.kwargs['month'] - context['urlday'] = self.kwargs['day'] - - context['schedule_timeslot_length_minutes'] = settings.SCHEDULE_TIMESLOT_LENGTH_MINUTES; context['schedule_midnight_offset_hours'] = settings.SCHEDULE_MIDNIGHT_OFFSET_HOURS; - return context From 084d2cee6b4e50bdc5c5f532dbc5fe8b6bd3c457 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 23 Jul 2017 11:37:28 +0200 Subject: [PATCH 30/54] Addin the missing template for noscript fallback. --- .../templates/noscript_schedule_view.html | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/program/templates/noscript_schedule_view.html diff --git a/src/program/templates/noscript_schedule_view.html b/src/program/templates/noscript_schedule_view.html new file mode 100644 index 00000000..c1dfdda5 --- /dev/null +++ b/src/program/templates/noscript_schedule_view.html @@ -0,0 +1,39 @@ +{% extends 'program_base.html' %} + +{% load commonmark %} +{% load staticfiles %} + +{% block program_content %} + +
+ + + + + + + + + + + {% for instance in eventinstances %} + + {% ifchanged instance.when.lower.date %} + + + + {% endifchanged %} + + + + + + + {% endfor %} + +
When?What?Where?
{{ instance.when.lower.date|date:"l Y-m-d" }}
{{ instance.when.lower|date:"H:i" }}-{{ instance.when.upper|date:"H:i" }}{{ instance.event.title }}{{ instance.location.name }}
+ + +
+{% endblock %} + From c237d4ecc7278e61ff299ae7f9a86319be34c796 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 23 Jul 2017 11:52:53 +0200 Subject: [PATCH 31/54] Adding a back buton on event detail if noscript. --- .../templates/schedule_event_detail.html | 58 +++++++++++-------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/src/program/templates/schedule_event_detail.html b/src/program/templates/schedule_event_detail.html index 61b95a70..26cda5e7 100644 --- a/src/program/templates/schedule_event_detail.html +++ b/src/program/templates/schedule_event_detail.html @@ -2,34 +2,46 @@ {% load commonmark %} {% block program_content %} -
-
{{ event.event_type.name }} {{ event.title }}
-
-

- {{ event.abstract|commonmark }} -

-
+ -

Instances

-
    - {% for ei in event.instances.all %} -
  • {{ ei.when.lower|date:"l M. d H:i" }} - {{ ei.when.upper|date:"H:i" }}
  • - {% empty %} - No instances scheduled yet - {% endfor %} -
+
+
+
{{ event.event_type.name }} {{ event.title }}
+
+

+ {{ event.abstract|commonmark }} +

-
+
- {% if event.speakers.exists %} -

Speakers

-
- {% for speaker in event.speakers.all %} -

{{ speaker.name }}

+

Instances

+
    + {% for ei in event.instances.all %} +
  • {{ ei.when.lower|date:"l M. d H:i" }} - {{ ei.when.upper|date:"H:i" }}
  • + {% empty %} + No instances scheduled yet {% endfor %} -
- {% endif %} + + +
+ + {% if event.speakers.exists %} +

Speakers

+
+ {% for speaker in event.speakers.all %} +

{{ speaker.name }}

+ {% endfor %} +
+ {% endif %} +
{% endblock program_content %} From 974694bd5f3a46fa19ef29c4997fc43595b8913c Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 23 Jul 2017 18:30:27 +0200 Subject: [PATCH 32/54] Use Maybe.withDefault some more. Do not show anything before finishing loading data. --- schedule/src/Decoders.elm | 13 +++--- schedule/src/Main.elm | 7 ++-- schedule/src/Models.elm | 1 + schedule/src/Routing.elm | 8 +--- schedule/src/Update.elm | 2 +- schedule/src/Views.elm | 49 ++++++++++++----------- schedule/src/Views/DayView.elm | 29 ++++++-------- schedule/src/Views/EventDetail.elm | 63 ++++++++++++++++++------------ 8 files changed, 86 insertions(+), 86 deletions(-) diff --git a/schedule/src/Decoders.elm b/schedule/src/Decoders.elm index f0433b49..85b7108e 100644 --- a/schedule/src/Decoders.elm +++ b/schedule/src/Decoders.elm @@ -60,13 +60,10 @@ eventDecoder = dateDecoder : Decoder Date dateDecoder = let - unpacked x = - case Date.Extra.fromIsoString x of - Just value -> - value - - Nothing -> - Date.Extra.fromParts 1970 Jan 1 0 0 0 0 + unpacked isoString = + isoString + |> Date.Extra.fromIsoString + |> Maybe.withDefault (Date.Extra.fromParts 1970 Jan 1 0 0 0 0) in Json.Decode.map unpacked string @@ -108,7 +105,7 @@ eventTypeDecoder = |> required "light_text" bool -initDataDecoder : Decoder (Flags -> Filter -> Location -> Route -> Model) +initDataDecoder : Decoder (Flags -> Filter -> Location -> Route -> Bool -> Model) initDataDecoder = decode Model |> required "days" (list dayDecoder) diff --git a/schedule/src/Main.elm b/schedule/src/Main.elm index 3a8ab0d5..67d7af90 100644 --- a/schedule/src/Main.elm +++ b/schedule/src/Main.elm @@ -12,7 +12,6 @@ import Views exposing (view) -- External modules -import Html.Lazy exposing (lazy) import WebSocket exposing (listen) import Navigation exposing (Location) @@ -22,7 +21,7 @@ main = Navigation.programWithFlags OnLocationChange { init = init - , view = lazy view + , view = view , update = update , subscriptions = subscriptions } @@ -32,13 +31,13 @@ init : Flags -> Location -> ( Model, Cmd Msg ) init flags location = let currentRoute = - parseLocation (Debug.log "location" location) + parseLocation location emptyFilter = Filter [] [] [] model = - Model [] [] [] [] [] flags emptyFilter location currentRoute + Model [] [] [] [] [] flags emptyFilter location currentRoute False in model ! [ sendInitMessage flags.camp_slug flags.websocket_server ] diff --git a/schedule/src/Models.elm b/schedule/src/Models.elm index 233f96f4..b2df690c 100644 --- a/schedule/src/Models.elm +++ b/schedule/src/Models.elm @@ -28,6 +28,7 @@ type alias Model = , filter : Filter , location : Location , route : Route + , dataLoaded : Bool } diff --git a/schedule/src/Routing.elm b/schedule/src/Routing.elm index 17417bf3..0bbe9642 100644 --- a/schedule/src/Routing.elm +++ b/schedule/src/Routing.elm @@ -41,9 +41,5 @@ matchers = parseLocation : Location -> Route parseLocation location = - case parseHash matchers location of - Just route -> - route - - Nothing -> - NotFoundRoute + parseHash matchers location + |> Maybe.withDefault NotFoundRoute diff --git a/schedule/src/Update.elm b/schedule/src/Update.elm index d9bea033..d52293dc 100644 --- a/schedule/src/Update.elm +++ b/schedule/src/Update.elm @@ -34,7 +34,7 @@ update msg model = "init" -> case Json.Decode.decodeString initDataDecoder str of Ok m -> - m model.flags model.filter model.location model.route + m model.flags model.filter model.location model.route True Err error -> model diff --git a/schedule/src/Views.elm b/schedule/src/Views.elm index cff006a1..84d66332 100644 --- a/schedule/src/Views.elm +++ b/schedule/src/Views.elm @@ -23,31 +23,34 @@ import Date.Extra view : Model -> Html Msg view model = - div [] - [ dayPicker model - , hr [] [] - , case model.route of - OverviewRoute -> - scheduleOverviewView model + case model.dataLoaded of + True -> + div [] + [ dayPicker model + , hr [] [] + , case model.route of + OverviewRoute -> + scheduleOverviewView model - OverviewFilteredRoute _ -> - scheduleOverviewView model + OverviewFilteredRoute _ -> + scheduleOverviewView model - DayRoute dayIso -> - let - day = - case (List.head (List.filter (\x -> (Date.Extra.toFormattedString "y-MM-dd" x.date) == dayIso) model.days)) of - Just day -> - day + DayRoute dayIso -> + let + day = + model.days + |> List.filter (\x -> (Date.Extra.toFormattedString "y-MM-dd" x.date) == dayIso) + |> List.head + |> Maybe.withDefault (Day "" (Date.Extra.fromParts 1970 Jan 1 0 0 0 0) "") + in + dayView day model - Nothing -> - Day "" (Date.Extra.fromParts 1970 Jan 1 0 0 0 0) "" - in - dayView day model + EventRoute eventSlug -> + eventDetailView eventSlug model - EventRoute eventSlug -> - eventDetailView eventSlug model + NotFoundRoute -> + div [] [ text "Not found!" ] + ] - NotFoundRoute -> - div [] [ text "Not found!" ] - ] + False -> + h4 [] [ text "Loading schedule..." ] diff --git a/schedule/src/Views/DayView.elm b/schedule/src/Views/DayView.elm index 77d15ec3..b2fc099c 100644 --- a/schedule/src/Views/DayView.elm +++ b/schedule/src/Views/DayView.elm @@ -146,24 +146,19 @@ renderGroup offset group = List.map findLefts sortedGroup numberInGroup = - case List.maximum (List.map (\( _, left ) -> left) lefts) of - Just num -> - num - - Nothing -> - 1 + lefts + |> List.map (\( _, left ) -> left) + |> List.maximum + |> Maybe.withDefault 1 fixedLefts = if numberInGroup == 0 then List.map (\( instance, x ) -> ( instance - , case List.Extra.elemIndex ( instance, x ) lefts of - Just index -> - index - - Nothing -> - 0 + , lefts + |> List.Extra.elemIndex ( instance, x ) + |> Maybe.withDefault 0 ) ) lefts @@ -171,12 +166,10 @@ renderGroup offset group = lefts fixedNumberInGroup = - case List.maximum (List.map (\( _, left ) -> left) fixedLefts) of - Just num -> - num - - Nothing -> - 1 + fixedLefts + |> List.map (\( _, left ) -> left) + |> List.maximum + |> Maybe.withDefault 1 in div [ style diff --git a/schedule/src/Views/EventDetail.elm b/schedule/src/Views/EventDetail.elm index 9f231514..0ddf5e17 100644 --- a/schedule/src/Views/EventDetail.elm +++ b/schedule/src/Views/EventDetail.elm @@ -19,35 +19,46 @@ eventDetailView : EventSlug -> Model -> Html Msg eventDetailView eventSlug model = let event = - case List.head (List.filter (\e -> e.slug == eventSlug) model.events) of - Just event -> - event - - Nothing -> - { title = "", slug = "", abstract = "", speakers = [], videoRecording = False, videoUrl = "" } + model.events + |> List.filter (\e -> e.slug == eventSlug) + |> List.head in - div [ class "row" ] - [ div [ class "col-sm-9" ] - [ a [ onClick BackInHistory, classList [ ( "btn", True ), ( "btn-default", True ) ] ] - [ i [ classList [ ( "fa", True ), ( "fa-chevron-left", True ) ] ] [] - , text " Back" + case event of + Just event -> + div [ class "row" ] + [ div [ class "col-sm-9" ] + [ a [ onClick BackInHistory, classList [ ( "btn", True ), ( "btn-default", True ) ] ] + [ i [ classList [ ( "fa", True ), ( "fa-chevron-left", True ) ] ] [] + , text " Back" + ] + , h4 [] [ text event.title ] + , p [] [ Markdown.toHtml [] event.abstract ] + , hr [] [] + , eventInstancesList eventSlug model.eventInstances + ] + , div + [ classList + [ ( "col-sm-3", True ) + , ( "schedule-sidebar", True ) + , ( "sticky", True ) + ] + ] + [ videoRecordingSidebar event + , speakerSidebar event.speakers + ] ] - , h4 [] [ text event.title ] - , p [] [ Markdown.toHtml [] event.abstract ] - , hr [] [] - , eventInstancesList eventSlug model.eventInstances - ] - , div - [ classList - [ ( "col-sm-3", True ) - , ( "schedule-sidebar", True ) - , ( "sticky", True ) + + Nothing -> + div [ class "row" ] + [ text + (case model.dataLoaded of + True -> + "Event not found." + + False -> + "Loading..." + ) ] - ] - [ videoRecordingSidebar event - , speakerSidebar event.speakers - ] - ] videoRecordingSidebar : Event -> Html Msg From a447ca476fb52ee6f67fc8cb20a78c33e1f6a2a1 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Thu, 27 Jul 2017 23:21:16 +0200 Subject: [PATCH 33/54] Working on event detail. Also small visual help in DayView. Also some favorite stuff. --- schedule/src/Decoders.elm | 4 +- schedule/src/Models.elm | 2 + schedule/src/Views/DayView.elm | 29 +++- schedule/src/Views/EventDetail.elm | 154 +++++++++++-------- src/program/models.py | 1 + src/program/templates/schedule_overview.html | 2 +- src/static_src/css/bornhack.css | 8 +- 7 files changed, 131 insertions(+), 69 deletions(-) diff --git a/schedule/src/Decoders.elm b/schedule/src/Decoders.elm index 85b7108e..09ae2452 100644 --- a/schedule/src/Decoders.elm +++ b/schedule/src/Decoders.elm @@ -7,7 +7,7 @@ import Models exposing (Day, Speaker, Event, EventInstance, EventLocation, Event -- Core modules -import Json.Decode exposing (int, string, float, list, bool, dict, Decoder) +import Json.Decode exposing (int, string, float, list, bool, dict, Decoder, nullable) import Json.Decode.Pipeline exposing (decode, required, optional, hardcoded) import Date exposing (Date, Month(..)) @@ -55,6 +55,7 @@ eventDecoder = |> required "speakers" (list speakerDecoder) |> required "video_recording" bool |> optional "video_url" string "" + |> required "event_type" string dateDecoder : Decoder Date @@ -86,6 +87,7 @@ eventInstanceDecoder = |> required "location_icon" string |> required "video_recording" bool |> optional "video_url" string "" + |> optional "is_favorited" (nullable bool) Nothing eventLocationDecoder : Decoder EventLocation diff --git a/schedule/src/Models.elm b/schedule/src/Models.elm index b2df690c..b8f09f10 100644 --- a/schedule/src/Models.elm +++ b/schedule/src/Models.elm @@ -75,6 +75,7 @@ type alias EventInstance = , locationIcon : String , videoRecording : Bool , videoUrl : String + , isFavorited : Maybe Bool } @@ -85,6 +86,7 @@ type alias Event = , speakers : List Speaker , videoRecording : Bool , videoUrl : String + , eventType : String } diff --git a/schedule/src/Views/DayView.elm b/schedule/src/Views/DayView.elm index b2fc099c..4c659fa1 100644 --- a/schedule/src/Views/DayView.elm +++ b/schedule/src/Views/DayView.elm @@ -52,12 +52,12 @@ dayView day model = div [ classList [ ( "row", True ) ] ] [ gutter minutes - , locationColumns filteredEventInstances model.eventLocations model.flags.schedule_midnight_offset_hours + , locationColumns filteredEventInstances model.eventLocations model.flags.schedule_midnight_offset_hours minutes ] -locationColumns : List EventInstance -> List EventLocation -> Int -> Html Msg -locationColumns eventInstances eventLocations offset = +locationColumns : List EventInstance -> List EventLocation -> Int -> List Date -> Html Msg +locationColumns eventInstances eventLocations offset minutes = let columnWidth = 100.0 / toFloat (List.length eventLocations) @@ -71,11 +71,11 @@ locationColumns eventInstances eventLocations offset = [ ( "col-sm-11", True ) ] ] - (List.map (\location -> locationColumn columnWidth eventInstances offset location) eventLocations) + (List.map (\location -> locationColumn columnWidth eventInstances offset minutes location) eventLocations) -locationColumn : Float -> List EventInstance -> Int -> EventLocation -> Html Msg -locationColumn columnWidth eventInstances offset location = +locationColumn : Float -> List EventInstance -> Int -> List Date -> EventLocation -> Html Msg +locationColumn columnWidth eventInstances offset minutes location = let locationInstances = List.filter (\instance -> instance.location == location.slug) eventInstances @@ -102,6 +102,23 @@ locationColumn columnWidth eventInstances offset location = ] [ text location.name ] ] + ++ (List.map + (\x -> + div + [ style + [ ( "backgroundColor" + , if Date.minute x == 30 || Date.minute x == 45 then + "#f8f8f8" + else + "#fff" + ) + , ( "height", px blockHeight ) + ] + ] + [] + ) + minutes + ) ++ (List.map (\group -> renderGroup offset group) overlappingGroups) ) diff --git a/schedule/src/Views/EventDetail.elm b/schedule/src/Views/EventDetail.elm index 0ddf5e17..a098f5a3 100644 --- a/schedule/src/Views/EventDetail.elm +++ b/schedule/src/Views/EventDetail.elm @@ -6,9 +6,14 @@ import Messages exposing (Msg(..)) import Models exposing (..) +-- Core modules + +import Date + + -- External modules -import Html exposing (Html, text, div, ul, li, span, i, h4, a, p, hr) +import Html exposing (Html, text, div, ul, li, span, i, h3, h4, a, p, hr, strong) import Html.Attributes exposing (class, classList, href) import Html.Events exposing (onClick) import Markdown @@ -22,58 +27,84 @@ eventDetailView eventSlug model = model.events |> List.filter (\e -> e.slug == eventSlug) |> List.head + + eventInstances = + List.filter (\instance -> instance.eventSlug == eventSlug) model.eventInstances in case event of Just event -> div [ class "row" ] - [ div [ class "col-sm-9" ] - [ a [ onClick BackInHistory, classList [ ( "btn", True ), ( "btn-default", True ) ] ] - [ i [ classList [ ( "fa", True ), ( "fa-chevron-left", True ) ] ] [] - , text " Back" - ] - , h4 [] [ text event.title ] - , p [] [ Markdown.toHtml [] event.abstract ] - , hr [] [] - , eventInstancesList eventSlug model.eventInstances - ] - , div - [ classList - [ ( "col-sm-3", True ) - , ( "schedule-sidebar", True ) - , ( "sticky", True ) - ] - ] - [ videoRecordingSidebar event - , speakerSidebar event.speakers - ] + [ eventDetailContent event + , eventDetailSidebar event eventInstances ] Nothing -> div [ class "row" ] - [ text - (case model.dataLoaded of - True -> - "Event not found." - - False -> - "Loading..." - ) + [ h4 [] [ text "Event not found." ] + , a [ href "#" ] [ text "Click here to go the schedule overview." ] ] -videoRecordingSidebar : Event -> Html Msg -videoRecordingSidebar event = +eventDetailContent : Event -> Html Msg +eventDetailContent event = + div [ class "col-sm-9" ] + [ a [ onClick BackInHistory, classList [ ( "btn", True ), ( "btn-default", True ) ] ] + [ i [ classList [ ( "fa", True ), ( "fa-chevron-left", True ) ] ] [] + , text " Back" + ] + , h3 [] [ text event.title ] + , p [] [ Markdown.toHtml [] event.abstract ] + ] + + +eventDetailSidebar : Event -> List EventInstance -> Html Msg +eventDetailSidebar event eventInstances = let - ( video, willBeRecorded ) = - if event.videoUrl /= "" then - ( h4 [] [ text "Watch the video here!" ], True ) - else if event.videoRecording == True then - ( h4 [] [ text "This event will be recorded!" ], True ) - else - ( h4 [] [ text "This event will NOT be recorded!" ], False ) + videoRecordingLink = + case event.videoUrl of + "" -> + [] + + _ -> + [ a [ href event.videoUrl, classList [ ( "btn", True ), ( "btn-success", True ) ] ] + [ i [ classList [ ( "fa", True ), ( "fa-film", True ) ] ] [] + , text " Watch recording here!" + ] + ] in - div [ classList [ ( "alert", True ), ( "alert-danger", not willBeRecorded ), ( "alert-info", willBeRecorded ) ] ] - [ video ] + div + [ classList + [ ( "col-sm-3", True ) + , ( "schedule-sidebar", True ) + , ( "sticky", True ) + ] + ] + (videoRecordingLink + ++ [ speakerSidebar event.speakers + , eventMetaDataSidebar event + , eventInstancesSidebar eventInstances + ] + ) + + +eventMetaDataSidebar : Event -> Html Msg +eventMetaDataSidebar event = + let + videoRecording = + case event.videoRecording of + True -> + "Yes" + + False -> + "No" + in + div [] + [ h4 [] [ text "Metadata" ] + , ul [] + [ li [] [ strong [] [ text "Type: " ], text event.eventType ] + , li [] [ strong [] [ text "Recording: " ], text videoRecording ] + ] + ] speakerSidebar : List Speaker -> Html Msg @@ -94,27 +125,30 @@ speakerDetail speaker = ] -eventInstancesList : String -> List EventInstance -> Html Msg -eventInstancesList eventSlug eventInstances = - let - instances = - List.filter (\instance -> instance.eventSlug == eventSlug) eventInstances - in - div [] - [ h4 [] - [ text "This event will occur at:" ] - , ul - [] - (List.map eventInstanceItem instances) - ] +eventInstancesSidebar : List EventInstance -> Html Msg +eventInstancesSidebar eventInstances = + div [] + [ h4 [] + [ text "This event will occur at:" ] + , ul + [] + (List.map eventInstanceItem eventInstances) + ] eventInstanceItem : EventInstance -> Html Msg eventInstanceItem eventInstance = - li [] - [ text - ((Date.Extra.toFormattedString "y-MM-dd HH:mm" eventInstance.from) - ++ " to " - ++ (Date.Extra.toFormattedString "y-MM-d HH:mm" eventInstance.to) - ) - ] + let + toFormat = + if Date.day eventInstance.from == Date.day eventInstance.to then + "HH:mm" + else + "E HH:mm" + in + li [] + [ text + ((Date.Extra.toFormattedString "E HH:mm" eventInstance.from) + ++ " to " + ++ (Date.Extra.toFormattedString toFormat eventInstance.to) + ) + ] diff --git a/src/program/models.py b/src/program/models.py index ceba4bb7..2bdea6b1 100644 --- a/src/program/models.py +++ b/src/program/models.py @@ -438,6 +438,7 @@ class Event(CampRelatedModel): for speaker in self.speakers.all() ], 'video_recording': self.video_recording, + 'event_type': self.event_type.name, } if self.video_url: diff --git a/src/program/templates/schedule_overview.html b/src/program/templates/schedule_overview.html index f12afe7c..4aba3379 100644 --- a/src/program/templates/schedule_overview.html +++ b/src/program/templates/schedule_overview.html @@ -5,7 +5,7 @@ {% block extra_head %} {% endblock %} diff --git a/src/static_src/css/bornhack.css b/src/static_src/css/bornhack.css index 12f19341..c9241aba 100644 --- a/src/static_src/css/bornhack.css +++ b/src/static_src/css/bornhack.css @@ -220,10 +220,16 @@ footer { .schedule-filter ul { list-style: none; padding: 0; + display: flex; + flex-wrap: wrap; +} + +.schedule-filter ul li { + flex: 1; } .schedule-filter .btn { - min-width: 200px; + width: 100%; text-align: left; } From d4d7fad43941c07a6ff142b87dfd65a8826b9e97 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 2 Aug 2017 22:20:38 +0200 Subject: [PATCH 34/54] Cleanups. Adding Speaker detail. --- schedule/src/Decoders.elm | 7 ++- schedule/src/Main.elm | 2 +- schedule/src/Messages.elm | 4 +- schedule/src/Models.elm | 50 +++++++++++++++----- schedule/src/Routing.elm | 35 ++++++++++++-- schedule/src/Views.elm | 4 ++ schedule/src/Views/DayPicker.elm | 5 +- schedule/src/Views/DayView.elm | 5 +- schedule/src/Views/EventDetail.elm | 62 +++++++++++++++++++++---- schedule/src/Views/FilterView.elm | 13 +++--- schedule/src/Views/ScheduleOverview.elm | 5 +- src/program/consumers.py | 6 ++- src/program/models.py | 23 ++++++++- 13 files changed, 177 insertions(+), 44 deletions(-) diff --git a/schedule/src/Decoders.elm b/schedule/src/Decoders.elm index 09ae2452..44d469ac 100644 --- a/schedule/src/Decoders.elm +++ b/schedule/src/Decoders.elm @@ -44,6 +44,10 @@ speakerDecoder : Decoder Speaker speakerDecoder = decode Speaker |> required "name" string + |> required "slug" string + |> required "biography" string + |> optional "large_picture_url" (nullable string) Nothing + |> optional "small_picture_url" (nullable string) Nothing eventDecoder : Decoder Event @@ -52,7 +56,7 @@ eventDecoder = |> required "title" string |> required "slug" string |> required "abstract" string - |> required "speakers" (list speakerDecoder) + |> required "speaker_slugs" (list string) |> required "video_recording" bool |> optional "video_url" string "" |> required "event_type" string @@ -115,3 +119,4 @@ initDataDecoder = |> required "event_instances" (list eventInstanceDecoder) |> required "event_locations" (list eventLocationDecoder) |> required "event_types" (list eventTypeDecoder) + |> required "speakers" (list speakerDecoder) diff --git a/schedule/src/Main.elm b/schedule/src/Main.elm index 67d7af90..7b03faeb 100644 --- a/schedule/src/Main.elm +++ b/schedule/src/Main.elm @@ -37,7 +37,7 @@ init flags location = Filter [] [] [] model = - Model [] [] [] [] [] flags emptyFilter location currentRoute False + Model [] [] [] [] [] [] flags emptyFilter location currentRoute False in model ! [ sendInitMessage flags.camp_slug flags.websocket_server ] diff --git a/schedule/src/Messages.elm b/schedule/src/Messages.elm index 502f29cd..db48160e 100644 --- a/schedule/src/Messages.elm +++ b/schedule/src/Messages.elm @@ -2,7 +2,7 @@ module Messages exposing (Msg(..)) -- Local modules -import Models exposing (Day, EventType, EventLocation, EventInstance) +import Models exposing (Day, EventType, EventLocation, EventInstance, VideoRecordingFilter) -- External modules @@ -15,6 +15,6 @@ type Msg | WebSocketPayload String | ToggleEventTypeFilter EventType | ToggleEventLocationFilter EventLocation - | ToggleVideoRecordingFilter { name : String, slug : String, filter : EventInstance -> Bool } + | ToggleVideoRecordingFilter VideoRecordingFilter | OnLocationChange Location | BackInHistory diff --git a/schedule/src/Models.elm b/schedule/src/Models.elm index b8f09f10..53be6e49 100644 --- a/schedule/src/Models.elm +++ b/schedule/src/Models.elm @@ -10,11 +10,36 @@ import Date exposing (Date, now) import Navigation exposing (Location) +type alias EventSlug = + String + + +type alias EventInstanceSlug = + String + + +type alias SpeakerSlug = + String + + +type alias DaySlug = + String + + +type alias FilterQuery = + String + + + +-- Route is defined here rather than in Routing.elm due to it being used in Model. If it were in Routing.elm we would have a circular dependency. + + type Route = OverviewRoute - | OverviewFilteredRoute String - | DayRoute String + | OverviewFilteredRoute FilterQuery + | DayRoute DaySlug | EventRoute EventSlug + | SpeakerRoute SpeakerSlug | NotFoundRoute @@ -24,6 +49,7 @@ type alias Model = , eventInstances : List EventInstance , eventLocations : List EventLocation , eventTypes : List EventType + , speakers : List Speaker , flags : Flags , filter : Filter , location : Location @@ -35,10 +61,14 @@ type alias Model = type alias Filter = { eventTypes : List EventType , eventLocations : List EventLocation - , videoRecording : List { name : String, slug : String, filter : EventInstance -> Bool } + , videoRecording : List VideoRecordingFilter } +type alias VideoRecordingFilter = + { name : String, slug : String, filter : EventInstance -> Bool } + + type alias Day = { day_name : String , date : Date @@ -48,17 +78,13 @@ type alias Day = type alias Speaker = { name : String + , slug : SpeakerSlug + , biography : String + , largePictureUrl : Maybe String + , smallPictureUrl : Maybe String } -type alias EventSlug = - String - - -type alias EventInstanceSlug = - String - - type alias EventInstance = { title : String , slug : EventInstanceSlug @@ -83,7 +109,7 @@ type alias Event = { title : String , slug : EventSlug , abstract : String - , speakers : List Speaker + , speakerSlugs : List SpeakerSlug , videoRecording : Bool , videoUrl : String , eventType : String diff --git a/schedule/src/Routing.elm b/schedule/src/Routing.elm index 0bbe9642..653edde5 100644 --- a/schedule/src/Routing.elm +++ b/schedule/src/Routing.elm @@ -14,16 +14,16 @@ import UrlParser exposing (Parser, (), oneOf, map, top, s, string, parseHash) {-- URLs to support: -- # +- #/ This show the overview of the schedule -- #?type={types},location={locations},video={no,yes,link} +- #/?type={types},location={locations},video={not-to-be-recorded,to-be-recorded,has-recording} This is the overview, just with filters enable -- #day/{year}-{month}-{day} +- #/day/{year}-{month}-{day} Show a particular day -- #event/{slug} +- #/event/{slug} Show a particular event --} @@ -36,6 +36,7 @@ matchers = , map OverviewFilteredRoute (top string) , map DayRoute (s "day" string) , map EventRoute (s "event" string) + , map SpeakerRoute (s "speaker" string) ] @@ -43,3 +44,29 @@ parseLocation : Location -> Route parseLocation location = parseHash matchers location |> Maybe.withDefault NotFoundRoute + + +routeToString : Route -> String +routeToString route = + let + parts = + case route of + OverviewRoute -> + [] + + OverviewFilteredRoute query -> + [ query ] + + DayRoute iso -> + [ "day", iso ] + + EventRoute slug -> + [ "event", slug ] + + SpeakerRoute slug -> + [ "speaker", slug ] + + NotFoundRoute -> + [] + in + "#/" ++ String.join "/" parts diff --git a/schedule/src/Views.elm b/schedule/src/Views.elm index 84d66332..2da55990 100644 --- a/schedule/src/Views.elm +++ b/schedule/src/Views.elm @@ -7,6 +7,7 @@ import Messages exposing (Msg(..)) import Views.DayPicker exposing (dayPicker) import Views.DayView exposing (dayView) import Views.EventDetail exposing (eventDetailView) +import Views.SpeakerDetail exposing (speakerDetailView) import Views.ScheduleOverview exposing (scheduleOverviewView) @@ -48,6 +49,9 @@ view model = EventRoute eventSlug -> eventDetailView eventSlug model + SpeakerRoute speakerSlug -> + speakerDetailView speakerSlug model + NotFoundRoute -> div [] [ text "Not found!" ] ] diff --git a/schedule/src/Views/DayPicker.elm b/schedule/src/Views/DayPicker.elm index 4a6c0a88..d7a8b5f5 100644 --- a/schedule/src/Views/DayPicker.elm +++ b/schedule/src/Views/DayPicker.elm @@ -4,6 +4,7 @@ module Views.DayPicker exposing (..) import Models exposing (..) import Messages exposing (Msg(..)) +import Routing exposing (routeToString) -- Core modules @@ -51,7 +52,7 @@ dayPicker model = , ( "btn-default", not isAllDaysActive ) , ( "btn-primary", isAllDaysActive ) ] - , href ("#") + , href <| routeToString OverviewRoute ] [ text "All Days" ] @@ -78,7 +79,7 @@ dayButton day activeDate = , ( "btn-default", not isActive ) , ( "btn-primary", isActive ) ] - , href ("#day/" ++ (Date.Extra.toFormattedString "y-MM-dd" day.date)) + , href <| routeToString <| DayRoute <| Date.Extra.toFormattedString "y-MM-dd" day.date ] [ text day.day_name ] diff --git a/schedule/src/Views/DayView.elm b/schedule/src/Views/DayView.elm index 4c659fa1..9745c40d 100644 --- a/schedule/src/Views/DayView.elm +++ b/schedule/src/Views/DayView.elm @@ -3,7 +3,8 @@ module Views.DayView exposing (dayView) -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, Day, EventInstance, EventLocation) +import Models exposing (Model, Day, EventInstance, EventLocation, Route(EventRoute)) +import Routing exposing (routeToString) -- Core modules @@ -236,7 +237,7 @@ eventInstanceBlock offset numberInGroup ( eventInstance, lefts ) = , ( "background-color", eventInstance.backgroundColor ) , ( "color", eventInstance.forgroundColor ) ] - , href ("#event/" ++ eventInstance.eventSlug) + , href <| routeToString <| EventRoute eventInstance.eventSlug ] [ p [] [ text ((Date.Extra.toFormattedString "HH:mm" eventInstance.from) ++ " " ++ eventInstance.title) ] ] diff --git a/schedule/src/Views/EventDetail.elm b/schedule/src/Views/EventDetail.elm index a098f5a3..aae9f710 100644 --- a/schedule/src/Views/EventDetail.elm +++ b/schedule/src/Views/EventDetail.elm @@ -4,6 +4,7 @@ module Views.EventDetail exposing (eventDetailView) import Messages exposing (Msg(..)) import Models exposing (..) +import Routing exposing (routeToString) -- Core modules @@ -27,15 +28,12 @@ eventDetailView eventSlug model = model.events |> List.filter (\e -> e.slug == eventSlug) |> List.head - - eventInstances = - List.filter (\instance -> instance.eventSlug == eventSlug) model.eventInstances in case event of Just event -> div [ class "row" ] [ eventDetailContent event - , eventDetailSidebar event eventInstances + , eventDetailSidebar event model ] Nothing -> @@ -53,12 +51,52 @@ eventDetailContent event = , text " Back" ] , h3 [] [ text event.title ] - , p [] [ Markdown.toHtml [] event.abstract ] + , div [] [ Markdown.toHtml [] event.abstract ] ] -eventDetailSidebar : Event -> List EventInstance -> Html Msg -eventDetailSidebar event eventInstances = +getSpeakersFromSlugs : List Speaker -> List SpeakerSlug -> List Speaker -> List Speaker +getSpeakersFromSlugs speakers slugs collectedSpeakers = + case speakers of + [] -> + collectedSpeakers + + speaker :: rest -> + let + foundSlug = + slugs + |> List.filter (\slug -> slug == speaker.slug) + |> List.head + + foundSpeaker = + case foundSlug of + Just slug -> + [ speaker ] + + Nothing -> + [] + + newSlugs = + case foundSlug of + Just slug -> + List.filter (\x -> x /= slug) slugs + + Nothing -> + slugs + + newCollectedSpeakers = + collectedSpeakers ++ foundSpeaker + in + case slugs of + [] -> + collectedSpeakers + + _ -> + getSpeakersFromSlugs rest newSlugs newCollectedSpeakers + + +eventDetailSidebar : Event -> Model -> Html Msg +eventDetailSidebar event model = let videoRecordingLink = case event.videoUrl of @@ -71,6 +109,12 @@ eventDetailSidebar event eventInstances = , text " Watch recording here!" ] ] + + eventInstances = + List.filter (\instance -> instance.eventSlug == event.slug) model.eventInstances + + speakers = + getSpeakersFromSlugs model.speakers event.speakerSlugs [] in div [ classList @@ -80,7 +124,7 @@ eventDetailSidebar event eventInstances = ] ] (videoRecordingLink - ++ [ speakerSidebar event.speakers + ++ [ speakerSidebar speakers , eventMetaDataSidebar event , eventInstancesSidebar eventInstances ] @@ -121,7 +165,7 @@ speakerSidebar speakers = speakerDetail : Speaker -> Html Msg speakerDetail speaker = li [] - [ text speaker.name + [ a [ href <| routeToString <| SpeakerRoute speaker.slug ] [ text speaker.name ] ] diff --git a/schedule/src/Views/FilterView.elm b/schedule/src/Views/FilterView.elm index 2718b418..a6e4700d 100644 --- a/schedule/src/Views/FilterView.elm +++ b/schedule/src/Views/FilterView.elm @@ -3,7 +3,8 @@ module Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQu -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, EventInstance, Filter, Day) +import Models exposing (Model, EventInstance, Filter, Day, FilterQuery, Route(OverviewFilteredRoute), VideoRecordingFilter) +import Routing exposing (routeToString) -- Core modules @@ -14,7 +15,7 @@ import Regex -- External modules import Html exposing (Html, text, div, ul, li, span, i, h4) -import Html.Attributes exposing (class, classList, href) +import Html.Attributes exposing (class, classList) import Html.Events exposing (onClick) import Date.Extra exposing (Interval(..), equalBy) @@ -95,7 +96,7 @@ hasRecordingFilter eventInstance = eventInstance.videoUrl /= "" -videoRecordingFilters : List { name : String, slug : String, filter : EventInstance -> Bool } +videoRecordingFilters : List VideoRecordingFilter videoRecordingFilters = [ { name = "Will not be recorded", slug = "not-to-be-recorded", filter = notRecordedFilter } , { name = "Will recorded", slug = "to-be-recorded", filter = recordedFilter } @@ -177,7 +178,7 @@ getFilter filterType modelItems query = List.filterMap (\x -> findFilter modelItems x) filterSlugs -parseFilterFromQuery : String -> Model -> Filter +parseFilterFromQuery : FilterQuery -> Model -> Filter parseFilterFromQuery query model = let types = @@ -195,7 +196,7 @@ parseFilterFromQuery query model = } -filterToQuery : Filter -> String +filterToQuery : Filter -> FilterQuery filterToQuery filter = let typePart = @@ -225,4 +226,4 @@ filterToQuery filter = result = String.join "&" (List.filter (\x -> x /= "") [ typePart, locationPart, videoPart ]) in - "#" ++ result + routeToString <| OverviewFilteredRoute result diff --git a/schedule/src/Views/ScheduleOverview.elm b/schedule/src/Views/ScheduleOverview.elm index 04c4a332..e99a55c7 100644 --- a/schedule/src/Views/ScheduleOverview.elm +++ b/schedule/src/Views/ScheduleOverview.elm @@ -3,8 +3,9 @@ module Views.ScheduleOverview exposing (scheduleOverviewView) -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, Day, EventInstance, Filter) +import Models exposing (Model, Day, EventInstance, Filter, Route(EventRoute)) import Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQuery) +import Routing exposing (routeToString) -- External modules @@ -50,7 +51,7 @@ dayEventInstanceView eventInstance = [ ( "event", True ) , ( "event-in-overview", True ) ] - , href ("#event/" ++ eventInstance.eventSlug) + , href <| routeToString <| EventRoute eventInstance.eventSlug , style [ ( "background-color", eventInstance.backgroundColor ) , ( "color", eventInstance.forgroundColor ) diff --git a/src/program/consumers.py b/src/program/consumers.py index 84a6e7fd..4c659066 100644 --- a/src/program/consumers.py +++ b/src/program/consumers.py @@ -1,7 +1,7 @@ from channels.generic.websockets import JsonWebsocketConsumer from camps.models import Camp -from .models import Event, EventInstance, Favorite, EventLocation, EventType +from .models import Event, EventInstance, Favorite, EventLocation, EventType, Speaker class ScheduleConsumer(JsonWebsocketConsumer): @@ -41,12 +41,16 @@ class ScheduleConsumer(JsonWebsocketConsumer): event_types_query_set = EventType.objects.filter() event_types = list([x.serialize() for x in event_types_query_set]) + speakers_query_set = Speaker.objects.filter(camp=camp) + speakers = list([x.serialize() for x in speakers_query_set]) + data = { "action": "init", "events": events, "event_instances": event_instances, "event_locations": event_locations, "event_types": event_types, + "speakers": speakers, "days": days, } except Camp.DoesNotExist: diff --git a/src/program/models.py b/src/program/models.py index 2bdea6b1..b5e8187b 100644 --- a/src/program/models.py +++ b/src/program/models.py @@ -14,6 +14,8 @@ from django.dispatch import receiver from django.utils.text import slugify from django.conf import settings from django.core.urlresolvers import reverse_lazy +from django.core.exceptions import ValidationError +from django.core.urlresolvers import reverse_lazy, reverse from django.core.files.storage import FileSystemStorage from django.urls import reverse from django.apps import apps @@ -433,8 +435,8 @@ class Event(CampRelatedModel): 'title': self.title, 'slug': self.slug, 'abstract': self.abstract, - 'speakers': [ - speaker.serialize() + 'speaker_slugs': [ + speaker.slug for speaker in self.speakers.all() ], 'video_recording': self.video_recording, @@ -613,10 +615,27 @@ class Speaker(CampRelatedModel): def get_absolute_url(self): return reverse_lazy('speaker_detail', kwargs={'camp_slug': self.camp.slug, 'slug': self.slug}) + def get_picture_url(self, size): + return reverse('speaker_picture', kwargs={'camp_slug': self.camp.slug, 'slug': self.slug, 'picture': size}) + + def get_small_picture_url(self): + return self.get_picture_url('thumbnail') + + def get_large_picture_url(self): + return self.get_picture_url('large') + + def serialize(self): data = { 'name': self.name, + 'slug': self.slug, + 'biography': self.biography, } + + if self.picture_small and self.picture_large: + data['large_picture_url'] = self.get_large_picture_url() + data['small_picture_url'] = self.get_small_picture_url() + return data From 5ce2a590367b6d74d6848f70dc10654410570feb Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 2 Aug 2017 22:36:18 +0200 Subject: [PATCH 35/54] Adding lates compiled version. --- src/program/static/js/elm_based_schedule.js | 1316 +++++++++++++------ 1 file changed, 916 insertions(+), 400 deletions(-) diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js index 81301584..eec9f1a8 100644 --- a/src/program/static/js/elm_based_schedule.js +++ b/src/program/static/js/elm_based_schedule.js @@ -17831,21 +17831,45 @@ var _justinmimbs$elm_date_extra$Date_Extra$equalBy = F3( var _justinmimbs$elm_date_extra$Date_Extra$Second = {ctor: 'Second'}; var _justinmimbs$elm_date_extra$Date_Extra$Millisecond = {ctor: 'Millisecond'}; -var _user$project$Models$Model = F9( - function (a, b, c, d, e, f, g, h, i) { - return {days: a, events: b, eventInstances: c, eventLocations: d, eventTypes: e, flags: f, filter: g, location: h, route: i}; - }); +var _user$project$Models$Model = function (a) { + return function (b) { + return function (c) { + return function (d) { + return function (e) { + return function (f) { + return function (g) { + return function (h) { + return function (i) { + return function (j) { + return function (k) { + return {days: a, events: b, eventInstances: c, eventLocations: d, eventTypes: e, speakers: f, flags: g, filter: h, location: i, route: j, dataLoaded: k}; + }; + }; + }; + }; + }; + }; + }; + }; + }; + }; +}; var _user$project$Models$Filter = F3( function (a, b, c) { return {eventTypes: a, eventLocations: b, videoRecording: c}; }); +var _user$project$Models$VideoRecordingFilter = F3( + function (a, b, c) { + return {name: a, slug: b, filter: c}; + }); var _user$project$Models$Day = F3( function (a, b, c) { return {day_name: a, date: b, repr: c}; }); -var _user$project$Models$Speaker = function (a) { - return {name: a}; -}; +var _user$project$Models$Speaker = F5( + function (a, b, c, d, e) { + return {name: a, slug: b, biography: c, largePictureUrl: d, smallPictureUrl: e}; + }); var _user$project$Models$EventInstance = function (a) { return function (b) { return function (c) { @@ -17861,7 +17885,9 @@ var _user$project$Models$EventInstance = function (a) { return function (m) { return function (n) { return function (o) { - return {title: a, slug: b, id: c, url: d, eventSlug: e, eventType: f, backgroundColor: g, forgroundColor: h, from: i, to: j, timeslots: k, location: l, locationIcon: m, videoRecording: n, videoUrl: o}; + return function (p) { + return {title: a, slug: b, id: c, url: d, eventSlug: e, eventType: f, backgroundColor: g, forgroundColor: h, from: i, to: j, timeslots: k, location: l, locationIcon: m, videoRecording: n, videoUrl: o, isFavorited: p}; + }; }; }; }; @@ -17877,9 +17903,9 @@ var _user$project$Models$EventInstance = function (a) { }; }; }; -var _user$project$Models$Event = F6( - function (a, b, c, d, e, f) { - return {title: a, slug: b, $abstract: c, speakers: d, videoRecording: e, videoUrl: f}; +var _user$project$Models$Event = F7( + function (a, b, c, d, e, f, g) { + return {title: a, slug: b, $abstract: c, speakerSlugs: d, videoRecording: e, videoUrl: f, eventType: g}; }); var _user$project$Models$EventLocation = F3( function (a, b, c) { @@ -17894,6 +17920,9 @@ var _user$project$Models$Flags = F5( return {schedule_timeslot_length_minutes: a, schedule_midnight_offset_hours: b, ics_button_href: c, camp_slug: d, websocket_server: e}; }); var _user$project$Models$NotFoundRoute = {ctor: 'NotFoundRoute'}; +var _user$project$Models$SpeakerRoute = function (a) { + return {ctor: 'SpeakerRoute', _0: a}; +}; var _user$project$Models$EventRoute = function (a) { return {ctor: 'EventRoute', _0: a}; }; @@ -17936,109 +17965,134 @@ var _user$project$Decoders$eventLocationDecoder = A3( _elm_lang$core$Json_Decode$string, _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$EventLocation)))); var _user$project$Decoders$dateDecoder = function () { - var unpacked = function (x) { - var _p0 = _justinmimbs$elm_date_extra$Date_Extra$fromIsoString(x); - if (_p0.ctor === 'Just') { - return _p0._0; - } else { - return A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, 1970, _elm_lang$core$Date$Jan, 1, 0, 0, 0, 0); - } + var unpacked = function (isoString) { + return A2( + _elm_lang$core$Maybe$withDefault, + A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, 1970, _elm_lang$core$Date$Jan, 1, 0, 0, 0, 0), + _justinmimbs$elm_date_extra$Date_Extra$fromIsoString(isoString)); }; return A2(_elm_lang$core$Json_Decode$map, unpacked, _elm_lang$core$Json_Decode$string); }(); var _user$project$Decoders$eventInstanceDecoder = A4( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, - 'video_url', - _elm_lang$core$Json_Decode$string, - '', - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'video_recording', - _elm_lang$core$Json_Decode$bool, + 'is_favorited', + _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$bool), + _elm_lang$core$Maybe$Nothing, + A4( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, + 'video_url', + _elm_lang$core$Json_Decode$string, + '', A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'location_icon', - _elm_lang$core$Json_Decode$string, + 'video_recording', + _elm_lang$core$Json_Decode$bool, A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'location', + 'location_icon', _elm_lang$core$Json_Decode$string, A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'timeslots', - _elm_lang$core$Json_Decode$float, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'to', - _user$project$Decoders$dateDecoder, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'from', - _user$project$Decoders$dateDecoder, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'fg-color', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'bg-color', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_type', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_slug', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'url', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'id', - _elm_lang$core$Json_Decode$int, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'slug', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'title', - _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$EventInstance)))))))))))))))); -var _user$project$Decoders$speakerDecoder = A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'name', - _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Speaker)); -var _user$project$Decoders$eventDecoder = A4( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, - 'video_url', - _elm_lang$core$Json_Decode$string, - '', - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'video_recording', - _elm_lang$core$Json_Decode$bool, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'speakers', - _elm_lang$core$Json_Decode$list(_user$project$Decoders$speakerDecoder), - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'abstract', - _elm_lang$core$Json_Decode$string, - A3( - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'slug', + 'location', _elm_lang$core$Json_Decode$string, A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'title', + 'timeslots', + _elm_lang$core$Json_Decode$float, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'to', + _user$project$Decoders$dateDecoder, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'from', + _user$project$Decoders$dateDecoder, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'fg-color', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'bg-color', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'event_type', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'event_slug', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'url', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'id', + _elm_lang$core$Json_Decode$int, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'slug', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'title', + _elm_lang$core$Json_Decode$string, + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$EventInstance))))))))))))))))); +var _user$project$Decoders$eventDecoder = A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'event_type', + _elm_lang$core$Json_Decode$string, + A4( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, + 'video_url', + _elm_lang$core$Json_Decode$string, + '', + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'video_recording', + _elm_lang$core$Json_Decode$bool, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'speaker_slugs', + _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string), + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'abstract', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'slug', _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Event))))))); + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'title', + _elm_lang$core$Json_Decode$string, + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Event)))))))); +var _user$project$Decoders$speakerDecoder = A4( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, + 'small_picture_url', + _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$string), + _elm_lang$core$Maybe$Nothing, + A4( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, + 'large_picture_url', + _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$string), + _elm_lang$core$Maybe$Nothing, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'biography', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'slug', + _elm_lang$core$Json_Decode$string, + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'name', + _elm_lang$core$Json_Decode$string, + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Speaker)))))); var _user$project$Decoders$dayDecoder = A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, 'repr', @@ -18054,25 +18108,29 @@ var _user$project$Decoders$dayDecoder = A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Day)))); var _user$project$Decoders$initDataDecoder = A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_types', - _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventTypeDecoder), + 'speakers', + _elm_lang$core$Json_Decode$list(_user$project$Decoders$speakerDecoder), A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_locations', - _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventLocationDecoder), + 'event_types', + _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventTypeDecoder), A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'event_instances', - _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventInstanceDecoder), + 'event_locations', + _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventLocationDecoder), A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'events', - _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventDecoder), + 'event_instances', + _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventInstanceDecoder), A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'days', - _elm_lang$core$Json_Decode$list(_user$project$Decoders$dayDecoder), - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Model)))))); + 'events', + _elm_lang$core$Json_Decode$list(_user$project$Decoders$eventDecoder), + A3( + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, + 'days', + _elm_lang$core$Json_Decode$list(_user$project$Decoders$dayDecoder), + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$Model))))))); var _user$project$Decoders$WebSocketAction = function (a) { return {action: a}; }; @@ -18082,6 +18140,57 @@ var _user$project$Decoders$webSocketActionDecoder = A3( _elm_lang$core$Json_Decode$string, _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Decoders$WebSocketAction)); +var _user$project$Routing$routeToString = function (route) { + var parts = function () { + var _p0 = route; + switch (_p0.ctor) { + case 'OverviewRoute': + return {ctor: '[]'}; + case 'OverviewFilteredRoute': + return { + ctor: '::', + _0: _p0._0, + _1: {ctor: '[]'} + }; + case 'DayRoute': + return { + ctor: '::', + _0: 'day', + _1: { + ctor: '::', + _0: _p0._0, + _1: {ctor: '[]'} + } + }; + case 'EventRoute': + return { + ctor: '::', + _0: 'event', + _1: { + ctor: '::', + _0: _p0._0, + _1: {ctor: '[]'} + } + }; + case 'SpeakerRoute': + return { + ctor: '::', + _0: 'speaker', + _1: { + ctor: '::', + _0: _p0._0, + _1: {ctor: '[]'} + } + }; + default: + return {ctor: '[]'}; + } + }(); + return A2( + _elm_lang$core$Basics_ops['++'], + '#/', + A2(_elm_lang$core$String$join, '/', parts)); +}; var _user$project$Routing$matchers = _evancz$url_parser$UrlParser$oneOf( { ctor: '::', @@ -18110,18 +18219,26 @@ var _user$project$Routing$matchers = _evancz$url_parser$UrlParser$oneOf( _evancz$url_parser$UrlParser_ops[''], _evancz$url_parser$UrlParser$s('event'), _evancz$url_parser$UrlParser$string)), - _1: {ctor: '[]'} + _1: { + ctor: '::', + _0: A2( + _evancz$url_parser$UrlParser$map, + _user$project$Models$SpeakerRoute, + A2( + _evancz$url_parser$UrlParser_ops[''], + _evancz$url_parser$UrlParser$s('speaker'), + _evancz$url_parser$UrlParser$string)), + _1: {ctor: '[]'} + } } } } }); var _user$project$Routing$parseLocation = function (location) { - var _p0 = A2(_evancz$url_parser$UrlParser$parseHash, _user$project$Routing$matchers, location); - if (_p0.ctor === 'Just') { - return _p0._0; - } else { - return _user$project$Models$NotFoundRoute; - } + return A2( + _elm_lang$core$Maybe$withDefault, + _user$project$Models$NotFoundRoute, + A2(_evancz$url_parser$UrlParser$parseHash, _user$project$Routing$matchers, location)); }; var _user$project$Messages$BackInHistory = {ctor: 'BackInHistory'}; @@ -18212,7 +18329,8 @@ var _user$project$Views_FilterView$filterToQuery = function (filter) { } } })); - return A2(_elm_lang$core$Basics_ops['++'], '#', result); + return _user$project$Routing$routeToString( + _user$project$Models$OverviewFilteredRoute(result)); }; var _user$project$Views_FilterView$findFilter = F2( function (modelItems, filterSlug) { @@ -18498,7 +18616,7 @@ var _user$project$Update$update = F2( if (_p2 === 'init') { var _p3 = A2(_elm_lang$core$Json_Decode$decodeString, _user$project$Decoders$initDataDecoder, _p5); if (_p3.ctor === 'Ok') { - return A4(_p3._0, model.flags, model.filter, model.location, model.route); + return A5(_p3._0, model.flags, model.filter, model.location, model.route, true); } else { return model; } @@ -18678,10 +18796,9 @@ var _user$project$Views_DayPicker$dayButton = F2( _1: { ctor: '::', _0: _elm_lang$html$Html_Attributes$href( - A2( - _elm_lang$core$Basics_ops['++'], - '#day/', - A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'y-MM-dd', day.date))), + _user$project$Routing$routeToString( + _user$project$Models$DayRoute( + A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'y-MM-dd', day.date)))), _1: {ctor: '[]'} } }, @@ -18765,7 +18882,8 @@ var _user$project$Views_DayPicker$dayPicker = function (model) { }), _1: { ctor: '::', - _0: _elm_lang$html$Html_Attributes$href('#'), + _0: _elm_lang$html$Html_Attributes$href( + _user$project$Routing$routeToString(_user$project$Models$OverviewRoute)), _1: {ctor: '[]'} } }, @@ -18876,7 +18994,8 @@ var _user$project$Views_DayView$eventInstanceBlock = F3( _1: { ctor: '::', _0: _elm_lang$html$Html_Attributes$href( - A2(_elm_lang$core$Basics_ops['++'], '#event/', _p2.eventSlug)), + _user$project$Routing$routeToString( + _user$project$Models$EventRoute(_p2.eventSlug))), _1: {ctor: '[]'} } } @@ -18928,58 +19047,46 @@ var _user$project$Views_DayView$renderGroup = F2( }; }; var lefts = A2(_elm_lang$core$List$map, findLefts, sortedGroup); - var numberInGroup = function () { - var _p6 = _elm_lang$core$List$maximum( + var numberInGroup = A2( + _elm_lang$core$Maybe$withDefault, + 1, + _elm_lang$core$List$maximum( A2( _elm_lang$core$List$map, function (_p4) { var _p5 = _p4; return _p5._1; }, - lefts)); - if (_p6.ctor === 'Just') { - return _p6._0; - } else { - return 1; - } - }(); + lefts))); var fixedLefts = _elm_lang$core$Native_Utils.eq(numberInGroup, 0) ? A2( _elm_lang$core$List$map, - function (_p7) { - var _p8 = _p7; - var _p10 = _p8._0; + function (_p6) { + var _p7 = _p6; + var _p8 = _p7._0; return { ctor: '_Tuple2', - _0: _p10, - _1: function () { - var _p9 = A2( + _0: _p8, + _1: A2( + _elm_lang$core$Maybe$withDefault, + 0, + A2( _elm_community$list_extra$List_Extra$elemIndex, - {ctor: '_Tuple2', _0: _p10, _1: _p8._1}, - lefts); - if (_p9.ctor === 'Just') { - return _p9._0; - } else { - return 0; - } - }() + {ctor: '_Tuple2', _0: _p8, _1: _p7._1}, + lefts)) }; }, lefts) : lefts; - var fixedNumberInGroup = function () { - var _p13 = _elm_lang$core$List$maximum( + var fixedNumberInGroup = A2( + _elm_lang$core$Maybe$withDefault, + 1, + _elm_lang$core$List$maximum( A2( _elm_lang$core$List$map, - function (_p11) { - var _p12 = _p11; - return _p12._1; + function (_p9) { + var _p10 = _p9; + return _p10._1; }, - fixedLefts)); - if (_p13.ctor === 'Just') { - return _p13._0; - } else { - return 1; - } - }(); + fixedLefts))); return A2( _elm_lang$html$Html$div, { @@ -18999,8 +19106,8 @@ var _user$project$Views_DayView$renderGroup = F2( }, fixedLefts)); }); -var _user$project$Views_DayView$locationColumn = F4( - function (columnWidth, eventInstances, offset, location) { +var _user$project$Views_DayView$locationColumn = F5( + function (columnWidth, eventInstances, offset, minutes, location) { var locationInstances = A2( _elm_lang$core$List$filter, function (instance) { @@ -19079,14 +19186,50 @@ var _user$project$Views_DayView$locationColumn = F4( _1: {ctor: '[]'} }, A2( - _elm_lang$core$List$map, - function (group) { - return A2(_user$project$Views_DayView$renderGroup, offset, group); - }, - overlappingGroups))); + _elm_lang$core$Basics_ops['++'], + A2( + _elm_lang$core$List$map, + function (x) { + return A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$style( + { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'backgroundColor', + _1: (_elm_lang$core$Native_Utils.eq( + _elm_lang$core$Date$minute(x), + 30) || _elm_lang$core$Native_Utils.eq( + _elm_lang$core$Date$minute(x), + 45)) ? '#f8f8f8' : '#fff' + }, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'height', + _1: _user$project$Views_DayView$px(_user$project$Views_DayView$blockHeight) + }, + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}); + }, + minutes), + A2( + _elm_lang$core$List$map, + function (group) { + return A2(_user$project$Views_DayView$renderGroup, offset, group); + }, + overlappingGroups)))); }); -var _user$project$Views_DayView$locationColumns = F3( - function (eventInstances, eventLocations, offset) { +var _user$project$Views_DayView$locationColumns = F4( + function (eventInstances, eventLocations, offset, minutes) { var columnWidth = 100.0 / _elm_lang$core$Basics$toFloat( _elm_lang$core$List$length(eventLocations)); return A2( @@ -19117,14 +19260,14 @@ var _user$project$Views_DayView$locationColumns = F3( A2( _elm_lang$core$List$map, function (location) { - return A4(_user$project$Views_DayView$locationColumn, columnWidth, eventInstances, offset, location); + return A5(_user$project$Views_DayView$locationColumn, columnWidth, eventInstances, offset, minutes, location); }, eventLocations)); }); var _user$project$Views_DayView$gutterHour = function (date) { var textToShow = function () { - var _p14 = _elm_lang$core$Date$minute(date); - switch (_p14) { + var _p11 = _elm_lang$core$Date$minute(date); + switch (_p11) { case 0: return A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'HH:mm', date); case 30: @@ -19229,13 +19372,16 @@ var _user$project$Views_DayView$dayView = F2( _0: _user$project$Views_DayView$gutter(minutes), _1: { ctor: '::', - _0: A3(_user$project$Views_DayView$locationColumns, filteredEventInstances, model.eventLocations, model.flags.schedule_midnight_offset_hours), + _0: A4(_user$project$Views_DayView$locationColumns, filteredEventInstances, model.eventLocations, model.flags.schedule_midnight_offset_hours, minutes), _1: {ctor: '[]'} } }); }); var _user$project$Views_EventDetail$eventInstanceItem = function (eventInstance) { + var toFormat = _elm_lang$core$Native_Utils.eq( + _elm_lang$core$Date$day(eventInstance.from), + _elm_lang$core$Date$day(eventInstance.to)) ? 'HH:mm' : 'E HH:mm'; return A2( _elm_lang$html$Html$li, {ctor: '[]'}, @@ -19244,52 +19390,58 @@ var _user$project$Views_EventDetail$eventInstanceItem = function (eventInstance) _0: _elm_lang$html$Html$text( A2( _elm_lang$core$Basics_ops['++'], - A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'y-MM-dd HH:mm', eventInstance.from), + A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'E HH:mm', eventInstance.from), A2( _elm_lang$core$Basics_ops['++'], ' to ', - A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'y-MM-d HH:mm', eventInstance.to)))), + A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, toFormat, eventInstance.to)))), _1: {ctor: '[]'} }); }; -var _user$project$Views_EventDetail$eventInstancesList = F2( - function (eventSlug, eventInstances) { - var instances = A2( - _elm_lang$core$List$filter, - function (instance) { - return _elm_lang$core$Native_Utils.eq(instance.eventSlug, eventSlug); - }, - eventInstances); - return A2( - _elm_lang$html$Html$div, - {ctor: '[]'}, - { +var _user$project$Views_EventDetail$eventInstancesSidebar = function (eventInstances) { + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$h4, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('This event will occur at:'), + _1: {ctor: '[]'} + }), + _1: { ctor: '::', _0: A2( - _elm_lang$html$Html$h4, + _elm_lang$html$Html$ul, {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('This event will occur at:'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$ul, - {ctor: '[]'}, - A2(_elm_lang$core$List$map, _user$project$Views_EventDetail$eventInstanceItem, instances)), - _1: {ctor: '[]'} - } - }); - }); + A2(_elm_lang$core$List$map, _user$project$Views_EventDetail$eventInstanceItem, eventInstances)), + _1: {ctor: '[]'} + } + }); +}; var _user$project$Views_EventDetail$speakerDetail = function (speaker) { return A2( _elm_lang$html$Html$li, {ctor: '[]'}, { ctor: '::', - _0: _elm_lang$html$Html$text(speaker.name), + _0: A2( + _elm_lang$html$Html$a, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$href( + _user$project$Routing$routeToString( + _user$project$Models$SpeakerRoute(speaker.slug))), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$html$Html$text(speaker.name), + _1: {ctor: '[]'} + }), _1: {ctor: '[]'} }); }; @@ -19317,89 +19469,205 @@ var _user$project$Views_EventDetail$speakerSidebar = function (speakers) { } }); }; -var _user$project$Views_EventDetail$videoRecordingSidebar = function (event) { - var _p0 = (!_elm_lang$core$Native_Utils.eq(event.videoUrl, '')) ? { - ctor: '_Tuple2', - _0: A2( - _elm_lang$html$Html$h4, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('Watch the video here!'), - _1: {ctor: '[]'} - }), - _1: true - } : (_elm_lang$core$Native_Utils.eq(event.videoRecording, true) ? { - ctor: '_Tuple2', - _0: A2( - _elm_lang$html$Html$h4, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('This event will be recorded!'), - _1: {ctor: '[]'} - }), - _1: true - } : { - ctor: '_Tuple2', - _0: A2( - _elm_lang$html$Html$h4, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('This event will NOT be recorded!'), - _1: {ctor: '[]'} - }), - _1: false - }); - var video = _p0._0; - var willBeRecorded = _p0._1; +var _user$project$Views_EventDetail$eventMetaDataSidebar = function (event) { + var videoRecording = function () { + var _p0 = event.videoRecording; + if (_p0 === true) { + return 'Yes'; + } else { + return 'No'; + } + }(); return A2( _elm_lang$html$Html$div, + {ctor: '[]'}, { ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( + _0: A2( + _elm_lang$html$Html$h4, + {ctor: '[]'}, { ctor: '::', - _0: {ctor: '_Tuple2', _0: 'alert', _1: true}, - _1: { + _0: _elm_lang$html$Html$text('Metadata'), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$ul, + {ctor: '[]'}, + { ctor: '::', - _0: {ctor: '_Tuple2', _0: 'alert-danger', _1: !willBeRecorded}, + _0: A2( + _elm_lang$html$Html$li, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$strong, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Type: '), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: _elm_lang$html$Html$text(event.eventType), + _1: {ctor: '[]'} + } + }), _1: { ctor: '::', - _0: {ctor: '_Tuple2', _0: 'alert-info', _1: willBeRecorded}, + _0: A2( + _elm_lang$html$Html$li, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$strong, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Recording: '), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: _elm_lang$html$Html$text(videoRecording), + _1: {ctor: '[]'} + } + }), _1: {ctor: '[]'} } - } - }), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: video, - _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } }); }; -var _user$project$Views_EventDetail$eventDetailView = F2( - function (eventSlug, model) { - var event = function () { - var _p1 = _elm_lang$core$List$head( - A2( - _elm_lang$core$List$filter, - function (e) { - return _elm_lang$core$Native_Utils.eq(e.slug, eventSlug); - }, - model.events)); - if (_p1.ctor === 'Just') { - return _p1._0; +var _user$project$Views_EventDetail$getSpeakersFromSlugs = F3( + function (speakers, slugs, collectedSpeakers) { + getSpeakersFromSlugs: + while (true) { + var _p1 = speakers; + if (_p1.ctor === '[]') { + return collectedSpeakers; + } else { + var _p5 = _p1._0; + var foundSlug = _elm_lang$core$List$head( + A2( + _elm_lang$core$List$filter, + function (slug) { + return _elm_lang$core$Native_Utils.eq(slug, _p5.slug); + }, + slugs)); + var foundSpeaker = function () { + var _p2 = foundSlug; + if (_p2.ctor === 'Just') { + return { + ctor: '::', + _0: _p5, + _1: {ctor: '[]'} + }; + } else { + return {ctor: '[]'}; + } + }(); + var newCollectedSpeakers = A2(_elm_lang$core$Basics_ops['++'], collectedSpeakers, foundSpeaker); + var newSlugs = function () { + var _p3 = foundSlug; + if (_p3.ctor === 'Just') { + return A2( + _elm_lang$core$List$filter, + function (x) { + return !_elm_lang$core$Native_Utils.eq(x, _p3._0); + }, + slugs); + } else { + return slugs; + } + }(); + var _p4 = slugs; + if (_p4.ctor === '[]') { + return collectedSpeakers; + } else { + var _v5 = _p1._1, + _v6 = newSlugs, + _v7 = newCollectedSpeakers; + speakers = _v5; + slugs = _v6; + collectedSpeakers = _v7; + continue getSpeakersFromSlugs; + } + } + } + }); +var _user$project$Views_EventDetail$eventDetailSidebar = F2( + function (event, model) { + var speakers = A3( + _user$project$Views_EventDetail$getSpeakersFromSlugs, + model.speakers, + event.speakerSlugs, + {ctor: '[]'}); + var eventInstances = A2( + _elm_lang$core$List$filter, + function (instance) { + return _elm_lang$core$Native_Utils.eq(instance.eventSlug, event.slug); + }, + model.eventInstances); + var videoRecordingLink = function () { + var _p6 = event.videoUrl; + if (_p6 === '') { + return {ctor: '[]'}; } else { return { - title: '', - slug: '', - $abstract: '', - speakers: {ctor: '[]'}, - videoRecording: false, - videoUrl: '' + ctor: '::', + _0: A2( + _elm_lang$html$Html$a, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$href(event.videoUrl), + _1: { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn-success', _1: true}, + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-film', _1: true}, + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: { + ctor: '::', + _0: _elm_lang$html$Html$text(' Watch recording here!'), + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} }; } }(); @@ -19407,18 +19675,295 @@ var _user$project$Views_EventDetail$eventDetailView = F2( _elm_lang$html$Html$div, { ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('row'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$div, + _0: _elm_lang$html$Html_Attributes$classList( { ctor: '::', - _0: _elm_lang$html$Html_Attributes$class('col-sm-9'), + _0: {ctor: '_Tuple2', _0: 'col-sm-3', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'schedule-sidebar', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'sticky', _1: true}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + A2( + _elm_lang$core$Basics_ops['++'], + videoRecordingLink, + { + ctor: '::', + _0: _user$project$Views_EventDetail$speakerSidebar(speakers), + _1: { + ctor: '::', + _0: _user$project$Views_EventDetail$eventMetaDataSidebar(event), + _1: { + ctor: '::', + _0: _user$project$Views_EventDetail$eventInstancesSidebar(eventInstances), + _1: {ctor: '[]'} + } + } + })); + }); +var _user$project$Views_EventDetail$eventDetailContent = function (event) { + return A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('col-sm-9'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$a, + { + ctor: '::', + _0: _elm_lang$html$Html_Events$onClick(_user$project$Messages$BackInHistory), + _1: { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true}, + _1: {ctor: '[]'} + } + }), _1: {ctor: '[]'} - }, + } + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-chevron-left', _1: true}, + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: { + ctor: '::', + _0: _elm_lang$html$Html$text(' Back'), + _1: {ctor: '[]'} + } + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$h3, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text(event.title), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _evancz$elm_markdown$Markdown$toHtml, + {ctor: '[]'}, + event.$abstract), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + } + }); +}; +var _user$project$Views_EventDetail$eventDetailView = F2( + function (eventSlug, model) { + var event = _elm_lang$core$List$head( + A2( + _elm_lang$core$List$filter, + function (e) { + return _elm_lang$core$Native_Utils.eq(e.slug, eventSlug); + }, + model.events)); + var _p7 = event; + if (_p7.ctor === 'Just') { + var _p8 = _p7._0; + return A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('row'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _user$project$Views_EventDetail$eventDetailContent(_p8), + _1: { + ctor: '::', + _0: A2(_user$project$Views_EventDetail$eventDetailSidebar, _p8, model), + _1: {ctor: '[]'} + } + }); + } else { + return A2( + _elm_lang$html$Html$div, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$class('row'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$h4, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Event not found.'), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$a, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$href('#'), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Click here to go the schedule overview.'), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + }); + } + }); + +var _user$project$Views_SpeakerDetail$eventItem = function (event) { + return A2( + _elm_lang$html$Html$li, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$a, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$href( + _user$project$Routing$routeToString( + _user$project$Models$EventRoute(event.slug))), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: _elm_lang$html$Html$text(event.title), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + }); +}; +var _user$project$Views_SpeakerDetail$speakerEvents = F2( + function (speaker, model) { + var events = A2( + _elm_lang$core$List$filter, + function (event) { + return A2(_elm_lang$core$List$member, speaker.slug, event.speakerSlugs); + }, + model.events); + var _p0 = events; + if (_p0.ctor === '[]') { + return A2( + _elm_lang$html$Html$p, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('This speaker has no events!'), + _1: {ctor: '[]'} + }); + } else { + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$h3, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Events:'), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$ul, + {ctor: '[]'}, + A2(_elm_lang$core$List$map, _user$project$Views_SpeakerDetail$eventItem, _p0)), + _1: {ctor: '[]'} + } + }); + } + }); +var _user$project$Views_SpeakerDetail$speakerDetailView = F2( + function (speakerSlug, model) { + var speaker = _elm_lang$core$List$head( + A2( + _elm_lang$core$List$filter, + function (speaker) { + return _elm_lang$core$Native_Utils.eq(speaker.slug, speakerSlug); + }, + model.speakers)); + var image = function () { + var _p1 = speaker; + if (_p1.ctor === 'Just') { + var _p2 = _p1._0.smallPictureUrl; + if (_p2.ctor === 'Just') { + return { + ctor: '::', + _0: A2( + _elm_lang$html$Html$img, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$src(_p2._0), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: {ctor: '[]'} + }; + } else { + return {ctor: '[]'}; + } + } else { + return {ctor: '[]'}; + } + }(); + var _p3 = speaker; + if (_p3.ctor === 'Just') { + var _p4 = _p3._0; + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + A2( + _elm_lang$core$Basics_ops['++'], { ctor: '::', _0: A2( @@ -19469,75 +20014,45 @@ var _user$project$Views_EventDetail$eventDetailView = F2( _1: { ctor: '::', _0: A2( - _elm_lang$html$Html$h4, + _elm_lang$html$Html$h3, {ctor: '[]'}, { ctor: '::', - _0: _elm_lang$html$Html$text(event.title), + _0: _elm_lang$html$Html$text(_p4.name), _1: {ctor: '[]'} }), _1: { ctor: '::', _0: A2( - _elm_lang$html$Html$p, + _elm_lang$html$Html$div, {ctor: '[]'}, { ctor: '::', _0: A2( _evancz$elm_markdown$Markdown$toHtml, {ctor: '[]'}, - event.$abstract), + _p4.biography), _1: {ctor: '[]'} }), _1: { ctor: '::', - _0: A2( - _elm_lang$html$Html$hr, - {ctor: '[]'}, - {ctor: '[]'}), - _1: { - ctor: '::', - _0: A2(_user$project$Views_EventDetail$eventInstancesList, eventSlug, model.eventInstances), - _1: {ctor: '[]'} - } + _0: A2(_user$project$Views_SpeakerDetail$speakerEvents, _p4, model), + _1: {ctor: '[]'} } } } - }), - _1: { + }, + image)); + } else { + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { ctor: '::', - _0: A2( - _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'col-sm-3', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'schedule-sidebar', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'sticky', _1: true}, - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _user$project$Views_EventDetail$videoRecordingSidebar(event), - _1: { - ctor: '::', - _0: _user$project$Views_EventDetail$speakerSidebar(event.speakers), - _1: {ctor: '[]'} - } - }), + _0: _elm_lang$html$Html$text('Unknown speaker...'), _1: {ctor: '[]'} - } - }); + }); + } }); var _user$project$Views_ScheduleOverview$dayEventInstanceIcons = function (eventInstance) { @@ -19641,7 +20156,8 @@ var _user$project$Views_ScheduleOverview$dayEventInstanceView = function (eventI _1: { ctor: '::', _0: _elm_lang$html$Html_Attributes$href( - A2(_elm_lang$core$Basics_ops['++'], '#event/', eventInstance.eventSlug)), + _user$project$Routing$routeToString( + _user$project$Models$EventRoute(eventInstance.eventSlug))), _1: { ctor: '::', _0: _elm_lang$html$Html_Attributes$style( @@ -19769,66 +20285,76 @@ var _user$project$Views_ScheduleOverview$scheduleOverviewView = function (model) }; var _user$project$Views$view = function (model) { - return A2( - _elm_lang$html$Html$div, - {ctor: '[]'}, - { - ctor: '::', - _0: _user$project$Views_DayPicker$dayPicker(model), - _1: { + var _p0 = model.dataLoaded; + if (_p0 === true) { + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { ctor: '::', - _0: A2( - _elm_lang$html$Html$hr, - {ctor: '[]'}, - {ctor: '[]'}), + _0: _user$project$Views_DayPicker$dayPicker(model), _1: { ctor: '::', - _0: function () { - var _p0 = model.route; - switch (_p0.ctor) { - case 'OverviewRoute': - return _user$project$Views_ScheduleOverview$scheduleOverviewView(model); - case 'OverviewFilteredRoute': - return _user$project$Views_ScheduleOverview$scheduleOverviewView(model); - case 'DayRoute': - var day = function () { - var _p1 = _elm_lang$core$List$head( - A2( - _elm_lang$core$List$filter, - function (x) { - return _elm_lang$core$Native_Utils.eq( - A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'y-MM-dd', x.date), - _p0._0); - }, - model.days)); - if (_p1.ctor === 'Just') { - return _p1._0; - } else { - return A3( + _0: A2( + _elm_lang$html$Html$hr, + {ctor: '[]'}, + {ctor: '[]'}), + _1: { + ctor: '::', + _0: function () { + var _p1 = model.route; + switch (_p1.ctor) { + case 'OverviewRoute': + return _user$project$Views_ScheduleOverview$scheduleOverviewView(model); + case 'OverviewFilteredRoute': + return _user$project$Views_ScheduleOverview$scheduleOverviewView(model); + case 'DayRoute': + var day = A2( + _elm_lang$core$Maybe$withDefault, + A3( _user$project$Models$Day, '', A7(_justinmimbs$elm_date_extra$Date_Extra$fromParts, 1970, _elm_lang$core$Date$Jan, 1, 0, 0, 0, 0), - ''); - } - }(); - return A2(_user$project$Views_DayView$dayView, day, model); - case 'EventRoute': - return A2(_user$project$Views_EventDetail$eventDetailView, _p0._0, model); - default: - return A2( - _elm_lang$html$Html$div, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('Not found!'), - _1: {ctor: '[]'} - }); - } - }(), - _1: {ctor: '[]'} + ''), + _elm_lang$core$List$head( + A2( + _elm_lang$core$List$filter, + function (x) { + return _elm_lang$core$Native_Utils.eq( + A2(_justinmimbs$elm_date_extra$Date_Extra$toFormattedString, 'y-MM-dd', x.date), + _p1._0); + }, + model.days))); + return A2(_user$project$Views_DayView$dayView, day, model); + case 'EventRoute': + return A2(_user$project$Views_EventDetail$eventDetailView, _p1._0, model); + case 'SpeakerRoute': + return A2(_user$project$Views_SpeakerDetail$speakerDetailView, _p1._0, model); + default: + return A2( + _elm_lang$html$Html$div, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Not found!'), + _1: {ctor: '[]'} + }); + } + }(), + _1: {ctor: '[]'} + } } - } - }); + }); + } else { + return A2( + _elm_lang$html$Html$h4, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Loading schedule...'), + _1: {ctor: '[]'} + }); + } }; var _user$project$Main$subscriptions = function (model) { @@ -19841,19 +20367,14 @@ var _user$project$Main$init = F2( {ctor: '[]'}, {ctor: '[]'}, {ctor: '[]'}); - var currentRoute = _user$project$Routing$parseLocation( - A2(_elm_lang$core$Debug$log, 'location', location)); - var model = A9( - _user$project$Models$Model, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}, - flags, - emptyFilter, - location, - currentRoute); + var currentRoute = _user$project$Routing$parseLocation(location); + var model = _user$project$Models$Model( + {ctor: '[]'})( + {ctor: '[]'})( + {ctor: '[]'})( + {ctor: '[]'})( + {ctor: '[]'})( + {ctor: '[]'})(flags)(emptyFilter)(location)(currentRoute)(false); return A2( _elm_lang$core$Platform_Cmd_ops['!'], model, @@ -19866,12 +20387,7 @@ var _user$project$Main$init = F2( var _user$project$Main$main = A2( _elm_lang$navigation$Navigation$programWithFlags, _user$project$Messages$OnLocationChange, - { - init: _user$project$Main$init, - view: _elm_lang$html$Html_Lazy$lazy(_user$project$Views$view), - update: _user$project$Update$update, - subscriptions: _user$project$Main$subscriptions - })( + {init: _user$project$Main$init, view: _user$project$Views$view, update: _user$project$Update$update, subscriptions: _user$project$Main$subscriptions})( A2( _elm_lang$core$Json_Decode$andThen, function (camp_slug) { @@ -19903,7 +20419,7 @@ var _user$project$Main$main = A2( var Elm = {}; Elm['Main'] = Elm['Main'] || {}; if (typeof _user$project$Main$main !== 'undefined') { - _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Messages.Msg":{"args":[],"tags":{"OnLocationChange":["Navigation.Location"],"WebSocketPayload":["String"],"ToggleEventLocationFilter":["Models.EventLocation"],"NoOp":[],"ToggleVideoRecordingFilter":["{ name : String , slug : String , filter : Models.EventInstance -> Bool }"],"ToggleEventTypeFilter":["Models.EventType"],"BackInHistory":[]}},"Date.Date":{"args":[],"tags":{"Date":[]}}},"aliases":{"Models.EventLocation":{"args":[],"type":"{ name : String, slug : String, icon : String }"},"Models.EventSlug":{"args":[],"type":"String"},"Models.EventType":{"args":[],"type":"{ name : String, slug : String, color : String, lightText : Bool }"},"Models.EventInstance":{"args":[],"type":"{ title : String , slug : Models.EventInstanceSlug , id : Int , url : String , eventSlug : Models.EventSlug , eventType : String , backgroundColor : String , forgroundColor : String , from : Date.Date , to : Date.Date , timeslots : Float , location : String , locationIcon : String , videoRecording : Bool , videoUrl : String }"},"Models.EventInstanceSlug":{"args":[],"type":"String"},"Navigation.Location":{"args":[],"type":"{ href : String , host : String , hostname : String , protocol : String , origin : String , port_ : String , pathname : String , search : String , hash : String , username : String , password : String }"}},"message":"Messages.Msg"},"versions":{"elm":"0.18.0"}}); + _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Messages.Msg":{"args":[],"tags":{"OnLocationChange":["Navigation.Location"],"WebSocketPayload":["String"],"ToggleEventLocationFilter":["Models.EventLocation"],"NoOp":[],"ToggleVideoRecordingFilter":["Models.VideoRecordingFilter"],"ToggleEventTypeFilter":["Models.EventType"],"BackInHistory":[]}},"Date.Date":{"args":[],"tags":{"Date":[]}},"Maybe.Maybe":{"args":["a"],"tags":{"Just":["a"],"Nothing":[]}}},"aliases":{"Models.EventLocation":{"args":[],"type":"{ name : String, slug : String, icon : String }"},"Models.EventSlug":{"args":[],"type":"String"},"Models.EventType":{"args":[],"type":"{ name : String, slug : String, color : String, lightText : Bool }"},"Models.EventInstance":{"args":[],"type":"{ title : String , slug : Models.EventInstanceSlug , id : Int , url : String , eventSlug : Models.EventSlug , eventType : String , backgroundColor : String , forgroundColor : String , from : Date.Date , to : Date.Date , timeslots : Float , location : String , locationIcon : String , videoRecording : Bool , videoUrl : String , isFavorited : Maybe.Maybe Bool }"},"Models.EventInstanceSlug":{"args":[],"type":"String"},"Models.VideoRecordingFilter":{"args":[],"type":"{ name : String , slug : String , filter : Models.EventInstance -> Bool }"},"Navigation.Location":{"args":[],"type":"{ href : String , host : String , hostname : String , protocol : String , origin : String , port_ : String , pathname : String , search : String , hash : String , username : String , password : String }"}},"message":"Messages.Msg"},"versions":{"elm":"0.18.0"}}); } if (typeof define === "function" && define['amd']) From 9f8ab54a34964cd691d0bc49d17876f81b6fe0d5 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Thu, 3 Aug 2017 12:51:13 +0200 Subject: [PATCH 36/54] Forgot to add SpeakerDetail.elm --- schedule/src/Views/SpeakerDetail.elm | 82 ++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 schedule/src/Views/SpeakerDetail.elm diff --git a/schedule/src/Views/SpeakerDetail.elm b/schedule/src/Views/SpeakerDetail.elm new file mode 100644 index 00000000..4c13f2b7 --- /dev/null +++ b/schedule/src/Views/SpeakerDetail.elm @@ -0,0 +1,82 @@ +module Views.SpeakerDetail exposing (..) + +-- Local modules + +import Messages exposing (Msg(BackInHistory)) +import Models exposing (Model, SpeakerSlug, Speaker, Route(EventRoute), Event) +import Routing exposing (routeToString) + + +-- External modules + +import Html exposing (Html, div, text, a, i, h3, img, ul, li, p) +import Html.Attributes exposing (classList, src, href) +import Html.Events exposing (onClick) +import Markdown + + +speakerDetailView : SpeakerSlug -> Model -> Html Msg +speakerDetailView speakerSlug model = + let + speaker = + model.speakers + |> List.filter (\speaker -> speaker.slug == speakerSlug) + |> List.head + + image = + case speaker of + Just speaker -> + case speaker.smallPictureUrl of + Just smallPictureUrl -> + [ img [ src smallPictureUrl ] [] ] + + Nothing -> + [] + + Nothing -> + [] + in + case speaker of + Just speaker -> + div [] + ([ a [ onClick BackInHistory, classList [ ( "btn", True ), ( "btn-default", True ) ] ] + [ i [ classList [ ( "fa", True ), ( "fa-chevron-left", True ) ] ] [] + , text " Back" + ] + , h3 [] [ text speaker.name ] + , div [] [ Markdown.toHtml [] speaker.biography ] + , speakerEvents speaker model + ] + ++ image + ) + + Nothing -> + div [] [ text "Unknown speaker..." ] + + +speakerEvents : Speaker -> Model -> Html Msg +speakerEvents speaker model = + let + events = + model.events + |> List.filter (\event -> List.member speaker.slug event.speakerSlugs) + in + case events of + [] -> + p [] [ text "This speaker has no events!" ] + + events -> + div [] + [ h3 [] [ text "Events:" ] + , ul [] + (List.map + eventItem + events + ) + ] + + +eventItem : Event -> Html Msg +eventItem event = + li [] + [ a [ href <| routeToString <| EventRoute event.slug ] [ text event.title ] ] From d44ef3bbd8a949b26ee6aeda6ec96dc3a07dc651 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Thu, 3 Aug 2017 22:58:12 +0200 Subject: [PATCH 37/54] Adding small indicators of the number of events instances for the different filters. Resulted in some cleanup as well. --- schedule/src/Decoders.elm | 8 +- schedule/src/Models.elm | 12 ++- schedule/src/Views/EventDetail.elm | 34 ++++--- schedule/src/Views/FilterView.elm | 126 +++++++++++++----------- schedule/src/Views/ScheduleOverview.elm | 21 ++-- src/program/models.py | 16 ++- 6 files changed, 129 insertions(+), 88 deletions(-) diff --git a/schedule/src/Decoders.elm b/schedule/src/Decoders.elm index 44d469ac..837ecdf6 100644 --- a/schedule/src/Decoders.elm +++ b/schedule/src/Decoders.elm @@ -57,8 +57,8 @@ eventDecoder = |> required "slug" string |> required "abstract" string |> required "speaker_slugs" (list string) - |> required "video_recording" bool - |> optional "video_url" string "" + |> required "video_state" string + |> optional "video_url" (nullable string) Nothing |> required "event_type" string @@ -89,8 +89,8 @@ eventInstanceDecoder = |> required "timeslots" float |> required "location" string |> required "location_icon" string - |> required "video_recording" bool - |> optional "video_url" string "" + |> required "video_state" string + |> optional "video_url" (nullable string) Nothing |> optional "is_favorited" (nullable bool) Nothing diff --git a/schedule/src/Models.elm b/schedule/src/Models.elm index 53be6e49..3c23cac1 100644 --- a/schedule/src/Models.elm +++ b/schedule/src/Models.elm @@ -66,7 +66,9 @@ type alias Filter = type alias VideoRecordingFilter = - { name : String, slug : String, filter : EventInstance -> Bool } + { name : String + , slug : String + } type alias Day = @@ -99,8 +101,8 @@ type alias EventInstance = , timeslots : Float , location : String , locationIcon : String - , videoRecording : Bool - , videoUrl : String + , videoState : String + , videoUrl : Maybe String , isFavorited : Maybe Bool } @@ -110,8 +112,8 @@ type alias Event = , slug : EventSlug , abstract : String , speakerSlugs : List SpeakerSlug - , videoRecording : Bool - , videoUrl : String + , videoState : String + , videoUrl : Maybe String , eventType : String } diff --git a/schedule/src/Views/EventDetail.elm b/schedule/src/Views/EventDetail.elm index aae9f710..47e67005 100644 --- a/schedule/src/Views/EventDetail.elm +++ b/schedule/src/Views/EventDetail.elm @@ -100,11 +100,11 @@ eventDetailSidebar event model = let videoRecordingLink = case event.videoUrl of - "" -> + Nothing -> [] - _ -> - [ a [ href event.videoUrl, classList [ ( "btn", True ), ( "btn-success", True ) ] ] + Just url -> + [ a [ href url, classList [ ( "btn", True ), ( "btn-success", True ) ] ] [ i [ classList [ ( "fa", True ), ( "fa-film", True ) ] ] [] , text " Watch recording here!" ] @@ -134,20 +134,30 @@ eventDetailSidebar event model = eventMetaDataSidebar : Event -> Html Msg eventMetaDataSidebar event = let - videoRecording = - case event.videoRecording of - True -> - "Yes" + ( showVideoRecoring, videoRecording ) = + case event.videoState of + "to-be-recorded" -> + ( True, "Yes" ) - False -> - "No" + "not-to-be-recorded" -> + ( True, "No" ) + + _ -> + ( False, "" ) in div [] [ h4 [] [ text "Metadata" ] , ul [] - [ li [] [ strong [] [ text "Type: " ], text event.eventType ] - , li [] [ strong [] [ text "Recording: " ], text videoRecording ] - ] + ([ li [] [ strong [] [ text "Type: " ], text event.eventType ] + ] + ++ (case showVideoRecoring of + True -> + [ li [] [ strong [] [ text "Recording: " ], text videoRecording ] ] + + False -> + [] + ) + ) ] diff --git a/schedule/src/Views/FilterView.elm b/schedule/src/Views/FilterView.elm index a6e4700d..3cfc1686 100644 --- a/schedule/src/Views/FilterView.elm +++ b/schedule/src/Views/FilterView.elm @@ -3,7 +3,7 @@ module Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQu -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, EventInstance, Filter, Day, FilterQuery, Route(OverviewFilteredRoute), VideoRecordingFilter) +import Models exposing (Model, EventInstance, Filter, Day, FilterQuery, Route(OverviewFilteredRoute), VideoRecordingFilter, EventType, EventLocation) import Routing exposing (routeToString) @@ -14,7 +14,7 @@ import Regex -- External modules -import Html exposing (Html, text, div, ul, li, span, i, h4) +import Html exposing (Html, text, div, ul, li, span, i, h4, small) import Html.Attributes exposing (class, classList) import Html.Events exposing (onClick) import Date.Extra exposing (Interval(..), equalBy) @@ -23,29 +23,22 @@ import Date.Extra exposing (Interval(..), equalBy) applyFilters : Day -> Model -> List EventInstance applyFilters day model = let - types = - List.map (\eventType -> eventType.slug) - (if List.isEmpty model.filter.eventTypes then - model.eventTypes + slugs default filters = + List.map .slug + (if List.isEmpty filters then + default else - model.filter.eventTypes + filters ) + types = + slugs model.eventTypes model.filter.eventTypes + locations = - List.map (\eventLocation -> eventLocation.slug) - (if List.isEmpty model.filter.eventLocations then - model.eventLocations - else - model.filter.eventLocations - ) + slugs model.eventLocations model.filter.eventLocations videoFilters = - List.map (\filter -> filter.filter) - (if List.isEmpty model.filter.videoRecording then - videoRecordingFilters - else - model.filter.videoRecording - ) + slugs videoRecordingFilters model.filter.videoRecording filteredEventInstances = List.filter @@ -54,7 +47,7 @@ applyFilters day model = && (Date.Extra.equalBy Date.Extra.Day eventInstance.from day.date) && List.member eventInstance.location locations && List.member eventInstance.eventType types - && applyVideoRecordingFilters videoFilters eventInstance + && List.member eventInstance.videoState videoFilters ) model.eventInstances in @@ -74,70 +67,84 @@ filterSidebar model = ] [ h4 [] [ text "Filter" ] , div [ class "form-group" ] - [ filterView "Type" model.eventTypes model.filter.eventTypes ToggleEventTypeFilter - , filterView "Location" model.eventLocations model.filter.eventLocations ToggleEventLocationFilter - , filterView "Video" videoRecordingFilters model.filter.videoRecording ToggleVideoRecordingFilter + [ filterView + "Type" + model.eventTypes + model.filter.eventTypes + ToggleEventTypeFilter + model.eventInstances + .eventType + , filterView + "Location" + model.eventLocations + model.filter.eventLocations + ToggleEventLocationFilter + model.eventInstances + .location + , filterView + "Video" + videoRecordingFilters + model.filter.videoRecording + ToggleVideoRecordingFilter + model.eventInstances + .videoState ] ] -notRecordedFilter : EventInstance -> Bool -notRecordedFilter eventInstance = - eventInstance.videoRecording == False - - -recordedFilter : EventInstance -> Bool -recordedFilter eventInstance = - eventInstance.videoRecording == True - - -hasRecordingFilter : EventInstance -> Bool -hasRecordingFilter eventInstance = - eventInstance.videoUrl /= "" - - videoRecordingFilters : List VideoRecordingFilter videoRecordingFilters = - [ { name = "Will not be recorded", slug = "not-to-be-recorded", filter = notRecordedFilter } - , { name = "Will recorded", slug = "to-be-recorded", filter = recordedFilter } - , { name = "Has recording", slug = "has-recording", filter = hasRecordingFilter } + [ { name = "Will not be recorded", slug = "not-to-be-recorded" } + , { name = "Will recorded", slug = "to-be-recorded" } + , { name = "Has recording", slug = "has-recording" } ] -applyVideoRecordingFilters : List (EventInstance -> Bool) -> EventInstance -> Bool -applyVideoRecordingFilters filters eventInstance = - let - results = - List.map (\filter -> filter eventInstance) filters - in - List.member True results - - filterView : String - -> List { a | name : String } - -> List { a | name : String } - -> ({ a | name : String } -> Msg) + -> List { a | name : String, slug : String } + -> List { a | name : String, slug : String } + -> ({ a | name : String, slug : String } -> Msg) + -> List EventInstance + -> (EventInstance -> String) -> Html Msg -filterView name possibleFilters currentFilters action = +filterView name possibleFilters currentFilters action eventInstances slugLike = div [] [ text (name ++ ":") - , ul [] (List.map (\filter -> filterChoiceView filter currentFilters action) possibleFilters) + , ul [] + (possibleFilters + |> List.map + (\filter -> + filterChoiceView + filter + currentFilters + action + eventInstances + slugLike + ) + ) ] filterChoiceView : - { a | name : String } - -> List { a | name : String } - -> ({ a | name : String } -> Msg) + { a | name : String, slug : String } + -> List { a | name : String, slug : String } + -> ({ a | name : String, slug : String } -> Msg) + -> List EventInstance + -> (EventInstance -> String) -> Html Msg -filterChoiceView filter currentFilters action = +filterChoiceView filter currentFilters action eventInstances slugLike = let active = List.member filter currentFilters notActive = not active + + eventInstanceCount = + eventInstances + |> List.filter (\eventInstance -> slugLike eventInstance == filter.slug) + |> List.length in li [] [ div @@ -151,6 +158,7 @@ filterChoiceView filter currentFilters action = [ span [] [ i [ classList [ ( "fa", True ), ( "fa-minus", active ), ( "fa-plus", notActive ) ] ] [] , text (" " ++ filter.name) + , small [] [ text <| " (" ++ (toString eventInstanceCount) ++ ")" ] ] ] ] diff --git a/schedule/src/Views/ScheduleOverview.elm b/schedule/src/Views/ScheduleOverview.elm index e99a55c7..c1d7206b 100644 --- a/schedule/src/Views/ScheduleOverview.elm +++ b/schedule/src/Views/ScheduleOverview.elm @@ -77,12 +77,21 @@ dayEventInstanceIcons : EventInstance -> List (Html Msg) dayEventInstanceIcons eventInstance = let videoIcon = - if eventInstance.videoUrl /= "" then - [ i [ classList [ ( "fa", True ), ( "fa-film", True ), ( "pull-right", True ) ] ] [] ] - else if eventInstance.videoRecording then - [ i [ classList [ ( "fa", True ), ( "fa-video-camera", True ), ( "pull-right", True ) ] ] [] ] - else - [] + case eventInstance.videoState of + "has-recording" -> + [ i + [ classList [ ( "fa", True ), ( "fa-film", True ), ( "pull-right", True ) ] ] + [] + ] + + "to-be-recorded" -> + [ i + [ classList [ ( "fa", True ), ( "fa-video-camera", True ), ( "pull-right", True ) ] ] + [] + ] + + _ -> + [] in [ i [ classList [ ( "fa", True ), ( "fa-" ++ eventInstance.locationIcon, True ), ( "pull-right", True ) ] ] [] ] diff --git a/src/program/models.py b/src/program/models.py index b5e8187b..1dc7c270 100644 --- a/src/program/models.py +++ b/src/program/models.py @@ -439,12 +439,18 @@ class Event(CampRelatedModel): speaker.slug for speaker in self.speakers.all() ], - 'video_recording': self.video_recording, 'event_type': self.event_type.name, } if self.video_url: + video_state = 'has-recording' data['video_url'] = self.video_url + elif self.video_recording: + video_state = 'to-be-recorded' + elif not self.video_recording: + video_state = 'not-to-be-recorded' + + data['video_state'] = video_state return data @@ -525,11 +531,17 @@ class EventInstance(CampRelatedModel): 'location': self.location.slug, 'location_icon': self.location.icon, 'timeslots': self.timeslots, - 'video_recording': self.event.video_recording, } if self.event.video_url: + video_state = 'has-recording' data['video_url'] = self.event.video_url + elif self.event.video_recording: + video_state = 'to-be-recorded' + elif not self.event.video_recording: + video_state = 'not-to-be-recorded' + + data['video_state'] = video_state if user and user.is_authenticated: is_favorited = user.favorites.filter(event_instance=self).exists() From 27a4ff0bbba3106f6fcf4ef28fdccf08e7db5679 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Thu, 3 Aug 2017 22:59:39 +0200 Subject: [PATCH 38/54] Comitting latest compiled version --- src/program/static/js/elm_based_schedule.js | 392 +++++++++++--------- 1 file changed, 223 insertions(+), 169 deletions(-) diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js index eec9f1a8..688d9658 100644 --- a/src/program/static/js/elm_based_schedule.js +++ b/src/program/static/js/elm_based_schedule.js @@ -17858,9 +17858,9 @@ var _user$project$Models$Filter = F3( function (a, b, c) { return {eventTypes: a, eventLocations: b, videoRecording: c}; }); -var _user$project$Models$VideoRecordingFilter = F3( - function (a, b, c) { - return {name: a, slug: b, filter: c}; +var _user$project$Models$VideoRecordingFilter = F2( + function (a, b) { + return {name: a, slug: b}; }); var _user$project$Models$Day = F3( function (a, b, c) { @@ -17886,7 +17886,7 @@ var _user$project$Models$EventInstance = function (a) { return function (n) { return function (o) { return function (p) { - return {title: a, slug: b, id: c, url: d, eventSlug: e, eventType: f, backgroundColor: g, forgroundColor: h, from: i, to: j, timeslots: k, location: l, locationIcon: m, videoRecording: n, videoUrl: o, isFavorited: p}; + return {title: a, slug: b, id: c, url: d, eventSlug: e, eventType: f, backgroundColor: g, forgroundColor: h, from: i, to: j, timeslots: k, location: l, locationIcon: m, videoState: n, videoUrl: o, isFavorited: p}; }; }; }; @@ -17905,7 +17905,7 @@ var _user$project$Models$EventInstance = function (a) { }; var _user$project$Models$Event = F7( function (a, b, c, d, e, f, g) { - return {title: a, slug: b, $abstract: c, speakerSlugs: d, videoRecording: e, videoUrl: f, eventType: g}; + return {title: a, slug: b, $abstract: c, speakerSlugs: d, videoState: e, videoUrl: f, eventType: g}; }); var _user$project$Models$EventLocation = F3( function (a, b, c) { @@ -17981,12 +17981,12 @@ var _user$project$Decoders$eventInstanceDecoder = A4( A4( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, 'video_url', - _elm_lang$core$Json_Decode$string, - '', + _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$string), + _elm_lang$core$Maybe$Nothing, A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'video_recording', - _elm_lang$core$Json_Decode$bool, + 'video_state', + _elm_lang$core$Json_Decode$string, A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, 'location_icon', @@ -18047,12 +18047,12 @@ var _user$project$Decoders$eventDecoder = A3( A4( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$optional, 'video_url', - _elm_lang$core$Json_Decode$string, - '', + _elm_lang$core$Json_Decode$nullable(_elm_lang$core$Json_Decode$string), + _elm_lang$core$Maybe$Nothing, A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, - 'video_recording', - _elm_lang$core$Json_Decode$bool, + 'video_state', + _elm_lang$core$Json_Decode$string, A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, 'speaker_slugs', @@ -18370,8 +18370,17 @@ var _user$project$Views_FilterView$getFilter = F3( }, filterSlugs); }); -var _user$project$Views_FilterView$filterChoiceView = F3( - function (filter, currentFilters, action) { +var _user$project$Views_FilterView$filterChoiceView = F5( + function (filter, currentFilters, action, eventInstances, slugLike) { + var eventInstanceCount = _elm_lang$core$List$length( + A2( + _elm_lang$core$List$filter, + function (eventInstance) { + return _elm_lang$core$Native_Utils.eq( + slugLike(eventInstance), + filter.slug); + }, + eventInstances)); var active = A2(_elm_lang$core$List$member, filter, currentFilters); var notActive = !active; return A2( @@ -18436,7 +18445,25 @@ var _user$project$Views_FilterView$filterChoiceView = F3( ctor: '::', _0: _elm_lang$html$Html$text( A2(_elm_lang$core$Basics_ops['++'], ' ', filter.name)), - _1: {ctor: '[]'} + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$small, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text( + A2( + _elm_lang$core$Basics_ops['++'], + ' (', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$core$Basics$toString(eventInstanceCount), + ')'))), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } } }), _1: {ctor: '[]'} @@ -18444,8 +18471,8 @@ var _user$project$Views_FilterView$filterChoiceView = F3( _1: {ctor: '[]'} }); }); -var _user$project$Views_FilterView$filterView = F4( - function (name, possibleFilters, currentFilters, action) { +var _user$project$Views_FilterView$filterView = F6( + function (name, possibleFilters, currentFilters, action, eventInstances, slugLike) { return A2( _elm_lang$html$Html$div, {ctor: '[]'}, @@ -18461,41 +18488,22 @@ var _user$project$Views_FilterView$filterView = F4( A2( _elm_lang$core$List$map, function (filter) { - return A3(_user$project$Views_FilterView$filterChoiceView, filter, currentFilters, action); + return A5(_user$project$Views_FilterView$filterChoiceView, filter, currentFilters, action, eventInstances, slugLike); }, possibleFilters)), _1: {ctor: '[]'} } }); }); -var _user$project$Views_FilterView$applyVideoRecordingFilters = F2( - function (filters, eventInstance) { - var results = A2( - _elm_lang$core$List$map, - function (filter) { - return filter(eventInstance); - }, - filters); - return A2(_elm_lang$core$List$member, true, results); - }); -var _user$project$Views_FilterView$hasRecordingFilter = function (eventInstance) { - return !_elm_lang$core$Native_Utils.eq(eventInstance.videoUrl, ''); -}; -var _user$project$Views_FilterView$recordedFilter = function (eventInstance) { - return _elm_lang$core$Native_Utils.eq(eventInstance.videoRecording, true); -}; -var _user$project$Views_FilterView$notRecordedFilter = function (eventInstance) { - return _elm_lang$core$Native_Utils.eq(eventInstance.videoRecording, false); -}; var _user$project$Views_FilterView$videoRecordingFilters = { ctor: '::', - _0: {name: 'Will not be recorded', slug: 'not-to-be-recorded', filter: _user$project$Views_FilterView$notRecordedFilter}, + _0: {name: 'Will not be recorded', slug: 'not-to-be-recorded'}, _1: { ctor: '::', - _0: {name: 'Will recorded', slug: 'to-be-recorded', filter: _user$project$Views_FilterView$recordedFilter}, + _0: {name: 'Will recorded', slug: 'to-be-recorded'}, _1: { ctor: '::', - _0: {name: 'Has recording', slug: 'has-recording', filter: _user$project$Views_FilterView$hasRecordingFilter}, + _0: {name: 'Has recording', slug: 'has-recording'}, _1: {ctor: '[]'} } } @@ -18557,13 +18565,40 @@ var _user$project$Views_FilterView$filterSidebar = function (model) { }, { ctor: '::', - _0: A4(_user$project$Views_FilterView$filterView, 'Type', model.eventTypes, model.filter.eventTypes, _user$project$Messages$ToggleEventTypeFilter), + _0: A6( + _user$project$Views_FilterView$filterView, + 'Type', + model.eventTypes, + model.filter.eventTypes, + _user$project$Messages$ToggleEventTypeFilter, + model.eventInstances, + function (_) { + return _.eventType; + }), _1: { ctor: '::', - _0: A4(_user$project$Views_FilterView$filterView, 'Location', model.eventLocations, model.filter.eventLocations, _user$project$Messages$ToggleEventLocationFilter), + _0: A6( + _user$project$Views_FilterView$filterView, + 'Location', + model.eventLocations, + model.filter.eventLocations, + _user$project$Messages$ToggleEventLocationFilter, + model.eventInstances, + function (_) { + return _.location; + }), _1: { ctor: '::', - _0: A4(_user$project$Views_FilterView$filterView, 'Video', _user$project$Views_FilterView$videoRecordingFilters, model.filter.videoRecording, _user$project$Messages$ToggleVideoRecordingFilter), + _0: A6( + _user$project$Views_FilterView$filterView, + 'Video', + _user$project$Views_FilterView$videoRecordingFilters, + model.filter.videoRecording, + _user$project$Messages$ToggleVideoRecordingFilter, + model.eventInstances, + function (_) { + return _.videoState; + }), _1: {ctor: '[]'} } } @@ -18574,28 +18609,22 @@ var _user$project$Views_FilterView$filterSidebar = function (model) { }; var _user$project$Views_FilterView$applyFilters = F2( function (day, model) { - var videoFilters = A2( - _elm_lang$core$List$map, - function (filter) { - return filter.filter; - }, - _elm_lang$core$List$isEmpty(model.filter.videoRecording) ? _user$project$Views_FilterView$videoRecordingFilters : model.filter.videoRecording); - var locations = A2( - _elm_lang$core$List$map, - function (eventLocation) { - return eventLocation.slug; - }, - _elm_lang$core$List$isEmpty(model.filter.eventLocations) ? model.eventLocations : model.filter.eventLocations); - var types = A2( - _elm_lang$core$List$map, - function (eventType) { - return eventType.slug; - }, - _elm_lang$core$List$isEmpty(model.filter.eventTypes) ? model.eventTypes : model.filter.eventTypes); + var slugs = F2( + function ($default, filters) { + return A2( + _elm_lang$core$List$map, + function (_) { + return _.slug; + }, + _elm_lang$core$List$isEmpty(filters) ? $default : filters); + }); + var types = A2(slugs, model.eventTypes, model.filter.eventTypes); + var locations = A2(slugs, model.eventLocations, model.filter.eventLocations); + var videoFilters = A2(slugs, _user$project$Views_FilterView$videoRecordingFilters, model.filter.videoRecording); var filteredEventInstances = A2( _elm_lang$core$List$filter, function (eventInstance) { - return A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Month, eventInstance.from, day.date) && (A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Day, eventInstance.from, day.date) && (A2(_elm_lang$core$List$member, eventInstance.location, locations) && (A2(_elm_lang$core$List$member, eventInstance.eventType, types) && A2(_user$project$Views_FilterView$applyVideoRecordingFilters, videoFilters, eventInstance)))); + return A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Month, eventInstance.from, day.date) && (A3(_justinmimbs$elm_date_extra$Date_Extra$equalBy, _justinmimbs$elm_date_extra$Date_Extra$Day, eventInstance.from, day.date) && (A2(_elm_lang$core$List$member, eventInstance.location, locations) && (A2(_elm_lang$core$List$member, eventInstance.eventType, types) && A2(_elm_lang$core$List$member, eventInstance.videoState, videoFilters)))); }, model.eventInstances); return filteredEventInstances; @@ -19470,14 +19499,19 @@ var _user$project$Views_EventDetail$speakerSidebar = function (speakers) { }); }; var _user$project$Views_EventDetail$eventMetaDataSidebar = function (event) { - var videoRecording = function () { - var _p0 = event.videoRecording; - if (_p0 === true) { - return 'Yes'; - } else { - return 'No'; + var _p0 = function () { + var _p1 = event.videoState; + switch (_p1) { + case 'to-be-recorded': + return {ctor: '_Tuple2', _0: true, _1: 'Yes'}; + case 'not-to-be-recorded': + return {ctor: '_Tuple2', _0: true, _1: 'No'}; + default: + return {ctor: '_Tuple2', _0: false, _1: ''}; } }(); + var showVideoRecoring = _p0._0; + var videoRecording = _p0._1; return A2( _elm_lang$html$Html$div, {ctor: '[]'}, @@ -19496,28 +19530,9 @@ var _user$project$Views_EventDetail$eventMetaDataSidebar = function (event) { _0: A2( _elm_lang$html$Html$ul, {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$li, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$strong, - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$html$Html$text('Type: '), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _elm_lang$html$Html$text(event.eventType), - _1: {ctor: '[]'} - } - }), - _1: { + A2( + _elm_lang$core$Basics_ops['++'], + { ctor: '::', _0: A2( _elm_lang$html$Html$li, @@ -19529,18 +19544,47 @@ var _user$project$Views_EventDetail$eventMetaDataSidebar = function (event) { {ctor: '[]'}, { ctor: '::', - _0: _elm_lang$html$Html$text('Recording: '), + _0: _elm_lang$html$Html$text('Type: '), _1: {ctor: '[]'} }), _1: { ctor: '::', - _0: _elm_lang$html$Html$text(videoRecording), + _0: _elm_lang$html$Html$text(event.eventType), _1: {ctor: '[]'} } }), _1: {ctor: '[]'} - } - }), + }, + function () { + var _p2 = showVideoRecoring; + if (_p2 === true) { + return { + ctor: '::', + _0: A2( + _elm_lang$html$Html$li, + {ctor: '[]'}, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$strong, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text('Recording: '), + _1: {ctor: '[]'} + }), + _1: { + ctor: '::', + _0: _elm_lang$html$Html$text(videoRecording), + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + }; + } else { + return {ctor: '[]'}; + } + }())), _1: {ctor: '[]'} } }); @@ -19549,24 +19593,24 @@ var _user$project$Views_EventDetail$getSpeakersFromSlugs = F3( function (speakers, slugs, collectedSpeakers) { getSpeakersFromSlugs: while (true) { - var _p1 = speakers; - if (_p1.ctor === '[]') { + var _p3 = speakers; + if (_p3.ctor === '[]') { return collectedSpeakers; } else { - var _p5 = _p1._0; + var _p7 = _p3._0; var foundSlug = _elm_lang$core$List$head( A2( _elm_lang$core$List$filter, function (slug) { - return _elm_lang$core$Native_Utils.eq(slug, _p5.slug); + return _elm_lang$core$Native_Utils.eq(slug, _p7.slug); }, slugs)); var foundSpeaker = function () { - var _p2 = foundSlug; - if (_p2.ctor === 'Just') { + var _p4 = foundSlug; + if (_p4.ctor === 'Just') { return { ctor: '::', - _0: _p5, + _0: _p7, _1: {ctor: '[]'} }; } else { @@ -19575,28 +19619,28 @@ var _user$project$Views_EventDetail$getSpeakersFromSlugs = F3( }(); var newCollectedSpeakers = A2(_elm_lang$core$Basics_ops['++'], collectedSpeakers, foundSpeaker); var newSlugs = function () { - var _p3 = foundSlug; - if (_p3.ctor === 'Just') { + var _p5 = foundSlug; + if (_p5.ctor === 'Just') { return A2( _elm_lang$core$List$filter, function (x) { - return !_elm_lang$core$Native_Utils.eq(x, _p3._0); + return !_elm_lang$core$Native_Utils.eq(x, _p5._0); }, slugs); } else { return slugs; } }(); - var _p4 = slugs; - if (_p4.ctor === '[]') { + var _p6 = slugs; + if (_p6.ctor === '[]') { return collectedSpeakers; } else { - var _v5 = _p1._1, - _v6 = newSlugs, - _v7 = newCollectedSpeakers; - speakers = _v5; - slugs = _v6; - collectedSpeakers = _v7; + var _v6 = _p3._1, + _v7 = newSlugs, + _v8 = newCollectedSpeakers; + speakers = _v6; + slugs = _v7; + collectedSpeakers = _v8; continue getSpeakersFromSlugs; } } @@ -19616,8 +19660,8 @@ var _user$project$Views_EventDetail$eventDetailSidebar = F2( }, model.eventInstances); var videoRecordingLink = function () { - var _p6 = event.videoUrl; - if (_p6 === '') { + var _p8 = event.videoUrl; + if (_p8.ctor === 'Nothing') { return {ctor: '[]'}; } else { return { @@ -19626,7 +19670,7 @@ var _user$project$Views_EventDetail$eventDetailSidebar = F2( _elm_lang$html$Html$a, { ctor: '::', - _0: _elm_lang$html$Html_Attributes$href(event.videoUrl), + _0: _elm_lang$html$Html_Attributes$href(_p8._0), _1: { ctor: '::', _0: _elm_lang$html$Html_Attributes$classList( @@ -19800,9 +19844,9 @@ var _user$project$Views_EventDetail$eventDetailView = F2( return _elm_lang$core$Native_Utils.eq(e.slug, eventSlug); }, model.events)); - var _p7 = event; - if (_p7.ctor === 'Just') { - var _p8 = _p7._0; + var _p9 = event; + if (_p9.ctor === 'Just') { + var _p10 = _p9._0; return A2( _elm_lang$html$Html$div, { @@ -19812,10 +19856,10 @@ var _user$project$Views_EventDetail$eventDetailView = F2( }, { ctor: '::', - _0: _user$project$Views_EventDetail$eventDetailContent(_p8), + _0: _user$project$Views_EventDetail$eventDetailContent(_p10), _1: { ctor: '::', - _0: A2(_user$project$Views_EventDetail$eventDetailSidebar, _p8, model), + _0: A2(_user$project$Views_EventDetail$eventDetailSidebar, _p10, model), _1: {ctor: '[]'} } }); @@ -20056,55 +20100,65 @@ var _user$project$Views_SpeakerDetail$speakerDetailView = F2( }); var _user$project$Views_ScheduleOverview$dayEventInstanceIcons = function (eventInstance) { - var videoIcon = (!_elm_lang$core$Native_Utils.eq(eventInstance.videoUrl, '')) ? { - ctor: '::', - _0: A2( - _elm_lang$html$Html$i, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, - _1: { + var videoIcon = function () { + var _p0 = eventInstance.videoState; + switch (_p0) { + case 'has-recording': + return { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa-film', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true}, - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - }, - {ctor: '[]'}), - _1: {ctor: '[]'} - } : (eventInstance.videoRecording ? { - ctor: '::', - _0: A2( - _elm_lang$html$Html$i, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, - _1: { + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-film', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: {ctor: '[]'} + }; + case 'to-be-recorded': + return { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa-video-camera', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true}, - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - }, - {ctor: '[]'}), - _1: {ctor: '[]'} - } : {ctor: '[]'}); + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-video-camera', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: {ctor: '[]'} + }; + default: + return {ctor: '[]'}; + } + }(); return A2( _elm_lang$core$Basics_ops['++'], { @@ -20419,7 +20473,7 @@ var _user$project$Main$main = A2( var Elm = {}; Elm['Main'] = Elm['Main'] || {}; if (typeof _user$project$Main$main !== 'undefined') { - _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Messages.Msg":{"args":[],"tags":{"OnLocationChange":["Navigation.Location"],"WebSocketPayload":["String"],"ToggleEventLocationFilter":["Models.EventLocation"],"NoOp":[],"ToggleVideoRecordingFilter":["Models.VideoRecordingFilter"],"ToggleEventTypeFilter":["Models.EventType"],"BackInHistory":[]}},"Date.Date":{"args":[],"tags":{"Date":[]}},"Maybe.Maybe":{"args":["a"],"tags":{"Just":["a"],"Nothing":[]}}},"aliases":{"Models.EventLocation":{"args":[],"type":"{ name : String, slug : String, icon : String }"},"Models.EventSlug":{"args":[],"type":"String"},"Models.EventType":{"args":[],"type":"{ name : String, slug : String, color : String, lightText : Bool }"},"Models.EventInstance":{"args":[],"type":"{ title : String , slug : Models.EventInstanceSlug , id : Int , url : String , eventSlug : Models.EventSlug , eventType : String , backgroundColor : String , forgroundColor : String , from : Date.Date , to : Date.Date , timeslots : Float , location : String , locationIcon : String , videoRecording : Bool , videoUrl : String , isFavorited : Maybe.Maybe Bool }"},"Models.EventInstanceSlug":{"args":[],"type":"String"},"Models.VideoRecordingFilter":{"args":[],"type":"{ name : String , slug : String , filter : Models.EventInstance -> Bool }"},"Navigation.Location":{"args":[],"type":"{ href : String , host : String , hostname : String , protocol : String , origin : String , port_ : String , pathname : String , search : String , hash : String , username : String , password : String }"}},"message":"Messages.Msg"},"versions":{"elm":"0.18.0"}}); + _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Messages.Msg":{"args":[],"tags":{"OnLocationChange":["Navigation.Location"],"WebSocketPayload":["String"],"ToggleEventLocationFilter":["Models.EventLocation"],"NoOp":[],"ToggleVideoRecordingFilter":["Models.VideoRecordingFilter"],"ToggleEventTypeFilter":["Models.EventType"],"BackInHistory":[]}}},"aliases":{"Models.EventLocation":{"args":[],"type":"{ name : String, slug : String, icon : String }"},"Models.EventType":{"args":[],"type":"{ name : String, slug : String, color : String, lightText : Bool }"},"Models.VideoRecordingFilter":{"args":[],"type":"{ name : String, slug : String }"},"Navigation.Location":{"args":[],"type":"{ href : String , host : String , hostname : String , protocol : String , origin : String , port_ : String , pathname : String , search : String , hash : String , username : String , password : String }"}},"message":"Messages.Msg"},"versions":{"elm":"0.18.0"}}); } if (typeof define === "function" && define['amd']) From 92126cc98f59b43a7663bb6ccc0dc766b362716b Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Sun, 13 Aug 2017 15:24:01 +0200 Subject: [PATCH 39/54] Keep filter when returning to overview. --- schedule/src/Views/DayPicker.elm | 3 ++- schedule/src/Views/FilterView.elm | 26 +++++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/schedule/src/Views/DayPicker.elm b/schedule/src/Views/DayPicker.elm index d7a8b5f5..b22297d1 100644 --- a/schedule/src/Views/DayPicker.elm +++ b/schedule/src/Views/DayPicker.elm @@ -5,6 +5,7 @@ module Views.DayPicker exposing (..) import Models exposing (..) import Messages exposing (Msg(..)) import Routing exposing (routeToString) +import Views.FilterView exposing (maybeFilteredOverviewRoute) -- Core modules @@ -52,7 +53,7 @@ dayPicker model = , ( "btn-default", not isAllDaysActive ) , ( "btn-primary", isAllDaysActive ) ] - , href <| routeToString OverviewRoute + , href <| routeToString <| maybeFilteredOverviewRoute model ] [ text "All Days" ] diff --git a/schedule/src/Views/FilterView.elm b/schedule/src/Views/FilterView.elm index 3cfc1686..e6cb5413 100644 --- a/schedule/src/Views/FilterView.elm +++ b/schedule/src/Views/FilterView.elm @@ -1,9 +1,9 @@ -module Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQuery, filterToQuery) +module Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQuery, filterToQuery, maybeFilteredOverviewRoute) -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, EventInstance, Filter, Day, FilterQuery, Route(OverviewFilteredRoute), VideoRecordingFilter, EventType, EventLocation) +import Models exposing (Model, EventInstance, Filter, Day, FilterQuery, Route(OverviewRoute, OverviewFilteredRoute), VideoRecordingFilter, EventType, EventLocation) import Routing exposing (routeToString) @@ -204,8 +204,8 @@ parseFilterFromQuery query model = } -filterToQuery : Filter -> FilterQuery -filterToQuery filter = +filterToString : Filter -> String +filterToString filter = let typePart = case String.join "," (List.map .slug filter.eventTypes) of @@ -230,8 +230,24 @@ filterToQuery filter = video -> "video=" ++ video + in + String.join "&" (List.filter (\x -> x /= "") [ typePart, locationPart, videoPart ]) + +filterToQuery : Filter -> FilterQuery +filterToQuery filter = + let result = - String.join "&" (List.filter (\x -> x /= "") [ typePart, locationPart, videoPart ]) + filterToString filter in routeToString <| OverviewFilteredRoute result + + +maybeFilteredOverviewRoute : Model -> Route +maybeFilteredOverviewRoute model = + case filterToString model.filter of + "" -> + OverviewRoute + + query -> + OverviewFilteredRoute query From bd1d139d2de37a3cfd61a55cd103be6c4ab78eda Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Mon, 14 Aug 2017 00:50:54 +0200 Subject: [PATCH 40/54] Fixing ICSView. --- src/program/views.py | 57 +++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/src/program/views.py b/src/program/views.py index dc16c036..0d829125 100644 --- a/src/program/views.py +++ b/src/program/views.py @@ -11,6 +11,7 @@ from django.utils.decorators import method_decorator from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib import messages from django.urls import reverse +from django.db.models import Q import icalendar @@ -37,27 +38,45 @@ logger = logging.getLogger("bornhack.%s" % __name__) class ICSView(CampViewMixin, View): def get(self, request, *args, **kwargs): eventinstances = models.EventInstance.objects.filter(event__camp=self.camp) - type_ = request.GET.get('type', None) - location = request.GET.get('location', None) - if type_: - try: - eventtype = models.EventType.objects.get( - slug=type_ - ) - eventinstances = eventinstances.filter(event__event_type=eventtype) - except models.EventType.DoesNotExist: - raise Http404 + # Type query + type_query = request.GET.get('type', None) + if type_query: + type_slugs = type_query.split(',') + types = models.EventType.objects.filter( + slug__in=type_slugs + ) + eventinstances = eventinstances.filter(event__event_type__in=types) - if location: - try: - eventlocation = models.EventLocation.objects.get( - slug=location, - camp=self.camp, - ) - eventinstances = eventinstances.filter(location__slug=location) - except models.EventLocation.DoesNotExist: - raise Http404 + # Location query + location_query = request.GET.get('location', None) + if location_query: + location_slugs = location_query.split(',') + locations = models.EventLocation.objects.filter( + slug__in=location_slugs, + camp=self.camp, + ) + eventinstances = eventinstances.filter(location__in=locations) + + # Video recording query + video_query = request.GET.get('video', None) + if video_query: + video_states = video_query.split(',') + query_kwargs = {} + + if 'has-recording' in video_states: + query_kwargs['event__video_url__isnull'] = False + + if 'to-be-recorded' in video_states: + query_kwargs['event__video_recording'] = True + + if 'not-to-be-recorded' in video_states: + if 'event__video_recording' in query_kwargs: + del query_kwargs['event__video_recording'] + else: + query_kwargs['event__video_recording'] = False + + eventinstances = eventinstances.filter(**query_kwargs) cal = icalendar.Calendar() for event_instance in eventinstances: From cf575d5b74d6e1772379e276e86d6431b0bc5846 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 18:08:34 +0200 Subject: [PATCH 41/54] Use more union types! --- schedule/src/Decoders.elm | 10 +-- schedule/src/Messages.elm | 6 +- schedule/src/Models.elm | 97 +++++++++++++++-------- schedule/src/Update.elm | 90 ++++++++++------------ schedule/src/Views/DayView.elm | 10 +-- schedule/src/Views/FilterView.elm | 124 ++++++++++++++++++++++-------- 6 files changed, 208 insertions(+), 129 deletions(-) diff --git a/schedule/src/Decoders.elm b/schedule/src/Decoders.elm index 837ecdf6..b574794c 100644 --- a/schedule/src/Decoders.elm +++ b/schedule/src/Decoders.elm @@ -2,7 +2,7 @@ module Decoders exposing (..) -- Local modules -import Models exposing (Day, Speaker, Event, EventInstance, EventLocation, EventType, Model, Flags, Filter, Route(..)) +import Models exposing (Day, Speaker, Event, EventInstance, Model, Flags, Filter, Route(..), FilterType(..)) -- Core modules @@ -94,17 +94,17 @@ eventInstanceDecoder = |> optional "is_favorited" (nullable bool) Nothing -eventLocationDecoder : Decoder EventLocation +eventLocationDecoder : Decoder FilterType eventLocationDecoder = - decode EventLocation + decode LocationFilter |> required "name" string |> required "slug" string |> required "icon" string -eventTypeDecoder : Decoder EventType +eventTypeDecoder : Decoder FilterType eventTypeDecoder = - decode EventType + decode TypeFilter |> required "name" string |> required "slug" string |> required "color" string diff --git a/schedule/src/Messages.elm b/schedule/src/Messages.elm index db48160e..414a6f79 100644 --- a/schedule/src/Messages.elm +++ b/schedule/src/Messages.elm @@ -2,7 +2,7 @@ module Messages exposing (Msg(..)) -- Local modules -import Models exposing (Day, EventType, EventLocation, EventInstance, VideoRecordingFilter) +import Models exposing (Day, EventInstance, FilterType) -- External modules @@ -13,8 +13,6 @@ import Navigation exposing (Location) type Msg = NoOp | WebSocketPayload String - | ToggleEventTypeFilter EventType - | ToggleEventLocationFilter EventLocation - | ToggleVideoRecordingFilter VideoRecordingFilter + | ToggleFilter FilterType | OnLocationChange Location | BackInHistory diff --git a/schedule/src/Models.elm b/schedule/src/Models.elm index 3c23cac1..9f60f394 100644 --- a/schedule/src/Models.elm +++ b/schedule/src/Models.elm @@ -47,8 +47,8 @@ type alias Model = { days : List Day , events : List Event , eventInstances : List EventInstance - , eventLocations : List EventLocation - , eventTypes : List EventType + , eventLocations : List FilterType + , eventTypes : List FilterType , speakers : List Speaker , flags : Flags , filter : Filter @@ -58,19 +58,6 @@ type alias Model = } -type alias Filter = - { eventTypes : List EventType - , eventLocations : List EventLocation - , videoRecording : List VideoRecordingFilter - } - - -type alias VideoRecordingFilter = - { name : String - , slug : String - } - - type alias Day = { day_name : String , date : Date @@ -118,21 +105,6 @@ type alias Event = } -type alias EventLocation = - { name : String - , slug : String - , icon : String - } - - -type alias EventType = - { name : String - , slug : String - , color : String - , lightText : Bool - } - - type alias Flags = { schedule_timeslot_length_minutes : Int , schedule_midnight_offset_hours : Int @@ -140,3 +112,68 @@ type alias Flags = , camp_slug : String , websocket_server : String } + + + +-- FILTERS + + +type alias FilterName = + String + + +type alias FilterSlug = + String + + +type alias LocationIcon = + String + + +type alias TypeColor = + String + + +type alias TypeLightText = + Bool + + +type FilterType + = TypeFilter FilterName FilterSlug TypeColor TypeLightText + | LocationFilter FilterName FilterSlug LocationIcon + | VideoFilter FilterName FilterSlug + + +type alias Filter = + { eventTypes : List FilterType + , eventLocations : List FilterType + , videoRecording : List FilterType + } + + +unpackFilterType filter = + case filter of + TypeFilter name slug _ _ -> + ( name, slug ) + + LocationFilter name slug _ -> + ( name, slug ) + + VideoFilter name slug -> + ( name, slug ) + + +getSlugFromFilterType filter = + let + ( _, slug ) = + unpackFilterType filter + in + slug + + +getNameFromFilterType filter = + let + ( name, slug ) = + unpackFilterType filter + in + name diff --git a/schedule/src/Update.elm b/schedule/src/Update.elm index d52293dc..8d2ad964 100644 --- a/schedule/src/Update.elm +++ b/schedule/src/Update.elm @@ -2,7 +2,7 @@ module Update exposing (update) -- Local modules -import Models exposing (Model, Route(..), Filter) +import Models exposing (Model, Route(..), Filter, FilterType(..)) import Messages exposing (Msg(..)) import Decoders exposing (webSocketActionDecoder, initDataDecoder, eventDecoder) import Routing exposing (parseLocation) @@ -50,63 +50,51 @@ update msg model = in newModel_ ! [] - ToggleEventTypeFilter eventType -> + ToggleFilter filter -> let - eventTypesFilter = - if List.member eventType model.filter.eventTypes then - List.filter (\x -> x /= eventType) model.filter.eventTypes - else - eventType :: model.filter.eventTypes - currentFilter = model.filter newFilter = - { currentFilter | eventTypes = eventTypesFilter } + case filter of + TypeFilter name slug color lightText -> + let + eventType = + TypeFilter name slug color lightText + in + { currentFilter + | eventTypes = + if List.member eventType model.filter.eventTypes then + List.filter (\x -> x /= eventType) model.filter.eventTypes + else + eventType :: model.filter.eventTypes + } - query = - filterToQuery newFilter + LocationFilter name slug icon -> + let + eventLocation = + LocationFilter name slug icon + in + { currentFilter + | eventLocations = + if List.member eventLocation model.filter.eventLocations then + List.filter (\x -> x /= eventLocation) model.filter.eventLocations + else + eventLocation :: model.filter.eventLocations + } - cmd = - Navigation.newUrl query - in - { model | filter = newFilter } ! [ cmd ] - - ToggleEventLocationFilter eventLocation -> - let - eventLocationsFilter = - if List.member eventLocation model.filter.eventLocations then - List.filter (\x -> x /= eventLocation) model.filter.eventLocations - else - eventLocation :: model.filter.eventLocations - - currentFilter = - model.filter - - newFilter = - { currentFilter | eventLocations = eventLocationsFilter } - - query = - filterToQuery newFilter - - cmd = - Navigation.newUrl query - in - { model | filter = newFilter } ! [ cmd ] - - ToggleVideoRecordingFilter videoRecording -> - let - videoRecordingFilter = - if List.member videoRecording model.filter.videoRecording then - List.filter (\x -> x /= videoRecording) model.filter.videoRecording - else - videoRecording :: model.filter.videoRecording - - currentFilter = - model.filter - - newFilter = - { currentFilter | videoRecording = videoRecordingFilter } + VideoFilter name slug -> + let + videoRecording = + VideoFilter name slug + in + { currentFilter + | videoRecording = + if List.member videoRecording model.filter.videoRecording then + List.filter (\x -> x /= videoRecording) model.filter.videoRecording + else + videoRecording :: model.filter.videoRecording + } query = filterToQuery newFilter diff --git a/schedule/src/Views/DayView.elm b/schedule/src/Views/DayView.elm index 9745c40d..5721df37 100644 --- a/schedule/src/Views/DayView.elm +++ b/schedule/src/Views/DayView.elm @@ -3,7 +3,7 @@ module Views.DayView exposing (dayView) -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, Day, EventInstance, EventLocation, Route(EventRoute)) +import Models exposing (Model, Day, EventInstance, Route(EventRoute), FilterType(..), getSlugFromFilterType, getNameFromFilterType) import Routing exposing (routeToString) @@ -57,7 +57,7 @@ dayView day model = ] -locationColumns : List EventInstance -> List EventLocation -> Int -> List Date -> Html Msg +locationColumns : List EventInstance -> List FilterType -> Int -> List Date -> Html Msg locationColumns eventInstances eventLocations offset minutes = let columnWidth = @@ -75,11 +75,11 @@ locationColumns eventInstances eventLocations offset minutes = (List.map (\location -> locationColumn columnWidth eventInstances offset minutes location) eventLocations) -locationColumn : Float -> List EventInstance -> Int -> List Date -> EventLocation -> Html Msg +locationColumn : Float -> List EventInstance -> Int -> List Date -> FilterType -> Html Msg locationColumn columnWidth eventInstances offset minutes location = let locationInstances = - List.filter (\instance -> instance.location == location.slug) eventInstances + List.filter (\instance -> instance.location == getSlugFromFilterType location) eventInstances overlappingGroups = List.Extra.groupWhile @@ -101,7 +101,7 @@ locationColumn columnWidth eventInstances offset minutes location = [ ( "location-column-header", True ) ] ] - [ text location.name ] + [ text <| getNameFromFilterType location ] ] ++ (List.map (\x -> diff --git a/schedule/src/Views/FilterView.elm b/schedule/src/Views/FilterView.elm index e6cb5413..cc5698ee 100644 --- a/schedule/src/Views/FilterView.elm +++ b/schedule/src/Views/FilterView.elm @@ -3,7 +3,7 @@ module Views.FilterView exposing (filterSidebar, applyFilters, parseFilterFromQu -- Local modules import Messages exposing (Msg(..)) -import Models exposing (Model, EventInstance, Filter, Day, FilterQuery, Route(OverviewRoute, OverviewFilteredRoute), VideoRecordingFilter, EventType, EventLocation) +import Models exposing (Model, EventInstance, Filter, Day, FilterQuery, Route(OverviewRoute, OverviewFilteredRoute), FilterType(..), unpackFilterType, getSlugFromFilterType) import Routing exposing (routeToString) @@ -15,7 +15,7 @@ import Regex -- External modules import Html exposing (Html, text, div, ul, li, span, i, h4, small) -import Html.Attributes exposing (class, classList) +import Html.Attributes exposing (class, classList, style) import Html.Events exposing (onClick) import Date.Extra exposing (Interval(..), equalBy) @@ -24,7 +24,7 @@ applyFilters : Day -> Model -> List EventInstance applyFilters day model = let slugs default filters = - List.map .slug + List.map getSlugFromFilterType (if List.isEmpty filters then default else @@ -71,44 +71,40 @@ filterSidebar model = "Type" model.eventTypes model.filter.eventTypes - ToggleEventTypeFilter model.eventInstances .eventType , filterView "Location" model.eventLocations model.filter.eventLocations - ToggleEventLocationFilter model.eventInstances .location , filterView "Video" videoRecordingFilters model.filter.videoRecording - ToggleVideoRecordingFilter model.eventInstances .videoState ] ] -videoRecordingFilters : List VideoRecordingFilter +videoRecordingFilters : List FilterType videoRecordingFilters = - [ { name = "Will not be recorded", slug = "not-to-be-recorded" } - , { name = "Will recorded", slug = "to-be-recorded" } - , { name = "Has recording", slug = "has-recording" } + [ VideoFilter "Will not be recorded" "not-to-be-recorded" + , VideoFilter "Will recorded" "to-be-recorded" + , VideoFilter "Has recording" "has-recording" ] filterView : String - -> List { a | name : String, slug : String } - -> List { a | name : String, slug : String } - -> ({ a | name : String, slug : String } -> Msg) + -> List FilterType + -> List FilterType -> List EventInstance -> (EventInstance -> String) -> Html Msg -filterView name possibleFilters currentFilters action eventInstances slugLike = +filterView name possibleFilters currentFilters eventInstances slugLike = div [] [ text (name ++ ":") , ul [] @@ -118,7 +114,6 @@ filterView name possibleFilters currentFilters action eventInstances slugLike = filterChoiceView filter currentFilters - action eventInstances slugLike ) @@ -127,13 +122,12 @@ filterView name possibleFilters currentFilters action eventInstances slugLike = filterChoiceView : - { a | name : String, slug : String } - -> List { a | name : String, slug : String } - -> ({ a | name : String, slug : String } -> Msg) + FilterType + -> List FilterType -> List EventInstance -> (EventInstance -> String) -> Html Msg -filterChoiceView filter currentFilters action eventInstances slugLike = +filterChoiceView filter currentFilters eventInstances slugLike = let active = List.member filter currentFilters @@ -141,35 +135,97 @@ filterChoiceView filter currentFilters action eventInstances slugLike = notActive = not active + ( name, slug ) = + unpackFilterType filter + eventInstanceCount = eventInstances - |> List.filter (\eventInstance -> slugLike eventInstance == filter.slug) + |> List.filter (\eventInstance -> slugLike eventInstance == slug) |> List.length + + buttonStyle = + case filter of + TypeFilter _ _ color lightText -> + [ style + [ ( "backgroundColor", color ) + , ( "color" + , if lightText then + "#fff" + else + "#000" + ) + , ( "border", "1px solid black" ) + , ( "margin-bottom", "2px" ) + ] + ] + + _ -> + [] + + locationIcon = + case filter of + LocationFilter _ _ icon -> + [ i + [ classList + [ ( "fa", True ) + , ( "fa-" ++ icon, True ) + , ( "pull-right", True ) + ] + ] + [] + ] + + _ -> + [] in - li [] + li + [] [ div - [ classList + ([ classList [ ( "btn", True ) , ( "btn-default", True ) , ( "filter-choice-active", active ) ] - , onClick (action filter) - ] + , onClick (ToggleFilter filter) + ] + ++ buttonStyle + ) [ span [] - [ i [ classList [ ( "fa", True ), ( "fa-minus", active ), ( "fa-plus", notActive ) ] ] [] - , text (" " ++ filter.name) - , small [] [ text <| " (" ++ (toString eventInstanceCount) ++ ")" ] - ] + ([ span [ classList [ ( "pull-left", True ) ] ] + [ i + [ classList + [ ( "fa", True ) + , ( "fa-minus", active ) + , ( "fa-plus", notActive ) + ] + ] + [] + , text (" " ++ name) + , small [] [ text <| " (" ++ (toString eventInstanceCount) ++ ")" ] + ] + ] + ++ locationIcon + ) ] ] -findFilter : List { a | slug : String } -> String -> Maybe { a | slug : String } +findFilter : List FilterType -> String -> Maybe FilterType findFilter modelItems filterSlug = - List.head (List.filter (\x -> x.slug == filterSlug) modelItems) + List.head + (List.filter + (\x -> + let + ( _, slug ) = + unpackFilterType x + in + slug == filterSlug + ) + modelItems + ) -getFilter : String -> List { a | slug : String } -> String -> List { a | slug : String } +getFilter : String -> List FilterType -> String -> List FilterType getFilter filterType modelItems query = let filterMatch = @@ -208,7 +264,7 @@ filterToString : Filter -> String filterToString filter = let typePart = - case String.join "," (List.map .slug filter.eventTypes) of + case String.join "," (List.map getSlugFromFilterType filter.eventTypes) of "" -> "" @@ -216,7 +272,7 @@ filterToString filter = "type=" ++ types locationPart = - case String.join "," (List.map .slug filter.eventLocations) of + case String.join "," (List.map getSlugFromFilterType filter.eventLocations) of "" -> "" @@ -224,7 +280,7 @@ filterToString filter = "location=" ++ locations videoPart = - case String.join "," (List.map .slug filter.videoRecording) of + case String.join "," (List.map getSlugFromFilterType filter.videoRecording) of "" -> "" From 08279a479a3d6941702dbfbbd5ab3c9b04d9fbad Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 18:09:00 +0200 Subject: [PATCH 42/54] Latest compiled version with debug. --- src/program/static/js/elm_based_schedule.js | 486 ++++++++++++-------- 1 file changed, 288 insertions(+), 198 deletions(-) diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js index 688d9658..efa26122 100644 --- a/src/program/static/js/elm_based_schedule.js +++ b/src/program/static/js/elm_based_schedule.js @@ -17831,6 +17831,28 @@ var _justinmimbs$elm_date_extra$Date_Extra$equalBy = F3( var _justinmimbs$elm_date_extra$Date_Extra$Second = {ctor: 'Second'}; var _justinmimbs$elm_date_extra$Date_Extra$Millisecond = {ctor: 'Millisecond'}; +var _user$project$Models$unpackFilterType = function (filter) { + var _p0 = filter; + switch (_p0.ctor) { + case 'TypeFilter': + return {ctor: '_Tuple2', _0: _p0._0, _1: _p0._1}; + case 'LocationFilter': + return {ctor: '_Tuple2', _0: _p0._0, _1: _p0._1}; + default: + return {ctor: '_Tuple2', _0: _p0._0, _1: _p0._1}; + } +}; +var _user$project$Models$getSlugFromFilterType = function (filter) { + var _p1 = _user$project$Models$unpackFilterType(filter); + var slug = _p1._1; + return slug; +}; +var _user$project$Models$getNameFromFilterType = function (filter) { + var _p2 = _user$project$Models$unpackFilterType(filter); + var name = _p2._0; + var slug = _p2._1; + return name; +}; var _user$project$Models$Model = function (a) { return function (b) { return function (c) { @@ -17854,14 +17876,6 @@ var _user$project$Models$Model = function (a) { }; }; }; -var _user$project$Models$Filter = F3( - function (a, b, c) { - return {eventTypes: a, eventLocations: b, videoRecording: c}; - }); -var _user$project$Models$VideoRecordingFilter = F2( - function (a, b) { - return {name: a, slug: b}; - }); var _user$project$Models$Day = F3( function (a, b, c) { return {day_name: a, date: b, repr: c}; @@ -17907,18 +17921,14 @@ var _user$project$Models$Event = F7( function (a, b, c, d, e, f, g) { return {title: a, slug: b, $abstract: c, speakerSlugs: d, videoState: e, videoUrl: f, eventType: g}; }); -var _user$project$Models$EventLocation = F3( - function (a, b, c) { - return {name: a, slug: b, icon: c}; - }); -var _user$project$Models$EventType = F4( - function (a, b, c, d) { - return {name: a, slug: b, color: c, lightText: d}; - }); var _user$project$Models$Flags = F5( function (a, b, c, d, e) { return {schedule_timeslot_length_minutes: a, schedule_midnight_offset_hours: b, ics_button_href: c, camp_slug: d, websocket_server: e}; }); +var _user$project$Models$Filter = F3( + function (a, b, c) { + return {eventTypes: a, eventLocations: b, videoRecording: c}; + }); var _user$project$Models$NotFoundRoute = {ctor: 'NotFoundRoute'}; var _user$project$Models$SpeakerRoute = function (a) { return {ctor: 'SpeakerRoute', _0: a}; @@ -17933,6 +17943,18 @@ var _user$project$Models$OverviewFilteredRoute = function (a) { return {ctor: 'OverviewFilteredRoute', _0: a}; }; var _user$project$Models$OverviewRoute = {ctor: 'OverviewRoute'}; +var _user$project$Models$VideoFilter = F2( + function (a, b) { + return {ctor: 'VideoFilter', _0: a, _1: b}; + }); +var _user$project$Models$LocationFilter = F3( + function (a, b, c) { + return {ctor: 'LocationFilter', _0: a, _1: b, _2: c}; + }); +var _user$project$Models$TypeFilter = F4( + function (a, b, c, d) { + return {ctor: 'TypeFilter', _0: a, _1: b, _2: c, _3: d}; + }); var _user$project$Decoders$eventTypeDecoder = A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, @@ -17950,7 +17972,7 @@ var _user$project$Decoders$eventTypeDecoder = A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, 'name', _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$EventType))))); + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$TypeFilter))))); var _user$project$Decoders$eventLocationDecoder = A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, 'icon', @@ -17963,7 +17985,7 @@ var _user$project$Decoders$eventLocationDecoder = A3( _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$required, 'name', _elm_lang$core$Json_Decode$string, - _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$EventLocation)))); + _NoRedInk$elm_decode_pipeline$Json_Decode_Pipeline$decode(_user$project$Models$LocationFilter)))); var _user$project$Decoders$dateDecoder = function () { var unpacked = function (isoString) { return A2( @@ -18245,31 +18267,20 @@ var _user$project$Messages$BackInHistory = {ctor: 'BackInHistory'}; var _user$project$Messages$OnLocationChange = function (a) { return {ctor: 'OnLocationChange', _0: a}; }; -var _user$project$Messages$ToggleVideoRecordingFilter = function (a) { - return {ctor: 'ToggleVideoRecordingFilter', _0: a}; -}; -var _user$project$Messages$ToggleEventLocationFilter = function (a) { - return {ctor: 'ToggleEventLocationFilter', _0: a}; -}; -var _user$project$Messages$ToggleEventTypeFilter = function (a) { - return {ctor: 'ToggleEventTypeFilter', _0: a}; +var _user$project$Messages$ToggleFilter = function (a) { + return {ctor: 'ToggleFilter', _0: a}; }; var _user$project$Messages$WebSocketPayload = function (a) { return {ctor: 'WebSocketPayload', _0: a}; }; var _user$project$Messages$NoOp = {ctor: 'NoOp'}; -var _user$project$Views_FilterView$filterToQuery = function (filter) { +var _user$project$Views_FilterView$filterToString = function (filter) { var videoPart = function () { var _p0 = A2( _elm_lang$core$String$join, ',', - A2( - _elm_lang$core$List$map, - function (_) { - return _.slug; - }, - filter.videoRecording)); + A2(_elm_lang$core$List$map, _user$project$Models$getSlugFromFilterType, filter.videoRecording)); if (_p0 === '') { return ''; } else { @@ -18280,12 +18291,7 @@ var _user$project$Views_FilterView$filterToQuery = function (filter) { var _p1 = A2( _elm_lang$core$String$join, ',', - A2( - _elm_lang$core$List$map, - function (_) { - return _.slug; - }, - filter.eventLocations)); + A2(_elm_lang$core$List$map, _user$project$Models$getSlugFromFilterType, filter.eventLocations)); if (_p1 === '') { return ''; } else { @@ -18296,19 +18302,14 @@ var _user$project$Views_FilterView$filterToQuery = function (filter) { var _p2 = A2( _elm_lang$core$String$join, ',', - A2( - _elm_lang$core$List$map, - function (_) { - return _.slug; - }, - filter.eventTypes)); + A2(_elm_lang$core$List$map, _user$project$Models$getSlugFromFilterType, filter.eventTypes)); if (_p2 === '') { return ''; } else { return A2(_elm_lang$core$Basics_ops['++'], 'type=', _p2); } }(); - var result = A2( + return A2( _elm_lang$core$String$join, '&', A2( @@ -18329,16 +18330,29 @@ var _user$project$Views_FilterView$filterToQuery = function (filter) { } } })); +}; +var _user$project$Views_FilterView$filterToQuery = function (filter) { + var result = _user$project$Views_FilterView$filterToString(filter); return _user$project$Routing$routeToString( _user$project$Models$OverviewFilteredRoute(result)); }; +var _user$project$Views_FilterView$maybeFilteredOverviewRoute = function (model) { + var _p3 = _user$project$Views_FilterView$filterToString(model.filter); + if (_p3 === '') { + return _user$project$Models$OverviewRoute; + } else { + return _user$project$Models$OverviewFilteredRoute(_p3); + } +}; var _user$project$Views_FilterView$findFilter = F2( function (modelItems, filterSlug) { return _elm_lang$core$List$head( A2( _elm_lang$core$List$filter, function (x) { - return _elm_lang$core$Native_Utils.eq(x.slug, filterSlug); + var _p4 = _user$project$Models$unpackFilterType(x); + var slug = _p4._1; + return _elm_lang$core$Native_Utils.eq(slug, filterSlug); }, modelItems)); }); @@ -18370,15 +18384,87 @@ var _user$project$Views_FilterView$getFilter = F3( }, filterSlugs); }); -var _user$project$Views_FilterView$filterChoiceView = F5( - function (filter, currentFilters, action, eventInstances, slugLike) { +var _user$project$Views_FilterView$filterChoiceView = F4( + function (filter, currentFilters, eventInstances, slugLike) { + var locationIcon = function () { + var _p5 = filter; + if (_p5.ctor === 'LocationFilter') { + return { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: A2(_elm_lang$core$Basics_ops['++'], 'fa-', _p5._2), + _1: true + }, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: {ctor: '[]'} + }; + } else { + return {ctor: '[]'}; + } + }(); + var buttonStyle = function () { + var _p6 = filter; + if (_p6.ctor === 'TypeFilter') { + return { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$style( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'backgroundColor', _1: _p6._2}, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: 'color', + _1: _p6._3 ? '#fff' : '#000' + }, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'border', _1: '1px solid black'}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'margin-bottom', _1: '2px'}, + _1: {ctor: '[]'} + } + } + } + }), + _1: {ctor: '[]'} + }; + } else { + return {ctor: '[]'}; + } + }(); + var _p7 = _user$project$Models$unpackFilterType(filter); + var name = _p7._0; + var slug = _p7._1; var eventInstanceCount = _elm_lang$core$List$length( A2( _elm_lang$core$List$filter, function (eventInstance) { return _elm_lang$core$Native_Utils.eq( slugLike(eventInstance), - filter.slug); + slug); }, eventInstances)); var active = A2(_elm_lang$core$List$member, filter, currentFilters); @@ -18390,89 +18476,111 @@ var _user$project$Views_FilterView$filterChoiceView = F5( ctor: '::', _0: A2( _elm_lang$html$Html$div, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, - _1: { + A2( + _elm_lang$core$Basics_ops['++'], + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { ctor: '::', - _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true}, + _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, _1: { ctor: '::', - _0: {ctor: '_Tuple2', _0: 'filter-choice-active', _1: active}, - _1: {ctor: '[]'} + _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'filter-choice-active', _1: active}, + _1: {ctor: '[]'} + } } - } - }), - _1: { - ctor: '::', - _0: _elm_lang$html$Html_Events$onClick( - action(filter)), - _1: {ctor: '[]'} - } - }, + }), + _1: { + ctor: '::', + _0: _elm_lang$html$Html_Events$onClick( + _user$project$Messages$ToggleFilter(filter)), + _1: {ctor: '[]'} + } + }, + buttonStyle), { ctor: '::', _0: A2( _elm_lang$html$Html$span, {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$html$Html$i, - { - ctor: '::', - _0: _elm_lang$html$Html_Attributes$classList( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa-minus', _1: active}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'fa-plus', _1: notActive}, - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - }, - {ctor: '[]'}), - _1: { + A2( + _elm_lang$core$Basics_ops['++'], + { ctor: '::', - _0: _elm_lang$html$Html$text( - A2(_elm_lang$core$Basics_ops['++'], ' ', filter.name)), - _1: { - ctor: '::', - _0: A2( - _elm_lang$html$Html$small, - {ctor: '[]'}, - { + _0: A2( + _elm_lang$html$Html$span, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'pull-left', _1: true}, + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-minus', _1: active}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-plus', _1: notActive}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: { ctor: '::', _0: _elm_lang$html$Html$text( - A2( - _elm_lang$core$Basics_ops['++'], - ' (', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(eventInstanceCount), - ')'))), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - } - }), + A2(_elm_lang$core$Basics_ops['++'], ' ', name)), + _1: { + ctor: '::', + _0: A2( + _elm_lang$html$Html$small, + {ctor: '[]'}, + { + ctor: '::', + _0: _elm_lang$html$Html$text( + A2( + _elm_lang$core$Basics_ops['++'], + ' (', + A2( + _elm_lang$core$Basics_ops['++'], + _elm_lang$core$Basics$toString(eventInstanceCount), + ')'))), + _1: {ctor: '[]'} + }), + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + locationIcon)), _1: {ctor: '[]'} }), _1: {ctor: '[]'} }); }); -var _user$project$Views_FilterView$filterView = F6( - function (name, possibleFilters, currentFilters, action, eventInstances, slugLike) { +var _user$project$Views_FilterView$filterView = F5( + function (name, possibleFilters, currentFilters, eventInstances, slugLike) { return A2( _elm_lang$html$Html$div, {ctor: '[]'}, @@ -18488,7 +18596,7 @@ var _user$project$Views_FilterView$filterView = F6( A2( _elm_lang$core$List$map, function (filter) { - return A5(_user$project$Views_FilterView$filterChoiceView, filter, currentFilters, action, eventInstances, slugLike); + return A4(_user$project$Views_FilterView$filterChoiceView, filter, currentFilters, eventInstances, slugLike); }, possibleFilters)), _1: {ctor: '[]'} @@ -18497,13 +18605,13 @@ var _user$project$Views_FilterView$filterView = F6( }); var _user$project$Views_FilterView$videoRecordingFilters = { ctor: '::', - _0: {name: 'Will not be recorded', slug: 'not-to-be-recorded'}, + _0: A2(_user$project$Models$VideoFilter, 'Will not be recorded', 'not-to-be-recorded'), _1: { ctor: '::', - _0: {name: 'Will recorded', slug: 'to-be-recorded'}, + _0: A2(_user$project$Models$VideoFilter, 'Will recorded', 'to-be-recorded'), _1: { ctor: '::', - _0: {name: 'Has recording', slug: 'has-recording'}, + _0: A2(_user$project$Models$VideoFilter, 'Has recording', 'has-recording'), _1: {ctor: '[]'} } } @@ -18565,36 +18673,33 @@ var _user$project$Views_FilterView$filterSidebar = function (model) { }, { ctor: '::', - _0: A6( + _0: A5( _user$project$Views_FilterView$filterView, 'Type', model.eventTypes, model.filter.eventTypes, - _user$project$Messages$ToggleEventTypeFilter, model.eventInstances, function (_) { return _.eventType; }), _1: { ctor: '::', - _0: A6( + _0: A5( _user$project$Views_FilterView$filterView, 'Location', model.eventLocations, model.filter.eventLocations, - _user$project$Messages$ToggleEventLocationFilter, model.eventInstances, function (_) { return _.location; }), _1: { ctor: '::', - _0: A6( + _0: A5( _user$project$Views_FilterView$filterView, 'Video', _user$project$Views_FilterView$videoRecordingFilters, model.filter.videoRecording, - _user$project$Messages$ToggleVideoRecordingFilter, model.eventInstances, function (_) { return _.videoState; @@ -18613,9 +18718,7 @@ var _user$project$Views_FilterView$applyFilters = F2( function ($default, filters) { return A2( _elm_lang$core$List$map, - function (_) { - return _.slug; - }, + _user$project$Models$getSlugFromFilterType, _elm_lang$core$List$isEmpty(filters) ? $default : filters); }); var types = A2(slugs, model.eventTypes, model.filter.eventTypes); @@ -18665,66 +18768,49 @@ var _user$project$Update$update = F2( _elm_lang$core$Platform_Cmd_ops['!'], newModel_, {ctor: '[]'}); - case 'ToggleEventTypeFilter': - var _p6 = _p0._0; + case 'ToggleFilter': var currentFilter = model.filter; - var eventTypesFilter = A2(_elm_lang$core$List$member, _p6, model.filter.eventTypes) ? A2( - _elm_lang$core$List$filter, - function (x) { - return !_elm_lang$core$Native_Utils.eq(x, _p6); - }, - model.filter.eventTypes) : {ctor: '::', _0: _p6, _1: model.filter.eventTypes}; - var newFilter = _elm_lang$core$Native_Utils.update( - currentFilter, - {eventTypes: eventTypesFilter}); - var query = _user$project$Views_FilterView$filterToQuery(newFilter); - var cmd = _elm_lang$navigation$Navigation$newUrl(query); - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {filter: newFilter}), - { - ctor: '::', - _0: cmd, - _1: {ctor: '[]'} - }); - case 'ToggleEventLocationFilter': - var _p7 = _p0._0; - var currentFilter = model.filter; - var eventLocationsFilter = A2(_elm_lang$core$List$member, _p7, model.filter.eventLocations) ? A2( - _elm_lang$core$List$filter, - function (x) { - return !_elm_lang$core$Native_Utils.eq(x, _p7); - }, - model.filter.eventLocations) : {ctor: '::', _0: _p7, _1: model.filter.eventLocations}; - var newFilter = _elm_lang$core$Native_Utils.update( - currentFilter, - {eventLocations: eventLocationsFilter}); - var query = _user$project$Views_FilterView$filterToQuery(newFilter); - var cmd = _elm_lang$navigation$Navigation$newUrl(query); - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {filter: newFilter}), - { - ctor: '::', - _0: cmd, - _1: {ctor: '[]'} - }); - case 'ToggleVideoRecordingFilter': - var _p8 = _p0._0; - var currentFilter = model.filter; - var videoRecordingFilter = A2(_elm_lang$core$List$member, _p8, model.filter.videoRecording) ? A2( - _elm_lang$core$List$filter, - function (x) { - return !_elm_lang$core$Native_Utils.eq(x, _p8); - }, - model.filter.videoRecording) : {ctor: '::', _0: _p8, _1: model.filter.videoRecording}; - var newFilter = _elm_lang$core$Native_Utils.update( - currentFilter, - {videoRecording: videoRecordingFilter}); + var newFilter = function () { + var _p6 = _p0._0; + switch (_p6.ctor) { + case 'TypeFilter': + var eventType = A4(_user$project$Models$TypeFilter, _p6._0, _p6._1, _p6._2, _p6._3); + return _elm_lang$core$Native_Utils.update( + currentFilter, + { + eventTypes: A2(_elm_lang$core$List$member, eventType, model.filter.eventTypes) ? A2( + _elm_lang$core$List$filter, + function (x) { + return !_elm_lang$core$Native_Utils.eq(x, eventType); + }, + model.filter.eventTypes) : {ctor: '::', _0: eventType, _1: model.filter.eventTypes} + }); + case 'LocationFilter': + var eventLocation = A3(_user$project$Models$LocationFilter, _p6._0, _p6._1, _p6._2); + return _elm_lang$core$Native_Utils.update( + currentFilter, + { + eventLocations: A2(_elm_lang$core$List$member, eventLocation, model.filter.eventLocations) ? A2( + _elm_lang$core$List$filter, + function (x) { + return !_elm_lang$core$Native_Utils.eq(x, eventLocation); + }, + model.filter.eventLocations) : {ctor: '::', _0: eventLocation, _1: model.filter.eventLocations} + }); + default: + var videoRecording = A2(_user$project$Models$VideoFilter, _p6._0, _p6._1); + return _elm_lang$core$Native_Utils.update( + currentFilter, + { + videoRecording: A2(_elm_lang$core$List$member, videoRecording, model.filter.videoRecording) ? A2( + _elm_lang$core$List$filter, + function (x) { + return !_elm_lang$core$Native_Utils.eq(x, videoRecording); + }, + model.filter.videoRecording) : {ctor: '::', _0: videoRecording, _1: model.filter.videoRecording} + }); + } + }(); var query = _user$project$Views_FilterView$filterToQuery(newFilter); var cmd = _elm_lang$navigation$Navigation$newUrl(query); return A2( @@ -18738,12 +18824,12 @@ var _user$project$Update$update = F2( _1: {ctor: '[]'} }); case 'OnLocationChange': - var _p10 = _p0._0; - var newRoute = _user$project$Routing$parseLocation(_p10); + var _p8 = _p0._0; + var newRoute = _user$project$Routing$parseLocation(_p8); var newFilter = function () { - var _p9 = newRoute; - if (_p9.ctor === 'OverviewFilteredRoute') { - return A2(_user$project$Views_FilterView$parseFilterFromQuery, _p9._0, model); + var _p7 = newRoute; + if (_p7.ctor === 'OverviewFilteredRoute') { + return A2(_user$project$Views_FilterView$parseFilterFromQuery, _p7._0, model); } else { return model.filter; } @@ -18752,7 +18838,7 @@ var _user$project$Update$update = F2( _elm_lang$core$Platform_Cmd_ops['!'], _elm_lang$core$Native_Utils.update( model, - {filter: newFilter, route: newRoute, location: _p10}), + {filter: newFilter, route: newRoute, location: _p8}), {ctor: '[]'}); default: return A2( @@ -18912,7 +18998,8 @@ var _user$project$Views_DayPicker$dayPicker = function (model) { _1: { ctor: '::', _0: _elm_lang$html$Html_Attributes$href( - _user$project$Routing$routeToString(_user$project$Models$OverviewRoute)), + _user$project$Routing$routeToString( + _user$project$Views_FilterView$maybeFilteredOverviewRoute(model))), _1: {ctor: '[]'} } }, @@ -19140,7 +19227,9 @@ var _user$project$Views_DayView$locationColumn = F5( var locationInstances = A2( _elm_lang$core$List$filter, function (instance) { - return _elm_lang$core$Native_Utils.eq(instance.location, location.slug); + return _elm_lang$core$Native_Utils.eq( + instance.location, + _user$project$Models$getSlugFromFilterType(location)); }, eventInstances); var overlappingGroups = A2( @@ -19209,7 +19298,8 @@ var _user$project$Views_DayView$locationColumn = F5( }, { ctor: '::', - _0: _elm_lang$html$Html$text(location.name), + _0: _elm_lang$html$Html$text( + _user$project$Models$getNameFromFilterType(location)), _1: {ctor: '[]'} }), _1: {ctor: '[]'} @@ -20473,7 +20563,7 @@ var _user$project$Main$main = A2( var Elm = {}; Elm['Main'] = Elm['Main'] || {}; if (typeof _user$project$Main$main !== 'undefined') { - _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Messages.Msg":{"args":[],"tags":{"OnLocationChange":["Navigation.Location"],"WebSocketPayload":["String"],"ToggleEventLocationFilter":["Models.EventLocation"],"NoOp":[],"ToggleVideoRecordingFilter":["Models.VideoRecordingFilter"],"ToggleEventTypeFilter":["Models.EventType"],"BackInHistory":[]}}},"aliases":{"Models.EventLocation":{"args":[],"type":"{ name : String, slug : String, icon : String }"},"Models.EventType":{"args":[],"type":"{ name : String, slug : String, color : String, lightText : Bool }"},"Models.VideoRecordingFilter":{"args":[],"type":"{ name : String, slug : String }"},"Navigation.Location":{"args":[],"type":"{ href : String , host : String , hostname : String , protocol : String , origin : String , port_ : String , pathname : String , search : String , hash : String , username : String , password : String }"}},"message":"Messages.Msg"},"versions":{"elm":"0.18.0"}}); + _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Messages.Msg":{"args":[],"tags":{"OnLocationChange":["Navigation.Location"],"ToggleFilter":["Models.FilterType"],"WebSocketPayload":["String"],"NoOp":[],"BackInHistory":[]}},"Models.FilterType":{"args":[],"tags":{"TypeFilter":["Models.FilterName","Models.FilterSlug","Models.TypeColor","Models.TypeLightText"],"LocationFilter":["Models.FilterName","Models.FilterSlug","Models.LocationIcon"],"VideoFilter":["Models.FilterName","Models.FilterSlug"]}}},"aliases":{"Models.LocationIcon":{"args":[],"type":"String"},"Models.FilterName":{"args":[],"type":"String"},"Models.TypeColor":{"args":[],"type":"String"},"Models.FilterSlug":{"args":[],"type":"String"},"Navigation.Location":{"args":[],"type":"{ href : String , host : String , hostname : String , protocol : String , origin : String , port_ : String , pathname : String , search : String , hash : String , username : String , password : String }"},"Models.TypeLightText":{"args":[],"type":"Bool"}},"message":"Messages.Msg"},"versions":{"elm":"0.18.0"}}); } if (typeof define === "function" && define['amd']) From 9659871a3f248b5dbd8568d3b02c086a9669dbc4 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 19:16:18 +0200 Subject: [PATCH 43/54] Fix filter sidebar style. --- src/static_src/css/bornhack.css | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/static_src/css/bornhack.css b/src/static_src/css/bornhack.css index c9241aba..48ee6176 100644 --- a/src/static_src/css/bornhack.css +++ b/src/static_src/css/bornhack.css @@ -157,8 +157,7 @@ footer { .event-in-overview { min-height: 100px; margin: 5px; - width: 220px; - max-width: 225px; + max-width: 200px; min-width: 200px; } @@ -220,12 +219,6 @@ footer { .schedule-filter ul { list-style: none; padding: 0; - display: flex; - flex-wrap: wrap; -} - -.schedule-filter ul li { - flex: 1; } .schedule-filter .btn { From f5b5db70aeda6e7cd80c92eb770723324542e242 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 19:39:30 +0200 Subject: [PATCH 44/54] Add icons for video filters. --- schedule/src/Views/FilterView.elm | 34 ++++++++++++++++++++++++- schedule/src/Views/ScheduleOverview.elm | 6 +++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/schedule/src/Views/FilterView.elm b/schedule/src/Views/FilterView.elm index cc5698ee..333b7621 100644 --- a/schedule/src/Views/FilterView.elm +++ b/schedule/src/Views/FilterView.elm @@ -92,7 +92,7 @@ filterSidebar model = videoRecordingFilters : List FilterType videoRecordingFilters = [ VideoFilter "Will not be recorded" "not-to-be-recorded" - , VideoFilter "Will recorded" "to-be-recorded" + , VideoFilter "Will be recorded" "to-be-recorded" , VideoFilter "Has recording" "has-recording" ] @@ -177,6 +177,37 @@ filterChoiceView filter currentFilters eventInstances slugLike = _ -> [] + + videoIcon = + case filter of + VideoFilter _ slug -> + let + icon = + case slug of + "has-recording" -> + "film" + + "to-be-recorded" -> + "video-camera" + + "not-to-be-recorded" -> + "ban" + + _ -> + "" + in + [ i + [ classList + [ ( "fa", True ) + , ( "fa-" ++ icon, True ) + , ( "pull-right", True ) + ] + ] + [] + ] + + _ -> + [] in li [] @@ -205,6 +236,7 @@ filterChoiceView filter currentFilters eventInstances slugLike = ] ] ++ locationIcon + ++ videoIcon ) ] ] diff --git a/schedule/src/Views/ScheduleOverview.elm b/schedule/src/Views/ScheduleOverview.elm index c1d7206b..8e1f7fe9 100644 --- a/schedule/src/Views/ScheduleOverview.elm +++ b/schedule/src/Views/ScheduleOverview.elm @@ -90,6 +90,12 @@ dayEventInstanceIcons eventInstance = [] ] + "not-to-be-recorded" -> + [ i + [ classList [ ( "fa", True ), ( "fa-ban", True ), ( "pull-right", True ) ] ] + [] + ] + _ -> [] in From 25eb491f24cc01b9da06a28dccb7ddf7d146a8d8 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 19:42:20 +0200 Subject: [PATCH 45/54] Adding compiled version without debug. --- src/program/static/js/elm_based_schedule.js | 4060 +------------------ 1 file changed, 88 insertions(+), 3972 deletions(-) diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js index efa26122..7971e41d 100644 --- a/src/program/static/js/elm_based_schedule.js +++ b/src/program/static/js/elm_based_schedule.js @@ -9863,3965 +9863,6 @@ return { }(); -var _elm_lang$virtual_dom$Native_Debug = function() { - - -// IMPORT / EXPORT - -function unsafeCoerce(value) -{ - return value; -} - -var upload = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) -{ - var element = document.createElement('input'); - element.setAttribute('type', 'file'); - element.setAttribute('accept', 'text/json'); - element.style.display = 'none'; - element.addEventListener('change', function(event) - { - var fileReader = new FileReader(); - fileReader.onload = function(e) - { - callback(_elm_lang$core$Native_Scheduler.succeed(e.target.result)); - }; - fileReader.readAsText(event.target.files[0]); - document.body.removeChild(element); - }); - document.body.appendChild(element); - element.click(); -}); - -function download(historyLength, json) -{ - return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) - { - var fileName = 'history-' + historyLength + '.txt'; - var jsonString = JSON.stringify(json); - var mime = 'text/plain;charset=utf-8'; - var done = _elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0); - - // for IE10+ - if (navigator.msSaveBlob) - { - navigator.msSaveBlob(new Blob([jsonString], {type: mime}), fileName); - return callback(done); - } - - // for HTML5 - var element = document.createElement('a'); - element.setAttribute('href', 'data:' + mime + ',' + encodeURIComponent(jsonString)); - element.setAttribute('download', fileName); - element.style.display = 'none'; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); - callback(done); - }); -} - - -// POPOUT - -function messageToString(value) -{ - switch (typeof value) - { - case 'boolean': - return value ? 'True' : 'False'; - case 'number': - return value + ''; - case 'string': - return '"' + addSlashes(value, false) + '"'; - } - if (value instanceof String) - { - return '\'' + addSlashes(value, true) + '\''; - } - if (typeof value !== 'object' || value === null || !('ctor' in value)) - { - return '…'; - } - - var ctorStarter = value.ctor.substring(0, 5); - if (ctorStarter === '_Tupl' || ctorStarter === '_Task') - { - return '…' - } - if (['_Array', '', '_Process', '::', '[]', 'Set_elm_builtin', 'RBNode_elm_builtin', 'RBEmpty_elm_builtin'].indexOf(value.ctor) >= 0) - { - return '…'; - } - - var keys = Object.keys(value); - switch (keys.length) - { - case 1: - return value.ctor; - case 2: - return value.ctor + ' ' + messageToString(value._0); - default: - return value.ctor + ' … ' + messageToString(value[keys[keys.length - 1]]); - } -} - - -function primitive(str) -{ - return { ctor: 'Primitive', _0: str }; -} - - -function init(value) -{ - var type = typeof value; - - if (type === 'boolean') - { - return { - ctor: 'Constructor', - _0: _elm_lang$core$Maybe$Just(value ? 'True' : 'False'), - _1: true, - _2: _elm_lang$core$Native_List.Nil - }; - } - - if (type === 'number') - { - return primitive(value + ''); - } - - if (type === 'string') - { - return { ctor: 'S', _0: '"' + addSlashes(value, false) + '"' }; - } - - if (value instanceof String) - { - return { ctor: 'S', _0: "'" + addSlashes(value, true) + "'" }; - } - - if (value instanceof Date) - { - return primitive('<' + value.toString() + '>'); - } - - if (value === null) - { - return primitive('XXX'); - } - - if (type === 'object' && 'ctor' in value) - { - var ctor = value.ctor; - - if (ctor === '::' || ctor === '[]') - { - return { - ctor: 'Sequence', - _0: {ctor: 'ListSeq'}, - _1: true, - _2: A2(_elm_lang$core$List$map, init, value) - }; - } - - if (ctor === 'Set_elm_builtin') - { - return { - ctor: 'Sequence', - _0: {ctor: 'SetSeq'}, - _1: true, - _2: A3(_elm_lang$core$Set$foldr, initCons, _elm_lang$core$Native_List.Nil, value) - }; - } - - if (ctor === 'RBNode_elm_builtin' || ctor == 'RBEmpty_elm_builtin') - { - return { - ctor: 'Dictionary', - _0: true, - _1: A3(_elm_lang$core$Dict$foldr, initKeyValueCons, _elm_lang$core$Native_List.Nil, value) - }; - } - - if (ctor === '_Array') - { - return { - ctor: 'Sequence', - _0: {ctor: 'ArraySeq'}, - _1: true, - _2: A3(_elm_lang$core$Array$foldr, initCons, _elm_lang$core$Native_List.Nil, value) - }; - } - - var ctorStarter = value.ctor.substring(0, 5); - if (ctorStarter === '_Task') - { - return primitive(''); - } - - if (ctor === '') - { - return primitive(ctor); - } - - if (ctor === '_Process') - { - return primitive(''); - } - - var list = _elm_lang$core$Native_List.Nil; - for (var i in value) - { - if (i === 'ctor') continue; - list = _elm_lang$core$Native_List.Cons(init(value[i]), list); - } - return { - ctor: 'Constructor', - _0: ctorStarter === '_Tupl' ? _elm_lang$core$Maybe$Nothing : _elm_lang$core$Maybe$Just(ctor), - _1: true, - _2: _elm_lang$core$List$reverse(list) - }; - } - - if (type === 'object') - { - var dict = _elm_lang$core$Dict$empty; - for (var i in value) - { - dict = A3(_elm_lang$core$Dict$insert, i, init(value[i]), dict); - } - return { ctor: 'Record', _0: true, _1: dict }; - } - - return primitive('XXX'); -} - -var initCons = F2(initConsHelp); - -function initConsHelp(value, list) -{ - return _elm_lang$core$Native_List.Cons(init(value), list); -} - -var initKeyValueCons = F3(initKeyValueConsHelp); - -function initKeyValueConsHelp(key, value, list) -{ - return _elm_lang$core$Native_List.Cons( - _elm_lang$core$Native_Utils.Tuple2(init(key), init(value)), - list - ); -} - -function addSlashes(str, isChar) -{ - var s = str.replace(/\\/g, '\\\\') - .replace(/\n/g, '\\n') - .replace(/\t/g, '\\t') - .replace(/\r/g, '\\r') - .replace(/\v/g, '\\v') - .replace(/\0/g, '\\0'); - if (isChar) - { - return s.replace(/\'/g, '\\\''); - } - else - { - return s.replace(/\"/g, '\\"'); - } -} - - -return { - upload: upload, - download: F2(download), - unsafeCoerce: unsafeCoerce, - messageToString: messageToString, - init: init -} - -}(); - -var _elm_lang$virtual_dom$VirtualDom_Helpers$keyedNode = _elm_lang$virtual_dom$Native_VirtualDom.keyedNode; -var _elm_lang$virtual_dom$VirtualDom_Helpers$lazy3 = _elm_lang$virtual_dom$Native_VirtualDom.lazy3; -var _elm_lang$virtual_dom$VirtualDom_Helpers$lazy2 = _elm_lang$virtual_dom$Native_VirtualDom.lazy2; -var _elm_lang$virtual_dom$VirtualDom_Helpers$lazy = _elm_lang$virtual_dom$Native_VirtualDom.lazy; -var _elm_lang$virtual_dom$VirtualDom_Helpers$defaultOptions = {stopPropagation: false, preventDefault: false}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$onWithOptions = _elm_lang$virtual_dom$Native_VirtualDom.on; -var _elm_lang$virtual_dom$VirtualDom_Helpers$on = F2( - function (eventName, decoder) { - return A3(_elm_lang$virtual_dom$VirtualDom_Helpers$onWithOptions, eventName, _elm_lang$virtual_dom$VirtualDom_Helpers$defaultOptions, decoder); - }); -var _elm_lang$virtual_dom$VirtualDom_Helpers$onClick = function (msg) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$on, - 'click', - _elm_lang$core$Json_Decode$succeed(msg)); -}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$style = _elm_lang$virtual_dom$Native_VirtualDom.style; -var _elm_lang$virtual_dom$VirtualDom_Helpers$attribute = _elm_lang$virtual_dom$Native_VirtualDom.attribute; -var _elm_lang$virtual_dom$VirtualDom_Helpers$id = _elm_lang$virtual_dom$VirtualDom_Helpers$attribute('id'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$property = _elm_lang$virtual_dom$Native_VirtualDom.property; -var _elm_lang$virtual_dom$VirtualDom_Helpers$class = function (name) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$property, - 'className', - _elm_lang$core$Json_Encode$string(name)); -}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$href = function (name) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$property, - 'href', - _elm_lang$core$Json_Encode$string(name)); -}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$map = _elm_lang$virtual_dom$Native_VirtualDom.map; -var _elm_lang$virtual_dom$VirtualDom_Helpers$text = _elm_lang$virtual_dom$Native_VirtualDom.text; -var _elm_lang$virtual_dom$VirtualDom_Helpers$node = _elm_lang$virtual_dom$Native_VirtualDom.node; -var _elm_lang$virtual_dom$VirtualDom_Helpers$div = _elm_lang$virtual_dom$VirtualDom_Helpers$node('div'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$span = _elm_lang$virtual_dom$VirtualDom_Helpers$node('span'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$a = _elm_lang$virtual_dom$VirtualDom_Helpers$node('a'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$h1 = _elm_lang$virtual_dom$VirtualDom_Helpers$node('h1'); -var _elm_lang$virtual_dom$VirtualDom_Helpers$Options = F2( - function (a, b) { - return {stopPropagation: a, preventDefault: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Helpers$Node = {ctor: 'Node'}; -var _elm_lang$virtual_dom$VirtualDom_Helpers$Property = {ctor: 'Property'}; - -var _elm_lang$virtual_dom$VirtualDom_Expando$purple = _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'color', _1: 'rgb(136, 19, 145)'}, - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$blue = _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'color', _1: 'rgb(28, 0, 207)'}, - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$red = _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'color', _1: 'rgb(196, 26, 22)'}, - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$leftPad = function (maybeKey) { - var _p0 = maybeKey; - if (_p0.ctor === 'Nothing') { - return _elm_lang$virtual_dom$VirtualDom_Helpers$style( - {ctor: '[]'}); - } else { - return _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'padding-left', _1: '4ch'}, - _1: {ctor: '[]'} - }); - } -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow = function (arrow) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'color', _1: '#777'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'padding-left', _1: '2ch'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'width', _1: '2ch'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'display', _1: 'inline-block'}, - _1: {ctor: '[]'} - } - } - } - }), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(arrow), - _1: {ctor: '[]'} - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter = F3( - function (maybeKey, maybeIsClosed, description) { - var arrow = function () { - var _p1 = maybeIsClosed; - if (_p1.ctor === 'Nothing') { - return _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow(''); - } else { - if (_p1._0 === true) { - return _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow('▸'); - } else { - return _elm_lang$virtual_dom$VirtualDom_Expando$makeArrow('▾'); - } - } - }(); - var _p2 = maybeKey; - if (_p2.ctor === 'Nothing') { - return {ctor: '::', _0: arrow, _1: description}; - } else { - return { - ctor: '::', - _0: arrow, - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$purple, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p2._0), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' = '), - _1: description - } - } - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTinyRecord = F3( - function (length, starter, entries) { - var _p3 = entries; - if (_p3.ctor === '[]') { - return { - ctor: '_Tuple2', - _0: length + 1, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('}'), - _1: {ctor: '[]'} - } - }; - } else { - var _p5 = _p3._0; - var nextLength = (length + _elm_lang$core$String$length(_p5)) + 1; - if (_elm_lang$core$Native_Utils.cmp(nextLength, 18) > 0) { - return { - ctor: '_Tuple2', - _0: length + 2, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('…}'), - _1: {ctor: '[]'} - } - }; - } else { - var _p4 = A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTinyRecord, nextLength, ',', _p3._1); - var finalLength = _p4._0; - var otherNodes = _p4._1; - return { - ctor: '_Tuple2', - _0: finalLength, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$purple, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p5), - _1: {ctor: '[]'} - }), - _1: otherNodes - } - } - }; - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$elideMiddle = function (str) { - return (_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$String$length(str), - 18) < 1) ? str : A2( - _elm_lang$core$Basics_ops['++'], - A2(_elm_lang$core$String$left, 8, str), - A2( - _elm_lang$core$Basics_ops['++'], - '...', - A2(_elm_lang$core$String$right, 8, str))); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp = function (str) { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$String$length(str), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(str), - _1: {ctor: '[]'} - } - }; -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex = F3( - function (n, func, list) { - var _p6 = list; - if (_p6.ctor === '[]') { - return {ctor: '[]'}; - } else { - var _p8 = _p6._1; - var _p7 = _p6._0; - return (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) ? { - ctor: '::', - _0: func(_p7), - _1: _p8 - } : { - ctor: '::', - _0: _p7, - _1: A3(_elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, n - 1, func, _p8) - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$seqTypeToString = F2( - function (n, seqType) { - var _p9 = seqType; - switch (_p9.ctor) { - case 'ListSeq': - return A2( - _elm_lang$core$Basics_ops['++'], - 'List(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(n), - ')')); - case 'SetSeq': - return A2( - _elm_lang$core$Basics_ops['++'], - 'Set(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(n), - ')')); - default: - return A2( - _elm_lang$core$Basics_ops['++'], - 'Array(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(n), - ')')); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewTiny = function (value) { - var _p10 = value; - switch (_p10.ctor) { - case 'S': - var str = _elm_lang$virtual_dom$VirtualDom_Expando$elideMiddle(_p10._0); - return { - ctor: '_Tuple2', - _0: _elm_lang$core$String$length(str), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$red, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(str), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }; - case 'Primitive': - var _p11 = _p10._0; - return { - ctor: '_Tuple2', - _0: _elm_lang$core$String$length(_p11), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$blue, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p11), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }; - case 'Sequence': - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$seqTypeToString, - _elm_lang$core$List$length(_p10._2), - _p10._0)); - case 'Dictionary': - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( - A2( - _elm_lang$core$Basics_ops['++'], - 'Dict(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString( - _elm_lang$core$List$length(_p10._1)), - ')'))); - case 'Record': - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecord(_p10._1); - default: - if (_p10._2.ctor === '[]') { - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( - A2(_elm_lang$core$Maybe$withDefault, 'Unit', _p10._0)); - } else { - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyHelp( - function () { - var _p12 = _p10._0; - if (_p12.ctor === 'Nothing') { - return A2( - _elm_lang$core$Basics_ops['++'], - 'Tuple(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString( - _elm_lang$core$List$length(_p10._2)), - ')')); - } else { - return A2(_elm_lang$core$Basics_ops['++'], _p12._0, ' …'); - } - }()); - } - } -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecord = function (record) { - return _elm_lang$core$Dict$isEmpty(record) ? { - ctor: '_Tuple2', - _0: 2, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('{}'), - _1: {ctor: '[]'} - } - } : A3( - _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecordHelp, - 0, - '{ ', - _elm_lang$core$Dict$toList(record)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecordHelp = F3( - function (length, starter, entries) { - var _p13 = entries; - if (_p13.ctor === '[]') { - return { - ctor: '_Tuple2', - _0: length + 2, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' }'), - _1: {ctor: '[]'} - } - }; - } else { - var _p16 = _p13._0._0; - var _p14 = _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTiny(_p13._0._1); - var valueLen = _p14._0; - var valueNodes = _p14._1; - var fieldLen = _elm_lang$core$String$length(_p16); - var newLength = ((length + fieldLen) + valueLen) + 5; - if (_elm_lang$core$Native_Utils.cmp(newLength, 60) > 0) { - return { - ctor: '_Tuple2', - _0: length + 4, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', … }'), - _1: {ctor: '[]'} - } - }; - } else { - var _p15 = A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecordHelp, newLength, ', ', _p13._1); - var finalLength = _p15._0; - var otherNodes = _p15._1; - return { - ctor: '_Tuple2', - _0: finalLength, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$purple, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p16), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' = '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - valueNodes), - _1: otherNodes - } - } - } - } - }; - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTiny = function (value) { - var _p17 = value; - if (_p17.ctor === 'Record') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTinyRecord, - 0, - '{', - _elm_lang$core$Dict$keys(_p17._1)); - } else { - return _elm_lang$virtual_dom$VirtualDom_Expando$viewTiny(value); - } -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$Constructor = F3( - function (a, b, c) { - return {ctor: 'Constructor', _0: a, _1: b, _2: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Record = F2( - function (a, b) { - return {ctor: 'Record', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary = F2( - function (a, b) { - return {ctor: 'Dictionary', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Sequence = F3( - function (a, b, c) { - return {ctor: 'Sequence', _0: a, _1: b, _2: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$initHelp = F2( - function (isOuter, expando) { - var _p18 = expando; - switch (_p18.ctor) { - case 'S': - return expando; - case 'Primitive': - return expando; - case 'Sequence': - var _p20 = _p18._0; - var _p19 = _p18._2; - return isOuter ? A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Sequence, - _p20, - false, - A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_Expando$initHelp(false), - _p19)) : ((_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$List$length(_p19), - 8) < 1) ? A3(_elm_lang$virtual_dom$VirtualDom_Expando$Sequence, _p20, false, _p19) : expando); - case 'Dictionary': - var _p23 = _p18._1; - return isOuter ? A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, - false, - A2( - _elm_lang$core$List$map, - function (_p21) { - var _p22 = _p21; - return { - ctor: '_Tuple2', - _0: _p22._0, - _1: A2(_elm_lang$virtual_dom$VirtualDom_Expando$initHelp, false, _p22._1) - }; - }, - _p23)) : ((_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$List$length(_p23), - 8) < 1) ? A2(_elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, false, _p23) : expando); - case 'Record': - var _p25 = _p18._1; - return isOuter ? A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Record, - false, - A2( - _elm_lang$core$Dict$map, - F2( - function (_p24, v) { - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$initHelp, false, v); - }), - _p25)) : ((_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$Dict$size(_p25), - 4) < 1) ? A2(_elm_lang$virtual_dom$VirtualDom_Expando$Record, false, _p25) : expando); - default: - var _p27 = _p18._0; - var _p26 = _p18._2; - return isOuter ? A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Constructor, - _p27, - false, - A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_Expando$initHelp(false), - _p26)) : ((_elm_lang$core$Native_Utils.cmp( - _elm_lang$core$List$length(_p26), - 4) < 1) ? A3(_elm_lang$virtual_dom$VirtualDom_Expando$Constructor, _p27, false, _p26) : expando); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$init = function (value) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$initHelp, - true, - _elm_lang$virtual_dom$Native_Debug.init(value)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp = F2( - function (old, $new) { - var _p28 = {ctor: '_Tuple2', _0: old, _1: $new}; - _v12_6: - do { - if (_p28.ctor === '_Tuple2') { - switch (_p28._1.ctor) { - case 'S': - return $new; - case 'Primitive': - return $new; - case 'Sequence': - if (_p28._0.ctor === 'Sequence') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Sequence, - _p28._1._0, - _p28._0._1, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp, _p28._0._2, _p28._1._2)); - } else { - break _v12_6; - } - case 'Dictionary': - if (_p28._0.ctor === 'Dictionary') { - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, _p28._0._0, _p28._1._1); - } else { - break _v12_6; - } - case 'Record': - if (_p28._0.ctor === 'Record') { - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Record, - _p28._0._0, - A2( - _elm_lang$core$Dict$map, - _elm_lang$virtual_dom$VirtualDom_Expando$mergeDictHelp(_p28._0._1), - _p28._1._1)); - } else { - break _v12_6; - } - default: - if (_p28._0.ctor === 'Constructor') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Constructor, - _p28._1._0, - _p28._0._1, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp, _p28._0._2, _p28._1._2)); - } else { - break _v12_6; - } - } - } else { - break _v12_6; - } - } while(false); - return $new; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$mergeDictHelp = F3( - function (oldDict, key, value) { - var _p29 = A2(_elm_lang$core$Dict$get, key, oldDict); - if (_p29.ctor === 'Nothing') { - return value; - } else { - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp, _p29._0, value); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp = F2( - function (olds, news) { - var _p30 = {ctor: '_Tuple2', _0: olds, _1: news}; - if (_p30._0.ctor === '[]') { - return news; - } else { - if (_p30._1.ctor === '[]') { - return news; - } else { - return { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp, _p30._0._0, _p30._1._0), - _1: A2(_elm_lang$virtual_dom$VirtualDom_Expando$mergeListHelp, _p30._0._1, _p30._1._1) - }; - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$merge = F2( - function (value, expando) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$mergeHelp, - expando, - _elm_lang$virtual_dom$Native_Debug.init(value)); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$update = F2( - function (msg, value) { - var _p31 = value; - switch (_p31.ctor) { - case 'S': - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 168, column: 3}, - end: {line: 235, column: 50} - }, - _p31)('No messages for primitives'); - case 'Primitive': - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 168, column: 3}, - end: {line: 235, column: 50} - }, - _p31)('No messages for primitives'); - case 'Sequence': - var _p39 = _p31._2; - var _p38 = _p31._0; - var _p37 = _p31._1; - var _p34 = msg; - switch (_p34.ctor) { - case 'Toggle': - return A3(_elm_lang$virtual_dom$VirtualDom_Expando$Sequence, _p38, !_p37, _p39); - case 'Index': - if (_p34._0.ctor === 'None') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Sequence, - _p38, - _p37, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, - _p34._1, - _elm_lang$virtual_dom$VirtualDom_Expando$update(_p34._2), - _p39)); - } else { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 176, column: 7}, - end: {line: 188, column: 46} - }, - _p34)('No redirected indexes on sequences'); - } - default: - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 176, column: 7}, - end: {line: 188, column: 46} - }, - _p34)('No field on sequences'); - } - case 'Dictionary': - var _p51 = _p31._1; - var _p50 = _p31._0; - var _p40 = msg; - switch (_p40.ctor) { - case 'Toggle': - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, !_p50, _p51); - case 'Index': - var _p48 = _p40._2; - var _p47 = _p40._1; - var _p41 = _p40._0; - switch (_p41.ctor) { - case 'None': - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 196, column: 11}, - end: {line: 206, column: 81} - }, - _p41)('must have redirect for dictionaries'); - case 'Key': - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, - _p50, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, - _p47, - function (_p43) { - var _p44 = _p43; - return { - ctor: '_Tuple2', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, _p48, _p44._0), - _1: _p44._1 - }; - }, - _p51)); - default: - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Dictionary, - _p50, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, - _p47, - function (_p45) { - var _p46 = _p45; - return { - ctor: '_Tuple2', - _0: _p46._0, - _1: A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, _p48, _p46._1) - }; - }, - _p51)); - } - default: - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 191, column: 7}, - end: {line: 209, column: 50} - }, - _p40)('no field for dictionaries'); - } - case 'Record': - var _p55 = _p31._1; - var _p54 = _p31._0; - var _p52 = msg; - switch (_p52.ctor) { - case 'Toggle': - return A2(_elm_lang$virtual_dom$VirtualDom_Expando$Record, !_p54, _p55); - case 'Index': - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 212, column: 7}, - end: {line: 220, column: 77} - }, - _p52)('No index for records'); - default: - return A2( - _elm_lang$virtual_dom$VirtualDom_Expando$Record, - _p54, - A3( - _elm_lang$core$Dict$update, - _p52._0, - _elm_lang$virtual_dom$VirtualDom_Expando$updateField(_p52._1), - _p55)); - } - default: - var _p61 = _p31._2; - var _p60 = _p31._0; - var _p59 = _p31._1; - var _p56 = msg; - switch (_p56.ctor) { - case 'Toggle': - return A3(_elm_lang$virtual_dom$VirtualDom_Expando$Constructor, _p60, !_p59, _p61); - case 'Index': - if (_p56._0.ctor === 'None') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Expando$Constructor, - _p60, - _p59, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$updateIndex, - _p56._1, - _elm_lang$virtual_dom$VirtualDom_Expando$update(_p56._2), - _p61)); - } else { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 223, column: 7}, - end: {line: 235, column: 50} - }, - _p56)('No redirected indexes on sequences'); - } - default: - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 223, column: 7}, - end: {line: 235, column: 50} - }, - _p56)('No field for constructors'); - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$updateField = F2( - function (msg, maybeExpando) { - var _p62 = maybeExpando; - if (_p62.ctor === 'Nothing') { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Expando', - { - start: {line: 253, column: 3}, - end: {line: 258, column: 32} - }, - _p62)('key does not exist'); - } else { - return _elm_lang$core$Maybe$Just( - A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, msg, _p62._0)); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Primitive = function (a) { - return {ctor: 'Primitive', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$S = function (a) { - return {ctor: 'S', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$ArraySeq = {ctor: 'ArraySeq'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$SetSeq = {ctor: 'SetSeq'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$ListSeq = {ctor: 'ListSeq'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$Field = F2( - function (a, b) { - return {ctor: 'Field', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Index = F3( - function (a, b, c) { - return {ctor: 'Index', _0: a, _1: b, _2: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$Toggle = {ctor: 'Toggle'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$Value = {ctor: 'Value'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$Key = {ctor: 'Key'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$None = {ctor: 'None'}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorEntry = F2( - function (index, value) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just( - _elm_lang$core$Basics$toString(index)), - value)); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$view = F2( - function (maybeKey, expando) { - var _p64 = expando; - switch (_p64.ctor) { - case 'S': - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Nothing, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$red, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p64._0), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - })); - case 'Primitive': - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Nothing, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$blue, - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p64._0), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - })); - case 'Sequence': - return A4(_elm_lang$virtual_dom$VirtualDom_Expando$viewSequence, maybeKey, _p64._0, _p64._1, _p64._2); - case 'Dictionary': - return A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewDictionary, maybeKey, _p64._0, _p64._1); - case 'Record': - return A3(_elm_lang$virtual_dom$VirtualDom_Expando$viewRecord, maybeKey, _p64._0, _p64._1); - default: - return A4(_elm_lang$virtual_dom$VirtualDom_Expando$viewConstructor, maybeKey, _p64._0, _p64._1, _p64._2); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructor = F4( - function (maybeKey, maybeName, isClosed, valueList) { - var _p65 = function () { - var _p66 = valueList; - if (_p66.ctor === '[]') { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Nothing, - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) - }; - } else { - if (_p66._1.ctor === '[]') { - var _p67 = _p66._0; - switch (_p67.ctor) { - case 'S': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Nothing, - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) - }; - case 'Primitive': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Nothing, - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) - }; - case 'Sequence': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), - _elm_lang$virtual_dom$VirtualDom_Expando$viewSequenceOpen(_p67._2)) - }; - case 'Dictionary': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), - _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryOpen(_p67._1)) - }; - case 'Record': - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), - _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordOpen(_p67._1)) - }; - default: - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$None, 0), - _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorOpen(_p67._2)) - }; - } - } else { - return { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just(isClosed), - _1: isClosed ? A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - {ctor: '[]'}) : _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorOpen(valueList) - }; - } - } - }(); - var maybeIsClosed = _p65._0; - var openHtml = _p65._1; - var tinyArgs = A2( - _elm_lang$core$List$map, - function (_p68) { - return _elm_lang$core$Tuple$second( - _elm_lang$virtual_dom$VirtualDom_Expando$viewExtraTiny(_p68)); - }, - valueList); - var description = function () { - var _p69 = {ctor: '_Tuple2', _0: maybeName, _1: tinyArgs}; - if (_p69._0.ctor === 'Nothing') { - if (_p69._1.ctor === '[]') { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('()'), - _1: {ctor: '[]'} - }; - } else { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('( '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - _p69._1._0), - _1: A3( - _elm_lang$core$List$foldr, - F2( - function (args, rest) { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - args), - _1: rest - } - }; - }), - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' )'), - _1: {ctor: '[]'} - }, - _p69._1._1) - } - }; - } - } else { - if (_p69._1.ctor === '[]') { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p69._0._0), - _1: {ctor: '[]'} - }; - } else { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2(_elm_lang$core$Basics_ops['++'], _p69._0._0, ' ')), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - _p69._1._0), - _1: A3( - _elm_lang$core$List$foldr, - F2( - function (args, rest) { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' '), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - {ctor: '[]'}, - args), - _1: rest - } - }; - }), - {ctor: '[]'}, - _p69._1._1) - } - }; - } - } - }(); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), - _1: {ctor: '[]'} - }, - A3(_elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, maybeKey, maybeIsClosed, description)), - _1: { - ctor: '::', - _0: openHtml, - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorOpen = function (valueList) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - A2(_elm_lang$core$List$indexedMap, _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorEntry, valueList)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryOpen = function (keyValuePairs) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - A2(_elm_lang$core$List$indexedMap, _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryEntry, keyValuePairs)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryEntry = F2( - function (index, _p70) { - var _p71 = _p70; - var _p74 = _p71._1; - var _p73 = _p71._0; - var _p72 = _p73; - switch (_p72.ctor) { - case 'S': - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Value, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just(_p72._0), - _p74)); - case 'Primitive': - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Value, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just(_p72._0), - _p74)); - default: - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Key, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just('key'), - _p73)), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - A2(_elm_lang$virtual_dom$VirtualDom_Expando$Index, _elm_lang$virtual_dom$VirtualDom_Expando$Value, index), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just('value'), - _p74)), - _1: {ctor: '[]'} - } - }); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordOpen = function (record) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordEntry, - _elm_lang$core$Dict$toList(record))); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordEntry = function (_p75) { - var _p76 = _p75; - var _p77 = _p76._0; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - _elm_lang$virtual_dom$VirtualDom_Expando$Field(_p77), - A2( - _elm_lang$virtual_dom$VirtualDom_Expando$view, - _elm_lang$core$Maybe$Just(_p77), - _p76._1)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewSequenceOpen = function (values) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - A2(_elm_lang$core$List$indexedMap, _elm_lang$virtual_dom$VirtualDom_Expando$viewConstructorEntry, values)); -}; -var _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionary = F3( - function (maybeKey, isClosed, keyValuePairs) { - var starter = A2( - _elm_lang$core$Basics_ops['++'], - 'Dict(', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString( - _elm_lang$core$List$length(keyValuePairs)), - ')')); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Just(isClosed), - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), - _1: {ctor: '[]'} - })), - _1: { - ctor: '::', - _0: isClosed ? _elm_lang$virtual_dom$VirtualDom_Helpers$text('') : _elm_lang$virtual_dom$VirtualDom_Expando$viewDictionaryOpen(keyValuePairs), - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewRecord = F3( - function (maybeKey, isClosed, record) { - var _p78 = isClosed ? { - ctor: '_Tuple3', - _0: _elm_lang$core$Tuple$second( - _elm_lang$virtual_dom$VirtualDom_Expando$viewTinyRecord(record)), - _1: _elm_lang$virtual_dom$VirtualDom_Helpers$text(''), - _2: _elm_lang$virtual_dom$VirtualDom_Helpers$text('') - } : { - ctor: '_Tuple3', - _0: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('{'), - _1: {ctor: '[]'} - }, - _1: _elm_lang$virtual_dom$VirtualDom_Expando$viewRecordOpen(record), - _2: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad( - _elm_lang$core$Maybe$Just( - {ctor: '_Tuple0'})), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('}'), - _1: {ctor: '[]'} - }) - }; - var start = _p78._0; - var middle = _p78._1; - var end = _p78._2; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Just(isClosed), - start)), - _1: { - ctor: '::', - _0: middle, - _1: { - ctor: '::', - _0: end, - _1: {ctor: '[]'} - } - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Expando$viewSequence = F4( - function (maybeKey, seqType, isClosed, valueList) { - var starter = A2( - _elm_lang$virtual_dom$VirtualDom_Expando$seqTypeToString, - _elm_lang$core$List$length(valueList), - seqType); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Expando$leftPad(maybeKey), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Expando$Toggle), - _1: {ctor: '[]'} - }, - A3( - _elm_lang$virtual_dom$VirtualDom_Expando$lineStarter, - maybeKey, - _elm_lang$core$Maybe$Just(isClosed), - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(starter), - _1: {ctor: '[]'} - })), - _1: { - ctor: '::', - _0: isClosed ? _elm_lang$virtual_dom$VirtualDom_Helpers$text('') : _elm_lang$virtual_dom$VirtualDom_Expando$viewSequenceOpen(valueList), - _1: {ctor: '[]'} - } - }); - }); - -var _elm_lang$virtual_dom$VirtualDom_Report$some = function (list) { - return !_elm_lang$core$List$isEmpty(list); -}; -var _elm_lang$virtual_dom$VirtualDom_Report$TagChanges = F4( - function (a, b, c, d) { - return {removed: a, changed: b, added: c, argsMatch: d}; - }); -var _elm_lang$virtual_dom$VirtualDom_Report$emptyTagChanges = function (argsMatch) { - return A4( - _elm_lang$virtual_dom$VirtualDom_Report$TagChanges, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}, - argsMatch); -}; -var _elm_lang$virtual_dom$VirtualDom_Report$hasTagChanges = function (tagChanges) { - return _elm_lang$core$Native_Utils.eq( - tagChanges, - A4( - _elm_lang$virtual_dom$VirtualDom_Report$TagChanges, - {ctor: '[]'}, - {ctor: '[]'}, - {ctor: '[]'}, - true)); -}; -var _elm_lang$virtual_dom$VirtualDom_Report$SomethingChanged = function (a) { - return {ctor: 'SomethingChanged', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Report$MessageChanged = F2( - function (a, b) { - return {ctor: 'MessageChanged', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Report$VersionChanged = F2( - function (a, b) { - return {ctor: 'VersionChanged', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Report$CorruptHistory = {ctor: 'CorruptHistory'}; -var _elm_lang$virtual_dom$VirtualDom_Report$UnionChange = F2( - function (a, b) { - return {ctor: 'UnionChange', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Report$AliasChange = function (a) { - return {ctor: 'AliasChange', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Report$Fine = {ctor: 'Fine'}; -var _elm_lang$virtual_dom$VirtualDom_Report$Risky = {ctor: 'Risky'}; -var _elm_lang$virtual_dom$VirtualDom_Report$Impossible = {ctor: 'Impossible'}; -var _elm_lang$virtual_dom$VirtualDom_Report$worstCase = F2( - function (status, statusList) { - worstCase: - while (true) { - var _p0 = statusList; - if (_p0.ctor === '[]') { - return status; - } else { - switch (_p0._0.ctor) { - case 'Impossible': - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - case 'Risky': - var _v1 = _elm_lang$virtual_dom$VirtualDom_Report$Risky, - _v2 = _p0._1; - status = _v1; - statusList = _v2; - continue worstCase; - default: - var _v3 = status, - _v4 = _p0._1; - status = _v3; - statusList = _v4; - continue worstCase; - } - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Report$evaluateChange = function (change) { - var _p1 = change; - if (_p1.ctor === 'AliasChange') { - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - } else { - return ((!_p1._1.argsMatch) || (_elm_lang$virtual_dom$VirtualDom_Report$some(_p1._1.changed) || _elm_lang$virtual_dom$VirtualDom_Report$some(_p1._1.removed))) ? _elm_lang$virtual_dom$VirtualDom_Report$Impossible : (_elm_lang$virtual_dom$VirtualDom_Report$some(_p1._1.added) ? _elm_lang$virtual_dom$VirtualDom_Report$Risky : _elm_lang$virtual_dom$VirtualDom_Report$Fine); - } -}; -var _elm_lang$virtual_dom$VirtualDom_Report$evaluate = function (report) { - var _p2 = report; - switch (_p2.ctor) { - case 'CorruptHistory': - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - case 'VersionChanged': - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - case 'MessageChanged': - return _elm_lang$virtual_dom$VirtualDom_Report$Impossible; - default: - return A2( - _elm_lang$virtual_dom$VirtualDom_Report$worstCase, - _elm_lang$virtual_dom$VirtualDom_Report$Fine, - A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Report$evaluateChange, _p2._0)); - } -}; - -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict = F2( - function (f, dict) { - return _elm_lang$core$Json_Encode$object( - _elm_lang$core$Dict$toList( - A2( - _elm_lang$core$Dict$map, - F2( - function (key, value) { - return f(value); - }), - dict))); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeUnion = function (_p0) { - var _p1 = _p0; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'args', - _1: _elm_lang$core$Json_Encode$list( - A2(_elm_lang$core$List$map, _elm_lang$core$Json_Encode$string, _p1.args)) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'tags', - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict, - function (_p2) { - return _elm_lang$core$Json_Encode$list( - A2(_elm_lang$core$List$map, _elm_lang$core$Json_Encode$string, _p2)); - }, - _p1.tags) - }, - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeAlias = function (_p3) { - var _p4 = _p3; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'args', - _1: _elm_lang$core$Json_Encode$list( - A2(_elm_lang$core$List$map, _elm_lang$core$Json_Encode$string, _p4.args)) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'type', - _1: _elm_lang$core$Json_Encode$string(_p4.tipe) - }, - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeTypes = function (_p5) { - var _p6 = _p5; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'message', - _1: _elm_lang$core$Json_Encode$string(_p6.message) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'aliases', - _1: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict, _elm_lang$virtual_dom$VirtualDom_Metadata$encodeAlias, _p6.aliases) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'unions', - _1: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$encodeDict, _elm_lang$virtual_dom$VirtualDom_Metadata$encodeUnion, _p6.unions) - }, - _1: {ctor: '[]'} - } - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$encodeVersions = function (_p7) { - var _p8 = _p7; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'elm', - _1: _elm_lang$core$Json_Encode$string(_p8.elm) - }, - _1: {ctor: '[]'} - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$encode = function (_p9) { - var _p10 = _p9; - return _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'versions', - _1: _elm_lang$virtual_dom$VirtualDom_Metadata$encodeVersions(_p10.versions) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'types', - _1: _elm_lang$virtual_dom$VirtualDom_Metadata$encodeTypes(_p10.types) - }, - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$checkTag = F4( - function (tag, old, $new, changes) { - return _elm_lang$core$Native_Utils.eq(old, $new) ? changes : _elm_lang$core$Native_Utils.update( - changes, - { - changed: {ctor: '::', _0: tag, _1: changes.changed} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$addTag = F3( - function (tag, _p11, changes) { - return _elm_lang$core$Native_Utils.update( - changes, - { - added: {ctor: '::', _0: tag, _1: changes.added} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$removeTag = F3( - function (tag, _p12, changes) { - return _elm_lang$core$Native_Utils.update( - changes, - { - removed: {ctor: '::', _0: tag, _1: changes.removed} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$checkUnion = F4( - function (name, old, $new, changes) { - var tagChanges = A6( - _elm_lang$core$Dict$merge, - _elm_lang$virtual_dom$VirtualDom_Metadata$removeTag, - _elm_lang$virtual_dom$VirtualDom_Metadata$checkTag, - _elm_lang$virtual_dom$VirtualDom_Metadata$addTag, - old.tags, - $new.tags, - _elm_lang$virtual_dom$VirtualDom_Report$emptyTagChanges( - _elm_lang$core$Native_Utils.eq(old.args, $new.args))); - return _elm_lang$virtual_dom$VirtualDom_Report$hasTagChanges(tagChanges) ? changes : { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Report$UnionChange, name, tagChanges), - _1: changes - }; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$checkAlias = F4( - function (name, old, $new, changes) { - return (_elm_lang$core$Native_Utils.eq(old.tipe, $new.tipe) && _elm_lang$core$Native_Utils.eq(old.args, $new.args)) ? changes : { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Report$AliasChange(name), - _1: changes - }; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$ignore = F3( - function (key, value, report) { - return report; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$checkTypes = F2( - function (old, $new) { - return (!_elm_lang$core$Native_Utils.eq(old.message, $new.message)) ? A2(_elm_lang$virtual_dom$VirtualDom_Report$MessageChanged, old.message, $new.message) : _elm_lang$virtual_dom$VirtualDom_Report$SomethingChanged( - A6( - _elm_lang$core$Dict$merge, - _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, - _elm_lang$virtual_dom$VirtualDom_Metadata$checkUnion, - _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, - old.unions, - $new.unions, - A6( - _elm_lang$core$Dict$merge, - _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, - _elm_lang$virtual_dom$VirtualDom_Metadata$checkAlias, - _elm_lang$virtual_dom$VirtualDom_Metadata$ignore, - old.aliases, - $new.aliases, - {ctor: '[]'}))); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$check = F2( - function (old, $new) { - return (!_elm_lang$core$Native_Utils.eq(old.versions.elm, $new.versions.elm)) ? A2(_elm_lang$virtual_dom$VirtualDom_Report$VersionChanged, old.versions.elm, $new.versions.elm) : A2(_elm_lang$virtual_dom$VirtualDom_Metadata$checkTypes, old.types, $new.types); - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$hasProblem = F2( - function (tipe, _p13) { - var _p14 = _p13; - return A2(_elm_lang$core$String$contains, _p14._1, tipe) ? _elm_lang$core$Maybe$Just(_p14._0) : _elm_lang$core$Maybe$Nothing; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Metadata = F2( - function (a, b) { - return {versions: a, types: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Versions = function (a) { - return {elm: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeVersions = A2( - _elm_lang$core$Json_Decode$map, - _elm_lang$virtual_dom$VirtualDom_Metadata$Versions, - A2(_elm_lang$core$Json_Decode$field, 'elm', _elm_lang$core$Json_Decode$string)); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Types = F3( - function (a, b, c) { - return {message: a, aliases: b, unions: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Alias = F2( - function (a, b) { - return {args: a, tipe: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeAlias = A3( - _elm_lang$core$Json_Decode$map2, - _elm_lang$virtual_dom$VirtualDom_Metadata$Alias, - A2( - _elm_lang$core$Json_Decode$field, - 'args', - _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string)), - A2(_elm_lang$core$Json_Decode$field, 'type', _elm_lang$core$Json_Decode$string)); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Union = F2( - function (a, b) { - return {args: a, tags: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeUnion = A3( - _elm_lang$core$Json_Decode$map2, - _elm_lang$virtual_dom$VirtualDom_Metadata$Union, - A2( - _elm_lang$core$Json_Decode$field, - 'args', - _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string)), - A2( - _elm_lang$core$Json_Decode$field, - 'tags', - _elm_lang$core$Json_Decode$dict( - _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$string)))); -var _elm_lang$virtual_dom$VirtualDom_Metadata$decodeTypes = A4( - _elm_lang$core$Json_Decode$map3, - _elm_lang$virtual_dom$VirtualDom_Metadata$Types, - A2(_elm_lang$core$Json_Decode$field, 'message', _elm_lang$core$Json_Decode$string), - A2( - _elm_lang$core$Json_Decode$field, - 'aliases', - _elm_lang$core$Json_Decode$dict(_elm_lang$virtual_dom$VirtualDom_Metadata$decodeAlias)), - A2( - _elm_lang$core$Json_Decode$field, - 'unions', - _elm_lang$core$Json_Decode$dict(_elm_lang$virtual_dom$VirtualDom_Metadata$decodeUnion))); -var _elm_lang$virtual_dom$VirtualDom_Metadata$decoder = A3( - _elm_lang$core$Json_Decode$map2, - _elm_lang$virtual_dom$VirtualDom_Metadata$Metadata, - A2(_elm_lang$core$Json_Decode$field, 'versions', _elm_lang$virtual_dom$VirtualDom_Metadata$decodeVersions), - A2(_elm_lang$core$Json_Decode$field, 'types', _elm_lang$virtual_dom$VirtualDom_Metadata$decodeTypes)); -var _elm_lang$virtual_dom$VirtualDom_Metadata$Error = F2( - function (a, b) { - return {message: a, problems: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$ProblemType = F2( - function (a, b) { - return {name: a, problems: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$VirtualDom = {ctor: 'VirtualDom'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Program = {ctor: 'Program'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Request = {ctor: 'Request'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Socket = {ctor: 'Socket'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Process = {ctor: 'Process'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Task = {ctor: 'Task'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Decoder = {ctor: 'Decoder'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$Function = {ctor: 'Function'}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$problemTable = { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Function, _1: '->'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Decoder, _1: 'Json.Decode.Decoder'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Task, _1: 'Task.Task'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Process, _1: 'Process.Id'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Socket, _1: 'WebSocket.LowLevel.WebSocket'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Request, _1: 'Http.Request'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$Program, _1: 'Platform.Program'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$VirtualDom, _1: 'VirtualDom.Node'}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: _elm_lang$virtual_dom$VirtualDom_Metadata$VirtualDom, _1: 'VirtualDom.Attribute'}, - _1: {ctor: '[]'} - } - } - } - } - } - } - } - } -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$findProblems = function (tipe) { - return A2( - _elm_lang$core$List$filterMap, - _elm_lang$virtual_dom$VirtualDom_Metadata$hasProblem(tipe), - _elm_lang$virtual_dom$VirtualDom_Metadata$problemTable); -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadAliases = F3( - function (name, _p15, list) { - var _p16 = _p15; - var _p17 = _elm_lang$virtual_dom$VirtualDom_Metadata$findProblems(_p16.tipe); - if (_p17.ctor === '[]') { - return list; - } else { - return { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$ProblemType, name, _p17), - _1: list - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadUnions = F3( - function (name, _p18, list) { - var _p19 = _p18; - var _p20 = A2( - _elm_lang$core$List$concatMap, - _elm_lang$virtual_dom$VirtualDom_Metadata$findProblems, - _elm_lang$core$List$concat( - _elm_lang$core$Dict$values(_p19.tags))); - if (_p20.ctor === '[]') { - return list; - } else { - return { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Metadata$ProblemType, name, _p20), - _1: list - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Metadata$isPortable = function (_p21) { - var _p22 = _p21; - var _p24 = _p22.types; - var badAliases = A3( - _elm_lang$core$Dict$foldl, - _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadAliases, - {ctor: '[]'}, - _p24.aliases); - var _p23 = A3(_elm_lang$core$Dict$foldl, _elm_lang$virtual_dom$VirtualDom_Metadata$collectBadUnions, badAliases, _p24.unions); - if (_p23.ctor === '[]') { - return _elm_lang$core$Maybe$Nothing; - } else { - return _elm_lang$core$Maybe$Just( - A2(_elm_lang$virtual_dom$VirtualDom_Metadata$Error, _p24.message, _p23)); - } -}; -var _elm_lang$virtual_dom$VirtualDom_Metadata$decode = function (value) { - var _p25 = A2(_elm_lang$core$Json_Decode$decodeValue, _elm_lang$virtual_dom$VirtualDom_Metadata$decoder, value); - if (_p25.ctor === 'Err') { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.Metadata', - { - start: {line: 229, column: 3}, - end: {line: 239, column: 20} - }, - _p25)('Compiler is generating bad metadata. Report this at .'); - } else { - var _p28 = _p25._0; - var _p27 = _elm_lang$virtual_dom$VirtualDom_Metadata$isPortable(_p28); - if (_p27.ctor === 'Nothing') { - return _elm_lang$core$Result$Ok(_p28); - } else { - return _elm_lang$core$Result$Err(_p27._0); - } - } -}; - -var _elm_lang$virtual_dom$VirtualDom_History$viewMessage = F3( - function (currentIndex, index, msg) { - var messageName = _elm_lang$virtual_dom$Native_Debug.messageToString(msg); - var className = _elm_lang$core$Native_Utils.eq(currentIndex, index) ? 'messages-entry messages-entry-selected' : 'messages-entry'; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class(className), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$on, - 'click', - _elm_lang$core$Json_Decode$succeed(index)), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('messages-entry-content'), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Helpers$attribute, 'title', messageName), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(messageName), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('messages-entry-index'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - _elm_lang$core$Basics$toString(index)), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_History$consMsg = F3( - function (currentIndex, msg, _p0) { - var _p1 = _p0; - var _p2 = _p1._0; - return { - ctor: '_Tuple2', - _0: _p2 - 1, - _1: { - ctor: '::', - _0: A4(_elm_lang$virtual_dom$VirtualDom_Helpers$lazy3, _elm_lang$virtual_dom$VirtualDom_History$viewMessage, currentIndex, _p2, msg), - _1: _p1._1 - } - }; - }); -var _elm_lang$virtual_dom$VirtualDom_History$viewSnapshot = F3( - function (currentIndex, index, _p3) { - var _p4 = _p3; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - _elm_lang$core$Tuple$second( - A3( - _elm_lang$core$Array$foldl, - _elm_lang$virtual_dom$VirtualDom_History$consMsg(currentIndex), - { - ctor: '_Tuple2', - _0: index - 1, - _1: {ctor: '[]'} - }, - _p4.messages))); - }); -var _elm_lang$virtual_dom$VirtualDom_History$undone = function (getResult) { - var _p5 = getResult; - if (_p5.ctor === 'Done') { - return {ctor: '_Tuple2', _0: _p5._1, _1: _p5._0}; - } else { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.History', - { - start: {line: 195, column: 3}, - end: {line: 200, column: 39} - }, - _p5)('Bug in History.get'); - } -}; -var _elm_lang$virtual_dom$VirtualDom_History$elmToJs = _elm_lang$virtual_dom$Native_Debug.unsafeCoerce; -var _elm_lang$virtual_dom$VirtualDom_History$encodeHelp = F2( - function (snapshot, allMessages) { - return A3( - _elm_lang$core$Array$foldl, - F2( - function (elm, msgs) { - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_History$elmToJs(elm), - _1: msgs - }; - }), - allMessages, - snapshot.messages); - }); -var _elm_lang$virtual_dom$VirtualDom_History$encode = function (_p7) { - var _p8 = _p7; - var recentJson = A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_History$elmToJs, - _elm_lang$core$List$reverse(_p8.recent.messages)); - return _elm_lang$core$Json_Encode$list( - A3(_elm_lang$core$Array$foldr, _elm_lang$virtual_dom$VirtualDom_History$encodeHelp, recentJson, _p8.snapshots)); -}; -var _elm_lang$virtual_dom$VirtualDom_History$jsToElm = _elm_lang$virtual_dom$Native_Debug.unsafeCoerce; -var _elm_lang$virtual_dom$VirtualDom_History$initialModel = function (_p9) { - var _p10 = _p9; - var _p11 = A2(_elm_lang$core$Array$get, 0, _p10.snapshots); - if (_p11.ctor === 'Just') { - return _p11._0.model; - } else { - return _p10.recent.model; - } -}; -var _elm_lang$virtual_dom$VirtualDom_History$size = function (history) { - return history.numMessages; -}; -var _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize = 64; -var _elm_lang$virtual_dom$VirtualDom_History$consSnapshot = F3( - function (currentIndex, snapshot, _p12) { - var _p13 = _p12; - var _p14 = _p13._0; - var nextIndex = _p14 - _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize; - var currentIndexHelp = ((_elm_lang$core$Native_Utils.cmp(nextIndex, currentIndex) < 1) && (_elm_lang$core$Native_Utils.cmp(currentIndex, _p14) < 0)) ? currentIndex : -1; - return { - ctor: '_Tuple2', - _0: _p14 - _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize, - _1: { - ctor: '::', - _0: A4(_elm_lang$virtual_dom$VirtualDom_Helpers$lazy3, _elm_lang$virtual_dom$VirtualDom_History$viewSnapshot, currentIndexHelp, _p14, snapshot), - _1: _p13._1 - } - }; - }); -var _elm_lang$virtual_dom$VirtualDom_History$viewSnapshots = F2( - function (currentIndex, snapshots) { - var highIndex = _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize * _elm_lang$core$Array$length(snapshots); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - {ctor: '[]'}, - _elm_lang$core$Tuple$second( - A3( - _elm_lang$core$Array$foldr, - _elm_lang$virtual_dom$VirtualDom_History$consSnapshot(currentIndex), - { - ctor: '_Tuple2', - _0: highIndex, - _1: {ctor: '[]'} - }, - snapshots))); - }); -var _elm_lang$virtual_dom$VirtualDom_History$view = F2( - function (maybeIndex, _p15) { - var _p16 = _p15; - var _p17 = function () { - var _p18 = maybeIndex; - if (_p18.ctor === 'Nothing') { - return {ctor: '_Tuple2', _0: -1, _1: 'debugger-sidebar-messages'}; - } else { - return {ctor: '_Tuple2', _0: _p18._0, _1: 'debugger-sidebar-messages-paused'}; - } - }(); - var index = _p17._0; - var className = _p17._1; - var oldStuff = A3(_elm_lang$virtual_dom$VirtualDom_Helpers$lazy2, _elm_lang$virtual_dom$VirtualDom_History$viewSnapshots, index, _p16.snapshots); - var newStuff = _elm_lang$core$Tuple$second( - A3( - _elm_lang$core$List$foldl, - _elm_lang$virtual_dom$VirtualDom_History$consMsg(index), - { - ctor: '_Tuple2', - _0: _p16.numMessages - 1, - _1: {ctor: '[]'} - }, - _p16.recent.messages)); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class(className), - _1: {ctor: '[]'} - }, - {ctor: '::', _0: oldStuff, _1: newStuff}); - }); -var _elm_lang$virtual_dom$VirtualDom_History$History = F3( - function (a, b, c) { - return {snapshots: a, recent: b, numMessages: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$RecentHistory = F3( - function (a, b, c) { - return {model: a, messages: b, numMessages: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$empty = function (model) { - return A3( - _elm_lang$virtual_dom$VirtualDom_History$History, - _elm_lang$core$Array$empty, - A3( - _elm_lang$virtual_dom$VirtualDom_History$RecentHistory, - model, - {ctor: '[]'}, - 0), - 0); -}; -var _elm_lang$virtual_dom$VirtualDom_History$Snapshot = F2( - function (a, b) { - return {model: a, messages: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$addRecent = F3( - function (msg, newModel, _p19) { - var _p20 = _p19; - var _p23 = _p20.numMessages; - var _p22 = _p20.model; - var _p21 = _p20.messages; - return _elm_lang$core$Native_Utils.eq(_p23, _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize) ? { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Just( - A2( - _elm_lang$virtual_dom$VirtualDom_History$Snapshot, - _p22, - _elm_lang$core$Array$fromList(_p21))), - _1: A3( - _elm_lang$virtual_dom$VirtualDom_History$RecentHistory, - newModel, - { - ctor: '::', - _0: msg, - _1: {ctor: '[]'} - }, - 1) - } : { - ctor: '_Tuple2', - _0: _elm_lang$core$Maybe$Nothing, - _1: A3( - _elm_lang$virtual_dom$VirtualDom_History$RecentHistory, - _p22, - {ctor: '::', _0: msg, _1: _p21}, - _p23 + 1) - }; - }); -var _elm_lang$virtual_dom$VirtualDom_History$add = F3( - function (msg, model, _p24) { - var _p25 = _p24; - var _p28 = _p25.snapshots; - var _p27 = _p25.numMessages; - var _p26 = A3(_elm_lang$virtual_dom$VirtualDom_History$addRecent, msg, model, _p25.recent); - if (_p26._0.ctor === 'Just') { - return A3( - _elm_lang$virtual_dom$VirtualDom_History$History, - A2(_elm_lang$core$Array$push, _p26._0._0, _p28), - _p26._1, - _p27 + 1); - } else { - return A3(_elm_lang$virtual_dom$VirtualDom_History$History, _p28, _p26._1, _p27 + 1); - } - }); -var _elm_lang$virtual_dom$VirtualDom_History$decoder = F2( - function (initialModel, update) { - var addMessage = F2( - function (rawMsg, _p29) { - var _p30 = _p29; - var _p31 = _p30._0; - var msg = _elm_lang$virtual_dom$VirtualDom_History$jsToElm(rawMsg); - return { - ctor: '_Tuple2', - _0: A2(update, msg, _p31), - _1: A3(_elm_lang$virtual_dom$VirtualDom_History$add, msg, _p31, _p30._1) - }; - }); - var updateModel = function (rawMsgs) { - return A3( - _elm_lang$core$List$foldl, - addMessage, - { - ctor: '_Tuple2', - _0: initialModel, - _1: _elm_lang$virtual_dom$VirtualDom_History$empty(initialModel) - }, - rawMsgs); - }; - return A2( - _elm_lang$core$Json_Decode$map, - updateModel, - _elm_lang$core$Json_Decode$list(_elm_lang$core$Json_Decode$value)); - }); -var _elm_lang$virtual_dom$VirtualDom_History$Done = F2( - function (a, b) { - return {ctor: 'Done', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$Stepping = F2( - function (a, b) { - return {ctor: 'Stepping', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_History$getHelp = F3( - function (update, msg, getResult) { - var _p32 = getResult; - if (_p32.ctor === 'Done') { - return getResult; - } else { - var _p34 = _p32._0; - var _p33 = _p32._1; - return _elm_lang$core$Native_Utils.eq(_p34, 0) ? A2( - _elm_lang$virtual_dom$VirtualDom_History$Done, - msg, - _elm_lang$core$Tuple$first( - A2(update, msg, _p33))) : A2( - _elm_lang$virtual_dom$VirtualDom_History$Stepping, - _p34 - 1, - _elm_lang$core$Tuple$first( - A2(update, msg, _p33))); - } - }); -var _elm_lang$virtual_dom$VirtualDom_History$get = F3( - function (update, index, _p35) { - var _p36 = _p35; - var _p39 = _p36.recent; - var snapshotMax = _p36.numMessages - _p39.numMessages; - if (_elm_lang$core$Native_Utils.cmp(index, snapshotMax) > -1) { - return _elm_lang$virtual_dom$VirtualDom_History$undone( - A3( - _elm_lang$core$List$foldr, - _elm_lang$virtual_dom$VirtualDom_History$getHelp(update), - A2(_elm_lang$virtual_dom$VirtualDom_History$Stepping, index - snapshotMax, _p39.model), - _p39.messages)); - } else { - var _p37 = A2(_elm_lang$core$Array$get, (index / _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize) | 0, _p36.snapshots); - if (_p37.ctor === 'Nothing') { - return _elm_lang$core$Native_Utils.crashCase( - 'VirtualDom.History', - { - start: {line: 165, column: 7}, - end: {line: 171, column: 95} - }, - _p37)('UI should only let you ask for real indexes!'); - } else { - return _elm_lang$virtual_dom$VirtualDom_History$undone( - A3( - _elm_lang$core$Array$foldr, - _elm_lang$virtual_dom$VirtualDom_History$getHelp(update), - A2( - _elm_lang$virtual_dom$VirtualDom_History$Stepping, - A2(_elm_lang$core$Basics$rem, index, _elm_lang$virtual_dom$VirtualDom_History$maxSnapshotSize), - _p37._0.model), - _p37._0.messages)); - } - } - }); - -var _elm_lang$virtual_dom$VirtualDom_Overlay$styles = A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'style', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('\n\n.elm-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n color: white;\n pointer-events: none;\n font-family: \'Trebuchet MS\', \'Lucida Grande\', \'Bitstream Vera Sans\', \'Helvetica Neue\', sans-serif;\n}\n\n.elm-overlay-resume {\n width: 100%;\n height: 100%;\n cursor: pointer;\n text-align: center;\n pointer-events: auto;\n background-color: rgba(200, 200, 200, 0.7);\n}\n\n.elm-overlay-resume-words {\n position: absolute;\n top: calc(50% - 40px);\n font-size: 80px;\n line-height: 80px;\n height: 80px;\n width: 100%;\n}\n\n.elm-mini-controls {\n position: fixed;\n bottom: 0;\n right: 6px;\n border-radius: 4px;\n background-color: rgb(61, 61, 61);\n font-family: monospace;\n pointer-events: auto;\n}\n\n.elm-mini-controls-button {\n padding: 6px;\n cursor: pointer;\n text-align: center;\n min-width: 24ch;\n}\n\n.elm-mini-controls-import-export {\n padding: 4px 0;\n font-size: 0.8em;\n text-align: center;\n background-color: rgb(50, 50, 50);\n}\n\n.elm-overlay-message {\n position: absolute;\n width: 600px;\n height: 100%;\n padding-left: calc(50% - 300px);\n padding-right: calc(50% - 300px);\n background-color: rgba(200, 200, 200, 0.7);\n pointer-events: auto;\n}\n\n.elm-overlay-message-title {\n font-size: 36px;\n height: 80px;\n background-color: rgb(50, 50, 50);\n padding-left: 22px;\n vertical-align: middle;\n line-height: 80px;\n}\n\n.elm-overlay-message-details {\n padding: 8px 20px;\n overflow-y: auto;\n max-height: calc(100% - 156px);\n background-color: rgb(61, 61, 61);\n}\n\n.elm-overlay-message-details-type {\n font-size: 1.5em;\n}\n\n.elm-overlay-message-details ul {\n list-style-type: none;\n padding-left: 20px;\n}\n\n.elm-overlay-message-details ul ul {\n list-style-type: disc;\n padding-left: 2em;\n}\n\n.elm-overlay-message-details li {\n margin: 8px 0;\n}\n\n.elm-overlay-message-buttons {\n height: 60px;\n line-height: 60px;\n text-align: right;\n background-color: rgb(50, 50, 50);\n}\n\n.elm-overlay-message-buttons button {\n margin-right: 20px;\n}\n\n'), - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$button = F2( - function (msg, label) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(msg), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'cursor', _1: 'pointer'}, - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(label), - _1: {ctor: '[]'} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewImportExport = F3( - function (props, importMsg, exportMsg) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - props, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$button, importMsg, 'Import'), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' / '), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$button, exportMsg, 'Export'), - _1: {ctor: '[]'} - } - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewMiniControls = F2( - function (config, numMsgs) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-mini-controls'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(config.open), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-mini-controls-button'), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2( - _elm_lang$core$Basics_ops['++'], - 'Explore History (', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$core$Basics$toString(numMsgs), - ')'))), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Overlay$viewImportExport, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-mini-controls-import-export'), - _1: {ctor: '[]'} - }, - config.importHistory, - config.exportHistory), - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$addCommas = function (items) { - var _p0 = items; - if (_p0.ctor === '[]') { - return ''; - } else { - if (_p0._1.ctor === '[]') { - return _p0._0; - } else { - if (_p0._1._1.ctor === '[]') { - return A2( - _elm_lang$core$Basics_ops['++'], - _p0._0, - A2(_elm_lang$core$Basics_ops['++'], ' and ', _p0._1._0)); - } else { - return A2( - _elm_lang$core$String$join, - ', ', - A2( - _elm_lang$core$Basics_ops['++'], - _p0._1, - { - ctor: '::', - _0: A2(_elm_lang$core$Basics_ops['++'], ' and ', _p0._0), - _1: {ctor: '[]'} - })); - } - } - } -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$problemToString = function (problem) { - var _p1 = problem; - switch (_p1.ctor) { - case 'Function': - return 'functions'; - case 'Decoder': - return 'JSON decoders'; - case 'Task': - return 'tasks'; - case 'Process': - return 'processes'; - case 'Socket': - return 'web sockets'; - case 'Request': - return 'HTTP requests'; - case 'Program': - return 'programs'; - default: - return 'virtual DOM values'; - } -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$goodNews2 = '\nfunction can pattern match on that data and call whatever functions, JSON\ndecoders, etc. you need. This makes the code much more explicit and easy to\nfollow for other readers (or you in a few months!)\n'; -var _elm_lang$virtual_dom$VirtualDom_Overlay$goodNews1 = '\nThe good news is that having values like this in your message type is not\nso great in the long run. You are better off using simpler data, like\n'; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode = function (name) { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'code', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(name), - _1: {ctor: '[]'} - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewMention = F2( - function (tags, verbed) { - var _p2 = A2( - _elm_lang$core$List$map, - _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode, - _elm_lang$core$List$reverse(tags)); - if (_p2.ctor === '[]') { - return _elm_lang$virtual_dom$VirtualDom_Helpers$text(''); - } else { - if (_p2._1.ctor === '[]') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(verbed), - _1: { - ctor: '::', - _0: _p2._0, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('.'), - _1: {ctor: '[]'} - } - } - }); - } else { - if (_p2._1._1.ctor === '[]') { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(verbed), - _1: { - ctor: '::', - _0: _p2._1._0, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' and '), - _1: { - ctor: '::', - _0: _p2._0, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('.'), - _1: {ctor: '[]'} - } - } - } - } - }); - } else { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(verbed), - _1: A2( - _elm_lang$core$Basics_ops['++'], - A2( - _elm_lang$core$List$intersperse, - _elm_lang$virtual_dom$VirtualDom_Helpers$text(', '), - _elm_lang$core$List$reverse(_p2._1)), - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', and '), - _1: { - ctor: '::', - _0: _p2._0, - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('.'), - _1: {ctor: '[]'} - } - } - }) - }); - } - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewChange = function (change) { - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - function () { - var _p3 = change; - if (_p3.ctor === 'AliasChange') { - return { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-details-type'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p3._0), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }; - } else { - return { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-details-type'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p3._0), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'ul', - {ctor: '[]'}, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMention, _p3._1.removed, 'Removed '), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMention, _p3._1.changed, 'Changed '), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMention, _p3._1.added, 'Added '), - _1: {ctor: '[]'} - } - } - }), - _1: { - ctor: '::', - _0: _p3._1.argsMatch ? _elm_lang$virtual_dom$VirtualDom_Helpers$text('') : _elm_lang$virtual_dom$VirtualDom_Helpers$text('This may be due to the fact that the type variable names changed.'), - _1: {ctor: '[]'} - } - } - }; - } - }()); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewProblemType = function (_p4) { - var _p5 = _p4; - return A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'li', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p5.name), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2( - _elm_lang$core$Basics_ops['++'], - ' can contain ', - A2( - _elm_lang$core$Basics_ops['++'], - _elm_lang$virtual_dom$VirtualDom_Overlay$addCommas( - A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Overlay$problemToString, _p5.problems)), - '.'))), - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewBadMetadata = function (_p6) { - var _p7 = _p6; - return { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'p', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('The '), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p7.message), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' type of your program cannot be reliably serialized for history files.'), - _1: {ctor: '[]'} - } - } - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'p', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Functions cannot be serialized, nor can values that contain functions. This is a problem in these places:'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'ul', - {ctor: '[]'}, - A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Overlay$viewProblemType, _p7.problems)), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'p', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_elm_lang$virtual_dom$VirtualDom_Overlay$goodNews1), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$a, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$href('https://guide.elm-lang.org/types/union_types.html'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('union types'), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(', in your messages. From there, your '), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode('update'), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_elm_lang$virtual_dom$VirtualDom_Overlay$goodNews2), - _1: {ctor: '[]'} - } - } - } - } - }), - _1: {ctor: '[]'} - } - } - } - }; -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$explanationRisky = '\nThis history seems old. It will work with this program, but some\nmessages have been added since the history was created:\n'; -var _elm_lang$virtual_dom$VirtualDom_Overlay$explanationBad = '\nThe messages in this history do not match the messages handled by your\nprogram. I noticed changes in the following types:\n'; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewReport = F2( - function (isBad, report) { - var _p8 = report; - switch (_p8.ctor) { - case 'CorruptHistory': - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Looks like this history file is corrupt. I cannot understand it.'), - _1: {ctor: '[]'} - }; - case 'VersionChanged': - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2( - _elm_lang$core$Basics_ops['++'], - 'This history was created with Elm ', - A2( - _elm_lang$core$Basics_ops['++'], - _p8._0, - A2( - _elm_lang$core$Basics_ops['++'], - ', but you are using Elm ', - A2(_elm_lang$core$Basics_ops['++'], _p8._1, ' right now.'))))), - _1: {ctor: '[]'} - }; - case 'MessageChanged': - return { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - A2(_elm_lang$core$Basics_ops['++'], 'To import some other history, the overall message type must', ' be the same. The old history has ')), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p8._0), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' messages, but the new program works with '), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewCode(_p8._1), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' messages.'), - _1: {ctor: '[]'} - } - } - } - } - }; - default: - return { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'p', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text( - isBad ? _elm_lang$virtual_dom$VirtualDom_Overlay$explanationBad : _elm_lang$virtual_dom$VirtualDom_Overlay$explanationRisky), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'ul', - {ctor: '[]'}, - A2(_elm_lang$core$List$map, _elm_lang$virtual_dom$VirtualDom_Overlay$viewChange, _p8._0)), - _1: {ctor: '[]'} - } - }; - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewResume = function (config) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-resume'), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(config.resume), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-resume-words'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Click to Resume'), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$uploadDecoder = A3( - _elm_lang$core$Json_Decode$map2, - F2( - function (v0, v1) { - return {ctor: '_Tuple2', _0: v0, _1: v1}; - }), - A2(_elm_lang$core$Json_Decode$field, 'metadata', _elm_lang$virtual_dom$VirtualDom_Metadata$decoder), - A2(_elm_lang$core$Json_Decode$field, 'history', _elm_lang$core$Json_Decode$value)); -var _elm_lang$virtual_dom$VirtualDom_Overlay$close = F2( - function (msg, state) { - var _p9 = state; - switch (_p9.ctor) { - case 'None': - return _elm_lang$core$Maybe$Nothing; - case 'BadMetadata': - return _elm_lang$core$Maybe$Nothing; - case 'BadImport': - return _elm_lang$core$Maybe$Nothing; - default: - var _p10 = msg; - if (_p10.ctor === 'Cancel') { - return _elm_lang$core$Maybe$Nothing; - } else { - return _elm_lang$core$Maybe$Just(_p9._1); - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$isBlocking = function (state) { - var _p11 = state; - if (_p11.ctor === 'None') { - return false; - } else { - return true; - } -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Config = F5( - function (a, b, c, d, e) { - return {resume: a, open: b, importHistory: c, exportHistory: d, wrap: e}; - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$RiskyImport = F2( - function (a, b) { - return {ctor: 'RiskyImport', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$BadImport = function (a) { - return {ctor: 'BadImport', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$corruptImport = _elm_lang$virtual_dom$VirtualDom_Overlay$BadImport(_elm_lang$virtual_dom$VirtualDom_Report$CorruptHistory); -var _elm_lang$virtual_dom$VirtualDom_Overlay$assessImport = F2( - function (metadata, jsonString) { - var _p12 = A2(_elm_lang$core$Json_Decode$decodeString, _elm_lang$virtual_dom$VirtualDom_Overlay$uploadDecoder, jsonString); - if (_p12.ctor === 'Err') { - return _elm_lang$core$Result$Err(_elm_lang$virtual_dom$VirtualDom_Overlay$corruptImport); - } else { - var _p14 = _p12._0._1; - var report = A2(_elm_lang$virtual_dom$VirtualDom_Metadata$check, _p12._0._0, metadata); - var _p13 = _elm_lang$virtual_dom$VirtualDom_Report$evaluate(report); - switch (_p13.ctor) { - case 'Impossible': - return _elm_lang$core$Result$Err( - _elm_lang$virtual_dom$VirtualDom_Overlay$BadImport(report)); - case 'Risky': - return _elm_lang$core$Result$Err( - A2(_elm_lang$virtual_dom$VirtualDom_Overlay$RiskyImport, report, _p14)); - default: - return _elm_lang$core$Result$Ok(_p14); - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$BadMetadata = function (a) { - return {ctor: 'BadMetadata', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$badMetadata = _elm_lang$virtual_dom$VirtualDom_Overlay$BadMetadata; -var _elm_lang$virtual_dom$VirtualDom_Overlay$None = {ctor: 'None'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$none = _elm_lang$virtual_dom$VirtualDom_Overlay$None; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Proceed = {ctor: 'Proceed'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Cancel = {ctor: 'Cancel'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewButtons = function (buttons) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-buttons'), - _1: {ctor: '[]'} - }, - function () { - var _p15 = buttons; - if (_p15.ctor === 'Accept') { - return { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'button', - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Overlay$Proceed), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p15._0), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - }; - } else { - return { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'button', - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Overlay$Cancel), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p15._0), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'button', - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Overlay$Proceed), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(_p15._1), - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }; - } - }()); -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Message = {ctor: 'Message'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage = F4( - function (config, title, details, buttons) { - return { - ctor: '_Tuple2', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$Message, - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-title'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(title), - _1: {ctor: '[]'} - }), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay-message-details'), - _1: {ctor: '[]'} - }, - details), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - config.wrap, - _elm_lang$virtual_dom$VirtualDom_Overlay$viewButtons(buttons)), - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - } - }; - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$Pause = {ctor: 'Pause'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Normal = {ctor: 'Normal'}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$Choose = F2( - function (a, b) { - return {ctor: 'Choose', _0: a, _1: b}; - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$Accept = function (a) { - return {ctor: 'Accept', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Overlay$viewHelp = F5( - function (config, isPaused, isOpen, numMsgs, state) { - var _p16 = state; - switch (_p16.ctor) { - case 'None': - var miniControls = isOpen ? {ctor: '[]'} : { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewMiniControls, config, numMsgs), - _1: {ctor: '[]'} - }; - return { - ctor: '_Tuple2', - _0: isPaused ? _elm_lang$virtual_dom$VirtualDom_Overlay$Pause : _elm_lang$virtual_dom$VirtualDom_Overlay$Normal, - _1: (isPaused && (!isOpen)) ? { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Overlay$viewResume(config), - _1: miniControls - } : miniControls - }; - case 'BadMetadata': - return A4( - _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage, - config, - 'Cannot use Import or Export', - _elm_lang$virtual_dom$VirtualDom_Overlay$viewBadMetadata(_p16._0), - _elm_lang$virtual_dom$VirtualDom_Overlay$Accept('Ok')); - case 'BadImport': - return A4( - _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage, - config, - 'Cannot Import History', - A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewReport, true, _p16._0), - _elm_lang$virtual_dom$VirtualDom_Overlay$Accept('Ok')); - default: - return A4( - _elm_lang$virtual_dom$VirtualDom_Overlay$viewMessage, - config, - 'Warning', - A2(_elm_lang$virtual_dom$VirtualDom_Overlay$viewReport, false, _p16._0), - A2(_elm_lang$virtual_dom$VirtualDom_Overlay$Choose, 'Cancel', 'Import Anyway')); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Overlay$view = F5( - function (config, isPaused, isOpen, numMsgs, state) { - var _p17 = A5(_elm_lang$virtual_dom$VirtualDom_Overlay$viewHelp, config, isPaused, isOpen, numMsgs, state); - var block = _p17._0; - var nodes = _p17._1; - return { - ctor: '_Tuple2', - _0: block, - _1: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('elm-overlay'), - _1: {ctor: '[]'} - }, - {ctor: '::', _0: _elm_lang$virtual_dom$VirtualDom_Overlay$styles, _1: nodes}) - }; - }); - -var _elm_lang$virtual_dom$VirtualDom_Debug$styles = A3( - _elm_lang$virtual_dom$VirtualDom_Helpers$node, - 'style', - {ctor: '[]'}, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('\n\nhtml {\n overflow: hidden;\n height: 100%;\n}\n\nbody {\n height: 100%;\n overflow: auto;\n}\n\n#debugger {\n width: 100%\n height: 100%;\n font-family: monospace;\n}\n\n#values {\n display: block;\n float: left;\n height: 100%;\n width: calc(100% - 30ch);\n margin: 0;\n overflow: auto;\n cursor: default;\n}\n\n.debugger-sidebar {\n display: block;\n float: left;\n width: 30ch;\n height: 100%;\n color: white;\n background-color: rgb(61, 61, 61);\n}\n\n.debugger-sidebar-controls {\n width: 100%;\n text-align: center;\n background-color: rgb(50, 50, 50);\n}\n\n.debugger-sidebar-controls-import-export {\n width: 100%;\n height: 24px;\n line-height: 24px;\n font-size: 12px;\n}\n\n.debugger-sidebar-controls-resume {\n width: 100%;\n height: 30px;\n line-height: 30px;\n cursor: pointer;\n}\n\n.debugger-sidebar-controls-resume:hover {\n background-color: rgb(41, 41, 41);\n}\n\n.debugger-sidebar-messages {\n width: 100%;\n overflow-y: auto;\n height: calc(100% - 24px);\n}\n\n.debugger-sidebar-messages-paused {\n width: 100%;\n overflow-y: auto;\n height: calc(100% - 54px);\n}\n\n.messages-entry {\n cursor: pointer;\n width: 100%;\n}\n\n.messages-entry:hover {\n background-color: rgb(41, 41, 41);\n}\n\n.messages-entry-selected, .messages-entry-selected:hover {\n background-color: rgb(10, 10, 10);\n}\n\n.messages-entry-content {\n width: calc(100% - 7ch);\n padding-top: 4px;\n padding-bottom: 4px;\n padding-left: 1ch;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n}\n\n.messages-entry-index {\n color: #666;\n width: 5ch;\n padding-top: 4px;\n padding-bottom: 4px;\n padding-right: 1ch;\n text-align: right;\n display: block;\n float: right;\n}\n\n'), - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$button = F2( - function (msg, label) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$span, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(msg), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$style( - { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'cursor', _1: 'pointer'}, - _1: {ctor: '[]'} - }), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(label), - _1: {ctor: '[]'} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel = function (state) { - var _p0 = state; - if (_p0.ctor === 'Running') { - return _p0._0; - } else { - return _p0._2; - } -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata = F2( - function (model, func) { - var _p1 = model.metadata; - if (_p1.ctor === 'Ok') { - return func(_p1._0); - } else { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$badMetadata(_p1._0) - }), - {ctor: '[]'}); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$Model = F6( - function (a, b, c, d, e, f) { - return {history: a, state: b, expando: c, metadata: d, overlay: e, isDebuggerOpen: f}; - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$Paused = F3( - function (a, b, c) { - return {ctor: 'Paused', _0: a, _1: b, _2: c}; - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$Running = function (a) { - return {ctor: 'Running', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$loadNewHistory = F3( - function (rawHistory, userUpdate, model) { - var pureUserUpdate = F2( - function (msg, userModel) { - return _elm_lang$core$Tuple$first( - A2(userUpdate, msg, userModel)); - }); - var initialUserModel = _elm_lang$virtual_dom$VirtualDom_History$initialModel(model.history); - var decoder = A2(_elm_lang$virtual_dom$VirtualDom_History$decoder, initialUserModel, pureUserUpdate); - var _p2 = A2(_elm_lang$core$Json_Decode$decodeValue, decoder, rawHistory); - if (_p2.ctor === 'Err') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$corruptImport}), - {ctor: '[]'}); - } else { - var _p3 = _p2._0._0; - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - history: _p2._0._1, - state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(_p3), - expando: _elm_lang$virtual_dom$VirtualDom_Expando$init(_p3), - overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$none - }), - {ctor: '[]'}); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$OverlayMsg = function (a) { - return {ctor: 'OverlayMsg', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Upload = function (a) { - return {ctor: 'Upload', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$upload = A2(_elm_lang$core$Task$perform, _elm_lang$virtual_dom$VirtualDom_Debug$Upload, _elm_lang$virtual_dom$Native_Debug.upload); -var _elm_lang$virtual_dom$VirtualDom_Debug$Export = {ctor: 'Export'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Import = {ctor: 'Import'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Down = {ctor: 'Down'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Up = {ctor: 'Up'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Close = {ctor: 'Close'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Open = {ctor: 'Open'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Jump = function (a) { - return {ctor: 'Jump', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$Resume = {ctor: 'Resume'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$overlayConfig = {resume: _elm_lang$virtual_dom$VirtualDom_Debug$Resume, open: _elm_lang$virtual_dom$VirtualDom_Debug$Open, importHistory: _elm_lang$virtual_dom$VirtualDom_Debug$Import, exportHistory: _elm_lang$virtual_dom$VirtualDom_Debug$Export, wrap: _elm_lang$virtual_dom$VirtualDom_Debug$OverlayMsg}; -var _elm_lang$virtual_dom$VirtualDom_Debug$viewIn = function (_p4) { - var _p5 = _p4; - var isPaused = function () { - var _p6 = _p5.state; - if (_p6.ctor === 'Running') { - return false; - } else { - return true; - } - }(); - return A5( - _elm_lang$virtual_dom$VirtualDom_Overlay$view, - _elm_lang$virtual_dom$VirtualDom_Debug$overlayConfig, - isPaused, - _p5.isDebuggerOpen, - _elm_lang$virtual_dom$VirtualDom_History$size(_p5.history), - _p5.overlay); -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$resumeButton = A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$onClick(_elm_lang$virtual_dom$VirtualDom_Debug$Resume), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar-controls-resume'), - _1: {ctor: '[]'} - } - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text('Resume'), - _1: {ctor: '[]'} - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$viewResumeButton = function (maybeIndex) { - var _p7 = maybeIndex; - if (_p7.ctor === 'Nothing') { - return _elm_lang$virtual_dom$VirtualDom_Helpers$text(''); - } else { - return _elm_lang$virtual_dom$VirtualDom_Debug$resumeButton; - } -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$playButton = function (maybeIndex) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar-controls'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Debug$viewResumeButton(maybeIndex), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar-controls-import-export'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$button, _elm_lang$virtual_dom$VirtualDom_Debug$Import, 'Import'), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$text(' / '), - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$button, _elm_lang$virtual_dom$VirtualDom_Debug$Export, 'Export'), - _1: {ctor: '[]'} - } - } - }), - _1: {ctor: '[]'} - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$viewSidebar = F2( - function (state, history) { - var maybeIndex = function () { - var _p8 = state; - if (_p8.ctor === 'Running') { - return _elm_lang$core$Maybe$Nothing; - } else { - return _elm_lang$core$Maybe$Just(_p8._0); - } - }(); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$class('debugger-sidebar'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - _elm_lang$virtual_dom$VirtualDom_Debug$Jump, - A2(_elm_lang$virtual_dom$VirtualDom_History$view, maybeIndex, history)), - _1: { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Debug$playButton(maybeIndex), - _1: {ctor: '[]'} - } - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$ExpandoMsg = function (a) { - return {ctor: 'ExpandoMsg', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$viewOut = function (_p9) { - var _p10 = _p9; - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$id('debugger'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Debug$styles, - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$viewSidebar, _p10.state, _p10.history), - _1: { - ctor: '::', - _0: A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - _elm_lang$virtual_dom$VirtualDom_Debug$ExpandoMsg, - A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$div, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Helpers$id('values'), - _1: {ctor: '[]'} - }, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Expando$view, _elm_lang$core$Maybe$Nothing, _p10.expando), - _1: {ctor: '[]'} - })), - _1: {ctor: '[]'} - } - } - }); -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg = function (a) { - return {ctor: 'UserMsg', _0: a}; -}; -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapInit = F2( - function (metadata, _p11) { - var _p12 = _p11; - var _p13 = _p12._0; - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - { - history: _elm_lang$virtual_dom$VirtualDom_History$empty(_p13), - state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(_p13), - expando: _elm_lang$virtual_dom$VirtualDom_Expando$init(_p13), - metadata: _elm_lang$virtual_dom$VirtualDom_Metadata$decode(metadata), - overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$none, - isDebuggerOpen: false - }, - { - ctor: '::', - _0: A2(_elm_lang$core$Platform_Cmd$map, _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, _p12._1), - _1: {ctor: '[]'} - }); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapSubs = F2( - function (userSubscriptions, _p14) { - var _p15 = _p14; - return A2( - _elm_lang$core$Platform_Sub$map, - _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, - userSubscriptions( - _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel(_p15.state))); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapView = F2( - function (userView, _p16) { - var _p17 = _p16; - var currentModel = function () { - var _p18 = _p17.state; - if (_p18.ctor === 'Running') { - return _p18._0; - } else { - return _p18._1; - } - }(); - return A2( - _elm_lang$virtual_dom$VirtualDom_Helpers$map, - _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, - userView(currentModel)); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$NoOp = {ctor: 'NoOp'}; -var _elm_lang$virtual_dom$VirtualDom_Debug$download = F2( - function (metadata, history) { - var json = _elm_lang$core$Json_Encode$object( - { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'metadata', - _1: _elm_lang$virtual_dom$VirtualDom_Metadata$encode(metadata) - }, - _1: { - ctor: '::', - _0: { - ctor: '_Tuple2', - _0: 'history', - _1: _elm_lang$virtual_dom$VirtualDom_History$encode(history) - }, - _1: {ctor: '[]'} - } - }); - var historyLength = _elm_lang$virtual_dom$VirtualDom_History$size(history); - return A2( - _elm_lang$core$Task$perform, - function (_p19) { - return _elm_lang$virtual_dom$VirtualDom_Debug$NoOp; - }, - A2(_elm_lang$virtual_dom$Native_Debug.download, historyLength, json)); - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$runIf = F2( - function (bool, task) { - return bool ? A2( - _elm_lang$core$Task$perform, - _elm_lang$core$Basics$always(_elm_lang$virtual_dom$VirtualDom_Debug$NoOp), - task) : _elm_lang$core$Platform_Cmd$none; - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$updateUserMsg = F4( - function (userUpdate, scrollTask, userMsg, _p20) { - var _p21 = _p20; - var _p25 = _p21.state; - var _p24 = _p21; - var userModel = _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel(_p25); - var newHistory = A3(_elm_lang$virtual_dom$VirtualDom_History$add, userMsg, userModel, _p21.history); - var _p22 = A2(userUpdate, userMsg, userModel); - var newUserModel = _p22._0; - var userCmds = _p22._1; - var commands = A2(_elm_lang$core$Platform_Cmd$map, _elm_lang$virtual_dom$VirtualDom_Debug$UserMsg, userCmds); - var _p23 = _p25; - if (_p23.ctor === 'Running') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - _p24, - { - history: newHistory, - state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(newUserModel), - expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$merge, newUserModel, _p21.expando) - }), - { - ctor: '::', - _0: commands, - _1: { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$runIf, _p24.isDebuggerOpen, scrollTask), - _1: {ctor: '[]'} - } - }); - } else { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - _p24, - { - history: newHistory, - state: A3(_elm_lang$virtual_dom$VirtualDom_Debug$Paused, _p23._0, _p23._1, newUserModel) - }), - { - ctor: '::', - _0: commands, - _1: {ctor: '[]'} - }); - } - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapUpdate = F4( - function (userUpdate, scrollTask, msg, model) { - wrapUpdate: - while (true) { - var _p26 = msg; - switch (_p26.ctor) { - case 'NoOp': - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - {ctor: '[]'}); - case 'UserMsg': - return A4(_elm_lang$virtual_dom$VirtualDom_Debug$updateUserMsg, userUpdate, scrollTask, _p26._0, model); - case 'ExpandoMsg': - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$update, _p26._0, model.expando) - }), - {ctor: '[]'}); - case 'Resume': - var _p27 = model.state; - if (_p27.ctor === 'Running') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - {ctor: '[]'}); - } else { - var _p28 = _p27._2; - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - state: _elm_lang$virtual_dom$VirtualDom_Debug$Running(_p28), - expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$merge, _p28, model.expando) - }), - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$runIf, model.isDebuggerOpen, scrollTask), - _1: {ctor: '[]'} - }); - } - case 'Jump': - var _p30 = _p26._0; - var _p29 = A3(_elm_lang$virtual_dom$VirtualDom_History$get, userUpdate, _p30, model.history); - var indexModel = _p29._0; - var indexMsg = _p29._1; - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - { - state: A3( - _elm_lang$virtual_dom$VirtualDom_Debug$Paused, - _p30, - indexModel, - _elm_lang$virtual_dom$VirtualDom_Debug$getLatestModel(model.state)), - expando: A2(_elm_lang$virtual_dom$VirtualDom_Expando$merge, indexModel, model.expando) - }), - {ctor: '[]'}); - case 'Open': - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {isDebuggerOpen: true}), - {ctor: '[]'}); - case 'Close': - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {isDebuggerOpen: false}), - {ctor: '[]'}); - case 'Up': - var index = function () { - var _p31 = model.state; - if (_p31.ctor === 'Paused') { - return _p31._0; - } else { - return _elm_lang$virtual_dom$VirtualDom_History$size(model.history); - } - }(); - if (_elm_lang$core$Native_Utils.cmp(index, 0) > 0) { - var _v17 = userUpdate, - _v18 = scrollTask, - _v19 = _elm_lang$virtual_dom$VirtualDom_Debug$Jump(index - 1), - _v20 = model; - userUpdate = _v17; - scrollTask = _v18; - msg = _v19; - model = _v20; - continue wrapUpdate; - } else { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - {ctor: '[]'}); - } - case 'Down': - var _p32 = model.state; - if (_p32.ctor === 'Running') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - {ctor: '[]'}); - } else { - var _p33 = _p32._0; - if (_elm_lang$core$Native_Utils.eq( - _p33, - _elm_lang$virtual_dom$VirtualDom_History$size(model.history) - 1)) { - var _v22 = userUpdate, - _v23 = scrollTask, - _v24 = _elm_lang$virtual_dom$VirtualDom_Debug$Resume, - _v25 = model; - userUpdate = _v22; - scrollTask = _v23; - msg = _v24; - model = _v25; - continue wrapUpdate; - } else { - var _v26 = userUpdate, - _v27 = scrollTask, - _v28 = _elm_lang$virtual_dom$VirtualDom_Debug$Jump(_p33 + 1), - _v29 = model; - userUpdate = _v26; - scrollTask = _v27; - msg = _v28; - model = _v29; - continue wrapUpdate; - } - } - case 'Import': - return A2( - _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata, - model, - function (_p34) { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - { - ctor: '::', - _0: _elm_lang$virtual_dom$VirtualDom_Debug$upload, - _1: {ctor: '[]'} - }); - }); - case 'Export': - return A2( - _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata, - model, - function (metadata) { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - model, - { - ctor: '::', - _0: A2(_elm_lang$virtual_dom$VirtualDom_Debug$download, metadata, model.history), - _1: {ctor: '[]'} - }); - }); - case 'Upload': - return A2( - _elm_lang$virtual_dom$VirtualDom_Debug$withGoodMetadata, - model, - function (metadata) { - var _p35 = A2(_elm_lang$virtual_dom$VirtualDom_Overlay$assessImport, metadata, _p26._0); - if (_p35.ctor === 'Err') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {overlay: _p35._0}), - {ctor: '[]'}); - } else { - return A3(_elm_lang$virtual_dom$VirtualDom_Debug$loadNewHistory, _p35._0, userUpdate, model); - } - }); - default: - var _p36 = A2(_elm_lang$virtual_dom$VirtualDom_Overlay$close, _p26._0, model.overlay); - if (_p36.ctor === 'Nothing') { - return A2( - _elm_lang$core$Platform_Cmd_ops['!'], - _elm_lang$core$Native_Utils.update( - model, - {overlay: _elm_lang$virtual_dom$VirtualDom_Overlay$none}), - {ctor: '[]'}); - } else { - return A3(_elm_lang$virtual_dom$VirtualDom_Debug$loadNewHistory, _p36._0, userUpdate, model); - } - } - } - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrap = F2( - function (metadata, _p37) { - var _p38 = _p37; - return { - init: A2(_elm_lang$virtual_dom$VirtualDom_Debug$wrapInit, metadata, _p38.init), - view: _elm_lang$virtual_dom$VirtualDom_Debug$wrapView(_p38.view), - update: _elm_lang$virtual_dom$VirtualDom_Debug$wrapUpdate(_p38.update), - viewIn: _elm_lang$virtual_dom$VirtualDom_Debug$viewIn, - viewOut: _elm_lang$virtual_dom$VirtualDom_Debug$viewOut, - subscriptions: _elm_lang$virtual_dom$VirtualDom_Debug$wrapSubs(_p38.subscriptions) - }; - }); -var _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags = F2( - function (metadata, _p39) { - var _p40 = _p39; - return { - init: function (flags) { - return A2( - _elm_lang$virtual_dom$VirtualDom_Debug$wrapInit, - metadata, - _p40.init(flags)); - }, - view: _elm_lang$virtual_dom$VirtualDom_Debug$wrapView(_p40.view), - update: _elm_lang$virtual_dom$VirtualDom_Debug$wrapUpdate(_p40.update), - viewIn: _elm_lang$virtual_dom$VirtualDom_Debug$viewIn, - viewOut: _elm_lang$virtual_dom$VirtualDom_Debug$viewOut, - subscriptions: _elm_lang$virtual_dom$VirtualDom_Debug$wrapSubs(_p40.subscriptions) - }; - }); - var _elm_lang$virtual_dom$VirtualDom$programWithFlags = function (impl) { return A2(_elm_lang$virtual_dom$Native_VirtualDom.programWithFlags, _elm_lang$virtual_dom$VirtualDom_Debug$wrapWithFlags, impl); }; @@ -18386,9 +14427,22 @@ var _user$project$Views_FilterView$getFilter = F3( }); var _user$project$Views_FilterView$filterChoiceView = F4( function (filter, currentFilters, eventInstances, slugLike) { - var locationIcon = function () { + var videoIcon = function () { var _p5 = filter; - if (_p5.ctor === 'LocationFilter') { + if (_p5.ctor === 'VideoFilter') { + var icon = function () { + var _p6 = _p5._1; + switch (_p6) { + case 'has-recording': + return 'film'; + case 'to-be-recorded': + return 'video-camera'; + case 'not-to-be-recorded': + return 'ban'; + default: + return ''; + } + }(); return { ctor: '::', _0: A2( @@ -18403,7 +14457,43 @@ var _user$project$Views_FilterView$filterChoiceView = F4( ctor: '::', _0: { ctor: '_Tuple2', - _0: A2(_elm_lang$core$Basics_ops['++'], 'fa-', _p5._2), + _0: A2(_elm_lang$core$Basics_ops['++'], 'fa-', icon), + _1: true + }, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: {ctor: '[]'} + }; + } else { + return {ctor: '[]'}; + } + }(); + var locationIcon = function () { + var _p7 = filter; + if (_p7.ctor === 'LocationFilter') { + return { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: { + ctor: '_Tuple2', + _0: A2(_elm_lang$core$Basics_ops['++'], 'fa-', _p7._2), _1: true }, _1: { @@ -18423,20 +14513,20 @@ var _user$project$Views_FilterView$filterChoiceView = F4( } }(); var buttonStyle = function () { - var _p6 = filter; - if (_p6.ctor === 'TypeFilter') { + var _p8 = filter; + if (_p8.ctor === 'TypeFilter') { return { ctor: '::', _0: _elm_lang$html$Html_Attributes$style( { ctor: '::', - _0: {ctor: '_Tuple2', _0: 'backgroundColor', _1: _p6._2}, + _0: {ctor: '_Tuple2', _0: 'backgroundColor', _1: _p8._2}, _1: { ctor: '::', _0: { ctor: '_Tuple2', _0: 'color', - _1: _p6._3 ? '#fff' : '#000' + _1: _p8._3 ? '#fff' : '#000' }, _1: { ctor: '::', @@ -18455,9 +14545,9 @@ var _user$project$Views_FilterView$filterChoiceView = F4( return {ctor: '[]'}; } }(); - var _p7 = _user$project$Models$unpackFilterType(filter); - var name = _p7._0; - var slug = _p7._1; + var _p9 = _user$project$Models$unpackFilterType(filter); + var name = _p9._0; + var slug = _p9._1; var eventInstanceCount = _elm_lang$core$List$length( A2( _elm_lang$core$List$filter, @@ -18573,7 +14663,7 @@ var _user$project$Views_FilterView$filterChoiceView = F4( }), _1: {ctor: '[]'} }, - locationIcon)), + A2(_elm_lang$core$Basics_ops['++'], locationIcon, videoIcon))), _1: {ctor: '[]'} }), _1: {ctor: '[]'} @@ -18608,7 +14698,7 @@ var _user$project$Views_FilterView$videoRecordingFilters = { _0: A2(_user$project$Models$VideoFilter, 'Will not be recorded', 'not-to-be-recorded'), _1: { ctor: '::', - _0: A2(_user$project$Models$VideoFilter, 'Will recorded', 'to-be-recorded'), + _0: A2(_user$project$Models$VideoFilter, 'Will be recorded', 'to-be-recorded'), _1: { ctor: '::', _0: A2(_user$project$Models$VideoFilter, 'Has recording', 'has-recording'), @@ -20245,6 +16335,32 @@ var _user$project$Views_ScheduleOverview$dayEventInstanceIcons = function (event {ctor: '[]'}), _1: {ctor: '[]'} }; + case 'not-to-be-recorded': + return { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-ban', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'pull-right', _1: true}, + _1: {ctor: '[]'} + } + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: {ctor: '[]'} + }; default: return {ctor: '[]'}; } @@ -20563,7 +16679,7 @@ var _user$project$Main$main = A2( var Elm = {}; Elm['Main'] = Elm['Main'] || {}; if (typeof _user$project$Main$main !== 'undefined') { - _user$project$Main$main(Elm['Main'], 'Main', {"types":{"unions":{"Messages.Msg":{"args":[],"tags":{"OnLocationChange":["Navigation.Location"],"ToggleFilter":["Models.FilterType"],"WebSocketPayload":["String"],"NoOp":[],"BackInHistory":[]}},"Models.FilterType":{"args":[],"tags":{"TypeFilter":["Models.FilterName","Models.FilterSlug","Models.TypeColor","Models.TypeLightText"],"LocationFilter":["Models.FilterName","Models.FilterSlug","Models.LocationIcon"],"VideoFilter":["Models.FilterName","Models.FilterSlug"]}}},"aliases":{"Models.LocationIcon":{"args":[],"type":"String"},"Models.FilterName":{"args":[],"type":"String"},"Models.TypeColor":{"args":[],"type":"String"},"Models.FilterSlug":{"args":[],"type":"String"},"Navigation.Location":{"args":[],"type":"{ href : String , host : String , hostname : String , protocol : String , origin : String , port_ : String , pathname : String , search : String , hash : String , username : String , password : String }"},"Models.TypeLightText":{"args":[],"type":"Bool"}},"message":"Messages.Msg"},"versions":{"elm":"0.18.0"}}); + _user$project$Main$main(Elm['Main'], 'Main', undefined); } if (typeof define === "function" && define['amd']) From 8055071b8bbf909db036ed45c17d787c8a05eeee Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 19:58:04 +0200 Subject: [PATCH 46/54] Adding ICS button. Make sidebar not sticky. --- schedule/src/Views/FilterView.elm | 34 +++++++++++++++++++++++++++---- src/static_src/css/bornhack.css | 4 ---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/schedule/src/Views/FilterView.elm b/schedule/src/Views/FilterView.elm index 333b7621..8a641868 100644 --- a/schedule/src/Views/FilterView.elm +++ b/schedule/src/Views/FilterView.elm @@ -14,8 +14,8 @@ import Regex -- External modules -import Html exposing (Html, text, div, ul, li, span, i, h4, small) -import Html.Attributes exposing (class, classList, style) +import Html exposing (Html, text, div, ul, li, span, i, h4, small, a) +import Html.Attributes exposing (class, classList, style, href) import Html.Events exposing (onClick) import Date.Extra exposing (Interval(..), equalBy) @@ -60,9 +60,7 @@ filterSidebar model = [ classList [ ( "col-sm-3", True ) , ( "col-sm-push-9", True ) - , ( "schedule-sidebar", True ) , ( "schedule-filter", True ) - , ( "sticky", True ) ] ] [ h4 [] [ text "Filter" ] @@ -86,9 +84,37 @@ filterSidebar model = model.eventInstances .videoState ] + , icsButton model ] +icsButton : Model -> Html Msg +icsButton model = + let + filterString = + case filterToString model.filter of + "" -> + "" + + filter -> + "?" ++ filter + + icsURL = + model.flags.ics_button_href ++ filterString + in + a + [ classList + [ ( "btn", True ) + , ( "btn-default", True ) + ] + , href <| icsURL + ] + [ i [ classList [ ( "fa", True ), ( "fa-calendar", True ) ] ] + [] + , text " ICS file with these filters" + ] + + videoRecordingFilters : List FilterType videoRecordingFilters = [ VideoFilter "Will not be recorded" "not-to-be-recorded" diff --git a/src/static_src/css/bornhack.css b/src/static_src/css/bornhack.css index 48ee6176..84b3c188 100644 --- a/src/static_src/css/bornhack.css +++ b/src/static_src/css/bornhack.css @@ -233,10 +233,6 @@ footer { } } -.schedule-sidebar { - top: 120px; -} - .sticky { position: sticky; background-color: #fff; From 93ed88d64184c1c3263ea33c211601635332d77f Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 19:58:26 +0200 Subject: [PATCH 47/54] Compile! --- src/program/static/js/elm_based_schedule.js | 74 ++++++++++++++++++--- 1 file changed, 63 insertions(+), 11 deletions(-) diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js index 7971e41d..8785893a 100644 --- a/src/program/static/js/elm_based_schedule.js +++ b/src/program/static/js/elm_based_schedule.js @@ -14713,6 +14713,62 @@ var _user$project$Views_FilterView$parseFilterFromQuery = F2( var types = A3(_user$project$Views_FilterView$getFilter, 'type', model.eventTypes, query); return {eventTypes: types, eventLocations: locations, videoRecording: videoFilters}; }); +var _user$project$Views_FilterView$icsButton = function (model) { + var filterString = function () { + var _p10 = _user$project$Views_FilterView$filterToString(model.filter); + if (_p10 === '') { + return ''; + } else { + return A2(_elm_lang$core$Basics_ops['++'], '?', _p10); + } + }(); + var icsURL = A2(_elm_lang$core$Basics_ops['++'], model.flags.ics_button_href, filterString); + return A2( + _elm_lang$html$Html$a, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'btn-default', _1: true}, + _1: {ctor: '[]'} + } + }), + _1: { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$href(icsURL), + _1: {ctor: '[]'} + } + }, + { + ctor: '::', + _0: A2( + _elm_lang$html$Html$i, + { + ctor: '::', + _0: _elm_lang$html$Html_Attributes$classList( + { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa', _1: true}, + _1: { + ctor: '::', + _0: {ctor: '_Tuple2', _0: 'fa-calendar', _1: true}, + _1: {ctor: '[]'} + } + }), + _1: {ctor: '[]'} + }, + {ctor: '[]'}), + _1: { + ctor: '::', + _0: _elm_lang$html$Html$text(' ICS file with these filters'), + _1: {ctor: '[]'} + } + }); +}; var _user$project$Views_FilterView$filterSidebar = function (model) { return A2( _elm_lang$html$Html$div, @@ -14727,16 +14783,8 @@ var _user$project$Views_FilterView$filterSidebar = function (model) { _0: {ctor: '_Tuple2', _0: 'col-sm-push-9', _1: true}, _1: { ctor: '::', - _0: {ctor: '_Tuple2', _0: 'schedule-sidebar', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'schedule-filter', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'sticky', _1: true}, - _1: {ctor: '[]'} - } - } + _0: {ctor: '_Tuple2', _0: 'schedule-filter', _1: true}, + _1: {ctor: '[]'} } } }), @@ -14798,7 +14846,11 @@ var _user$project$Views_FilterView$filterSidebar = function (model) { } } }), - _1: {ctor: '[]'} + _1: { + ctor: '::', + _0: _user$project$Views_FilterView$icsButton(model), + _1: {ctor: '[]'} + } } }); }; From 99fa18c14dbaac28e49795ded851339d6070ce0a Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 21:10:27 +0200 Subject: [PATCH 48/54] Fix events right up to each other. Unstick sidebar on event detail. --- schedule/src/Views/DayView.elm | 2 +- schedule/src/Views/EventDetail.elm | 2 -- src/program/static/js/elm_based_schedule.js | 12 ++---------- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/schedule/src/Views/DayView.elm b/schedule/src/Views/DayView.elm index 5721df37..a7ee4b72 100644 --- a/schedule/src/Views/DayView.elm +++ b/schedule/src/Views/DayView.elm @@ -151,7 +151,7 @@ renderGroup offset group = else if (Date.Extra.equal instanceB.from instanceA.from) && not (Date.Extra.equal instanceB.to instanceA.to) then -- Set to 0 and then fix it further down in the code 0 - else if Date.Extra.isBetween instanceB.from instanceB.to instanceA.from then + else if (Date.Extra.isBetween instanceB.from instanceB.to instanceA.from) && not (Date.Extra.equal instanceA.from instanceB.to) then 1 else 0 diff --git a/schedule/src/Views/EventDetail.elm b/schedule/src/Views/EventDetail.elm index 47e67005..93e35451 100644 --- a/schedule/src/Views/EventDetail.elm +++ b/schedule/src/Views/EventDetail.elm @@ -119,8 +119,6 @@ eventDetailSidebar event model = div [ classList [ ( "col-sm-3", True ) - , ( "schedule-sidebar", True ) - , ( "sticky", True ) ] ] (videoRecordingLink diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js index 8785893a..a5ef4896 100644 --- a/src/program/static/js/elm_based_schedule.js +++ b/src/program/static/js/elm_based_schedule.js @@ -15299,7 +15299,7 @@ var _user$project$Views_DayView$renderGroup = F2( A2( _elm_lang$core$List$map, function (instanceB) { - return _elm_lang$core$Native_Utils.eq(instanceA, instanceB) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to)) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && (!A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to))) ? 0 : (A3(_justinmimbs$elm_date_extra$Date_Extra$isBetween, instanceB.from, instanceB.to, instanceA.from) ? 1 : 0))); + return _elm_lang$core$Native_Utils.eq(instanceA, instanceB) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to)) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && (!A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to))) ? 0 : ((A3(_justinmimbs$elm_date_extra$Date_Extra$isBetween, instanceB.from, instanceB.to, instanceA.from) && (!A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceA.from, instanceB.to))) ? 1 : 0))); }, sortedGroup)) }; @@ -15955,15 +15955,7 @@ var _user$project$Views_EventDetail$eventDetailSidebar = F2( { ctor: '::', _0: {ctor: '_Tuple2', _0: 'col-sm-3', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'schedule-sidebar', _1: true}, - _1: { - ctor: '::', - _0: {ctor: '_Tuple2', _0: 'sticky', _1: true}, - _1: {ctor: '[]'} - } - } + _1: {ctor: '[]'} }), _1: {ctor: '[]'} }, From 5c9e5482f5b30e1225f393e32fe852e2b43cfb55 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 22:39:48 +0200 Subject: [PATCH 49/54] Really fixing bordering events this time. --- schedule/src/Views/DayView.elm | 6 ++++-- src/program/static/js/elm_based_schedule.js | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/schedule/src/Views/DayView.elm b/schedule/src/Views/DayView.elm index a7ee4b72..1d96af77 100644 --- a/schedule/src/Views/DayView.elm +++ b/schedule/src/Views/DayView.elm @@ -83,7 +83,9 @@ locationColumn columnWidth eventInstances offset minutes location = overlappingGroups = List.Extra.groupWhile - (\instanceA instanceB -> Date.Extra.isBetween instanceA.from instanceA.to instanceB.from) + (\instanceA instanceB -> + (Date.Extra.isBetween instanceB.from instanceB.to instanceA.from) && not (Date.Extra.equal instanceA.from instanceB.to) + ) locationInstances in div @@ -151,7 +153,7 @@ renderGroup offset group = else if (Date.Extra.equal instanceB.from instanceA.from) && not (Date.Extra.equal instanceB.to instanceA.to) then -- Set to 0 and then fix it further down in the code 0 - else if (Date.Extra.isBetween instanceB.from instanceB.to instanceA.from) && not (Date.Extra.equal instanceA.from instanceB.to) then + else if (Date.Extra.isBetween instanceB.from instanceB.to instanceA.from) then 1 else 0 diff --git a/src/program/static/js/elm_based_schedule.js b/src/program/static/js/elm_based_schedule.js index a5ef4896..f81c3f2e 100644 --- a/src/program/static/js/elm_based_schedule.js +++ b/src/program/static/js/elm_based_schedule.js @@ -15299,7 +15299,7 @@ var _user$project$Views_DayView$renderGroup = F2( A2( _elm_lang$core$List$map, function (instanceB) { - return _elm_lang$core$Native_Utils.eq(instanceA, instanceB) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to)) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && (!A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to))) ? 0 : ((A3(_justinmimbs$elm_date_extra$Date_Extra$isBetween, instanceB.from, instanceB.to, instanceA.from) && (!A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceA.from, instanceB.to))) ? 1 : 0))); + return _elm_lang$core$Native_Utils.eq(instanceA, instanceB) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to)) ? 0 : ((A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.from, instanceA.from) && (!A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceB.to, instanceA.to))) ? 0 : (A3(_justinmimbs$elm_date_extra$Date_Extra$isBetween, instanceB.from, instanceB.to, instanceA.from) ? 1 : 0))); }, sortedGroup)) }; @@ -15378,7 +15378,7 @@ var _user$project$Views_DayView$locationColumn = F5( _elm_community$list_extra$List_Extra$groupWhile, F2( function (instanceA, instanceB) { - return A3(_justinmimbs$elm_date_extra$Date_Extra$isBetween, instanceA.from, instanceA.to, instanceB.from); + return A3(_justinmimbs$elm_date_extra$Date_Extra$isBetween, instanceB.from, instanceB.to, instanceA.from) && (!A2(_justinmimbs$elm_date_extra$Date_Extra$equal, instanceA.from, instanceB.to)); }), locationInstances); return A2( From 93300f3b3098e4beb937e730f9c138335091f8b8 Mon Sep 17 00:00:00 2001 From: Vidir Valberg Gudmundsson Date: Wed, 16 Aug 2017 23:05:26 +0200 Subject: [PATCH 50/54] Change midnight offset from 6 to 9. --- src/bornhack/environment_settings.py.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bornhack/environment_settings.py.dist b/src/bornhack/environment_settings.py.dist index 09b56c8f..07400c5b 100644 --- a/src/bornhack/environment_settings.py.dist +++ b/src/bornhack/environment_settings.py.dist @@ -68,7 +68,7 @@ BANKACCOUNT_ACCOUNT='{{ accountno }}' TICKET_CATEGORY_NAME='Tickets' # schedule settings -SCHEDULE_MIDNIGHT_OFFSET_HOURS=6 +SCHEDULE_MIDNIGHT_OFFSET_HOURS=9 SCHEDULE_TIMESLOT_LENGTH_MINUTES=30 SCHEDULE_EVENT_NOTIFICATION_MINUTES=10 From bea270f8eb65d96ea817e07b2df5cbb1eb6f78f0 Mon Sep 17 00:00:00 2001 From: Stephan Telling Date: Thu, 17 Aug 2017 17:51:24 +0200 Subject: [PATCH 51/54] add new tickets app --- src/tickets/__init__.py | 0 src/tickets/admin.py | 38 ++++++++ src/tickets/apps.py | 5 + src/tickets/migrations/0001_initial.py | 96 +++++++++++++++++++ src/tickets/migrations/__init__.py | 0 src/tickets/models.py | 128 +++++++++++++++++++++++++ src/tickets/pdf.py | 0 src/tickets/templates/pdf/ticket.html | 32 +++++++ src/tickets/views.py | 3 + 9 files changed, 302 insertions(+) create mode 100644 src/tickets/__init__.py create mode 100644 src/tickets/admin.py create mode 100644 src/tickets/apps.py create mode 100644 src/tickets/migrations/0001_initial.py create mode 100644 src/tickets/migrations/__init__.py create mode 100644 src/tickets/models.py create mode 100644 src/tickets/pdf.py create mode 100644 src/tickets/templates/pdf/ticket.html create mode 100644 src/tickets/views.py diff --git a/src/tickets/__init__.py b/src/tickets/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tickets/admin.py b/src/tickets/admin.py new file mode 100644 index 00000000..2939c751 --- /dev/null +++ b/src/tickets/admin.py @@ -0,0 +1,38 @@ +from django.contrib import admin + +from .models import ( + TicketType, + SponsorTicket, + DiscountTicket, + ShopTicket +) + + +class BaseTicketAdmin(admin.ModelAdmin): + actions = ['generate_pdf'] + exclude = ['qrcode_base64'] + + def generate_pdf(self, request, queryset): + for ticket in queryset.all(): + ticket.generate_pdf() + generate_pdf.description = 'Generate PDF for the ticket' + + +@admin.register(TicketType) +class TicketTypeAdmin(admin.ModelAdmin): + pass + + +@admin.register(SponsorTicket) +class SponsorTicketAdmin(BaseTicketAdmin): + pass + + +@admin.register(DiscountTicket) +class DiscountTicketAdmin(BaseTicketAdmin): + pass + + +@admin.register(ShopTicket) +class ShopTicketAdmin(BaseTicketAdmin): + pass diff --git a/src/tickets/apps.py b/src/tickets/apps.py new file mode 100644 index 00000000..3ea742ac --- /dev/null +++ b/src/tickets/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class TicketsConfig(AppConfig): + name = 'tickets' diff --git a/src/tickets/migrations/0001_initial.py b/src/tickets/migrations/0001_initial.py new file mode 100644 index 00000000..bd4e36b5 --- /dev/null +++ b/src/tickets/migrations/0001_initial.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-08-17 14:22 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('shop', '0047_auto_20170522_1942'), + ('camps', '0022_camp_colour'), + ('sponsors', '0006_auto_20170715_1110'), + ] + + operations = [ + migrations.CreateModel( + name='BaseTicket', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('qrcode_base64', models.TextField(blank=True, null=True)), + ], + ), + migrations.CreateModel( + name='TicketType', + fields=[ + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('name', models.TextField()), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='DiscountTicket', + fields=[ + ('baseticket_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='tickets.BaseTicket')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('price', models.IntegerField(help_text='Price of the discounted ticket (in DKK, including VAT).')), + ], + options={ + 'abstract': False, + }, + bases=('tickets.baseticket', models.Model), + ), + migrations.CreateModel( + name='ShopTicket', + fields=[ + ('baseticket_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='tickets.BaseTicket')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('name', models.CharField(blank=True, help_text='Name of the person this ticket belongs to. This can be different from the buying user.', max_length=100, null=True)), + ('email', models.EmailField(blank=True, max_length=254, null=True)), + ('checked_in', models.BooleanField(default=False)), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='shoptickets', to='shop.Order')), + ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.Product')), + ], + options={ + 'abstract': False, + }, + bases=('tickets.baseticket', models.Model), + ), + migrations.CreateModel( + name='SponsorTicket', + fields=[ + ('baseticket_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, to='tickets.BaseTicket')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('sponsor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sponsors.Sponsor')), + ], + options={ + 'abstract': False, + }, + bases=('tickets.baseticket', models.Model), + ), + migrations.AddField( + model_name='baseticket', + name='camp', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='camps.Camp'), + ), + migrations.AddField( + model_name='baseticket', + name='ticket_type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tickets.TicketType'), + ), + ] diff --git a/src/tickets/migrations/__init__.py b/src/tickets/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tickets/models.py b/src/tickets/models.py new file mode 100644 index 00000000..923d9ff7 --- /dev/null +++ b/src/tickets/models.py @@ -0,0 +1,128 @@ +import io +import logging +import hashlib +import base64 +import qrcode + +from django.db import models +from django.conf import settings +from django.core.urlresolvers import reverse_lazy +from django.utils.translation import ugettext_lazy as _ + +from utils.models import ( + UUIDModel, + CreatedUpdatedModel +) +from shop.pdf import generate_pdf_letter + +logger = logging.getLogger("bornhack.%s" % __name__) + + +# TicketType can be full week, one day. etc. +class TicketType(CreatedUpdatedModel, UUIDModel): + name = models.TextField() + + def __str__(self): + return '{}'.format(self.name) + + +class BaseTicket(models.Model): + qrcode_base64 = models.TextField(null=True, blank=True) + ticket_type = models.ForeignKey('TicketType') + camp = models.ForeignKey('camps.Camp') + + def save(self, **kwargs): + super(BaseTicket, self).save(**kwargs) + self.qrcode_base64 = self.get_qr_code() + super(BaseTicket, self).save(**kwargs) + + def _get_token(self): + return hashlib.sha256( + '{_id}{secret_key}'.format( + _id=self.pk, + secret_key=settings.SECRET_KEY, + ).encode('utf-8') + ).hexdigest() + + def get_qr_code(self): + qr = qrcode.make( + self._get_token(), + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_H + ).resize((250, 250)) + file_like = io.BytesIO() + qr.save(file_like, format='png') + qrcode_base64 = base64.b64encode(file_like.getvalue()) + return qrcode_base64 + + def get_qr_code_url(self): + return 'data:image/png;base64,{}'.format(self.qrcode_base64) + + def generate_pdf(self): + generate_pdf_letter( + filename='ticket_{}.pdf'.format(self.pk), + formatdict={'ticket': self}, + template='pdf/ticket.html' + ) + + +class SponsorTicket(BaseTicket, CreatedUpdatedModel, UUIDModel): + sponsor = models.ForeignKey('sponsors.Sponsor') + + def __str__(self): + return 'SponsorTicket: {}'.format(self.pk) + + +class DiscountTicket(BaseTicket, CreatedUpdatedModel, UUIDModel): + price = models.IntegerField( + help_text=_('Price of the discounted ticket (in DKK, including VAT).') + ) + + def __str__(self): + return 'DiscountTicket: {}'.format(self.pk) + + +class ShopTicket(BaseTicket, CreatedUpdatedModel, UUIDModel): + order = models.ForeignKey('shop.Order', related_name='shoptickets') + product = models.ForeignKey('shop.Product') + + name = models.CharField( + max_length=100, + help_text=( + 'Name of the person this ticket belongs to. ' + 'This can be different from the buying user.' + ), + null=True, + blank=True, + ) + + email = models.EmailField( + null=True, + blank=True, + ) + + checked_in = models.BooleanField(default=False) + + # overwrite the _get_token method because old tickets use the user_id + def _get_token(self): + return hashlib.sha256( + '{_id}{user_id}{secret_key}'.format( + _id=self.pk, + user_id=self.order.user.pk, + secret_key=settings.SECRET_KEY, + ).encode('utf-8') + ).hexdigest() + + def __str__(self): + return 'Ticket {user} {product}'.format( + user=self.order.user, + product=self.product + ) + + def save(self, **kwargs): + super(ShopTicket, self).save(**kwargs) + self.qrcode_base64 = self.get_qr_code() + super(ShopTicket, self).save(**kwargs) + + def get_absolute_url(self): + return str(reverse_lazy('shop:ticket_detail', kwargs={'pk': self.pk})) diff --git a/src/tickets/pdf.py b/src/tickets/pdf.py new file mode 100644 index 00000000..e69de29b diff --git a/src/tickets/templates/pdf/ticket.html b/src/tickets/templates/pdf/ticket.html new file mode 100644 index 00000000..556c7d4a --- /dev/null +++ b/src/tickets/templates/pdf/ticket.html @@ -0,0 +1,32 @@ +{% load static from staticfiles %} + + + + + + + +
  +

+ {{ ticket.created|date:"b jS, Y" }}
+

+
+
+

{{ ticket.camp.title }} Ticket

+

Type: {{ ticket.ticket_type }}

+ +{% if ticket.name %} +

Participant: {{ ticket.name }}

+
+{% elif ticket.order.user.email %} +

Participant: {{ ticket.order.user.email }}

+
+{% elif ticket.sponsor %} +

Sponsor: {{ ticket.sponsor.name }}

+ +{% endif %} + +
+ +

Ticket #{{ ticket.pk }}

+
diff --git a/src/tickets/views.py b/src/tickets/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/src/tickets/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. From 5eedb8ff031d4bc49204f75a08ba36b08d2ab701 Mon Sep 17 00:00:00 2001 From: Stephan Telling Date: Thu, 17 Aug 2017 17:52:22 +0200 Subject: [PATCH 52/54] update INSTALLED_APPS. add ticket_type and re-add old Ticket model also updates bootstrap script with ticket_type --- src/bornhack/settings.py | 1 + src/shop/admin.py | 4 +- src/shop/models.py | 86 +++++++++++++++++-- src/shop/pdf.py | 17 ++-- .../management/commands/bootstrap-devsite.py | 3 + 5 files changed, 100 insertions(+), 11 deletions(-) diff --git a/src/bornhack/settings.py b/src/bornhack/settings.py index d8c3e20d..1ea67e0d 100644 --- a/src/bornhack/settings.py +++ b/src/bornhack/settings.py @@ -42,6 +42,7 @@ INSTALLED_APPS = [ 'ircbot', 'teams', 'people', + 'tickets', 'allauth', 'allauth.account', diff --git a/src/shop/admin.py b/src/shop/admin.py index cb68b1f2..56520184 100644 --- a/src/shop/admin.py +++ b/src/shop/admin.py @@ -10,6 +10,7 @@ admin.site.register(models.CoinifyAPIRequest) admin.site.register(models.Invoice) admin.site.register(models.CreditNote) + @admin.register(models.CustomOrder) class CustomOrderAdmin(admin.ModelAdmin): list_display = [ @@ -25,6 +26,7 @@ class CustomOrderAdmin(admin.ModelAdmin): 'paid', ] + @admin.register(models.ProductCategory) class ProductCategoryAdmin(admin.ModelAdmin): list_display = [ @@ -37,6 +39,7 @@ class ProductAdmin(admin.ModelAdmin): list_display = [ 'name', 'category', + 'ticket_type', 'price', 'available_in', ] @@ -115,7 +118,6 @@ class TicketModelAdmin(admin.ModelAdmin): list_filter = ['product', 'checked_in'] - actions = ['mark_as_arrived'] def mark_as_arrived(self, request, queryset): diff --git a/src/shop/models.py b/src/shop/models.py index 65d4ed08..5b314554 100644 --- a/src/shop/models.py +++ b/src/shop/models.py @@ -1,3 +1,9 @@ +import io +import logging +import hashlib +import base64 +import qrcode + from django.conf import settings from django.db import models from django.db.models.aggregates import Sum @@ -7,13 +13,17 @@ from django.utils.text import slugify from django.utils.translation import ugettext_lazy as _ from django.utils import timezone from django.core.urlresolvers import reverse_lazy -from utils.models import UUIDModel, CreatedUpdatedModel -from .managers import ProductQuerySet, OrderQuerySet from decimal import Decimal from datetime import timedelta from unidecode import unidecode from django.utils.dateparse import parse_datetime +from utils.models import UUIDModel, CreatedUpdatedModel +from tickets.models import ShopTicket +from .managers import ProductQuerySet, OrderQuerySet + +logger = logging.getLogger("bornhack.%s" % __name__) + class CustomOrder(CreatedUpdatedModel): text = models.TextField( @@ -74,7 +84,7 @@ class Order(CreatedUpdatedModel): CREDIT_CARD = 'credit_card' BLOCKCHAIN = 'blockchain' BANK_TRANSFER = 'bank_transfer' - CASH = 'cash' + CASH = 'cash' PAYMENT_METHODS = [ CREDIT_CARD, @@ -112,7 +122,6 @@ class Order(CreatedUpdatedModel): blank=True, ) - objects = OrderQuerySet.as_manager() def __str__(self): @@ -173,7 +182,8 @@ class Order(CreatedUpdatedModel): for order_product in self.orderproductrelation_set.all(): if order_product.product.category.name == "Tickets": for _ in range(0, order_product.quantity): - ticket = Ticket( + ticket = ShopTicket( + ticket_type=order_product.product.ticket_type, order=self, product=order_product.product, ) @@ -288,6 +298,12 @@ class Product(CreatedUpdatedModel, UUIDModel): ) ) + ticket_type = models.ForeignKey( + 'tickets.TicketType', + null=True, + blank=True + ) + objects = ProductQuerySet.as_manager() def __str__(self): @@ -451,3 +467,63 @@ class CoinifyAPIRequest(CreatedUpdatedModel): def __str__(self): return 'order %s api request %s' % (self.order.id, self.method) + + +class Ticket(CreatedUpdatedModel, UUIDModel): + order = models.ForeignKey('shop.Order', related_name='tickets') + product = models.ForeignKey('shop.Product', related_name='tickets') + qrcode_base64 = models.TextField(null=True, blank=True) + + name = models.CharField( + max_length=100, + help_text=( + 'Name of the person this ticket belongs to. ' + 'This can be different from the buying user.' + ), + null=True, + blank=True, + ) + + email = models.EmailField( + null=True, + blank=True, + ) + + checked_in = models.BooleanField(default=False) + + def __str__(self): + return 'Ticket {user} {product}'.format( + user=self.order.user, + product=self.product + ) + + def save(self, **kwargs): + super(Ticket, self).save(**kwargs) + self.qrcode_base64 = self.get_qr_code() + super(Ticket, self).save(**kwargs) + + def get_token(self): + return hashlib.sha256( + '{ticket_id}{user_id}{secret_key}'.format( + ticket_id=self.pk, + user_id=self.order.user.pk, + secret_key=settings.SECRET_KEY, + ).encode('utf-8') + ).hexdigest() + + def get_qr_code(self): + qr = qrcode.make( + self.get_token(), + version=1, + error_correction=qrcode.constants.ERROR_CORRECT_H + ).resize((250,250)) + file_like = io.BytesIO() + qr.save(file_like, format='png') + qrcode_base64 = base64.b64encode(file_like.getvalue()) + return qrcode_base64 + + def get_qr_code_url(self): + return 'data:image/png;base64,{}'.format(self.qrcode_base64) + + def get_absolute_url(self): + return str(reverse_lazy('shop:ticket_detail', kwargs={'pk': self.pk})) diff --git a/src/shop/pdf.py b/src/shop/pdf.py index 32cafc92..1d943d94 100644 --- a/src/shop/pdf.py +++ b/src/shop/pdf.py @@ -1,11 +1,12 @@ +import logging +import io +import os + from django.contrib.auth.models import AnonymousUser from wkhtmltopdf.views import PDFTemplateResponse from PyPDF2 import PdfFileWriter, PdfFileReader from django.test.client import RequestFactory from django.conf import settings -import logging -import io -import os logger = logging.getLogger("bornhack.%s" % __name__) @@ -36,7 +37,14 @@ def generate_pdf_letter(filename, template, formatdict): # get watermark from watermark file watermark = PdfFileReader( - open(os.path.join(settings.STATICFILES_DIRS[0], 'pdf', settings.PDF_LETTERHEAD_FILENAME), 'rb') + open( + os.path.join( + settings.STATICFILES_DIRS[0], + 'pdf', + settings.PDF_LETTERHEAD_FILENAME + ), + 'rb' + ) ) # add the watermark to all pages @@ -60,4 +68,3 @@ def generate_pdf_letter(filename, template, formatdict): returnfile = io.BytesIO() finalpdf.write(returnfile) return returnfile - diff --git a/src/utils/management/commands/bootstrap-devsite.py b/src/utils/management/commands/bootstrap-devsite.py index ed9420a4..dba2109f 100644 --- a/src/utils/management/commands/bootstrap-devsite.py +++ b/src/utils/management/commands/bootstrap-devsite.py @@ -48,6 +48,7 @@ class Command(BaseCommand): timezone.datetime(2016, 9, 4, 12, 0, tzinfo=timezone.utc), timezone.datetime(2016, 9, 6, 12, 0, tzinfo=timezone.utc), ), + colour='#000000', ) camp2017 = Camp.objects.create( @@ -66,6 +67,7 @@ class Command(BaseCommand): timezone.datetime(2017, 9, 4, 12, 0, tzinfo=timezone.utc), timezone.datetime(2017, 9, 6, 12, 0, tzinfo=timezone.utc), ), + colour='#000000', ) camp2018 = Camp.objects.create( @@ -84,6 +86,7 @@ class Command(BaseCommand): timezone.datetime(2018, 9, 4, 12, 0, tzinfo=timezone.utc), timezone.datetime(2018, 9, 6, 12, 0, tzinfo=timezone.utc), ), + colour='#000000', ) self.output("Creating users...") From ee8c9cf01c7af7e91c421eb2f4b5282be64152b9 Mon Sep 17 00:00:00 2001 From: Stephan Telling Date: Thu, 17 Aug 2017 17:53:45 +0200 Subject: [PATCH 53/54] mend --- .../migrations/0048_product_ticket_type.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/shop/migrations/0048_product_ticket_type.py diff --git a/src/shop/migrations/0048_product_ticket_type.py b/src/shop/migrations/0048_product_ticket_type.py new file mode 100644 index 00000000..97c36ff6 --- /dev/null +++ b/src/shop/migrations/0048_product_ticket_type.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-08-17 14:22 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('tickets', '0001_initial'), + ('shop', '0047_auto_20170522_1942'), + ] + + operations = [ + migrations.AddField( + model_name='product', + name='ticket_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='tickets.TicketType'), + ), + ] From eac39352cd6174e014f0d6e639fd0aa6b7b80a39 Mon Sep 17 00:00:00 2001 From: Stephan Telling Date: Thu, 17 Aug 2017 18:38:25 +0200 Subject: [PATCH 54/54] move generate_pdf_letter func to utils app --- src/shop/invoiceworker.py | 2 +- src/tickets/models.py | 2 +- src/{shop => utils}/pdf.py | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/{shop => utils}/pdf.py (100%) diff --git a/src/shop/invoiceworker.py b/src/shop/invoiceworker.py index 52ce8e45..5ada3ff8 100644 --- a/src/shop/invoiceworker.py +++ b/src/shop/invoiceworker.py @@ -1,5 +1,5 @@ from django.core.files import File -from shop.pdf import generate_pdf_letter +from utils.pdf import generate_pdf_letter from shop.email import add_invoice_email, add_creditnote_email from shop.models import Order, CustomOrder, Invoice, CreditNote import logging diff --git a/src/tickets/models.py b/src/tickets/models.py index 923d9ff7..1f59a4cb 100644 --- a/src/tickets/models.py +++ b/src/tickets/models.py @@ -13,7 +13,7 @@ from utils.models import ( UUIDModel, CreatedUpdatedModel ) -from shop.pdf import generate_pdf_letter +from utils.pdf import generate_pdf_letter logger = logging.getLogger("bornhack.%s" % __name__) diff --git a/src/shop/pdf.py b/src/utils/pdf.py similarity index 100% rename from src/shop/pdf.py rename to src/utils/pdf.py