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