on master help sign in
Add a bunch of functions to Dict and Set libs.
aab53b2evancz
core-elm/Dict.elm+58−17
@@ -1,14 +1,19 @@
1
1
2−module Dict (empty,singleton,insert,lookup,remove,member,fold) where
2+module Dict (empty,singleton,insert
3+ ,lookup,find,findWithDefault
4+ ,remove,member
5+ ,fold,map
6+ ,union,intersect,diff
7+ ,keys,values
8+ ,toList,fromList
9+ ) where
3
10
4−import Data.Maybe (isJust)
11+import Maybe (isJust)
5
12
6data NColor = Red | Black
13data NColor = Red | Black
7
14
8data RBTree k v = RBNode NColor k v (RBTree k v) (RBTree k v) | RBEmpty
15data RBTree k v = RBNode NColor k v (RBTree k v) (RBTree k v) | RBEmpty
9
16
10−raise = console.log
11−
12empty = RBEmpty
17empty = RBEmpty
13
18
14-- Helpers for checking invariants
19-- Helpers for checking invariants
@@ -93,14 +98,14 @@ min t =
93 case t of
98 case t of
94 { RBNode _ k v RBEmpty _ -> (k,v)
99 { RBNode _ k v RBEmpty _ -> (k,v)
95 ; RBNode _ _ _ l _ -> min l
100 ; RBNode _ _ _ l _ -> min l
96− ; RBEmpty -> console.log "(min RBEmpty) is not defined"
101+ ; RBEmpty -> throw "(min RBEmpty) is not defined"
97 }
102 }
98
103
99max t =
104max t =
100 case t of
105 case t of
101 { RBNode _ k v _ RBEmpty -> (k,v)
106 { RBNode _ k v _ RBEmpty -> (k,v)
102 ; RBNode _ _ _ _ r -> max r
107 ; RBNode _ _ _ _ r -> max r
103− ; RBEmpty -> console.log "(max RBEmpty) is not defined"
108+ ; RBEmpty -> throw "(max RBEmpty) is not defined"
104 }
109 }
105
110
106lookup k t =
111lookup k t =
@@ -113,20 +118,40 @@ lookup k t =
113 ; GT -> lookup k r }
118 ; GT -> lookup k r }
114 }
119 }
115
120
121+findWithDefault base k t =
122+ case t of
123+ { RBEmpty -> base
124+ ; RBNode _ k' v l r ->
125+ case compare k k' of
126+ { LT -> findWithDefault base k l
127+ ; EQ -> v
128+ ; GT -> findWithDefault base k r }
129+ }
130+
131+find k t =
132+ case t of
133+ { RBEmpty -> throw "Key was not found in dictionary!"
134+ ; RBNode _ k' v l r ->
135+ case compare k k' of
136+ { LT -> find k l
137+ ; EQ -> v
138+ ; GT -> find k r }
139+ }
140+
116-- Does t contain k?
141-- Does t contain k?
117member k t = isJust $ lookup k t
142member k t = isJust $ lookup k t
118
143
119rotateLeft t =
144rotateLeft t =
120 case t of
145 case t of
121 { RBNode cy ky vy a (RBNode cz kz vz b c) -> RBNode cy kz vz (RBNode Red ky vy a b) c
146 { RBNode cy ky vy a (RBNode cz kz vz b c) -> RBNode cy kz vz (RBNode Red ky vy a b) c
122− ; _ -> raise "rotateLeft of a node without enough children" }
147+ ; _ -> throw "rotateLeft of a node without enough children" }
123
148
124-- rotateRight -- the reverse, and
149-- rotateRight -- the reverse, and
125-- makes Y have Z's color, and makes Z Red.
150-- makes Y have Z's color, and makes Z Red.
126rotateRight t =
151rotateRight t =
127 case t of
152 case t of
128 { RBNode cz kz vz (RBNode cy ky vy a b) c -> RBNode cz ky vy a (RBNode Red kz vz b c)
153 { RBNode cz kz vz (RBNode cy ky vy a b) c -> RBNode cz ky vy a (RBNode Red kz vz b c)
129− ; _ -> raise "rotateRight of a node without enough children" }
154+ ; _ -> throw "rotateRight of a node without enough children" }
130
155
131rotateLeftIfNeeded t =
156rotateLeftIfNeeded t =
132 case t of
157 case t of
@@ -146,7 +171,7 @@ color_flip t =
146 RBNode (otherColor c1) bk bv
171 RBNode (otherColor c1) bk bv
147 (RBNode (otherColor c2) ak av la ra)
172 (RBNode (otherColor c2) ak av la ra)
148 (RBNode (otherColor c3) ck cv lc rc)
173 (RBNode (otherColor c3) ck cv lc rc)
149− ; _ -> raise "color_flip called on a RBEmpty or RBNode with a RBEmpty child" }
174+ ; _ -> throw "color_flip called on a RBEmpty or RBNode with a RBEmpty child" }
150
175
151color_flipIfNeeded t =
176color_flipIfNeeded t =
152 case t of
177 case t of
@@ -173,10 +198,10 @@ insert k v t =
173 ; GT -> RBNode c k' v' l (ins r) }
198 ; GT -> RBNode c k' v' l (ins r) }
174 in fixUp h }
199 in fixUp h }
175 in if not (invariants_hold t) then
200 in if not (invariants_hold t) then
176− raise "invariants broken before insert"
201+ throw "invariants broken before insert"
177 else (let new_t = ensureBlackRoot (ins t) in
202 else (let new_t = ensureBlackRoot (ins t) in
178 if not (invariants_hold new_t) then
203 if not (invariants_hold new_t) then
179− raise "invariants broken after insert"
204+ throw "invariants broken after insert"
180 else new_t)
205 else new_t)
181
206
182singleton k v = insert k v RBEmpty
207singleton k v = insert k v RBEmpty
@@ -262,17 +287,17 @@ remove k t =
262 let t' = moveRedLeftIfNeeded t in
287 let t' = moveRedLeftIfNeeded t in
263 case t' of
288 case t' of
264 { RBNode c k' v l r -> fixUp (RBNode c k' v (del l) r)
289 { RBNode c k' v l r -> fixUp (RBNode c k' v (del l) r)
265− ; RBEmpty -> raise "delLT on RBEmpty" }
290+ ; RBEmpty -> throw "delLT on RBEmpty" }
266 ; delEQ t =
291 ; delEQ t =
267 case t of -- Replace with successor
292 case t of -- Replace with successor
268 { RBNode c _ _ l r ->
293 { RBNode c _ _ l r ->
269 let (k',v') = min r in
294 let (k',v') = min r in
270 fixUp (RBNode c k' v' l (deleteMin r))
295 fixUp (RBNode c k' v' l (deleteMin r))
271− ; RBEmpty -> raise "delEQ called on a RBEmpty" }
296+ ; RBEmpty -> throw "delEQ called on a RBEmpty" }
272 ; delGT t =
297 ; delGT t =
273 case t of
298 case t of
274 { RBNode c k' v l r -> fixUp (RBNode c k' v l (del r))
299 { RBNode c k' v l r -> fixUp (RBNode c k' v l (del r))
275− ; RBEmpty -> raise "delGT called on a RBEmpty" }
300+ ; RBEmpty -> throw "delGT called on a RBEmpty" }
276 ; del t =
301 ; del t =
277 case t of
302 case t of
278 { RBEmpty -> RBEmpty
303 { RBEmpty -> RBEmpty
@@ -284,13 +309,29 @@ remove k t =
284 if eq t then delEQ t else delGT t)) }
309 if eq t then delEQ t else delGT t)) }
285 }
310 }
286 in if not (invariants_hold t) then
311 in if not (invariants_hold t) then
287− raise "invariants broken before remove"
312+ throw "invariants broken before remove"
288 else (let t' = ensureBlackRoot (del t) in
313 else (let t' = ensureBlackRoot (del t) in
289 if invariants_hold t' then t' else
314 if invariants_hold t' then t' else
290− raise "invariants broken after remove")
315+ throw "invariants broken after remove")
316+
317+map f t =
318+ case t of
319+ { RBEmpty -> RBEmpty
320+ ; RBNode c k v l r -> RBNode c k (f v) (map f l) (map f r)
321+ }
291
322
292fold f acc t =
323fold f acc t =
293 case t of
324 case t of
294 { RBEmpty -> acc
325 { RBEmpty -> acc
295 ; RBNode _ k v l r -> fold f (f k v (fold f acc l)) r
326 ; RBNode _ k v l r -> fold f (f k v (fold f acc l)) r
296− }
327+ }
328+
329+union t1 t2 = fold insert t2 t1
330+intersect t1 t2 = fold (\k v t -> if k `member` t2 then insert k v t else t) empty t1
331+diff t1 t2 = fold (\k _ t -> remove k t) t1 t2
332+
333+keys t = fold (\k _ acc -> k : acc) [] t
334+values t = fold (\_ -> (:)) [] t
335+
336+toList t = fold (\k v acc -> (k,v) : acc) [] t
337+fromList assocs = List.foldl (\(k,v) t -> insert k v t) empty assocs
core-elm/Set.elm+16−3
@@ -1,10 +1,23 @@
1
1
2−module Set (empty,singleton,insert,remove,member) where
2+module Set (empty,singleton,insert,remove
3−
3+ ,member
4−import Dict as Dict
4+ ,fold,map
5+ ,union,intersect,diff
6+ ,toList,fromList
7+ ) where
5
8
6empty = Dict.empty
9empty = Dict.empty
7singleton k = Dict.singleton k ()
10singleton k = Dict.singleton k ()
8insert k = Dict.insert k ()
11insert k = Dict.insert k ()
9remove = Dict.remove
12remove = Dict.remove
10member = Dict.member
13member = Dict.member
14+
15+union = Dict.union
16+intersect = Dict.intersect
17+diff = Dict.diff
18+
19+toList = Dict.keys
20+fromList = List.foldl (\k t -> Dict.insert k () t) empty
21+
22+fold f = Dict.fold (\k v b -> f k b)
23+map f t = fromList . List.map f $ toList t
core-js/cat.bat+1−1
@@ -2,4 +2,4 @@ copy /B Guid.js+foreign\JavaScript.js+foreign\JSON.js+Value.js+List.js+Dict.js+S
2
2
3cd ..\elm
3cd ..\elm
4
4
5−copy /B ..\elm-mini.js elm-runtime-0.4.5.js
5+copy /B ..\elm-mini.js elm-runtime-0.5.0.js
elm/Elm.cabal+6−4
@@ -1,6 +1,6 @@
1
1
2Name: Elm
2Name: Elm
3−Version: 0.4.5
3+Version: 0.5.0
4Synopsis: The Elm language module.
4Synopsis: The Elm language module.
5Description: Elm aims to make client-side web-development more pleasant.
5Description: Elm aims to make client-side web-development more pleasant.
6 It is a statically/strongly typed, functional reactive
6 It is a statically/strongly typed, functional reactive
@@ -22,7 +22,7 @@ Category: Compiler, Language
22Build-type: Simple
22Build-type: Simple
23
23
24Extra-source-files: changelog.txt
24Extra-source-files: changelog.txt
25−Data-files: elm-runtime-0.4.5.js
25+Data-files: elm-runtime-0.5.0.js
26Cabal-version: >=1.8
26Cabal-version: >=1.8
27
27
28source-repository head
28source-repository head
@@ -32,6 +32,7 @@ source-repository head
32Library
32Library
33 exposed-modules: Language.Elm,
33 exposed-modules: Language.Elm,
34 Language.Elm.Quasi
34 Language.Elm.Quasi
35+ GHC-Options: -O2
35 Hs-Source-Dirs: src, src/Parse, src/Types, src/Gen
36 Hs-Source-Dirs: src, src/Parse, src/Types, src/Gen
36 other-modules: Ast,
37 other-modules: Ast,
37 CompileToJS,
38 CompileToJS,
@@ -63,7 +64,7 @@ Library
63 transformers >= 0.2,
64 transformers >= 0.2,
64 mtl >= 2,
65 mtl >= 2,
65 parsec >= 3.1.1,
66 parsec >= 3.1.1,
66− blaze-html == 0.5.0.*,
67+ blaze-html == 0.5.*,
67 blaze-markup == 0.5.1.*,
68 blaze-markup == 0.5.1.*,
68 deepseq,
69 deepseq,
69 text,
70 text,
@@ -75,6 +76,7 @@ Library
75
76
76Executable elm
77Executable elm
77 Main-is: Compiler.hs
78 Main-is: Compiler.hs
79+ GHC-Options: -O2 -prof -auto-all
78 Hs-Source-Dirs: src, src/Parse, src/Types, src/Gen
80 Hs-Source-Dirs: src, src/Parse, src/Types, src/Gen
79 other-modules: Ast,
81 other-modules: Ast,
80 CompileToJS,
82 CompileToJS,
@@ -106,7 +108,7 @@ Executable elm
106 transformers >= 0.2,
108 transformers >= 0.2,
107 mtl >= 2,
109 mtl >= 2,
108 parsec >= 3.1.1,
110 parsec >= 3.1.1,
109− blaze-html == 0.5.0.*,
111+ blaze-html == 0.5.*,
110 blaze-markup == 0.5.1.*,
112 blaze-markup == 0.5.1.*,
111 deepseq,
113 deepseq,
112 cmdargs,
114 cmdargs,
elm/elm-runtime-0.5.0.jsnew file+2996
@@ -0,0 +1,2996 @@
1+
2+var Guid = function() {
3+ var counter = 0;
4+ var guid = function() { counter += 1; return counter; };
5+ return {guid : guid};
6+}();
7+var Elm = Elm || {};
8+Elm.JavaScript = function() {
9+ function castJSBoolToBool(b) { return b; }
10+ function castBoolToJSBool(b) { return b; }
11+
12+ function castJSNumberToFloat(n) { return n; }
13+ function castFloatToJSNumber(n) { return n; }
14+
15+ function castJSNumberToInt(n) { return ~~n; }
16+ function castIntToJSNumber(n) { return n; }
17+
18+ function castJSElementToElement(w) {
19+ return function(h) {
20+ return function(node) {
21+ return ["Element",Guid.guid(),
22+ ["EExternalHtml",node],
23+ w,h,1,Nothing,Nothing];
24+ }
25+ }
26+ }
27+ function castElementToJSElement(elem) { return Render.render(elem); }
28+
29+ function castJSArrayToList(arr) {
30+ var list = ["Nil"];
31+ for (var i = arr.length; i--; ) {
32+ list = [ "Cons", arr[i], list ];
33+ }
34+ return list;
35+ }
36+ function castListToJSArray(list) {
37+ var a = [];
38+ while (list[0] === "Cons") {
39+ a.push(list[1]);
40+ list = list[2];
41+ }
42+ return a;
43+ }
44+
45+ var castJSStringToString = castJSArrayToList;
46+ function castStringToJSString(str) {
47+ if (typeof str === "string") return str;
48+ return castListToJSArray(str).join('');
49+ }
50+
51+ function fromTuple(t) { return t.slice(1); }
52+ function toTuple(a) { return ["Tuple" + a.length].concat(a); }
53+
54+ return {castJSBoolToBool:castJSBoolToBool,
55+ castBoolToJSBool:castBoolToJSBool,
56+ castJSNumberToFloat:castJSNumberToFloat,
57+ castFloatToJSNumber:castFloatToJSNumber,
58+ castJSNumberToInt:castJSNumberToInt,
59+ castIntToJSNumber:castIntToJSNumber,
60+ Experimental : {castJSElementToElement:castJSElementToElement,
61+ castElementToJSElement:castElementToJSElement},
62+ castJSArrayToList:castJSArrayToList,
63+ castListToJSArray:castListToJSArray,
64+ castJSStringToString:castJSStringToString,
65+ castStringToJSString:castStringToJSString,
66+ castTupleToJSTuple2:fromTuple,
67+ castTupleToJSTuple3:fromTuple,
68+ castTupleToJSTuple4:fromTuple,
69+ castTupleToJSTuple5:fromTuple,
70+ castJSTupleToTuple2:toTuple,
71+ castJSTupleToTuple3:toTuple,
72+ castJSTupleToTuple4:toTuple,
73+ castJSTupleToTuple5:toTuple
74+ };
75+}();
76+
77+var Elm = Elm || {};
78+Elm.JSON = function() {
79+ var JS = Elm.JavaScript;
80+ var empty = ['JSON',{}];
81+ function singleton(k) { return function(v) {
82+ var obj = {};
83+ obj[JS.castStringToJSString(k)] = v;
84+ return ['JSON', obj ];
85+ };
86+ }
87+ function insert(k) { return function(v) { return function(inObj) {
88+ var obj = inObj[1];
89+ var outObj = {};
90+ for (var i in obj) {
91+ outObj[i] = obj[i];
92+ }
93+ outObj[JS.castStringToJSString(k)] = v;
94+ return ['JSON', outObj ];
95+ };
96+ };
97+ }
98+ function lookup(key) { return function(obj) {
99+ var k = JS.castStringToJSString(key);
100+ return obj[1].hasOwnProperty(k) ? Just(obj[1][k]) : Nothing ;
101+ };
102+ }
103+ function lookupWithDefault(base) { return function(key) { return function(obj) {
104+ var k = JS.castStringToJSString(key);
105+ return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
106+ };
107+ };
108+ }
109+ function remove(k) { return function(inObj) {
110+ var obj = inObj[1];
111+ var outObj = {};
112+ for (var i in obj) {
113+ outObj[i] = obj[i];
114+ }
115+ delete outObj[JS.castStringToJSString(k)];
116+ return ['JSON', outObj];
117+ };
118+ }
119+
120+ function JsonString(v) { return [ "JsonString", v ]; }
121+ function JsonNumber(v) { return [ "JsonNumber", v ]; }
122+ function JsonBool(v) { return [ "JsonBool", v ]; }
123+ var JsonNull = [ "JsonNull" ];
124+ function JsonArray(v) { return [ "JsonArray", v ]; }
125+ function JsonObject(v) { return [ "JsonObject", v ]; }
126+
127+ function toList(json) {
128+ var obj = json[1];
129+ var arr = [];
130+ for (var i in obj) {
131+ arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
132+ }
133+ return JS.castJSArrayToList(arr);
134+ }
135+ function fromList(list) {
136+ var arr = JS.castListToJSArray(list);
137+ var obj = {};
138+ for (var i = arr.length; i--; ) {
139+ obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
140+ }
141+ return [ "JSON", obj ];
142+ }
143+
144+ function toPrettyJSString(sep) { return function (obj) {
145+ function fromValue(v) {
146+ switch (v[0]) {
147+ case 'JsonNull' : return null;
148+ case 'JsonString' : return JS.castStringToJSString(v[1]);
149+ case 'JsonObject' :
150+ var o = {};
151+ var from = v[1][1];
152+ for (var i in from) {
153+ o[i] = fromValue(from[i]);
154+ }
155+ return o;
156+ case 'JsonArray' :
157+ var a = JS.castListToJSArray(v[1]);
158+ for (var i = a.length; i--; ) {
159+ a[i] = fromValue(a[i]);
160+ }
161+ return a;
162+ default :
163+ return v[1];
164+ }
165+ }
166+ return JSON.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
167+ };
168+ }
169+ function fromJSString(str) {
170+ var obj = JSON.parse(str);
171+ function toValue(v) {
172+ switch (typeof v) {
173+ case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
174+ case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
175+ case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
176+ case 'object' :
177+ if (v === null) return [ "JsonNull" ];
178+ for (var i in v) {
179+ v[i] = toValue(v[i]);
180+ }
181+ if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
182+ return [ "JsonObject", [ "JSON", v ] ];
183+ }
184+ }
185+ for (var i in obj) {
186+ obj[i] = toValue(obj[i]);
187+ }
188+ return ['JSON',obj];
189+ }
190+ return {empty : empty,
191+ singleton : singleton,
192+ insert : insert,
193+ lookup : lookup,
194+ findWithDefault : lookupWithDefault,
195+ remove : remove,
196+ toPrettyJSString : toPrettyJSString,
197+ toJSString : toPrettyJSString(''),
198+ fromJSString : fromJSString,
199+ toPrettyString : function(sep) { return function(v) {
200+ return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
201+ toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
202+ fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
203+ toList : toList,
204+ fromList : fromList,
205+ JsonString : JsonString,
206+ JsonNumber : JsonNumber,
207+ JsonBool : JsonBool,
208+ JsonNull : JsonNull,
209+ JsonArray : JsonArray,
210+ JsonObject : JsonObject
211+ };
212+}();
213+var Value = function(){
214+
215+ var eq = function(x,y) {
216+ if (typeof x === "object") {
217+ if (x === y) return true;
218+ if (x.length !== y.length) return false;
219+ for (var i = x.length; i--; ) {
220+ if (!eq(x[i],y[i])) return false;
221+ }
222+ return true;
223+ }
224+ return x === y;
225+ };
226+
227+ var Tuple = function() {
228+ var len = arguments.length;
229+ var arr = new Array(len+1);
230+ arr[0] = "Tuple" + arguments.length;
231+ for (var i = len; i--; ) {
232+ arr[i+1] = arguments[i];
233+ }
234+ return arr;
235+ };
236+
237+ var listToArray = function(list) {
238+ var arr = [];
239+ while (list[0] === "Cons") {
240+ arr.push(list[1]);
241+ list = list[2];
242+ }
243+ return arr;
244+ };
245+
246+ function makeSpaces(s) {
247+ if (s.length == 0) { return s; }
248+ var arr = s.split('');
249+ if (arr[0] == ' ') { arr[0] = " " }
250+ for (var i = arr.length; --i; ) {
251+ if (arr[i][0] == ' ' && arr[i-1] == ' ') {
252+ arr[i-1] = arr[i-1] + arr[i];
253+ arr[i] = '';
254+ }
255+ }
256+ for (var i = arr.length; i--; ) {
257+ if (arr[i].length > 1 && arr[i][0] == ' ') {
258+ var spaces = arr[i].split('');
259+ for (var j = spaces.length - 2; j >= 0; j -= 2) {
260+ spaces[j] = ' ';
261+ }
262+ arr[i] = spaces.join('');
263+ }
264+ }
265+ return arr.join('');
266+ }
267+
268+ function properEscape(str) {
269+ if (str.length == 0) return str;
270+ str = str //.replace(/&/g, "&")
271+ .replace(/"/g, /*"*/ """)
272+ .replace(/'/g, /*'*/ "'")
273+ .replace(/</g, "&#60;")
274+ .replace(/>/g, "&#62;")
275+ .replace(/\n/g, "<br/>");
276+ var arr = str.split('<br/>');
277+ for (var i = arr.length; i--; ) {
278+ arr[i] = makeSpaces(arr[i]);
279+ }
280+ return arr.join('<br/>');
281+ }
282+
283+ var toText = function(elmList) {
284+ if (typeof elmList === "string") return properEscape(elmList);
285+ var a = [];
286+ while (elmList[0] === "Cons") {
287+ a.push(elmList[1]);
288+ elmList = elmList[2];
289+ }
290+ return properEscape(a.join(''));
291+ };
292+
293+ function getTextSize(w,h,txt) {
294+ var t = document.createElement('div');
295+ t.innerHTML = txt;
296+ t.style.textAlign = 'left';
297+ if (w > 0) { t.style.width = w + "px"; }
298+
299+ t.style.visibility = "hidden";
300+ t.style.styleFloat = "left";
301+ t.style.cssFloat = "left";
302+
303+ document.body.appendChild(t);
304+ var cStyle = window.getComputedStyle(t);
305+ var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
306+ var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
307+ document.body.removeChild(t);
308+ delete t;
309+ return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
310+ }
311+
312+ function getSize(e) {
313+ var t = e.cloneNode(true);
314+
315+ t.style.visibility = "hidden";
316+ t.style.styleFloat = "left";
317+ t.style.cssFloat = "left";
318+
319+ document.body.appendChild(t);
320+ var w = t.offsetWidth;
321+ var h = t.offsetHeight;
322+ document.body.removeChild(t);
323+ delete t;
324+ return [w,h];
325+ }
326+
327+ function getExcess(e) {
328+ var t = e.cloneNode(true);
329+
330+ t.style.visibility = "hidden";
331+ t.style.styleFloat = "left";
332+ t.style.cssFloat = "left";
333+
334+ document.body.appendChild(t);
335+ var ow = t.offsetWidth;
336+ var oh = t.offsetHeight;
337+ var cStyle = window.getComputedStyle(t);
338+ var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
339+ var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
340+ document.body.removeChild(t);
341+ delete t;
342+ return [ow-w,oh-h];
343+ }
344+
345+
346+ function groupForms(forms) {
347+ forms = Elm.JavaScript.castListToJSArray(forms);
348+ var groups = [];
349+ var arr = [];
350+ for (var i = forms.length; i--; ) {
351+ var f = forms[i];
352+ switch(f[4][0]) {
353+ case "FElement":
354+ if (arr.length > 0) {
355+ groups.push(arr);
356+ arr = [];
357+ }
358+ groups.push(f);
359+ break;
360+ default:
361+ arr.push(f);
362+ }
363+ }
364+ if (arr.length > 0) groups.push(arr);
365+ return groups;
366+ }
367+
368+ var toString = function(v) {
369+ if (typeof v === "boolean") {
370+ return v ? "True" : "False";
371+ } else if (typeof v === "number") {
372+ return v+"";
373+ } else if (typeof v === "string" && v.length < 2) {
374+ return "'"+v+"'";
375+ } else if (v[0]) {
376+ if (v[0].substring(0,5) === "Tuple") {
377+ var output = "";
378+ for (var i = v.length; --i; ) {
379+ output = "," + toString(v[i]) + output;
380+ }
381+ if (output[0] === ",") output = output.substring(1);
382+ return "("+output+")";
383+ } else if (v[0] === "Cons") {
384+ var start = (typeof v[1] === "string") ? '"' : "[";
385+ var end = (typeof v[1] === "string") ? '"' : "]";
386+ var div = (typeof v[1] === "string") ? "" : ",";
387+ var f = (typeof v[1] === "string") ? function(x){return x} : toString;
388+ var output = start + f(v[1]);
389+ v = v[2];
390+ while (true) {
391+ if (v[0] === "Cons") {
392+ output += div + f(v[1]);
393+ v = v[2];
394+ } else {
395+ return output + end;
396+ }
397+ }
398+ } else if (v[0] === "Nil") {
399+ return "[]";
400+ } else if (v[0] === "JSON") {
401+ return "(JSON.fromList " + toString(ElmJSON.toList(v)) + ")";
402+ } else if (v[0] === "RBNode" || v[0] === "RBEmpty") {
403+ function cons(k){ return function(v) { return function(acc) { return ["Cons",["Tuple2",k,v],acc]; }; }; }
404+ return "(Map.fromList " + toString(Elm.Dict.fold(cons)(["Nil"])(v)) + ")";
405+ } else {
406+ var output = "";
407+ for (var i = v.length; --i; ) {
408+ output = " " + toString(v[i]) + output
409+ }
410+ output = v[0] + output;
411+ return (v.length > 1) ? "(" + output + ")" : output;
412+ }
413+ }
414+ return v+"";
415+ };
416+ var show = function(v) { return str(toString(v)); };
417+ var append = function(xs,ys) {
418+ if (typeof xs === "string" && typeof ys === "string") {
419+ return xs.concat(ys);
420+ }
421+ if (xs[0] === "Nil") {
422+ return ys;
423+ }
424+ var root = ["Cons", xs[1], ["Nil"]];
425+ var curr = root;
426+ xs = xs[2];
427+ while (xs[0]==="Cons") {
428+ curr[2] = ["Cons", xs[1], ["Nil"]];
429+ xs = xs[2];
430+ curr = curr[2];
431+ }
432+ curr[2] = ys;
433+ return root;
434+ };
435+
436+ var str = function(s) {
437+ var out = ["Nil"];
438+ for (var i = s.length; i--; ) {
439+ out = ["Cons", s[i], out];
440+ }
441+ return out;
442+ };
443+
444+ function wrap(elem) {
445+ var p = Value.getSize(elem);
446+ return ["Element", Guid.guid(), ["EHtml",elem],
447+ p[0], p[1], 1, Nothing, Nothing];
448+ }
449+ var addListener = function() {
450+ if(document.addEventListener) {
451+ return function(element, event, handler) {
452+ element.addEventListener(event, handler, false);
453+ };
454+ } else {
455+ return function(element, event, handler) {
456+ element.attachEvent('on' + event, handler);
457+ };
458+ }
459+ }();
460+
461+ return {eq:eq,
462+ str:str,
463+ show:show,
464+ Tuple:Tuple,
465+ append:append,
466+ listToArray:listToArray,
467+ toText : toText,
468+ properEscape : properEscape,
469+ getTextSize : getTextSize,
470+ getSize : getSize,
471+ getExcess : getExcess,
472+ groupForms : groupForms,
473+ wrap : wrap,
474+ addListener : addListener
475+ };
476+}();var Elm = Elm || {};
477+Elm.List = function() {
478+
479+ var throwError = function(f) {
480+ throw "Function '" + f + "' expecting a list!";
481+ }
482+
483+ function length(xs) {
484+ var out = 0;
485+ while (xs[0] === "Cons") {
486+ out += 1;
487+ xs = xs[2];
488+ }
489+ return out;
490+ };
491+ var reverse = foldl(function(x_72) {
492+ return function(y_73) {
493+ return["Cons", x_72, y_73]
494+ }
495+ })(["Nil"]);
496+ var concat = foldr(function(x_74) {
497+ return function(y_75) {
498+ return Value.append(x_74, y_75)
499+ }
500+ })(["Nil"]);
501+ var and = foldl(function(x_77) {
502+ return function(y_78) {
503+ return x_77 && y_78
504+ }
505+ })(true);
506+ var or = foldl(function(x_79) {
507+ return function(y_80) {
508+ return x_79 || y_80
509+ }
510+ })(false);
511+ var sum = foldl(function(x_89) {
512+ return function(y_90) {
513+ return x_89 + y_90
514+ }
515+ })(0);
516+ var product = foldl(function(x_91) {
517+ return function(y_92) {
518+ return x_91 * y_92
519+ }
520+ })(1);
521+ var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
522+ var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
523+ function head(v) {
524+ if (v[0] !== "Cons") {
525+ throw "Error: 'head' only accepts lists of length greater than one.";
526+ }
527+ return v[1];
528+ }
529+ function tail(v) {
530+ if (v[0] !== "Cons") {
531+ throw "Error: 'tail' only accepts lists of length greater than one.";
532+ }
533+ return v[2];
534+ }
535+ function last(v) {
536+ if (v[0] !== "Cons") {
537+ throw "Error: 'last' only accepts lists of length greater than one.";
538+ }
539+ var out = v[1];
540+ while (v[0] === "Cons") {
541+ out = v[1];
542+ v = v[2];
543+ }
544+ return out;
545+ }
546+ function map(f) {
547+ return function(xs) {
548+ if (xs[0] === "Nil") { return xs; }
549+ if (xs[0] !== "Cons") { throwError('map'); }
550+ var root = ["Cons", f(xs[1]), ["Nil"]];
551+ var curr = root;
552+ xs = xs[2];
553+ while (xs[0]==="Cons") {
554+ curr[2] = ["Cons", f(xs[1]), ["Nil"]];
555+ xs = xs[2];
556+ curr = curr[2];
557+ }
558+ return root;
559+ }
560+ }
561+ function foldl(f) {
562+ return function(b) {
563+ return function(xs) {
564+ var acc = b;
565+ if (xs[0] === "Nil") { return acc; }
566+ if (xs[0] !== "Cons") { throwError('foldl'); }
567+ while (xs[0] === "Cons") {
568+ acc = f(xs[1])(acc);
569+ xs = xs[2];
570+ }
571+ return acc;
572+ }
573+ }
574+ }
575+ function foldr(f) {
576+ return function(b) {
577+ return function(xs) {
578+ var acc = b;
579+ if (xs[0] === "Nil") { return acc; }
580+ if (xs[0] !== "Cons") { throwError('foldr'); }
581+ var arr = [];
582+ while (xs[0] === "Cons") {
583+ arr.push(xs[1]);
584+ xs = xs[2];
585+ }
586+ for (var i = arr.length; i--; ) {
587+ acc = f(arr[i])(acc);
588+ }
589+ return acc;
590+ }
591+ }
592+ }
593+ function foldl1(f_49) {
594+ return function(_temp_50) {
595+ return function(v) {
596+ if("Cons" !== v[0]) {
597+ return undefined
598+ }else {
599+ var x_51 = v[1];
600+ var xs_52 = v[2];
601+ return foldl(f_49)(x_51)(xs_52)
602+ }
603+ }(_temp_50)
604+ }
605+ }
606+ function foldr1(f) {
607+ return function(xs) {
608+ if (xs[0] === "Nil") { throw "'foldr1' requires an non-empty list." }
609+ if (xs[0] !== "Cons") { throwError('foldr1'); }
610+ var arr = [];
611+ while (xs[0] === "Cons") {
612+ arr.push(xs[1]);
613+ xs = xs[2];
614+ }
615+ var acc = arr.pop();
616+ for (var i = arr.length; i--; ) {
617+ acc = f(arr[i])(acc);
618+ }
619+ return acc;
620+ }
621+ }
622+ function scanl(f) {
623+ return function(b) {
624+ return function(xs) {
625+ if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
626+ if (xs[0] !== "Cons") { throwError('scanl'); }
627+ var arr = [b];
628+ while (xs[0] === "Cons") {
629+ b = f(xs[1])(b);
630+ arr.push(b);
631+ xs = xs[2];
632+ }
633+ var out = ["Nil"];
634+ for (var i = arr.length; i--; ) {
635+ out = ["Cons", arr[i], out];
636+ }
637+ return out;
638+ }
639+ }
640+ }
641+ function scanl1(f) {
642+ return function(xs) {
643+ if (xs[0] !== "Cons") {
644+ throw "Error: 'scanl1' requires a list of at least length 1.";
645+ }
646+ return scanl(f)(xs[1])(xs[2]);
647+ }
648+ }
649+ function filter(pred) {
650+ return function(xs) {
651+ if (xs[0] === "Nil") { return xs; }
652+ if (xs[0] !== "Cons") { throwError('filter'); }
653+ var arr = [];
654+ while (xs[0] === "Cons") {
655+ if (pred(xs[1])) { arr.push(xs[1]); }
656+ xs = xs[2];
657+ }
658+ var out = ["Nil"];
659+ for (var i = arr.length; i--; ) {
660+ out = ["Cons", arr[i], out];
661+ }
662+ return out;
663+ }
664+ }
665+ function concatMap(f_76) {
666+ return function(x) {
667+ return concat(map(f_76)(x))
668+ }
669+ }
670+ function all(pred) {
671+ return foldl(function(x) { return function(acc) {
672+ return acc && pred(x);
673+ };})(true);
674+ }
675+ function any(pred) {
676+ return foldl(function(x) { return function(acc) {
677+ return acc || pred(x);
678+ };})(false);
679+ }
680+ function partition(pred_93) {
681+ return function(lst_94) {
682+ return function() {
683+ var v = lst_94;
684+ var c = [function(v) {
685+ if("Nil" !== v[0]) {
686+ return undefined
687+ }else {
688+ return["Tuple2", ["Nil"], ["Nil"]]
689+ }
690+ }, function(v) {
691+ if("Cons" !== v[0]) {
692+ return undefined
693+ }else {
694+ var x_95 = v[1];
695+ var xs_96 = v[2];
696+ return function(v) {
697+ if("Tuple2" !== v[0]) {
698+ return undefined
699+ }else {
700+ var as_97 = v[1];
701+ var bs_98 = v[2];
702+ return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
703+ }
704+ }(partition(pred_93)(xs_96))
705+ }
706+ }];
707+ for(var i = c.length;i--;) {
708+ var r = c[i](v);
709+ if(r !== undefined) {
710+ return r
711+ }
712+ }
713+ }()
714+ }
715+ }
716+ function zipWith(f) {
717+ return function(listA) {
718+ return function(listB) {
719+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
720+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
721+ var arr = [];
722+ while (listA[0] === "Cons" && listB[0] === "Cons") {
723+ arr.push(f(listA[1])(listB[1]));
724+ listA = listA[2];
725+ listB = listB[2];
726+ }
727+ var out = ["Nil"];
728+ for (var i = arr.length; i--; ) {
729+ out = ["Cons", arr[i], out];
730+ }
731+ return out;
732+ }
733+ }
734+ }
735+ function zip(listA) {
736+ return function(listB) {
737+ if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
738+ if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
739+ var arr = [];
740+ while (listA[0] === "Cons" && listB[0] === "Cons") {
741+ arr.push(["Tuple2", listA[1], listB[1]]);
742+ listA = listA[2];
743+ listB = listB[2];
744+ }
745+ var out = ["Nil"];
746+ for (var i = arr.length; i--; ) {
747+ out = ["Cons", arr[i], out];
748+ }
749+ return out;
750+ }
751+ }
752+ function unzip(pairs_112) {
753+ return function() {
754+ var v = pairs_112;
755+ var c = [function(v) {
756+ if("Nil" !== v[0]) {
757+ return undefined
758+ }else {
759+ return["Tuple2", ["Nil"], ["Nil"]]
760+ }
761+ }, function(v) {
762+ if("Cons" !== v[0]) {
763+ return undefined
764+ }else {
765+ var p_113 = v[1];
766+ var ps_114 = v[2];
767+ return function(v) {
768+ if("Tuple2" !== v[0]) {
769+ return undefined
770+ }else {
771+ if("Tuple2" !== v[1][0]) {
772+ return undefined
773+ }else {
774+ var x_115 = v[1][1];
775+ var y_116 = v[1][2];
776+ if("Tuple2" !== v[2][0]) {
777+ return undefined
778+ }else {
779+ var xs_117 = v[2][1];
780+ var ys_118 = v[2][2];
781+ return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
782+ }
783+ }
784+ }
785+ }(["Tuple2", p_113, unzip(ps_114)])
786+ }
787+ }];
788+ for(var i = c.length;i--;) {
789+ var r = c[i](v);
790+ if(r !== undefined) {
791+ return r
792+ }
793+ }
794+ }()
795+ }
796+ function intersperse(sep_119) {
797+ return function(xs_120) {
798+ return function() {
799+ var v = xs_120;
800+ var c = [function(v) {
801+ if("Nil" !== v[0]) {
802+ return undefined
803+ }else {
804+ return["Nil"]
805+ }
806+ }, function(v) {
807+ if("Cons" !== v[0]) {
808+ return undefined
809+ }else {
810+ var a_124 = v[1];
811+ if("Nil" !== v[2][0]) {
812+ return undefined
813+ }else {
814+ return["Cons", a_124, ["Nil"]]
815+ }
816+ }
817+ }, function(v) {
818+ if("Cons" !== v[0]) {
819+ return undefined
820+ }else {
821+ var a_121 = v[1];
822+ if("Cons" !== v[2][0]) {
823+ return undefined
824+ }else {
825+ var b_122 = v[2][1];
826+ var cs_123 = v[2][2];
827+ return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
828+ }
829+ }
830+ }];
831+ for(var i = c.length;i--;) {
832+ var r = c[i](v);
833+ if(r !== undefined) {
834+ return r
835+ }
836+ }
837+ }()
838+ }
839+ }
840+ function intercalate(sep_125) {
841+ return function(xs_126) {
842+ return function() {
843+ var v = xs_126;
844+ var c = [function(v) {
845+ if("Nil" !== v[0]) {
846+ return undefined
847+ }else {
848+ return["Nil"]
849+ }
850+ }, function(v) {
851+ if("Cons" !== v[0]) {
852+ return undefined
853+ }else {
854+ var a_130 = v[1];
855+ if("Nil" !== v[2][0]) {
856+ return undefined
857+ }else {
858+ return a_130
859+ }
860+ }
861+ }, function(v) {
862+ if("Cons" !== v[0]) {
863+ return undefined
864+ }else {
865+ var a_127 = v[1];
866+ if("Cons" !== v[2][0]) {
867+ return undefined
868+ }else {
869+ var b_128 = v[2][1];
870+ var cs_129 = v[2][2];
871+ return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
872+ }
873+ }
874+ }];
875+ for(var i = c.length;i--;) {
876+ var r = c[i](v);
877+ if(r !== undefined) {
878+ return r
879+ }
880+ }
881+ }()
882+ }
883+ }
884+ function sort(xs) {
885+ if (xs[0] === "Nil") { return xs; }
886+ if (xs[0] !== "Cons") { throwError('sort'); }
887+ var arr = [];
888+ while (xs[0] === "Cons") {
889+ arr.push(xs[1]);
890+ xs = xs[2];
891+ }
892+ arr.sort(function(a,b) { return a - b});
893+ var out = ["Nil"];
894+ for (var i = arr.length; i--; ) {
895+ out = [ "Cons", arr[i], out ];
896+ }
897+ return out;
898+ }
899+ function take(n) { return function(xs) {
900+ if (n <= 0) { return ["Nil"]; }
901+ if (xs[0] === "Nil") { return xs; }
902+ if (xs[0] !== "Cons") { throwError('take'); }
903+ var out = [ "Cons", xs[1], ["Nil"] ];
904+ var temp = out;
905+ xs = xs[2];
906+ --n;
907+ while (xs[0] === "Cons" && n > 0) {
908+ temp[2] = [ "Cons", xs[1], ["Nil"] ];
909+ temp = temp[2];
910+ xs = xs[2];
911+ --n;
912+ }
913+ return out;
914+ };
915+ }
916+ function drop(n) { return function(xs) {
917+ if (xs[0] === "Nil") { return xs; }
918+ if (xs[0] !== "Cons") { throwError('drop'); }
919+ while (xs[0] === "Cons" && n > 0) {
920+ xs = xs[2];
921+ --n;
922+ }
923+ return xs;
924+ };
925+ }
926+ return {head:head,
927+ tail:tail,
928+ last:last,
929+ map:map,
930+ foldl:foldl,
931+ foldr:foldr,
932+ foldl1:foldl1,
933+ foldr1:foldr1,
934+ scanl:scanl,
935+ scanl1:scanl1,
936+ filter:filter,
937+ length:length,
938+ reverse:reverse,
939+ concat:concat,
940+ concatMap:concatMap,
941+ and:and,
942+ or:or,
943+ all:all,
944+ any:any,
945+ sum:sum,
946+ product:product,
947+ maximum:maximum,
948+ minimum:minimum,
949+ partition:partition,
950+ zipWith:zipWith,
951+ zip:zip,
952+ unzip:unzip,
953+ intersperse:intersperse,
954+ intercalate:intercalate,
955+ sort:sort,
956+ take:take,
957+ drop:drop};
958+}();try{if(Elm.Dict)throw "Module name collision, 'Dict' is already defined.";Elm.Dict=function(){try{if(!(Elm.Prelude instanceof Object))throw 'module not found'}catch(e){throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var hiddenVars=[];for(var i in Elm.Prelude){if(hiddenVars.indexOf(i)>=0)continue;this[i]=Elm.Prelude[i]};try{if(!(Elm.Data.Maybe instanceof Object))throw 'module not found'}catch(e){throw "Module 'Data.Maybe' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var isJust=Elm.Data.Maybe.isJust,Red_0=["Red"],Black_1=["Black"]
959+function RBNode_2(a1){return function(a2){return function(a3){return function(a4){return function(a5){return ["RBNode",a1,a2,a3,a4,a5]}}}}};var RBEmpty_3=["RBEmpty"],raise_4=console.log,empty_5=RBEmpty_3
960+function equal_pathLen_6(t_46){return function(){function path_numBlacks_47(t_48){return function(){switch(t_48[0]){case"RBEmpty":return 1;case"RBNode":return function(){var bl_52=path_numBlacks_47(t_48[4]),br_53=path_numBlacks_47(t_48[5]);return((not(eq(bl_52,br_53))||(eq(bl_52,-1)||eq(br_53,-1)))?-1:(bl_52+(eq(t_48[1],Red_0)?0:1)))}()};throw "Non-exhaustive pattern match in case"}()};return not(eq(-1,path_numBlacks_47(t_46)))}()}
961+function rootBlack_7(t_54){return function(){switch(t_54[0]){case"RBEmpty":return true;case"RBNode":switch(t_54[1][0]){case"Black":return true};break};return false}()}
962+function redBlack_children_8(t_55){return function(){switch(t_55[0]){case"RBEmpty":return true;case"RBNode":switch(t_55[1][0]){case"Red":switch(t_55[4][0]){case"RBNode":switch(t_55[4][1][0]){case"Red":return false};break};switch(t_55[5][0]){case"RBNode":switch(t_55[5][1][0]){case"Red":return false};break};break};return(redBlack_children_8(t_55[4])&&redBlack_children_8(t_55[5]))};throw "Non-exhaustive pattern match in case"}()}
963+function findExtreme_9(f_58){return function(t_59){return function(){switch(t_59[0]){case"RBEmpty":return Nothing;case"RBNode":return function(){var case6=findExtreme_9(f_58)(f_58(["Tuple2",t_59[4],t_59[5]]));switch(case6[0]){case"Just":return Just(case6[1]);case"Nothing":return Just(t_59[2])};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
964+function findminRbt_10(t_65){return findExtreme_9(fst)(t_65)}
965+function findmaxRbt_11(t_66){return findExtreme_9(snd)(t_66)}
966+function optionRelation_12(f_67){return function(u_68){return function(xo_69){return function(yo_70){return function(){var case0=["Tuple2",xo_69,yo_70];switch(case0[0]){case"Tuple2":switch(case0[1][0]){case"Nothing":return u_68};switch(case0[2][0]){case"Nothing":return u_68};switch(case0[1][0]){case"Just":switch(case0[2][0]){case"Just":return f_67(case0[1][1])(case0[2][1])};break};break};throw "Non-exhaustive pattern match in case"}()}}}}
967+function olt_13(xo_73){return function(yo_74){return optionRelation_12(function(x_75){return function(y_76){return(compare(x_75)(y_76)[0]==='LT')}})(true)(xo_73)(yo_74)}}
968+function olte_14(xo_77){return function(yo_78){return optionRelation_12(function(x_79){return function(y_80){return function(){var ord=compare(x_79)(y_80)[0];return ord==='LT'||ord==='EQ'}()}})(true)(xo_77)(yo_78)}}
969+function ordered_15(t_81){return function(){switch(t_81[0]){case"RBEmpty":return true;case"RBNode":return function(){var Tuple2$lmaxrmin_87=["Tuple2",findmaxRbt_11(t_81[4]),findminRbt_10(t_81[5])],lmax_88=function(){switch(Tuple2$lmaxrmin_87[0]){case"Tuple2":return Tuple2$lmaxrmin_87[1]};throw "Non-exhaustive pattern match in case"}(),rmin_89=function(){switch(Tuple2$lmaxrmin_87[0]){case"Tuple2":return Tuple2$lmaxrmin_87[2]};throw "Non-exhaustive pattern match in case"}();return(olte_14(lmax_88)(Just(t_81[2]))&&(olte_14(Just(t_81[2]))(rmin_89)&&(ordered_15(t_81[4])&&ordered_15(t_81[5]))))}()};throw "Non-exhaustive pattern match in case"}()}
970+function leftLeaning_16(t_94){return function(){switch(t_94[0]){case"RBEmpty":return true;case"RBNode":switch(t_94[4][0]){case"RBEmpty":switch(t_94[5][0]){case"RBNode":switch(t_94[5][1][0]){case"Red":return false};break};break;case"RBNode":switch(t_94[4][1][0]){case"Black":switch(t_94[5][0]){case"RBNode":switch(t_94[5][1][0]){case"Red":return false};break};break};break};return(leftLeaning_16(t_94[4])&&leftLeaning_16(t_94[5]))};throw "Non-exhaustive pattern match in case"}()}
971+function invariants_hold_17(t_97){return(ordered_15(t_97)&&(rootBlack_7(t_97)&&(redBlack_children_8(t_97)&&(equal_pathLen_6(t_97)&&leftLeaning_16(t_97)))))}
972+function min_18(t_98){return function(){switch(t_98[0]){case"RBEmpty":return console.log(Value.str("(min RBEmpty) is not defined"));case"RBNode":switch(t_98[4][0]){case"RBEmpty":return ["Tuple2",t_98[2],t_98[3]]};return min_18(t_98[4])};throw "Non-exhaustive pattern match in case"}()}
973+function max_19(t_102){return function(){switch(t_102[0]){case"RBEmpty":return console.log(Value.str("(max RBEmpty) is not defined"));case"RBNode":switch(t_102[5][0]){case"RBEmpty":return ["Tuple2",t_102[2],t_102[3]]};return max_19(t_102[5])};throw "Non-exhaustive pattern match in case"}()}
974+function lookup_20(k_106){return function(t_107){return function(){switch(t_107[0]){case"RBEmpty":return Nothing;case"RBNode":return function(){var case6=compare(k_106)(t_107[2]);switch(case6[0]){case"EQ":return Just(t_107[3]);case"GT":return lookup_20(k_106)(t_107[5]);case"LT":return lookup_20(k_106)(t_107[4])};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
975+function member_21(k_112){return function(t_113){return isJust(lookup_20(k_112)(t_113))}}
976+function rotateLeft_22(t_114){return function(){switch(t_114[0]){case"RBNode":switch(t_114[5][0]){case"RBNode":return RBNode_2(t_114[1])(t_114[5][2])(t_114[5][3])(RBNode_2(Red_0)(t_114[2])(t_114[3])(t_114[4])(t_114[5][4]))(t_114[5][5])};break};return raise_4(Value.str("rotateLeft of a node without enough children"))}()}
977+function rotateRight_23(t_124){return function(){switch(t_124[0]){case"RBNode":switch(t_124[4][0]){case"RBNode":return RBNode_2(t_124[1])(t_124[4][2])(t_124[4][3])(t_124[4][4])(RBNode_2(Red_0)(t_124[2])(t_124[3])(t_124[4][5])(t_124[5]))};break};return raise_4(Value.str("rotateRight of a node without enough children"))}()}
978+function rotateLeftIfNeeded_24(t_134){return function(){switch(t_134[0]){case"RBNode":switch(t_134[5][0]){case"RBNode":switch(t_134[5][1][0]){case"Red":return rotateLeft_22(t_134)};break};break};return t_134}()}
979+function rotateRightIfNeeded_25(t_135){return function(){switch(t_135[0]){case"RBNode":switch(t_135[4][0]){case"RBNode":switch(t_135[4][1][0]){case"Red":switch(t_135[4][4][0]){case"RBNode":switch(t_135[4][4][1][0]){case"Red":return rotateRight_23(t_135)};break};break};break};break};return t_135}()}
980+function otherColor_26(c_136){return function(){switch(c_136[0]){case"Black":return Red_0;case"Red":return Black_1};throw "Non-exhaustive pattern match in case"}()}
981+function color_flip_27(t_137){return function(){switch(t_137[0]){case"RBNode":switch(t_137[4][0]){case"RBNode":switch(t_137[5][0]){case"RBNode":return RBNode_2(otherColor_26(t_137[1]))(t_137[2])(t_137[3])(RBNode_2(otherColor_26(t_137[4][1]))(t_137[4][2])(t_137[4][3])(t_137[4][4])(t_137[4][5]))(RBNode_2(otherColor_26(t_137[5][1]))(t_137[5][2])(t_137[5][3])(t_137[5][4])(t_137[5][5]))};break};break};return raise_4(Value.str("color_flip called on a RBEmpty or RBNode with a RBEmpty child"))}()}
982+function color_flipIfNeeded_28(t_151){return function(){switch(t_151[0]){case"RBNode":switch(t_151[4][0]){case"RBNode":switch(t_151[4][1][0]){case"Red":switch(t_151[5][0]){case"RBNode":switch(t_151[5][1][0]){case"Red":return color_flip_27(t_151)};break};break};break};break};return t_151}()}
983+function fixUp_29(t_152){return color_flipIfNeeded_28(rotateRightIfNeeded_25(rotateLeftIfNeeded_24(t_152)))}
984+function ensureBlackRoot_30(t_153){return function(){switch(t_153[0]){case"RBNode":switch(t_153[1][0]){case"Red":return RBNode_2(Black_1)(t_153[2])(t_153[3])(t_153[4])(t_153[5])};break};return t_153}()}
985+function insert_31(k_158){return function(v_159){return function(t_160){return function(){function ins_161(t_162){return function(){switch(t_162[0]){case"RBEmpty":return RBNode_2(Red_0)(k_158)(v_159)(RBEmpty_3)(RBEmpty_3);case"RBNode":return function(){var h_168=function(){var case6=compare(k_158)(t_162[2]);switch(case6[0]){case"EQ":return RBNode_2(t_162[1])(t_162[2])(v_159)(t_162[4])(t_162[5]);case"GT":return RBNode_2(t_162[1])(t_162[2])(t_162[3])(t_162[4])(ins_161(t_162[5]));case"LT":return RBNode_2(t_162[1])(t_162[2])(t_162[3])(ins_161(t_162[4]))(t_162[5])};throw "Non-exhaustive pattern match in case"}();return fixUp_29(h_168)}()};throw "Non-exhaustive pattern match in case"}()};return(not(invariants_hold_17(t_160))?raise_4(Value.str("invariants broken before insert")):function(){var new_t_169=ensureBlackRoot_30(ins_161(t_160));return(not(invariants_hold_17(new_t_169))?raise_4(Value.str("invariants broken after insert")):new_t_169)}())}()}}}
986+function singleton_32(k_170){return function(v_171){return insert_31(k_170)(v_171)(RBEmpty_3)}}
987+function isRed_33(t_172){return function(){switch(t_172[0]){case"RBNode":switch(t_172[1][0]){case"Red":return true};break};return false}()}
988+function isRedLeft_34(t_173){return function(){switch(t_173[0]){case"RBNode":switch(t_173[4][0]){case"RBNode":switch(t_173[4][1][0]){case"Red":return true};break};break};return false}()}
989+function isRedLeftLeft_35(t_174){return function(){switch(t_174[0]){case"RBNode":switch(t_174[4][0]){case"RBNode":switch(t_174[4][4][0]){case"RBNode":switch(t_174[4][4][1][0]){case"Red":return true};break};break};break};return false}()}
990+function isRedRight_36(t_175){return function(){switch(t_175[0]){case"RBNode":switch(t_175[5][0]){case"RBNode":switch(t_175[5][1][0]){case"Red":return true};break};break};return false}()}
991+function isRedRightLeft_37(t_176){return function(){switch(t_176[0]){case"RBNode":switch(t_176[5][0]){case"RBNode":switch(t_176[5][4][0]){case"RBNode":switch(t_176[5][4][1][0]){case"Red":return true};break};break};break};return false}()}
992+function moveRedLeft_38(t_177){return function(){var t__178=color_flip_27(t_177);return function(){switch(t__178[0]){case"RBNode":return function(){switch(t__178[5][0]){case"RBNode":switch(t__178[5][4][0]){case"RBNode":switch(t__178[5][4][1][0]){case"Red":return color_flip_27(rotateLeft_22(RBNode_2(t__178[1])(t__178[2])(t__178[3])(t__178[4])(rotateRight_23(t__178[5]))))};break};break};return t__178}()};return t__178}()}()}
993+function moveRedRight_39(t_184){return function(){var t__185=color_flip_27(t_184);return(isRedLeftLeft_35(t__185)?color_flip_27(rotateRight_23(t__185)):t__185)}()}
994+function moveRedLeftIfNeeded_40(t_186){return((not(isRedLeft_34(t_186))&&not(isRedLeftLeft_35(t_186)))?moveRedLeft_38(t_186):t_186)}
995+function moveRedRightIfNeeded_41(t_187){return((not(isRedRight_36(t_187))&&not(isRedRightLeft_37(t_187)))?moveRedRight_39(t_187):t_187)}
996+function deleteMin_42(t_188){return function(){function del_189(t_190){return function(){switch(t_190[0]){case"RBNode":switch(t_190[4][0]){case"RBEmpty":return RBEmpty_3};break};return function(){var t__191=moveRedLeftIfNeeded_40(t_190);return function(){switch(t__191[0]){case"RBEmpty":return RBEmpty_3;case"RBNode":return fixUp_29(RBNode_2(t__191[1])(t__191[2])(t__191[3])(del_189(t__191[4]))(t__191[5]))};throw "Non-exhaustive pattern match in case"}()}()}()};return ensureBlackRoot_30(del_189(t_188))}()}
997+function deleteMax_43(t_197){return function(){function del_198(t_199){return function(){var t__200=(isRedLeft_34(t_199)?rotateRight_23(t_199):t_199);return function(){switch(t__200[0]){case"RBNode":switch(t__200[5][0]){case"RBEmpty":return RBEmpty_3};break};return function(){var t___201=moveRedRightIfNeeded_41(t__200);return function(){switch(t___201[0]){case"RBEmpty":return RBEmpty_3;case"RBNode":return fixUp_29(RBNode_2(t___201[1])(t___201[2])(t___201[3])(t___201[4])(del_198(t___201[5])))};throw "Non-exhaustive pattern match in case"}()}()}()}()};return ensureBlackRoot_30(del_198(t_197))}()}
998+function remove_44(k_207){return function(t_208){return function(){function eq_and_noRightNode_209(t_215){return function(){switch(t_215[0]){case"RBNode":switch(t_215[5][0]){case"RBEmpty":return eq(k_207,t_215[2])};break};return false}()}
999+function eq_210(t_217){return function(){switch(t_217[0]){case"RBNode":return eq(k_207,t_217[2])};return false}()}
1000+function delLT_211(t_219){return function(){var t__220=moveRedLeftIfNeeded_40(t_219);return function(){switch(t__220[0]){case"RBEmpty":return raise_4(Value.str("delLT on RBEmpty"));case"RBNode":return fixUp_29(RBNode_2(t__220[1])(t__220[2])(t__220[3])(del_214(t__220[4]))(t__220[5]))};throw "Non-exhaustive pattern match in case"}()}()}
1001+function delEQ_212(t_226){return function(){switch(t_226[0]){case"RBEmpty":return raise_4(Value.str("delEQ called on a RBEmpty"));case"RBNode":return function(){var Tuple2$k_v__230=min_18(t_226[5]),k__231=function(){switch(Tuple2$k_v__230[0]){case"Tuple2":return Tuple2$k_v__230[1]};throw "Non-exhaustive pattern match in case"}(),v__232=function(){switch(Tuple2$k_v__230[0]){case"Tuple2":return Tuple2$k_v__230[2]};throw "Non-exhaustive pattern match in case"}();return fixUp_29(RBNode_2(t_226[1])(k__231)(v__232)(t_226[4])(deleteMin_42(t_226[5])))}()};throw "Non-exhaustive pattern match in case"}()}
1002+function delGT_213(t_237){return function(){switch(t_237[0]){case"RBEmpty":return raise_4(Value.str("delGT called on a RBEmpty"));case"RBNode":return fixUp_29(RBNode_2(t_237[1])(t_237[2])(t_237[3])(t_237[4])(del_214(t_237[5])))};throw "Non-exhaustive pattern match in case"}()}
1003+function del_214(t_243){return function(){switch(t_243[0]){case"RBEmpty":return RBEmpty_3;case"RBNode":return((compare(k_207)(t_243[2])[0]==='LT')?delLT_211(t_243):function(){var t__245=(isRedLeft_34(t_243)?rotateRight_23(t_243):t_243);return(eq_and_noRightNode_209(t__245)?RBEmpty_3:function(){var t_246=moveRedRightIfNeeded_41(t_246);return(eq_210(t_246)?delEQ_212(t_246):delGT_213(t_246))}())}())};throw "Non-exhaustive pattern match in case"}()};return(not(invariants_hold_17(t_208))?raise_4(Value.str("invariants broken before remove")):function(){var t__247=ensureBlackRoot_30(del_214(t_208));return(invariants_hold_17(t__247)?t__247:raise_4(Value.str("invariants broken after remove")))}())}()}}
1004+function fold_45(f_248){return function(acc_249){return function(t_250){return function(){switch(t_250[0]){case"RBEmpty":return acc_249;case"RBNode":return fold_45(f_248)(f_248(t_250[2])(t_250[3])(fold_45(f_248)(acc_249)(t_250[4])))(t_250[5])};throw "Non-exhaustive pattern match in case"}()}}};return {empty:empty_5,lookup:lookup_20,member:member_21,insert:insert_31,singleton:singleton_32,remove:remove_44,fold:fold_45}}();Elm.main=function(){return Elm.Dict.main}}catch(e){Elm.main=function(){var msg=('<br/><h2>Your browser may not be supported. Are you using a modern browser?</h2>'+'<br/><span style="color:grey">Runtime Error in Dict module:<br/>'+e+'<br/><br/>The problem may stem from an improper usage of:<br/>EQ, GT, LT, console.log, fst, snd</span>');document.body.innerHTML=Text.monospace(msg);throw e}}try{if(Elm.Set)throw "Module name collision, 'Set' is already defined.";Elm.Set=function(){try{if(!(Elm.Prelude instanceof Object))throw 'module not found'}catch(e){throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var hiddenVars=[];for(var i in Elm.Prelude){if(hiddenVars.indexOf(i)>=0)continue;this[i]=Elm.Prelude[i]};try{if(!(Elm.Dict instanceof Object))throw 'module not found'}catch(e){throw "Module 'Dict' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var Dict=Elm.Dict,empty_0=Dict.empty,remove_3=Dict.remove,member_4=Dict.member
1005+function singleton_1(k_5){return Dict.singleton(k_5)(["Tuple0"])}
1006+function insert_2(k_6){return Dict.insert(k_6)(["Tuple0"])};return {empty:empty_0,singleton:singleton_1,insert:insert_2,remove:remove_3,member:member_4}}();Elm.main=function(){return Elm.Set.main}}catch(e){Elm.main=function(){var msg=('<br/><h2>Your browser may not be supported. Are you using a modern browser?</h2>'+'<br/><span style="color:grey">Runtime Error in Set module:<br/>'+e+'<br/><br/>The problem may stem from an improper usage of:<br/>Dict.empty, Dict.insert, Dict.member, Dict.remove, Dict.singleton</span>');document.body.innerHTML=Text.monospace(msg);throw e}}
1007+var Elm = Elm || {};
1008+Elm.Char = function() {
1009+ function isBetween(lo,hi) { return function(chr) {
1010+ var c = chr.charCodeAt(0);
1011+ return lo <= c && c <= hi;
1012+ };
1013+ }
1014+ var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
1015+ var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
1016+ var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
1017+
1018+ return {fromCode : function(c) { return String.fromCharCode(c); },
1019+ toCode : function(c) { return c.charCodeAt(0); },
1020+ toUpper : function(c) { return c.toUpperCase(); },
1021+ toLower : function(c) { return c.toLowerCase(); },
1022+ toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
1023+ toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
1024+ isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
1025+ isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
1026+ isDigit : isDigit,
1027+ isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
1028+ isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
1029+ };
1030+}();
1031+
1032+var Elm = Elm || {};
1033+Elm.Maybe = function() {
1034+ function consMaybe(x) { return function(xs) {
1035+ if (x[0] === "Just") return ["Cons", x[1], xs];
1036+ return xs;
1037+ };
1038+ }
1039+ function fromMaybe(b) { return function(m) {
1040+ if (m[0] === "Just") return m[1];
1041+ return b;
1042+ };
1043+ }
1044+ function mapCons(f) { return function(y) { return function(xs) {
1045+ var x = f(y);
1046+ if (x[0] === "Just") return ["Cons", x[1], xs];
1047+ return xs;
1048+ };
1049+ };
1050+ }
1051+ function maybe(b) { return function(f) { return function(m) {
1052+ if (m[0] === "Just") return f(m[1]);
1053+ return b;
1054+ };
1055+ };
1056+ }
1057+
1058+ return {Just : function(x) { return ["Just",x]; },
1059+ Nothing : ["Nothing"],
1060+ catMaybes : Elm.List.foldr(consMaybe)(["Nil"]),
1061+ isJust : function(m) { return m[0] === "Just"; },
1062+ isNothing : function(m) { return m[0] === "Nothing"; },
1063+ fromMaybe : fromMaybe,
1064+ consMaybe : consMaybe,
1065+ mapMaybe : function(f) { return Elm.List.foldr(mapCons(f))(["Nil"]); },
1066+ maybe : maybe
1067+ };
1068+}();
1069+
1070+/*
1071+var String = function() {
1072+
1073+ function append(s1) { return function(s2) {
1074+ return s1.concat(s2);
1075+ };
1076+ }
1077+ function map(f) { return function(s) {
1078+ for (var i = s.length; i--; ) { s[i] = f(s[i]); }
1079+ };
1080+ }
1081+
1082+ function intercalate(sep) { return function(ss) {
1083+ return Value.listToArray(ss).join(sep);
1084+ };
1085+ }
1086+ function intersperse(sep) { return function(s) {
1087+ return s.split("").join(sep);
1088+ };
1089+ }
1090+
1091+ function foldl(f) { return function(b) { return function(s) {
1092+ var acc = b;
1093+ for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
1094+ return acc;
1095+ };
1096+ };
1097+ }
1098+ function foldr(f) { return function(b) { return function(s) {
1099+ var acc = b;
1100+ for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
1101+ return acc;
1102+ };
1103+ };
1104+ }
1105+
1106+ function concatMap(f) { return function(s) {
1107+ var a = s.split("");
1108+ for (var i = a.length; i--; ) { a[i] = f(a[i]); }
1109+ return a.join("");
1110+ };
1111+ }
1112+
1113+ function forall(pred) { return function(s) {
1114+ for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
1115+ return true;
1116+ };
1117+ }
1118+ function exists(pred) { return function(s) {
1119+ for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
1120+ return false;
1121+ };
1122+ }
1123+
1124+ return {cons : append,
1125+ snoc : append,
1126+ head : function(s) { return s[0]; },
1127+ last : function(s) { return s[s.length-1]; },
1128+ tail : function(s) { return s.slice(1); },
1129+ length : function(s) { return s.length; },
1130+ map : map,
1131+ intercalate : intercalate,
1132+ intersperse : intersperse,
1133+ reverse : function(s) { return s.split("").reverse().join(""); },
1134+ toLower : function(s) { return s.toLowerCase(); },
1135+ toUpper : function(s) { return s.toUpperCase(); },
1136+ foldl : foldl,
1137+ foldr : foldr,
1138+ concat : function(ss) { return Value.listToArray(ss).join(""); },
1139+ concatMap : concatMap,
1140+ forall : forall,
1141+ exists : exists,
1142+ //filter : filter,
1143+ //take:,
1144+ //drop:,
1145+ toText : Value.toText,
1146+ properEscape : Value.properEscape
1147+ };
1148+}();
1149+*/
1150+
1151+var String = {toText:Value.toText, properEscape:Value.properEscape};
1152+var Elm = Elm || {};
1153+Elm.Graphics = Elm.Graphics || {};
1154+Elm.Graphics.Color = function() {
1155+ function Color_0(a1) {
1156+ return function(a2) {
1157+ return function(a3) {
1158+ return function(a4) {
1159+ return["Color", a1, a2, a3, a4]
1160+ }
1161+ }
1162+ }
1163+ }
1164+ var rgba_1 = Color_0;
1165+ var red_3 = ["Color",255,0,0,1];
1166+ var green_4 = ["Color",0,255,0,1];
1167+ var blue_5 = ["Color",0,0,255,1];
1168+ var yellow_6 = ["Color",255,255,0,1];
1169+ var cyan_7 = ["Color",0,255,255,1];
1170+ var magenta_8 = ["Color",255,0,255,1];
1171+ var black_9 = ["Color",0,0,0,1];
1172+ var white_10 = ["Color",255,255,255,1];
1173+ var gray_11 = ["Color",128,128,128,1];
1174+ var grey_12 = ["Color",128,128,128,1];
1175+ function rgb_2(r_13) {
1176+ return function(g_14) {
1177+ return function(b_15) {
1178+ return ["Color",r_13,g_14,b_15,1]
1179+ }
1180+ }
1181+ }
1182+ function extract(c) {
1183+ if (c[4] === 1) { return 'rgb(' + c[1] + ',' + c[2] + ',' + c[3] + ')'; }
1184+ return 'rgba(' + c[1] + ',' + c[2] + ',' + c[3] + ',' + c[4] + ')';
1185+ }
1186+ return{rgba:rgba_1, rgb:rgb_2, red:red_3, green:green_4, blue:blue_5, yellow:yellow_6, cyan:cyan_7, magenta:magenta_8, black:black_9, white:white_10, gray:gray_11, grey:grey_12,extract:extract}
1187+}();
1188+var Collage = function() {
1189+
1190+var JS = Elm.JavaScript;
1191+
1192+function tracePoints(ctx,points) {
1193+ var i = points.length - 1;
1194+ if (i <= 0) return;
1195+ ctx.moveTo(points[i][1], points[i][2]);
1196+ while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
1197+}
1198+
1199+function solid(ctx,color,points) {
1200+ tracePoints(ctx,points);
1201+ ctx.strokeStyle = Elm.Graphics.Color.extract(color);
1202+ ctx.stroke();
1203+};
1204+
1205+function filled(ctx,color,points) {
1206+ tracePoints(ctx,points);
1207+ ctx.fillStyle = Elm.Graphics.Color.extract(color);
1208+ ctx.fill();
1209+}
1210+
1211+function textured(redo,ctx,src,points) {
1212+ var img = new Image();
1213+ img.src = JS.castStringToJSString(src);
1214+ img.onload = redo;
1215+
1216+ tracePoints(ctx,points);
1217+ ctx.fillStyle = ctx.createPattern(img,'repeat');
1218+ ctx.fill();
1219+}
1220+
1221+function customLine(pattern,ctx,color,points) {
1222+ if (pattern.length === 0) { pattern = [8,4]; }
1223+ customLineHelp(ctx, pattern, points);
1224+ ctx.strokeStyle = Elm.Graphics.Color.extract(color);
1225+ ctx.stroke();
1226+};
1227+
1228+var customLineHelp = function(ctx, pattern, points) {
1229+ var i = points.length - 1;
1230+ if (i <= 0) return;
1231+ var x0 = points[i][1], y0 = points[i][2];
1232+ var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;
1233+ var pindex = 0, plen = pattern.length;
1234+ var draw = true, segmentLength = pattern[0];
1235+ ctx.moveTo(x0,y0);
1236+ while (i--) {
1237+ x1 = points[i][1]; y1 = points[i][2];
1238+ dx = x1 - x0; dy = y1 - y0;
1239+ remaining = Math.sqrt(dx * dx + dy * dy);
1240+ while (segmentLength <= remaining) {
1241+ x0 += dx * segmentLength / remaining;
1242+ y0 += dy * segmentLength / remaining;
1243+ ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
1244+ // update starting position
1245+ dx = x1 - x0; dy = y1 - y0;
1246+ remaining = Math.sqrt(dx * dx + dy * dy);
1247+ // update pattern
1248+ draw = !draw;
1249+ pindex = (pindex + 1) % plen;
1250+ segmentLength = pattern[pindex];
1251+ }
1252+ if (remaining > 0) {
1253+ ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1254+ segmentLength -= remaining;
1255+ }
1256+ x0 = x1; y0 = y1;
1257+ }
1258+};
1259+
1260+function drawLine(ctx,form) {
1261+ var points = form[3][1];
1262+ switch(form[1][0]) {
1263+ case "Solid" : return solid(ctx,form[2],points);
1264+ case "Dotted": return customLine([3,3],ctx,form[2],points);
1265+ case "Dashed": return customLine([8,4],ctx,form[2],points);
1266+ case "Custom": return customLine(form[1][1],ctx,form[2],points);
1267+ }
1268+};
1269+
1270+function drawShape(redo,ctx,shapeStyle,color,points) {
1271+ switch(shapeStyle[0]) {
1272+ case "Filled": return filled(ctx,color,points);
1273+ case "Outlined": return solid(ctx,color,points);
1274+ case "Textured": return textured(redo,ctx,shapeStyle[1],points);
1275+ case "CustomOutline":
1276+ return customLine(shapeStyle[1],ctx,color,points);
1277+ }
1278+};
1279+
1280+function drawImage(redo,ctx,w,h,src) {
1281+ var img = new Image();
1282+ img.onload = redo;
1283+ img.src = JS.castStringToJSString(src);
1284+ ctx.drawImage(img,-w/2,-h/2,w,h);
1285+}
1286+
1287+function renderForm(redo,ctx,theta,scale,x,y,form) {
1288+ ctx.save();
1289+ if (x !== 0 || y !== 0) ctx.translate(x,y);
1290+ if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
1291+ if (scale !== 1) ctx.scale(scale,scale);
1292+ ctx.beginPath();
1293+ switch(form[0]) {
1294+ case "FLine": drawLine(ctx,form); break;
1295+ case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
1296+ case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
1297+ }
1298+ ctx.restore();
1299+};
1300+
1301+function renderForms(redo,ctx,w,h,forms) {
1302+ ctx.clearRect(0,0,w,h);
1303+ for (var i = forms.length; i--; ) {
1304+ var f = forms[i];
1305+ renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
1306+ }
1307+}
1308+
1309+function collageForms(w,h,forms) {
1310+ var canvas = Render.newElement('canvas');
1311+ canvas.style.width = (~~w) + 'px';
1312+ canvas.style.height = (~~h) + 'px';
1313+ canvas.style.display = "block";
1314+ canvas.width = ~~w;
1315+ canvas.height = ~~h;
1316+ if (canvas.getContext) {
1317+ var ctx = canvas.getContext('2d');
1318+ var w = canvas.width, h = canvas.height;
1319+ function redo() { renderForms(this,ctx,w,h,forms); }
1320+ renderForms(redo,ctx,w,h,forms);
1321+ return canvas;
1322+ }
1323+ canvas.innerHTML = "Your browser does not support the canvas element.";
1324+ return canvas;
1325+};
1326+
1327+function collageElement(w,h,theta,scale,x,y,elem) {
1328+ var e = Render.render(elem);
1329+ var t = "translate(" + (x - elem[3] / 2) + "px,"+ (y - elem[4] / 2) + "px)";
1330+ var r = theta === (~~theta) ? "" : "rotate(" + theta*360 + "deg)";
1331+ var s = scale === 1 ? "" : "scale(" + scale + "," + scale + ")";
1332+ var transforms = t + " " + s + " " + r;
1333+ e.style.transform = transforms;
1334+ e.style.msTransform = transforms;
1335+ e.style.MozTransform = transforms;
1336+ e.style.webkitTransform = transforms;
1337+ e.style.OTransform = transforms;
1338+ var div = Render.newElement('div');
1339+ Render.addTo(div,e);
1340+ div.style.width = (~~w) + "px";
1341+ div.style.height = (~~h) + "px";
1342+ div.style.overflow = "hidden";
1343+ return div;
1344+}
1345+
1346+function collage(w,h,formss) {
1347+ if (formss.length === 0) { return collageForms(w,h,[]); }
1348+ var elems = new Array(formss.length);
1349+ for (var i = formss.length; i--; ) {
1350+ var f = formss[i];
1351+ if (typeof f[0] === "string") {
1352+ elems[i] = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1353+ } else {
1354+ elems[i] = collageForms(w,h,f);
1355+ }
1356+ }
1357+ if (formss.length === 1) { return elems[0]; }
1358+ return Render.flowWith(Render.goIn,function(x){return x},elems);
1359+}
1360+
1361+function updateFormSet(node,currSet,nextSet) {
1362+ if (Value.eq(nextSet,currSet)) return;
1363+ var w = node.style.width.slice(0,-2) - 0;
1364+ var h = node.style.height.slice(0,-2) - 0;
1365+ if (typeof nextSet[0] === "object") {
1366+ if (typeof currSet[0] === "object") {
1367+ if (node.getContext) {
1368+ var ctx = node.getContext('2d');
1369+ function redo() { renderForms(this,ctx,w,h,nextSet); }
1370+ return renderForms(redo,ctx,w,h,nextSet);
1371+ }
1372+ }
1373+ var newNode = collageForms(w,h,nextSet);
1374+ newNode.style.position = 'absolute';
1375+ return node.parentNode.replaceChild(newNode,node);
1376+ }
1377+ var f = nextSet;
1378+ var newNode = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1379+ newNode.style.position = 'absolute';
1380+ return node.parentNode.replaceChild(newNode,node);
1381+}
1382+
1383+// assumes that the form sets are the same length.
1384+function updateCollage(node,currs,nexts) {
1385+ if (nexts.length === 1) {
1386+ return updateFormSet(node,currs[0],nexts[0]);
1387+ }
1388+ var kids = node.childNodes;
1389+ var len = kids.length;
1390+ for (var i = len; i--; ) {
1391+ updateFormSet(kids[len-i-1], currs[i], nexts[i]);
1392+ }
1393+}
1394+
1395+function style(clr,n,list) {
1396+ return ["Tuple2",
1397+ '<span style="font-size:100%;color:' + clr + ';">' + n + '</span>',
1398+ list];
1399+}
1400+
1401+function insideForm(point) { return function(form) {
1402+ if (!inBoundsOf(point[1],point[2],form)) return false;
1403+ var hw, hh;
1404+ switch (form[4][0]) {
1405+ case "FShape": return insideShape(point,form[1],form[2],form[3],form[4][3][1]);
1406+ case "FLine": return false;
1407+ case "FImage":
1408+ hw = form[4][1] / 2;
1409+ hh = form[4][2] / 2;
1410+ break;
1411+ case "FElement":
1412+ hw = form[4][1][3] / 2;
1413+ hh = form[4][1][4] / 2;
1414+ break;
1415+ }
1416+ return insideShape(point,form[1],form[2],form[3],
1417+ [ [null, hw, hh],
1418+ [null,-hw, hh],
1419+ [null,-hw,-hh],
1420+ [null, hw,-hh],
1421+ [null, hw, hh] ]);
1422+ };
1423+}
1424+
1425+function inBoundsOf(px,py,form) {
1426+ if (form.length < 6) {
1427+ var fx = form[3][1], fy = form[3][2];
1428+ var radiusSquared = 0;
1429+ var scale = form[2];
1430+ switch (form[4][0]) {
1431+ case "FShape":
1432+ var points = form[4][3][1];
1433+ for (var i = points.length; --i; ) {
1434+ var p = points[i];
1435+ radiusSquared = Math.max(radiusSquared, p[1]*p[1] + p[2]*p[2]);
1436+ }
1437+ radiusSquared *= scale * scale;
1438+ break;
1439+ case "FLine":
1440+ break;
1441+ case "FImage":
1442+ var x = scale * form[4][1] / 2;
1443+ var y = scale * form[4][2] / 2;
1444+ radiusSquared = x*x + y*y;
1445+ break;
1446+ case "FElement":
1447+ var x = scale * form[4][1][3] / 2;
1448+ var y = scale * form[4][1][4] / 2;
1449+ radiusSquared = x*x + y*y;
1450+ break;
1451+ }
1452+ form.push(function(px,py) {
1453+ var dx = px - fx;
1454+ var dy = py - fy;
1455+ return dx*dx + dy*dy < radiusSquared + 1;
1456+ });
1457+ }
1458+ return form[5](px,py);
1459+}
1460+
1461+function insideShape(point,theta,scale,pos,points) {
1462+ var counter = 0;
1463+ var list = ["Nil"];
1464+ var p1,p2;
1465+
1466+ var x = (point[1] - pos[1]) / scale;
1467+ var y = (point[2] - pos[2]) / scale;
1468+ if (theta !== 0) {
1469+ var t = -2 * Math.PI * theta;
1470+ var nx = x * Math.cos(t) - y * Math.sin(t);
1471+ y = x * Math.sin(t) + y * Math.cos(t);
1472+ x = nx;
1473+ }
1474+
1475+ if (points.length === 0) { return false; }
1476+ p1 = points[0];
1477+ for (var i = points.length - 1; i--; ) {
1478+ p2 = points[i];
1479+ var p1x = p1[1], p1y = p1[2], p2x = p2[1], p2y = p2[2];
1480+
1481+ if (p1y < p2y) {var ymin=p1y, ymax=p2y;} else {var ymin=p2y, ymax=p1y;}
1482+ if (p1x < p2x) {var xmin=p1x, xmax=p2x;} else {var xmin=p2x, xmax=p1x;}
1483+
1484+ if (ymin < y && y <= ymax && x <= xmax) {
1485+ if (x <= xmin || x <= ((y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x)) {
1486+ ++counter;
1487+ }
1488+ }
1489+ p1 = p2;
1490+ }
1491+ return (counter % 2) === 1;
1492+}
1493+
1494+return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
1495+
1496+}();var Elm = Elm || {};
1497+Elm.Graphics = Elm.Graphics || {};
1498+Elm.Graphics.Element = function() {
1499+ var JS = Elm.JavaScript;
1500+ var DLeft_0 = ["DLeft"];
1501+ var DRight_1 = ["DRight"];
1502+ var DUp_2 = ["DUp"];
1503+ var DDown_3 = ["DDown"];
1504+ var DIn_4 = ["DIn"];
1505+ var DOut_5 = ["DOut"];
1506+ function Absolute_12(a1) {
1507+ return["Absolute", a1]
1508+ }
1509+ function Relative_13(a1) {
1510+ return["Relative", a1]
1511+ }
1512+ var Near_14 = ["Near"];
1513+ var Mid_15 = ["Mid"];
1514+ var Far_16 = ["Far"];
1515+ function Position_17(a1) {
1516+ return function(a2) {
1517+ return["Position", a1, a2]
1518+ }
1519+ }
1520+ function PositionTL_18(a1) {
1521+ return function(a2) {
1522+ return["PositionTL", a1, a2]
1523+ }
1524+ }
1525+ function PositionTR_19(a1) {
1526+ return function(a2) {
1527+ return["PositionTR", a1, a2]
1528+ }
1529+ }
1530+ function PositionBL_20(a1) {
1531+ return function(a2) {
1532+ return["PositionBL", a1, a2]
1533+ }
1534+ }
1535+ function PositionBR_21(a1) {
1536+ return function(a2) {
1537+ return["PositionBR", a1, a2]
1538+ }
1539+ }
1540+ function Element_37(id,e,w,h,o,c,l) {
1541+ return["Element", id, e, w, h, o, c, l ]
1542+ }
1543+ function EText_39(a1) {
1544+ return function(a2) {
1545+ return["EText", a1, a2]
1546+ }
1547+ }
1548+ function EImage_40(a1) {
1549+ return["EImage", JS.castStringToJSString(a1)]
1550+ }
1551+ function EVideo_41(a1) {
1552+ return["EVideo", JS.castStringToJSString(a1)]
1553+ }
1554+ function EFittedImage_42(a1) {
1555+ return["EFittedImage", JS.castStringToJSString(a1)]
1556+ }
1557+ function EFlow_43(a1) {
1558+ return function(a2) {
1559+ return["EFlow", a1, JS.castListToJSArray(a2)]
1560+ }
1561+ }
1562+ function ECollage_44(a1) {
1563+ return function(a2) {
1564+ return function(a3) {
1565+ return["ECollage", a1, a2, Value.groupForms(a3)]
1566+ }
1567+ }
1568+ }
1569+ var EEmpty_45 = ["EEmpty"];
1570+ function EContainer_46(a1) {
1571+ return function(a2) {
1572+ return["EContainer", a1, a2]
1573+ }
1574+ }
1575+ var Solid_68 = ["Solid"];
1576+ var Dotted_69 = ["Dotted"];
1577+ var Dashed_70 = ["Dashed"];
1578+ function Custom_71(a1) {
1579+ return["Custom", JS.castListToJSArray(a1)]
1580+ }
1581+ var Filled_72 = ["Filled"];
1582+ var Outlined_73 = ["Outlined"];
1583+ function CustomOutline_74(a1) {
1584+ return["CustomOutline", JS.castListToJSArray(a1)]
1585+ }
1586+ function Line_75(a1) {
1587+ return["Line", JS.castListToJSArray(a1)]
1588+ }
1589+ function Shape_78(a1) {
1590+ return function(a2) {
1591+ var points = JS.castListToJSArray(a1);
1592+ if (points.length > 0) { points.push(points[0]); }
1593+ return["Shape", points, a2];
1594+ }
1595+ }
1596+ function Form_84(a1) {
1597+ return function(a2) {
1598+ return function(a3) {
1599+ return function(a4) {
1600+ return["Form", a1, a2, a3, a4]
1601+ }
1602+ }
1603+ }
1604+ }
1605+ function FLine_85(a1) {
1606+ return function(a2) {
1607+ return function(a3) {
1608+ return["FLine", a1, a2, a3]
1609+ }
1610+ }
1611+ }
1612+ function FShape_86(a1) {
1613+ return function(a2) {
1614+ return function(a3) {
1615+ return["FShape", a1, a2, a3]
1616+ }
1617+ }
1618+ }
1619+ function FImage_87(a1) {
1620+ return function(a2) {
1621+ return function(a3) {
1622+ return["FImage", a1, a2, JS.castStringToJSString(a3)]
1623+ }
1624+ }
1625+ }
1626+ function FElement_88(a1) {
1627+ return["FElement", a1]
1628+ }
1629+ var left_6 = DLeft_0;
1630+ var right_7 = DRight_1;
1631+ var down_8 = DDown_3;
1632+ var up_9 = DUp_2;
1633+ var inward_10 = DIn_4;
1634+ var outward_11 = DOut_5;
1635+ var topLeft_22 = Position_17(Near_14)(Near_14);
1636+ var topRight_23 = Position_17(Far_16)(Near_14);
1637+ var bottomLeft_24 = Position_17(Near_14)(Far_16);
1638+ var bottomRight_25 = Position_17(Far_16)(Far_16);
1639+ var midLeft_26 = Position_17(Near_14)(Mid_15);
1640+ var midRight_27 = Position_17(Far_16)(Mid_15);
1641+ var midTop_28 = Position_17(Mid_15)(Near_14);
1642+ var midBottom_29 = Position_17(Mid_15)(Far_16);
1643+ var middle_30 = Position_17(Mid_15)(Mid_15);
1644+ function middleAt(a1) {
1645+ return function(a2) {
1646+ return["PositionAt", a1, a2]
1647+ }
1648+ }
1649+ var topLeftAt_31 = PositionTL_18;
1650+ var topRightAt_32 = PositionTR_19;
1651+ var bottomLeftAt_33 = PositionBL_20;
1652+ var bottomRightAt_34 = PositionBR_21;
1653+ var absolute_35 = Absolute_12;
1654+ var relative_36 = Relative_13;
1655+ function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
1656+ function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,Nothing,Nothing); }
1657+ var line_76 = Line_75;
1658+ var polygon_79 = Shape_78;
1659+ function sprite_96(src) {
1660+ return function(w) {
1661+ return function(h) {
1662+ return function(pos) {
1663+ return Form_84(0)(1)(pos)(FImage_87(w)(h)(src))
1664+ }
1665+ }
1666+ }
1667+ }
1668+ function toForm_97(pos) {
1669+ return function(e) {
1670+ return Form_84(0)(1)(pos)(FElement_88(e))
1671+ }
1672+ }
1673+ function width_47(w__101) {
1674+ return function(e) {
1675+ var be = e[2];
1676+ switch(be[0]) {
1677+ case "EImage":
1678+ case "EVideo":
1679+ return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
1680+ case "EText":
1681+ var p = Value.getTextSize(w__101,e[4],be[2]);
1682+ return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
1683+ }
1684+ return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1685+ }
1686+ }
1687+ function height_48(h__108) {
1688+ return function(e) {
1689+ var be = e[2];
1690+ switch(be[0]) {
1691+ case "EImage":
1692+ case "EVideo":
1693+ return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1694+ }
1695+ return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
1696+ }
1697+ }
1698+ function size_49(w) {
1699+ return function(h) {
1700+ return function(e) {
1701+ return newElement_38(e[2], w, h, e[5], e[6], e[7]);
1702+ }
1703+ }
1704+ }
1705+ function opacity_50(o) {
1706+ return function(e) {
1707+ return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
1708+ }
1709+ }
1710+ function color_51(c) {
1711+ return function(e) {
1712+ return newElement_38(e[2], e[3], e[4], e[5], Just(c), e[7]);
1713+ }
1714+ }
1715+ function link(lnk) {
1716+ return function(e) {
1717+ return newElement_38(e[2], e[3], e[4], e[5], e[6], Just(JS.castStringToJSString(lnk)));
1718+ }
1719+ }
1720+ function widthOf_52(e) { return ~~e[3]; }
1721+ function heightOf_53(e) { return ~~e[4]; }
1722+ function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
1723+ function text_56(txt) {
1724+ var p = Value.getTextSize(0,0,txt);
1725+ return basicNewElement(EText_39("left")(txt), p[0], p[1])
1726+ }
1727+ function plainText(str) {
1728+ var txt = Value.toText(str);
1729+ var p = Value.getTextSize(0,0,txt);
1730+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1731+ }
1732+ function asText(v) {
1733+ var txt = monospace(Value.toText(Value.show(v)));
1734+ var p = Value.getTextSize(0,0,txt);
1735+ return basicNewElement(EText_39("left")(txt),p[0],p[1])
1736+ }
1737+ function centeredText(txt) {
1738+ var p = Value.getTextSize(0,0,txt);
1739+ return basicNewElement(EText_39("center")(txt),p[0],p[1])
1740+ }
1741+ function justifiedText(txt) {
1742+ var p = Value.getTextSize(0,0,txt);
1743+ return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1744+ }
1745+ function rightedText(txt) {
1746+ var p = Value.getTextSize(0,0,txt);
1747+ return basicNewElement(EText_39("right")(txt),p[0],p[1])
1748+ }
1749+ function image_57(w) {
1750+ return function(h) {
1751+ return function(src) {
1752+ return basicNewElement(EImage_40(src),w,h)
1753+ }
1754+ }
1755+ }
1756+ function images(srcs) {
1757+ var pics = Elm.Signal.constant(spacer_66(0)(0));
1758+ var update = Elm.Signal.lift(function(src) {
1759+ src = JS.castStringToJSString(src);
1760+ var img = new Image();
1761+ img.onload = function() {
1762+ Dispatcher.notify(pics.id,
1763+ image_57(this.width)(this.height)(src));
1764+ };
1765+ img.src = src;
1766+ })(srcs);
1767+ function f(x) { return function(y) { return x; } }
1768+ var combine = Elm.Signal.lift2(f)(pics)(update);
1769+ return combine;
1770+ }
1771+ function video_58(w) {
1772+ return function(h) {
1773+ return function(src) {
1774+ return basicNewElement(EVideo_41(src),w,h)
1775+ }
1776+ }
1777+ }
1778+ function fittedImage_59(w_147) {
1779+ return function(h_148) {
1780+ return function(s_149) {
1781+ return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
1782+ }
1783+ }
1784+ }
1785+ function flow_60(dir_150) {
1786+ return function(es_151) {
1787+ return function() {
1788+ var w_152 = function() {
1789+ var ws_154 = map(widthOf_52)(es_151);
1790+ return function(case1) {
1791+ var case0 = case1;
1792+ switch(case0[0]) {
1793+ case "DLeft":
1794+ return sum(ws_154);
1795+ case "DRight":
1796+ return sum(ws_154)
1797+ }
1798+ return maximum(ws_154)
1799+ }(dir_150)
1800+ }();
1801+ var h_153 = function() {
1802+ var hs_155 = map(heightOf_53)(es_151);
1803+ return function(case3) {
1804+ var case2 = case3;
1805+ switch(case2[0]) {
1806+ case "DDown":
1807+ return sum(hs_155);
1808+ case "DUp":
1809+ return sum(hs_155)
1810+ }
1811+ return maximum(hs_155)
1812+ }(dir_150)
1813+ }();
1814+ return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
1815+ }()
1816+ }
1817+ }
1818+ function above_61(e1_156) {
1819+ return function(e2_157) {
1820+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), max(widthOf_52(e1_156))(widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157))
1821+ }
1822+ }
1823+ function below_62(e1_158) {
1824+ return function(e2_159) {
1825+ return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), max(widthOf_52(e1_158))(widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159))
1826+ }
1827+ }
1828+ function beside_63(e1_160) {
1829+ return function(e2_161) {
1830+ return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), max(heightOf_53(e1_160))(heightOf_53(e2_161)))
1831+ }
1832+ }
1833+ function layers_64(es_162) {
1834+ return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
1835+ }
1836+ function collage_65(w_163) {
1837+ return function(h_164) {
1838+ return function(forms_165) {
1839+ return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
1840+ }
1841+ }
1842+ }
1843+ function spacer_66(w_166) {
1844+ return function(h_167) {
1845+ return basicNewElement(EEmpty_45,w_166,h_167)
1846+ }
1847+ }
1848+ function container_67(w_169) {
1849+ return function(h_170) {
1850+ return function(pos_168) {
1851+ return function(e_171) {
1852+ return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
1853+ }
1854+ }
1855+ }
1856+ }
1857+ function segment_77(p1_172) {
1858+ return function(p2_173) {
1859+ return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
1860+ }
1861+ }
1862+ function rect_80(w_174) {
1863+ return function(h_175) {
1864+ return function(pos_176) {
1865+ return Shape_78(["Cons", ["Tuple2", 0 - w_174 / 2, 0 - h_175 / 2],
1866+ ["Cons", ["Tuple2", 0 - w_174 / 2, h_175 / 2],
1867+ ["Cons", ["Tuple2", w_174 / 2, h_175 / 2],
1868+ ["Cons", ["Tuple2", w_174 / 2, 0 - h_175 / 2], ["Nil"]]]]])(pos_176)
1869+ }
1870+ }
1871+ }
1872+ function oval_81(w_177) {
1873+ return function(h_178) {
1874+ return function(pos_179) {
1875+ return function() {
1876+ var n_180 = 50;
1877+ return function() {
1878+ function f_181(i_182) {
1879+ return["Tuple2", w_177 / 2 * cos(2 * (pi / n_180) * i_182), h_178 / 2 * sin(2 * (pi / n_180) * i_182)]
1880+ }
1881+ return Shape_78(map(f_181)(function() {
1882+ var lo = 0;
1883+ var hi = n_180 - 1;
1884+ var lst = ["Nil"];
1885+ if(lo <= hi) {
1886+ do {
1887+ var lst = ["Cons", hi, lst]
1888+ }while(hi-- > lo)
1889+ }
1890+ return lst
1891+ }()))(pos_179)
1892+ }()
1893+ }()
1894+ }
1895+ }
1896+ }
1897+ function circle_82(r_183) {
1898+ return oval_81(2 * r_183)(2 * r_183)
1899+ }
1900+ function ngon_83(n_184) {
1901+ return function(r_185) {
1902+ return function(pos_186) {
1903+ return function() {
1904+ var m_187 = toFloat(n_184);
1905+ return function() {
1906+ function f_188(i_189) {
1907+ return["Tuple2", r_185 * cos(2 * (pi / m_187) * i_189), r_185 * sin(2 * (pi / m_187) * i_189)]
1908+ }
1909+ return Shape_78(map(f_188)(function() {
1910+ var lo = 0;
1911+ var hi = n_184 - 1;
1912+ var lst = ["Nil"];
1913+ if(lo <= hi) {
1914+ do {
1915+ var lst = ["Cons", hi, lst]
1916+ }while(hi-- > lo)
1917+ }
1918+ return lst
1919+ }()))(pos_186)
1920+ }()
1921+ }()
1922+ }
1923+ }
1924+ }
1925+ function solid_89(clr_190) {
1926+ return function(ln_191) {
1927+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Solid_68)(clr_190)(ln_191))
1928+ }
1929+ }
1930+ function dotted_90(clr_192) {
1931+ return function(ln_193) {
1932+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dotted_69)(clr_192)(ln_193))
1933+ }
1934+ }
1935+ function dashed_91(clr_194) {
1936+ return function(ln_195) {
1937+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dashed_70)(clr_194)(ln_195))
1938+ }
1939+ }
1940+ function customLine_92(pattern_196) {
1941+ return function(clr_197) {
1942+ return function(ln_198) {
1943+ return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Custom_71(pattern_196))(clr_197)(ln_198))
1944+ }
1945+ }
1946+ }
1947+ function filled_93(clr) {
1948+ return function(shape) {
1949+ return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1950+ }
1951+ }
1952+ function outlined_94(clr) {
1953+ return function(shape) {
1954+ return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
1955+ }
1956+ }
1957+ function customOutline_95(pattern) {
1958+ return function(clr) {
1959+ return function(shape) {
1960+ return Form_84(0)(1)(shape[2])(FShape_86(CustomOutline_74(pattern))(clr)(shape));
1961+ }
1962+ }
1963+ }
1964+ function textured(src) {
1965+ return function(shape) {
1966+ return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1967+ }
1968+ }
1969+ function rotate_98(t_212) {
1970+ return function(Form$thetascaleposform_213) {
1971+ return function(case5) {
1972+ var case0 = case5;
1973+ switch(case0[0]) {
1974+ case "Form":
1975+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1976+ return Form_84(t_212 + case1)(case2)(case3)(case4)
1977+ }
1978+ throw"Non-exhaustive pattern match in case";
1979+ }(Form$thetascaleposform_213)
1980+ }
1981+ }
1982+ function scale_99(s) {
1983+ return function(form) {
1984+ return Form_84(form[1])(s * form[2])(form[3])(form[4])
1985+ }
1986+ }
1987+ function move_100(x_224) {
1988+ return function(y_225) {
1989+ return function(Form$thetascaleTuple2$pxpyform_226) {
1990+ return function(case7) {
1991+ var case0 = case7;
1992+ switch(case0[0]) {
1993+ case "Form":
1994+ var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1995+ switch(case3[0]) {
1996+ case "Tuple2":
1997+ var case5 = case3[1], case6 = case3[2];
1998+ return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
1999+ }
2000+ break
2001+ }
2002+ throw"Non-exhaustive pattern match in case";
2003+ }(Form$thetascaleTuple2$pxpyform_226)
2004+ }
2005+ }
2006+ }
2007+ return{left:left_6, right:right_7, down:down_8, up:up_9, inward:inward_10, outward:outward_11, topLeft:topLeft_22, topRight:topRight_23, bottomLeft:bottomLeft_24, bottomRight:bottomRight_25, midLeft:midLeft_26, midRight:midRight_27, midTop:midTop_28, midBottom:midBottom_29, middle:middle_30, middleAt:middleAt, topLeftAt:topLeftAt_31, topRightAt:topRightAt_32, bottomLeftAt:bottomLeftAt_33, bottomRightAt:bottomRightAt_34, absolute:absolute_35, relative:relative_36, width:width_47, height:height_48, size:size_49, opacity:opacity_50,
2008+ color:color_51, link:link, widthOf:widthOf_52, heightOf:heightOf_53, sizeOf:sizeOf_54, text:text_56, asText:asText, plainText:plainText, centeredText:centeredText, justifiedText:justifiedText, rightedText:rightedText, image:image_57, images:images, video:video_58, fittedImage:fittedImage_59, flow:flow_60, above:above_61, below:below_62, beside:beside_63, layers:layers_64, collage:collage_65, spacer:spacer_66, container:container_67, line:line_76, segment:segment_77, polygon:polygon_79, rect:rect_80, oval:oval_81, circle:circle_82, ngon:ngon_83, solid:solid_89, dotted:dotted_90, dashed:dashed_91, customLine:customLine_92, filled:filled_93,
2009+ outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100,
2010+ isWithin: Collage.insideForm}
2011+}();
2012+var Text = function() {
2013+ function fromString(s) { return Value.toText(s); }
2014+
2015+ var addTag = function(tag) { return function(text) {
2016+ return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
2017+ };
2018+ };
2019+ var addStyle = function(style, value) { return function(text) {
2020+ return "<span style='" + style + ":" + value + "'>" + text + "</span>";
2021+ };
2022+ };
2023+
2024+ var typeface = function(name) {
2025+ name = Elm.JavaScript.castStringToJSString(name);
2026+ return addStyle('font-family', name);
2027+ };
2028+ var size = function(px) {
2029+ return addStyle('font-size', px + 'px');
2030+ };
2031+ var header = addTag('h1');
2032+ var height = function(h) { return addStyle('font-size', h+'em'); }
2033+ var italic = addStyle('font-style', 'italic');
2034+ var bold = addTag('b');
2035+ var color = function(c) {
2036+ return addStyle('color', Elm.Graphics.Color.extract(c));
2037+ };
2038+ var underline = addStyle('text-decoration', 'underline');
2039+ var overline = addStyle('text-decoration', 'overline');
2040+ var strikeThrough = addStyle('text-decoration', 'line-through');
2041+ var link = function(href) { return function(text) {
2042+ return "<a href='" + fromString(href) + "'>" + text + "</a>";
2043+ };
2044+ };
2045+
2046+ return {fromString : fromString,
2047+ toText: fromString,
2048+ header : header,
2049+ height : height,
2050+ italic : italic,
2051+ bold : bold,
2052+ underline : underline,
2053+ overline : overline,
2054+ strikeThrough : strikeThrough,
2055+ monospace : typeface('monospace'),
2056+ typeface : typeface,
2057+ color : color,
2058+ link : link };
2059+}();
2060+
2061+var Elm = Elm || {};
2062+Elm.Graphics.Text = Text;
2063+
2064+var Render = function(){
2065+
2066+function newElement(elementType) {
2067+ var e = document.createElement(elementType);
2068+ e.style.padding = "0";
2069+ e.style.margin = "0";
2070+ return e;
2071+};
2072+
2073+function addTo(container, elem) {
2074+ container.appendChild(elem);
2075+};
2076+
2077+function makeText(pos,txt) {
2078+ var e = newElement('div');
2079+ e.innerHTML = txt;
2080+ e.style.textAlign = pos;
2081+ return e;
2082+};
2083+
2084+function image(src) {
2085+ var img = newElement('img');
2086+ img.src = src;
2087+ img.name = src;
2088+ img.style.display = "block";
2089+ return img;
2090+}
2091+
2092+function fittedImage(w,h,src) {
2093+ var canvas = newElement('canvas');
2094+ canvas.style.display = "block";
2095+ canvas.style.width = w + 'px';
2096+ canvas.style.height = h + 'px';
2097+ canvas.width = w;
2098+ canvas.height = h;
2099+ canvas.innerHTML = "Your browser does not support the canvas element.";
2100+
2101+ var img = newElement('img');
2102+ img.onload = function() {
2103+ if (canvas.getContext) {
2104+ var ctx = canvas.getContext('2d');
2105+ var sx = 0, sy = 0, sWidth = this.width, sHeight = this.height;
2106+ if (w / h > this.width / this.height) {
2107+ sHeight = this.width * h / w;
2108+ sy = (this.height - sHeight) / 2;
2109+ } else {
2110+ sWidth = this.height * w / h;
2111+ sx = (this.width - sWidth) / 2;
2112+ }
2113+ ctx.drawImage(img, sx, sy, sWidth, sHeight,
2114+ 0,0, canvas.width, canvas.height);
2115+ }
2116+ };
2117+ img.src = src;
2118+ return canvas;
2119+};
2120+
2121+var video = function(src) {
2122+ var e = newElement('video');
2123+ e.controls = "controls";
2124+ var source = newElement('source');
2125+ source.src = src;
2126+ var segs = src.split('.');
2127+ source.type = "video/" + segs[segs.length-1];
2128+ addTo(e, source);
2129+ e.style.display = "block";
2130+ return e;
2131+};
2132+
2133+function divify(e) {
2134+ var div = newElement('div');
2135+ addTo(div, e);
2136+ return div;
2137+};
2138+function goDown(e) {
2139+ return e //.tagName === "DIV" ? e : divify(e);
2140+};
2141+function goRight(e) {
2142+ e.style.styleFloat = "left";
2143+ e.style.cssFloat = "left";
2144+ return e;
2145+};
2146+function goIn(e) {
2147+ e.style.position = 'absolute';
2148+ return e;
2149+};
2150+function flowWith(f, prep, elist) {
2151+ var container = newElement('div');
2152+ for (var i = elist.length; i--; ) {
2153+ addTo(container, f(prep(elist[i])));
2154+ }
2155+ return container;
2156+};
2157+
2158+function flow(dir,elist) {
2159+ switch(dir) {
2160+ case "DDown": elist = elist.slice(0).reverse();
2161+ case "DUp": return flowWith(goDown,render,elist);
2162+ case "DRight": elist = elist.slice(0).reverse();
2163+ case "DLeft": return flowWith(goRight,render,elist);
2164+ case "DOut": elist = elist.slice(0).reverse();
2165+ case "DIn": return flowWith(goIn,render,elist);
2166+ };
2167+};
2168+
2169+function toPos(pos) {
2170+ switch(pos[0]) {
2171+ case "Absolute": return pos[1] + "px";
2172+ case "Relative": return (pos[1] * 100) + "%";
2173+ }
2174+}
2175+
2176+function setPos(pos,e) {
2177+ e.style.position = 'absolute';
2178+ e.style.margin = 'auto';
2179+ switch(pos[0]) {
2180+ case "Position":
2181+ if (pos[1][0] !== "Far") e.style.left = 0;
2182+ if (pos[1][0] !== "Near") e.style.right = 0;
2183+ if (pos[2][0] !== "Far") e.style.top = 0;
2184+ if (pos[2][0] !== "Near") e.style.bottom = 0;
2185+ break;
2186+ case "PositionAt":
2187+ e.style.top = toPos(pos[2]);
2188+ e.style.left = toPos(pos[1]);
2189+ var shift = "translate(" + (-elem[3]/2) + "px," + (-elem[4]/2) + "px)";
2190+ e.style.transform = shift;
2191+ e.style.msTransform = shift;
2192+ e.style.MozTransform = shift;
2193+ e.style.webkitTransform = shift;
2194+ e.style.OTransform = shift;
2195+ break;
2196+ default:
2197+ var p = pos[0].slice(-2);
2198+ e.style[p[0] === "T" ? 'top' : 'bottom'] = toPos(pos[2]);
2199+ e.style[p[1] === "L" ? 'left' : 'right'] = toPos(pos[1]);
2200+ }
2201+}
2202+
2203+function container(pos,elem) {
2204+ var e = render(elem);
2205+ setPos(pos,e);
2206+ var div = newElement('div');
2207+ div.style.position = "relative";
2208+ div.style.overflow = "hidden";
2209+ addTo(div,e);
2210+ return div;
2211+};
2212+
2213+function render(elem) {
2214+ var e = {};
2215+ switch(elem[2][0]) {
2216+ case "EText": e = makeText(elem[2][1],elem[2][2]); break;
2217+ case "EImage": e = image(elem[2][1]); break;
2218+ case "EVideo": e = video(elem[2][1]); break;
2219+ case "EFittedImage": e = fittedImage(elem[3],elem[4],elem[2][1]); break;
2220+ case "EFlow": e = flow(elem[2][1][0],elem[2][2]); break;
2221+ case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
2222+ case "EEmpty": e = newElement('div'); break;
2223+ case "EContainer": e = container(elem[2][1],elem[2][2]); break;
2224+ case "EHtml":
2225+ e = elem[2][1];
2226+ if (e.type !== 'button') {
2227+ var p = Value.getExcess(e);
2228+ elem[3] -= p[0];
2229+ elem[4] -= p[1];
2230+ }
2231+ break;
2232+ case "EExternalHtml":
2233+ e = newElement('div');
2234+ addTo(e, elem[2][1]);
2235+ break;
2236+ }
2237+ e.id = elem[1];
2238+ e.style.width = (~~elem[3]) + 'px';
2239+ e.style.height = (~~elem[4]) + 'px';
2240+ if (elem[5] !== 1) { e.style.opacity = elem[5]; }
2241+ if (elem[6][0] === "Just") {
2242+ e.style.backgroundColor = Elm.Graphics.Color.extract(elem[6][1]);
2243+ }
2244+ if (elem[7][0] === "Just") {
2245+ var a = newElement('a');
2246+ a.href = elem[7][1];
2247+ addTo(a,e);
2248+ return a;
2249+ }
2250+ return e;
2251+};
2252+
2253+function update(node,curr,next) {
2254+ if (node.tagName === 'A') { node = node.firstChild; }
2255+ if (curr[1] === next[1]) return;
2256+ if (curr[2][0] !== next[2][0]) {
2257+ return node.parentNode.replaceChild(render(next),node);
2258+ }
2259+ var nextE = next[2], currE = curr[2];
2260+ switch(nextE[0]) {
2261+ case "EText":
2262+ if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2263+ if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2264+ break;
2265+ case "EImage":
2266+ if (nextE[1] !== currE[1]) node.src = nextE[1];
2267+ break;
2268+ case "EVideo":
2269+ case "EFittedImage":
2270+ if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
2271+ return node.parentNode.replaceChild(render(next),node);
2272+ }
2273+ break;
2274+ case "ECollage":
2275+ if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2276+ return node.parentNode.replaceChild(render(next),node);
2277+ }
2278+ Collage.updateCollage(node,currE[3],nextE[3]);
2279+ break;
2280+ case "EFlow":
2281+ if (nextE[1] !== currE[1]) {
2282+ return node.parentNode.replaceChild(render(next),node);
2283+ }
2284+ var nexts = nextE[2];
2285+ var kids = node.childNodes;
2286+ if (nexts.length !== kids.length) {
2287+ return node.parentNode.replaceChild(render(next),node);
2288+ }
2289+ var currs = currE[2];
2290+ var goDir = {};
2291+ switch(nextE[1][0]) {
2292+ case "DDown": case "DUp": goDir = goDown; break;
2293+ case "DRight": case "DLeft": goDir = goRight; break;
2294+ case "DOut": case "DIn": goDir = goIn; break;
2295+ }
2296+ for (var i = kids.length; i-- ;) {
2297+ update(kids[i],currs[i],nexts[i]);
2298+ goDir(kids[i]);
2299+ }
2300+ break;
2301+ case "EContainer":
2302+ update(node.childNodes[0],currE[2],nextE[2]);
2303+ setPos(nextE[1],node.childNodes[0]);
2304+ break;
2305+ case "EEmpty":
2306+ break;
2307+ case "EHtml":
2308+ if (next[1] !== curr[1]) {
2309+ var e = render(next);
2310+ node.parentNode.replaceChild(e,node);
2311+ node = e;
2312+ }
2313+ if (e.type !== 'button') {
2314+ var p = Value.getExcess(node);
2315+ next[3] -= p[0];
2316+ next[4] -= p[1];
2317+ }
2318+ break;
2319+ case "EExternalHtml":
2320+ if (next[1] !== curr[1])
2321+ node.parentNode.replaceChild(render(next),node);
2322+ break;
2323+ }
2324+ if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
2325+ if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
2326+ if (next[5] !== curr[5]) node.style.opacity = next[5];
2327+ if (next[6].length === 2) {
2328+ var clr = Elm.Graphics.Color.extract(next[6][1]);
2329+ if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
2330+ }
2331+ if (next[7].length === 2) {
2332+ if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2333+ }
2334+ next[1] = curr[1];
2335+}
2336+
2337+return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
2338+
2339+}();
2340+var Elm = Elm || {};
2341+Elm.Signal = function() {
2342+ var send = function(node, timestep, changed) {
2343+ var kids = node.kids;
2344+ for (var i = kids.length; i--; ) {
2345+ kids[i].recv(timestep, changed, node.id);
2346+ }
2347+ };
2348+ var input = function(base) {
2349+ this.id = Guid.guid();
2350+ this.value = base;
2351+ this.kids = [];
2352+ this.defaultNumberOfKids = 0;
2353+ this.recv = function(timestep, eid, v) {
2354+ var changed = eid === this.id;
2355+ if (changed) { this.value = v; }
2356+ send(this, timestep, changed);
2357+ return changed;
2358+ };
2359+ Dispatcher.inputs.push(this);
2360+ };
2361+ var lift = function(func,args) {
2362+ this.id = Guid.guid();
2363+ this.value = null;
2364+ this.kids = [];
2365+ this.count = 0;
2366+ this.changed = false;
2367+
2368+ args.reverse();
2369+ this.recalc = function() {
2370+ var f = func;
2371+ for (var i = args.length; i--; ) {
2372+ f = f(args[i].value);
2373+ }
2374+ this.value = f;
2375+ };
2376+ this.recalc();
2377+
2378+ this.recv = function(timestep, changed, parentID) {
2379+ this.count += 1;
2380+ if (changed) { this.changed = true; }
2381+ if (this.count == args.length) {
2382+ if (this.changed) { this.recalc() }
2383+ send(this, timestep, this.changed);
2384+ this.changed = false;
2385+ this.count = 0;
2386+ }
2387+ };
2388+ for (var i = args.length; i--; ) {
2389+ args[i].kids.push(this);
2390+ }
2391+ };
2392+ var fold = function(func,base,baseIsFunc,input) {
2393+ this.id = Guid.guid();
2394+ this.value = baseIsFunc ? base(input.value) : base;
2395+ this.kids = [];
2396+ this.recv = function(timestep, changed, parentID) {
2397+ if (changed) { this.value = func(input.value)(this.value); }
2398+ send(this, timestep, changed);
2399+ };
2400+ input.kids.push(this);
2401+ };
2402+
2403+ var dropIf = function(pred,base,input) {
2404+ this.id = Guid.guid();
2405+ this.value = pred(input.value) ? base : input.value;
2406+ this.kids = [];
2407+ this.recv = function(timestep, changed, parentID) {
2408+ var chng = changed && !pred(input.value);
2409+ if (chng) { this.value = input.value; }
2410+ send(this, timestep, chng);
2411+ };
2412+ input.kids.push(this);
2413+ };
2414+ var dropRepeats = function(input) {
2415+ this.id = Guid.guid();
2416+ this.value = input.value;
2417+ this.kids = [];
2418+ this.recv = function(timestep, changed, parentID) {
2419+ var chng = changed && !eq(this.value,input.value);
2420+ if (chng) { this.value = input.value; }
2421+ send(this, timestep, chng);
2422+ };
2423+ input.kids.push(this);
2424+ };
2425+
2426+ var dropWhen = function(s1) { return function(b) { return function(s2) {
2427+ var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
2428+ var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
2429+ return new lift(function(p){return p[1];},[dropped]); }; };
2430+ };
2431+
2432+ var sampleOn = function(s1,s2) {
2433+ this.id = Guid.guid();
2434+ this.value = s2.value;
2435+ this.kids = [];
2436+ this.count = 0;
2437+ this.changed = false;
2438+
2439+ this.recv = function(timestep, changed, parentID) {
2440+ if (parentID === s1.id) this.changed = changed;
2441+ this.count += 1;
2442+ if (this.count == 2) {
2443+ if (this.changed) { this.value = s2.value; }
2444+ send(this, timestep, this.changed);
2445+ this.count = 0;
2446+ this.changed = false;
2447+ }
2448+ };
2449+ s1.kids.push(this);
2450+ s2.kids.push(this);
2451+ };
2452+
2453+ return {
2454+ constant : function(v) { return new input(v); },
2455+ lift : function(f){return function(e){return new lift(f,[e]);};},
2456+ lift2 : function(f) { return function(e1) { return function(e2) {
2457+ return new lift(f, [e1,e2]); }; }; },
2458+ lift3 : function(f) { return function(e1) { return function(e2) {
2459+ return function(e3){return new lift(f,[e1,e2,e3]);};};};},
2460+ lift4 : function(f) { return function(e1) { return function(e2) {
2461+ return function(e3) { return function(e4) {
2462+ return new lift(f, [e1,e2,e3,e4]); }; }; }; }; },
2463+ foldp : function(f) { return function(b) { return function(e) {
2464+ return new fold(f,b,false,e); }; }; },
2465+ foldp_ : function(f) { return function(b) { return function(e) {
2466+ return new fold(f,b,true,e); }; }; },
2467+ foldp1 : function(f) { return function(e) {
2468+ return new fold(f,function(x){return x;},true,e); }; },
2469+ count : function(sig) {
2470+ var incr = function(_){return function(c){return c+1;};};
2471+ return new fold(incr,0,false,sig) },
2472+ keepIf : function(pred) { return function(base) { return function(sig) {
2473+ return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
2474+ dropIf : function(pred) { return function(base) { return function(sig) {
2475+ return new dropIf(pred,base,sig); }; }; },
2476+ keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
2477+ dropWhen : dropWhen,
2478+ dropRepeats : function(s) { return new dropRepeats(s);},
2479+ sampleOn : function(s1){return function(s2){return new sampleOn(s1,s2);};}
2480+ };
2481+}();
2482+var Dispatcher = function() {
2483+ var program = null;
2484+ var timestep = 0;
2485+ var inputs = [];
2486+ var currentElement = null;
2487+
2488+ var initialize = function() {
2489+ program = Elm.main();
2490+ if (!program.hasOwnProperty('recv')) {
2491+ program = Elm.Signal.constant(program);
2492+ }
2493+
2494+ currentElement = program.value;
2495+ filterDeadInputs();
2496+
2497+ var content = document.getElementById('content');
2498+ content.appendChild(Render.render(currentElement));
2499+ var w = document.getElementById('widthChecker').offsetWidth;
2500+ if (w !== window.innerWidth) {
2501+ Dispatcher.notify(Window.dimensions.id, Value.Tuple(w, window.innerHeight));
2502+ }
2503+ program = Elm.Signal.lift(function(value) {
2504+ var content = document.getElementById('content');
2505+ Render.update(content.firstChild,currentElement,value);
2506+ currentElement = value;
2507+ return value;
2508+ })(program);
2509+ };
2510+ var notify = function(id, v) {
2511+ timestep += 1;
2512+ //console.log(timestep);
2513+ var hasListener = false;
2514+ for (var i = inputs.length; i--; ) {
2515+ hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2516+ }
2517+ return hasListener;
2518+ };
2519+
2520+ function isAlive(input) {
2521+ if (!input.hasOwnProperty('defaultNumberOfKids')) return true;
2522+ var len = input.kids.length;
2523+ if (len == 0) return false;
2524+ if (len > input.defaultNumberOfKids) return true;
2525+ var alive = false;
2526+ for (var i = len; i--; ) {
2527+ alive = alive || isAlive(input.kids[i]);
2528+ }
2529+ return alive;
2530+ }
2531+ function filterDeadInputs() {
2532+ var temp = [];
2533+ for (var i = inputs.length; i--; ) {
2534+ if (isAlive(inputs[i])) temp.push(inputs[i]);
2535+ }
2536+ inputs = temp;
2537+ }
2538+
2539+ return {initialize:initialize, notify:notify, inputs:inputs};
2540+}();Elm.HTTP = function() {
2541+ var JS = Elm.JavaScript;
2542+ var toElmString = Elm.JavaScript.castJSStringToString;
2543+ function request(verb) { return function(url) { return function(data) {
2544+ return function(headers) {
2545+ return {0 : "Request",
2546+ length : 1,
2547+ verb : JS.castStringToJSString(verb),
2548+ url : JS.castStringToJSString(url),
2549+ data : data === null ? null : JS.castStringToJSString(data),
2550+ headers : headers }; }; }; };
2551+ }
2552+ function get(url) { return request("GET")(url)(null)(["Nil"]); }
2553+ function post(url) { return function(data) {
2554+ return request("POST")(url)(data)(["Nil"]); }; }
2555+
2556+ function sendReq(responses) { return function(req) {
2557+ Dispatcher.notify(responses.id,["Waiting"]);
2558+ var request = null;
2559+ if (window.XMLHttpRequest) {
2560+ request = new XMLHttpRequest();
2561+ } else if (window.ActiveXObject) {
2562+ request = new ActiveXObject("Microsoft.XMLHTTP");
2563+ }
2564+ request.onreadystatechange = function(e) {
2565+ if (request.readyState === 4) {
2566+ Dispatcher.notify(
2567+ responses.id,
2568+ request.status === 200
2569+ ? ["Success", toElmString(request.responseText)]
2570+ : ["Failure", request.status, toElmString(request.statusText)]);
2571+ }
2572+ };
2573+ request.open(req.verb, req.url, true);
2574+ Elm.List.map(function(pair) {
2575+ request.setRequestHeader(
2576+ JS.castStringToJSString(pair[1]),
2577+ JS.castStringToJSString(pair[2]));
2578+ })(req.headers);
2579+ request.send(req.data);
2580+ return null;
2581+ };
2582+ }
2583+
2584+ function send(requests) {
2585+ var responses = Elm.Signal.constant(["Waiting"]);
2586+ var sender = Elm.Signal.lift(sendReq(responses))(requests);
2587+ function f(x) { return function(y) { return x; } }
2588+ var combine = Elm.Signal.lift2(f)(responses)(sender);
2589+ return combine;
2590+ }
2591+
2592+ return {get : get,
2593+ post : post,
2594+ request : request,
2595+ send : send,
2596+ sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
2597+ };
2598+}();
2599+
2600+Elm.Input = function() {
2601+ var JS = Elm.JavaScript;
2602+ var toElmString = Elm.JavaScript.castJSStringToString;
2603+ var newTextInput = function(elem, ghostText) {
2604+ elem.placeholder = JS.castStringToJSString(ghostText);
2605+ var str = Elm.Signal.constant(["Nil"]);
2606+ Value.addListener(elem, 'keyup', function(e) {
2607+ Dispatcher.notify(str.id, toElmString(elem.value));
2608+ elem.focus();
2609+ });
2610+ elem.style.padding = "1px";
2611+ return Value.Tuple(Value.wrap(elem), str);
2612+ };
2613+ var newElement = function(name) {
2614+ var e = document.createElement(name);
2615+ e.style.padding = "0";
2616+ e.style.margin = "0";
2617+ return e;
2618+ };
2619+ var textArea = function(cols) { return function(rows) {
2620+ var textarea = newElement('textarea');
2621+ textarea.rows = rows;
2622+ textarea.cols = cols;
2623+ return newTextInput(textarea, "");
2624+ };
2625+ };
2626+ var textField = function(ghostText) {
2627+ var field = newElement('input');
2628+ field.type = 'text';
2629+ return newTextInput(field, ghostText);
2630+ };
2631+ var password = function(ghostText) {
2632+ var field = newElement('input');
2633+ field.type = 'password';
2634+ return newTextInput(field, ghostText);
2635+ };
2636+ var checkbox = function(checked) {
2637+ var box = newElement('input');
2638+ box.type = 'checkbox';
2639+ box.checked = checked;
2640+ var status = Elm.Signal.constant(checked);
2641+ Value.addListener(box, 'change', function(e) {
2642+ Dispatcher.notify(status.id, box.checked);
2643+ });
2644+ return Value.Tuple(Value.wrap(box), status);
2645+ };
2646+ var dropDown = function(options) {
2647+ var slct = newElement('select');
2648+ var opts = [];
2649+ while (options[0] === "Cons") {
2650+ var opt = newElement('option');
2651+ var str = Text.toText(options[1][1]);
2652+ opt.value = str;
2653+ opt.innerHTML = str;
2654+ slct.appendChild(opt);
2655+ opts.push(options[1][2]);
2656+ options = options[2];
2657+ }
2658+ var status = Elm.Signal.constant(opts[0]);
2659+ Value.addListener(slct, 'change', function(e) {
2660+ Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2661+ });
2662+ return Value.Tuple(Value.wrap(slct), status);
2663+ };
2664+ var stringDropDown = function(opts) {
2665+ return dropDown(Elm.List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2666+ };
2667+ var button = function(name) {
2668+ var b = newElement('input');
2669+ b.type = "button";
2670+ b.value = JS.castStringToJSString(name);
2671+ var press = Elm.Signal.constant(false);
2672+ Value.addListener(b, 'click', function(e) {
2673+ Dispatcher.notify(press.id, true);
2674+ Dispatcher.notify(press.id, false);
2675+ });
2676+ return Value.Tuple(Value.wrap(b),press);
2677+ };
2678+ return {textArea:textArea, textField:textField,
2679+ password:password, checkbox:checkbox,
2680+ dropDown:dropDown, stringDropDown:stringDropDown,
2681+ button:button};
2682+}();
2683+
2684+Elm.Keyboard = { Raw : function() {
2685+ var keysDown = Elm.Signal.constant(["Nil"]);
2686+ var charPressed = Elm.Signal.constant(["Nothing"]);
2687+ function remove(x,xs) {
2688+ if (xs[0] === "Nil") return xs;
2689+ if (xs[1] === x) return xs[2];
2690+ return ["Cons", xs[1], remove(x,xs[2])];
2691+ }
2692+ function has(x,xs) {
2693+ while (xs[0] !== "Nil") {
2694+ if (xs[1] === x) return true;
2695+ xs = xs[2];
2696+ }
2697+ return false;
2698+ }
2699+ Value.addListener(document, 'keydown', function(e) {
2700+ if (has(e.keyCode, keysDown.value)) return;
2701+ var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
2702+ if (!hasListener)
2703+ this.removeEventListener('keydown',arguments.callee,false);
2704+ });
2705+ Value.addListener(document, 'keyup', function(e) {
2706+ var codes = remove(e.keyCode, keysDown.value);
2707+ var hasListener = Dispatcher.notify(keysDown.id, codes);
2708+ if (!hasListener)
2709+ this.removeEventListener('keyup',arguments.callee,false);
2710+ });
2711+ Value.addListener(window, 'blur', function(e) {
2712+ var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2713+ if (!hasListener)
2714+ this.removeEventListener('blur',arguments.callee,false);
2715+ });
2716+ Value.addListener(document, 'keypress', function(e) {
2717+ var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
2718+ Dispatcher.notify(charPressed.id, ["Nothing"]);
2719+ if (!hasListener)
2720+ this.removeEventListener('keypress',arguments.callee,false);
2721+ });
2722+ return {keysDown:keysDown,
2723+ charPressed:charPressed};
2724+ }()
2725+};
2726+Elm.Mouse = function() {
2727+ var position = Elm.Signal.constant(Value.Tuple(0,0));
2728+ position.defaultNumberOfKids = 2;
2729+
2730+ var x = Elm.Signal.lift(function(p){return p[1];})(position);
2731+ x.defaultNumberOfKids = 0;
2732+ var y = Elm.Signal.lift(function(p){return p[2];})(position);
2733+ y.defaultNumberOfKids = 0;
2734+
2735+ var isDown = Elm.Signal.constant(false);
2736+ var isClicked = Elm.Signal.constant(false);
2737+ var clicks = Elm.Signal.constant(Value.Tuple());
2738+
2739+ function getXY(e) {
2740+ var posx = 0;
2741+ var posy = 0;
2742+ if (!e) var e = window.event;
2743+ if (e.pageX || e.pageY) {
2744+ posx = e.pageX;
2745+ posy = e.pageY;
2746+ } else if (e.clientX || e.clientY) {
2747+ posx = e.clientX + document.body.scrollLeft +
2748+ document.documentElement.scrollLeft;
2749+ posy = e.clientY + document.body.scrollTop +
2750+ document.documentElement.scrollTop;
2751+ }
2752+ return Value.Tuple(posx, posy);
2753+ }
2754+
2755+ Value.addListener(document, 'click', function(e) {
2756+ var hasListener1 = Dispatcher.notify(isClicked.id, true);
2757+ var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
2758+ Dispatcher.notify(isClicked.id, false);
2759+ if (!hasListener1 && !hasListener2)
2760+ this.removeEventListener('click',arguments.callee,false);
2761+ });
2762+ Value.addListener(document, 'mousedown', function(e) {
2763+ var hasListener = Dispatcher.notify(isDown.id, true);
2764+ if (!hasListener)
2765+ this.removeEventListener('mousedown',arguments.callee,false);
2766+ });
2767+ Value.addListener(document, 'mouseup', function(e) {
2768+ var hasListener = Dispatcher.notify(isDown.id, false);
2769+ if (!hasListener)
2770+ this.removeEventListener('mouseup',arguments.callee,false);
2771+ });
2772+ Value.addListener(document, 'mousemove', function(e) {
2773+ var hasListener = Dispatcher.notify(position.id, getXY(e));
2774+ if (!hasListener)
2775+ this.removeEventListener('mousemove',arguments.callee,false);
2776+ });
2777+ var clickedOn = function(elem) {
2778+ var node = Render.render(elem);
2779+ var click = Elm.Signal.constant(false);
2780+ Value.addListener(node, 'click', function(e) {
2781+ Dispatcher.notify(click.id, true);
2782+ Dispatcher.notify(click.id, false);
2783+ });
2784+ return Value.Tuple(Value.wrap(node), click);
2785+ };
2786+ return {position: position,
2787+ x:x,
2788+ y:y,
2789+ isClicked: isClicked,
2790+ isDown: isDown,
2791+ clicks: clicks,
2792+ isClickedOn: clickedOn
2793+ };
2794+ }();
2795+Elm.Random = function() {
2796+ var inRange = function(min) { return function(max) {
2797+ return Elm.Signal.constant(Math.floor(Math.random() * (max-min+1)) + min);
2798+ };
2799+ };
2800+ var randomize = function(min) { return function(max) { return function(signal) {
2801+ function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }
2802+ return Elm.Signal.lift(f)(signal);
2803+ };
2804+ };
2805+ };
2806+ return { inRange:inRange, randomize:randomize };
2807+}();Elm.Time = function() {
2808+ var every = function(t) {
2809+ t *= 1000;
2810+ var clock = Elm.Signal.constant(0);
2811+ var time = 0;
2812+ setInterval(function() {
2813+ time += t;
2814+ Dispatcher.notify(clock.id, time/1000);
2815+ }, t);
2816+ return clock;
2817+ };
2818+ var after = function(t) {
2819+ t *= 1000;
2820+ var thread = Elm.Signal.constant(false);
2821+ setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2822+ return thread;
2823+ };
2824+ var before = function(t) {
2825+ t *= 1000;
2826+ var thread = Elm.Signal.constant(true);
2827+ setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
2828+ return thread;
2829+ };
2830+ return {every:every,after:after,before:before};
2831+}();Elm.Window = function() {
2832+ var dimensions = Elm.Signal.constant(Value.Tuple(window.innerWidth,
2833+ window.innerHeight));
2834+ dimensions.defaultNumberOfKids = 2;
2835+
2836+ var width = Elm.Signal.lift(function(p){return p[1];})(dimensions);
2837+ width.defaultNumberOfKids = 0;
2838+ var height = Elm.Signal.lift(function(p){return p[2];})(dimensions);
2839+ height.defaultNumberOfKids = 0;
2840+
2841+ Value.addListener(window, 'resize', function(e) {
2842+ var w = document.getElementById('widthChecker').offsetWidth;
2843+ var hasListener = Dispatcher.notify(dimensions.id,
2844+ Value.Tuple(w, window.innerHeight));
2845+ if (!hasListener)
2846+ this.removeEventListener('resize',arguments.callee,false);
2847+ });
2848+ return {dimensions:dimensions,width:width,height:height};
2849+}();
2850+
2851+Value.addListener(document, 'elm_log', function(e) { console.log(e.value); });
2852+Value.addListener(document, 'elm_title', function(e) {document.title = e.value;});
2853+Value.addListener(document, 'elm_redirect', function(e) {
2854+ if (e.value.length > 0) { window.location = e.value; }
2855+ });
2856+
2857+var Elm = Elm || {};
2858+Elm.Prelude = function() {
2859+ var mod = function(x) { return function(y) {
2860+ var r = x % y;
2861+ var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
2862+ return m == y ? 0 : m;
2863+ }; };
2864+
2865+ var min = function(x) { return function(y) { return Math.min(x,y); }; };
2866+ var max = function(x) { return function(y) { return Math.max(x,y); }; };
2867+
2868+ var flip=function(f){return function(x){return function(y){return f(y)(x);};};};
2869+ var clamp = function(lo) { return function(hi) {
2870+ return function(x) { return Math.min(hi, Math.max(lo, x)); };
2871+ };
2872+ };
2873+ var curry = function(f) { return function(x) { return function(y) {
2874+ return f(["Tuple2",x,y]); }; };
2875+ };
2876+ var uncurry = function(f) { return function(p) {
2877+ if (p[0] !== "Tuple2") {
2878+ throw "Function was uncurry'd but was not given a pair.";
2879+ }
2880+ return f(p[1])(p[2]); };
2881+ };
2882+
2883+ var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
2884+
2885+ return {eq : Value.eq,
2886+ id : function(x) { return x; },
2887+ not : function(b) { return !b; },
2888+ fst : function(p) { return p[1]; },
2889+ snd : function(p) { return p[2]; },
2890+ rem : function(x) { return function(y) { return x % y; }; },
2891+ div : function(x) { return function(y) { return ~~(x / y); }; },
2892+ compare : function(x) { return function (y) {
2893+ x = (typeof x === "object") ? toText(x) : x;
2894+ y = (typeof y === "object") ? toText(y) : y;
2895+ return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
2896+ };
2897+ },
2898+ toFloat : function(x) { return x; },
2899+ round : function(n) { return Math.round(n); },
2900+ floor : function(n) { return Math.floor(n); },
2901+ ceiling : function(n) { return Math.ceil(n); },
2902+ truncate : function(n) { return ~~n; },
2903+ sqrt : Math.sqrt,
2904+ abs : Math.abs,
2905+ pi : Math.PI,
2906+ e : Math.E,
2907+ sin : Math.sin,
2908+ cos : Math.cos,
2909+ tan : Math.tan,
2910+ asin : Math.asin,
2911+ acos : Math.acos,
2912+ atan : Math.atan,
2913+ atan2 : function(y) { return function(x) { return Math.atan2(y,x); }; },
2914+ mod : mod,
2915+ min : min,
2916+ max : max,
2917+ flip : flip,
2918+ clamp : clamp,
2919+ curry : curry,
2920+ uncurry : uncurry,
2921+ logBase : logBase,
2922+ Just : Elm.Maybe.Just,
2923+ Nothing : Elm.Maybe.Nothing,
2924+ maybe : Elm.Maybe.maybe,
2925+ map : Elm.List.map,
2926+ filter : Elm.List.filter,
2927+ head : Elm.List.head,
2928+ tail : Elm.List.tail,
2929+ last : Elm.List.last,
2930+ length : Elm.List.length,
2931+ reverse : Elm.List.reverse,
2932+ foldr : Elm.List.foldr,
2933+ foldr1 : Elm.List.foldr1,
2934+ foldl : Elm.List.foldl,
2935+ foldl1 : Elm.List.foldl1,
2936+ and : Elm.List.and,
2937+ or : Elm.List.or,
2938+ all : Elm.List.all,
2939+ any : Elm.List.any,
2940+ sum : Elm.List.sum,
2941+ product : Elm.List.product,
2942+ concat : Elm.List.concat,
2943+ concatMap : Elm.List.concatMap,
2944+ maximum : Elm.List.maximum,
2945+ minimum : Elm.List.minimum,
2946+ scanl : Elm.List.scanl,
2947+ scanl1 : Elm.List.scanl1,
2948+ take : Elm.List.take,
2949+ drop : Elm.List.drop,
2950+ zip : Elm.List.zip,
2951+ unzip : Elm.List.unzip,
2952+ lift : Elm.Signal.lift,
2953+ lift2 : Elm.Signal.lift2,
2954+ lift3 : Elm.Signal.lift3,
2955+ lift4 : Elm.Signal.lift4,
2956+ foldp : Elm.Signal.foldp,
2957+ foldp1 : Elm.Signal.foldp1,
2958+ foldp_ : Elm.Signal.foldp_,
2959+ constant : Elm.Signal.constant,
2960+ count : Elm.Signal.count,
2961+ keepIf : Elm.Signal.keepIf,
2962+ dropIf : Elm.Signal.dropIf,
2963+ keepWhen : Elm.Signal.keepWhen,
2964+ dropWhen : Elm.Signal.dropWhen,
2965+ dropRepeats : Elm.Signal.dropRepeats,
2966+ sampleOn : Elm.Signal.sampleOn
2967+ };
2968+
2969+}();
2970+
2971+(function() {
2972+ var include = function(library) {
2973+ for (var i in library) {
2974+ Elm.Prelude[i] = library[i];
2975+ }
2976+ };
2977+ include (Elm.Graphics.Color);
2978+ include (Elm.Graphics.Text);
2979+ include (Elm.Graphics.Element);
2980+
2981+ show = Value.show;
2982+
2983+}());
2984+try{if(Elm.Automaton)throw "Module name collision, 'Automaton' is already defined.";Elm.Automaton=function(){try{if(!(Elm.Prelude instanceof Object))throw 'module not found'}catch(e){throw "Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var hiddenVars=[];for(var i in Elm.Prelude){if(hiddenVars.indexOf(i)>=0)continue;this[i]=Elm.Prelude[i]};try{if(!(Elm.Data.List instanceof Object))throw 'module not found'}catch(e){throw "Module 'Data.List' is missing. Compile with --make flag or load missing module in a separate JavaScript file."};var unzip=Elm.Data.List.unzip
2985+function Automaton_0(a1){return ["Automaton",a1]};var Listen_9=["Listen"],Ignore_10=["Ignore"]
2986+function DragFrom_11(a1){return ["DragFrom",a1]};var count_8=init_6(0)(function(__75){return function(c_76){return(1+c_76)}})
2987+function run_1(Automaton$m0_15){return function(input_16){return function(){switch(Automaton$m0_15[0]){case"Automaton":return lift(fst)(foldp_(function(a_18){return function(Tuple2$bAutomaton$m_19){return function(){switch(Tuple2$bAutomaton$m_19[0]){case"Tuple2":switch(Tuple2$bAutomaton$m_19[2][0]){case"Automaton":return Tuple2$bAutomaton$m_19[2][1](a_18)};break};throw "Non-exhaustive pattern match in case"}()}})(Automaton$m0_15[1])(input_16))};throw "Non-exhaustive pattern match in case"}()}}
2988+function step_2(a_22){return function(Automaton$m_23){return function(){switch(Automaton$m_23[0]){case"Automaton":return Automaton$m_23[1](a_22)};throw "Non-exhaustive pattern match in case"}()}}
2989+function composeAuto_3(a1_25){return function(a2_26){return function(){var Automaton$m1_27=a1_25,m1_28=function(){switch(Automaton$m1_27[0]){case"Automaton":return Automaton$m1_27[1]};throw "Non-exhaustive pattern match in case"}(),Automaton$m2_29=a2_26,m2_30=function(){switch(Automaton$m2_29[0]){case"Automaton":return Automaton$m2_29[1]};throw "Non-exhaustive pattern match in case"}();return Automaton_0(function(a_33){return function(){var Tuple2$bm1__34=m1_28(a_33),b_35=function(){switch(Tuple2$bm1__34[0]){case"Tuple2":return Tuple2$bm1__34[1]};throw "Non-exhaustive pattern match in case"}(),m1__36=function(){switch(Tuple2$bm1__34[0]){case"Tuple2":return Tuple2$bm1__34[2]};throw "Non-exhaustive pattern match in case"}();return function(){var Tuple2$cm2__41=m2_30(b_35),c_42=function(){switch(Tuple2$cm2__41[0]){case"Tuple2":return Tuple2$cm2__41[1]};throw "Non-exhaustive pattern match in case"}(),m2__43=function(){switch(Tuple2$cm2__41[0]){case"Tuple2":return Tuple2$cm2__41[2]};throw "Non-exhaustive pattern match in case"}();return ["Tuple2",c_42,composeAuto_3(m1__36)(m2__43)]}()}()})}()}}
2990+function combine_4(autos_48){return Automaton_0(function(a_49){return function(){var Tuple2$bsautos__50=unzip(map(function(Automaton$m_53){return function(){switch(Automaton$m_53[0]){case"Automaton":return Automaton$m_53[1](a_49)};throw "Non-exhaustive pattern match in case"}()})(autos_48)),bs_51=function(){switch(Tuple2$bsautos__50[0]){case"Tuple2":return Tuple2$bsautos__50[1]};throw "Non-exhaustive pattern match in case"}(),autos__52=function(){switch(Tuple2$bsautos__50[0]){case"Tuple2":return Tuple2$bsautos__50[2]};throw "Non-exhaustive pattern match in case"}();return ["Tuple2",bs_51,combine_4(autos__52)]}()})}
2991+function pure_5(f_59){return Automaton_0(function(x_60){return ["Tuple2",f_59(x_60),pure_5(f_59)]})}
2992+function init_6(s_61){return function(step_62){return Automaton_0(function(a_63){return function(){var s__64=step_62(a_63)(s_61);return ["Tuple2",s__64,init_6(s__64)(step_62)]}()})}}
2993+function init__7(s_65){return function(step_66){return Automaton_0(function(a_67){return function(){var Tuple2$bs__68=step_66(a_67)(s_65),b_69=function(){switch(Tuple2$bs__68[0]){case"Tuple2":return Tuple2$bs__68[1]};throw "Non-exhaustive pattern match in case"}(),s__70=function(){switch(Tuple2$bs__68[0]){case"Tuple2":return Tuple2$bs__68[2]};throw "Non-exhaustive pattern match in case"}();return ["Tuple2",b_69,init__7(s__70)(step_66)]}()})}}
2994+function vecSub_12(Tuple2$x1y1_77){return function(Tuple2$x2y2_78){return function(){switch(Tuple2$x1y1_77[0]){case"Tuple2":return function(){switch(Tuple2$x2y2_78[0]){case"Tuple2":return ["Tuple2",(Tuple2$x1y1_77[1]-Tuple2$x2y2_78[1]),(Tuple2$x1y1_77[2]-Tuple2$x2y2_78[2])]};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
2995+function stepDrag_13(Tuple2$presspos_83){return function(Tuple2$dsform_84){return function(){switch(Tuple2$presspos_83[0]){case"Tuple2":return function(){switch(Tuple2$dsform_84[0]){case"Tuple2":return function(){function wrap_89(ds__90){return ["Tuple2",Tuple2$dsform_84[2],["Tuple2",ds__90,Tuple2$dsform_84[2]]]};return function(){switch(Tuple2$dsform_84[1][0]){case"DragFrom":return(Tuple2$presspos_83[1]?["Tuple2",uncurry(move)(vecSub_12(Tuple2$presspos_83[2])(Tuple2$dsform_84[1][1]))(Tuple2$dsform_84[2]),["Tuple2",DragFrom_11(Tuple2$dsform_84[1][1]),Tuple2$dsform_84[2]]]:function(){var form__92=uncurry(move)(vecSub_12(Tuple2$presspos_83[2])(Tuple2$dsform_84[1][1]))(Tuple2$dsform_84[2]);return ["Tuple2",form__92,["Tuple2",Listen_9,form__92]]}());case"Ignore":return wrap_89((Tuple2$presspos_83[1]?Ignore_10:Listen_9));case"Listen":return wrap_89((not(Tuple2$presspos_83[1])?Listen_9:(isWithin(Tuple2$presspos_83[2])(Tuple2$dsform_84[2])?DragFrom_11(Tuple2$presspos_83[2]):Ignore_10)))};throw "Non-exhaustive pattern match in case"}()}()};throw "Non-exhaustive pattern match in case"}()};throw "Non-exhaustive pattern match in case"}()}}
2996+function dragForm_14(form_93){return init__7(["Tuple2",Listen_9,form_93])(stepDrag_13)};return {Automaton:Automaton_0,run:run_1,step:step_2,composeAuto:composeAuto_3,combine:combine_4,pure:pure_5,init:init_6,init_:init__7,count:count_8,Listen:Listen_9,Ignore:Ignore_10,DragFrom:DragFrom_11,vecSub:vecSub_12,stepDrag:stepDrag_13,dragForm:dragForm_14}}();Elm.main=function(){return Elm.Automaton.main}}catch(e){Elm.main=function(){var msg=('<br/><h2>Your browser may not be supported. Are you using a modern browser?</h2>'+'<br/><span style="color:grey">Runtime Error in Automaton module:<br/>'+e+'<br/><br/>The problem may stem from an improper usage of:<br/>fst, unzip</span>');document.body.innerHTML=Text.monospace(msg);throw e}}