@@ -1,3963 +1,135 @@
1−
2−Elm = {};
3−
4−var Guid = function() {
5− var counter = 0;
6− var guid = function() { counter += 1; return counter; };
7− return {guid : guid};
8−}();
9−Elm.JavaScript = function() {
10− function castJSBoolToBool(b) { return b; }
11− function castBoolToJSBool(b) { return b; }
12−
13− function castJSNumberToFloat(n) { return n; }
14− function castFloatToJSNumber(n) { return n; }
15−
16− function castJSNumberToInt(n) { return ~~n; }
17− function castIntToJSNumber(n) { return n; }
18−
19− function castJSElementToElement(w) {
20− return function(h) {
21− return function(node) {
22− return ["Element",Guid.guid(),
23− ["EExternalHtml",node],
24− w,h,1,["Nothing"],["Nothing"]];
25− }
26− }
27− }
28− function castElementToJSElement(elem) { return Render.render(elem); }
29−
30− function castJSArrayToList(arr) {
31− var list = ["Nil"];
32− for (var i = arr.length; i--; ) {
33− list = [ "Cons", arr[i], list ];
34− }
35− return list;
36− }
37− function castListToJSArray(list) {
38− var a = [];
39− while (list[0] === "Cons") {
40− a.push(list[1]);
41− list = list[2];
42− }
43− return a;
44− }
45−
46− var castJSStringToString = castJSArrayToList;
47− function castStringToJSString(str) {
48− if (typeof str === "string") return str;
49− return castListToJSArray(str).join('');
50− }
51−
52− function fromTuple(t) { return t.slice(1); }
53− function toTuple(a) { return ["Tuple" + a.length].concat(a); }
54−
55− return {castJSBoolToBool:castJSBoolToBool,
56− castBoolToJSBool:castBoolToJSBool,
57− castJSNumberToFloat:castJSNumberToFloat,
58− castFloatToJSNumber:castFloatToJSNumber,
59− castJSNumberToInt:castJSNumberToInt,
60− castIntToJSNumber:castIntToJSNumber,
61− Experimental : {castJSElementToElement:castJSElementToElement,
62− castElementToJSElement:castElementToJSElement},
63− castJSArrayToList:castJSArrayToList,
64− castListToJSArray:castListToJSArray,
65− castJSStringToString:castJSStringToString,
66− castStringToJSString:castStringToJSString,
67− castTupleToJSTuple2:fromTuple,
68− castTupleToJSTuple3:fromTuple,
69− castTupleToJSTuple4:fromTuple,
70− castTupleToJSTuple5:fromTuple,
71− castJSTupleToTuple2:toTuple,
72− castJSTupleToTuple3:toTuple,
73− castJSTupleToTuple4:toTuple,
74− castJSTupleToTuple5:toTuple
75− };
76−}();
77−
78−var JSjson = window.JSON;
79−Elm.JSON = function() {
80− var JS = Elm.JavaScript;
81− var empty = ['JSON',{}];
82− function singleton(k) { return function(v) {
83− var obj = {};
84− obj[JS.castStringToJSString(k)] = v;
85− return ['JSON', obj ];
86− };
87− }
88− function insert(k) { return function(v) { return function(inObj) {
89− var obj = inObj[1];
90− var outObj = {};
91− for (var i in obj) {
92− outObj[i] = obj[i];
93− }
94− outObj[JS.castStringToJSString(k)] = v;
95− return ['JSON', outObj ];
96− };
97− };
98− }
99−
100− function lookup(key) { return function(obj) {
101− var k = JS.castStringToJSString(key);
102− return obj[1].hasOwnProperty(k) ? ["Just", obj[1][k]] : ["Nothing"] ;
103− };
104− }
105− function find(tipe,base) { return function (key) { return function(obj) {
106− var k = JS.castStringToJSString(key);
107− if (obj[1].hasOwnProperty(k)) {
108− var v = obj[1][k];
109− if (v[0] === tipe) { return v[1]; }
110− }
111− return base;
112− };
113− }
114− }
115− function lookupWithDefault(base) { return function(key) { return function(obj) {
116− var k = JS.castStringToJSString(key);
117− return obj[1].hasOwnProperty(k) ? obj[1][k] : base ;
118− };
119− };
120− }
121−
122− function remove(k) { return function(inObj) {
123− var obj = inObj[1];
124− var outObj = {};
125− for (var i in obj) {
126− outObj[i] = obj[i];
127− }
128− delete outObj[JS.castStringToJSString(k)];
129− return ['JSON', outObj];
130− };
131− }
132−
133− function JsonString(v) { return [ "JsonString", v ]; }
134− function JsonNumber(v) { return [ "JsonNumber", v ]; }
135− function JsonBool(v) { return [ "JsonBool", v ]; }
136− var JsonNull = [ "JsonNull" ];
137− function JsonArray(v) { return [ "JsonArray", v ]; }
138− function JsonObject(v) { return [ "JsonObject", v ]; }
139−
140− function toList(json) {
141− var obj = json[1];
142− var arr = [];
143− for (var i in obj) {
144− arr.push(Value.Tuple(JS.castJSStringToString(i), obj[i]));
145− }
146− return JS.castJSArrayToList(arr);
147− }
148− function fromList(list) {
149− var arr = JS.castListToJSArray(list);
150− var obj = {};
151− for (var i = arr.length; i--; ) {
152− obj[JS.castStringToJSString(arr[i][1])] = arr[i][2];
153− }
154− return [ "JSON", obj ];
155− }
156−
157− function toPrettyJSString(sep) { return function (obj) {
158− function fromValue(v) {
159− switch (v[0]) {
160− case 'JsonNull' : return null;
161− case 'JsonString' : return JS.castStringToJSString(v[1]);
162− case 'JsonObject' :
163− var o = {};
164− var from = v[1][1];
165− for (var i in from) {
166− o[i] = fromValue(from[i]);
167− }
168− return o;
169− case 'JsonArray' :
170− var a = JS.castListToJSArray(v[1]);
171− for (var i = a.length; i--; ) {
172− a[i] = fromValue(a[i]);
173− }
174− return a;
175− default :
176− return v[1];
177− }
178− }
179− return JSjson.stringify(fromValue([ 'JsonObject', obj ]), null, JS.castStringToJSString(sep));
180− };
181− }
182− function fromJSString(str) {
183− var obj = JSjson.parse(str);
184− function toValue(v) {
185− switch (typeof v) {
186− case 'string' : return [ "JsonString", JS.castJSStringToString(v) ];
187− case 'number' : return [ "JsonNumber", JS.castJSNumberToFloat(v) ];
188− case 'boolean' : return [ "JsonBool", JS.castJSBoolToBool(v) ];
189− case 'object' :
190− if (v === null) return [ "JsonNull" ];
191− for (var i in v) {
192− v[i] = toValue(v[i]);
193− }
194− if (v instanceof Array) return [ "JsonArray", JS.castJSArrayToList(v) ];
195− return [ "JsonObject", [ "JSON", v ] ];
196− }
197− }
198− for (var i in obj) {
199− obj[i] = toValue(obj[i]);
200− }
201− return ['JSON',obj];
202− }
203− return {empty : empty,
204− singleton : singleton,
205− insert : insert,
206− lookup : lookup,
207− findString : find("JsonString",["Nil"]),
208− findObject : find("JsonObject", empty ),
209− findArray : find("JsonArray" ,["Nil"]),
210− findWithDefault : lookupWithDefault,
211− remove : remove,
212− toPrettyJSString : toPrettyJSString,
213− toJSString : toPrettyJSString(''),
214− fromJSString : fromJSString,
215− toPrettyString : function(sep) { return function(v) {
216− return JS.castJSStringToString(toPrettyJSString(sep)(v)); }; },
217− toString : function(v) { return JS.castJSStringToString(toPrettyJSString('')(v)); },
218− fromString : function(v) { return fromJSString(JS.castStringToJSString(v)); },
219− toList : toList,
220− fromList : fromList,
221− JsonString : JsonString,
222− JsonNumber : JsonNumber,
223− JsonBool : JsonBool,
224− JsonNull : JsonNull,
225− JsonArray : JsonArray,
226− JsonObject : JsonObject
227− };
228−}();
229−
230−var Value = function(){
231−
232− var eq = function(x,y) {
233− if (typeof x === "object") {
234− if (x.hasOwnProperty('_')) {
235− for (var i in x) { if (x[i] != y[i]) return false; }
236− for (var i in y) { if (x[i] != y[i]) return false; }
237− return true;
238− }
239− if (x === y) return true;
240− if (x.length !== y.length) return false;
241− for (var i = x.length; i--; ) {
242− if (!eq(x[i],y[i])) return false;
243− }
244− return true;
245− }
246− return x === y;
247− };
248−
249− var Tuple = function() {
250− var len = arguments.length;
251− var arr = new Array(len+1);
252− arr[0] = "Tuple" + arguments.length;
253− for (var i = len; i--; ) {
254− arr[i+1] = arguments[i];
255− }
256− return arr;
257− };
258−
259− var listToArray = function(list) {
260− var arr = [];
261− while (list[0] === "Cons") {
262− arr.push(list[1]);
263− list = list[2];
264− }
265− return arr;
266− };
267−
268− function makeSpaces(s) {
269− if (s.length == 0) { return s; }
270− var arr = s.split('');
271− if (arr[0] == ' ') { arr[0] = " " }
272− for (var i = arr.length; --i; ) {
273− if (arr[i][0] == ' ' && arr[i-1] == ' ') {
274− arr[i-1] = arr[i-1] + arr[i];
275− arr[i] = '';
276− }
277− }
278− for (var i = arr.length; i--; ) {
279− if (arr[i].length > 1 && arr[i][0] == ' ') {
280− var spaces = arr[i].split('');
281− for (var j = spaces.length - 2; j >= 0; j -= 2) {
282− spaces[j] = ' ';
283− }
284− arr[i] = spaces.join('');
285− }
286− }
287− arr = arr.join('');
288− if (arr[arr.length-1] === " ") {
289− return arr.slice(0,-1) + ' ';
290− }
291− return arr;
292− }
293−
294− function properEscape(str) {
295− if (str.length == 0) return str;
296− str = str //.replace(/&/g, "&")
297− .replace(/"/g, /*"*/ """)
298− .replace(/'/g, /*'*/ "'")
299− .replace(/</g, "<")
300− .replace(/>/g, ">")
301− .replace(/\n/g, "<br/>");
302− var arr = str.split('<br/>');
303− for (var i = arr.length; i--; ) {
304− arr[i] = makeSpaces(arr[i]);
305− }
306− return arr.join('<br/>');
307− }
308−
309− var toText = function(elmList) {
310− if (typeof elmList === "string") return properEscape(elmList);
311− var a = [];
312− while (elmList[0] === "Cons") {
313− a.push(elmList[1]);
314− elmList = elmList[2];
315− }
316− return properEscape(a.join(''));
317− };
318−
319− function getTextSize(w,h,txt) {
320− var t = document.createElement('div');
321− t.innerHTML = txt;
322− t.style.textAlign = 'left';
323− if (w > 0) { t.style.width = w + "px"; }
324−
325− t.style.visibility = "hidden";
326− t.style.styleFloat = "left";
327− t.style.cssFloat = "left";
328−
329− document.body.appendChild(t);
330− var cStyle = window.getComputedStyle(t,null);
331− var realW = cStyle.getPropertyValue("width").slice(0,-2) - 0;
332− var realH = cStyle.getPropertyValue("height").slice(0,-2) - 0;
333− document.body.removeChild(t);
334− //delete t;
335− return [Math.ceil(realW),Math.ceil(Math.max(h,realH))];
336− }
337−
338− function getSize(e) {
339− var t = e.cloneNode(true);
340−
341− t.style.visibility = "hidden";
342− t.style.styleFloat = "left";
343− t.style.cssFloat = "left";
344−
345− document.body.appendChild(t);
346− var w = t.offsetWidth;
347− var h = t.offsetHeight;
348− document.body.removeChild(t);
349− //delete t;
350− return [w,h];
351− }
352−
353− function getExcess(e) {
354− var t = e.cloneNode(true);
355−
356− t.style.visibility = "hidden";
357− t.style.styleFloat = "left";
358− t.style.cssFloat = "left";
359−
360− document.body.appendChild(t);
361− var ow = t.offsetWidth;
362− var oh = t.offsetHeight;
363− var cStyle = window.getComputedStyle(t,null);
364− var w = cStyle.getPropertyValue("width").slice(0,-2) - 0;
365− var h = cStyle.getPropertyValue("height").slice(0,-2) - 0;
366− document.body.removeChild(t);
367− //delete t;
368− return [ow-w,oh-h];
369− }
370−
371−
372− function groupForms(forms) {
373− forms = Elm.JavaScript.castListToJSArray(forms);
374− var groups = [];
375− var arr = [];
376− for (var i = forms.length; i--; ) {
377− var f = forms[i];
378− switch(f[4][0]) {
379− case "FElement":
380− if (arr.length > 0) {
381− groups.push(arr);
382− arr = [];
383− }
384− groups.push(f);
385− break;
386− default:
387− arr.push(f);
388− }
389− }
390− if (arr.length > 0) groups.push(arr);
391− return groups;
392− }
393−
394− var toString = function(v) {
395− if (typeof v === "function") {
396− return "<function>";
397− } else if (typeof v === "boolean") {
398− return v ? "True" : "False";
399− } else if (typeof v === "number") {
400− return v+"";
401− } else if (typeof v === "string" && v.length < 2) {
402− return "'"+v+"'";
403− } else if (typeof v === "object" && v.hasOwnProperty('_')) {
404− var output = []
405− for (var k in v) {
406− if (k == '_') continue;
407− for (var i = v[k].length; i--; ) {
408− output.push(k + " = " + toString(v[k][i]));
409− }
410− }
411− if (output.length === 0) return "{}";
412− return "{ " + output.join(", ") + " }";
413− } else if (v[0]) {
414− if (v[0].substring(0,5) === "Tuple") {
415− var output = new Array(v.length-1);
416− for (var i = v.length; --i; ) { output[i-1] = toString(v[i]); }
417− return "(" + output.join(",") + ")";
418− } else if (v[0] === "Cons") {
419− var start = (typeof v[1] === "string") ? '"' : "[";
420− var end = (typeof v[1] === "string") ? '"' : "]";
421− var div = (typeof v[1] === "string") ? "" : ",";
422− var f = (typeof v[1] === "string") ? function(x){return x} : toString;
423− var output = start + f(v[1]);
424− v = v[2];
425− while (true) {
426− if (v[0] === "Cons") {
427− output += div + f(v[1]);
428− v = v[2];
429− } else {
430− return output + end;
431− }
432− }
433− } else if (v[0] === "Nil") {
434− return "[]";
435− } else if (v[0] === "JSON") {
436− return "(JSON.fromList " + toString(Elm.JSON.toList(v)) + ")";
437− } else if (v[0] === "RBNode" || v[0] === "RBEmpty") {
438− function cons(k){ return function(v) { return function(acc) { return ["Cons",["Tuple2",k,v],acc]; }; }; }
439− var list = Elm.Dict.foldr(cons)(["Nil"])(v);
440− var name = "Dict";
441− if (list[0] === "Cons" && list[1][2][0] === "Tuple0") {
442− name = "Set";
443− list = Elm.List.map(function(x) { return x[1]; })(list);
444− }
445− return "(" + name + ".fromList " + toString(list) + ")";
446− } else {
447− var output = [];
448− for (var i = v.length; --i; ) { output.push(toString(v[i])); }
449− output = v[0] + ' ' + output.join(' ');
450− return (v.length > 1) ? "(" + output + ")" : output;
451− }
452− }
453− return v+"";
454− };
455− var show = function(v) { return str(toString(v)); };
456− var append = function(xs,ys) {
457− if (typeof xs === "string" && typeof ys === "string") {
458− return xs.concat(ys);
459− }
460− if (xs[0] === "Nil") {
461− return ys;
462− }
463− var root = ["Cons", xs[1], ["Nil"]];
464− var curr = root;
465− xs = xs[2];
466− while (xs[0]==="Cons") {
467− curr[2] = ["Cons", xs[1], ["Nil"]];
468− xs = xs[2];
469− curr = curr[2];
470− }
471− curr[2] = ys;
472− return root;
473− };
474−
475− var str = function(s) {
476− var out = ["Nil"];
477− for (var i = s.length; i--; ) {
478− out = ["Cons", s[i], out];
479− }
480− return out;
481− };
482−
483− function wrap(elem) {
484− var p = Value.getSize(elem);
485− return ["Element", Guid.guid(), ["EHtml",elem],
486− p[0], p[1], 1, ["Nothing"], ["Nothing"]];
487− }
488− var addListener = function() {
489− if(document.addEventListener) {
490− return function(element, event, handler) {
491− element.addEventListener(event, handler, false);
492− };
493− } else {
494− return function(element, event, handler) {
495− element.attachEvent('on' + event, handler);
496− };
497− }
498− }();
499−
500− return {eq:eq,
501− str:str,
502− show:show,
503− Tuple:Tuple,
504− append:append,
505− listToArray:listToArray,
506− toText : toText,
507− properEscape : properEscape,
508− getTextSize : getTextSize,
509− getSize : getSize,
510− getExcess : getExcess,
511− groupForms : groupForms,
512− wrap : wrap,
513− addListener : addListener
514− };
515−}();Elm.List = function() {
516−
517− var throwError = function(f) {
518− throw "Function '" + f + "' expecting a list!";
519− }
520−
521− function length(xs) {
522− var out = 0;
523− while (xs[0] === "Cons") {
524− out += 1;
525− xs = xs[2];
526− }
527− return out;
528− };
529− var reverse = foldl(function(x_72) {
530− return function(y_73) {
531− return["Cons", x_72, y_73]
532− }
533− })(["Nil"]);
534− var concat = foldr(function(x_74) {
535− return function(y_75) {
536− return Value.append(x_74, y_75)
537− }
538− })(["Nil"]);
539− var and = foldl(function(x_77) {
540− return function(y_78) {
541− return x_77 && y_78
542− }
543− })(true);
544− var or = foldl(function(x_79) {
545− return function(y_80) {
546− return x_79 || y_80
547− }
548− })(false);
549− var sum = foldl(function(x_89) {
550− return function(y_90) {
551− return x_89 + y_90
552− }
553− })(0);
554− var product = foldl(function(x_91) {
555− return function(y_92) {
556− return x_91 * y_92
557− }
558− })(1);
559− var maximum = foldl1(function(x) { return function(y) { return Math.max(x,y) } });
560− var minimum = foldl1(function(x) { return function(y) { return Math.min(x,y) } });
561− function head(v) {
562− if (v[0] !== "Cons") {
563− throw "Error: 'head' only accepts lists of length greater than one.";
564− }
565− return v[1];
566− }
567− function tail(v) {
568− if (v[0] !== "Cons") {
569− throw "Error: 'tail' only accepts lists of length greater than one.";
570− }
571− return v[2];
572− }
573− function last(v) {
574− if (v[0] !== "Cons") {
575− throw "Error: 'last' only accepts lists of length greater than one.";
576− }
577− var out = v[1];
578− while (v[0] === "Cons") {
579− out = v[1];
580− v = v[2];
581− }
582− return out;
583− }
584− function map(f) {
585− return function(xs) {
586− if (xs[0] === "Nil") { return xs; }
587− if (xs[0] !== "Cons") { throwError('map'); }
588− var root = ["Cons", f(xs[1]), ["Nil"]];
589− var curr = root;
590− xs = xs[2];
591− while (xs[0]==="Cons") {
592− curr[2] = ["Cons", f(xs[1]), ["Nil"]];
593− xs = xs[2];
594− curr = curr[2];
595− }
596− return root;
597− }
598− }
599− function foldl(f) {
600− return function(b) {
601− return function(xs) {
602− var acc = b;
603− if (xs[0] === "Nil") { return acc; }
604− if (xs[0] !== "Cons") { throwError('foldl'); }
605− while (xs[0] === "Cons") {
606− acc = f(xs[1])(acc);
607− xs = xs[2];
608− }
609− return acc;
610− }
611− }
612− }
613− function foldr(f) {
614− return function(b) {
615− return function(xs) {
616− var acc = b;
617− if (xs[0] === "Nil") { return acc; }
618− if (xs[0] !== "Cons") { throwError('foldr'); }
619− var arr = [];
620− while (xs[0] === "Cons") {
621− arr.push(xs[1]);
622− xs = xs[2];
623− }
624− for (var i = arr.length; i--; ) {
625− acc = f(arr[i])(acc);
626− }
627− return acc;
628− }
629− }
630− }
631− function foldl1(f_49) {
632− return function(_temp_50) {
633− return function(v) {
634− if("Cons" !== v[0]) {
635− return undefined
636− }else {
637− var x_51 = v[1];
638− var xs_52 = v[2];
639− return foldl(f_49)(x_51)(xs_52)
640− }
641− }(_temp_50)
642− }
643− }
644− function foldr1(f) {
645− return function(xs) {
646− if (xs[0] === "Nil") { throw "'foldr1' requires an non-empty list." }
647− if (xs[0] !== "Cons") { throwError('foldr1'); }
648− var arr = [];
649− while (xs[0] === "Cons") {
650− arr.push(xs[1]);
651− xs = xs[2];
652− }
653− var acc = arr.pop();
654− for (var i = arr.length; i--; ) {
655− acc = f(arr[i])(acc);
656− }
657− return acc;
658− }
659− }
660− function scanl(f) {
661− return function(b) {
662− return function(xs) {
663− if (xs[0] === "Nil") { return ["Cons",b,["Nil"]]; }
664− if (xs[0] !== "Cons") { throwError('scanl'); }
665− var arr = [b];
666− while (xs[0] === "Cons") {
667− b = f(xs[1])(b);
668− arr.push(b);
669− xs = xs[2];
670− }
671− var out = ["Nil"];
672− for (var i = arr.length; i--; ) {
673− out = ["Cons", arr[i], out];
674− }
675− return out;
676− }
677− }
678− }
679− function scanl1(f) {
680− return function(xs) {
681− if (xs[0] !== "Cons") {
682− throw "Error: 'scanl1' requires a list of at least length 1.";
683− }
684− return scanl(f)(xs[1])(xs[2]);
685− }
686− }
687− function filter(pred) {
688− return function(xs) {
689− if (xs[0] === "Nil") { return xs; }
690− if (xs[0] !== "Cons") { throwError('filter'); }
691− var arr = [];
692− while (xs[0] === "Cons") {
693− if (pred(xs[1])) { arr.push(xs[1]); }
694− xs = xs[2];
695− }
696− var out = ["Nil"];
697− for (var i = arr.length; i--; ) {
698− out = ["Cons", arr[i], out];
699− }
700− return out;
701− }
702− }
703− function concatMap(f_76) {
704− return function(x) {
705− return concat(map(f_76)(x))
706− }
707− }
708− function all(pred) {
709− return foldl(function(x) { return function(acc) {
710− return acc && pred(x);
711− };})(true);
712− }
713− function any(pred) {
714− return foldl(function(x) { return function(acc) {
715− return acc || pred(x);
716− };})(false);
717− }
718− function partition(pred_93) {
719− return function(lst_94) {
720− return function() {
721− var v = lst_94;
722− var c = [function(v) {
723− if("Nil" !== v[0]) {
724− return undefined
725− }else {
726− return["Tuple2", ["Nil"], ["Nil"]]
727− }
728− }, function(v) {
729− if("Cons" !== v[0]) {
730− return undefined
731− }else {
732− var x_95 = v[1];
733− var xs_96 = v[2];
734− return function(v) {
735− if("Tuple2" !== v[0]) {
736− return undefined
737− }else {
738− var as_97 = v[1];
739− var bs_98 = v[2];
740− return pred_93(x_95) ? ["Tuple2", ["Cons", x_95, as_97], bs_98] : ["Tuple2", as_97, ["Cons", x_95, bs_98]]
741− }
742− }(partition(pred_93)(xs_96))
743− }
744− }];
745− for(var i = c.length;i--;) {
746− var r = c[i](v);
747− if(r !== undefined) {
748− return r
749− }
750− }
751− }()
752− }
753− }
754− function zipWith(f) {
755− return function(listA) {
756− return function(listB) {
757− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
758− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zipWith'); }
759− var arr = [];
760− while (listA[0] === "Cons" && listB[0] === "Cons") {
761− arr.push(f(listA[1])(listB[1]));
762− listA = listA[2];
763− listB = listB[2];
764− }
765− var out = ["Nil"];
766− for (var i = arr.length; i--; ) {
767− out = ["Cons", arr[i], out];
768− }
769− return out;
770− }
771− }
772− }
773− function zip(listA) {
774− return function(listB) {
775− if (listA[0] === "Nil" || listB[0] === "Nil") { return ["Nil"]; }
776− if (listA[0] !== "Cons" || listB[0] !== "Cons") { throwError('zip'); }
777− var arr = [];
778− while (listA[0] === "Cons" && listB[0] === "Cons") {
779− arr.push(["Tuple2", listA[1], listB[1]]);
780− listA = listA[2];
781− listB = listB[2];
782− }
783− var out = ["Nil"];
784− for (var i = arr.length; i--; ) {
785− out = ["Cons", arr[i], out];
786− }
787− return out;
788− }
789− }
790− function unzip(pairs_112) {
791− return function() {
792− var v = pairs_112;
793− var c = [function(v) {
794− if("Nil" !== v[0]) {
795− return undefined
796− }else {
797− return["Tuple2", ["Nil"], ["Nil"]]
798− }
799− }, function(v) {
800− if("Cons" !== v[0]) {
801− return undefined
802− }else {
803− var p_113 = v[1];
804− var ps_114 = v[2];
805− return function(v) {
806− if("Tuple2" !== v[0]) {
807− return undefined
808− }else {
809− if("Tuple2" !== v[1][0]) {
810− return undefined
811− }else {
812− var x_115 = v[1][1];
813− var y_116 = v[1][2];
814− if("Tuple2" !== v[2][0]) {
815− return undefined
816− }else {
817− var xs_117 = v[2][1];
818− var ys_118 = v[2][2];
819− return["Tuple2", ["Cons", x_115, xs_117], ["Cons", y_116, ys_118]]
820− }
821− }
822− }
823− }(["Tuple2", p_113, unzip(ps_114)])
824− }
825− }];
826− for(var i = c.length;i--;) {
827− var r = c[i](v);
828− if(r !== undefined) {
829− return r
830− }
831− }
832− }()
833− }
834− function intersperse(sep_119) {
835− return function(xs_120) {
836− return function() {
837− var v = xs_120;
838− var c = [function(v) {
839− if("Nil" !== v[0]) {
840− return undefined
841− }else {
842− return["Nil"]
843− }
844− }, function(v) {
845− if("Cons" !== v[0]) {
846− return undefined
847− }else {
848− var a_124 = v[1];
849− if("Nil" !== v[2][0]) {
850− return undefined
851− }else {
852− return["Cons", a_124, ["Nil"]]
853− }
854− }
855− }, function(v) {
856− if("Cons" !== v[0]) {
857− return undefined
858− }else {
859− var a_121 = v[1];
860− if("Cons" !== v[2][0]) {
861− return undefined
862− }else {
863− var b_122 = v[2][1];
864− var cs_123 = v[2][2];
865− return["Cons", a_121, ["Cons", sep_119, intersperse(sep_119)(["Cons", b_122, cs_123])]]
866− }
867− }
868− }];
869− for(var i = c.length;i--;) {
870− var r = c[i](v);
871− if(r !== undefined) {
872− return r
873− }
874− }
875− }()
876− }
877− }
878− function intercalate(sep_125) {
879− return function(xs_126) {
880− return function() {
881− var v = xs_126;
882− var c = [function(v) {
883− if("Nil" !== v[0]) {
884− return undefined
885− }else {
886− return["Nil"]
887− }
888− }, function(v) {
889− if("Cons" !== v[0]) {
890− return undefined
891− }else {
892− var a_130 = v[1];
893− if("Nil" !== v[2][0]) {
894− return undefined
895− }else {
896− return a_130
897− }
898− }
899− }, function(v) {
900− if("Cons" !== v[0]) {
901− return undefined
902− }else {
903− var a_127 = v[1];
904− if("Cons" !== v[2][0]) {
905− return undefined
906− }else {
907− var b_128 = v[2][1];
908− var cs_129 = v[2][2];
909− return Value.append(a_127, Value.append(sep_125, intercalate(sep_125)(["Cons", b_128, cs_129])))
910− }
911− }
912− }];
913− for(var i = c.length;i--;) {
914− var r = c[i](v);
915− if(r !== undefined) {
916− return r
917− }
918− }
919− }()
920− }
921− }
922− function sort(xs) {
923− if (xs[0] === "Nil") { return xs; }
924− if (xs[0] !== "Cons") { throwError('sort'); }
925− var arr = [];
926− while (xs[0] === "Cons") {
927− arr.push(xs[1]);
928− xs = xs[2];
929− }
930− arr.sort(function(a,b) { return a - b});
931− var out = ["Nil"];
932− for (var i = arr.length; i--; ) {
933− out = [ "Cons", arr[i], out ];
934− }
935− return out;
936− }
937− function take(n) { return function(xs) {
938− if (n <= 0) { return ["Nil"]; }
939− if (xs[0] === "Nil") { return xs; }
940− if (xs[0] !== "Cons") { throwError('take'); }
941− var out = [ "Cons", xs[1], ["Nil"] ];
942− var temp = out;
943− xs = xs[2];
944− --n;
945− while (xs[0] === "Cons" && n > 0) {
946− temp[2] = [ "Cons", xs[1], ["Nil"] ];
947− temp = temp[2];
948− xs = xs[2];
949− --n;
950− }
951− return out;
952− };
953− }
954− function drop(n) { return function(xs) {
955− if (xs[0] === "Nil") { return xs; }
956− if (xs[0] !== "Cons") { throwError('drop'); }
957− while (xs[0] === "Cons" && n > 0) {
958− xs = xs[2];
959− --n;
960− }
961− return xs;
962− };
963− }
964− return {head:head,
965− tail:tail,
966− last:last,
967− map:map,
968− foldl:foldl,
969− foldr:foldr,
970− foldl1:foldl1,
971− foldr1:foldr1,
972− scanl:scanl,
973− scanl1:scanl1,
974− filter:filter,
975− length:length,
976− reverse:reverse,
977− concat:concat,
978− concatMap:concatMap,
979− and:and,
980− or:or,
981− all:all,
982− any:any,
983− sum:sum,
984− product:product,
985− maximum:maximum,
986− minimum:minimum,
987− partition:partition,
988− zipWith:zipWith,
989− zip:zip,
990− unzip:unzip,
991− intersperse:intersperse,
992− intercalate:intercalate,
993− sort:sort,
994− take:take,
995− drop:drop};
996−}();
997−Elm.Maybe = function() {
998− function consMaybe(x) { return function(xs) {
999− if (x[0] === "Just") return ["Cons", x[1], xs];
1000− return xs;
1001− };
1002− }
1003− function fromMaybe(b) { return function(m) {
1004− if (m[0] === "Just") return m[1];
1005− return b;
1006− };
1007− }
1008− function mapCons(f) { return function(y) { return function(xs) {
1009− var x = f(y);
1010− if (x[0] === "Just") return ["Cons", x[1], xs];
1011− return xs;
1012− };
1013− };
1014− }
1015− function maybe(b) { return function(f) { return function(m) {
1016− if (m[0] === "Just") return f(m[1]);
1017− return b;
1018− };
1019− };
1020− }
1021−
1022− return {Just : function(x) { return ["Just",x]; },
1023− Nothing : ["Nothing"],
1024− catMaybes : Elm.List.foldr(consMaybe)(["Nil"]),
1025− isJust : function(m) { return m[0] === "Just"; },
1026− isNothing : function(m) { return m[0] === "Nothing"; },
1027− fromMaybe : fromMaybe,
1028− consMaybe : consMaybe,
1029− mapMaybe : function(f) { return Elm.List.foldr(mapCons(f))(["Nil"]); },
1030− maybe : maybe
1031− };
1032−}();
1033−
1034−Elm.Char = function() {
1035− function isBetween(lo,hi) { return function(chr) {
1036− var c = chr.charCodeAt(0);
1037− return lo <= c && c <= hi;
1038− };
1039− }
1040− var isDigit = isBetween('0'.charCodeAt(0),'9'.charCodeAt(0));
1041− var chk1 = isBetween('a'.charCodeAt(0),'f'.charCodeAt(0));
1042− var chk2 = isBetween('A'.charCodeAt(0),'F'.charCodeAt(0));
1043−
1044− return {fromCode : function(c) { return String.fromCharCode(c); },
1045− toCode : function(c) { return c.charCodeAt(0); },
1046− toUpper : function(c) { return c.toUpperCase(); },
1047− toLower : function(c) { return c.toLowerCase(); },
1048− toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
1049− toLocaleLower : function(c) { return c.toLocaleLowerCase(); },
1050− isLower : isBetween('a'.charCodeAt(0),'z'.charCodeAt(0)),
1051− isUpper : isBetween('A'.charCodeAt(0),'Z'.charCodeAt(0)),
1052− isDigit : isDigit,
1053− isOctDigit : isBetween('0'.charCodeAt(0),'7'.charCodeAt(0)),
1054− isHexDigit : function(c) { return isDigit(c) || chk1(c) || chk2(c); }
1055− };
1056−}();
1057−Elm.Color = function() {
1058−
1059−function Color_0(a1) {
1060− return function(a2) {
1061− return function(a3) {
1062− return function(a4) {
1063− return["Color", a1, a2, a3, a4]
1064− }
1065− }
1066− }
1067−}
1068−var rgba_1 = Color_0;
1069−var red_3 = ["Color",255,0,0,1];
1070−var green_4 = ["Color",0,255,0,1];
1071−var blue_5 = ["Color",0,0,255,1];
1072−var yellow_6 = ["Color",255,255,0,1];
1073−var cyan_7 = ["Color",0,255,255,1];
1074−var magenta_8 = ["Color",255,0,255,1];
1075−var black_9 = ["Color",0,0,0,1];
1076−var white_10 = ["Color",255,255,255,1];
1077−var gray_11 = ["Color",128,128,128,1];
1078−var grey_12 = ["Color",128,128,128,1];
1079−function rgb_2(r_13) {
1080− return function(g_14) {
1081− return function(b_15) {
1082− return ["Color",r_13,g_14,b_15,1]
1083− }
1084− }
1085−}
1086−function extract(c) {
1087− if (c[4] === 1) { return 'rgb(' + c[1] + ',' + c[2] + ',' + c[3] + ')'; }
1088− return 'rgba(' + c[1] + ',' + c[2] + ',' + c[3] + ',' + c[4] + ')';
1089−}
1090−function complement(rgb) {
1091− var hsv = toHSV(rgb);
1092− hsv.hue = (hsv.hue + 180) % 360;
1093− return toRGB(hsv);
1094−}
1095−
1096−function hsva(h) { return function(s) { return function(v) { return function(a) {
1097− var clr = toRGB({hue:h, saturation:s, value:v});
1098− clr[4] = a;
1099− return clr;
1100− }; }; };
1101−}
1102−
1103−function hsv(h) { return function(s) { return function(v) {
1104− return toRGB({hue:h, saturation:s, value:v}); }; }; }
1105−
1106−function toHSV(rgb) {
1107− var hsv = {};
1108− var r = rgb[1] / 255.0, g = rgb[2] / 255.0, b = rgb[3] / 255.0;
1109− var M = Math.max(r,g,b);
1110− var m = Math.min(r,g,b);
1111− var c = M - m;
1112−
1113− var h = 0;
1114− if (c === 0) { h = 0; }
1115− else if (M === r) { h = ((g - b) / c) % 6; }
1116− else if (M === g) { h = ((b - r) / c) + 2; }
1117− else if (M === b) { h = ((r - g) / c) + 4; }
1118− h *= 60;
1119−
1120− return { value : M, hue : h, saturation : (M === 0 ? 0 : c / M) };
1121−}
1122−
1123−function between(lo,hi,x) { return lo <= x && x < hi; }
1124−function norm(n) { return Math.round(n*255); }
1125−
1126−function toRGB(hsv) {
1127− var c = hsv.value * hsv.saturation;
1128− var hue = hsv.hue / 60;
1129− var x = c * (1 - Math.abs((hue % 2) - 1));
1130− var r = 0, g = 0, b = 0;
1131− if (between(0,1,hue)) { r = c; g = x; b = 0; }
1132− else if (between(1,2,hue)) { r = x; g = c; b = 0; }
1133− else if (between(2,3,hue)) { r = 0; g = c; b = x; }
1134− else if (between(3,4,hue)) { r = 0; g = x; b = c; }
1135− else if (between(4,5,hue)) { r = x; g = 0; b = c; }
1136− else if (between(5,6,hue)) { r = c; g = 0; b = x; }
1137−
1138− var m = hsv.value - c;
1139− return ["Color", norm(r+m), norm(g+m), norm(b+m), 1 ];
1140−}
1141− return{rgba:rgba_1, rgb:rgb_2, hsva:hsva, hsv:hsv, 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,complement:complement,extract:extract}
1142−}();
1143−var Collage = function() {
1144−
1145−var JS = Elm.JavaScript;
1146−
1147−function tracePoints(ctx,points) {
1148− var i = points.length - 1;
1149− if (i <= 0) return;
1150− ctx.moveTo(points[i][1], points[i][2]);
1151− while (i--) { ctx.lineTo(points[i][1], points[i][2]); }
1152−}
1153−
1154−function solid(ctx,color,points) {
1155− tracePoints(ctx,points);
1156− ctx.strokeStyle = Elm.Color.extract(color);
1157− ctx.stroke();
1158−};
1159−
1160−function filled(ctx,color,points) {
1161− tracePoints(ctx,points);
1162− ctx.fillStyle = Elm.Color.extract(color);
1163− ctx.fill();
1164−}
1165−
1166−function textured(redo,ctx,src,points) {
1167− var img = new Image();
1168− img.src = JS.castStringToJSString(src);
1169− img.onload = redo;
1170−
1171− tracePoints(ctx,points);
1172− ctx.fillStyle = ctx.createPattern(img,'repeat');
1173− ctx.fill();
1174−}
1175−
1176−function customLine(pattern,ctx,color,points) {
1177− if (pattern.length === 0) { pattern = [8,4]; }
1178− customLineHelp(ctx, pattern, points);
1179− ctx.strokeStyle = Elm.Color.extract(color);
1180− ctx.stroke();
1181−};
1182−
1183−var customLineHelp = function(ctx, pattern, points) {
1184− var i = points.length - 1;
1185− if (i <= 0) return;
1186− var x0 = points[i][1], y0 = points[i][2];
1187− var x1=0, y1=0, dx=0, dy=0, remaining=0, nx=0, ny=0;
1188− var pindex = 0, plen = pattern.length;
1189− var draw = true, segmentLength = pattern[0];
1190− ctx.moveTo(x0,y0);
1191− while (i--) {
1192− x1 = points[i][1]; y1 = points[i][2];
1193− dx = x1 - x0; dy = y1 - y0;
1194− remaining = Math.sqrt(dx * dx + dy * dy);
1195− while (segmentLength <= remaining) {
1196− x0 += dx * segmentLength / remaining;
1197− y0 += dy * segmentLength / remaining;
1198− ctx[draw ? 'lineTo' : 'moveTo'](x0, y0);
1199− // update starting position
1200− dx = x1 - x0; dy = y1 - y0;
1201− remaining = Math.sqrt(dx * dx + dy * dy);
1202− // update pattern
1203− draw = !draw;
1204− pindex = (pindex + 1) % plen;
1205− segmentLength = pattern[pindex];
1206− }
1207− if (remaining > 0) {
1208− ctx[draw ? 'lineTo' : 'moveTo'](x1, y1);
1209− segmentLength -= remaining;
1210− }
1211− x0 = x1; y0 = y1;
1212− }
1213−};
1214−
1215−function drawLine(ctx,form) {
1216− var points = form[3][1];
1217− switch(form[1][0]) {
1218− case "Solid" : return solid(ctx,form[2],points);
1219− case "Dotted": return customLine([3,3],ctx,form[2],points);
1220− case "Dashed": return customLine([8,4],ctx,form[2],points);
1221− case "Custom": return customLine(form[1][1],ctx,form[2],points);
1222− }
1223−};
1224−
1225−function drawShape(redo,ctx,shapeStyle,color,points) {
1226− switch(shapeStyle[0]) {
1227− case "Filled": return filled(ctx,color,points);
1228− case "Outlined": return solid(ctx,color,points);
1229− case "Textured": return textured(redo,ctx,shapeStyle[1],points);
1230− case "CustomOutline":
1231− return customLine(shapeStyle[1],ctx,color,points);
1232− }
1233−};
1234−
1235−function drawImage(redo,ctx,w,h,src) {
1236− var img = new Image();
1237− img.onload = redo;
1238− img.src = JS.castStringToJSString(src);
1239− ctx.drawImage(img,-w/2,-h/2,w,h);
1240−}
1241−
1242−function renderForm(redo,ctx,theta,scale,x,y,form) {
1243− ctx.save();
1244− if (x !== 0 || y !== 0) ctx.translate(x,y);
1245− if (theta !== ~~theta) ctx.rotate(2*Math.PI*theta);
1246− if (scale !== 1) ctx.scale(scale,scale);
1247− ctx.beginPath();
1248− switch(form[0]) {
1249− case "FLine": drawLine(ctx,form); break;
1250− case "FShape": drawShape(redo,ctx,form[1],form[2],form[3][1]); break;
1251− case "FImage": drawImage(redo,ctx,form[1],form[2],form[3]); break;
1252− }
1253− ctx.restore();
1254−};
1255−
1256−function renderForms(redo,ctx,w,h,forms) {
1257− ctx.clearRect(0,0,w,h);
1258− for (var i = forms.length; i--; ) {
1259− var f = forms[i];
1260− renderForm(redo,ctx,f[1],f[2],f[3][1],f[3][2],f[4]);
1261− }
1262−}
1263−
1264−function collageForms(w,h,forms) {
1265− var canvas = Render.newElement('canvas');
1266− w = ~~w;
1267− h = ~~h;
1268− canvas.style.width = w + 'px';
1269− canvas.style.height = h + 'px';
1270− canvas.style.display = "block";
1271− canvas.width = w;
1272− canvas.height = h;
1273− if (canvas.getContext) {
1274− var ctx = canvas.getContext('2d');
1275− function redo() { renderForms(this,ctx,w,h,forms); }
1276− renderForms(redo,ctx,w,h,forms);
1277− return canvas;
1278− }
1279− canvas.innerHTML = "Your browser does not support the canvas element.";
1280− return canvas;
1281−};
1282−
1283−function collageElement(w,h,theta,scale,x,y,elem) {
1284− var e = Render.render(elem);
1285− var t = "translate(" + (x - elem[3] / 2) + "px,"+ (y - elem[4] / 2) + "px)";
1286− var r = theta === (~~theta) ? "" : "rotate(" + theta*360 + "deg)";
1287− var s = scale === 1 ? "" : "scale(" + scale + "," + scale + ")";
1288− var transforms = t + " " + s + " " + r;
1289− e.style.transform = transforms;
1290− e.style.msTransform = transforms;
1291− e.style.MozTransform = transforms;
1292− e.style.webkitTransform = transforms;
1293− e.style.OTransform = transforms;
1294− var div = Render.newElement('div');
1295− Render.addTo(div,e);
1296− div.style.width = (~~w) + "px";
1297− div.style.height = (~~h) + "px";
1298− div.style.overflow = "hidden";
1299− return div;
1300−}
1301−
1302−function collage(w,h,formss) {
1303− if (formss.length === 0) { return collageForms(w,h,[]); }
1304− var elems = new Array(formss.length);
1305− for (var i = formss.length; i--; ) {
1306− var f = formss[i];
1307− if (typeof f[0] === "string") {
1308− elems[i] = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1309− } else {
1310− elems[i] = collageForms(w,h,f);
1311− }
1312− }
1313− if (formss.length === 1) { return elems[0]; }
1314− return Render.flowWith(Render.goIn,function(x){return x},elems);
1315−}
1316−
1317−function updateFormSet(node,currSet,nextSet) {
1318− if (Value.eq(nextSet,currSet)) return;
1319− var w = node.style.width.slice(0,-2) - 0;
1320− var h = node.style.height.slice(0,-2) - 0;
1321− if (typeof nextSet[0] === "object") {
1322− if (typeof currSet[0] === "object") {
1323− if (node.getContext) {
1324− var ctx = node.getContext('2d');
1325− function redo() { renderForms(this,ctx,w,h,nextSet); }
1326− return renderForms(redo,ctx,w,h,nextSet);
1327− }
1328− }
1329− var newNode = collageForms(w,h,nextSet);
1330− newNode.style.position = 'absolute';
1331− return node.parentNode.replaceChild(newNode,node);
1332− }
1333− var f = nextSet;
1334− var newNode = collageElement(w,h,f[1],f[2],f[3][1],f[3][2],f[4][1]);
1335− newNode.style.position = 'absolute';
1336− return node.parentNode.replaceChild(newNode,node);
1337−}
1338−
1339−// assumes that the form sets are the same length.
1340−function updateCollage(node,currs,nexts) {
1341− if (nexts.length === 1) {
1342− return updateFormSet(node,currs[0],nexts[0]);
1343− }
1344− var kids = node.childNodes;
1345− var len = kids.length;
1346− for (var i = len; i--; ) {
1347− updateFormSet(kids[len-i-1], currs[i], nexts[i]);
1348− }
1349−}
1350−
1351−function style(clr,n,list) {
1352− return ["Tuple2",
1353− '<span style="font-size:100%;color:' + clr + ';">' + n + '</span>',
1354− list];
1355−}
1356−
1357−function insideForm(point) { return function(form) {
1358− if (!inBoundsOf(point[1],point[2],form)) return false;
1359− var hw, hh;
1360− switch (form[4][0]) {
1361− case "FShape": return insideShape(point,form[1],form[2],form[3],form[4][3][1]);
1362− case "FLine": return false;
1363− case "FImage":
1364− hw = form[4][1] / 2;
1365− hh = form[4][2] / 2;
1366− break;
1367− case "FElement":
1368− hw = form[4][1][3] / 2;
1369− hh = form[4][1][4] / 2;
1370− break;
1371− }
1372− return insideShape(point,form[1],form[2],form[3],
1373− [ [null, hw, hh],
1374− [null,-hw, hh],
1375− [null,-hw,-hh],
1376− [null, hw,-hh],
1377− [null, hw, hh] ]);
1378− };
1379−}
1380−
1381−function inBoundsOf(px,py,form) {
1382− if (form.length < 6) {
1383− var fx = form[3][1], fy = form[3][2];
1384− var radiusSquared = 0;
1385− var scale = form[2];
1386− switch (form[4][0]) {
1387− case "FShape":
1388− var points = form[4][3][1];
1389− for (var i = points.length; --i; ) {
1390− var p = points[i];
1391− radiusSquared = Math.max(radiusSquared, p[1]*p[1] + p[2]*p[2]);
1392− }
1393− radiusSquared *= scale * scale;
1394− break;
1395− case "FLine":
1396− break;
1397− case "FImage":
1398− var x = scale * form[4][1] / 2;
1399− var y = scale * form[4][2] / 2;
1400− radiusSquared = x*x + y*y;
1401− break;
1402− case "FElement":
1403− var x = scale * form[4][1][3] / 2;
1404− var y = scale * form[4][1][4] / 2;
1405− radiusSquared = x*x + y*y;
1406− break;
1407− }
1408− form.push(function(px,py) {
1409− var dx = px - fx;
1410− var dy = py - fy;
1411− return dx*dx + dy*dy < radiusSquared + 1;
1412− });
1413− }
1414− return form[5](px,py);
1415−}
1416−
1417−function insideShape(point,theta,scale,pos,points) {
1418− var counter = 0;
1419− var list = ["Nil"];
1420− var p1,p2;
1421−
1422− var x = (point[1] - pos[1]) / scale;
1423− var y = (point[2] - pos[2]) / scale;
1424− if (theta !== 0) {
1425− var t = -2 * Math.PI * theta;
1426− var nx = x * Math.cos(t) - y * Math.sin(t);
1427− y = x * Math.sin(t) + y * Math.cos(t);
1428− x = nx;
1429− }
1430−
1431− if (points.length === 0) { return false; }
1432− p1 = points[0];
1433− for (var i = points.length - 1; i--; ) {
1434− p2 = points[i];
1435− var p1x = p1[1], p1y = p1[2], p2x = p2[1], p2y = p2[2];
1436−
1437− if (p1y < p2y) {var ymin=p1y, ymax=p2y;} else {var ymin=p2y, ymax=p1y;}
1438− if (p1x < p2x) {var xmin=p1x, xmax=p2x;} else {var xmin=p2x, xmax=p1x;}
1439−
1440− if (ymin < y && y <= ymax && x <= xmax) {
1441− if (x <= xmin || x <= ((y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x)) {
1442− ++counter;
1443− }
1444− }
1445− p1 = p2;
1446− }
1447− return (counter % 2) === 1;
1448−}
1449−
1450−return {collage:collage, updateCollage:updateCollage, insideForm:insideForm};
1451−
1452−}();Elm.Graphics = function() {
1453− for (this['i'] in Elm.List) {
1454− eval('var ' + this['i'] + ' = Elm.List[this.i];');
1455− }
1456− var JS = Elm.JavaScript;
1457− var DLeft_0 = ["DLeft"];
1458− var DRight_1 = ["DRight"];
1459− var DUp_2 = ["DUp"];
1460− var DDown_3 = ["DDown"];
1461− var DIn_4 = ["DIn"];
1462− var DOut_5 = ["DOut"];
1463− function Absolute_12(a1) {
1464− return["Absolute", a1]
1465− }
1466− function Relative_13(a1) {
1467− return["Relative", a1]
1468− }
1469− var Near_14 = ["Near"];
1470− var Mid_15 = ["Mid"];
1471− var Far_16 = ["Far"];
1472− function Position_17(a1) {
1473− return function(a2) {
1474− return["Position", a1, a2]
1475− }
1476− }
1477− function PositionTL_18(a1) {
1478− return function(a2) {
1479− return["PositionTL", a1, a2]
1480− }
1481− }
1482− function PositionTR_19(a1) {
1483− return function(a2) {
1484− return["PositionTR", a1, a2]
1485− }
1486− }
1487− function PositionBL_20(a1) {
1488− return function(a2) {
1489− return["PositionBL", a1, a2]
1490− }
1491− }
1492− function PositionBR_21(a1) {
1493− return function(a2) {
1494− return["PositionBR", a1, a2]
1495− }
1496− }
1497− function Element_37(id,e,w,h,o,c,l) {
1498− return["Element", id, e, w, h, o, c, l ]
1499− }
1500− function EText_39(a1) {
1501− return function(a2) {
1502− return["EText", a1, a2]
1503− }
1504− }
1505− function EImage_40(a1) {
1506− return["EImage", JS.castStringToJSString(a1)]
1507− }
1508− function EVideo_41(a1) {
1509− return["EVideo", JS.castStringToJSString(a1)]
1510− }
1511− function EFittedImage_42(a1) {
1512− return["EFittedImage", JS.castStringToJSString(a1)]
1513− }
1514− function EFlow_43(a1) {
1515− return function(a2) {
1516− return["EFlow", a1, JS.castListToJSArray(a2)]
1517− }
1518− }
1519− function ECollage_44(a1) {
1520− return function(a2) {
1521− return function(a3) {
1522− return["ECollage", a1, a2, Value.groupForms(a3)]
1523− }
1524− }
1525− }
1526− var EEmpty_45 = ["EEmpty"];
1527− function EContainer_46(a1) {
1528− return function(a2) {
1529− return["EContainer", a1, a2]
1530− }
1531− }
1532− var Solid_68 = ["Solid"];
1533− var Dotted_69 = ["Dotted"];
1534− var Dashed_70 = ["Dashed"];
1535− function Custom_71(a1) {
1536− return["Custom", JS.castListToJSArray(a1)]
1537− }
1538− var Filled_72 = ["Filled"];
1539− var Outlined_73 = ["Outlined"];
1540− function CustomOutline_74(a1) {
1541− return["CustomOutline", JS.castListToJSArray(a1)]
1542− }
1543− function Line_75(a1) {
1544− return["Line", JS.castListToJSArray(a1)]
1545− }
1546− function Shape_78(a1) {
1547− return function(a2) {
1548− var points = JS.castListToJSArray(a1);
1549− if (points.length > 0) { points.push(points[0]); }
1550− return["Shape", points, a2];
1551− }
1552− }
1553− function Form_84(a1) {
1554− return function(a2) {
1555− return function(a3) {
1556− return function(a4) {
1557− return["Form", a1, a2, a3, a4]
1558− }
1559− }
1560− }
1561− }
1562− function FLine_85(a1) {
1563− return function(a2) {
1564− return function(a3) {
1565− return["FLine", a1, a2, a3]
1566− }
1567− }
1568− }
1569− function FShape_86(a1) {
1570− return function(a2) {
1571− return function(a3) {
1572− return["FShape", a1, a2, a3]
1573− }
1574− }
1575− }
1576− function FImage_87(a1) {
1577− return function(a2) {
1578− return function(a3) {
1579− return["FImage", a1, a2, JS.castStringToJSString(a3)]
1580− }
1581− }
1582− }
1583− function FElement_88(a1) {
1584− return["FElement", a1]
1585− }
1586− var left_6 = DLeft_0;
1587− var right_7 = DRight_1;
1588− var down_8 = DDown_3;
1589− var up_9 = DUp_2;
1590− var inward_10 = DIn_4;
1591− var outward_11 = DOut_5;
1592− var topLeft_22 = Position_17(Near_14)(Near_14);
1593− var topRight_23 = Position_17(Far_16)(Near_14);
1594− var bottomLeft_24 = Position_17(Near_14)(Far_16);
1595− var bottomRight_25 = Position_17(Far_16)(Far_16);
1596− var midLeft_26 = Position_17(Near_14)(Mid_15);
1597− var midRight_27 = Position_17(Far_16)(Mid_15);
1598− var midTop_28 = Position_17(Mid_15)(Near_14);
1599− var midBottom_29 = Position_17(Mid_15)(Far_16);
1600− var middle_30 = Position_17(Mid_15)(Mid_15);
1601− function middleAt(a1) {
1602− return function(a2) {
1603− return["PositionAt", a1, a2]
1604− }
1605− }
1606− var topLeftAt_31 = PositionTL_18;
1607− var topRightAt_32 = PositionTR_19;
1608− var bottomLeftAt_33 = PositionBL_20;
1609− var bottomRightAt_34 = PositionBR_21;
1610− var absolute_35 = Absolute_12;
1611− var relative_36 = Relative_13;
1612− function newElement_38(e,w,h,o,c,l) { return Element_37(Guid.guid(),e,w,h,o,c,l); }
1613− function basicNewElement(e,w,h) { return Element_37(Guid.guid(),e,w,h,1,["Nothing"],["Nothing"]); }
1614− var line_76 = Line_75;
1615− var polygon_79 = Shape_78;
1616− function sprite_96(src) {
1617− return function(w) {
1618− return function(h) {
1619− return function(pos) {
1620− return Form_84(0)(1)(pos)(FImage_87(w)(h)(src))
1621− }
1622− }
1623− }
1624− }
1625− function toForm_97(pos) {
1626− return function(e) {
1627− return Form_84(0)(1)(pos)(FElement_88(e))
1628− }
1629− }
1630− function width_47(w__101) {
1631− return function(e) {
1632− var be = e[2];
1633− switch(be[0]) {
1634− case "EImage":
1635− case "EVideo":
1636− return newElement_38(e[2],w__101,e[4] * w__101 / e[3], e[5], e[6], e[7]);
1637− case "EText":
1638− var p = Value.getTextSize(w__101,e[4],be[2]);
1639− return newElement_38(e[2], w__101, p[1], e[5], e[6], e[7]);
1640− }
1641− return newElement_38(e[2], w__101, e[4], e[5], e[6], e[7]);
1642− }
1643− }
1644− function height_48(h__108) {
1645− return function(e) {
1646− var be = e[2];
1647− switch(be[0]) {
1648− case "EImage":
1649− case "EVideo":
1650− return newElement_38(e[2], e[3] * h__108 / e[4], h__108, e[5], e[6], e[7]);
1651− }
1652− return newElement_38(e[2], e[3], h__108, e[5], e[6], e[7]);
1653− }
1654− }
1655− function size_49(w) {
1656− return function(h) {
1657− return function(e) {
1658− return newElement_38(e[2], w, h, e[5], e[6], e[7]);
1659− }
1660− }
1661− }
1662− function opacity_50(o) {
1663− return function(e) {
1664− return newElement_38(e[2], e[3], e[4], o, e[6], e[7]);
1665− }
1666− }
1667− function color_51(c) {
1668− return function(e) {
1669− return newElement_38(e[2], e[3], e[4], e[5], ["Just",c], e[7]);
1670− }
1671− }
1672− function link(lnk) {
1673− return function(e) {
1674− return newElement_38(e[2], e[3], e[4], e[5], e[6], ["Just", JS.castStringToJSString(lnk)]);
1675− }
1676− }
1677− function widthOf_52(e) { return ~~e[3]; }
1678− function heightOf_53(e) { return ~~e[4]; }
1679− function sizeOf_54(e) { return["Tuple2", ~~e[3], ~~e[4]] }
1680− function text_56(txt) {
1681− var p = Value.getTextSize(0,0,txt);
1682− return basicNewElement(EText_39("left")(txt), p[0], p[1])
1683− }
1684− function plainText(str) {
1685− var txt = Value.toText(str);
1686− var p = Value.getTextSize(0,0,txt);
1687− return basicNewElement(EText_39("left")(txt),p[0],p[1])
1688− }
1689− function asText(v) {
1690− var txt = Elm.Text.monospace(Value.toText(Value.show(v)));
1691− var p = Value.getTextSize(0,0,txt);
1692− return basicNewElement(EText_39("left")(txt),p[0],p[1])
1693− }
1694− function centeredText(txt) {
1695− var p = Value.getTextSize(0,0,txt);
1696− return basicNewElement(EText_39("center")(txt),p[0],p[1])
1697− }
1698− function justifiedText(txt) {
1699− var p = Value.getTextSize(0,0,txt);
1700− return basicNewElement(EText_39("justify")(txt),p[0],p[1])
1701− }
1702− function rightedText(txt) {
1703− var p = Value.getTextSize(0,0,txt);
1704− return basicNewElement(EText_39("right")(txt),p[0],p[1])
1705− }
1706− function image_57(w) {
1707− return function(h) {
1708− return function(src) {
1709− return basicNewElement(EImage_40(src),w,h)
1710− }
1711− }
1712− }
1713− function images(srcs) {
1714− var pics = Elm.Signal.constant(spacer_66(0)(0));
1715− var update = Elm.Signal.lift(function(src) {
1716− src = JS.castStringToJSString(src);
1717− var img = new Image();
1718− img.onload = function() {
1719− Dispatcher.notify(pics.id,
1720− image_57(this.width)(this.height)(src));
1721− };
1722− img.src = src;
1723− })(srcs);
1724− function f(x) { return function(y) { return x; } }
1725− var combine = Elm.Signal.lift2(f)(pics)(update);
1726− return combine;
1727− }
1728− function video_58(w) {
1729− return function(h) {
1730− return function(src) {
1731− return basicNewElement(EVideo_41(src),w,h)
1732− }
1733− }
1734− }
1735− function fittedImage_59(w_147) {
1736− return function(h_148) {
1737− return function(s_149) {
1738− return basicNewElement(EFittedImage_42(s_149),w_147,h_148)
1739− }
1740− }
1741− }
1742− function flow_60(dir_150) {
1743− return function(es_151) {
1744− return function() {
1745− var w_152 = function() {
1746− var ws_154 = map(widthOf_52)(es_151);
1747− return function(case1) {
1748− var case0 = case1;
1749− switch(case0[0]) {
1750− case "DLeft":
1751− return sum(ws_154);
1752− case "DRight":
1753− return sum(ws_154)
1754− }
1755− return maximum(ws_154)
1756− }(dir_150)
1757− }();
1758− var h_153 = function() {
1759− var hs_155 = map(heightOf_53)(es_151);
1760− return function(case3) {
1761− var case2 = case3;
1762− switch(case2[0]) {
1763− case "DDown":
1764− return sum(hs_155);
1765− case "DUp":
1766− return sum(hs_155)
1767− }
1768− return maximum(hs_155)
1769− }(dir_150)
1770− }();
1771− return basicNewElement(EFlow_43(dir_150)(es_151), w_152, h_153)
1772− }()
1773− }
1774− }
1775− function above_61(e1_156) {
1776− return function(e2_157) {
1777− return basicNewElement(EFlow_43(DDown_3)(["Cons", e1_156, ["Cons", e2_157, ["Nil"]]]), Math.max(widthOf_52(e1_156),widthOf_52(e2_157)), heightOf_53(e1_156) + heightOf_53(e2_157));
1778− }
1779− }
1780− function below_62(e1_158) {
1781− return function(e2_159) {
1782− return basicNewElement(EFlow_43(DDown_3)(["Cons", e2_159, ["Cons", e1_158, ["Nil"]]]), Math.max(widthOf_52(e1_158),widthOf_52(e2_159)), heightOf_53(e1_158) + heightOf_53(e2_159));
1783− }
1784− }
1785− function beside_63(e1_160) {
1786− return function(e2_161) {
1787− return basicNewElement(EFlow_43(DRight_1)(["Cons", e1_160, ["Cons", e2_161, ["Nil"]]]), widthOf_52(e1_160) + widthOf_52(e2_161), Math.max(heightOf_53(e1_160),heightOf_53(e2_161)));
1788− }
1789− }
1790− function layers_64(es_162) {
1791− return basicNewElement(EFlow_43(DOut_5)(es_162), maximum(map(widthOf_52)(es_162)), maximum(map(heightOf_53)(es_162)))
1792− }
1793− function collage_65(w_163) {
1794− return function(h_164) {
1795− return function(forms_165) {
1796− return basicNewElement(ECollage_44(w_163)(h_164)(forms_165),w_163,h_164)
1797− }
1798− }
1799− }
1800− function spacer_66(w_166) {
1801− return function(h_167) {
1802− return basicNewElement(EEmpty_45,w_166,h_167)
1803− }
1804− }
1805− function container_67(w_169) {
1806− return function(h_170) {
1807− return function(pos_168) {
1808− return function(e_171) {
1809− return basicNewElement(EContainer_46(pos_168)(e_171),w_169,h_170)
1810− }
1811− }
1812− }
1813− }
1814− function segment_77(p1_172) {
1815− return function(p2_173) {
1816− return Line_75(["Cons", p1_172, ["Cons", p2_173, ["Nil"]]])
1817− }
1818− }
1819− function rect_80(w_174) {
1820− return function(h_175) {
1821− return function(pos_176) {
1822− return Shape_78(["Cons", ["Tuple2", 0 - w_174 / 2, 0 - h_175 / 2],
1823− ["Cons", ["Tuple2", 0 - w_174 / 2, h_175 / 2],
1824− ["Cons", ["Tuple2", w_174 / 2, h_175 / 2],
1825− ["Cons", ["Tuple2", w_174 / 2, 0 - h_175 / 2], ["Nil"]]]]])(pos_176)
1826− }
1827− }
1828− }
1829− function oval_81(w_177) {
1830− return function(h_178) {
1831− return function(pos_179) {
1832− return function() {
1833− var n_180 = 50;
1834− return function() {
1835− function f_181(i_182) {
1836− return["Tuple2", w_177 / 2 * Math.cos(2 * (Math.PI / n_180) * i_182), h_178 / 2 * Math.sin(2 * (Math.PI / n_180) * i_182)];
1837− }
1838− return Shape_78(map(f_181)(function() {
1839− var lo = 0;
1840− var hi = n_180 - 1;
1841− var lst = ["Nil"];
1842− if(lo <= hi) {
1843− do {
1844− lst = ["Cons", hi, lst]
1845− }while(hi-- > lo)
1846− }
1847− return lst
1848− }()))(pos_179)
1849− }()
1850− }()
1851− }
1852− }
1853− }
1854− function circle_82(r_183) {
1855− return oval_81(2 * r_183)(2 * r_183)
1856− }
1857− function ngon_83(n_184) {
1858− return function(r_185) {
1859− return function(pos_186) {
1860− return function() {
1861− var m_187 = n_184;
1862− return function() {
1863− function f_188(i_189) {
1864− return["Tuple2", r_185 * Math.cos(2 * (Math.PI / m_187) * i_189), r_185 * Math.sin(2 * (Math.PI / m_187) * i_189)];
1865− }
1866− return Shape_78(map(f_188)(function() {
1867− var lo = 0;
1868− var hi = n_184 - 1;
1869− var lst = ["Nil"];
1870− if(lo <= hi) {
1871− do {
1872− lst = ["Cons", hi, lst]
1873− }while(hi-- > lo)
1874− }
1875− return lst
1876− }()))(pos_186)
1877− }()
1878− }()
1879− }
1880− }
1881− }
1882− function solid_89(clr_190) {
1883− return function(ln_191) {
1884− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Solid_68)(clr_190)(ln_191))
1885− }
1886− }
1887− function dotted_90(clr_192) {
1888− return function(ln_193) {
1889− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dotted_69)(clr_192)(ln_193))
1890− }
1891− }
1892− function dashed_91(clr_194) {
1893− return function(ln_195) {
1894− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Dashed_70)(clr_194)(ln_195))
1895− }
1896− }
1897− function customLine_92(pattern_196) {
1898− return function(clr_197) {
1899− return function(ln_198) {
1900− return Form_84(0)(1)(["Tuple2", 0, 0])(FLine_85(Custom_71(pattern_196))(clr_197)(ln_198))
1901− }
1902− }
1903− }
1904− function filled_93(clr) {
1905− return function(shape) {
1906− return Form_84(0)(1)(shape[2])(FShape_86(Filled_72)(clr)(shape));
1907− }
1908− }
1909− function outlined_94(clr) {
1910− return function(shape) {
1911− return Form_84(0)(1)(shape[2])(FShape_86(Outlined_73)(clr)(shape));
1912− }
1913− }
1914− function customOutline_95(pattern) {
1915− return function(clr) {
1916− return function(shape) {
1917− return Form_84(0)(1)(shape[2])(FShape_86(CustomOutline_74(pattern))(clr)(shape));
1918− }
1919− }
1920− }
1921− function textured(src) {
1922− return function(shape) {
1923− return Form_84(0)(1)(shape[2])(FShape_86(["Textured",src])(null)(shape));
1924− }
1925− }
1926− function rotate_98(t_212) {
1927− return function(Form$thetascaleposform_213) {
1928− return function(case5) {
1929− var case0 = case5;
1930− switch(case0[0]) {
1931− case "Form":
1932− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1933− return Form_84(t_212 + case1)(case2)(case3)(case4)
1934− }
1935− throw"Non-exhaustive pattern match in case";
1936− }(Form$thetascaleposform_213)
1937− }
1938− }
1939− function scale_99(s) {
1940− return function(form) {
1941− return Form_84(form[1])(s * form[2])(form[3])(form[4])
1942− }
1943− }
1944− function move_100(x_224) {
1945− return function(y_225) {
1946− return function(Form$thetascaleTuple2$pxpyform_226) {
1947− return function(case7) {
1948− var case0 = case7;
1949− switch(case0[0]) {
1950− case "Form":
1951− var case1 = case0[1], case2 = case0[2], case3 = case0[3], case4 = case0[4];
1952− switch(case3[0]) {
1953− case "Tuple2":
1954− var case5 = case3[1], case6 = case3[2];
1955− return Form_84(case1)(case2)(["Tuple2", x_224 + case5, y_225 + case6])(case4)
1956− }
1957− break
1958− }
1959− throw"Non-exhaustive pattern match in case";
1960− }(Form$thetascaleTuple2$pxpyform_226)
1961− }
1962− }
1963− }
1964− 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,
1965− 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,
1966− outlined:outlined_94, customOutline:customOutline_95, textured:textured, sprite:sprite_96, toForm:toForm_97, rotate:rotate_98, scale:scale_99, move:move_100,
1967− isWithin: Collage.insideForm}
1968−}();
1969−Elm.Text = function() {
1970− function fromString(s) { return Value.toText(s); }
1971−
1972− var addTag = function(tag) { return function(text) {
1973− return '<' + tag + ' style="padding:0;margin:0">' + text + '</' + tag + '>';
1974− };
1975− };
1976− var addStyle = function(style, value) { return function(text) {
1977− return "<span style='" + style + ":" + value + "'>" + text + "</span>";
1978− };
1979− };
1980−
1981− var typeface = function(name) {
1982− name = Elm.JavaScript.castStringToJSString(name);
1983− return addStyle('font-family', name);
1984− };
1985− var size = function(px) {
1986− return addStyle('font-size', px + 'px');
1987− };
1988− var header = addTag('h1');
1989− var height = function(h) { return addStyle('font-size', h+'em'); }
1990− var italic = addStyle('font-style', 'italic');
1991− var bold = addTag('b');
1992− var color = function(c) {
1993− return addStyle('color', Elm.Color.extract(c));
1994− };
1995− var underline = addStyle('text-decoration', 'underline');
1996− var overline = addStyle('text-decoration', 'overline');
1997− var strikeThrough = addStyle('text-decoration', 'line-through');
1998− var link = function(href) { return function(text) {
1999− return "<a href='" + fromString(href) + "'>" + text + "</a>";
2000− };
2001− };
2002−
2003− return {fromString : fromString,
2004− toText: fromString,
2005− header : header,
2006− height : height,
2007− italic : italic,
2008− bold : bold,
2009− underline : underline,
2010− overline : overline,
2011− strikeThrough : strikeThrough,
2012− monospace : typeface('monospace'),
2013− typeface : typeface,
2014− color : color,
2015− link : link };
2016−}();
2017−
2018−var Render = function(){
2019−
2020−function newElement(elementType) {
2021− var e = document.createElement(elementType);
2022− e.style.padding = "0";
2023− e.style.margin = "0";
2024− return e;
2025−};
2026−
2027−function addTo(container, elem) {
2028− container.appendChild(elem);
2029−};
2030−
2031−function makeText(pos,txt) {
2032− var e = newElement('div');
2033− e.innerHTML = txt;
2034− e.style.textAlign = pos;
2035− return e;
2036−};
2037−
2038−function image(src) {
2039− var img = newElement('img');
2040− img.src = src;
2041− img.name = src;
2042− img.style.display = "block";
2043− return img;
2044−}
2045−
2046−function fittedImage(w,h,src) {
2047− var e = newElement('div');
2048− e.style.width = w + 'px';
2049− e.style.height = h + 'px';
2050− e.style.position = "relative";
2051− e.style.overflow = "hidden";
2052−
2053− var img = newElement('img');
2054− img.onload = function() {
2055− img.style.position = 'absolute';
2056− img.style.margin = 'auto';
2057−
2058− var sw = w, sh = h;
2059− if (w / h > this.width / this.height) {
2060− sh = Math.round(this.height * w / this.width);
2061− } else {
2062− sw = Math.round(this.width * h / this.height);
2063− }
2064− img.style.width = sw + 'px';
2065− img.style.height = sh + 'px';
2066− img.style.left = ((w - sw) / 2) + 'px';
2067− img.style.top = ((h - sh) / 2) + 'px';
2068− };
2069− img.src = src;
2070− img.name = src;
2071− addTo(e,img);
2072− return e;
2073−};
2074−
2075−var video = function(src) {
2076− var e = newElement('video');
2077− e.controls = "controls";
2078− var source = newElement('source');
2079− source.src = src;
2080− var segs = src.split('.');
2081− source.type = "video/" + segs[segs.length-1];
2082− addTo(e, source);
2083− e.style.display = "block";
2084− return e;
2085−};
2086−
2087−function divify(e) {
2088− var div = newElement('div');
2089− addTo(div, e);
2090− return div;
2091−};
2092−function goDown(e) {
2093− return e //.tagName === "DIV" ? e : divify(e);
2094−};
2095−function goRight(e) {
2096− e.style.styleFloat = "left";
2097− e.style.cssFloat = "left";
2098− return e;
2099−};
2100−function goIn(e) {
2101− e.style.position = 'absolute';
2102− return e;
2103−};
2104−function flowWith(f, prep, elist) {
2105− var container = newElement('div');
2106− for (var i = elist.length; i--; ) {
2107− addTo(container, f(prep(elist[i])));
2108− }
2109− return container;
2110−};
2111−
2112−function flow(dir,elist) {
2113− switch(dir) {
2114− case "DDown": elist = elist.slice(0).reverse();
2115− case "DUp": return flowWith(goDown,render,elist);
2116− case "DRight": elist = elist.slice(0).reverse();
2117− case "DLeft": return flowWith(goRight,render,elist);
2118− case "DOut": elist = elist.slice(0).reverse();
2119− case "DIn": return flowWith(goIn,render,elist);
2120− };
2121−};
2122−
2123−function toPos(pos) {
2124− switch(pos[0]) {
2125− case "Absolute": return pos[1] + "px";
2126− case "Relative": return (pos[1] * 100) + "%";
2127− }
2128−}
2129−
2130−function setPos(pos,e) {
2131− e.style.position = 'absolute';
2132− e.style.margin = 'auto';
2133− switch(pos[0]) {
2134− case "Position":
2135− if (pos[1][0] !== "Far") e.style.left = 0;
2136− if (pos[1][0] !== "Near") e.style.right = 0;
2137− if (pos[2][0] !== "Far") e.style.top = 0;
2138− if (pos[2][0] !== "Near") e.style.bottom = 0;
2139− break;
2140− case "PositionAt":
2141− e.style.top = toPos(pos[2]);
2142− e.style.left = toPos(pos[1]);
2143− var shift = "translate(" + ~~(-e.style.width.slice(0,-2) / 2) + "px," + ~~(-e.style.height.slice(0,-2) / 2) + "px)";
2144− e.style.transform = shift;
2145− e.style.msTransform = shift;
2146− e.style.MozTransform = shift;
2147− e.style.webkitTransform = shift;
2148− e.style.OTransform = shift;
2149− break;
2150− default:
2151− var p = pos[0].slice(-2);
2152− e.style[p[0] === "T" ? 'top' : 'bottom'] = toPos(pos[2]);
2153− e.style[p[1] === "L" ? 'left' : 'right'] = toPos(pos[1]);
2154− }
2155−}
2156−
2157−function container(pos,elem) {
2158− var e = render(elem);
2159− setPos(pos,e);
2160− var div = newElement('div');
2161− div.style.position = "relative";
2162− div.style.overflow = "hidden";
2163− addTo(div,e);
2164− return div;
2165−};
2166−
2167−function render(elem) {
2168− var e = {};
2169− switch(elem[2][0]) {
2170− case "EText": e = makeText(elem[2][1],elem[2][2]); break;
2171− case "EImage": e = image(elem[2][1]); break;
2172− case "EVideo": e = video(elem[2][1]); break;
2173− case "EFittedImage": e = fittedImage(elem[3],elem[4],elem[2][1]); break;
2174− case "EFlow": e = flow(elem[2][1][0],elem[2][2]); break;
2175− case "ECollage": e = Collage.collage(elem[2][1],elem[2][2],elem[2][3]); break;
2176− case "EEmpty": e = newElement('div'); break;
2177− case "EContainer": e = container(elem[2][1],elem[2][2]); break;
2178− case "EHtml":
2179− e = elem[2][1];
2180− if (e.type !== 'button') {
2181− var p = Value.getExcess(e);
2182− elem[3] -= p[0];
2183− elem[4] -= p[1];
2184− }
2185− break;
2186− case "EExternalHtml":
2187− e = newElement('div');
2188− addTo(e, elem[2][1]);
2189− break;
2190− }
2191− e.id = elem[1];
2192− e.style.width = (~~elem[3]) + 'px';
2193− e.style.height = (~~elem[4]) + 'px';
2194− if (elem[5] !== 1) { e.style.opacity = elem[5]; }
2195− if (elem[6][0] === "Just") {
2196− e.style.backgroundColor = Elm.Color.extract(elem[6][1]);
2197− }
2198− if (elem[7][0] === "Just") {
2199− var a = newElement('a');
2200− a.href = elem[7][1];
2201− addTo(a,e);
2202− return a;
2203− }
2204− return e;
2205−};
2206−
2207−function update(node,curr,next) {
2208− if (node.tagName === 'A') { node = node.firstChild; }
2209− if (curr[1] === next[1]) return;
2210− if (curr[2][0] !== next[2][0]) {
2211− return node.parentNode.replaceChild(render(next),node);
2212− }
2213− var nextE = next[2], currE = curr[2];
2214− switch(nextE[0]) {
2215− case "EText":
2216− if (nextE[1] !== currE[1]) node.style.textAlign = nextE[1];
2217− if (nextE[2] !== currE[2]) node.innerHTML = nextE[2];
2218− break;
2219− case "EImage":
2220− if (nextE[1] !== currE[1]) node.src = nextE[1];
2221− break;
2222− case "EVideo":
2223− case "EFittedImage":
2224− if (!Value.eq(nextE,currE) || next[3]!==curr[3] || next[4]!==curr[4]) {
2225− return node.parentNode.replaceChild(render(next),node);
2226− }
2227− break;
2228− case "ECollage":
2229− if (nextE[1] !== currE[1] || nextE[2] !== currE[2] || nextE[3].length !== currE[3].length) {
2230− return node.parentNode.replaceChild(render(next),node);
2231− }
2232− Collage.updateCollage(node,currE[3],nextE[3]);
2233− break;
2234− case "EFlow":
2235− if (nextE[1] !== currE[1]) {
2236− return node.parentNode.replaceChild(render(next),node);
2237− }
2238− var nexts = nextE[2];
2239− var kids = node.childNodes;
2240− if (nexts.length !== kids.length) {
2241− return node.parentNode.replaceChild(render(next),node);
2242− }
2243− var currs = currE[2];
2244− var goDir = function(x) { return x; };
2245− switch(nextE[1][0]) {
2246− case "DDown": case "DUp": goDir = goDown; break;
2247− case "DRight": case "DLeft": goDir = goRight; break;
2248− case "DOut": case "DIn": goDir = goIn; break;
2249− }
2250− for (var i = kids.length; i-- ;) {
2251− update(kids[i],currs[i],nexts[i]);
2252− goDir(kids[i]);
2253− }
2254− break;
2255− case "EContainer":
2256− update(node.childNodes[0],currE[2],nextE[2]);
2257− setPos(nextE[1],node.childNodes[0]);
2258− break;
2259− case "EEmpty":
2260− break;
2261− case "EHtml":
2262− if (next[1] !== curr[1]) {
2263− var e = render(next);
2264− node.parentNode.replaceChild(e,node);
2265− node = e;
2266− }
2267− if (e.type !== 'button') {
2268− var p = Value.getExcess(node);
2269− next[3] -= p[0];
2270− next[4] -= p[1];
2271− }
2272− break;
2273− case "EExternalHtml":
2274− if (next[1] !== curr[1])
2275− node.parentNode.replaceChild(render(next),node);
2276− break;
2277− }
2278− if (next[3] !== curr[3]) node.style.width = (~~next[3]) + 'px';
2279− if (next[4] !== curr[4]) node.style.height = (~~next[4]) + 'px';
2280− if (next[5] !== curr[5]) node.style.opacity = next[5];
2281− if (next[6].length === 2) {
2282− var clr = Elm.Color.extract(next[6][1]);
2283− if (clr !== node.style.backgroundColor) node.style.backgroundColor = clr;
2284− }
2285− if (next[7].length === 2) {
2286− if (curr[7].length === 1 || next[7][1] !== curr[7][1]) node.parentNode.href = next[7][1];
2287− }
2288− next[1] = curr[1];
2289−}
2290−
2291−return {render:render,update:update,addTo:addTo,newElement:newElement,flowWith:flowWith,goIn:goIn};
2292−
2293−}();
2294−Elm.Signal = function() {
2295− var send = function(node, timestep, changed) {
2296− var kids = node.kids;
2297− for (var i = kids.length; i--; ) {
2298− kids[i].recv(timestep, changed, node.id);
2299− }
2300− };
2301− /**
2302− * @constructor
2303− */
2304− function input(base) {
2305− this.id = Guid.guid();
2306− this.value = base;
2307− this.kids = [];
2308− this.defaultNumberOfKids = 0;
2309− this.recv = function(timestep, eid, v) {
2310− var changed = eid === this.id;
2311− if (changed) { this.value = v; }
2312− send(this, timestep, changed);
2313− return changed;
2314− };
2315− Dispatcher.inputs.push(this);
2316− };
2317− /**
2318− * @constructor
2319− */
2320− function lift(func,args) {
2321− this.id = Guid.guid();
2322− this.value = null;
2323− this.kids = [];
2324− this.count = 0;
2325− this.changed = false;
2326−
2327− args.reverse();
2328− this.recalc = function() {
2329− var f = func;
2330− for (var i = args.length; i--; ) {
2331− f = f(args[i].value);
2332− }
2333− this.value = f;
2334− };
2335− this.recalc();
2336−
2337− this.recv = function(timestep, changed, parentID) {
2338− this.count += 1;
2339− if (changed) { this.changed = true; }
2340− if (this.count == args.length) {
2341− if (this.changed) { this.recalc() }
2342− send(this, timestep, this.changed);
2343− this.changed = false;
2344− this.count = 0;
2345− }
2346− };
2347− for (var i = args.length; i--; ) {
2348− args[i].kids.push(this);
2349− }
2350− };
2351− /**
2352− * @constructor
2353− */
2354− function fold(func,base,baseIsFunc,input) {
2355− this.id = Guid.guid();
2356− this.value = baseIsFunc ? base(input.value) : base;
2357− this.kids = [];
2358− this.recv = function(timestep, changed, parentID) {
2359− if (changed) { this.value = func(input.value)(this.value); }
2360− send(this, timestep, changed);
2361− };
2362− input.kids.push(this);
2363− };
2364−
2365− /**
2366− * @constructor
2367− */
2368− function dropIf(pred,base,input) {
2369− this.id = Guid.guid();
2370− this.value = pred(input.value) ? base : input.value;
2371− this.kids = [];
2372− this.recv = function(timestep, changed, parentID) {
2373− var chng = changed && !pred(input.value);
2374− if (chng) { this.value = input.value; }
2375− send(this, timestep, chng);
2376− };
2377− input.kids.push(this);
2378− };
2379−
2380− /**
2381− * @constructor
2382− */
2383− function dropRepeats(input) {
2384− this.id = Guid.guid();
2385− this.value = input.value;
2386− this.kids = [];
2387− this.recv = function(timestep, changed, parentID) {
2388− var chng = changed && !Value.eq(this.value,input.value);
2389− if (chng) { this.value = input.value; }
2390− send(this, timestep, chng);
2391− };
2392− input.kids.push(this);
2393− };
2394−
2395− var dropWhen = function(s1) { return function(b) { return function(s2) {
2396− var pairs = new lift(function(x){return function(y){return [x,y];};},[s1,s2]);
2397− var dropped = new dropIf(function(p){return p[0];},[true,b],pairs);
2398− return new lift(function(p){return p[1];},[dropped]); }; };
2399− };
2400−
2401− /**
2402− * @constructor
2403− */
2404− function timeIndex(pair,s) {
2405− this.id = Guid.guid();
2406− var t = (new window.Date).getTime();
2407− this.value = pair ? Value.Tuple(t,s.value) : t;
2408− this.kids = [];
2409− this.recv = function(timestep, changed, parentID) {
2410− if (changed) this.value = pair ? Value.Tuple(timestep, s.value) : timestep;
2411− send(this, timestep, changed);
2412− };
2413− s.kids.push(this);
2414− }
2415−
2416− /**
2417− * @constructor
2418− */
2419− function sampleOn(s1,s2) {
2420− this.id = Guid.guid();
2421− this.value = s2.value;
2422− this.kids = [];
2423− this.count = 0;
2424− this.changed = false;
2425−
2426− this.recv = function(timestep, changed, parentID) {
2427− if (parentID === s1.id) this.changed = changed;
2428− this.count += 1;
2429− if (this.count == 2) {
2430− if (this.changed) { this.value = s2.value; }
2431− send(this, timestep, this.changed);
2432− this.count = 0;
2433− this.changed = false;
2434− }
2435− };
2436− s1.kids.push(this);
2437− s2.kids.push(this);
2438− };
2439−
2440− function delay(t) { return function(s) {
2441− var delayed = new input(s.value);
2442− var firstEvent = true;
2443− function update(v) {
2444− if (firstEvent) return;
2445− setTimeout(function() { Dispatcher.notify(delayed.id,v); },t);
2446− }
2447− function first(a) { return function(b) { return a; }; }
2448− var out = new sampleOn(delayed,new lift(first, [delayed, new lift(update,[s])]));
2449− firstEvent = false;
2450− return out;
2451− };
2452− }
2453−
2454− /**
2455− * @constructor
2456− */
2457− function merge(s1,s2) {
2458− this.id = Guid.guid();
2459− this.value = s1.value;
2460− this.kids = [];
2461− this.next = null;
2462− this.count = 0;
2463− this.changed = false;
2464−
2465− this.recv = function(timestep, changed, parentID) {
2466− this.count += 1;
2467− if (changed) {
2468− this.changed = true;
2469− if (parentID == s2.id && this.next === null) { this.next = s2.value; }
2470− if (parentID == s1.id) { this.next = s1.value; }
2471− }
2472−
2473− if (this.count == 2) {
2474− if (this.changed) {
2475− this.value = this.next;
2476− this.next = null;
2477− }
2478− send(this, timestep, this.changed);
2479− this.changed = false;
2480− this.count = 0;
2481− }
2482− };
2483− s1.kids.push(this);
2484− s2.kids.push(this);
2485− };
2486−
2487− function merges(ss) {
2488− function mrg(x) { return function(y) { return new merge(x,y); }; }
2489− return Elm.List.foldl1(mrg)(ss);
2490− }
2491−
2492− function average(sampleSize) { return function(s) {
2493− var sample = new Array(sampleSize);
2494− var i = sampleSize;
2495− while (i--) sample[i] = 0;
2496− i = 0;
2497− var full = false;
2498− var total = 0;
2499− function f(n) {
2500− total += n - sample[i];
2501− sample[i] = n;
2502− var avg = total / Math.max(1, full ? sampleSize : i);
2503− if (++i == sampleSize) { full = true; i = 0; }
2504− return avg;
2505− }
2506− return new lift(f, [s]);
2507− };
2508− }
2509−
2510− return {
2511− constant : function(v) { return new input(v); },
2512− lift : function(f){return function(e){return new lift(f,[e]);};},
2513− lift2 : function(f) {
2514− return function(e1) { return function(e2) {
2515− return new lift(f, [e1,e2]); };};},
2516− lift3 : function(f) {
2517− return function(e1) { return function(e2) {
2518− return function(e3){return new lift(f,[e1,e2,e3]);};};};},
2519− lift4 : function(f) {
2520− return function(e1) { return function(e2) {
2521− return function(e3) { return function(e4) {
2522− return new lift(f, [e1,e2,e3,e4]);};};};};},
2523− lift5 : function(f) {
2524− return function(e1) { return function(e2) {
2525− return function(e3) { return function(e4) {
2526− return function(e5) {
2527− return new lift(f, [e1,e2,e3,e4,e5]);};};};};};},
2528− lift6 : function(f) { return function(e1) { return function(e2) {
2529− return function(e3) { return function(e4) {
2530− return function(e5) { return function(e6) {
2531− return new lift(f, [e1,e2,e3,e4,e5,e6]); };};};};};};},
2532− lift7 : function(f) { return function(e1) { return function(e2) {
2533− return function(e3) { return function(e4) {
2534− return function(e5) { return function(e6) {
2535− return function(e7) {
2536− return new lift(f, [e1,e2,e3,e4,e5,e6,e7]);};};};};};};};},
2537− lift8 : function(f) { return function(e1) { return function(e2) {
2538− return function(e3) { return function(e4) {
2539− return function(e5) { return function(e6) {
2540− return function(e7) { return function(e8) {
2541− return new lift(f, [e1,e2,e3,e4,e5,e6,e7,e8]);};};};};};};};};},
2542− foldp : function(f) { return function(b) { return function(e) {
2543− return new fold(f,b,false,e); }; }; },
2544− foldp_ : function(f) { return function(b) { return function(e) {
2545− return new fold(f,b,true,e); }; }; },
2546− foldp1 : function(f) { return function(e) {
2547− return new fold(f,function(x){return x;},true,e); }; },
2548− delay : delay,
2549− merge : function(s1) { return function(s2) { return new merge(s1,s2)}; },
2550− merges : merges,
2551− average : average,
2552− count : function(sig) {
2553− var incr = function(_){return function(c){return c+1;};};
2554− return new fold(incr,0,false,sig) },
2555− countIf : function(pred) { return function(sig) {
2556− var incr = function(x){return function(c){return pred(x) ? c+1 : c;};};
2557− return new fold(incr,0,false,sig) }; },
2558− keepIf : function(pred) { return function(base) { return function(sig) {
2559− return new dropIf(function(x) { return !pred(x)},base,sig); }; }; },
2560− dropIf : function(pred) { return function(base) { return function(sig) {
2561− return new dropIf(pred,base,sig); }; }; },
2562− keepWhen : function(s) { return dropWhen(new lift(function(b){return !b;},[s])); },
2563− dropWhen : dropWhen,
2564− dropRepeats : function(s) { return new dropRepeats(s);},
2565− sampleOn : function(s1){return function(s2){return new sampleOn(s1,s2);};},
2566− timestamp : function(s) { return new timeIndex(true, s); },
2567− timeOf : function(s) { return new timeIndex(false, s); }
2568− };
2569−}();
2570−var Dispatcher = function() {
2571− var program = null;
2572− var inputs = [];
2573− var currentElement = null;
2574−
2575− var initialize = function() {
2576− program = Elm.main();
2577− if (!program.hasOwnProperty('recv')) {
2578− program = Elm.Signal.constant(program);
2579− }
2580−
2581− currentElement = program.value;
2582− filterDeadInputs();
2583−
2584− var content = document.getElementById('content');
2585− content.appendChild(Render.render(currentElement));
2586− var w = document.getElementById('widthChecker').offsetWidth;
2587− if (w !== window.innerWidth) {
2588− Dispatcher.notify(Elm.Window.dimensions.id, Value.Tuple(w, window.innerHeight));
2589− }
2590− program = Elm.Signal.lift(function(value) {
2591− var content = document.getElementById('content');
2592− Render.update(content.firstChild,currentElement,value);
2593− currentElement = value;
2594− return value;
2595− })(program);
2596− };
2597− var notify = function(id, v) {
2598− var timestep = (new window.Date).getTime();
2599− var hasListener = false;
2600− for (var i = inputs.length; i--; ) {
2601− hasListener = inputs[i].recv(timestep, id, v) || hasListener;
2602− }
2603− return hasListener;
2604− };
2605−
2606− function isAlive(input) {
2607− if (!input.hasOwnProperty('defaultNumberOfKids')) return true;
2608− var len = input.kids.length;
2609− if (len == 0) return false;
2610− if (len > input.defaultNumberOfKids) return true;
2611− var alive = false;
2612− for (var i = len; i--; ) {
2613− alive = alive || isAlive(input.kids[i]);
2614− }
2615− return alive;
2616− }
2617− function filterDeadInputs() {
2618− var temp = [];
2619− for (var i = inputs.length; i--; ) {
2620− if (isAlive(inputs[i])) temp.push(inputs[i]);
2621− }
2622− inputs = temp;
2623− }
2624−
2625− return {initialize:initialize, notify:notify, inputs:inputs};
2626−}();Elm.HTTP = function() {
2627− var JS = Elm.JavaScript;
2628− var toElmString = Elm.JavaScript.castJSStringToString;
2629− function request(verb) { return function(url) { return function(data) {
2630− return function(headers) {
2631− return {0 : "Request",
2632− length : 1,
2633− verb : JS.castStringToJSString(verb),
2634− url : JS.castStringToJSString(url),
2635− data : data === null ? null : JS.castStringToJSString(data),
2636− headers : headers }; }; }; };
2637− }
2638− function get(url) { return request("GET")(url)(null)(["Nil"]); }
2639− function post(url) { return function(data) {
2640− return request("POST")(url)(data)(["Nil"]); }; }
2641−
2642− function registerReq(queue,responses) { return function(req) {
2643− if (req.url !== "") { sendReq(queue,responses,req); }
2644− };
2645− }
2646−
2647− function updateQueue(queue,responses) {
2648− if (queue.length > 0) {
2649− Dispatcher.notify(responses.id, queue[0].value);
2650− if (queue[0].value[0] !== "Waiting") {
2651− queue.shift();
2652− setTimeout(function() { updateQueue(queue,responses); }, 0);
2653− }
2654− }
2655− }
2656−
2657− function sendReq(queue,responses,req) {
2658− var response = { value: ["Waiting"] };
2659− queue.push(response);
2660−
2661− var request = null;
2662− if (window.ActiveXObject) { request = new ActiveXObject("Microsoft.XMLHTTP"); }
2663− if (window.XMLHttpRequest) { request = new XMLHttpRequest(); }
2664− request.onreadystatechange = function(e) {
2665− if (request.readyState === 4) {
2666− response.value = (request.status === 200
2667− ? ["Success", toElmString(request.responseText)]
2668− : ["Failure", request.status,
2669− toElmString(request.statusText)]);
2670− setTimeout(function() { updateQueue(queue,responses); }, 0);
2671− }
2672− };
2673− request.open(req.verb, req.url, true);
2674− Elm.List.map(function(pair) {
2675− request.setRequestHeader(
2676− JS.castStringToJSString(pair[1]),
2677− JS.castStringToJSString(pair[2]));
2678− })(req.headers);
2679− request.send(req.data);
2680− return null;
2681− }
2682−
2683− function send(requests) {
2684− var responses = Elm.Signal.constant(["Waiting"]);
2685− var sender = Elm.Signal.lift(registerReq([],responses))(requests);
2686− function f(x) { return function(y) { return x; } }
2687− var combine = Elm.Signal.lift2(f)(responses)(sender);
2688− return combine;
2689− }
2690−
2691− return {get : get,
2692− post : post,
2693− request : request,
2694− send : send,
2695− sendGet : function(urls){return send(Elm.Signal.lift(get)(urls));}
2696− };
2697−}();
2698−
2699−Elm.Input = function() {
2700− var JS = Elm.JavaScript;
2701− var toElmString = Elm.JavaScript.castJSStringToString;
2702− var newTextInput = function(elem, ghostText) {
2703− elem.placeholder = JS.castStringToJSString(ghostText);
2704− var str = Elm.Signal.constant(["Nil"]);
2705− Value.addListener(elem, 'keyup', function(e) {
2706− Dispatcher.notify(str.id, toElmString(elem.value));
2707− elem.focus();
2708− });
2709− elem.style.padding = "1px";
2710− return Value.Tuple(Value.wrap(elem), str);
2711− };
2712− var newElement = function(name) {
2713− var e = document.createElement(name);
2714− e.style.padding = "0";
2715− e.style.margin = "0";
2716− return e;
2717− };
2718− var textArea = function(cols) { return function(rows) {
2719− var textarea = newElement('textarea');
2720− textarea.rows = rows;
2721− textarea.cols = cols;
2722− return newTextInput(textarea, "");
2723− };
2724− };
2725− var textField = function(ghostText) {
2726− var field = newElement('input');
2727− field.type = 'text';
2728− return newTextInput(field, ghostText);
2729− };
2730− var password = function(ghostText) {
2731− var field = newElement('input');
2732− field.type = 'password';
2733− return newTextInput(field, ghostText);
2734− };
2735− var checkbox = function(checked) {
2736− var box = newElement('input');
2737− box.type = 'checkbox';
2738− box.checked = checked;
2739− var status = Elm.Signal.constant(checked);
2740− Value.addListener(box, 'change', function(e) {
2741− Dispatcher.notify(status.id, box.checked);
2742− });
2743− return Value.Tuple(Value.wrap(box), status);
2744− };
2745− var dropDown = function(options) {
2746− var slct = newElement('select');
2747− var opts = [];
2748− while (options[0] === "Cons") {
2749− var opt = newElement('option');
2750− var str = Value.toText(options[1][1]);
2751− opt.value = str;
2752− opt.innerHTML = str;
2753− slct.appendChild(opt);
2754− opts.push(options[1][2]);
2755− options = options[2];
2756− }
2757− var status = Elm.Signal.constant(opts[0]);
2758− Value.addListener(slct, 'change', function(e) {
2759− Dispatcher.notify(status.id, opts[slct.selectedIndex]);
2760− });
2761− return Value.Tuple(Value.wrap(slct), status);
2762− };
2763− var stringDropDown = function(opts) {
2764− return dropDown(Elm.List.map (function(x) {return Value.Tuple(x,x);}) (opts));
2765− };
2766− var button = function(name) {
2767− var b = newElement('input');
2768− b.type = "button";
2769− b.value = JS.castStringToJSString(name);
2770− var press = Elm.Signal.constant(false);
2771− Value.addListener(b, 'click', function(e) {
2772− Dispatcher.notify(press.id, true);
2773− Dispatcher.notify(press.id, false);
2774− });
2775− return Value.Tuple(Value.wrap(b),press);
2776− };
2777− return {textArea:textArea, textField:textField,
2778− password:password, checkbox:checkbox,
2779− dropDown:dropDown, stringDropDown:stringDropDown,
2780− button:button};
2781−}();
2782−
2783−Elm.Keyboard = { Raw : function() {
2784− var keysDown = Elm.Signal.constant(["Nil"]);
2785− var charPressed = Elm.Signal.constant(["Nothing"]);
2786− function remove(x,xs) {
2787− if (xs[0] === "Nil") return xs;
2788− if (xs[1] === x) return xs[2];
2789− return ["Cons", xs[1], remove(x,xs[2])];
2790− }
2791− function has(x,xs) {
2792− while (xs[0] !== "Nil") {
2793− if (xs[1] === x) return true;
2794− xs = xs[2];
2795− }
2796− return false;
2797− }
2798− Value.addListener(document, 'keydown', function(e) {
2799− if (has(e.keyCode, keysDown.value)) return;
2800− var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
2801− if (!hasListener)
2802− this.removeEventListener('keydown',arguments.callee,false);
2803− });
2804− Value.addListener(document, 'keyup', function(e) {
2805− var codes = remove(e.keyCode, keysDown.value);
2806− var hasListener = Dispatcher.notify(keysDown.id, codes);
2807− if (!hasListener)
2808− this.removeEventListener('keyup',arguments.callee,false);
2809− });
2810− Value.addListener(window, 'blur', function(e) {
2811− var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
2812− if (!hasListener)
2813− this.removeEventListener('blur',arguments.callee,false);
2814− });
2815− Value.addListener(document, 'keypress', function(e) {
2816− var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
2817− Dispatcher.notify(charPressed.id, ["Nothing"]);
2818− if (!hasListener)
2819− this.removeEventListener('keypress',arguments.callee,false);
2820− });
2821− return {keysDown:keysDown,
2822− charPressed:charPressed};
2823− }()
2824−};
2825−Elm.Mouse = function() {
2826− var position = Elm.Signal.constant(Value.Tuple(0,0));
2827− position.defaultNumberOfKids = 2;
2828−
2829− var x = Elm.Signal.lift(function(p){return p[1];})(position);
2830− x.defaultNumberOfKids = 0;
2831− var y = Elm.Signal.lift(function(p){return p[2];})(position);
2832− y.defaultNumberOfKids = 0;
2833−
2834− var isDown = Elm.Signal.constant(false);
2835− var isClicked = Elm.Signal.constant(false);
2836− var clicks = Elm.Signal.constant(Value.Tuple());
2837−
2838− function getXY(e) {
2839− var posx = 0;
2840− var posy = 0;
2841− if (!e) e = window.event;
2842− if (e.pageX || e.pageY) {
2843− posx = e.pageX;
2844− posy = e.pageY;
2845− } else if (e.clientX || e.clientY) {
2846− posx = e.clientX + document.body.scrollLeft +
2847− document.documentElement.scrollLeft;
2848− posy = e.clientY + document.body.scrollTop +
2849− document.documentElement.scrollTop;
2850− }
2851− return Value.Tuple(posx, posy);
2852− }
2853−
2854− Value.addListener(document, 'click', function(e) {
2855− var hasListener1 = Dispatcher.notify(isClicked.id, true);
2856− var hasListener2 = Dispatcher.notify(clicks.id, Value.Tuple());
2857− Dispatcher.notify(isClicked.id, false);
2858− if (!hasListener1 && !hasListener2)
2859− this.removeEventListener('click',arguments.callee,false);
2860− });
2861− Value.addListener(document, 'mousedown', function(e) {
2862− var hasListener = Dispatcher.notify(isDown.id, true);
2863− if (!hasListener)
2864− this.removeEventListener('mousedown',arguments.callee,false);
2865− });
2866− Value.addListener(document, 'mouseup', function(e) {
2867− var hasListener = Dispatcher.notify(isDown.id, false);
2868− if (!hasListener)
2869− this.removeEventListener('mouseup',arguments.callee,false);
2870− });
2871− Value.addListener(document, 'mousemove', function(e) {
2872− var hasListener = Dispatcher.notify(position.id, getXY(e));
2873− if (!hasListener)
2874− this.removeEventListener('mousemove',arguments.callee,false);
2875− });
2876− var clickedOn = function(elem) {
2877− var node = Render.render(elem);
2878− var click = Elm.Signal.constant(false);
2879− Value.addListener(node, 'click', function(e) {
2880− Dispatcher.notify(click.id, true);
2881− Dispatcher.notify(click.id, false);
2882− });
2883− return Value.Tuple(Value.wrap(node), click);
2884− };
2885− return {position: position,
2886− x:x,
2887− y:y,
2888− isClicked: isClicked,
2889− isDown: isDown,
2890− clicks: clicks,
2891− isClickedOn: clickedOn
2892− };
2893− }();
2894−Elm.Random = function() {
2895− var inRange = function(min) { return function(max) {
2896− return Elm.Signal.constant(Math.floor(Math.random() * (max-min+1)) + min);
2897− };
2898− };
2899− var randomize = function(min) { return function(max) { return function(signal) {
2900− function f(x) { return Math.floor(Math.random() * (max-min+1)) + min; }
2901− return Elm.Signal.lift(f)(signal);
2902− };
2903− };
2904− };
2905− return { inRange:inRange, randomize:randomize };
2906−}();Elm.Time = function() {
2907− function timeNow() { return (new window.Date).getTime(); }
2908− function everyWhen(isOn) { return function(t) {
2909− var clock = Elm.Signal.constant(timeNow());
2910− function tellTime() { Dispatcher.notify(clock.id, timeNow()); }
2911− setInterval(tellTime, t);
2912− return clock;
2913− };
2914− }
2915− function fpsWhen(desiredFPS) { return function (isOn) {
2916− var msPerFrame = 1000 / desiredFPS;
2917− var prev = timeNow(), curr = prev, diff = 0, wasOn = true;
2918− var ticker = Elm.Signal.constant(diff);
2919− function tick(zero) { return function() {
2920− curr = timeNow();
2921− diff = zero ? 0 : curr - prev;
2922− prev = curr;
2923− Dispatcher.notify(ticker.id, diff);
2924− };
2925− }
2926− var timeoutID = 0;
2927− function f(isOn) { return function(t) {
2928− if (isOn) {
2929− timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
2930− } else if (wasOn) {
2931− clearTimeout(timeoutID);
2932− }
2933− wasOn = isOn;
2934− return t;
2935− };
2936− }
2937− return Elm.Signal.lift2(f)(isOn)(ticker);
2938− };
2939− }
2940− function since(t) { return function(s) {
2941− function cmp(a) { return function(b) { return !Value.eq(a,b); }; }
2942− var dcount = Elm.Signal.count(Elm.Signal.delay(t)(s));
2943− return Elm.Signal.lift2(cmp)(Elm.Signal.count(s))(dcount);
2944− };
2945− }
2946− function after(t) {
2947− t *= 1000;
2948− var thread = Elm.Signal.constant(false);
2949− setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2950− return thread;
2951− }
2952− function before(t) {
2953− t *= 1000;
2954− var thread = Elm.Signal.constant(true);
2955− setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
2956− return thread;
2957− }
2958− function read(s) {
2959− var t = window.Date.parse(s);
2960− return isNaN(t) ? ["Nothing"] : ["Just",t];
2961− }
2962− return {fpsWhen : fpsWhen,
2963− fps : function(t) { return fpsWhen(t)(Elm.Signal.constant(true)); },
2964− every : everyWhen(Elm.Signal.constant(true)),
2965− delay : Elm.Signal.delay,
2966− since : since,
2967− after : after,
2968− before : before,
2969− hour : 3600000,
2970− minute : 60000,
2971− second : 1000,
2972− ms : 1,
2973− inHours : function(t) { return t / 3600000; },
2974− inMinutes : function(t) { return t / 60000; },
2975− inSeconds : function(t) { return t / 1000; },
2976− inMss : function(t) { return t; },
2977− toDate : function(t) { return new window.Date(t); },
2978− read : read
2979− };
2980−
2981−}();Elm.Window = function() {
2982− var dimensions = Elm.Signal.constant(Value.Tuple(window.innerWidth,
2983− window.innerHeight));
2984− dimensions.defaultNumberOfKids = 2;
2985−
2986− var width = Elm.Signal.lift(function(p){return p[1];})(dimensions);
2987− width.defaultNumberOfKids = 0;
2988− var height = Elm.Signal.lift(function(p){return p[2];})(dimensions);
2989− height.defaultNumberOfKids = 0;
2990−
2991− Value.addListener(window, 'resize', function(e) {
2992− var w = document.getElementById('widthChecker').offsetWidth;
2993− var hasListener = Dispatcher.notify(dimensions.id,
2994− Value.Tuple(w, window.innerHeight));
2995− if (!hasListener)
2996− this.removeEventListener('resize',arguments.callee,false);
2997− });
2998− return {dimensions:dimensions,width:width,height:height};
2999−}();
3000−
3001−Elm.Date = function() {
3002−
3003− function dateNow() { return new window.Date; }
3004− function readDate(str) {
3005− var d = new window.Date(Elm.JavaScript.castStringToJSString(str));
3006− if (isNaN(d.getTime())) return ["Nothing"];
3007− return ["Just",d];
3008− }
3009−
3010− var dayTable = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
3011− var monthTable = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
3012− "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
3013−
3014− return {
3015− read : readDate,
3016− year : function(d) { return d.getFullYear(); },
3017− month : function(d) { return [monthTable[d.getMonth()]]; },
3018− day : function(d) { return d.getDate(); },
3019− hour : function(d) { return d.getHours(); },
3020− minute : function(d) { return d.getMinutes(); },
3021− second : function(d) { return d.getSeconds(); },
3022− dayOfWeek : function(d) { return [dayTable[d.getDay()]]; },
3023− toTime : function(d) { return d.getTime(); },
3024− Mon : ["Mon"], Tue : ["Tue"], Wed : ["Wed"],
3025− Thu : ["Thu"], Fri : ["Fri"], Sat : ["Sat"], Sun : ["Sun"],
3026− Jan : ["Jan"], Feb : ["Feb"], Mar : ["Mar"], Apr : ["Apr"],
3027− May : ["May"], Jun : ["Jun"], Jul : ["Jul"], Aug : ["Aug"],
3028− Sep : ["Sep"], Oct : ["Oct"], Nov : ["Nov"], Dec : ["Dec"]
3029− };
3030−
3031−}();
3032−
3033−Value.addListener(document, 'elm_log', function(e) { console.log(e.value); });
3034−Value.addListener(document, 'elm_title', function(e) {document.title = e.value;});
3035−Value.addListener(document, 'elm_redirect', function(e) {
3036− if (e.value.length > 0) { window.location = e.value; }
3037− });
3038−
3039−Elm.Prelude = function() {
3040− var mod = function(x) { return function(y) {
3041− var r = x % y;
3042− var m = x==0 ? 0 : (y>0 ? (x>=0 ? r : r+y) : -mod(-x)(-y));
3043− return m == y ? 0 : m;
3044− }; };
3045−
3046− var min = function(x) { return function(y) { return Math.min(x,y); }; };
3047− var max = function(x) { return function(y) { return Math.max(x,y); }; };
3048−
3049− var flip=function(f){return function(x){return function(y){return f(y)(x);};};};
3050− var clamp = function(lo) { return function(hi) {
3051− return function(x) { return Math.min(hi, Math.max(lo, x)); };
3052− };
3053− };
3054− var curry = function(f) { return function(x) { return function(y) {
3055− return f(["Tuple2",x,y]); }; };
3056− };
3057− var uncurry = function(f) { return function(p) {
3058− if (p[0] !== "Tuple2") {
3059− throw "Function was uncurry'd but was not given a pair.";
3060− }
3061− return f(p[1])(p[2]); };
3062− };
3063−
3064− var logBase=function(b){return function(x){return Math.log(x)/Math.log(b);};};
3065−
3066− function readInt(str) {
3067− var s = Elm.JavaScript.castStringToJSString(str);
3068− var len = s.length;
3069− if (len === 0) { return ["Nothing"]; }
3070− var start = 0;
3071− if (s[0] == '-') {
3072− if (len === 1) { return ["Nothing"]; }
3073− start = 1;
3074− }
3075− for (var i = start; i < len; ++i) {
3076− if (!Elm.Char.isDigit(s[i])) { return ["Nothing"]; }
3077− }
3078− return ["Just", parseInt(s)];
3079− }
3080−
3081− function readFloat(str) {
3082− var s = Elm.JavaScript.castStringToJSString(str);
3083− var len = s.length;
3084− if (len === 0) { return ["Nothing"]; }
3085− var start = 0;
3086− if (s[0] == '-') {
3087− if (len === 1) { return ["Nothing"]; }
3088− start = 1;
3089− }
3090− var dotCount = 0;
3091− for (var i = start; i < len; ++i) {
3092− if (Elm.Char.isDigit(s[i])) { continue; }
3093− if (s[i] === '.') {
3094− dotCount += 1;
3095− if (dotCount <= 1) { continue; }
3096− }
3097− return ["Nothing"];
3098− }
3099− return ["Just", parseFloat(s)];
3100− }
3101−
3102− function compare(x) { return function (y) {
3103− if (x instanceof Array && y instanceof Array) {
3104− var len = x.length;
3105− if (len == y.length) {
3106− for (var i = 1; i < len; ++i) {
3107− var cmp = compare(x[i])(y[i]);
3108− if (cmp[0] === 'EQ') continue;
3109− return cmp;
3110− }
3111− return ['EQ'];
3112− }
3113− return [ y.length == 1 ? 'GT' : 'LT' ];
3114− }
3115− return [ x === y ? 'EQ' : (x < y ? 'LT' : 'GT') ];
3116− };
3117− }
3118− return {eq : Value.eq,
3119− id : function(x) { return x; },
3120− not : function(b) { return !b; },
3121− fst : function(p) { return p[1]; },
3122− snd : function(p) { return p[2]; },
3123− rem : function(x) { return function(y) { return x % y; }; },
3124− div : function(x) { return function(y) { return ~~(x / y); }; },
3125− otherwise : true,
3126− compare : compare,
3127− toFloat : function(x) { return x; },
3128− round : function(n) { return Math.round(n); },
3129− floor : function(n) { return Math.floor(n); },
3130− ceiling : function(n) { return Math.ceil(n); },
3131− truncate : function(n) { return ~~n; },
3132− readInt : readInt,
3133− readFloat : readFloat,
3134− sqrt : Math.sqrt,
3135− abs : Math.abs,
3136− pi : Math.PI,
3137− e : Math.E,
3138− sin : Math.sin,
3139− cos : Math.cos,
3140− tan : Math.tan,
3141− asin : Math.asin,
3142− acos : Math.acos,
3143− atan : Math.atan,
3144− atan2 : function(y) { return function(x) { return Math.atan2(y,x); }; },
3145− mod : mod,
3146− min : min,
3147− max : max,
3148− flip : flip,
3149− clamp : clamp,
3150− curry : curry,
3151− uncurry : uncurry,
3152− logBase : logBase,
3153− Just : Elm.Maybe.Just,
3154− Nothing : Elm.Maybe.Nothing,
3155− maybe : Elm.Maybe.maybe,
3156− map : Elm.List.map,
3157− zip : Elm.List.zip,
3158− zipWith : Elm.List.zipWith,
3159− filter : Elm.List.filter,
3160− head : Elm.List.head,
3161− tail : Elm.List.tail,
3162− last : Elm.List.last,
3163− length : Elm.List.length,
3164− reverse : Elm.List.reverse,
3165− foldr : Elm.List.foldr,
3166− foldr1 : Elm.List.foldr1,
3167− foldl : Elm.List.foldl,
3168− foldl1 : Elm.List.foldl1,
3169− and : Elm.List.and,
3170− or : Elm.List.or,
3171− all : Elm.List.all,
3172− any : Elm.List.any,
3173− sum : Elm.List.sum,
3174− product : Elm.List.product,
3175− concat : Elm.List.concat,
3176− concatMap : Elm.List.concatMap,
3177− maximum : Elm.List.maximum,
3178− minimum : Elm.List.minimum,
3179− scanl : Elm.List.scanl,
3180− scanl1 : Elm.List.scanl1,
3181− take : Elm.List.take,
3182− drop : Elm.List.drop,
3183− zip : Elm.List.zip,
3184− unzip : Elm.List.unzip,
3185− lift : Elm.Signal.lift,
3186− lift2 : Elm.Signal.lift2,
3187− lift3 : Elm.Signal.lift3,
3188− lift4 : Elm.Signal.lift4,
3189− lift5 : Elm.Signal.lift5,
3190− lift6 : Elm.Signal.lift6,
3191− lift7 : Elm.Signal.lift7,
3192− lift8 : Elm.Signal.lift8,
3193− foldp : Elm.Signal.foldp,
3194− foldp1 : Elm.Signal.foldp1,
3195− foldp_ : Elm.Signal.foldp_,
3196− constant : Elm.Signal.constant,
3197− merge : Elm.Signal.merge,
3198− count : Elm.Signal.count,
3199− countIf : Elm.Signal.countIf,
3200− average : Elm.Signal.average,
3201− keepIf : Elm.Signal.keepIf,
3202− dropIf : Elm.Signal.dropIf,
3203− keepWhen : Elm.Signal.keepWhen,
3204− dropWhen : Elm.Signal.dropWhen,
3205− dropRepeats : Elm.Signal.dropRepeats,
3206− sampleOn : Elm.Signal.sampleOn,
3207− timestamp : Elm.Signal.timestamp,
3208− timeOf : Elm.Signal.timeOf
3209− };
3210−
3211−}();
3212−
3213−(function() {
3214− var include = function(library) {
3215− for (var i in library) {
3216− Elm.Prelude[i] = library[i];
3217− }
3218− };
3219− include (Elm.Color);
3220− include (Elm.Text);
3221− include (Elm.Graphics);
3222− include (Elm.Time);
3223−
3224− show = Value.show;
3225−
3226−}());
3227−
3228−Elm.Dict=function(){
3229− var compare = Elm.Prelude.compare;
3230− var uncurry = Elm.Prelude.uncurry;
3231− var Nothing = Elm.Prelude.Nothing;
3232− var Just = Elm.Prelude.Just;
3233− var not = Elm.Prelude.not;
3234− var eq = Elm.Prelude.eq;
3235− var isJust=Elm.Maybe.isJust;
3236− var Red_0=['Red'];
3237− var Black_1=['Black'];
3238− function RBNode_2(a1){
3239− return function(a2){
3240− return function(a3){
3241− return function(a4){
3242− return function(a5){
3243− return ['RBNode',a1,a2,a3,a4,a5];};};};};}
3244− var RBEmpty_3=['RBEmpty'];
3245− function min_6(t_42){
3246− return function(){
3247− switch(t_42[0]){
3248− case 'RBEmpty':
3249− throw '(min RBEmpty) is not defined';
3250− case 'RBNode':
3251− switch(t_42[4][0]){
3252− case 'RBEmpty':
3253− return ['Tuple2',t_42[2],t_42[3]];
3254− }
3255− return min_6(t_42[4]);
3256− }
3257− throw "Non-exhaustive pattern match in case";}();}
3258− function lookup_7(k_46){
3259− return function(t_47){
3260− return function(){
3261− switch(t_47[0]){
3262− case 'RBEmpty':
3263− return Nothing;
3264− case 'RBNode':
3265− return function(){
3266− var case12=compare(k_46)(t_47[2]);
3267− switch(case12[0]){
3268− case 'EQ':
3269− return Just(t_47[3]);
3270− case 'GT':
3271− return lookup_7(k_46)(t_47[5]);
3272− case 'LT':
3273− return lookup_7(k_46)(t_47[4]);
3274− }
3275− throw "Non-exhaustive pattern match in case";}();
3276− }
3277− throw "Non-exhaustive pattern match in case";}();};}
3278− function findWithDefault_8(base_52){
3279− return function(k_53){
3280− return function(t_54){
3281− return function(){
3282− switch(t_54[0]){
3283− case 'RBEmpty':
3284− return base_52;
3285− case 'RBNode':
3286− return function(){
3287− var case19=compare(k_53)(t_54[2]);
3288− switch(case19[0]){
3289− case 'EQ':
3290− return t_54[3];
3291− case 'GT':
3292− return findWithDefault_8(base_52)(k_53)(t_54[5]);
3293− case 'LT':
3294− return findWithDefault_8(base_52)(k_53)(t_54[4]);
3295− }
3296− throw "Non-exhaustive pattern match in case";}();
3297− }
3298− throw "Non-exhaustive pattern match in case";}();};};}
3299− function member_9(k_59){
3300− return function(t_60){
3301− return isJust(lookup_7(k_59)(t_60));};}
3302− function rotateLeft_10(t_61){
3303− return function(){
3304− switch(t_61[0]){
3305− case 'RBNode':
3306− switch(t_61[5][0]){
3307− case 'RBNode':
3308− return RBNode_2(t_61[1])(t_61[5][2])(t_61[5][3])(RBNode_2(Red_0)(t_61[2])(t_61[3])(t_61[4])(t_61[5][4]))(t_61[5][5]);
3309− }break;
3310− }
3311− throw 'rotateLeft of a node without enough children';}();}
3312− function rotateRight_11(t_71){
3313− return function(){
3314− switch(t_71[0]){
3315− case 'RBNode':
3316− switch(t_71[4][0]){
3317− case 'RBNode':
3318− return RBNode_2(t_71[1])(t_71[4][2])(t_71[4][3])(t_71[4][4])(RBNode_2(Red_0)(t_71[2])(t_71[3])(t_71[4][5])(t_71[5]));
3319− }break;
3320− }
3321− throw 'rotateRight of a node without enough children';}();}
3322− function rotateLeftIfNeeded_12(t_81){
3323− return function(){
3324− switch(t_81[0]){
3325− case 'RBNode':
3326− switch(t_81[5][0]){
3327− case 'RBNode':
3328− switch(t_81[5][1][0]){
3329− case 'Red':
3330− return rotateLeft_10(t_81);
3331− }break;
3332− }break;
3333− }
3334− return t_81;}();}
3335− function rotateRightIfNeeded_13(t_82){
3336− return function(){
3337− switch(t_82[0]){
3338− case 'RBNode':
3339− switch(t_82[4][0]){
3340− case 'RBNode':
3341− switch(t_82[4][1][0]){
3342− case 'Red':
3343− switch(t_82[4][4][0]){
3344− case 'RBNode':
3345− switch(t_82[4][4][1][0]){
3346− case 'Red':
3347− return rotateRight_11(t_82);
3348− }break;
3349− }break;
3350− }break;
3351− }break;
3352− }
3353− return t_82;}();}
3354− function otherColor_14(c_83){
3355− return function(){
3356− switch(c_83[0]){
3357− case 'Black':
3358− return Red_0;
3359− case 'Red':
3360− return Black_1;
3361− }
3362− throw "Non-exhaustive pattern match in case";}();}
3363− function color_flip_15(t_84){
3364− return function(){
3365− switch(t_84[0]){
3366− case 'RBNode':
3367− switch(t_84[4][0]){
3368− case 'RBNode':
3369− switch(t_84[5][0]){
3370− case 'RBNode':
3371− return RBNode_2(otherColor_14(t_84[1]))(t_84[2])(t_84[3])(RBNode_2(otherColor_14(t_84[4][1]))(t_84[4][2])(t_84[4][3])(t_84[4][4])(t_84[4][5]))(RBNode_2(otherColor_14(t_84[5][1]))(t_84[5][2])(t_84[5][3])(t_84[5][4])(t_84[5][5]));
3372− }break;
3373− }break;
3374− }
3375− throw 'color_flip called on a RBEmpty or RBNode with a RBEmpty child';}();}
3376− function color_flipIfNeeded_16(t_98){
3377− return function(){
3378− switch(t_98[0]){
3379− case 'RBNode':
3380− switch(t_98[4][0]){
3381− case 'RBNode':
3382− switch(t_98[4][1][0]){
3383− case 'Red':
3384− switch(t_98[5][0]){
3385− case 'RBNode':
3386− switch(t_98[5][1][0]){
3387− case 'Red':
3388− return color_flip_15(t_98);
3389− }break;
3390− }break;
3391− }break;
3392− }break;
3393− }
3394− return t_98;}();}
3395− function fixUp_17(t_99){
3396− return color_flipIfNeeded_16(rotateRightIfNeeded_13(rotateLeftIfNeeded_12(t_99)));}
3397− function ensureBlackRoot_18(t_100){
3398− return function(){
3399− switch(t_100[0]){
3400− case 'RBNode':
3401− switch(t_100[1][0]){
3402− case 'Red':
3403− return RBNode_2(Black_1)(t_100[2])(t_100[3])(t_100[4])(t_100[5]);
3404− }break;
3405− }
3406− return t_100;}();}
3407− function insert_19(k_105){
3408− return function(v_106){
3409− return function(t_107){
3410− return function(){
3411− function ins_108(t_109){
3412− return function(){
3413− switch(t_109[0]){
3414− case 'RBEmpty':
3415− return RBNode_2(Red_0)(k_105)(v_106)(RBEmpty_3)(RBEmpty_3);
3416− case 'RBNode':
3417− return function(){
3418− var h_115=function(){
3419− var case114=compare(k_105)(t_109[2]);
3420− switch(case114[0]){
3421− case 'EQ':
3422− return RBNode_2(t_109[1])(t_109[2])(v_106)(t_109[4])(t_109[5]);
3423− case 'GT':
3424− return RBNode_2(t_109[1])(t_109[2])(t_109[3])(t_109[4])(ins_108(t_109[5]));
3425− case 'LT':
3426− return RBNode_2(t_109[1])(t_109[2])(t_109[3])(ins_108(t_109[4]))(t_109[5]);
3427− }
3428− throw "Non-exhaustive pattern match in case";}();
3429− return fixUp_17(h_115);}();
3430− }
3431− throw "Non-exhaustive pattern match in case";}();}
3432− return ensureBlackRoot_18(ins_108(t_107));}();};};}
3433− function singleton_20(k_116){
3434− return function(v_117){
3435− return insert_19(k_116)(v_117)(RBEmpty_3);};}
3436− function isRed_21(t_118){
3437− return function(){
3438− switch(t_118[0]){
3439− case 'RBNode':
3440− switch(t_118[1][0]){
3441− case 'Red':
3442− return true;
3443− }break;
3444− }
3445− return false;}();}
3446− function isRedLeft_22(t_119){
3447− return function(){
3448− switch(t_119[0]){
3449− case 'RBNode':
3450− switch(t_119[4][0]){
3451− case 'RBNode':
3452− switch(t_119[4][1][0]){
3453− case 'Red':
3454− return true;
3455− }break;
3456− }break;
3457− }
3458− return false;}();}
3459− function isRedLeftLeft_23(t_120){
3460− return function(){
3461− switch(t_120[0]){
3462− case 'RBNode':
3463− switch(t_120[4][0]){
3464− case 'RBNode':
3465− switch(t_120[4][4][0]){
3466− case 'RBNode':
3467− switch(t_120[4][4][1][0]){
3468− case 'Red':
3469− return true;
3470− }break;
3471− }break;
3472− }break;
3473− }
3474− return false;}();}
3475− function isRedRight_24(t_121){
3476− return function(){
3477− switch(t_121[0]){
3478− case 'RBNode':
3479− switch(t_121[5][0]){
3480− case 'RBNode':
3481− switch(t_121[5][1][0]){
3482− case 'Red':
3483− return true;
3484− }break;
3485− }break;
3486− }
3487− return false;}();}
3488− function isRedRightLeft_25(t_122){
3489− return function(){
3490− switch(t_122[0]){
3491− case 'RBNode':
3492− switch(t_122[5][0]){
3493− case 'RBNode':
3494− switch(t_122[5][4][0]){
3495− case 'RBNode':
3496− switch(t_122[5][4][1][0]){
3497− case 'Red':
3498− return true;
3499− }break;
3500− }break;
3501− }break;
3502− }
3503− return false;}();}
3504− function moveRedLeft_26(t_123){
3505− return function(){
3506− var t__124=color_flip_15(t_123);
3507− return function(){
3508− switch(t__124[0]){
3509− case 'RBNode':
3510− return function(){
3511− switch(t__124[5][0]){
3512− case 'RBNode':
3513− switch(t__124[5][4][0]){
3514− case 'RBNode':
3515− switch(t__124[5][4][1][0]){
3516− case 'Red':
3517− return color_flip_15(rotateLeft_10(RBNode_2(t__124[1])(t__124[2])(t__124[3])(t__124[4])(rotateRight_11(t__124[5]))));
3518− }break;
3519− }break;
3520− }
3521− return t__124;}();
3522− }
3523− return t__124;}();}();}
3524− function moveRedRight_27(t_130){
3525− return function(){
3526− var t__131=color_flip_15(t_130);
3527− return (isRedLeftLeft_23(t__131)?color_flip_15(rotateRight_11(t__131)):t__131);}();}
3528− function moveRedLeftIfNeeded_28(t_132){
3529− return ((not(isRedLeft_22(t_132))&¬(isRedLeftLeft_23(t_132)))?moveRedLeft_26(t_132):t_132);}
3530− function moveRedRightIfNeeded_29(t_133){
3531− return ((not(isRedRight_24(t_133))&¬(isRedRightLeft_25(t_133)))?moveRedRight_27(t_133):t_133);}
3532− function deleteMin_30(t_134){
3533− return function(){
3534− function del_135(t_136){
3535− return function(){
3536− switch(t_136[0]){
3537− case 'RBNode':
3538− switch(t_136[4][0]){
3539− case 'RBEmpty':
3540− return RBEmpty_3;
3541− }break;
3542− }
3543− return function(){
3544− var case198=moveRedLeftIfNeeded_28(t_136);
3545− switch(case198[0]){
3546− case 'RBEmpty':
3547− return RBEmpty_3;
3548− case 'RBNode':
3549− return fixUp_17(RBNode_2(case198[1])(case198[2])(case198[3])(del_135(case198[4]))(case198[5]));
3550− }
3551− throw "Non-exhaustive pattern match in case";}();}();}
3552− return ensureBlackRoot_18(del_135(t_134));}();}
3553− function remove_31(k_142){
3554− return function(t_143){
3555− return function(){
3556− function eq_and_noRightNode_144(t_150){
3557− return function(){
3558− switch(t_150[0]){
3559− case 'RBNode':
3560− switch(t_150[5][0]){
3561− case 'RBEmpty':
3562− return eq(k_142,t_150[2]);
3563− }break;
3564− }
3565− return false;}();}
3566− function eq_145(t_152){
3567− return function(){
3568− switch(t_152[0]){
3569− case 'RBNode':
3570− return eq(k_142,t_152[2]);
3571− }
3572− return false;}();}
3573− function delLT_146(t_154){
3574− return function(){
3575− var case216=moveRedLeftIfNeeded_28(t_154);
3576− switch(case216[0]){
3577− case 'RBEmpty':
3578− throw 'delLT on RBEmpty';
3579− case 'RBNode':
3580− return fixUp_17(RBNode_2(case216[1])(case216[2])(case216[3])(del_149(case216[4]))(case216[5]));
3581− }
3582− throw "Non-exhaustive pattern match in case";}();}
3583− function delEQ_147(t_160){
3584− return function(){
3585− switch(t_160[0]){
3586− case 'RBEmpty':
3587− throw 'delEQ called on a RBEmpty';
3588− case 'RBNode':
3589− return function(){
3590− var Tuple2$k_v__164=min_6(t_160[5]);
3591− var k__165=function(){
3592− switch(Tuple2$k_v__164[0]){
3593− case 'Tuple2':
3594− return Tuple2$k_v__164[1];
3595− }
3596− throw "Non-exhaustive pattern match in case";}();
3597− var v__166=function(){
3598− switch(Tuple2$k_v__164[0]){
3599− case 'Tuple2':
3600− return Tuple2$k_v__164[2];
3601− }
3602− throw "Non-exhaustive pattern match in case";}();
3603− return fixUp_17(RBNode_2(t_160[1])(k__165)(v__166)(t_160[4])(deleteMin_30(t_160[5])));}();
3604− }
3605− throw "Non-exhaustive pattern match in case";}();}
3606− function delGT_148(t_171){
3607− return function(){
3608− switch(t_171[0]){
3609− case 'RBEmpty':
3610− throw 'delGT called on a RBEmpty';
3611− case 'RBNode':
3612− return fixUp_17(RBNode_2(t_171[1])(t_171[2])(t_171[3])(t_171[4])(del_149(t_171[5])));
3613− }
3614− throw "Non-exhaustive pattern match in case";}();}
3615− function del_149(t_177){
3616− return function(){
3617− switch(t_177[0]){
3618− case 'RBEmpty':
3619− return RBEmpty_3;
3620− case 'RBNode':
3621− return ((compare(k_142)(t_177[2])[0] === 'LT')?delLT_146(t_177):function(){
3622− var u_179=(isRedLeft_22(t_177)?rotateRight_11(t_177):t_177);
3623− return (eq_and_noRightNode_144(u_179)?u_179[4]:function(){
3624− var t__180=moveRedRightIfNeeded_29(t_177);
3625− return (eq_145(t__180)?delEQ_147(t__180):delGT_148(t__180));}());}());
3626− }
3627− throw "Non-exhaustive pattern match in case";}();}
3628− return (member_9(k_142)(t_143)?ensureBlackRoot_18(del_149(t_143)):t_143);}();};}
3629− function map_32(f_181){
3630− return function(t_182){
3631− return function(){
3632− switch(t_182[0]){
3633− case 'RBEmpty':
3634− return RBEmpty_3;
3635− case 'RBNode':
3636− return RBNode_2(t_182[1])(t_182[2])(f_181(t_182[3]))(map_32(f_181)(t_182[4]))(map_32(f_181)(t_182[5]));
3637− }
3638− throw "Non-exhaustive pattern match in case";}();};}
3639− function foldl_33(f_188){
3640− return function(acc_189){
3641− return function(t_190){
3642− return function(){
3643− switch(t_190[0]){
3644− case 'RBEmpty':
3645− return acc_189;
3646− case 'RBNode':
3647− return foldl_33(f_188)(f_188(t_190[2])(t_190[3])(foldl_33(f_188)(acc_189)(t_190[4])))(t_190[5]);
3648− }
3649− throw "Non-exhaustive pattern match in case";}();};};}
3650− function foldr_34(f_195){
3651− return function(acc_196){
3652− return function(t_197){
3653− return function(){
3654− switch(t_197[0]){
3655− case 'RBEmpty':
3656− return acc_196;
3657− case 'RBNode':
3658− return foldr_34(f_195)(f_195(t_197[2])(t_197[3])(foldr_34(f_195)(acc_196)(t_197[5])))(t_197[4]);
3659− }
3660− throw "Non-exhaustive pattern match in case";}();};};}
3661− function union_35(t1_202){
3662− return function(t2_203){
3663− return foldl_33(insert_19)(t2_203)(t1_202);};}
3664− function intersect_36(t1_204){
3665− return function(t2_205){
3666− return foldl_33(function(k_206){
3667− return function(v_207){
3668− return function(t_208){
3669− return (member_9(k_206)(t2_205)?insert_19(k_206)(v_207)(t_208):t_208);};};})(empty_4)(t1_204);};}
3670− function diff_37(t1_209){
3671− return function(t2_210){
3672− return foldl_33(function(k_211){
3673− return function(v_212){
3674− return function(t_213){
3675− return remove_31(k_211)(t_213);};};})(t1_209)(t2_210);};}
3676− function keys_38(t_214){
3677− return foldr_34(function(k_215){
3678− return function(v_216){
3679− return function(acc_217){
3680− return ['Cons',k_215,acc_217];};};})(['Nil'])(t_214);}
3681− function values_39(t_218){
3682− return foldr_34(function(k_219){
3683− return function(v_220){
3684− return function(acc_221){
3685− return ['Cons',v_220,acc_221];};};})(['Nil'])(t_218);}
3686− function toList_40(t_222){
3687− return foldr_34(function(k_223){
3688− return function(v_224){
3689− return function(acc_225){
3690− return ['Cons',['Tuple2',k_223,v_224],acc_225];};};})(['Nil'])(t_222);}
3691− function fromList_41(assocs_226){
3692− return Elm.List.foldl(uncurry(insert_19))(empty_4)(assocs_226);}
3693− var empty_4=RBEmpty_3;
3694− return {$op : {},
3695− empty:empty_4,
3696− lookup:lookup_7,
3697− findWithDefault:findWithDefault_8,
3698− member:member_9,
3699− insert:insert_19,
3700− singleton:singleton_20,
3701− remove:remove_31,
3702− map:map_32,
3703− foldl:foldl_33,
3704− foldr:foldr_34,
3705− union:union_35,
3706− intersect:intersect_36,
3707− diff:diff_37,
3708− keys:keys_38,
3709− values:values_39,
3710− toList:toList_40,
3711− fromList:fromList_41};}();
3712−
3713−Elm.Set=function(){
3714− var empty_0=Elm.Dict.empty;
3715− var remove_3=Elm.Dict.remove;
3716− var member_4=Elm.Dict.member;
3717− var union_5=Elm.Dict.union;
3718− var intersect_6=Elm.Dict.intersect;
3719− var diff_7=Elm.Dict.diff;
3720− var toList_8=Elm.Dict.keys;
3721− var fromList_9=Elm.List.foldl(function(k_15){
3722− return function(t_16){
3723− return Elm.Dict.insert(k_15)(["Tuple0"])(t_16);};})(empty_0);
3724− function singleton_1(k_13){
3725− return Elm.Dict.singleton(k_13)(["Tuple0"]);};
3726− function insert_2(k_14){
3727− return Elm.Dict.insert(k_14)(["Tuple0"]);};
3728− function foldl_10(f_17){
3729− return Elm.Dict.foldl(function(k_18){
3730− return function(v_19){
3731− return function(b_20){
3732− return f_17(k_18)(b_20);};};});};
3733− function foldr_11(f_21){
3734− return Elm.Dict.foldr(function(k_22){
3735− return function(v_23){
3736− return function(b_24){
3737− return f_21(k_22)(b_24);};};});};
3738− function map_12(f_25){
3739− return function(t_26){
3740− return function(x){
3741− return fromList_9(Elm.List.map(f_25)(x));}(toList_8(t_26));};};
3742− return {empty:empty_0,singleton:singleton_1,insert:insert_2,remove:remove_3,member:member_4,union:union_5,intersect:intersect_6,diff:diff_7,toList:toList_8,fromList:fromList_9,foldl:foldl_10,foldr:foldr_11,map:map_12};}();
3743−
3744−(function() {
3745−try{
3746−
3747−var $op={};
3748−for(this['i'] in Elm){eval('var '+this['i']+'=Elm[this.i];');}
3749−if (Elm.Automaton) throw "Module name collision, 'Automaton' is already defined.";
3750−Elm.Automaton=function(){
3751− try{
3752− if (!(Elm.Prelude instanceof Object)) throw 'module not found';
3753− } catch(e) {
3754− throw ("Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file.");
3755− }
3756− var hiddenVars={};
3757− for (this['i'] in Elm.Prelude) {
3758− if (hiddenVars[this['i']]) continue;
3759− eval('var ' + this['i'] + ' = Elm.Prelude[this.i];');}
3760− function Automaton_0(a1){
3761− return ["Automaton",a1];}
3762− var Listen_8=["Listen"];
3763− var Ignore_9=["Ignore"];
3764− function DragFrom_10(a1){
3765− return ["DragFrom",a1];}
3766− $op['>>>'] = function(a1_24){
3767− return function(a2_25){
3768− return function(){
3769− var Automaton$m1_26=a1_24;
3770− var m1_27=function(){
3771− switch(Automaton$m1_26[0]){
3772− case "Automaton":
3773− return Automaton$m1_26[1];
3774− }
3775− throw "Non-exhaustive pattern match in case";}();
3776− var Automaton$m2_28=a2_25;
3777− var m2_29=function(){
3778− switch(Automaton$m2_28[0]){
3779− case "Automaton":
3780− return Automaton$m2_28[1];
3781− }
3782− throw "Non-exhaustive pattern match in case";}();
3783− return Automaton_0(function(a_32){
3784− return function(){
3785− var Tuple2$bm1__33=m1_27(a_32);
3786− var b_34=function(){
3787− switch(Tuple2$bm1__33[0]){
3788− case "Tuple2":
3789− return Tuple2$bm1__33[1];
3790− }
3791− throw "Non-exhaustive pattern match in case";}();
3792− var m1__35=function(){
3793− switch(Tuple2$bm1__33[0]){
3794− case "Tuple2":
3795− return Tuple2$bm1__33[2];
3796− }
3797− throw "Non-exhaustive pattern match in case";}();
3798− return function(){
3799− var Tuple2$cm2__40=m2_29(b_34);
3800− var c_41=function(){
3801− switch(Tuple2$cm2__40[0]){
3802− case "Tuple2":
3803− return Tuple2$cm2__40[1];
3804− }
3805− throw "Non-exhaustive pattern match in case";}();
3806− var m2__42=function(){
3807− switch(Tuple2$cm2__40[0]){
3808− case "Tuple2":
3809− return Tuple2$cm2__40[2];
3810− }
3811− throw "Non-exhaustive pattern match in case";}();
3812− return ["Tuple2",c_41,$op['>>>'](m1__35)(m2__42)];}();}();});}();};};
3813− $op['<<<'] = function(a2_47){
3814− return function(a1_48){
3815− return $op['>>>'](a1_48)(a2_47);};};
3816− $op['^>>'] = function(f_49){
3817− return function(a_50){
3818− return $op['>>>'](pure_4(f_49))(a_50);};};
3819− $op['>>^'] = function(a_51){
3820− return function(f_52){
3821− return $op['>>>'](a_51)(pure_4(f_52));};};
3822− $op['^<<'] = function(f_53){
3823− return function(a_54){
3824− return $op['>>>'](a_54)(pure_4(f_53));};};
3825− $op['<<^'] = function(a_55){
3826− return function(f_56){
3827− return $op['>>>'](pure_4(f_56))(a_55);};};
3828− var count_7=init_5(0)(function(__84){
3829− return function(c_85){
3830− return (1+c_85);};});
3831− function run_1(Automaton$m0_14){
3832− return function(input_15){
3833− return function(){
3834− switch(Automaton$m0_14[0]){
3835− case "Automaton":
3836− return lift(fst)(foldp_(function(a_17){
3837− return function(Tuple2$bAutomaton$m_18){
3838− return function(){
3839− switch(Tuple2$bAutomaton$m_18[0]){
3840− case "Tuple2":
3841− switch(Tuple2$bAutomaton$m_18[2][0]){
3842− case "Automaton":
3843− return Tuple2$bAutomaton$m_18[2][1](a_17);
3844− }break;
3845− }
3846− throw "Non-exhaustive pattern match in case";}();};})(Automaton$m0_14[1])(input_15));
3847− }
3848− throw "Non-exhaustive pattern match in case";}();};}
3849− function step_2(Automaton$m_21){
3850− return function(a_22){
3851− return function(){
3852− switch(Automaton$m_21[0]){
3853− case "Automaton":
3854− return Automaton$m_21[1](a_22);
3855− }
3856− throw "Non-exhaustive pattern match in case";}();};}
3857− function combine_3(autos_57){
3858− return Automaton_0(function(a_58){
3859− return function(){
3860− var Tuple2$bsautos__59=unzip(map(function(Automaton$m_62){
3861− return function(){
3862− switch(Automaton$m_62[0]){
3863− case "Automaton":
3864− return Automaton$m_62[1](a_58);
3865− }
3866− throw "Non-exhaustive pattern match in case";}();})(autos_57));
3867− var bs_60=function(){
3868− switch(Tuple2$bsautos__59[0]){
3869− case "Tuple2":
3870− return Tuple2$bsautos__59[1];
3871− }
3872− throw "Non-exhaustive pattern match in case";}();
3873− var autos__61=function(){
3874− switch(Tuple2$bsautos__59[0]){
3875− case "Tuple2":
3876− return Tuple2$bsautos__59[2];
3877− }
3878− throw "Non-exhaustive pattern match in case";}();
3879− return ["Tuple2",bs_60,combine_3(autos__61)];}();});}
3880− function pure_4(f_68){
3881− return Automaton_0(function(x_69){
3882− return ["Tuple2",f_68(x_69),pure_4(f_68)];});}
3883− function init_5(s_70){
3884− return function(step_71){
3885− return Automaton_0(function(a_72){
3886− return function(){
3887− var s__73=step_71(a_72)(s_70);
3888− return ["Tuple2",s__73,init_5(s__73)(step_71)];}();});};}
3889− function init__6(s_74){
3890− return function(step_75){
3891− return Automaton_0(function(a_76){
3892− return function(){
3893− var Tuple2$bs__77=step_75(a_76)(s_74);
3894− var b_78=function(){
3895− switch(Tuple2$bs__77[0]){
3896− case "Tuple2":
3897− return Tuple2$bs__77[1];
3898− }
3899− throw "Non-exhaustive pattern match in case";}();
3900− var s__79=function(){
3901− switch(Tuple2$bs__77[0]){
3902− case "Tuple2":
3903− return Tuple2$bs__77[2];
3904− }
3905− throw "Non-exhaustive pattern match in case";}();
3906− return ["Tuple2",b_78,init__6(s__79)(step_75)];}();});};}
3907− function vecSub_11(Tuple2$x1y1_86){
3908− return function(Tuple2$x2y2_87){
3909− return function(){
3910− switch(Tuple2$x1y1_86[0]){
3911− case "Tuple2":
3912− return function(){
3913− switch(Tuple2$x2y2_87[0]){
3914− case "Tuple2":
3915− return ["Tuple2",(Tuple2$x1y1_86[1]-Tuple2$x2y2_87[1]),(Tuple2$x1y1_86[2]-Tuple2$x2y2_87[2])];
3916− }
3917− throw "Non-exhaustive pattern match in case";}();
3918− }
3919− throw "Non-exhaustive pattern match in case";}();};}
3920− function stepDrag_12(Tuple2$presspos_92){
3921− return function(Tuple2$dsform_93){
3922− return function(){
3923− switch(Tuple2$presspos_92[0]){
3924− case "Tuple2":
3925− return function(){
3926− switch(Tuple2$dsform_93[0]){
3927− case "Tuple2":
3928− return function(){
3929− function wrap_98(ds__99){
3930− return ["Tuple2",Tuple2$dsform_93[2],["Tuple2",ds__99,Tuple2$dsform_93[2]]];}
3931− return function(){
3932− switch(Tuple2$dsform_93[1][0]){
3933− case "DragFrom":
3934− return (Tuple2$presspos_92[1]?["Tuple2",uncurry(move)(vecSub_11(Tuple2$presspos_92[2])(Tuple2$dsform_93[1][1]))(Tuple2$dsform_93[2]),["Tuple2",DragFrom_10(Tuple2$dsform_93[1][1]),Tuple2$dsform_93[2]]]:function(){
3935− var form__101=uncurry(move)(vecSub_11(Tuple2$presspos_92[2])(Tuple2$dsform_93[1][1]))(Tuple2$dsform_93[2]);
3936− return ["Tuple2",form__101,["Tuple2",Listen_8,form__101]];}());
3937− case "Ignore":
3938− return wrap_98((Tuple2$presspos_92[1]?Ignore_9:Listen_8));
3939− case "Listen":
3940− return wrap_98((not(Tuple2$presspos_92[1])?Listen_8:(isWithin(Tuple2$presspos_92[2])(Tuple2$dsform_93[2])?DragFrom_10(Tuple2$presspos_92[2]):Ignore_9)));
3941− }
3942− throw "Non-exhaustive pattern match in case";}();}();
3943− }
3944− throw "Non-exhaustive pattern match in case";}();
3945− }
3946− throw "Non-exhaustive pattern match in case";}();};}
3947− function draggable_13(form_102){
3948− return init__6(["Tuple2",Listen_8,form_102])(stepDrag_12);}
3949− return {$op : {'>>>' : $op['>>>'], '<<<' : $op['<<<'], '^>>' : $op['^>>'], '>>^' : $op['>>^'], '^<<' : $op['^<<'], '<<^' : $op['<<^']},
3950− run:run_1,
3951− step:step_2,
3952− combine:combine_3,
3953− pure:pure_4,
3954− init:init_5,
3955− init_:init__6,
3956− count:count_7,
3957− draggable:draggable_13};}();
3958−Elm.main=function(){
3959− return Elm.Automaton.main;};
3960−} catch (e) {
3961−Elm.main=function() {
3962−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 + '</span>');
3963−document.body.innerHTML = Elm.Text.monospace(msg);throw e;};}}());
1+Elm={};var Guid=function(){var e=0;return{guid:function(){return e+=1}}}();
2+Elm.JavaScript=function(){function e(b){for(var a=["Nil"],m=b.length;m--;)a=["Cons",b[m],a];return a}function k(b){for(var a=[];"Cons"===b[0];)a.push(b[1]),b=b[2];return a}function b(b){return b.slice(1)}function d(b){return["Tuple"+b.length].concat(b)}return{castJSBoolToBool:function(b){return b},castBoolToJSBool:function(b){return b},castJSNumberToFloat:function(b){return b},castFloatToJSNumber:function(b){return b},castJSNumberToInt:function(b){return~~b},castIntToJSNumber:function(b){return b},
3+Experimental:{castJSElementToElement:function(b){return function(a){return function(m){return["Element",Guid.guid(),["EExternalHtml",m],b,a,1,["Nothing"],["Nothing"]]}}},castElementToJSElement:function(b){return Render.render(b)}},castJSArrayToList:e,castListToJSArray:k,castJSStringToString:e,castStringToJSString:function(b){return"string"===typeof b?b:k(b).join("")},castTupleToJSTuple2:b,castTupleToJSTuple3:b,castTupleToJSTuple4:b,castTupleToJSTuple5:b,castJSTupleToTuple2:d,castJSTupleToTuple3:d,
4+castJSTupleToTuple4:d,castJSTupleToTuple5:d}}();var JSjson=window.JSON;
5+Elm.JSON=function(){function e(a,b){return function(g){return function(l){var h=d.castStringToJSString(g);return l[1].hasOwnProperty(h)&&(l=l[1][h],l[0]===a)?l[1]:b}}}function k(a){return function(b){function g(a){switch(a[0]){case "JsonNull":return null;case "JsonString":return d.castStringToJSString(a[1]);case "JsonObject":var h={};a=a[1][1];for(var c in a)h[c]=g(a[c]);return h;case "JsonArray":h=d.castListToJSArray(a[1]);for(c=h.length;c--;)h[c]=g(h[c]);return h;default:return a[1]}}return JSjson.stringify(g(["JsonObject",
6+b]),null,d.castStringToJSString(a))}}function b(a){function b(a){switch(typeof a){case "string":return["JsonString",d.castJSStringToString(a)];case "number":return["JsonNumber",d.castJSNumberToFloat(a)];case "boolean":return["JsonBool",d.castJSBoolToBool(a)];case "object":if(null===a)return["JsonNull"];for(var h in a)a[h]=b(a[h]);return a instanceof Array?["JsonArray",d.castJSArrayToList(a)]:["JsonObject",["JSON",a]]}}a=JSjson.parse(a);for(var g in a)a[g]=b(a[g]);return["JSON",a]}var d=Elm.JavaScript,
7+j=["JSON",{}];return{empty:j,singleton:function(a){return function(b){var g={};g[d.castStringToJSString(a)]=b;return["JSON",g]}},insert:function(a){return function(b){return function(g){g=g[1];var l={},h;for(h in g)l[h]=g[h];l[d.castStringToJSString(a)]=b;return["JSON",l]}}},lookup:function(a){return function(b){var g=d.castStringToJSString(a);return b[1].hasOwnProperty(g)?["Just",b[1][g]]:["Nothing"]}},findString:e("JsonString",["Nil"]),findObject:e("JsonObject",j),findArray:e("JsonArray",["Nil"]),
8+findWithDefault:function(a){return function(b){return function(g){var l=d.castStringToJSString(b);return g[1].hasOwnProperty(l)?g[1][l]:a}}},remove:function(a){return function(b){b=b[1];var g={},l;for(l in b)g[l]=b[l];delete g[d.castStringToJSString(a)];return["JSON",g]}},toPrettyJSString:k,toJSString:k(""),fromJSString:b,toPrettyString:function(a){return function(b){return d.castJSStringToString(k(a)(b))}},toString:function(a){return d.castJSStringToString(k("")(a))},fromString:function(a){return b(d.castStringToJSString(a))},
9+toList:function(a){a=a[1];var b=[],g;for(g in a)b.push(Value.Tuple(d.castJSStringToString(g),a[g]));return d.castJSArrayToList(b)},fromList:function(a){a=d.castListToJSArray(a);for(var b={},g=a.length;g--;)b[d.castStringToJSString(a[g][1])]=a[g][2];return["JSON",b]},JsonString:function(a){return["JsonString",a]},JsonNumber:function(a){return["JsonNumber",a]},JsonBool:function(a){return["JsonBool",a]},JsonNull:["JsonNull"],JsonArray:function(a){return["JsonArray",a]},JsonObject:function(a){return["JsonObject",
10+a]}}}();
11+var Value=function(){function e(a){if(0==a.length)return a;a=a.replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">").replace(/\n/g,"<br/>");a=a.split("<br/>");for(var b=a.length;b--;){var g=a,d=b,h;h=a[b];if(0!=h.length){h=h.split("");" "==h[0]&&(h[0]=" ");for(var c=h.length;--c;)" "==h[c][0]&&" "==h[c-1]&&(h[c-1]+=h[c],h[c]="");for(c=h.length;c--;)if(1<h[c].length&&" "==h[c][0]){for(var f=h[c].split(""),v=f.length-2;0<=v;v-=2)f[v]=" ";h[c]=f.join("")}h=h.join("");
12+h=" "===h[h.length-1]?h.slice(0,-1)+" ":h}g[d]=h}return a.join("<br/>")}var k=function(a,b){if("object"===typeof a){if(a.hasOwnProperty("_")){for(var g in a)if(a[g]!=b[g])return!1;for(g in b)if(a[g]!=b[g])return!1;return!0}if(a===b)return!0;if(a.length!==b.length)return!1;for(g=a.length;g--;)if(!k(a[g],b[g]))return!1;return!0}return a===b},b=function(a){if("function"===typeof a)return"<function>";if("boolean"===typeof a)return a?"True":"False";if("number"!==typeof a){if("string"===typeof a&&
13+2>a.length)return"'"+a+"'";if("object"===typeof a&&a.hasOwnProperty("_")){var d=[],g;for(g in a)if("_"!=g)for(var l=a[g].length;l--;)d.push(g+" = "+b(a[g][l]));return 0===d.length?"{}":"{ "+d.join(", ")+" }"}if(a[0]){if("Tuple"===a[0].substring(0,5)){d=Array(a.length-1);for(l=a.length;--l;)d[l-1]=b(a[l]);return"("+d.join(",")+")"}if("Cons"===a[0]){g="string"===typeof a[1]?'"':"]";var l="string"===typeof a[1]?"":",",h="string"===typeof a[1]?function(a){return a}:b,d=("string"===typeof a[1]?'"':"[")+
14+h(a[1]);for(a=a[2];;)if("Cons"===a[0])d+=l+h(a[1]),a=a[2];else return d+g}else{if("Nil"===a[0])return"[]";if("JSON"===a[0])return"(JSON.fromList "+b(Elm.JSON.toList(a))+")";if("RBNode"===a[0]||"RBEmpty"===a[0])return a=Elm.Dict.foldr(function(a){return function(b){return function(h){return["Cons",["Tuple2",a,b],h]}}})(["Nil"])(a),d="Dict","Cons"===a[0]&&"Tuple0"===a[1][2][0]&&(d="Set",a=Elm.List.map(function(a){return a[1]})(a)),"("+d+".fromList "+b(a)+")";d=[];for(l=a.length;--l;)d.push(b(a[l]));
15+d=a[0]+" "+d.join(" ");return 1<a.length?"("+d+")":d}}}return a+""},d=function(a){for(var b=["Nil"],d=a.length;d--;)b=["Cons",a[d],b];return b},j;j=document.addEventListener?function(a,b,d){a.addEventListener(b,d,!1)}:function(a,b,d){a.attachEvent("on"+b,d)};return{eq:k,str:d,show:function(a){return d(b(a))},Tuple:function(){var a=arguments.length,b=Array(a+1);for(b[0]="Tuple"+arguments.length;a--;)b[a+1]=arguments[a];return b},append:function(a,b){if("string"===typeof a&&"string"===typeof b)return a.concat(b);
16+if("Nil"===a[0])return b;var d=["Cons",a[1],["Nil"]],l=d;for(a=a[2];"Cons"===a[0];)l[2]=["Cons",a[1],["Nil"]],a=a[2],l=l[2];l[2]=b;return d},listToArray:function(a){for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return b},toText:function(a){if("string"===typeof a)return e(a);for(var b=[];"Cons"===a[0];)b.push(a[1]),a=a[2];return e(b.join(""))},properEscape:e,getTextSize:function(a,b,d){var l=document.createElement("div");l.innerHTML=d;l.style.textAlign="left";0<a&&(l.style.width=a+"px");l.style.visibility=
17+"hidden";l.style.styleFloat="left";l.style.cssFloat="left";document.body.appendChild(l);d=window.getComputedStyle(l,null);a=d.getPropertyValue("width").slice(0,-2)-0;d=d.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(l);return[Math.ceil(a),Math.ceil(Math.max(b,d))]},getSize:function(a){a=a.cloneNode(!0);a.style.visibility="hidden";a.style.styleFloat="left";a.style.cssFloat="left";document.body.appendChild(a);var b=a.offsetWidth,d=a.offsetHeight;document.body.removeChild(a);return[b,
18+d]},getExcess:function(b){b=b.cloneNode(!0);b.style.visibility="hidden";b.style.styleFloat="left";b.style.cssFloat="left";document.body.appendChild(b);var d=b.offsetWidth,g=b.offsetHeight,l=window.getComputedStyle(b,null),h=l.getPropertyValue("width").slice(0,-2)-0,l=l.getPropertyValue("height").slice(0,-2)-0;document.body.removeChild(b);return[d-h,g-l]},groupForms:function(b){b=Elm.JavaScript.castListToJSArray(b);for(var d=[],g=[],l=b.length;l--;){var h=b[l];switch(h[4][0]){case "FElement":0<g.length&&
19+(d.push(g),g=[]);d.push(h);break;default:g.push(h)}}0<g.length&&d.push(g);return d},wrap:function(b){var d=Value.getSize(b);return["Element",Guid.guid(),["EHtml",b],d[0],d[1],1,["Nothing"],["Nothing"]]},addListener:j}}();
20+Elm.List=function(){function e(b){return function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&h("map");var c=["Cons",b(a[1]),["Nil"]],f=c;for(a=a[2];"Cons"===a[0];)f[2]=["Cons",b(a[1]),["Nil"]],a=a[2],f=f[2];return c}}function k(b){return function(a){return function(c){var f=a;if("Nil"===c[0])return f;for("Cons"!==c[0]&&h("foldl");"Cons"===c[0];)f=b(c[1])(f),c=c[2];return f}}}function b(b){return function(a){return function(c){var f=a;if("Nil"===c[0])return f;"Cons"!==c[0]&&h("foldr");for(var d=[];"Cons"===
21+c[0];)d.push(c[1]),c=c[2];for(c=d.length;c--;)f=b(d[c])(f);return f}}}function d(b){return function(a){var h;"Cons"!==a[0]?h=void 0:(h=a[1],a=a[2],h=k(b)(h)(a));return h}}function j(b){return function(a){return function(c){if("Nil"===c[0])return["Cons",a,["Nil"]];"Cons"!==c[0]&&h("scanl");for(var f=[a];"Cons"===c[0];)a=b(c[1])(a),f.push(a),c=c[2];c=["Nil"];for(var d=f.length;d--;)c=["Cons",f[d],c];return c}}}function a(b){return function(h){a:{for(var c=[function(b){return"Nil"!==b[0]?void 0:["Tuple2",
22+["Nil"],["Nil"]]},function(h){if("Cons"===h[0]){var c=h[1];h=h[2];var f=a(b)(h);"Tuple2"!==f[0]?c=void 0:(h=f[1],f=f[2],c=b(c)?["Tuple2",["Cons",c,h],f]:["Tuple2",h,["Cons",c,f]]);return c}}],f=c.length;f--;){var d=c[f](h);if(void 0!==d){h=d;break a}}h=void 0}return h}}function m(b){a:{for(var a=[function(b){return"Nil"!==b[0]?void 0:["Tuple2",["Nil"],["Nil"]]},function(b){if("Cons"!==b[0])b=void 0;else if(b=["Tuple2",b[1],m(b[2])],"Tuple2"!==b[0]||"Tuple2"!==b[1][0])b=void 0;else{var a=b[1][1],h=
23+b[1][2];b="Tuple2"!==b[2][0]?void 0:["Tuple2",["Cons",a,b[2][1]],["Cons",h,b[2][2]]]}return b}],h=a.length;h--;){var c=a[h](b);if(void 0!==c){b=c;break a}}b=void 0}return b}function g(b){return function(a){a:{for(var h=[function(b){return"Nil"!==b[0]?void 0:["Nil"]},function(b){if("Cons"===b[0]){var a=b[1];return"Nil"!==b[2][0]?void 0:["Cons",a,["Nil"]]}},function(a){if("Cons"===a[0]){var h=a[1];if("Cons"===a[2][0]){var c=a[2][1];a=a[2][2];return["Cons",h,["Cons",b,g(b)(["Cons",c,a])]]}}}],c=h.length;c--;){var f=
24+h[c](a);if(void 0!==f){a=f;break a}}a=void 0}return a}}function l(b){return function(a){a:{for(var h=[function(b){return"Nil"!==b[0]?void 0:["Nil"]},function(b){if("Cons"===b[0]){var a=b[1];return"Nil"!==b[2][0]?void 0:a}},function(a){if("Cons"===a[0]){var h=a[1];if("Cons"===a[2][0]){var c=a[2][1];a=a[2][2];return Value.append(h,Value.append(b,l(b)(["Cons",c,a])))}}}],c=h.length;c--;){var f=h[c](a);if(void 0!==f){a=f;break a}}a=void 0}return a}}var h=function(b){throw"Function '"+b+"' expecting a list!";
25+},c=k(function(b){return function(a){return["Cons",b,a]}})(["Nil"]),f=b(function(b){return function(a){return Value.append(b,a)}})(["Nil"]),v=k(function(b){return function(a){return b&&a}})(!0),n=k(function(b){return function(a){return b||a}})(!1),p=k(function(b){return function(a){return b+a}})(0),r=k(function(b){return function(a){return b*a}})(1),y=d(function(b){return function(a){return Math.max(b,a)}}),s=d(function(b){return function(a){return Math.min(b,a)}});return{head:function(b){if("Cons"!==
26+b[0])throw"Error: 'head' only accepts lists of length greater than one.";return b[1]},tail:function(b){if("Cons"!==b[0])throw"Error: 'tail' only accepts lists of length greater than one.";return b[2]},last:function(b){if("Cons"!==b[0])throw"Error: 'last' only accepts lists of length greater than one.";for(var a=b[1];"Cons"===b[0];)a=b[1],b=b[2];return a},map:e,foldl:k,foldr:b,foldl1:d,foldr1:function(b){return function(a){if("Nil"===a[0])throw"'foldr1' requires an non-empty list.";"Cons"!==a[0]&&
27+h("foldr1");for(var c=[];"Cons"===a[0];)c.push(a[1]),a=a[2];a=c.pop();for(var f=c.length;f--;)a=b(c[f])(a);return a}},scanl:j,scanl1:function(b){return function(a){if("Cons"!==a[0])throw"Error: 'scanl1' requires a list of at least length 1.";return j(b)(a[1])(a[2])}},filter:function(b){return function(a){if("Nil"===a[0])return a;"Cons"!==a[0]&&h("filter");for(var c=[];"Cons"===a[0];)b(a[1])&&c.push(a[1]),a=a[2];a=["Nil"];for(var f=c.length;f--;)a=["Cons",c[f],a];return a}},length:function(b){for(var a=
28+0;"Cons"===b[0];)a+=1,b=b[2];return a},reverse:c,concat:f,concatMap:function(b){return function(a){return f(e(b)(a))}},and:v,or:n,all:function(b){return k(function(a){return function(h){return h&&b(a)}})(!0)},any:function(b){return k(function(a){return function(h){return h||b(a)}})(!1)},sum:p,product:r,maximum:y,minimum:s,partition:a,zipWith:function(b){return function(a){return function(c){if("Nil"===a[0]||"Nil"===c[0])return["Nil"];("Cons"!==a[0]||"Cons"!==c[0])&&h("zipWith");for(var f=[];"Cons"===
29+a[0]&&"Cons"===c[0];)f.push(b(a[1])(c[1])),a=a[2],c=c[2];c=["Nil"];for(var d=f.length;d--;)c=["Cons",f[d],c];return c}}},zip:function(b){return function(a){if("Nil"===b[0]||"Nil"===a[0])return["Nil"];("Cons"!==b[0]||"Cons"!==a[0])&&h("zip");for(var c=[];"Cons"===b[0]&&"Cons"===a[0];)c.push(["Tuple2",b[1],a[1]]),b=b[2],a=a[2];a=["Nil"];for(var f=c.length;f--;)a=["Cons",c[f],a];return a}},unzip:m,intersperse:g,intercalate:l,sort:function(b){if("Nil"===b[0])return b;"Cons"!==b[0]&&h("sort");for(var a=
30+[];"Cons"===b[0];)a.push(b[1]),b=b[2];a.sort(function(b,a){return b-a});b=["Nil"];for(var c=a.length;c--;)b=["Cons",a[c],b];return b},take:function(b){return function(a){if(0>=b)return["Nil"];if("Nil"===a[0])return a;"Cons"!==a[0]&&h("take");var c=["Cons",a[1],["Nil"]],f=c;a=a[2];for(--b;"Cons"===a[0]&&0<b;)f[2]=["Cons",a[1],["Nil"]],f=f[2],a=a[2],--b;return c}},drop:function(b){return function(a){if("Nil"===a[0])return a;for("Cons"!==a[0]&&h("drop");"Cons"===a[0]&&0<b;)a=a[2],--b;return a}}}}();
31+Elm.Maybe=function(){function e(b){return function(d){return"Just"===b[0]?["Cons",b[1],d]:d}}function k(b){return function(d){return function(j){var a=b(d);return"Just"===a[0]?["Cons",a[1],j]:j}}}return{Just:function(b){return["Just",b]},Nothing:["Nothing"],catMaybes:Elm.List.foldr(e)(["Nil"]),isJust:function(b){return"Just"===b[0]},isNothing:function(b){return"Nothing"===b[0]},fromMaybe:function(b){return function(d){return"Just"===d[0]?d[1]:b}},consMaybe:e,mapMaybe:function(b){return Elm.List.foldr(k(b))(["Nil"])},
32+maybe:function(b){return function(d){return function(j){return"Just"===j[0]?d(j[1]):b}}}}}();
33+Elm.Char=function(){function e(b,a){return function(d){d=d.charCodeAt(0);return b<=d&&d<=a}}var k=e(48,57),b=e(97,102),d=e(65,70);return{fromCode:function(b){return String.fromCharCode(b)},toCode:function(b){return b.charCodeAt(0)},toUpper:function(b){return b.toUpperCase()},toLower:function(b){return b.toLowerCase()},toLocaleUpper:function(b){return b.toLocaleUpperCase()},toLocaleLower:function(b){return b.toLocaleLowerCase()},isLower:e(97,122),isUpper:e(65,90),isDigit:k,isOctDigit:e(48,55),isHexDigit:function(e){return k(e)||
34+b(e)||d(e)}}}();
35+Elm.Color=function(){function e(e){var b=e.value*e.saturation,d=e.hue/60,j=b*(1-Math.abs(d%2-1)),a=0,m=0,g=0;0<=d&&1>d?(a=b,m=j,g=0):1<=d&&2>d?(a=j,m=b,g=0):2<=d&&3>d?(a=0,m=b,g=j):3<=d&&4>d?(a=0,m=j,g=b):4<=d&&5>d?(a=j,m=0,g=b):5<=d&&6>d&&(a=b,m=0,g=j);e=e.value-b;return["Color",Math.round(255*(a+e)),Math.round(255*(m+e)),Math.round(255*(g+e)),1]}return{rgba:function(e){return function(b){return function(d){return function(j){return["Color",e,b,d,j]}}}},rgb:function(e){return function(b){return function(d){return["Color",e,
36+b,d,1]}}},hsva:function(k){return function(b){return function(d){return function(j){var a=e({hue:k,saturation:b,value:d});a[4]=j;return a}}}},hsv:function(k){return function(b){return function(d){return e({hue:k,saturation:b,value:d})}}},red:["Color",255,0,0,1],green:["Color",0,255,0,1],blue:["Color",0,0,255,1],yellow:["Color",255,255,0,1],cyan:["Color",0,255,255,1],magenta:["Color",255,0,255,1],black:["Color",0,0,0,1],white:["Color",255,255,255,1],gray:["Color",128,128,128,1],grey:["Color",128,128,
37+128,1],complement:function(k){var b;b=k[1]/255;var d=k[2]/255;k=k[3]/255;var j=Math.max(b,d,k),a=Math.min(b,d,k),a=j-a,m=0;0===a?m=0:j===b?m=(d-k)/a%6:j===d?m=(k-b)/a+2:j===k&&(m=(b-d)/a+4);b={value:j,hue:60*m,saturation:0===j?0:a/j};b.hue=(b.hue+180)%360;return e(b)},extract:function(e){return 1===e[4]?"rgb("+e[1]+","+e[2]+","+e[3]+")":"rgba("+e[1]+","+e[2]+","+e[3]+","+e[4]+")"}}}();
38+var Collage=function(){function e(b,a){var c=a.length-1;if(!(0>=c))for(b.moveTo(a[c][1],a[c][2]);c--;)b.lineTo(a[c][1],a[c][2])}function k(b,a,c,f){0===b.length&&(b=[8,4]);var d=f.length-1;if(!(0>=d)){var n=f[d][1],g=f[d][2],e=0,j=0,k=0,m=0,q=0,t=0,w=b.length,A=!0,x=b[0];for(a.moveTo(n,g);d--;){e=f[d][1];j=f[d][2];k=e-n;m=j-g;for(q=Math.sqrt(k*k+m*m);x<=q;)n+=k*x/q,g+=m*x/q,a[A?"lineTo":"moveTo"](n,g),k=e-n,m=j-g,q=Math.sqrt(k*k+m*m),A=!A,t=(t+1)%w,x=b[t];0<q&&(a[A?"lineTo":"moveTo"](e,j),x-=q);n=
39+e;g=j}}a.strokeStyle=Elm.Color.extract(c);a.stroke()}function b(b,a,c,f,d){a.clearRect(0,0,c,f);for(c=d.length;c--;){var n=d[c],p=b;f=a;var j=n[1],m=n[2],s=n[3][1],u=n[3][2],n=n[4];f.save();(0!==s||0!==u)&&f.translate(s,u);j!==~~j&&f.rotate(2*Math.PI*j);1!==m&&f.scale(m,m);f.beginPath();switch(n[0]){case "FLine":a:switch(p=f,j=n,n=j[3][1],j[1][0]){case "Solid":j=j[2];e(p,n);p.strokeStyle=Elm.Color.extract(j);p.stroke();break;case "Dotted":k([3,3],p,j[2],n);break a;case "Dashed":k([8,4],p,j[2],n);
40+break a;case "Custom":k(j[1][1],p,j[2],n)}break;case "FShape":a:switch(s=p,m=f,p=n[1],j=n[2],n=n[3][1],p[0]){case "Filled":p=m;e(p,n);p.fillStyle=Elm.Color.extract(j);p.fill();break a;case "Outlined":p=m;e(p,n);p.strokeStyle=Elm.Color.extract(j);p.stroke();break a;case "Textured":j=s;p=p[1];s=new Image;s.src=g.castStringToJSString(p);s.onload=j;e(m,n);m.fillStyle=m.createPattern(s,"repeat");m.fill();break a;case "CustomOutline":k(p[1],m,j,n)}break;case "FImage":j=f,m=n[1],s=n[2],n=n[3],u=new Image,
41+u.onload=p,u.src=g.castStringToJSString(n),j.drawImage(u,-m/2,-s/2,m,s)}f.restore()}}function d(a,h,c){var f=Render.newElement("canvas");a=~~a;h=~~h;f.style.width=a+"px";f.style.height=h+"px";f.style.display="block";f.width=a;f.height=h;if(f.getContext){var d=f.getContext("2d");b(function(){b(this,d,a,h,c)},d,a,h,c);return f}f.innerHTML="Your browser does not support the canvas element.";return f}function j(b,a,c,f,d,n,g){var e=Render.render(g);c="translate("+(d-g[3]/2)+"px,"+(n-g[4]/2)+"px) "+(1===
42+f?"":"scale("+f+","+f+")")+" "+(c===~~c?"":"rotate("+360*c+"deg)");e.style.transform=c;e.style.msTransform=c;e.style.MozTransform=c;e.style.webkitTransform=c;e.style.OTransform=c;c=Render.newElement("div");Render.addTo(c,e);c.style.width=~~b+"px";c.style.height=~~a+"px";c.style.overflow="hidden";return c}function a(a,h,c){if(!Value.eq(c,h)){var f=a.style.width.slice(0,-2)-0,g=a.style.height.slice(0,-2)-0;if("object"===typeof c[0]){if("object"===typeof h[0]&&a.getContext){var n=a.getContext("2d");
43+return b(function(){b(this,n,f,g,c)},n,f,g,c)}h=d(f,g,c);h.style.position="absolute";return a.parentNode.replaceChild(h,a)}h=j(f,g,c[1],c[2],c[3][1],c[3][2],c[4][1]);h.style.position="absolute";return a.parentNode.replaceChild(h,a)}}function m(b,a,c,f,d){var g=0,e,j=(b[1]-f[1])/c;b=(b[2]-f[2])/c;0!==a&&(a*=-2*Math.PI,c=j*Math.cos(a)-b*Math.sin(a),b=j*Math.sin(a)+b*Math.cos(a),j=c);if(0===d.length)return!1;e=d[0];for(c=d.length-1;c--;){a=d[c];f=e[1];e=e[2];var k=a[1],m=a[2];if(e<m)var u=e,q=m;else u=
44+m,q=e;if(f<k)var t=f,w=k;else t=k,w=f;u<b&&b<=q&&j<=w&&(j<=t||j<=(b-e)*(k-f)/(m-e)+f)&&++g;e=a}return 1===g%2}var g=Elm.JavaScript;return{collage:function(b,a,c){if(0===c.length)return d(b,a,[]);for(var f=Array(c.length),e=c.length;e--;){var g=c[e];f[e]="string"===typeof g[0]?j(b,a,g[1],g[2],g[3][1],g[3][2],g[4][1]):d(b,a,g)}return 1===c.length?f[0]:Render.flowWith(Render.goIn,function(b){return b},f)},updateCollage:function(b,h,c){if(1===c.length)return a(b,h[0],c[0]);b=b.childNodes;for(var f=b.length,
45+d=f;d--;)a(b[f-d-1],h[d],c[d])},insideForm:function(b){return function(a){var c=b[1],f=b[2];if(6>a.length){var d=a[3][1],g=a[3][2],e=0,j=a[2];switch(a[4][0]){case "FShape":for(var k=a[4][3][1],s=k.length;--s;)var u=k[s],e=Math.max(e,u[1]*u[1]+u[2]*u[2]);e*=j*j;break;case "FImage":k=j*a[4][1]/2;j=j*a[4][2]/2;e=k*k+j*j;break;case "FElement":k=j*a[4][1][3]/2,j=j*a[4][1][4]/2,e=k*k+j*j}a.push(function(a,b){var c=a-d,h=b-g;return c*c+h*h<e+1})}if(!a[5](c,f))return!1;var q,t;switch(a[4][0]){case "FShape":return m(b,
46+a[1],a[2],a[3],a[4][3][1]);case "FLine":return!1;case "FImage":q=a[4][1]/2;t=a[4][2]/2;break;case "FElement":q=a[4][1][3]/2,t=a[4][1][4]/2}return m(b,a[1],a[2],a[3],[[null,q,t],[null,-q,t],[null,-q,-t],[null,q,-t],[null,q,t]])}}}}();
47+Elm.Graphics=function(){function e(a){return function(b){return["Position",a,b]}}function k(a){return function(b){return["EText",a,b]}}function b(a){return function(b){return["EFlow",a,r.castListToJSArray(b)]}}function d(a){return["Line",r.castListToJSArray(a)]}function j(a){return function(b){var c=r.castListToJSArray(a);0<c.length&&c.push(c[0]);return["Shape",c,b]}}function a(a){return function(b){return function(c){return function(h){return["Form",a,b,c,h]}}}}function m(a){return function(b){return function(c){return["FLine",
48+a,b,c]}}}function g(a){return function(b){return function(c){return["FShape",a,b,c]}}}function l(a,b,c,h,f,d){return["Element",Guid.guid(),a,b,c,h,f,d]}function h(a,b,c){return["Element",Guid.guid(),a,b,c,1,["Nothing"],["Nothing"]]}function c(a){return~~a[3]}function f(a){return~~a[4]}function v(a){return function(b){return function(c){return h(["EImage",r.castStringToJSString(c)],a,b)}}}function n(a){return function(b){return h(A,a,b)}}function p(a){return function(b){return function(c){var h=map(function(c){return["Tuple2",
49+a/2*Math.cos(2*(Math.PI/50)*c),b/2*Math.sin(2*(Math.PI/50)*c)]}),f=49,d=["Nil"];if(0<=f){do d=["Cons",f,d];while(0<f--)}return j(h(d))(c)}}}for(this.i in Elm.List)eval("var "+this.i+" = Elm.List[this.i];");var r=Elm.JavaScript,y=["DRight"],s=["DDown"],u=["DOut"],q=["Near"],t=["Mid"],w=["Far"],A=["EEmpty"],x=["Solid"],D=["Dotted"],F=["Dashed"],B=["Filled"],E=["Outlined"],z=e(q)(q),C=e(w)(q),G=e(q)(w),H=e(w)(w),I=e(q)(t),J=e(w)(t),q=e(t)(q),w=e(t)(w),t=e(t)(t);return{left:["DLeft"],right:y,down:s,up:["DUp"],
50+inward:["DIn"],outward:u,topLeft:z,topRight:C,bottomLeft:G,bottomRight:H,midLeft:I,midRight:J,midTop:q,midBottom:w,middle:t,middleAt:function(a){return function(b){return["PositionAt",a,b]}},topLeftAt:function(a){return function(b){return["PositionTL",a,b]}},topRightAt:function(a){return function(b){return["PositionTR",a,b]}},bottomLeftAt:function(a){return function(b){return["PositionBL",a,b]}},bottomRightAt:function(a){return function(b){return["PositionBR",a,b]}},absolute:function(a){return["Absolute",
51+a]},relative:function(a){return["Relative",a]},width:function(a){return function(b){var c=b[2];switch(c[0]){case "EImage":case "EVideo":return l(b[2],a,b[4]*a/b[3],b[5],b[6],b[7]);case "EText":return c=Value.getTextSize(a,b[4],c[2]),l(b[2],a,c[1],b[5],b[6],b[7])}return l(b[2],a,b[4],b[5],b[6],b[7])}},height:function(a){return function(b){switch(b[2][0]){case "EImage":case "EVideo":return l(b[2],b[3]*a/b[4],a,b[5],b[6],b[7])}return l(b[2],b[3],a,b[5],b[6],b[7])}},size:function(b){return function(a){return function(c){return l(c[2],
52+b,a,c[5],c[6],c[7])}}},opacity:function(b){return function(a){return l(a[2],a[3],a[4],b,a[6],a[7])}},color:function(a){return function(b){return l(b[2],b[3],b[4],b[5],["Just",a],b[7])}},link:function(b){return function(a){return l(a[2],a[3],a[4],a[5],a[6],["Just",r.castStringToJSString(b)])}},widthOf:c,heightOf:f,sizeOf:function(a){return["Tuple2",~~a[3],~~a[4]]},text:function(a){var b=Value.getTextSize(0,0,a);return h(k("left")(a),b[0],b[1])},asText:function(a){a=Elm.Text.monospace(Value.toText(Value.show(a)));
53+var b=Value.getTextSize(0,0,a);return h(k("left")(a),b[0],b[1])},plainText:function(a){a=Value.toText(a);var b=Value.getTextSize(0,0,a);return h(k("left")(a),b[0],b[1])},centeredText:function(a){var b=Value.getTextSize(0,0,a);return h(k("center")(a),b[0],b[1])},justifiedText:function(a){var b=Value.getTextSize(0,0,a);return h(k("justify")(a),b[0],b[1])},rightedText:function(a){var b=Value.getTextSize(0,0,a);return h(k("right")(a),b[0],b[1])},image:v,images:function(a){var b=Elm.Signal.constant(n(0)(0));
54+a=Elm.Signal.lift(function(a){a=r.castStringToJSString(a);var c=new Image;c.onload=function(){Dispatcher.notify(b.id,v(this.width)(this.height)(a))};c.src=a})(a);return Elm.Signal.lift2(function(a){return function(){return a}})(b)(a)},video:function(a){return function(b){return function(c){return h(["EVideo",r.castStringToJSString(c)],a,b)}}},fittedImage:function(a){return function(b){return function(c){return h(["EFittedImage",r.castStringToJSString(c)],a,b)}}},flow:function(a){return function(d){var e;
55+e=map(c)(d);a:{switch(a[0]){case "DLeft":e=sum(e);break a;case "DRight":e=sum(e);break a}e=maximum(e)}var g;g=map(f)(d);a:{switch(a[0]){case "DDown":g=sum(g);break a;case "DUp":g=sum(g);break a}g=maximum(g)}return h(b(a)(d),e,g)}},above:function(a){return function(c){return h(b(s)(["Cons",a,["Cons",c,["Nil"]]]),Math.max(~~a[3],~~c[3]),~~a[4]+~~c[4])}},below:function(a){return function(c){return h(b(s)(["Cons",c,["Cons",a,["Nil"]]]),Math.max(~~a[3],~~c[3]),~~a[4]+~~c[4])}},beside:function(a){return function(c){return h(b(y)(["Cons",
56+a,["Cons",c,["Nil"]]]),~~a[3]+~~c[3],Math.max(~~a[4],~~c[4]))}},layers:function(a){return h(b(u)(a),maximum(map(c)(a)),maximum(map(f)(a)))},collage:function(a){return function(b){return function(c){return h(["ECollage",a,b,Value.groupForms(c)],a,b)}}},spacer:n,container:function(a){return function(b){return function(c){return function(f){return h(["EContainer",c,f],a,b)}}}},line:d,segment:function(a){return function(b){return d(["Cons",a,["Cons",b,["Nil"]]])}},polygon:j,rect:function(a){return function(b){return function(c){return j(["Cons",
57+["Tuple2",0-a/2,0-b/2],["Cons",["Tuple2",0-a/2,b/2],["Cons",["Tuple2",a/2,b/2],["Cons",["Tuple2",a/2,0-b/2],["Nil"]]]]])(c)}}},oval:p,circle:function(a){return p(2*a)(2*a)},ngon:function(a){return function(b){return function(c){var h=map(function(c){return["Tuple2",b*Math.cos(2*(Math.PI/a)*c),b*Math.sin(2*(Math.PI/a)*c)]}),f=a-1,d=["Nil"];if(0<=f){do d=["Cons",f,d];while(0<f--)}return j(h(d))(c)}}},solid:function(b){return function(c){return a(0)(1)(["Tuple2",0,0])(m(x)(b)(c))}},dotted:function(b){return function(c){return a(0)(1)(["Tuple2",
58+0,0])(m(D)(b)(c))}},dashed:function(b){return function(c){return a(0)(1)(["Tuple2",0,0])(m(F)(b)(c))}},customLine:function(b){return function(c){return function(h){return a(0)(1)(["Tuple2",0,0])(m(["Custom",r.castListToJSArray(b)])(c)(h))}}},filled:function(b){return function(c){return a(0)(1)(c[2])(g(B)(b)(c))}},outlined:function(b){return function(c){return a(0)(1)(c[2])(g(E)(b)(c))}},customOutline:function(b){return function(c){return function(h){return a(0)(1)(h[2])(g(["CustomOutline",r.castListToJSArray(b)])(c)(h))}}},
59+textured:function(b){return function(c){return a(0)(1)(c[2])(g(["Textured",b])(null)(c))}},sprite:function(b){return function(c){return function(h){return function(f){return a(0)(1)(f)(["FImage",c,h,r.castStringToJSString(b)])}}}},toForm:function(b){return function(c){return a(0)(1)(b)(["FElement",c])}},rotate:function(b){return function(c){a:{switch(c[0]){case "Form":var h=c[2],f=c[3],d=c[4];c=a(b+c[1])(h)(f)(d);break a}throw"Non-exhaustive pattern match in case";}return c}},scale:function(b){return function(c){return a(c[1])(b*
60+c[2])(c[3])(c[4])}},move:function(b){return function(c){return function(h){var f;a:{switch(h[0]){case "Form":f=h[1];var d=h[2],e=h[3];h=h[4];switch(e[0]){case "Tuple2":var g=e[1],e=e[2];f=a(f)(d)(["Tuple2",b+g,c+e])(h);break a}}throw"Non-exhaustive pattern match in case";}return f}}},isWithin:Collage.insideForm}}();
61+Elm.Text=function(){function e(a){return Value.toText(a)}var k=function(a){return function(b){return"<"+a+' style="padding:0;margin:0">'+b+"</"+a+">"}},b=function(a,b){return function(f){return"<span style='"+a+":"+b+"'>"+f+"</span>"}},d=function(a){a=Elm.JavaScript.castStringToJSString(a);return b("font-family",a)},j=k("h1"),a=b("font-style","italic"),k=k("b"),m=b("text-decoration","underline"),g=b("text-decoration","overline"),l=b("text-decoration","line-through");return{fromString:e,toText:e,header:j,
62+height:function(a){return b("font-size",a+"em")},italic:a,bold:k,underline:m,overline:g,strikeThrough:l,monospace:d("monospace"),typeface:d,color:function(a){return b("color",Elm.Color.extract(a))},link:function(a){return function(b){return"<a href='"+e(a)+"'>"+b+"</a>"}}}}();
63+var Render=function(){function e(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a}function k(a){return a}function b(a){a.style.styleFloat="left";a.style.cssFloat="left";return a}function d(a){a.style.position="absolute";return a}function j(a,b,f){for(var d=e("div"),g=f.length;g--;){var j=a(b(f[g]));d.appendChild(j)}return d}function a(a){switch(a[0]){case "Absolute":return a[1]+"px";case "Relative":return 100*a[1]+"%"}}function m(b,c){c.style.position="absolute";c.style.margin=
64+"auto";switch(b[0]){case "Position":"Far"!==b[1][0]&&(c.style.left=0);"Near"!==b[1][0]&&(c.style.right=0);"Far"!==b[2][0]&&(c.style.top=0);"Near"!==b[2][0]&&(c.style.bottom=0);break;case "PositionAt":c.style.top=a(b[2]);c.style.left=a(b[1]);var f="translate("+~~(-c.style.width.slice(0,-2)/2)+"px,"+~~(-c.style.height.slice(0,-2)/2)+"px)";c.style.transform=f;c.style.msTransform=f;c.style.MozTransform=f;c.style.webkitTransform=f;c.style.OTransform=f;break;default:f=b[0].slice(-2),c.style["T"===f[0]?
65+"top":"bottom"]=a(b[2]),c.style["L"===f[1]?"left":"right"]=a(b[1])}}function g(a){var c={};switch(a[2][0]){case "EText":var c=a[2][1],f=a[2][2],l=e("div");l.innerHTML=f;l.style.textAlign=c;c=l;break;case "EImage":c=a[2][1];f=e("img");f.src=c;f.name=c;f.style.display="block";c=f;break;case "EVideo":l=a[2][1];c=e("video");c.controls="controls";f=e("source");f.src=l;l=l.split(".");f.type="video/"+l[l.length-1];c.appendChild(f);c.style.display="block";break;case "EFittedImage":var n=a[3],p=a[4],c=a[2][1],
66+f=e("div");f.style.width=n+"px";f.style.height=p+"px";f.style.position="relative";f.style.overflow="hidden";var r=e("img");r.onload=function(){r.style.position="absolute";r.style.margin="auto";var a=n,b=p;n/p>this.width/this.height?b=Math.round(this.height*n/this.width):a=Math.round(this.width*p/this.height);r.style.width=a+"px";r.style.height=b+"px";r.style.left=(n-a)/2+"px";r.style.top=(p-b)/2+"px"};r.src=c;r.name=c;f.appendChild(r);c=f;break;case "EFlow":a:{c=a[2][2];switch(a[2][1][0]){case "DDown":c=
67+c.slice(0).reverse();case "DUp":c=j(k,g,c);break a;case "DRight":c=c.slice(0).reverse();case "DLeft":c=j(b,g,c);break a;case "DOut":c=c.slice(0).reverse();case "DIn":c=j(d,g,c);break a}c=void 0}break;case "ECollage":c=Collage.collage(a[2][1],a[2][2],a[2][3]);break;case "EEmpty":c=e("div");break;case "EContainer":f=a[2][1];c=g(a[2][2]);m(f,c);f=e("div");f.style.position="relative";f.style.overflow="hidden";f.appendChild(c);c=f;break;case "EHtml":c=a[2][1];"button"!==c.type&&(f=Value.getExcess(c),a[3]-=
68+f[0],a[4]-=f[1]);break;case "EExternalHtml":c=e("div"),c.appendChild(a[2][1])}c.id=a[1];c.style.width=~~a[3]+"px";c.style.height=~~a[4]+"px";1!==a[5]&&(c.style.opacity=a[5]);"Just"===a[6][0]&&(c.style.backgroundColor=Elm.Color.extract(a[6][1]));return"Just"===a[7][0]?(f=e("a"),f.href=a[7][1],f.appendChild(c),f):c}function l(a,c,f){"A"===a.tagName&&(a=a.firstChild);if(c[1]!==f[1]){if(c[2][0]!==f[2][0])return a.parentNode.replaceChild(g(f),a);var e=f[2],j=c[2];switch(e[0]){case "EText":e[1]!==j[1]&&
69+(a.style.textAlign=e[1]);e[2]!==j[2]&&(a.innerHTML=e[2]);break;case "EImage":e[1]!==j[1]&&(a.src=e[1]);break;case "EVideo":case "EFittedImage":if(!Value.eq(e,j)||f[3]!==c[3]||f[4]!==c[4])return a.parentNode.replaceChild(g(f),a);break;case "ECollage":if(e[1]!==j[1]||e[2]!==j[2]||e[3].length!==j[3].length)return a.parentNode.replaceChild(g(f),a);Collage.updateCollage(a,j[3],e[3]);break;case "EFlow":if(e[1]!==j[1])return a.parentNode.replaceChild(g(f),a);var p=e[2],r=a.childNodes;if(p.length!==r.length)return a.parentNode.replaceChild(g(f),
70+a);var j=j[2],y=function(a){return a};switch(e[1][0]){case "DDown":case "DUp":y=k;break;case "DRight":case "DLeft":y=b;break;case "DOut":case "DIn":y=d}for(e=r.length;e--;)l(r[e],j[e],p[e]),y(r[e]);break;case "EContainer":l(a.childNodes[0],j[2],e[2]);m(e[1],a.childNodes[0]);break;case "EHtml":f[1]!==c[1]&&(p=g(f),a.parentNode.replaceChild(p,a),a=p);"button"!==p.type&&(e=Value.getExcess(a),f[3]-=e[0],f[4]-=e[1]);break;case "EExternalHtml":f[1]!==c[1]&&a.parentNode.replaceChild(g(f),a)}f[3]!==c[3]&&
71+(a.style.width=~~f[3]+"px");f[4]!==c[4]&&(a.style.height=~~f[4]+"px");f[5]!==c[5]&&(a.style.opacity=f[5]);2===f[6].length&&(e=Elm.Color.extract(f[6][1]),e!==a.style.backgroundColor&&(a.style.backgroundColor=e));if(2===f[7].length&&(1===c[7].length||f[7][1]!==c[7][1]))a.parentNode.href=f[7][1];f[1]=c[1]}}return{render:g,update:l,addTo:function(a,b){a.appendChild(b)},newElement:e,flowWith:j,goIn:d}}();
72+Elm.Signal=function(){function e(a){this.id=Guid.guid();this.value=a;this.kids=[];this.defaultNumberOfKids=0;this.recv=function(a,b,c){if(b=b===this.id)this.value=c;l(this,a,b);return b};Dispatcher.inputs.push(this)}function k(a,b){this.id=Guid.guid();this.value=null;this.kids=[];this.count=0;this.changed=!1;b.reverse();this.recalc=function(){for(var d=a,e=b.length;e--;)d=d(b[e].value);this.value=d};this.recalc();this.recv=function(a,c){this.count+=1;c&&(this.changed=!0);this.count==b.length&&(this.changed&&
73+this.recalc(),l(this,a,this.changed),this.changed=!1,this.count=0)};for(var d=b.length;d--;)b[d].kids.push(this)}function b(a,b,d,e){this.id=Guid.guid();this.value=d?b(e.value):b;this.kids=[];this.recv=function(b,d){d&&(this.value=a(e.value)(this.value));l(this,b,d)};e.kids.push(this)}function d(a,b,d){this.id=Guid.guid();this.value=a(d.value)?b:d.value;this.kids=[];this.recv=function(b,f){var e=f&&!a(d.value);e&&(this.value=d.value);l(this,b,e)};d.kids.push(this)}function j(a){this.id=Guid.guid();
74+this.value=a.value;this.kids=[];this.recv=function(b,d){var e=d&&!Value.eq(this.value,a.value);e&&(this.value=a.value);l(this,b,e)};a.kids.push(this)}function a(a,b){this.id=Guid.guid();var d=(new window.Date).getTime();this.value=a?Value.Tuple(d,b.value):d;this.kids=[];this.recv=function(d,e){e&&(this.value=a?Value.Tuple(d,b.value):d);l(this,d,e)};b.kids.push(this)}function m(a,b){this.id=Guid.guid();this.value=b.value;this.kids=[];this.count=0;this.changed=!1;this.recv=function(d,e,g){g===a.id&&
75+(this.changed=e);this.count+=1;2==this.count&&(this.changed&&(this.value=b.value),l(this,d,this.changed),this.count=0,this.changed=!1)};a.kids.push(this);b.kids.push(this)}function g(a,b){this.id=Guid.guid();this.value=a.value;this.kids=[];this.next=null;this.count=0;this.changed=!1;this.recv=function(d,e,g){this.count+=1;e&&(this.changed=!0,g==b.id&&null===this.next&&(this.next=b.value),g==a.id&&(this.next=a.value));2==this.count&&(this.changed&&(this.value=this.next,this.next=null),l(this,d,this.changed),
76+this.changed=!1,this.count=0)};a.kids.push(this);b.kids.push(this)}var l=function(a,b,d){for(var e=a.kids,g=e.length;g--;)e[g].recv(b,d,a.id)},h=function(a){return function(b){return function(e){e=new k(function(a){return function(b){return[a,b]}},[a,e]);e=new d(function(a){return a[0]},[!0,b],e);return new k(function(a){return a[1]},[e])}}};return{constant:function(a){return new e(a)},lift:function(a){return function(b){return new k(a,[b])}},lift2:function(a){return function(b){return function(d){return new k(a,
77+[b,d])}}},lift3:function(a){return function(b){return function(d){return function(e){return new k(a,[b,d,e])}}}},lift4:function(a){return function(b){return function(d){return function(e){return function(g){return new k(a,[b,d,e,g])}}}}},lift5:function(a){return function(b){return function(d){return function(e){return function(g){return function(h){return new k(a,[b,d,e,g,h])}}}}}},lift6:function(a){return function(b){return function(d){return function(e){return function(g){return function(h){return function(j){return new k(a,
78+[b,d,e,g,h,j])}}}}}}},lift7:function(a){return function(b){return function(d){return function(e){return function(g){return function(h){return function(j){return function(l){return new k(a,[b,d,e,g,h,j,l])}}}}}}}},lift8:function(a){return function(b){return function(d){return function(e){return function(g){return function(h){return function(j){return function(l){return function(m){return new k(a,[b,d,e,g,h,j,l,m])}}}}}}}}},foldp:function(a){return function(d){return function(e){return new b(a,d,!1,
79+e)}}},foldp_:function(a){return function(d){return function(e){return new b(a,d,!0,e)}}},foldp1:function(a){return function(d){return new b(a,function(a){return a},!0,d)}},delay:function(a){return function(b){var d=new e(b.value),g=!0;b=new m(d,new k(function(a){return function(){return a}},[d,new k(function(b){g||setTimeout(function(){Dispatcher.notify(d.id,b)},a)},[b])]));g=!1;return b}},merge:function(a){return function(b){return new g(a,b)}},merges:function(a){return Elm.List.foldl1(function(a){return function(b){return new g(a,
80+b)}})(a)},average:function(a){return function(b){for(var d=Array(a),e=a;e--;)d[e]=0;var e=0,g=!1,h=0;return new k(function(b){h+=b-d[e];d[e]=b;b=h/Math.max(1,g?a:e);++e==a&&(g=!0,e=0);return b},[b])}},count:function(a){return new b(function(){return function(a){return a+1}},0,!1,a)},countIf:function(a){return function(d){return new b(function(b){return function(d){return a(b)?d+1:d}},0,!1,d)}},keepIf:function(a){return function(b){return function(e){return new d(function(b){return!a(b)},b,e)}}},dropIf:function(a){return function(b){return function(e){return new d(a,
81+b,e)}}},keepWhen:function(a){return h(new k(function(a){return!a},[a]))},dropWhen:h,dropRepeats:function(a){return new j(a)},sampleOn:function(a){return function(b){return new m(a,b)}},timestamp:function(b){return new a(!0,b)},timeOf:function(b){return new a(!1,b)}}}();
82+var Dispatcher=function(){function e(b){if(!b.hasOwnProperty("defaultNumberOfKids"))return!0;var a=b.kids.length;if(0==a)return!1;if(a>b.defaultNumberOfKids)return!0;for(var d=!1;a--;)d=d||e(b.kids[a]);return d}var k=null,b=[],d=null;return{initialize:function(){k=Elm.main();k.hasOwnProperty("recv")||(k=Elm.Signal.constant(k));d=k.value;for(var j=[],a=b.length;a--;)e(b[a])&&j.push(b[a]);b=j;document.getElementById("content").appendChild(Render.render(d));j=document.getElementById("widthChecker").offsetWidth;
83+j!==window.innerWidth&&Dispatcher.notify(Elm.Window.dimensions.id,Value.Tuple(j,window.innerHeight));k=Elm.Signal.lift(function(a){var b=document.getElementById("content");Render.update(b.firstChild,d,a);return d=a})(k)},notify:function(d,a){for(var e=(new window.Date).getTime(),g=!1,k=b.length;k--;)g=b[k].recv(e,d,a)||g;return g},inputs:b}}();
84+Elm.HTTP=function(){function e(b){return function(d){return function(e){return function(c){return{"0":"Request",length:1,verb:a.castStringToJSString(b),url:a.castStringToJSString(d),data:null===e?null:a.castStringToJSString(e),headers:c}}}}}function k(a){return e("GET")(a)(null)(["Nil"])}function b(b,e){return function(h){if(""!==h.url){var c={value:["Waiting"]};b.push(c);var f=null;window.ActiveXObject&&(f=new ActiveXObject("Microsoft.XMLHTTP"));window.XMLHttpRequest&&(f=new XMLHttpRequest);f.onreadystatechange=
85+function(){4===f.readyState&&(c.value=200===f.status?["Success",m(f.responseText)]:["Failure",f.status,m(f.statusText)],setTimeout(function(){d(b,e)},0))};f.open(h.verb,h.url,!0);Elm.List.map(function(b){f.setRequestHeader(a.castStringToJSString(b[1]),a.castStringToJSString(b[2]))})(h.headers);f.send(h.data)}}}function d(a,b){0<a.length&&(Dispatcher.notify(b.id,a[0].value),"Waiting"!==a[0].value[0]&&(a.shift(),setTimeout(function(){d(a,b)},0)))}function j(a){var d=Elm.Signal.constant(["Waiting"]);
86+a=Elm.Signal.lift(b([],d))(a);return Elm.Signal.lift2(function(a){return function(){return a}})(d)(a)}var a=Elm.JavaScript,m=Elm.JavaScript.castJSStringToString;return{get:k,post:function(a){return function(b){return e("POST")(a)(b)(["Nil"])}},request:e,send:j,sendGet:function(a){return j(Elm.Signal.lift(k)(a))}}}();
87+Elm.Input=function(){var e=Elm.JavaScript,k=Elm.JavaScript.castJSStringToString,b=function(a,b){a.placeholder=e.castStringToJSString(b);var d=Elm.Signal.constant(["Nil"]);Value.addListener(a,"keyup",function(){Dispatcher.notify(d.id,k(a.value));a.focus()});a.style.padding="1px";return Value.Tuple(Value.wrap(a),d)},d=function(a){a=document.createElement(a);a.style.padding="0";a.style.margin="0";return a},j=function(a){for(var b=d("select"),e=[];"Cons"===a[0];){var j=d("option"),h=Value.toText(a[1][1]);
88+j.value=h;j.innerHTML=h;b.appendChild(j);e.push(a[1][2]);a=a[2]}var c=Elm.Signal.constant(e[0]);Value.addListener(b,"change",function(){Dispatcher.notify(c.id,e[b.selectedIndex])});return Value.Tuple(Value.wrap(b),c)};return{textArea:function(a){return function(e){var g=d("textarea");g.rows=e;g.cols=a;return b(g,"")}},textField:function(a){var e=d("input");e.type="text";return b(e,a)},password:function(a){var e=d("input");e.type="password";return b(e,a)},checkbox:function(a){var b=d("input");b.type=
89+"checkbox";b.checked=a;var e=Elm.Signal.constant(a);Value.addListener(b,"change",function(){Dispatcher.notify(e.id,b.checked)});return Value.Tuple(Value.wrap(b),e)},dropDown:j,stringDropDown:function(a){return j(Elm.List.map(function(a){return Value.Tuple(a,a)})(a))},button:function(a){var b=d("input");b.type="button";b.value=e.castStringToJSString(a);var g=Elm.Signal.constant(!1);Value.addListener(b,"click",function(){Dispatcher.notify(g.id,!0);Dispatcher.notify(g.id,!1)});return Value.Tuple(Value.wrap(b),
90+g)}}}();
91+Elm.Keyboard={Raw:function(){function e(b,j){return"Nil"===j[0]?j:j[1]===b?j[2]:["Cons",j[1],e(b,j[2])]}var k=Elm.Signal.constant(["Nil"]),b=Elm.Signal.constant(["Nothing"]);Value.addListener(document,"keydown",function(b){var e;a:{for(e=k.value;"Nil"!==e[0];){if(e[1]===b.keyCode){e=!0;break a}e=e[2]}e=!1}e||Dispatcher.notify(k.id,["Cons",b.keyCode,k.value])||this.removeEventListener("keydown",arguments.callee,!1)});Value.addListener(document,"keyup",function(b){var j=e(b.keyCode,k.value);Dispatcher.notify(k.id,
92+j)||this.removeEventListener("keyup",arguments.callee,!1)});Value.addListener(window,"blur",function(b){Dispatcher.notify(k.id,["Nil"])||this.removeEventListener("blur",arguments.callee,!1)});Value.addListener(document,"keypress",function(d){var e=Dispatcher.notify(b.id,["Just",d.charCode||d.keyCode]);Dispatcher.notify(b.id,["Nothing"]);e||this.removeEventListener("keypress",arguments.callee,!1)});return{keysDown:k,charPressed:b}}()};
93+Elm.Mouse=function(){function e(a){var b=0,d=0;a||(a=window.event);if(a.pageX||a.pageY)b=a.pageX,d=a.pageY;else if(a.clientX||a.clientY)b=a.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,d=a.clientY+document.body.scrollTop+document.documentElement.scrollTop;return Value.Tuple(b,d)}var k=Elm.Signal.constant(Value.Tuple(0,0));k.defaultNumberOfKids=2;var b=Elm.Signal.lift(function(a){return a[1]})(k);b.defaultNumberOfKids=0;var d=Elm.Signal.lift(function(a){return a[2]})(k);d.defaultNumberOfKids=
94+0;var j=Elm.Signal.constant(!1),a=Elm.Signal.constant(!1),m=Elm.Signal.constant(Value.Tuple());Value.addListener(document,"click",function(b){var d=Dispatcher.notify(a.id,!0),e=Dispatcher.notify(m.id,Value.Tuple());Dispatcher.notify(a.id,!1);!d&&!e&&this.removeEventListener("click",arguments.callee,!1)});Value.addListener(document,"mousedown",function(a){Dispatcher.notify(j.id,!0)||this.removeEventListener("mousedown",arguments.callee,!1)});Value.addListener(document,"mouseup",function(a){Dispatcher.notify(j.id,
95+!1)||this.removeEventListener("mouseup",arguments.callee,!1)});Value.addListener(document,"mousemove",function(a){Dispatcher.notify(k.id,e(a))||this.removeEventListener("mousemove",arguments.callee,!1)});return{position:k,x:b,y:d,isClicked:a,isDown:j,clicks:m,isClickedOn:function(a){a=Render.render(a);var b=Elm.Signal.constant(!1);Value.addListener(a,"click",function(){Dispatcher.notify(b.id,!0);Dispatcher.notify(b.id,!1)});return Value.Tuple(Value.wrap(a),b)}}}();
96+Elm.Random=function(){return{inRange:function(e){return function(k){return Elm.Signal.constant(Math.floor(Math.random()*(k-e+1))+e)}},randomize:function(e){return function(k){return function(b){return Elm.Signal.lift(function(){return Math.floor(Math.random()*(k-e+1))+e})(b)}}}}}();
97+Elm.Time=function(){function e(){return(new window.Date).getTime()}function k(b){return function(d){var j=1E3/b,a=e(),k=a,g=0,l=!0,h=Elm.Signal.constant(g),c=0;return Elm.Signal.lift2(function(b){return function(d){if(b){var n=!l&&b;c=setTimeout(function(){k=e();g=n?0:k-a;a=k;Dispatcher.notify(h.id,g)},j)}else l&&clearTimeout(c);l=b;return d}})(d)(h)}}Elm.Signal.constant(!0);return{fpsWhen:k,fps:function(b){return k(b)(Elm.Signal.constant(!0))},every:function(b){var d=Elm.Signal.constant(e());setInterval(function(){Dispatcher.notify(d.id,
98+e())},b);return d},delay:Elm.Signal.delay,since:function(b){return function(d){var e=Elm.Signal.count(Elm.Signal.delay(b)(d));return Elm.Signal.lift2(function(a){return function(b){return!Value.eq(a,b)}})(Elm.Signal.count(d))(e)}},after:function(b){b*=1E3;var d=Elm.Signal.constant(!1);setTimeout(function(){Dispatcher.notify(d.id,!0)},b);return d},before:function(b){b*=1E3;var d=Elm.Signal.constant(!0);setTimeout(function(){Dispatcher.notify(d.id,!1)},b);return d},hour:36E5,minute:6E4,second:1E3,ms:1,
99+inHours:function(b){return b/36E5},inMinutes:function(b){return b/6E4},inSeconds:function(b){return b/1E3},inMss:function(b){return b},toDate:function(b){return new window.Date(b)},read:function(b){b=window.Date.parse(b);return isNaN(b)?["Nothing"]:["Just",b]}}}();
100+Elm.Window=function(){var e=Elm.Signal.constant(Value.Tuple(window.innerWidth,window.innerHeight));e.defaultNumberOfKids=2;var k=Elm.Signal.lift(function(b){return b[1]})(e);k.defaultNumberOfKids=0;var b=Elm.Signal.lift(function(b){return b[2]})(e);b.defaultNumberOfKids=0;Value.addListener(window,"resize",function(b){var j=document.getElementById("widthChecker").offsetWidth;Dispatcher.notify(e.id,Value.Tuple(j,window.innerHeight))||this.removeEventListener("resize",arguments.callee,!1)});return{dimensions:e,
101+width:k,height:b}}();
102+Elm.Date=function(){var e="Sun Mon Tue Wed Thu Fri Sat".split(" "),k="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ");return{read:function(b){b=new window.Date(Elm.JavaScript.castStringToJSString(b));return isNaN(b.getTime())?["Nothing"]:["Just",b]},year:function(b){return b.getFullYear()},month:function(b){return[k[b.getMonth()]]},day:function(b){return b.getDate()},hour:function(b){return b.getHours()},minute:function(b){return b.getMinutes()},second:function(b){return b.getSeconds()},dayOfWeek:function(b){return[e[b.getDay()]]},
103+toTime:function(b){return b.getTime()},Mon:["Mon"],Tue:["Tue"],Wed:["Wed"],Thu:["Thu"],Fri:["Fri"],Sat:["Sat"],Sun:["Sun"],Jan:["Jan"],Feb:["Feb"],Mar:["Mar"],Apr:["Apr"],May:["May"],Jun:["Jun"],Jul:["Jul"],Aug:["Aug"],Sep:["Sep"],Oct:["Oct"],Nov:["Nov"],Dec:["Dec"]}}();Value.addListener(document,"elm_log",function(e){console.log(e.value)});Value.addListener(document,"elm_title",function(e){document.title=e.value});
104+Value.addListener(document,"elm_redirect",function(e){0<e.value.length&&(window.location=e.value)});
105+Elm.Prelude=function(){function e(b){return function(d){if(b instanceof Array&&d instanceof Array){var j=b.length;if(j==d.length){for(var a=1;a<j;++a){var k=e(b[a])(d[a]);if("EQ"!==k[0])return k}return["EQ"]}return[1==d.length?"GT":"LT"]}return[b===d?"EQ":b<d?"LT":"GT"]}}var k=function(b){return function(d){var e=b%d,e=0==b?0:0<d?0<=b?e:e+d:-k(-b)(-d);return e==d?0:e}};return{eq:Value.eq,id:function(b){return b},not:function(b){return!b},fst:function(b){return b[1]},snd:function(b){return b[2]},rem:function(b){return function(d){return b%
106+d}},div:function(b){return function(d){return~~(b/d)}},otherwise:!0,compare:e,toFloat:function(b){return b},round:function(b){return Math.round(b)},floor:function(b){return Math.floor(b)},ceiling:function(b){return Math.ceil(b)},truncate:function(b){return~~b},readInt:function(b){b=Elm.JavaScript.castStringToJSString(b);var d=b.length;if(0===d)return["Nothing"];var e=0;if("-"==b[0]){if(1===d)return["Nothing"];e=1}for(;e<d;++e)if(!Elm.Char.isDigit(b[e]))return["Nothing"];return["Just",parseInt(b)]},
107+readFloat:function(b){b=Elm.JavaScript.castStringToJSString(b);var d=b.length;if(0===d)return["Nothing"];var e=0;if("-"==b[0]){if(1===d)return["Nothing"];e=1}for(var a=0;e<d;++e)if(!Elm.Char.isDigit(b[e])){if("."===b[e]&&(a+=1,1>=a))continue;return["Nothing"]}return["Just",parseFloat(b)]},sqrt:Math.sqrt,abs:Math.abs,pi:Math.PI,e:Math.E,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:Math.asin,acos:Math.acos,atan:Math.atan,atan2:function(b){return function(d){return Math.atan2(b,d)}},mod:k,min:function(b){return function(d){return Math.min(b,
108+d)}},max:function(b){return function(d){return Math.max(b,d)}},flip:function(b){return function(d){return function(e){return b(e)(d)}}},clamp:function(b){return function(d){return function(e){return Math.min(d,Math.max(b,e))}}},curry:function(b){return function(d){return function(e){return b(["Tuple2",d,e])}}},uncurry:function(b){return function(d){if("Tuple2"!==d[0])throw"Function was uncurry'd but was not given a pair.";return b(d[1])(d[2])}},logBase:function(b){return function(d){return Math.log(d)/
109+Math.log(b)}},Just:Elm.Maybe.Just,Nothing:Elm.Maybe.Nothing,maybe:Elm.Maybe.maybe,map:Elm.List.map,zip:Elm.List.zip,zipWith:Elm.List.zipWith,filter:Elm.List.filter,head:Elm.List.head,tail:Elm.List.tail,last:Elm.List.last,length:Elm.List.length,reverse:Elm.List.reverse,foldr:Elm.List.foldr,foldr1:Elm.List.foldr1,foldl:Elm.List.foldl,foldl1:Elm.List.foldl1,and:Elm.List.and,or:Elm.List.or,all:Elm.List.all,any:Elm.List.any,sum:Elm.List.sum,product:Elm.List.product,concat:Elm.List.concat,concatMap:Elm.List.concatMap,
110+maximum:Elm.List.maximum,minimum:Elm.List.minimum,scanl:Elm.List.scanl,scanl1:Elm.List.scanl1,take:Elm.List.take,drop:Elm.List.drop,zip:Elm.List.zip,unzip:Elm.List.unzip,lift:Elm.Signal.lift,lift2:Elm.Signal.lift2,lift3:Elm.Signal.lift3,lift4:Elm.Signal.lift4,lift5:Elm.Signal.lift5,lift6:Elm.Signal.lift6,lift7:Elm.Signal.lift7,lift8:Elm.Signal.lift8,foldp:Elm.Signal.foldp,foldp1:Elm.Signal.foldp1,foldp_:Elm.Signal.foldp_,constant:Elm.Signal.constant,merge:Elm.Signal.merge,count:Elm.Signal.count,countIf:Elm.Signal.countIf,
111+average:Elm.Signal.average,keepIf:Elm.Signal.keepIf,dropIf:Elm.Signal.dropIf,keepWhen:Elm.Signal.keepWhen,dropWhen:Elm.Signal.dropWhen,dropRepeats:Elm.Signal.dropRepeats,sampleOn:Elm.Signal.sampleOn,timestamp:Elm.Signal.timestamp,timeOf:Elm.Signal.timeOf}}();(function(){var e=function(e){for(var b in e)Elm.Prelude[b]=e[b]};e(Elm.Color);e(Elm.Text);e(Elm.Graphics);e(Elm.Time);show=Value.show})();
112+Elm.Dict=function(){function e(a){return function(b){return function(c){return function(e){return function(d){return["RBNode",a,b,c,e,d]}}}}}function k(a){a:{switch(a[0]){case "RBEmpty":throw"(min RBEmpty) is not defined";case "RBNode":switch(a[4][0]){case "RBEmpty":a=["Tuple2",a[2],a[3]];break a}a=k(a[4]);break a}throw"Non-exhaustive pattern match in case";}return a}function b(a){return function(c){var e;a:{switch(c[0]){case "RBEmpty":e=w;break a;case "RBNode":e=function(){switch(q(a)(c[2])[0]){case "EQ":return A(c[3]);
113+case "GT":return b(a)(c[5]);case "LT":return b(a)(c[4])}throw"Non-exhaustive pattern match in case";}();break a}throw"Non-exhaustive pattern match in case";}return e}}function d(a){return function(b){return function(c){var e;a:{switch(c[0]){case "RBEmpty":e=a;break a;case "RBNode":e=function(){switch(q(b)(c[2])[0]){case "EQ":return c[3];case "GT":return d(a)(b)(c[5]);case "LT":return d(a)(b)(c[4])}throw"Non-exhaustive pattern match in case";}();break a}throw"Non-exhaustive pattern match in case";
114+}return e}}}function j(a){return function(c){return F(b(a)(c))}}function a(a){a:{switch(a[0]){case "RBNode":switch(a[5][0]){case "RBNode":a=e(a[1])(a[5][2])(a[5][3])(e(B)(a[2])(a[3])(a[4])(a[5][4]))(a[5][5]);break a}}throw"rotateLeft of a node without enough children";}return a}function m(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":a=e(a[1])(a[4][2])(a[4][3])(a[4][4])(e(B)(a[2])(a[3])(a[4][5])(a[5]));break a}}throw"rotateRight of a node without enough children";}return a}function g(a){a:{switch(a[0]){case "Black":a=
115+B;break a;case "Red":a=E;break a}throw"Non-exhaustive pattern match in case";}return a}function l(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[5][0]){case "RBNode":a=e(g(a[1]))(a[2])(a[3])(e(g(a[4][1]))(a[4][2])(a[4][3])(a[4][4])(a[4][5]))(e(g(a[5][1]))(a[5][2])(a[5][3])(a[5][4])(a[5][5]));break a}}}throw"color_flip called on a RBEmpty or RBNode with a RBEmpty child";}return a}function h(b){a:switch(b[0]){case "RBNode":switch(b[5][0]){case "RBNode":switch(b[5][1][0]){case "Red":b=
116+a(b);break a}}}a:switch(b[0]){case "RBNode":switch(b[4][0]){case "RBNode":switch(b[4][1][0]){case "Red":switch(b[4][4][0]){case "RBNode":switch(b[4][4][1][0]){case "Red":b=m(b);break a}}}}}a:switch(b[0]){case "RBNode":switch(b[4][0]){case "RBNode":switch(b[4][1][0]){case "Red":switch(b[5][0]){case "RBNode":switch(b[5][1][0]){case "Red":b=l(b);break a}}}}}return b}function c(a){a:switch(a[0]){case "RBNode":switch(a[1][0]){case "Red":a=e(E)(a[2])(a[3])(a[4])(a[5]);break a}}return a}function f(a){return function(b){return function(d){var f=
117+function(c){var d;a:{switch(c[0]){case "RBEmpty":d=e(B)(a)(b)(z)(z);break a;case "RBNode":d=function(){switch(q(a)(c[2])[0]){case "EQ":return e(c[1])(c[2])(b)(c[4])(c[5]);case "GT":return e(c[1])(c[2])(c[3])(c[4])(f(c[5]));case "LT":return e(c[1])(c[2])(c[3])(f(c[4]))(c[5])}throw"Non-exhaustive pattern match in case";}();d=h(d);break a}throw"Non-exhaustive pattern match in case";}return d};return c(f(d))}}}function v(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[4][1][0]){case "Red":a=
118+!0;break a}}}a=!1}return a}function n(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBNode":switch(a[4][4][0]){case "RBNode":switch(a[4][4][1][0]){case "Red":a=!0;break a}}}}a=!1}return a}function p(b){if(x(v(b))&&x(n(b))){b=l(b);a:switch(b[0]){case "RBNode":b:switch(b[5][0]){case "RBNode":switch(b[5][4][0]){case "RBNode":switch(b[5][4][1][0]){case "Red":b=l(a(e(b[1])(b[2])(b[3])(b[4])(m(b[5]))));break b}}}break a}}return b}function r(a){return function(b){var d=function(b){a:{switch(b[0]){case "RBEmpty":b=
119+z;break a;case "RBNode":if("LT"===q(a)(b[2])[0])b:{b=p(b);switch(b[0]){case "RBEmpty":throw"delLT on RBEmpty";case "RBNode":b=h(e(b[1])(b[2])(b[3])(d(b[4]))(b[5]));break b}break}else{var f=v(b)?m(b):b,g;b:{switch(f[0]){case "RBNode":switch(f[5][0]){case "RBEmpty":g=D(a,f[2]);break b}}g=!1}if(g)b=f[4];else{f=x;b:{switch(b[0]){case "RBNode":switch(b[5][0]){case "RBNode":switch(b[5][1][0]){case "Red":g=!0;break b}}}g=!1}if(f=f(g)){f=x;b:{switch(b[0]){case "RBNode":switch(b[5][0]){case "RBNode":switch(b[5][4][0]){case "RBNode":switch(b[5][4][1][0]){case "Red":g=
120+!0;break b}}}}g=!1}f=f(g)}f&&(b=l(b),b=n(b)?l(m(b)):b);b:{switch(b[0]){case "RBNode":f=D(a,b[2]);break b}f=!1}if(f)b:{switch(b[0]){case "RBEmpty":throw"delEQ called on a RBEmpty";case "RBNode":g=k(b[5]);c:{switch(g[0]){case "Tuple2":f=g[1];break c}break}c:{switch(g[0]){case "Tuple2":g=g[2];break c}break}var f=e(b[1])(f)(g)(b[4]),j=function(a){a:{switch(a[0]){case "RBNode":switch(a[4][0]){case "RBEmpty":a=z;break a}}b:{a=p(a);switch(a[0]){case "RBEmpty":a=z;break b;case "RBNode":a=h(e(a[1])(a[2])(a[3])(j(a[4]))(a[5]));
121+break b}throw"Non-exhaustive pattern match in case";}}return a};b=c(j(b[5]));b=h(f(b));break b}break}else b:{switch(b[0]){case "RBEmpty":throw"delGT called on a RBEmpty";case "RBNode":b=h(e(b[1])(b[2])(b[3])(b[4])(d(b[5])));break b}break}}}break a}throw"Non-exhaustive pattern match in case";}return b};return j(a)(b)?c(d(b)):b}}function y(a){return function(b){a:{switch(b[0]){case "RBEmpty":b=z;break a;case "RBNode":b=e(b[1])(b[2])(a(b[3]))(y(a)(b[4]))(y(a)(b[5]));break a}throw"Non-exhaustive pattern match in case";
122+}return b}}function s(a){return function(b){return function(c){a:{switch(c[0]){case "RBEmpty":c=b;break a;case "RBNode":c=s(a)(a(c[2])(c[3])(s(a)(b)(c[4])))(c[5]);break a}throw"Non-exhaustive pattern match in case";}return c}}}function u(a){return function(b){return function(c){a:{switch(c[0]){case "RBEmpty":c=b;break a;case "RBNode":c=u(a)(a(c[2])(c[3])(u(a)(b)(c[5])))(c[4]);break a}throw"Non-exhaustive pattern match in case";}return c}}}var q=Elm.Prelude.compare,t=Elm.Prelude.uncurry,w=Elm.Prelude.Nothing,
123+A=Elm.Prelude.Just,x=Elm.Prelude.not,D=Elm.Prelude.eq,F=Elm.Maybe.isJust,B=["Red"],E=["Black"],z=["RBEmpty"],C=z;return{$op:{},empty:C,lookup:b,findWithDefault:d,member:j,insert:f,singleton:function(a){return function(b){return f(a)(b)(z)}},remove:r,map:y,foldl:s,foldr:u,union:function(a){return function(b){return s(f)(b)(a)}},intersect:function(a){return function(b){return s(function(a){return function(c){return function(d){return j(a)(b)?f(a)(c)(d):d}}})(C)(a)}},diff:function(a){return function(b){return s(function(a){return function(){return function(b){return r(a)(b)}}})(a)(b)}},
124+keys:function(a){return u(function(a){return function(){return function(b){return["Cons",a,b]}}})(["Nil"])(a)},values:function(a){return u(function(){return function(a){return function(b){return["Cons",a,b]}}})(["Nil"])(a)},toList:function(a){return u(function(a){return function(b){return function(c){return["Cons",["Tuple2",a,b],c]}}})(["Nil"])(a)},fromList:function(a){return Elm.List.foldl(t(f))(C)(a)}}}();
125+Elm.Set=function(){var e=Elm.Dict.empty,k=Elm.Dict.remove,b=Elm.Dict.member,d=Elm.Dict.union,j=Elm.Dict.intersect,a=Elm.Dict.diff,m=Elm.Dict.keys,g=Elm.List.foldl(function(a){return function(b){return Elm.Dict.insert(a)(["Tuple0"])(b)}})(e);return{empty:e,singleton:function(a){return Elm.Dict.singleton(a)(["Tuple0"])},insert:function(a){return Elm.Dict.insert(a)(["Tuple0"])},remove:k,member:b,union:d,intersect:j,diff:a,toList:m,fromList:g,foldl:function(a){return Elm.Dict.foldl(function(b){return function(){return function(c){return a(b)(c)}}})},
126+foldr:function(a){return Elm.Dict.foldr(function(b){return function(){return function(c){return a(b)(c)}}})},map:function(a){return function(b){b=m(b);return g(Elm.List.map(a)(b))}}}}();
127+(function(){try{var e={};for(this.i in Elm)eval("var "+this.i+"=Elm[this.i];");if(Elm.Automaton)throw"Module name collision, 'Automaton' is already defined.";Elm.Automaton=function(){function b(a){return["Automaton",a]}function d(a){return b(function(b){var c=unzip(map(function(a){a:{switch(a[0]){case "Automaton":a=a[1](b);break a}throw"Non-exhaustive pattern match in case";}return a})(a)),e;a:{switch(c[0]){case "Tuple2":e=c[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(c[0]){case "Tuple2":c=
128+c[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",e,d(c)]})}function j(a){return b(function(b){return["Tuple2",a(b),j(a)]})}function a(c){return function(d){return b(function(b){b=d(b)(c);return["Tuple2",b,a(b)(d)]})}}function k(a){return function(c){return b(function(b){var d=c(b)(a);a:{switch(d[0]){case "Tuple2":b=d[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(d[0]){case "Tuple2":d=d[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",
129+b,k(d)(c)]})}}function g(a){return function(b){a:{switch(a[0]){case "Tuple2":b:{switch(b[0]){case "Tuple2":b=["Tuple2",a[1]-b[1],a[2]-b[2]];break b}break}break a}throw"Non-exhaustive pattern match in case";}return b}}function l(a){return function(b){var c;a:{switch(a[0]){case "Tuple2":b:{switch(b[0]){case "Tuple2":var d=function(a){return["Tuple2",b[2],["Tuple2",a,b[2]]]};c=function(){switch(b[1][0]){case "DragFrom":var c;a[1]?c=["Tuple2",uncurry(move)(g(a[2])(b[1][1]))(b[2]),["Tuple2",["DragFrom",
130+b[1][1]],b[2]]]:(c=uncurry(move)(g(a[2])(b[1][1]))(b[2]),c=["Tuple2",c,["Tuple2",f,c]]);return c;case "Ignore":return d(a[1]?v:f);case "Listen":return d(not(a[1])?f:isWithin(a[2])(b[2])?["DragFrom",a[2]]:v)}throw"Non-exhaustive pattern match in case";}();break b}break}break a}throw"Non-exhaustive pattern match in case";}return c}}try{if(!(Elm.Prelude instanceof Object))throw"module not found";}catch(h){throw"Module 'Prelude' is missing. Compile with --make flag or load missing module in a separate JavaScript file.";
131+}var c={};for(this.i in Elm.Prelude)c[this.i]||eval("var "+this.i+" = Elm.Prelude[this.i];");var f=["Listen"],v=["Ignore"];e[">>>"]=function(a){return function(c){var d;a:{switch(a[0]){case "Automaton":d=a[1];break a}throw"Non-exhaustive pattern match in case";}var f;a:{switch(c[0]){case "Automaton":f=c[1];break a}throw"Non-exhaustive pattern match in case";}return b(function(a){a=d(a);var b;a:{switch(a[0]){case "Tuple2":b=a[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(a[0]){case "Tuple2":a=
132+a[2];break a}throw"Non-exhaustive pattern match in case";}var c=f(b);a:{switch(c[0]){case "Tuple2":b=c[1];break a}throw"Non-exhaustive pattern match in case";}a:{switch(c[0]){case "Tuple2":c=c[2];break a}throw"Non-exhaustive pattern match in case";}return["Tuple2",b,e[">>>"](a)(c)]})}};e["<<<"]=function(a){return function(b){return e[">>>"](b)(a)}};e["^>>"]=function(a){return function(b){return e[">>>"](j(a))(b)}};e[">>^"]=function(a){return function(b){return e[">>>"](a)(j(b))}};e["^<<"]=function(a){return function(b){return e[">>>"](b)(j(a))}};
133+e["<<^"]=function(a){return function(b){return e[">>>"](j(b))(a)}};c=a(0)(function(){return function(a){return 1+a}});return{$op:{">>>":e[">>>"],"<<<":e["<<<"],"^>>":e["^>>"],">>^":e[">>^"],"^<<":e["^<<"],"<<^":e["<<^"]},run:function(a){return function(b){a:{switch(a[0]){case "Automaton":b=lift(fst)(foldp_(function(a){return function(b){a:{switch(b[0]){case "Tuple2":switch(b[2][0]){case "Automaton":b=b[2][1](a);break a}}throw"Non-exhaustive pattern match in case";}return b}})(a[1])(b));break a}throw"Non-exhaustive pattern match in case";
134+}return b}},step:function(a){return function(b){a:{switch(a[0]){case "Automaton":b=a[1](b);break a}throw"Non-exhaustive pattern match in case";}return b}},combine:d,pure:j,init:a,init_:k,count:c,draggable:function(a){return k(["Tuple2",f,a])(l)}}}();Elm.main=function(){return Elm.Automaton.main}}catch(k){Elm.main=function(){document.body.innerHTML=Elm.Text.monospace('<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/>'+
135+k+"</span>");throw k;}}})();